f
This commit is contained in:
@@ -114,46 +114,48 @@ func (l *AdminReviewBankCardWithdrawalLogic) AdminReviewBankCardWithdrawal(req *
|
|||||||
// 确认提现(taxRate 为扣税比例,如 0.06 表示 6%)
|
// 确认提现(taxRate 为扣税比例,如 0.06 表示 6%)
|
||||||
func (l *AdminReviewBankCardWithdrawalLogic) approveWithdrawal(ctx context.Context, session sqlx.Session, record *model.AgentWithdrawal, taxRate float64) error {
|
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
|
return err
|
||||||
}
|
}
|
||||||
// 根据提现类型执行不同的操作
|
// 根据提现类型执行不同的操作
|
||||||
if record.WithdrawType == WithdrawTypeAlipay {
|
if record.WithdrawType == WithdrawTypeAlipay {
|
||||||
// 支付宝提现:按更新后的实际到账金额调用支付宝转账
|
// 支付宝提现:按更新后的实际到账金额调用支付宝转账
|
||||||
return l.approveAlipayWithdrawal(ctx, session, record)
|
return l.approveAlipayWithdrawal(ctx, session, record, taxModel)
|
||||||
} else {
|
} else {
|
||||||
// 银行卡提现:直接更新状态为成功(线下转账)
|
// 银行卡提现:直接更新状态为成功(线下转账)
|
||||||
return l.approveBankCardWithdrawal(ctx, session, record)
|
return l.approveBankCardWithdrawal(ctx, session, record, taxModel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// applyReviewTaxRate 按审核时选择的扣税比例更新提现记录与扣税记录
|
// 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 := record.Amount * taxRate
|
newTaxAmount := record.Amount * taxRate
|
||||||
newActualAmount := record.Amount - newTaxAmount
|
newActualAmount := record.Amount - newTaxAmount
|
||||||
|
|
||||||
record.TaxAmount = newTaxAmount
|
record.TaxAmount = newTaxAmount
|
||||||
record.ActualAmount = newActualAmount
|
record.ActualAmount = newActualAmount
|
||||||
if _, err := l.svcCtx.AgentWithdrawalModel.Update(ctx, session, record); err != nil {
|
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)
|
taxModel, err := l.svcCtx.AgentWithdrawalTaxModel.FindOneByWithdrawalId(ctx, record.Id)
|
||||||
if err != nil {
|
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.TaxRate = taxRate
|
||||||
taxModel.TaxAmount = newTaxAmount
|
taxModel.TaxAmount = newTaxAmount
|
||||||
taxModel.ActualAmount = newActualAmount
|
taxModel.ActualAmount = newActualAmount
|
||||||
taxModel.TaxableAmount = record.Amount
|
taxModel.TaxableAmount = record.Amount
|
||||||
if err := l.svcCtx.AgentWithdrawalTaxModel.UpdateWithVersion(ctx, session, taxModel); err != nil {
|
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
|
// 更新后,version 已经自增,返回更新后的 taxModel
|
||||||
|
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)
|
transferResp, err := l.svcCtx.AlipayService.AliTransfer(ctx, record.PayeeAccount, record.PayeeName.String, record.ActualAmount, "公司提现", record.WithdrawNo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -164,11 +166,11 @@ func (l *AdminReviewBankCardWithdrawalLogic) approveAlipayWithdrawal(ctx context
|
|||||||
switch {
|
switch {
|
||||||
case transferResp.Status == "SUCCESS":
|
case transferResp.Status == "SUCCESS":
|
||||||
// 立即处理成功状态
|
// 立即处理成功状态
|
||||||
return l.completeWithdrawalSuccess(ctx, session, record)
|
return l.completeWithdrawalSuccess(ctx, session, record, taxModel)
|
||||||
case transferResp.Status == "FAIL" || transferResp.SubCode != "":
|
case transferResp.Status == "FAIL" || transferResp.SubCode != "":
|
||||||
// 处理明确失败
|
// 处理明确失败
|
||||||
errorMsg := l.mapAlipayError(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":
|
case transferResp.Status == "DEALING":
|
||||||
// 处理中状态,更新为处理中但不标记为最终状态
|
// 处理中状态,更新为处理中但不标记为最终状态
|
||||||
record.Remark = sql.NullString{String: "支付宝转账处理中", Valid: true}
|
record.Remark = sql.NullString{String: "支付宝转账处理中", Valid: true}
|
||||||
@@ -179,12 +181,12 @@ func (l *AdminReviewBankCardWithdrawalLogic) approveAlipayWithdrawal(ctx context
|
|||||||
return nil
|
return nil
|
||||||
default:
|
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.Status = StatusSuccess
|
||||||
record.Remark = sql.NullString{String: "管理员确认提现", Valid: true}
|
record.Remark = sql.NullString{String: "管理员确认提现", Valid: true}
|
||||||
@@ -226,11 +228,7 @@ func (l *AdminReviewBankCardWithdrawalLogic) approveBankCardWithdrawal(ctx conte
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新扣税记录状态为成功
|
// 更新扣税记录状态为成功(使用 applyReviewTaxRate 返回的 taxModel,避免再次查询导致乐观锁冲突)
|
||||||
taxModel, err := l.svcCtx.AgentWithdrawalTaxModel.FindOneByWithdrawalId(ctx, record.Id)
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询扣税记录失败: %v", err)
|
|
||||||
}
|
|
||||||
if taxModel.TaxStatus == model.TaxStatusPending {
|
if taxModel.TaxStatus == model.TaxStatusPending {
|
||||||
taxModel.TaxStatus = model.TaxStatusSuccess // 扣税状态 = 成功
|
taxModel.TaxStatus = model.TaxStatusSuccess // 扣税状态 = 成功
|
||||||
taxModel.TaxTime = sql.NullTime{Time: time.Now(), Valid: true}
|
taxModel.TaxTime = sql.NullTime{Time: time.Now(), Valid: true}
|
||||||
@@ -315,7 +313,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.Status = StatusSuccess
|
||||||
record.Remark = sql.NullString{String: "支付宝转账成功", Valid: true}
|
record.Remark = sql.NullString{String: "支付宝转账成功", Valid: true}
|
||||||
@@ -357,11 +355,7 @@ func (l *AdminReviewBankCardWithdrawalLogic) completeWithdrawalSuccess(ctx conte
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新扣税记录状态为成功
|
// 更新扣税记录状态为成功(使用传入的 taxModel,避免再次查询导致乐观锁冲突)
|
||||||
taxModel, err := l.svcCtx.AgentWithdrawalTaxModel.FindOneByWithdrawalId(ctx, record.Id)
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询扣税记录失败: %v", err)
|
|
||||||
}
|
|
||||||
if taxModel.TaxStatus == model.TaxStatusPending {
|
if taxModel.TaxStatus == model.TaxStatusPending {
|
||||||
taxModel.TaxStatus = model.TaxStatusSuccess // 扣税状态 = 成功
|
taxModel.TaxStatus = model.TaxStatusSuccess // 扣税状态 = 成功
|
||||||
taxModel.TaxTime = sql.NullTime{Time: time.Now(), Valid: true}
|
taxModel.TaxTime = sql.NullTime{Time: time.Now(), Valid: true}
|
||||||
@@ -384,7 +378,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.Status = StatusFailed
|
||||||
record.Remark = sql.NullString{String: errorMsg, Valid: true}
|
record.Remark = sql.NullString{String: errorMsg, Valid: true}
|
||||||
@@ -428,11 +422,7 @@ func (l *AdminReviewBankCardWithdrawalLogic) completeWithdrawalFailure(ctx conte
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新扣税记录状态为失败
|
// 更新扣税记录状态为失败(使用传入的 taxModel,避免再次查询导致乐观锁冲突)
|
||||||
taxModel, err := l.svcCtx.AgentWithdrawalTaxModel.FindOneByWithdrawalId(ctx, record.Id)
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询扣税记录失败: %v", err)
|
|
||||||
}
|
|
||||||
if taxModel.TaxStatus == model.TaxStatusPending {
|
if taxModel.TaxStatus == model.TaxStatusPending {
|
||||||
taxModel.TaxStatus = model.TaxStatusFailed // 扣税状态 = 失败
|
taxModel.TaxStatus = model.TaxStatusFailed // 扣税状态 = 失败
|
||||||
taxModel.TaxTime = sql.NullTime{Time: time.Now(), Valid: true}
|
taxModel.TaxTime = sql.NullTime{Time: time.Now(), Valid: true}
|
||||||
|
|||||||
Reference in New Issue
Block a user