package services import ( "fmt" "platform/web/core" m "platform/web/models" q "platform/web/queries" "github.com/shopspring/decimal" ) var User = &userService{} type userService struct{} func (s *userService) Get(q *q.Query, uid int32) (*m.User, error) { user, err := q.User. Where(q.User.ID.Eq(uid)).Take() if err != nil { return nil, core.NewServErr("查询用户失败", err) } return user, nil } func (s *userService) UpdateBalance(q *q.Query, user *m.User, amount decimal.Decimal) error { balance := user.Balance.Add(amount) if balance.IsNegative() { return core.NewServErr("用户余额不足") } _, err := q.User. Where( q.User.ID.Eq(user.ID), q.User.Balance.Eq(user.Balance), ). UpdateSimple( q.User.Balance.Value(balance), ) if err != nil { return core.NewServErr("更新用户余额失败", err) } return nil } func userBalanceKey(uid int32) string { return fmt.Sprintf("user:%d:balance", uid) } type UpdateBalanceData struct { Amount int `json:"amount"` } func (data *UpdateBalanceData) TradeDetail(user *m.User) (*TradeDetail, error) { amount := decimal.NewFromInt(int64(data.Amount)).Div(decimal.NewFromInt(100)) return &TradeDetail{ data, m.TradeTypeRecharge, fmt.Sprintf("账户充值 - %s元", amount.StringFixed(2)), amount, amount, nil, nil, nil, nil, }, nil }