增加:银行卡提现

This commit is contained in:
2025-12-24 19:16:34 +08:00
parent dfe41f1b8f
commit 7c32f4131a
8 changed files with 55 additions and 48 deletions

View File

@@ -50,10 +50,17 @@ func (l *AdminGetAgentWithdrawalListLogic) AdminGetAgentWithdrawalList(req *type
}
item.CreateTime = v.CreateTime.Format("2006-01-02 15:04:05")
// 设置银行卡信息(如果模型有这些字段,copier会自动复制;如果没有,这里手动设置默认值
// 注意:如果数据库还没有迁移,这些字段可能不存在,需要先注释
// 如果模型有这些字段copier会自动复制这里不需要手动设置
// 如果模型没有这些字段,需要等数据库迁移后重新生成模型
// 手动设置银行卡信息copier会自动处理sql.NullString
item.WithdrawType = v.WithdrawType
if v.BankCardNo.Valid {
item.BankCardNo = v.BankCardNo.String
}
if v.BankName.Valid {
item.BankName = v.BankName.String
}
if v.PayeeName.Valid {
item.PayeeName = v.PayeeName.String
}
items = append(items, item)
}

View File

@@ -80,11 +80,10 @@ func (l *AdminReviewBankCardWithdrawalLogic) AdminReviewBankCardWithdrawal(req *
return errors.Wrapf(xerr.NewErrMsg("该提现记录已处理,无法重复操作"), "状态验证失败")
}
// 验证提现类型如果模型有WithdrawType字段
// 注意:如果数据库还没有迁移,可以先注释这个验证
// if record.WithdrawType != WithdrawTypeBankCard {
// return errors.Wrapf(xerr.NewErrMsg("该记录不是银行卡提现,无法审核"), "提现类型验证失败")
// }
// 验证提现类型
if record.WithdrawType != WithdrawTypeBankCard {
return errors.Wrapf(xerr.NewErrMsg("该记录不是银行卡提现,无法审核"), "提现类型验证失败")
}
if req.Action == ReviewActionApprove {
// 确认提现

View File

@@ -220,6 +220,7 @@ func (l *AgentWithdrawalLogic) mapAlipayError(code string) string {
func (l *AgentWithdrawalLogic) createWithdrawalRecord(session sqlx.Session, agentID int64, payeeAccount string, amount float64, finalWithdrawAmount float64, taxAmount float64, outBizNo string) (int64, error) {
record := &model.AgentWithdrawal{
AgentId: agentID,
WithdrawType: 1, // 支付宝提现
WithdrawNo: outBizNo,
PayeeAccount: payeeAccount,
Amount: amount,

View File

@@ -42,6 +42,7 @@ func (l *BankCardWithdrawalLogic) BankCardWithdrawal(req *types.BankCardWithdraw
var (
outBizNo string
withdrawRes = &types.WithdrawalResp{}
agentID int64
)
var finalWithdrawAmount float64 // 实际到账金额
@@ -68,6 +69,7 @@ func (l *BankCardWithdrawalLogic) BankCardWithdrawal(req *types.BankCardWithdraw
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理信息失败: %v", err)
}
agentID = agentModel.Id // 保存agentId用于日志
// 查询实名认证信息
agentRealName, err := l.svcCtx.AgentRealNameModel.FindOneByAgentId(l.ctx, agentModel.Id)
@@ -158,7 +160,7 @@ func (l *BankCardWithdrawalLogic) BankCardWithdrawal(req *types.BankCardWithdraw
withdrawRes.Status = WithdrawStatusProcessing
withdrawRes.FailMsg = ""
l.Logger.Infof("银行卡提现申请成功 outBizNo:%s agentId:%d amount:%f", outBizNo, 0, req.Amount)
l.Logger.Infof("银行卡提现申请成功 outBizNo:%s agentId:%d amount:%f", outBizNo, agentID, req.Amount)
return withdrawRes, nil
}
@@ -166,17 +168,16 @@ func (l *BankCardWithdrawalLogic) BankCardWithdrawal(req *types.BankCardWithdraw
func (l *BankCardWithdrawalLogic) createBankCardWithdrawalRecord(session sqlx.Session, agentID int64, bankCardNo string, bankName string, payeeName string, amount float64, finalWithdrawAmount float64, taxAmount float64, outBizNo string) (int64, error) {
record := &model.AgentWithdrawal{
AgentId: agentID,
WithdrawType: WithdrawTypeBankCard, // 银行卡提现
WithdrawNo: outBizNo,
PayeeAccount: bankCardNo, // 银行卡号存储在PayeeAccount字段
Amount: amount,
ActualAmount: finalWithdrawAmount,
TaxAmount: taxAmount,
Status: StatusProcessing, // 申请中状态
// 注意:以下字段需要在数据库迁移后添加,如果模型还没有这些字段,需要先更新模型
// WithdrawType: WithdrawTypeBankCard,
// BankCardNo: sql.NullString{String: bankCardNo, Valid: true},
// BankName: sql.NullString{String: bankName, Valid: true},
// PayeeName: sql.NullString{String: payeeName, Valid: true},
BankCardNo: sql.NullString{String: bankCardNo, Valid: true},
BankName: sql.NullString{String: bankName, Valid: true},
PayeeName: sql.NullString{String: payeeName, Valid: true},
}
result, err := l.svcCtx.AgentWithdrawalModel.Insert(l.ctx, session, record)

View File

@@ -6,6 +6,7 @@ import (
"tydata-server/common/ctxdata"
"tydata-server/common/xerr"
"github.com/Masterminds/squirrel"
"github.com/pkg/errors"
"tydata-server/app/main/api/internal/svc"
@@ -49,39 +50,32 @@ func (l *GetBankCardInfoLogic) GetBankCardInfo(req *types.GetBankCardInfoReq) (r
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询代理实名信息失败: %v", err)
}
// 查询最近一次银行卡提现记录,用于自动填充
// 注意:这里需要查询 withdraw_type = 2 的记录
// 如果数据库还没有迁移,可以先返回空值
// 初始化响应,包含实名认证信息
resp = &types.GetBankCardInfoResp{
PayeeName: agentRealName.Name,
IdCard: agentRealName.IdCard,
PayeeName: agentRealName.Name,
IdCard: agentRealName.IdCard,
BankCardNo: "",
BankName: "",
}
// 查询最近一次成功的银行卡提现记录
// 这里使用SelectBuilder查询但由于模型可能还没有withdraw_type字段先注释
// builder := l.svcCtx.AgentWithdrawalModel.SelectBuilder()
// builder = builder.Where(squirrel.Eq{"agent_id": agentModel.Id})
// builder = builder.Where(squirrel.Eq{"withdraw_type": WithdrawTypeBankCard})
// builder = builder.Where(squirrel.Eq{"status": StatusSuccess})
// builder = builder.OrderBy("create_time DESC")
// builder = builder.Limit(1)
//
// list, err := l.svcCtx.AgentWithdrawalModel.FindAll(l.ctx, builder, "create_time DESC")
// if err == nil && len(list) > 0 {
// lastRecord := list[0]
// if lastRecord.BankCardNo.Valid {
// resp.BankCardNo = lastRecord.BankCardNo.String
// }
// if lastRecord.BankName.Valid {
// resp.BankName = lastRecord.BankName.String
// }
// }
// 查询最近一次成功的银行卡提现记录,用于自动填充
builder := l.svcCtx.AgentWithdrawalModel.SelectBuilder()
builder = builder.Where(squirrel.Eq{"agent_id": agentModel.Id})
builder = builder.Where(squirrel.Eq{"withdraw_type": 2}) // 银行卡提现
builder = builder.Where(squirrel.Eq{"status": 2}) // 成功状态
builder = builder.OrderBy("create_time DESC")
builder = builder.Limit(1)
// 临时方案从PayeeAccount字段读取如果之前有银行卡提现记录
// 注意这个方案不够准确因为PayeeAccount也可能存储支付宝账号
// 建议数据库迁移后使用上面的方案
list, err := l.svcCtx.AgentWithdrawalModel.FindAll(l.ctx, builder, "create_time DESC")
if err == nil && len(list) > 0 {
lastRecord := list[0]
if lastRecord.BankCardNo.Valid {
resp.BankCardNo = lastRecord.BankCardNo.String
}
if lastRecord.BankName.Valid {
resp.BankName = lastRecord.BankName.String
}
}
return resp, nil
}