15 KiB
15 KiB
银行卡提现功能实施计划
一、功能概述
新增银行卡提现功能,与现有支付宝提现功能并行。银行卡提现采用申请-审核模式:
- 用户提交银行卡提现申请(银行卡号、开户支行、提现金额)
- 系统冻结申请金额
- 管理员审核(确认/拒绝)
- 确认后扣除金额,拒绝后解冻金额
- 实际转账由管理员线下手动完成
二、数据库变更
2.1 修改 agent_withdrawal 表
需要新增以下字段:
ALTER TABLE `agent_withdrawal`
ADD COLUMN `withdraw_type` TINYINT NOT NULL DEFAULT 1 COMMENT '提现类型:1-支付宝,2-银行卡' AFTER `agent_id`,
ADD COLUMN `bank_card_no` VARCHAR(50) DEFAULT NULL COMMENT '银行卡号' AFTER `payee_account`,
ADD COLUMN `bank_name` VARCHAR(100) DEFAULT NULL COMMENT '开户支行' AFTER `bank_card_no`,
ADD COLUMN `payee_name` VARCHAR(50) DEFAULT NULL COMMENT '收款人姓名' AFTER `bank_name`;
说明:
withdraw_type: 区分提现类型(1=支付宝,2=银行卡)bank_card_no: 银行卡号(仅银行卡提现使用)bank_name: 开户支行(仅银行卡提现使用)payee_name: 收款人姓名(银行卡提现需要,支付宝提现已有但字段名不同)
2.2 新增银行卡信息记录表(可选,用于历史记录)
如果需要保存用户的历史银行卡信息以便自动填充:
CREATE TABLE `agent_bank_card` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`agent_id` BIGINT NOT NULL COMMENT '代理ID',
`bank_card_no` VARCHAR(50) NOT NULL COMMENT '银行卡号',
`bank_name` VARCHAR(100) NOT NULL COMMENT '开户支行',
`payee_name` VARCHAR(50) NOT NULL COMMENT '收款人姓名',
`is_default` TINYINT DEFAULT 0 COMMENT '是否默认:0-否,1-是',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`delete_time` DATETIME DEFAULT NULL,
`del_state` TINYINT DEFAULT 0 COMMENT '删除状态:0-未删除,1-已删除',
PRIMARY KEY (`id`),
KEY `idx_agent_id` (`agent_id`),
KEY `idx_del_state` (`del_state`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代理银行卡信息表';
三、后端开发
3.1 API接口定义
3.1.1 前端接口(app/main/api/desc/front/agent.api)
新增银行卡提现申请接口:
// 银行卡提现申请
@handler BankCardWithdrawal
post /withdrawal/bank-card (BankCardWithdrawalReq) returns (WithdrawalResp)
type (
BankCardWithdrawalReq {
BankCardNo string `json:"bank_card_no"` // 银行卡号
BankName string `json:"bank_name"` // 开户支行
Amount float64 `json:"amount"` // 提现金额
}
)
新增获取历史银行卡信息接口(可选):
// 获取历史银行卡信息
@handler GetBankCardInfo
get /withdrawal/bank-card/info (GetBankCardInfoReq) returns (GetBankCardInfoResp)
type (
GetBankCardInfoReq {}
GetBankCardInfoResp {
BankCardNo string `json:"bank_card_no"` // 银行卡号
BankName string `json:"bank_name"` // 开户支行
PayeeName string `json:"payee_name"` // 收款人姓名
IdCard string `json:"id_card"` // 身份证号
}
)
3.1.2 管理员接口(app/main/api/desc/admin/admin_agent.api)
新增银行卡提现审核接口:
// 银行卡提现审核(确认/拒绝)
@handler AdminReviewBankCardWithdrawal
post /agent-withdrawal/bank-card/review (AdminReviewBankCardWithdrawalReq) returns (AdminReviewBankCardWithdrawalResp)
type (
AdminReviewBankCardWithdrawalReq {
WithdrawalId int64 `json:"withdrawal_id"` // 提现记录ID
Action int64 `json:"action"` // 操作:1-确认,2-拒绝
Remark string `json:"remark"` // 备注(拒绝时必填)
}
AdminReviewBankCardWithdrawalResp {
Success bool `json:"success"`
}
)
修改现有提现列表接口:
- 在
AdminGetAgentWithdrawalListResp的AgentWithdrawalListItem中新增字段:WithdrawType int64- 提现类型BankCardNo string- 银行卡号BankName string- 开户支行PayeeName string- 收款人姓名
3.2 业务逻辑实现
3.2.1 银行卡提现申请逻辑(BankCardWithdrawalLogic)
文件位置: app/main/api/internal/logic/agent/bankcardwithdrawallogic.go
核心流程:
- 验证用户实名认证状态
- 验证银行卡信息与实名信息匹配(姓名需一致)
- 验证可提现金额
- 计算税费(6%)
- 冻结资金(事务内)
- 创建提现记录(状态=申请中,withdraw_type=2)
- 创建扣税记录(状态=待扣税)
- 保存银行卡信息到历史记录表(可选)
关键代码逻辑:
// 参考 AgentWithdrawalLogic,但:
// 1. 不调用支付宝接口
// 2. 状态直接设为 StatusProcessing(申请中)
// 3. 添加银行卡信息字段
// 4. 验证银行卡号格式
// 5. 验证姓名与实名认证信息一致
3.2.2 银行卡提现审核逻辑(AdminReviewBankCardWithdrawalLogic)
文件位置: app/main/api/internal/logic/admin_agent/adminreviewbankcardwithdrawallogic.go
确认提现流程:
- 验证提现记录存在且状态为申请中
- 验证提现类型为银行卡
- 事务内操作:
- 更新提现记录状态为成功
- 解冻资金并扣除(FrozenBalance -= amount, Balance不变)
- 更新扣税记录状态为成功
- 发放提现奖励(如果有)
拒绝提现流程:
- 验证提现记录存在且状态为申请中
- 验证提现类型为银行卡
- 事务内操作:
- 更新提现记录状态为失败,记录拒绝原因
- 解冻资金(FrozenBalance -= amount, Balance += amount)
- 更新扣税记录状态为失败
3.2.3 修改现有逻辑
修改 AgentWithdrawalLogic:
- 在创建提现记录时,设置
withdraw_type = 1(支付宝) - 在
PayeeAccount字段存储支付宝账号
修改 AdminGetAgentWithdrawalListLogic:
- 查询时关联银行卡信息字段
- 返回时包含提现类型和银行卡信息
3.3 数据模型
3.3.1 修改 AgentWithdrawal 模型
文件: app/main/model/agentWithdrawalModel_gen.go(由goctl生成,需重新生成)
新增字段:
WithdrawType int64- 提现类型BankCardNo sql.NullString- 银行卡号BankName sql.NullString- 开户支行PayeeName sql.NullString- 收款人姓名
3.3.2 新增 AgentBankCard 模型(可选)
如果实现历史记录功能,需要:
- 创建
agent_bank_card.sql表结构文件 - 使用 goctl 生成模型:
goctl model mysql datasource -url="user:password@tcp(host:port)/database" -table="agent_bank_card" -dir="./app/main/model" -cache=true --style=goZero
3.4 状态管理
提现状态常量:
const (
StatusPending = 1 // 申请中/处理中(支付宝和银行卡共用)
StatusSuccess = 2 // 成功
StatusFailed = 3 // 失败
)
const (
WithdrawTypeAlipay = 1 // 支付宝提现
WithdrawTypeBankCard = 2 // 银行卡提现
)
银行卡提现状态流转:
- 申请 → StatusPending(申请中)
- 管理员确认 → StatusSuccess(成功)
- 管理员拒绝 → StatusFailed(失败)
四、前端开发
4.1 用户端(tydata-webview-v2)
4.1.1 修改提现页面(src/views/Withdraw.vue)
方案A:在同一页面添加切换标签
- 添加"支付宝提现"和"银行卡提现"两个标签页
- 根据选择的标签显示不同的表单字段
方案B:创建新的银行卡提现页面
- 创建
src/views/BankCardWithdraw.vue - 在路由中添加银行卡提现入口
推荐方案A,用户体验更好
银行卡提现表单字段:
- 银行卡号(必填,格式验证)
- 开户支行(必填)
- 提现金额(必填,验证规则同支付宝)
- 显示实名信息(姓名、身份证号,只读)
- 提示:银行卡信息需与实名信息一致
功能点:
- 页面加载时调用接口获取历史银行卡信息,自动填充
- 显示用户实名认证信息(姓名、身份证号)
- 表单验证:
- 银行卡号格式(16-19位数字)
- 开户支行不能为空
- 金额验证(≥50,≤可提现金额)
- 提交后显示申请成功提示
- 可在提现记录中查看审核状态
4.1.2 修改提现记录页面(src/views/WithdrawDetails.vue)
- 显示提现类型(支付宝/银行卡)
- 银行卡提现显示银行卡号和开户支行
- 显示审核状态(申请中/已确认/已拒绝)
4.1.3 API接口调用
新增接口调用:
// src/api/withdraw.js 或相应文件
export const bankCardWithdrawal = (data) => {
return useApiFetch('/agent/withdrawal/bank-card')
.post(data)
.json();
};
export const getBankCardInfo = () => {
return useApiFetch('/agent/withdrawal/bank-card/info')
.get()
.json();
};
4.2 管理端(tydata-admin)
4.2.1 修改提现列表页面(apps/web-antd/src/views/agent/agent-withdrawal/list.vue)
新增功能:
- 列表显示提现类型(支付宝/银行卡)
- 银行卡提现显示银行卡号和开户支行
- 银行卡提现申请中状态显示"审核"操作按钮
- 点击审核按钮打开审核弹窗
4.2.2 新增审核弹窗组件
文件: apps/web-antd/src/views/agent/agent-withdrawal/modules/review-modal.vue
功能:
- 显示提现详情(金额、银行卡信息、用户信息等)
- 确认/拒绝操作
- 拒绝时必填拒绝原因
- 提交审核结果
4.2.3 修改列表数据配置(apps/web-antd/src/views/agent/agent-withdrawal/data.ts)
新增列:
- 提现类型列
- 银行卡号列(仅银行卡提现显示)
- 开户支行列(仅银行卡提现显示)
- 操作列(银行卡申请中状态显示审核按钮)
4.2.4 API接口调用
新增接口:
// apps/web-antd/src/api/agent.ts
export function reviewBankCardWithdrawal(data: {
withdrawal_id: number;
action: 1 | 2; // 1-确认, 2-拒绝
remark?: string;
}) {
return request.post('/admin/agent-withdrawal/bank-card/review', data);
}
五、实施步骤
阶段一:数据库准备(1-2天)
- ✅ 编写数据库变更SQL脚本
- ✅ 执行SQL脚本更新数据库表结构
- ✅ 如果实现历史记录功能,创建
agent_bank_card表
阶段二:后端开发(3-5天)
- ✅ 修改API定义文件(
agent.api、admin_agent.api) - ✅ 使用goctl重新生成代码(包括模型和类型定义)
- ✅ 实现银行卡提现申请逻辑(
BankCardWithdrawalLogic) - ✅ 实现银行卡提现审核逻辑(
AdminReviewBankCardWithdrawalLogic) - ✅ 修改现有提现列表逻辑,支持银行卡信息查询
- ✅ 实现获取历史银行卡信息接口(可选)
- ✅ 单元测试和接口测试
阶段三:前端开发(3-5天)
用户端(tydata-webview-v2)
- ✅ 修改提现页面,添加银行卡提现选项
- ✅ 实现银行卡提现表单和验证
- ✅ 实现历史信息自动填充
- ✅ 修改提现记录页面,显示银行卡信息
- ✅ 测试提现流程
管理端(tydata-admin)
- ✅ 修改提现列表页面,显示银行卡信息
- ✅ 实现审核弹窗组件
- ✅ 实现审核操作逻辑
- ✅ 测试审核流程
阶段四:测试与优化(2-3天)
- ✅ 功能测试(申请、审核、拒绝流程)
- ✅ 边界测试(金额、状态、并发等)
- ✅ 性能测试
- ✅ Bug修复
- ✅ 代码审查
阶段五:部署上线(1天)
- ✅ 数据库迁移脚本执行
- ✅ 后端服务部署
- ✅ 前端应用部署
- ✅ 生产环境验证
六、注意事项
6.1 数据兼容性
- 现有支付宝提现记录的
withdraw_type默认为1(支付宝) - 现有记录的
bank_card_no、bank_name、payee_name为NULL(正常)
6.2 安全性
- 银行卡号需要加密存储(建议使用AES加密)
- 前端传输时使用HTTPS
- 审核操作需要管理员权限验证
6.3 业务规则
- 银行卡提现最低金额:50元(与支付宝一致)
- 银行卡提现税率:6%(与支付宝一致)
- 银行卡提现需要实名认证通过
- 银行卡信息需与实名认证姓名一致
6.4 用户体验
- 历史银行卡信息自动填充,减少用户输入
- 明确提示银行卡信息需与实名信息一致
- 审核状态及时反馈给用户
6.5 错误处理
- 银行卡号格式验证
- 金额不足提示
- 审核操作失败回滚
- 异常情况日志记录
七、风险评估
7.1 技术风险
-
数据库迁移风险:表结构变更可能影响现有功能
- 应对:先在测试环境验证,做好数据备份
-
并发问题:审核操作可能并发执行
- 应对:使用数据库事务和版本号控制
7.2 业务风险
-
资金安全:银行卡提现涉及资金操作
- 应对:严格权限控制,操作日志记录
-
审核效率:管理员需要手动审核,可能影响用户体验
- 应对:提供审核提醒功能,优化审核流程
八、后续优化建议
- 审核提醒:管理员审核列表增加待审核数量提醒
- 批量审核:支持批量确认/拒绝操作
- 审核历史:记录审核操作人和操作时间
- 银行卡管理:用户可管理多张银行卡,设置默认卡
- 提现限额:银行卡提现可设置不同的限额规则
九、文件清单
后端文件
app/main/api/desc/front/agent.api- 前端API定义(修改)app/main/api/desc/admin/admin_agent.api- 管理员API定义(修改)app/main/api/internal/logic/agent/bankcardwithdrawallogic.go- 银行卡提现申请逻辑(新增)app/main/api/internal/logic/admin_agent/adminreviewbankcardwithdrawallogic.go- 银行卡提现审核逻辑(新增)app/main/model/agentWithdrawalModel_gen.go- 提现模型(重新生成)app/main/model/agentBankCardModel.go- 银行卡信息模型(可选,新增)
前端文件(用户端)
src/views/Withdraw.vue- 提现页面(修改)src/views/WithdrawDetails.vue- 提现记录页面(修改)src/api/withdraw.js- API接口(修改)
前端文件(管理端)
apps/web-antd/src/views/agent/agent-withdrawal/list.vue- 提现列表(修改)apps/web-antd/src/views/agent/agent-withdrawal/modules/review-modal.vue- 审核弹窗(新增)apps/web-antd/src/views/agent/agent-withdrawal/data.ts- 列表配置(修改)apps/web-antd/src/api/agent.ts- API接口(修改)
数据库文件
deploy/sql/bank_card_withdrawal.sql- 数据库变更脚本(新增)
预计总工期:10-15个工作日