This commit is contained in:
2026-01-07 16:50:42 +08:00
parent 9e42257e4e
commit ec72e47695
16 changed files with 981 additions and 27 deletions

View File

@@ -32,7 +32,10 @@ func HandleCommissionAndWalletDeduction(ctx context.Context, svcCtx *svc.Service
}
for _, commission := range commissions {
// 记录更新佣金状态前的状态值,用于后续判断
oldCommissionStatus := commission.Status
commission.Status = 2 // 设置为已退款
// 更新佣金状态到数据库
var updateCommissionErr error
if session != nil {
@@ -52,17 +55,30 @@ func HandleCommissionAndWalletDeduction(ctx context.Context, svcCtx *svc.Service
continue
}
// 根据订单金额优先减少冻结金额,如果冻结金额不足则减少钱包余额
if wallet.FrozenBalance >= order.Amount {
// 冻结余额足够,优先减少冻结金额
wallet.FrozenBalance -= order.Amount
} else {
// 冻结余额不足,先扣减所有冻结金额,再扣减余额
remaining := order.Amount - wallet.FrozenBalance
wallet.FrozenBalance = 0
wallet.Balance -= remaining
}
// 记录变动前的余额
balanceBefore := wallet.Balance
frozenBalanceBefore := wallet.FrozenBalance
// 如果是已结算状态的佣金status = 1直接扣减钱包余额
if oldCommissionStatus == 1 {
// 冻结状态的佣金,根据订单金额优先减少冻结金额,如果冻结金额不足则减少钱包余额
if wallet.FrozenBalance >= order.Amount {
// 冻结余额足够,优先减少冻结金额
wallet.FrozenBalance -= order.Amount
} else {
// 冻结余额不足,先扣减所有冻结金额,再扣减余额
remaining := order.Amount - wallet.FrozenBalance
wallet.FrozenBalance = 0
wallet.Balance -= remaining
}
// 其他状态的佣金比如已结算状态status = 1直接扣减钱包余额
} else {
wallet.Balance -= order.Amount
}
// 变动后余额和冻结余额
balanceAfter := wallet.Balance
frozenBalanceAfter := wallet.FrozenBalance
// 更新钱包
var updateWalletErr error
if session != nil {
updateWalletErr = svcCtx.AgentWalletModel.UpdateWithVersion(ctx, session, wallet)
@@ -73,6 +89,26 @@ func HandleCommissionAndWalletDeduction(ctx context.Context, svcCtx *svc.Service
logx.Errorf("更新代理钱包失败代理ID: %d, 错误: %v", commission.AgentId, updateWalletErr)
continue
}
// 创建钱包交易流水记录(退款)
transErr := svcCtx.AgentService.CreateWalletTransaction(
ctx,
session,
commission.AgentId,
model.WalletTransactionTypeRefund,
-order.Amount,
balanceBefore,
balanceAfter,
frozenBalanceBefore,
frozenBalanceAfter,
order.OrderNo,
commission.Id,
"订单退款,佣金已扣除",
)
if transErr != nil {
logx.Errorf("创建代理钱包流水记录失败代理ID: %d, 错误: %v", commission.AgentId, transErr)
continue
}
}
return nil
}