From ab84984fb04b7a89155362a3c39e900b5300f8af Mon Sep 17 00:00:00 2001 From: sugarBecomer Date: Mon, 3 Nov 2025 17:04:25 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E5=8F=82=E6=95=B0=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E8=BF=94=E5=9B=9E=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/cst/base_point.go | 5 ++++ internal/middleware/exception_handler.go | 10 +++++++ internal/service/agent/agent_service.go | 34 ++++-------------------- internal/service/cpdaily/cptask.go | 15 ++++++++--- 4 files changed, 32 insertions(+), 32 deletions(-) create mode 100644 internal/cst/base_point.go diff --git a/internal/cst/base_point.go b/internal/cst/base_point.go new file mode 100644 index 0000000..f5f59aa --- /dev/null +++ b/internal/cst/base_point.go @@ -0,0 +1,5 @@ +package cst + +const ( + BasePointCpdaily = 1 +) diff --git a/internal/middleware/exception_handler.go b/internal/middleware/exception_handler.go index 17460fc..bfdf351 100644 --- a/internal/middleware/exception_handler.go +++ b/internal/middleware/exception_handler.go @@ -8,6 +8,7 @@ import ( "github.com/gogf/gf/v2/errors/gcode" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/util/gvalid" ) func ExceptionHandler(r *ghttp.Request) { @@ -50,6 +51,15 @@ func ExceptionHandler(r *ghttp.Request) { code = tmpErr.Code() } else if code == gcode.CodeNil { code = errors.CodeInternal.Code() + } else if code == gcode.CodeValidationFailed { + // 请求参数校验失败返回第一个错误信息 + if validationErr, ok := err.(gvalid.Error); ok { + if firstErr := validationErr.FirstError(); firstErr != nil { + c := errors.CodeParam + c.SetMessage(firstErr.Error()) + code = c.Code() + } + } } r.Response.ClearBuffer() r.Response.WriteHeader(200) diff --git a/internal/service/agent/agent_service.go b/internal/service/agent/agent_service.go index dbd2a2c..15db134 100644 --- a/internal/service/agent/agent_service.go +++ b/internal/service/agent/agent_service.go @@ -8,6 +8,7 @@ import ( "likedream-goframe/internal/ent" "likedream-goframe/internal/ent/sysrole" "likedream-goframe/internal/ent/sysuser" + "likedream-goframe/internal/service/balance" "likedream-goframe/internal/utils" "github.com/samber/oops" @@ -128,44 +129,19 @@ func (s *AgentServiceV1) Ban(ctx context.Context, req *v1.AgentBanReq) *utils.Re func (s *AgentServiceV1) Recharge(ctx context.Context, req *v1.AgentRechargeReq) *utils.Response[any] { // 参数校验 user := db.Global.SysUser.Query().Where(sysuser.IDEQ(req.ID)).WithAgent().OnlyX(ctx) - tx, err := db.Global.Tx(ctx) - defer tx.Rollback() if !utils.IsAdminFromCtx(ctx) { currentUser := db.Global.SysUser.Query().Where(sysuser.ID(utils.GetUserInfoFromCtx(ctx).ID)).WithAgent().WithRoles().OnlyX(ctx) - // 判断是否是自己的下级代理 parent := user.QueryParent().WithAgent().FirstX(ctx) if parent == nil || parent.ID != currentUser.ID { return utils.FailParam("非法的下级代理参数") } - utils.OkOrPanic(err, func(err error) error { - return oops. - WithContext(ctx). - With("创建事务失败"). - Wrap(err) - }) if !utils.HasRole(currentUser.Edges.Roles, cst.KeyRoleAdmin) { - parent.Balance = utils.CalculateBalance(parent.Balance, parent.Edges.Agent.Rate, req.Amount, user.Edges.Agent.Rate) - if parent.Balance.Compare(decimal.NewFromInt(0)) < 0 { - return utils.FailParam("余额不足") - } + needBalance := utils.CalculateBalance(parent.Balance, parent.Edges.Agent.Rate, req.Amount, user.Edges.Agent.Rate) + balance.BalanceService.ChangeUserBalance(ctx, parent.ID, needBalance.Neg()) } - tx.SysUser.UpdateOne(parent).SetBalance(parent.Balance).SaveX(ctx) - utils.OkOrPanic(err, func(err error) error { - return oops. - WithContext(ctx). - With("更新用户余额失败"). - Wrap(err) - }) } - tx.SysUser.UpdateOne(user).SetBalance(user.Balance.Add(req.Amount)).SaveX(ctx) - utils.OkOrPanic(err, func(err error) error { - return oops. - WithContext(ctx). - With("更新用户余额失败"). - Wrap(err) - }) - err = tx.Commit() + balance.BalanceService.ChangeUserBalance(ctx, user.ID, req.Amount) return utils.SuccessWithMsg("操作成功") } @@ -212,7 +188,7 @@ func (s *AgentServiceV1) AgentPutInfoReq(ctx context.Context, req *v1.AgentPutIn //按照新费率计算余额 newBalance := utils.TransformBalance(oldBalance, req.Rate) // 6. 更新用户余额 - tx.SysUser.UpdateOne(user).SetBalance(newBalance).SaveX(ctx) + balance.BalanceService.ChangeUserBalance(ctx, user.ID, newBalance.Sub(oldBalance)) err = tx.Commit() utils.OkOrPanic(err, func(err error) error { return oops. diff --git a/internal/service/cpdaily/cptask.go b/internal/service/cpdaily/cptask.go index ceb2e7f..df1c069 100644 --- a/internal/service/cpdaily/cptask.go +++ b/internal/service/cpdaily/cptask.go @@ -21,6 +21,7 @@ import ( "likedream-goframe/internal/ent/sysuser" "likedream-goframe/internal/framework/queue" "likedream-goframe/internal/framework/schedule" + "likedream-goframe/internal/service/balance" "likedream-goframe/internal/utils" "time" @@ -28,6 +29,7 @@ import ( "github.com/gogf/gf/v2/frame/g" "github.com/hibiken/asynq" "github.com/samber/oops" + "github.com/shopspring/decimal" ) type CpTaskServiceV1 struct { @@ -172,11 +174,18 @@ func (v CpTaskServiceV1) PostExecute(ctx context.Context, req *v1.PostCpTaskExec if cpTask.Step == cptask.StepForm { utils.OkOrPanic(errors2.NewBusinessError(400, "请先完成前置参数设置")) } - pointConsume := req.Frequency - cpTask.Frequency - if req.Frequency < 1 || pointConsume < 0 { + consume := req.Frequency - cpTask.Frequency + if req.Frequency < 1 || consume < 0 { utils.OkOrPanic(errors2.NewBusinessError(400, "执行次数应不低于原有次数")) } - //todo 扣积分 + //扣积分 + basePoint := decimal.NewFromInt(cst.BasePointCpdaily) + if user.Edges.Agent != nil { + basePoint = basePoint.Mul(user.Edges.Agent.Rate) + } + needPoint := basePoint.Mul(decimal.NewFromInt(int64(consume))) + balance.BalanceService.ChangeUserBalance(ctx, user.ID, needPoint.Neg()) + // 更新任务 e := db.WithTx(ctx, func(ctx context.Context, tx *ent.Tx) { cpTask := db.Global.CpTask.UpdateOne(cpTask). SetStep(cptask.StepComplete).