From 5089b37ef19616ba6918a29de32c3ca429e4bc79 Mon Sep 17 00:00:00 2001 From: Mrx <18278715334@163.com> Date: Fri, 6 Feb 2026 11:08:46 +0800 Subject: [PATCH] f --- .../adminreviewbankcardwithdrawallogic.go | 51 ++++++++----------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/app/main/api/internal/logic/admin_agent/adminreviewbankcardwithdrawallogic.go b/app/main/api/internal/logic/admin_agent/adminreviewbankcardwithdrawallogic.go index 64b9e5a..88e5e38 100644 --- a/app/main/api/internal/logic/admin_agent/adminreviewbankcardwithdrawallogic.go +++ b/app/main/api/internal/logic/admin_agent/adminreviewbankcardwithdrawallogic.go @@ -114,21 +114,23 @@ func (l *AdminReviewBankCardWithdrawalLogic) AdminReviewBankCardWithdrawal(req * // 确认提现(taxRate 为扣税比例,如 0.06 表示 6%) func (l *AdminReviewBankCardWithdrawalLogic) approveWithdrawal(ctx context.Context, session sqlx.Session, record *model.AgentWithdrawal, taxRate float64) error { // 按审核时选择的扣税比例重新计算并更新提现记录与扣税记录 - if err := l.applyReviewTaxRate(ctx, session, record, taxRate); err != nil { + taxModel, err := l.applyReviewTaxRate(ctx, session, record, taxRate) + if err != nil { return err } // 根据提现类型执行不同的操作 if record.WithdrawType == WithdrawTypeAlipay { // 支付宝提现:按更新后的实际到账金额调用支付宝转账 - return l.approveAlipayWithdrawal(ctx, session, record) + return l.approveAlipayWithdrawal(ctx, session, record, taxModel) } else { // 银行卡提现:直接更新状态为成功(线下转账) - return l.approveBankCardWithdrawal(ctx, session, record) + return l.approveBankCardWithdrawal(ctx, session, record, taxModel) } } // applyReviewTaxRate 按审核时选择的扣税比例更新提现记录与扣税记录 -func (l *AdminReviewBankCardWithdrawalLogic) applyReviewTaxRate(ctx context.Context, session sqlx.Session, record *model.AgentWithdrawal, taxRate float64) error { +// 返回更新后的扣税记录,避免重复查询导致的版本冲突 +func (l *AdminReviewBankCardWithdrawalLogic) applyReviewTaxRate(ctx context.Context, session sqlx.Session, record *model.AgentWithdrawal, taxRate float64) (*model.AgentWithdrawalTax, error) { // 金额保留两位小数,避免浮点误差并与前端/支付宝一致 newTaxAmount := math.Round(record.Amount*taxRate*100) / 100 newActualAmount := math.Round((record.Amount-newTaxAmount)*100) / 100 @@ -136,25 +138,26 @@ func (l *AdminReviewBankCardWithdrawalLogic) applyReviewTaxRate(ctx context.Cont record.TaxAmount = newTaxAmount record.ActualAmount = newActualAmount if _, err := l.svcCtx.AgentWithdrawalModel.Update(ctx, session, record); err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新提现记录扣税金额失败: %v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新提现记录扣税金额失败: %v", err) } taxModel, err := l.svcCtx.AgentWithdrawalTaxModel.FindOneByWithdrawalId(ctx, record.Id) if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询扣税记录失败: %v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询扣税记录失败: %v", err) } taxModel.TaxRate = taxRate taxModel.TaxAmount = newTaxAmount taxModel.ActualAmount = newActualAmount taxModel.TaxableAmount = record.Amount if err := l.svcCtx.AgentWithdrawalTaxModel.UpdateWithVersion(ctx, session, taxModel); err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新扣税记录失败: %v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新扣税记录失败: %v", err) } - return nil + // 返回更新后的 taxModel,version 已经自动加1 + return taxModel, nil } // 确认支付宝提现 -func (l *AdminReviewBankCardWithdrawalLogic) approveAlipayWithdrawal(ctx context.Context, session sqlx.Session, record *model.AgentWithdrawal) error { +func (l *AdminReviewBankCardWithdrawalLogic) approveAlipayWithdrawal(ctx context.Context, session sqlx.Session, record *model.AgentWithdrawal, taxModel *model.AgentWithdrawalTax) error { // 同步调用支付宝转账 transferResp, err := l.svcCtx.AlipayService.AliTransfer(ctx, record.PayeeAccount, record.PayeeName.String, record.ActualAmount, "公司提现", record.WithdrawNo) if err != nil { @@ -165,11 +168,11 @@ func (l *AdminReviewBankCardWithdrawalLogic) approveAlipayWithdrawal(ctx context switch { case transferResp.Status == "SUCCESS": // 立即处理成功状态 - return l.completeWithdrawalSuccess(ctx, session, record) + return l.completeWithdrawalSuccess(ctx, session, record, taxModel) case transferResp.Status == "FAIL" || transferResp.SubCode != "": // 处理明确失败 errorMsg := l.mapAlipayError(transferResp.SubCode) - return l.completeWithdrawalFailure(ctx, session, record, errorMsg) + return l.completeWithdrawalFailure(ctx, session, record, taxModel, errorMsg) case transferResp.Status == "DEALING": // 处理中状态,更新为处理中但不标记为最终状态 record.Remark = sql.NullString{String: "支付宝转账处理中", Valid: true} @@ -180,12 +183,12 @@ func (l *AdminReviewBankCardWithdrawalLogic) approveAlipayWithdrawal(ctx context return nil default: // 未知状态按失败处理 - return l.completeWithdrawalFailure(ctx, session, record, "支付宝返回未知状态") + return l.completeWithdrawalFailure(ctx, session, record, taxModel, "支付宝返回未知状态") } } // 确认银行卡提现 -func (l *AdminReviewBankCardWithdrawalLogic) approveBankCardWithdrawal(ctx context.Context, session sqlx.Session, record *model.AgentWithdrawal) error { +func (l *AdminReviewBankCardWithdrawalLogic) approveBankCardWithdrawal(ctx context.Context, session sqlx.Session, record *model.AgentWithdrawal, taxModel *model.AgentWithdrawalTax) error { // 更新提现记录状态为成功 record.Status = StatusSuccess record.Remark = sql.NullString{String: "管理员确认提现", Valid: true} @@ -227,11 +230,7 @@ func (l *AdminReviewBankCardWithdrawalLogic) approveBankCardWithdrawal(ctx conte return err } - // 更新扣税记录状态为成功 - taxModel, err := l.svcCtx.AgentWithdrawalTaxModel.FindOneByWithdrawalId(ctx, record.Id) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询扣税记录失败: %v", err) - } + // 更新扣税记录状态为成功(使用传入的 taxModel,避免重复查询导致的版本冲突) if taxModel.TaxStatus == model.TaxStatusPending { taxModel.TaxStatus = model.TaxStatusSuccess // 扣税状态 = 成功 taxModel.TaxTime = sql.NullTime{Time: time.Now(), Valid: true} @@ -316,7 +315,7 @@ func (l *AdminReviewBankCardWithdrawalLogic) rejectWithdrawal(ctx context.Contex } // 完成提现成功(支付宝转账成功后调用) -func (l *AdminReviewBankCardWithdrawalLogic) completeWithdrawalSuccess(ctx context.Context, session sqlx.Session, record *model.AgentWithdrawal) error { +func (l *AdminReviewBankCardWithdrawalLogic) completeWithdrawalSuccess(ctx context.Context, session sqlx.Session, record *model.AgentWithdrawal, taxModel *model.AgentWithdrawalTax) error { // 更新提现记录状态为成功 record.Status = StatusSuccess record.Remark = sql.NullString{String: "支付宝转账成功", Valid: true} @@ -358,11 +357,7 @@ func (l *AdminReviewBankCardWithdrawalLogic) completeWithdrawalSuccess(ctx conte return err } - // 更新扣税记录状态为成功 - taxModel, err := l.svcCtx.AgentWithdrawalTaxModel.FindOneByWithdrawalId(ctx, record.Id) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询扣税记录失败: %v", err) - } + // 更新扣税记录状态为成功(使用传入的 taxModel,避免重复查询导致的版本冲突) if taxModel.TaxStatus == model.TaxStatusPending { taxModel.TaxStatus = model.TaxStatusSuccess // 扣税状态 = 成功 taxModel.TaxTime = sql.NullTime{Time: time.Now(), Valid: true} @@ -385,7 +380,7 @@ func (l *AdminReviewBankCardWithdrawalLogic) completeWithdrawalSuccess(ctx conte } // 完成提现失败(支付宝转账失败后调用) -func (l *AdminReviewBankCardWithdrawalLogic) completeWithdrawalFailure(ctx context.Context, session sqlx.Session, record *model.AgentWithdrawal, errorMsg string) error { +func (l *AdminReviewBankCardWithdrawalLogic) completeWithdrawalFailure(ctx context.Context, session sqlx.Session, record *model.AgentWithdrawal, taxModel *model.AgentWithdrawalTax, errorMsg string) error { // 更新提现记录状态为失败 record.Status = StatusFailed record.Remark = sql.NullString{String: errorMsg, Valid: true} @@ -429,11 +424,7 @@ func (l *AdminReviewBankCardWithdrawalLogic) completeWithdrawalFailure(ctx conte return err } - // 更新扣税记录状态为失败 - taxModel, err := l.svcCtx.AgentWithdrawalTaxModel.FindOneByWithdrawalId(ctx, record.Id) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询扣税记录失败: %v", err) - } + // 更新扣税记录状态为失败(使用传入的 taxModel,避免重复查询导致的版本冲突) if taxModel.TaxStatus == model.TaxStatusPending { taxModel.TaxStatus = model.TaxStatusFailed // 扣税状态 = 失败 taxModel.TaxTime = sql.NullTime{Time: time.Now(), Valid: true}