```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful

feat(player): 优化金币兑换功能

- 在ServiceUpdate方法中返回更新后的数据而不是nil
- 新增DuihuanGold方法用于处理金币兑换逻辑
- 修改黄金列表控制器中的兑换计算逻辑,区分费用和获得金币的计算
- 在添加操作前验证用户金币余额是否充足
- 修正了兑换比例计算和余额检查逻辑
```
This commit is contained in:
昔念
2026-03-19 18:36:34 +08:00
parent 91a20cb034
commit bd5cd9393a
4 changed files with 18 additions and 6 deletions

View File

@@ -169,7 +169,7 @@ func (s *Service) ServiceUpdate(ctx context.Context, req *UpdateReq) (data sql.R
} }
} }
//rmap["id"] = nil //rmap["id"] = nil
_, err = m.Data(rmap).Where("id", rmap["id"]).Update() data, err = m.Data(rmap).Where("id", rmap["id"]).Update()
return return
} }

View File

@@ -60,7 +60,14 @@ func (s *BaseSysUserService) DuihuanFreeGold(userId uint32, gold, free int64) {
}).Update() }).Update()
} }
func (s *BaseSysUserService) DuihuanGold(userId uint32, gold, free int64) {
m := cool.DBM(s.Model).Where("id", userId)
m.Data(g.Map{
"goldbean": gdb.Raw("goldbean+" + gconv.String(gold)),
"free_gold": gdb.Raw("free_gold-" + gconv.String(free)),
}).Update()
}
func (s *BaseSysUserService) UpdateFreeGold(userId uint32, gold int64) { func (s *BaseSysUserService) UpdateFreeGold(userId uint32, gold int64) {
m := cool.DBM(s.Model).Where("id", userId) m := cool.DBM(s.Model).Where("id", userId)

View File

@@ -43,8 +43,9 @@ func (c *GoldListController) DuihuanGold(ctx context.Context, req *DuihuanGoldAd
return return
} }
all := r.Rate * float64(r.ExchangeNum) costfree := r.Rate * float64(r.ExchangeNum)
if base.NewBaseSysUserService().GetFreeGold(t.UserId) < int64(all*105) { getgold := 1 / r.Rate * float64(r.ExchangeNum)
if base.NewBaseSysUserService().GetFreeGold(t.UserId) < int64(costfree*100) {
err = fmt.Errorf("余额不足") err = fmt.Errorf("余额不足")
return return
} }
@@ -52,8 +53,8 @@ func (c *GoldListController) DuihuanGold(ctx context.Context, req *DuihuanGoldAd
err = fmt.Errorf("未到购买时间") err = fmt.Errorf("未到购买时间")
return return
} }
base.NewBaseSysUserService().UpdateGold(uint32(r.PlayerID), int64(all*95)) base.NewBaseSysUserService().DuihuanFreeGold(uint32(r.PlayerID), int64(r.ExchangeNum*100), int64(costfree*95))
base.NewBaseSysUserService().UpdateFreeGold(uint32(t.UserId), -int64(all*105)) base.NewBaseSysUserService().DuihuanGold(uint32(t.UserId), int64(getgold*95), int64(costfree*100))
res = cool.Ok(nil) res = cool.Ok(nil)
return return
} }

View File

@@ -2,11 +2,13 @@ package service
import ( import (
"blazing/cool" "blazing/cool"
"blazing/modules/base/service"
"blazing/modules/player/model" "blazing/modules/player/model"
"context" "context"
"fmt" "fmt"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
) )
type GoldListService struct { type GoldListService struct {
@@ -17,8 +19,10 @@ func (s *GoldListService) ModifyBefore(ctx context.Context, method string, param
admin := cool.GetAdmin(ctx) admin := cool.GetAdmin(ctx)
userId := admin.UserId userId := admin.UserId
g.RequestFromCtx(ctx).SetParam("player_id", userId)
if method == "Add" { if method == "Add" {
if service.NewBaseSysUserService().GetGold(userId) < gconv.Int64(param["exchange_num"])*100 {
return fmt.Errorf("金额不足")
}
t, _ := s.dbm_fix(s.Model).Where("player_id", userId).Where("status", 0).Count() t, _ := s.dbm_fix(s.Model).Where("player_id", userId).Where("status", 0).Count()
if t > 0 { if t > 0 {