增加:银行卡提现

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

@@ -193,6 +193,8 @@ type (
AgentId int64 `json:"agent_id"` // 代理ID
WithdrawNo string `json:"withdraw_no"` // 提现单号
Amount float64 `json:"amount"` // 金额
ActualAmount float64 `json:"actual_amount"` // 实际到账金额(扣税后)
TaxAmount float64 `json:"tax_amount"` // 扣税金额
Status int64 `json:"status"` // 状态
PayeeAccount string `json:"payee_account"` // 收款账户
Remark string `json:"remark"` // 备注

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
}

View File

@@ -269,7 +269,7 @@ func (s *AuthorizationService) generatePDFContent(userInfo map[string]interface{
}
// 构建授权书内容(去掉标题部分)
content := fmt.Sprintf(`海南天远大数据科技有限公司:
content := fmt.Sprintf(`海南海宇大数据有限公司:
本人%s拟向贵司申请大数据分析报告查询业务贵司需要了解本人相关状况用于查询大数据分析报告因此本人同意向贵司提供本人的姓名和手机号等个人信息并同意贵司向第三方传送上述信息。第三方将使用上述信息核实信息真实情况查询信用记录并生成报告。
授权内容如下:
@@ -292,8 +292,8 @@ func (s *AuthorizationService) generatePDFContent(userInfo map[string]interface{
附加说明:
本人在授权的相关数据将依据法律法规及贵司内部数据管理规范妥善存储,存储期限为法律要求的最短必要时间。超过存储期限或在数据使用目的达成后,贵司将对相关数据进行销毁或匿名化处理。
本人有权随时撤回本授权书中的授权,但撤回前的授权行为及其法律后果仍具有法律效力。若需撤回授权,本人可通过贵司官方渠道提交书面申请,贵司将在收到申请后依法停止对本人数据的使用。
你通过"天远数据",自愿支付相应费用,用于购买海南天远大数据科技有限公司的大数据报告产品。如若对产品内容存在异议可通过邮箱admin@iieeii.com或APP"联系客服"按钮进行反馈贵司将在收到异议之日起20日内进行核查和处理并将结果答复。
你向海南天远大数据科技有限公司的支付方式为:海南天远大数据科技有限公司及其经官方授权的相关企业的支付宝账户。
你通过"天远数据",自愿支付相应费用,用于购买海南海宇大数据有限公司的大数据报告产品。如若对产品内容存在异议可通过邮箱admin@iieeii.com或APP"联系客服"按钮进行反馈贵司将在收到异议之日起20日内进行核查和处理并将结果答复。
你向海南海宇大数据有限公司的支付方式为:海南海宇大数据有限公司及其经官方授权的相关企业的支付宝账户。
争议解决机制:
若因本授权书引发争议,双方应友好协商解决;协商不成的,双方同意将争议提交至授权书签署地(海南省)有管辖权的人民法院解决。

View File

@@ -1135,6 +1135,8 @@ type AgentWithdrawalListItem struct {
AgentId int64 `json:"agent_id"` // 代理ID
WithdrawNo string `json:"withdraw_no"` // 提现单号
Amount float64 `json:"amount"` // 金额
ActualAmount float64 `json:"actual_amount"` // 实际到账金额(扣税后)
TaxAmount float64 `json:"tax_amount"` // 扣税金额
Status int64 `json:"status"` // 状态
PayeeAccount string `json:"payee_account"` // 收款账户
Remark string `json:"remark"` // 备注
@@ -1176,9 +1178,10 @@ type BindMobileResp struct {
}
type Commission struct {
ProductName string `json:"product_name"`
Amount float64 `json:"amount"`
CreateTime string `json:"create_time"`
ProductName string `json:"product_name"`
Amount float64 `json:"amount"`
CreateTime string `json:"create_time"`
QueryParams map[string]interface{} `json:"query_params,omitempty"`
}
type CreateMenuReq struct {