63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
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 (c *UpdateBalanceData) TradeDetail() (*TradeDetail, error) {
|
|
amount := decimal.NewFromInt(int64(c.Amount)).Div(decimal.NewFromInt(100))
|
|
return &TradeDetail{
|
|
m.TradeTypeRecharge,
|
|
fmt.Sprintf("账户充值 - %s元", amount.StringFixed(2)),
|
|
amount, amount,
|
|
nil, c,
|
|
}, nil
|
|
}
|