From 31e147495c0cd65f845d4f556d00c9522daa9094 Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 31 Mar 2026 18:41:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8F=90=E7=8E=B0?= =?UTF-8?q?=E5=86=BB=E7=BB=93=E9=80=BB=E8=BE=91=E9=94=99=E8=AF=AF=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E6=95=B0=E6=8D=AE=E5=BA=93=E7=BA=A6=E6=9D=9F=E8=BF=9D?= =?UTF-8?q?=E5=8F=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 余额检查从 wallet.Balance 改为 wallet.GetAvailableBalance(), 防止 frozen_balance 已有值时误判为余额充足 - 冻结余额时只增加 frozen_balance,不再同时减少 balance, 与系统其他冻结操作保持一致(balance = 总额,frozen 为其子集) - 修复后 SQL 不再触发 chk_agent_wallet_frozen_balance 约束 --- internal/service/my_commission/service.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/internal/service/my_commission/service.go b/internal/service/my_commission/service.go index a2b39fa..64c5a72 100644 --- a/internal/service/my_commission/service.go +++ b/internal/service/my_commission/service.go @@ -125,8 +125,8 @@ func (s *Service) CreateWithdrawalRequest(ctx context.Context, req *dto.CreateMy return nil, errors.New(errors.CodeInsufficientBalance, "钱包不存在") } - // 验证余额 - if req.Amount > wallet.Balance { + // 验证可用余额(balance - frozen_balance),冻结中的金额不可再次提现 + if req.Amount > wallet.GetAvailableBalance() { return nil, errors.New(errors.CodeInsufficientBalance, "可提现余额不足") } @@ -159,11 +159,12 @@ func (s *Service) CreateWithdrawalRequest(ctx context.Context, req *dto.CreateMy var withdrawalRequest *model.CommissionWithdrawalRequest err = s.db.Transaction(func(tx *gorm.DB) error { - // 冻结余额(使用条件更新 + RowsAffected 校验,防止并发重复提现) + // 冻结余额:只增加 frozen_balance,balance(总额)不变 + // balance = 总余额,frozen_balance = 其中被锁定的子集,可用余额 = balance - frozen_balance + // 使用条件更新 + RowsAffected 校验,防止并发重复提现 result := tx.WithContext(ctx).Model(&model.AgentWallet{}). - Where("id = ? AND balance >= ?", wallet.ID, req.Amount). + Where("id = ? AND balance - frozen_balance >= ?", wallet.ID, req.Amount). Updates(map[string]interface{}{ - "balance": gorm.Expr("balance - ?", req.Amount), "frozen_balance": gorm.Expr("frozen_balance + ?", req.Amount), }) if result.Error != nil {