f ‘部分退款’
This commit is contained in:
@@ -247,33 +247,23 @@ func (l *PaySuccessNotifyUserHandler) handleError(ctx context.Context, err error
|
||||
|
||||
// 退款
|
||||
if order.PaymentPlatform == "wechat" {
|
||||
// 微信退款为异步结果,这里只发起退款申请,订单状态与佣金/钱包扣减交由退款回调统一处理
|
||||
refundErr := l.svcCtx.WechatPayService.WeChatRefund(ctx, order.OrderNo, order.Amount, order.Amount)
|
||||
if refundErr != nil {
|
||||
logx.Error(refundErr)
|
||||
return asynq.SkipRetry
|
||||
}
|
||||
// 微信退款成功,更新订单、佣金、钱包状态
|
||||
logx.Infof("微信退款成功, orderID: %d", order.Id)
|
||||
// 更新订单状态为退款
|
||||
order.Status = "refunded"
|
||||
updateOrderErr := l.svcCtx.OrderModel.UpdateWithVersion(ctx, nil, order)
|
||||
if updateOrderErr != nil {
|
||||
logx.Errorf("更新订单状态失败,订单ID: %d, 错误: %v", order.Id, updateOrderErr)
|
||||
return fmt.Errorf("更新订单状态失败: %v", updateOrderErr)
|
||||
}
|
||||
|
||||
// 使用公共函数处理佣金和钱包扣除
|
||||
paylogic.HandleCommissionAndWalletDeduction(ctx, l.svcCtx, nil, order)
|
||||
|
||||
logx.Infof("已发起微信退款申请, orderID: %d, amount: %f", order.Id, order.Amount)
|
||||
return asynq.SkipRetry
|
||||
} else {
|
||||
// 支付宝退款为同步结果,这里直接根据返回结果更新订单和佣金/钱包
|
||||
refund, refundErr := l.svcCtx.AlipayService.AliRefund(ctx, order.OrderNo, order.Amount)
|
||||
if refundErr != nil {
|
||||
logx.Error(refundErr)
|
||||
return asynq.SkipRetry
|
||||
}
|
||||
if refund.IsSuccess() {
|
||||
logx.Errorf("支付宝退款成功, orderID: %d", order.Id)
|
||||
logx.Infof("支付宝退款成功, orderID: %d", order.Id)
|
||||
// 更新订单状态为退款
|
||||
order.Status = "refunded"
|
||||
updateOrderErr := l.svcCtx.OrderModel.UpdateWithVersion(ctx, nil, order)
|
||||
@@ -282,8 +272,8 @@ func (l *PaySuccessNotifyUserHandler) handleError(ctx context.Context, err error
|
||||
return fmt.Errorf("更新订单状态失败: %v", updateOrderErr)
|
||||
}
|
||||
|
||||
// 使用公共函数处理佣金和钱包扣除
|
||||
paylogic.HandleCommissionAndWalletDeduction(ctx, l.svcCtx, nil, order)
|
||||
// 使用公共函数按本次退款金额处理佣金和钱包扣除
|
||||
_ = paylogic.HandleCommissionAndWalletDeduction(ctx, l.svcCtx, nil, order, order.Amount)
|
||||
|
||||
return asynq.SkipRetry
|
||||
} else {
|
||||
|
||||
@@ -70,9 +70,14 @@ func (l *UnfreezeCommissionHandler) ProcessTask(ctx context.Context, t *asynq.Ta
|
||||
return err
|
||||
}
|
||||
|
||||
// 更新钱包余额:增加佣金金额到balance,减少相应的frozen_balance
|
||||
// 注意:这里应该转移的是当前佣金记录的金额,而不是全部冻结余额
|
||||
commissionAmount := commission.Amount
|
||||
// 计算当前佣金在发生退款后的“净佣金金额”
|
||||
commissionAmount := commission.Amount - commission.RefundedAmount
|
||||
if commissionAmount <= 0 {
|
||||
logx.Infof("佣金记录ID %d 已被全部退款或无可解冻金额,跳过解冻", commissionID)
|
||||
return nil
|
||||
}
|
||||
|
||||
// 更新钱包余额:增加净佣金金额到 balance,减少相应的 frozen_balance
|
||||
agentWallet.Balance += commissionAmount
|
||||
agentWallet.FrozenBalance -= commissionAmount
|
||||
agentWallet.UpdateTime = now
|
||||
|
||||
Reference in New Issue
Block a user