From c4c97222505e948967d9a48eac2e54a78b6eee57 Mon Sep 17 00:00:00 2001 From: Mrx <18278715334@163.com> Date: Mon, 23 Mar 2026 17:13:49 +0800 Subject: [PATCH] add bank --- app/main/api/desc/admin/admin_agent.api | 4 + app/main/api/desc/front/agent.api | 14 +- .../admin_agent/adminauditwithdrawallogic.go | 134 ++++++++---------- .../logic/agent/applywithdrawallogic.go | 59 ++++++-- .../logic/agent/getwithdrawallistlogic.go | 24 ++-- .../internal/logic/agent/realnameauthlogic.go | 60 ++++---- app/main/api/internal/types/types.go | 60 ++++---- app/main/model/agentWithdrawalModel_gen.go | 48 ++++--- 8 files changed, 229 insertions(+), 174 deletions(-) diff --git a/app/main/api/desc/admin/admin_agent.api b/app/main/api/desc/admin/admin_agent.api index 11c640c..021d8a6 100644 --- a/app/main/api/desc/admin/admin_agent.api +++ b/app/main/api/desc/admin/admin_agent.api @@ -251,12 +251,16 @@ type ( Id string `json:"id"` // 主键 AgentId string `json:"agent_id"` // 代理ID WithdrawNo string `json:"withdraw_no"` // 提现单号 + WithdrawMethod int64 `json:"withdraw_method"` // 提现方式:1=支付宝,2=银行卡 Amount float64 `json:"amount"` // 金额 TaxAmount float64 `json:"tax_amount"` // 税费金额 ActualAmount float64 `json:"actual_amount"` // 实际到账金额 Status int64 `json:"status"` // 状态 PayeeAccount string `json:"payee_account"` // 收款账户 PayeeName string `json:"payee_name"` // 收款人姓名 + BankName string `json:"bank_name"` // 开户行 + BankCardNo string `json:"bank_card_no"` // 银行卡号(掩码) + BankReservedMobile string `json:"bank_reserved_mobile"` // 银行预留手机号 Remark string `json:"remark"` // 备注 CreateTime string `json:"create_time"` // 创建时间 } diff --git a/app/main/api/desc/front/agent.api b/app/main/api/desc/front/agent.api index cbd685f..1fd399d 100644 --- a/app/main/api/desc/front/agent.api +++ b/app/main/api/desc/front/agent.api @@ -568,20 +568,28 @@ type ( WithdrawalItem { Id string `json:"id"` // 记录ID WithdrawalNo string `json:"withdrawal_no"` // 提现单号 + WithdrawMethod int64 `json:"withdraw_method"` // 提现方式:1=支付宝,2=银行卡 Amount float64 `json:"amount"` // 提现金额 TaxAmount float64 `json:"tax_amount"` // 税费金额 ActualAmount float64 `json:"actual_amount"` // 实际到账金额 Status int64 `json:"status"` // 状态:1=待审核,2=审核通过,3=审核拒绝,4=提现中,5=提现成功,6=提现失败 PayeeAccount string `json:"payee_account"` // 收款账户 PayeeName string `json:"payee_name"` // 收款人姓名 + BankName string `json:"bank_name"` // 开户行 + BankCardNo string `json:"bank_card_no"` // 银行卡号(掩码) + BankReservedMobile string `json:"bank_reserved_mobile"` // 银行预留手机号 Remark string `json:"remark"` // 备注 CreateTime string `json:"create_time"` // 创建时间 } // 申请提现 ApplyWithdrawalReq { - Amount float64 `json:"amount"` // 提现金额 - PayeeAccount string `json:"payee_account"` // 收款账户 - PayeeName string `json:"payee_name"` // 收款人姓名 + Amount float64 `json:"amount"` // 提现金额 + WithdrawMethod int64 `json:"withdraw_method"` // 提现方式:1=支付宝,2=银行卡 + PayeeAccount string `json:"payee_account"` // 收款账户(支付宝) + PayeeName string `json:"payee_name"` // 收款人姓名/持卡人姓名 + BankName string `json:"bank_name,optional"` // 开户行(银行卡必填) + BankCardNo string `json:"bank_card_no,optional"` // 银行卡号(银行卡必填) + BankReservedMobile string `json:"bank_reserved_mobile,optional"` // 银行预留手机号(银行卡必填) } ApplyWithdrawalResp { WithdrawalId string `json:"withdrawal_id"` // 提现记录ID diff --git a/app/main/api/internal/logic/admin_agent/adminauditwithdrawallogic.go b/app/main/api/internal/logic/admin_agent/adminauditwithdrawallogic.go index 5628edb..cece17d 100644 --- a/app/main/api/internal/logic/admin_agent/adminauditwithdrawallogic.go +++ b/app/main/api/internal/logic/admin_agent/adminauditwithdrawallogic.go @@ -4,10 +4,10 @@ import ( "context" "database/sql" "fmt" - "time" "qnc-server/common/globalkey" "qnc-server/common/xerr" "qnc-server/pkg/lzkit/lzUtils" + "time" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/sqlx" @@ -24,6 +24,11 @@ type AdminAuditWithdrawalLogic struct { svcCtx *svc.ServiceContext } +const ( + withdrawMethodAlipay int64 = 1 + withdrawMethodBankCard int64 = 2 +) + func NewAdminAuditWithdrawalLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminAuditWithdrawalLogic { return &AdminAuditWithdrawalLogic{ Logger: logx.WithContext(ctx), @@ -47,84 +52,61 @@ func (l *AdminAuditWithdrawalLogic) AdminAuditWithdrawal(req *types.AdminAuditWi // 4. 使用事务处理审核 err = l.svcCtx.AgentWithdrawalModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { if req.Status == 2 { // 审核通过 - // 4.1 更新提现记录状态为提现中 - withdrawal.Status = 4 // 提现中 - withdrawal.Remark = sql.NullString{String: req.Remark, Valid: true} + // 4.1 支付宝提现自动打款;银行卡提现为手动打款(审核时仅确认已人工打款) + if withdrawal.WithdrawMethod == withdrawMethodAlipay { + outBizNo := withdrawal.WithdrawNo + transferResp, err := l.svcCtx.AlipayService.AliTransfer(transCtx, withdrawal.PayeeAccount, withdrawal.PayeeName, withdrawal.ActualAmount, "代理提现", outBizNo) + if err != nil { + withdrawal.Status = 6 // 提现失败 + withdrawal.Remark = sql.NullString{String: fmt.Sprintf("支付宝转账失败: %v", err), Valid: true} + _ = l.svcCtx.AgentWithdrawalModel.UpdateWithVersion(transCtx, session, withdrawal) + return errors.Wrapf(err, "支付宝转账失败") + } + if transferResp.Status != "SUCCESS" { + withdrawal.Status = 6 // 提现失败 + withdrawal.Remark = sql.NullString{String: l.mapAlipayError(transferResp.SubCode), Valid: true} + if err := l.svcCtx.AgentWithdrawalModel.UpdateWithVersion(transCtx, session, withdrawal); err != nil { + return errors.Wrapf(err, "更新提现记录失败") + } + return nil + } + } + if withdrawal.WithdrawMethod == withdrawMethodBankCard { + withdrawal.Remark = sql.NullString{String: req.Remark, Valid: req.Remark != ""} + } + + // 4.2 审核通过后从冻结余额扣减 + wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(transCtx, withdrawal.AgentId) + if err != nil { + return errors.Wrapf(err, "查询钱包失败") + } + if wallet.FrozenBalance < withdrawal.Amount { + withdrawal.Status = 6 + withdrawal.Remark = sql.NullString{String: "审核通过失败:冻结余额不足", Valid: true} + _ = l.svcCtx.AgentWithdrawalModel.UpdateWithVersion(transCtx, session, withdrawal) + return errors.Wrapf(xerr.NewErrMsg("冻结余额不足,无法通过审核"), "") + } + wallet.FrozenBalance -= withdrawal.Amount + wallet.WithdrawnAmount += withdrawal.Amount + if err := l.svcCtx.AgentWalletModel.UpdateWithVersion(transCtx, session, wallet); err != nil { + return errors.Wrapf(err, "更新钱包失败") + } + + // 4.3 更新提现记录状态为成功 + withdrawal.Status = 5 if err := l.svcCtx.AgentWithdrawalModel.UpdateWithVersion(transCtx, session, withdrawal); err != nil { return errors.Wrapf(err, "更新提现记录失败") } - // 4.2 调用支付宝转账接口 - outBizNo := withdrawal.WithdrawNo - transferResp, err := l.svcCtx.AlipayService.AliTransfer(transCtx, withdrawal.PayeeAccount, withdrawal.PayeeName, withdrawal.ActualAmount, "代理提现", outBizNo) - if err != nil { - // 转账失败,更新状态为失败 - withdrawal.Status = 6 // 提现失败 - withdrawal.Remark = sql.NullString{String: fmt.Sprintf("转账失败: %v", err), Valid: true} - l.svcCtx.AgentWithdrawalModel.UpdateWithVersion(transCtx, session, withdrawal) - - // 解冻余额 - wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(transCtx, withdrawal.AgentId) - if err == nil { - wallet.FrozenBalance -= withdrawal.Amount - wallet.Balance += withdrawal.Amount - l.svcCtx.AgentWalletModel.UpdateWithVersion(transCtx, session, wallet) - } - - return errors.Wrapf(err, "支付宝转账失败") - } - - // 4.3 根据转账结果更新状态 - switch transferResp.Status { - case "SUCCESS": - // 转账成功 - withdrawal.Status = 5 // 提现成功 - if err := l.svcCtx.AgentWithdrawalModel.UpdateWithVersion(transCtx, session, withdrawal); err != nil { - return errors.Wrapf(err, "更新提现记录失败") - } - - // 更新钱包(解冻并扣除) - wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(transCtx, withdrawal.AgentId) - if err != nil { - return errors.Wrapf(err, "查询钱包失败") - } - wallet.FrozenBalance -= withdrawal.Amount - wallet.WithdrawnAmount += withdrawal.Amount - if err := l.svcCtx.AgentWalletModel.UpdateWithVersion(transCtx, session, wallet); err != nil { - return errors.Wrapf(err, "更新钱包失败") - } - - // 更新扣税记录状态 - taxBuilder := l.svcCtx.AgentWithdrawalTaxModel.SelectBuilder(). - Where("withdrawal_id = ? AND del_state = ?", withdrawal.Id, globalkey.DelStateNo) - taxRecords, err := l.svcCtx.AgentWithdrawalTaxModel.FindAll(transCtx, taxBuilder, "") - if err == nil && len(taxRecords) > 0 { - taxRecord := taxRecords[0] - taxRecord.TaxStatus = 2 // 已扣税 - taxRecord.TaxTime = lzUtils.TimeToNullTime(time.Now()) - l.svcCtx.AgentWithdrawalTaxModel.UpdateWithVersion(transCtx, session, taxRecord) - } - - case "FAIL": - // 转账失败 - withdrawal.Status = 6 // 提现失败 - errorMsg := l.mapAlipayError(transferResp.SubCode) - withdrawal.Remark = sql.NullString{String: errorMsg, Valid: true} - if err := l.svcCtx.AgentWithdrawalModel.UpdateWithVersion(transCtx, session, withdrawal); err != nil { - return errors.Wrapf(err, "更新提现记录失败") - } - - // 解冻余额 - wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(transCtx, withdrawal.AgentId) - if err == nil { - wallet.FrozenBalance -= withdrawal.Amount - wallet.Balance += withdrawal.Amount - l.svcCtx.AgentWalletModel.UpdateWithVersion(transCtx, session, wallet) - } - - case "DEALING": - // 处理中,保持提现中状态,后续通过轮询更新 - // 状态已经是4(提现中),无需更新 + // 4.4 更新扣税记录状态 + taxBuilder := l.svcCtx.AgentWithdrawalTaxModel.SelectBuilder(). + Where("withdrawal_id = ? AND del_state = ?", withdrawal.Id, globalkey.DelStateNo) + taxRecords, err := l.svcCtx.AgentWithdrawalTaxModel.FindAll(transCtx, taxBuilder, "") + if err == nil && len(taxRecords) > 0 { + taxRecord := taxRecords[0] + taxRecord.TaxStatus = 2 // 已扣税 + taxRecord.TaxTime = lzUtils.TimeToNullTime(time.Now()) + _ = l.svcCtx.AgentWithdrawalTaxModel.UpdateWithVersion(transCtx, session, taxRecord) } } else if req.Status == 3 { // 审核拒绝 @@ -135,7 +117,7 @@ func (l *AdminAuditWithdrawalLogic) AdminAuditWithdrawal(req *types.AdminAuditWi return errors.Wrapf(err, "更新提现记录失败") } - // 4.2 解冻余额 + // 4.2 审核拒绝:解冻余额 wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(transCtx, withdrawal.AgentId) if err != nil { return errors.Wrapf(err, "查询钱包失败") diff --git a/app/main/api/internal/logic/agent/applywithdrawallogic.go b/app/main/api/internal/logic/agent/applywithdrawallogic.go index 6b2996a..cb802d2 100644 --- a/app/main/api/internal/logic/agent/applywithdrawallogic.go +++ b/app/main/api/internal/logic/agent/applywithdrawallogic.go @@ -7,6 +7,8 @@ import ( "qnc-server/common/ctxdata" "qnc-server/common/xerr" "qnc-server/pkg/lzkit/lzUtils" + "regexp" + "strings" "time" "github.com/google/uuid" @@ -25,6 +27,11 @@ type ApplyWithdrawalLogic struct { svcCtx *svc.ServiceContext } +const ( + withdrawMethodAlipay int64 = 1 + withdrawMethodBankCard int64 = 2 +) + func NewApplyWithdrawalLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApplyWithdrawalLogic { return &ApplyWithdrawalLogic{ Logger: logx.WithContext(ctx), @@ -65,6 +72,32 @@ func (l *ApplyWithdrawalLogic) ApplyWithdrawal(req *types.ApplyWithdrawalReq) (r if req.Amount <= 0 { return nil, errors.Wrapf(xerr.NewErrMsg("提现金额必须大于0"), "") } + if req.WithdrawMethod != withdrawMethodAlipay && req.WithdrawMethod != withdrawMethodBankCard { + return nil, errors.Wrapf(xerr.NewErrMsg("提现方式不支持"), "") + } + if strings.TrimSpace(req.PayeeName) == "" { + return nil, errors.Wrapf(xerr.NewErrMsg("收款人姓名不能为空"), "") + } + + if req.WithdrawMethod == withdrawMethodAlipay { + if strings.TrimSpace(req.PayeeAccount) == "" { + return nil, errors.Wrapf(xerr.NewErrMsg("支付宝账号不能为空"), "") + } + } else { + if strings.TrimSpace(req.BankName) == "" { + return nil, errors.Wrapf(xerr.NewErrMsg("开户行不能为空"), "") + } + bankCardNo := strings.TrimSpace(req.BankCardNo) + if bankCardNo == "" { + return nil, errors.Wrapf(xerr.NewErrMsg("银行卡号不能为空"), "") + } + if !regexp.MustCompile(`^\d{13,19}$`).MatchString(bankCardNo) { + return nil, errors.Wrapf(xerr.NewErrMsg("银行卡号格式不正确"), "") + } + if !regexp.MustCompile(`^1[3-9]\d{9}$`).MatchString(strings.TrimSpace(req.BankReservedMobile)) { + return nil, errors.Wrapf(xerr.NewErrMsg("银行预留手机号格式不正确"), "") + } + } // 4. 获取钱包信息 wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(l.ctx, agent.Id) @@ -85,9 +118,9 @@ func (l *ApplyWithdrawalLogic) ApplyWithdrawal(req *types.ApplyWithdrawalReq) (r } // 7. 生成提现单号 - withdrawNo := fmt.Sprintf("WD%d%d", time.Now().Unix(), agent.Id) + withdrawNo := fmt.Sprintf("WD%d%s", time.Now().Unix(), agent.Id) - // 8. 使用事务处理提现申请 + // 8. 使用事务处理提现申请(申请时冻结余额,审核通过后扣减冻结余额) var withdrawalId string err = l.svcCtx.AgentWalletModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { // 8.1 冻结余额 @@ -99,15 +132,19 @@ func (l *ApplyWithdrawalLogic) ApplyWithdrawal(req *types.ApplyWithdrawalReq) (r // 8.2 创建提现记录 withdrawal := &model.AgentWithdrawal{ - Id: uuid.New().String(), - AgentId: agent.Id, - WithdrawNo: withdrawNo, - PayeeAccount: req.PayeeAccount, - PayeeName: req.PayeeName, - Amount: req.Amount, - ActualAmount: taxInfo.ActualAmount, - TaxAmount: taxInfo.TaxAmount, - Status: 1, // 处理中(待审核) + Id: uuid.New().String(), + AgentId: agent.Id, + WithdrawNo: withdrawNo, + WithdrawMethod: req.WithdrawMethod, + PayeeAccount: strings.TrimSpace(req.PayeeAccount), + PayeeName: strings.TrimSpace(req.PayeeName), + BankName: strings.TrimSpace(req.BankName), + BankCardNo: strings.TrimSpace(req.BankCardNo), + BankReservedMobile: strings.TrimSpace(req.BankReservedMobile), + Amount: req.Amount, + ActualAmount: taxInfo.ActualAmount, + TaxAmount: taxInfo.TaxAmount, + Status: 1, // 待审核 } _, err := l.svcCtx.AgentWithdrawalModel.Insert(transCtx, session, withdrawal) diff --git a/app/main/api/internal/logic/agent/getwithdrawallistlogic.go b/app/main/api/internal/logic/agent/getwithdrawallistlogic.go index 78531c7..053e735 100644 --- a/app/main/api/internal/logic/agent/getwithdrawallistlogic.go +++ b/app/main/api/internal/logic/agent/getwithdrawallistlogic.go @@ -82,16 +82,20 @@ func (l *GetWithdrawalListLogic) GetWithdrawalList(req *types.GetWithdrawalListR } list = append(list, types.WithdrawalItem{ - Id: withdrawal.Id, - WithdrawalNo: withdrawal.WithdrawNo, - Amount: withdrawal.Amount, - TaxAmount: withdrawal.TaxAmount, - ActualAmount: withdrawal.ActualAmount, - Status: withdrawal.Status, - PayeeAccount: withdrawal.PayeeAccount, - PayeeName: withdrawal.PayeeName, - Remark: remark, - CreateTime: withdrawal.CreateTime.Format("2006-01-02 15:04:05"), + Id: withdrawal.Id, + WithdrawalNo: withdrawal.WithdrawNo, + WithdrawMethod: withdrawal.WithdrawMethod, + Amount: withdrawal.Amount, + TaxAmount: withdrawal.TaxAmount, + ActualAmount: withdrawal.ActualAmount, + Status: withdrawal.Status, + PayeeAccount: withdrawal.PayeeAccount, + PayeeName: withdrawal.PayeeName, + BankName: withdrawal.BankName, + BankCardNo: withdrawal.BankCardNo, + BankReservedMobile: withdrawal.BankReservedMobile, + Remark: remark, + CreateTime: withdrawal.CreateTime.Format("2006-01-02 15:04:05"), }) } diff --git a/app/main/api/internal/logic/agent/realnameauthlogic.go b/app/main/api/internal/logic/agent/realnameauthlogic.go index 68406bf..4999d38 100644 --- a/app/main/api/internal/logic/agent/realnameauthlogic.go +++ b/app/main/api/internal/logic/agent/realnameauthlogic.go @@ -5,6 +5,7 @@ import ( "database/sql" "encoding/hex" "fmt" + "os" "qnc-server/app/main/model" "qnc-server/common/ctxdata" "qnc-server/common/xerr" @@ -61,37 +62,40 @@ func (l *RealNameAuthLogic) RealNameAuth(req *types.RealNameAuthReq) (resp *type return nil, errors.Wrapf(xerr.NewErrMsg("手机号与代理注册手机号不匹配"), "") } - // 3. 验证验证码 - encryptedMobile, err := crypto.EncryptMobile(req.Mobile, l.svcCtx.Config.Encrypt.SecretKey) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "加密手机号失败, %v", err) - } - redisKey := fmt.Sprintf("realName:%s", encryptedMobile) - cacheCode, err := l.svcCtx.Redis.Get(redisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "") + // 3. 开发环境下跳过验证码和三要素核验 + if os.Getenv("ENV") != "development" { + // 3.1 验证验证码 + encryptedMobile, err := crypto.EncryptMobile(req.Mobile, l.svcCtx.Config.Encrypt.SecretKey) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "加密手机号失败, %v", err) + } + redisKey := fmt.Sprintf("realName:%s", encryptedMobile) + cacheCode, err := l.svcCtx.Redis.Get(redisKey) + if err != nil { + if errors.Is(err, redis.Nil) { + return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "") + } + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "读取验证码失败, %v", err) + } + if cacheCode != req.Code { + return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "") } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "读取验证码失败, %v", err) - } - if cacheCode != req.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "") - } - // 4. 三要素核验(姓名、身份证号、手机号) - verification, err := l.svcCtx.VerificationService.ThreeFactorVerification(service.ThreeFactorVerificationRequest{ - Name: req.Name, - IDCard: req.IdCard, - Mobile: req.Mobile, - }) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "三要素核验失败: %v", err) - } - if !verification.Passed { - if verification.Err != nil { - return nil, errors.Wrapf(xerr.NewErrMsg(verification.Err.Error()), "三要素核验不通过") + // 3.2 三要素核验(姓名、身份证号、手机号) + verification, err := l.svcCtx.VerificationService.ThreeFactorVerification(service.ThreeFactorVerificationRequest{ + Name: req.Name, + IDCard: req.IdCard, + Mobile: req.Mobile, + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "三要素核验失败: %v", err) + } + if !verification.Passed { + if verification.Err != nil { + return nil, errors.Wrapf(xerr.NewErrMsg(verification.Err.Error()), "三要素核验不通过") + } + return nil, errors.Wrapf(xerr.NewErrMsg("三要素核验不通过"), "") } - return nil, errors.Wrapf(xerr.NewErrMsg("三要素核验不通过"), "") } // 5. 检查是否已有实名认证记录 diff --git a/app/main/api/internal/types/types.go b/app/main/api/internal/types/types.go index 52f2931..850dae7 100644 --- a/app/main/api/internal/types/types.go +++ b/app/main/api/internal/types/types.go @@ -1126,17 +1126,21 @@ type AgentUpgradeListItem struct { } type AgentWithdrawalListItem struct { - Id string `json:"id"` // 主键 - AgentId string `json:"agent_id"` // 代理ID - WithdrawNo string `json:"withdraw_no"` // 提现单号 - Amount float64 `json:"amount"` // 金额 - TaxAmount float64 `json:"tax_amount"` // 税费金额 - ActualAmount float64 `json:"actual_amount"` // 实际到账金额 - Status int64 `json:"status"` // 状态 - PayeeAccount string `json:"payee_account"` // 收款账户 - PayeeName string `json:"payee_name"` // 收款人姓名 - Remark string `json:"remark"` // 备注 - CreateTime string `json:"create_time"` // 创建时间 + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 代理ID + WithdrawNo string `json:"withdraw_no"` // 提现单号 + WithdrawMethod int64 `json:"withdraw_method"` // 提现方式:1=支付宝,2=银行卡 + Amount float64 `json:"amount"` // 金额 + TaxAmount float64 `json:"tax_amount"` // 税费金额 + ActualAmount float64 `json:"actual_amount"` // 实际到账金额 + Status int64 `json:"status"` // 状态 + PayeeAccount string `json:"payee_account"` // 收款账户 + PayeeName string `json:"payee_name"` // 收款人姓名 + BankName string `json:"bank_name"` // 开户行 + BankCardNo string `json:"bank_card_no"` // 银行卡号 + BankReservedMobile string `json:"bank_reserved_mobile"` // 银行预留手机号 + Remark string `json:"remark"` // 备注 + CreateTime string `json:"create_time"` // 创建时间 } type ApplyUpgradeReq struct { @@ -1149,9 +1153,13 @@ type ApplyUpgradeResp struct { } type ApplyWithdrawalReq struct { - Amount float64 `json:"amount"` // 提现金额 - PayeeAccount string `json:"payee_account"` // 收款账户 - PayeeName string `json:"payee_name"` // 收款人姓名 + Amount float64 `json:"amount"` // 提现金额 + WithdrawMethod int64 `json:"withdraw_method"` // 提现方式:1=支付宝,2=银行卡 + PayeeAccount string `json:"payee_account"` // 收款账户(支付宝) + PayeeName string `json:"payee_name"` // 收款人姓名/持卡人姓名 + BankName string `json:"bank_name"` // 开户行(银行卡必填) + BankCardNo string `json:"bank_card_no"` // 银行卡号(银行卡必填) + BankReservedMobile string `json:"bank_reserved_mobile"` // 银行预留手机号(银行卡必填) } type ApplyWithdrawalResp struct { @@ -2285,16 +2293,20 @@ type WhitelistItem struct { } type WithdrawalItem struct { - Id string `json:"id"` // 记录ID - WithdrawalNo string `json:"withdrawal_no"` // 提现单号 - Amount float64 `json:"amount"` // 提现金额 - TaxAmount float64 `json:"tax_amount"` // 税费金额 - ActualAmount float64 `json:"actual_amount"` // 实际到账金额 - Status int64 `json:"status"` // 状态:1=待审核,2=审核通过,3=审核拒绝,4=提现中,5=提现成功,6=提现失败 - PayeeAccount string `json:"payee_account"` // 收款账户 - PayeeName string `json:"payee_name"` // 收款人姓名 - Remark string `json:"remark"` // 备注 - CreateTime string `json:"create_time"` // 创建时间 + Id string `json:"id"` // 记录ID + WithdrawalNo string `json:"withdrawal_no"` // 提现单号 + WithdrawMethod int64 `json:"withdraw_method"` // 提现方式:1=支付宝,2=银行卡 + Amount float64 `json:"amount"` // 提现金额 + TaxAmount float64 `json:"tax_amount"` // 税费金额 + ActualAmount float64 `json:"actual_amount"` // 实际到账金额 + Status int64 `json:"status"` // 状态:1=待审核,2=审核通过,3=审核拒绝,4=提现中,5=提现成功,6=提现失败 + PayeeAccount string `json:"payee_account"` // 收款账户 + PayeeName string `json:"payee_name"` // 收款人姓名 + BankName string `json:"bank_name"` // 开户行 + BankCardNo string `json:"bank_card_no"` // 银行卡号 + BankReservedMobile string `json:"bank_reserved_mobile"` // 银行预留手机号 + Remark string `json:"remark"` // 备注 + CreateTime string `json:"create_time"` // 创建时间 } type GetAppConfigResp struct { diff --git a/app/main/model/agentWithdrawalModel_gen.go b/app/main/model/agentWithdrawalModel_gen.go index b7aaa16..83e6621 100644 --- a/app/main/model/agentWithdrawalModel_gen.go +++ b/app/main/model/agentWithdrawalModel_gen.go @@ -59,21 +59,25 @@ type ( } AgentWithdrawal struct { - Id string `db:"id"` - AgentId string `db:"agent_id"` - WithdrawNo string `db:"withdraw_no"` // 提现单号 - PayeeAccount string `db:"payee_account"` // 收款账户 - PayeeName string `db:"payee_name"` // 收款人姓名 - Amount float64 `db:"amount"` // 提现金额 - ActualAmount float64 `db:"actual_amount"` // 实际到账金额(扣除税费后) - TaxAmount float64 `db:"tax_amount"` // 税费金额 - Status int64 `db:"status"` // 状态:1=处理中,2=成功,3=失败 - Remark sql.NullString `db:"remark"` // 备注 - CreateTime time.Time `db:"create_time"` // 创建时间 - UpdateTime time.Time `db:"update_time"` // 更新时间 - DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 - DelState int64 `db:"del_state"` // 删除状态:0=未删除,1=已删除 - Version int64 `db:"version"` // 版本号(乐观锁) + Id string `db:"id"` + AgentId string `db:"agent_id"` + WithdrawNo string `db:"withdraw_no"` // 提现单号 + WithdrawMethod int64 `db:"withdraw_method"` // 提现方式:1=支付宝,2=银行卡 + PayeeAccount string `db:"payee_account"` // 收款账户 + PayeeName string `db:"payee_name"` // 收款人姓名 + BankName string `db:"bank_name"` // 开户行 + BankCardNo string `db:"bank_card_no"` // 银行卡号 + BankReservedMobile string `db:"bank_reserved_mobile"` // 银行预留手机号 + Amount float64 `db:"amount"` // 提现金额 + ActualAmount float64 `db:"actual_amount"` // 实际到账金额(扣除税费后) + TaxAmount float64 `db:"tax_amount"` // 税费金额 + Status int64 `db:"status"` // 状态:1=处理中,2=成功,3=失败 + Remark sql.NullString `db:"remark"` // 备注 + CreateTime time.Time `db:"create_time"` // 创建时间 + UpdateTime time.Time `db:"update_time"` // 更新时间 + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` // 删除状态:0=未删除,1=已删除 + Version int64 `db:"version"` // 版本号(乐观锁) } ) @@ -90,11 +94,11 @@ func (m *defaultAgentWithdrawalModel) Insert(ctx context.Context, session sqlx.S qncAgentWithdrawalIdKey := fmt.Sprintf("%s%v", cacheQncAgentWithdrawalIdPrefix, data.Id) qncAgentWithdrawalWithdrawNoKey := fmt.Sprintf("%s%v", cacheQncAgentWithdrawalWithdrawNoPrefix, data.WithdrawNo) return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { - query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentWithdrawalRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentWithdrawalRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.WithdrawNo, data.PayeeAccount, data.PayeeName, data.Amount, data.ActualAmount, data.TaxAmount, data.Status, data.Remark, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.WithdrawNo, data.WithdrawMethod, data.PayeeAccount, data.PayeeName, data.BankName, data.BankCardNo, data.BankReservedMobile, data.Amount, data.ActualAmount, data.TaxAmount, data.Status, data.Remark, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.WithdrawNo, data.PayeeAccount, data.PayeeName, data.Amount, data.ActualAmount, data.TaxAmount, data.Status, data.Remark, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.WithdrawNo, data.WithdrawMethod, data.PayeeAccount, data.PayeeName, data.BankName, data.BankCardNo, data.BankReservedMobile, data.Amount, data.ActualAmount, data.TaxAmount, data.Status, data.Remark, data.DeleteTime, data.DelState, data.Version) }, qncAgentWithdrawalIdKey, qncAgentWithdrawalWithdrawNoKey) } func (m *defaultAgentWithdrawalModel) insertUUID(data *AgentWithdrawal) { @@ -161,9 +165,9 @@ func (m *defaultAgentWithdrawalModel) Update(ctx context.Context, session sqlx.S return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, agentWithdrawalRowsWithPlaceHolder) if session != nil { - return session.ExecCtx(ctx, query, newData.AgentId, newData.WithdrawNo, newData.PayeeAccount, newData.PayeeName, newData.Amount, newData.ActualAmount, newData.TaxAmount, newData.Status, newData.Remark, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + return session.ExecCtx(ctx, query, newData.AgentId, newData.WithdrawNo, newData.WithdrawMethod, newData.PayeeAccount, newData.PayeeName, newData.BankName, newData.BankCardNo, newData.BankReservedMobile, newData.Amount, newData.ActualAmount, newData.TaxAmount, newData.Status, newData.Remark, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) } - return conn.ExecCtx(ctx, query, newData.AgentId, newData.WithdrawNo, newData.PayeeAccount, newData.PayeeName, newData.Amount, newData.ActualAmount, newData.TaxAmount, newData.Status, newData.Remark, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + return conn.ExecCtx(ctx, query, newData.AgentId, newData.WithdrawNo, newData.WithdrawMethod, newData.PayeeAccount, newData.PayeeName, newData.BankName, newData.BankCardNo, newData.BankReservedMobile, newData.Amount, newData.ActualAmount, newData.TaxAmount, newData.Status, newData.Remark, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) }, qncAgentWithdrawalIdKey, qncAgentWithdrawalWithdrawNoKey) } @@ -184,9 +188,9 @@ func (m *defaultAgentWithdrawalModel) UpdateWithVersion(ctx context.Context, ses sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, agentWithdrawalRowsWithPlaceHolder) if session != nil { - return session.ExecCtx(ctx, query, newData.AgentId, newData.WithdrawNo, newData.PayeeAccount, newData.PayeeName, newData.Amount, newData.ActualAmount, newData.TaxAmount, newData.Status, newData.Remark, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + return session.ExecCtx(ctx, query, newData.AgentId, newData.WithdrawNo, newData.WithdrawMethod, newData.PayeeAccount, newData.PayeeName, newData.BankName, newData.BankCardNo, newData.BankReservedMobile, newData.Amount, newData.ActualAmount, newData.TaxAmount, newData.Status, newData.Remark, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) } - return conn.ExecCtx(ctx, query, newData.AgentId, newData.WithdrawNo, newData.PayeeAccount, newData.PayeeName, newData.Amount, newData.ActualAmount, newData.TaxAmount, newData.Status, newData.Remark, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + return conn.ExecCtx(ctx, query, newData.AgentId, newData.WithdrawNo, newData.WithdrawMethod, newData.PayeeAccount, newData.PayeeName, newData.BankName, newData.BankCardNo, newData.BankReservedMobile, newData.Amount, newData.ActualAmount, newData.TaxAmount, newData.Status, newData.Remark, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) }, qncAgentWithdrawalIdKey, qncAgentWithdrawalWithdrawNoKey) if err != nil { return err