# 银行卡提现功能实施计划 ## 一、功能概述 新增银行卡提现功能,与现有支付宝提现功能并行。银行卡提现采用申请-审核模式: - 用户提交银行卡提现申请(银行卡号、开户支行、提现金额) - 系统冻结申请金额 - 管理员审核(确认/拒绝) - 确认后扣除金额,拒绝后解冻金额 - 实际转账由管理员线下手动完成 ## 二、数据库变更 ### 2.1 修改 `agent_withdrawal` 表 需要新增以下字段: ```sql 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 新增银行卡信息记录表(可选,用于历史记录) 如果需要保存用户的历史银行卡信息以便自动填充: ```sql 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`) **新增银行卡提现申请接口:** ```go // 银行卡提现申请 @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"` // 提现金额 } ) ``` **新增获取历史银行卡信息接口(可选):** ```go // 获取历史银行卡信息 @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`) **新增银行卡提现审核接口:** ```go // 银行卡提现审核(确认/拒绝) @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` **核心流程:** 1. 验证用户实名认证状态 2. 验证银行卡信息与实名信息匹配(姓名需一致) 3. 验证可提现金额 4. 计算税费(6%) 5. 冻结资金(事务内) 6. 创建提现记录(状态=申请中,withdraw_type=2) 7. 创建扣税记录(状态=待扣税) 8. 保存银行卡信息到历史记录表(可选) **关键代码逻辑:** ```go // 参考 AgentWithdrawalLogic,但: // 1. 不调用支付宝接口 // 2. 状态直接设为 StatusProcessing(申请中) // 3. 添加银行卡信息字段 // 4. 验证银行卡号格式 // 5. 验证姓名与实名认证信息一致 ``` #### 3.2.2 银行卡提现审核逻辑(`AdminReviewBankCardWithdrawalLogic`) **文件位置:** `app/main/api/internal/logic/admin_agent/adminreviewbankcardwithdrawallogic.go` **确认提现流程:** 1. 验证提现记录存在且状态为申请中 2. 验证提现类型为银行卡 3. 事务内操作: - 更新提现记录状态为成功 - 解冻资金并扣除(FrozenBalance -= amount, Balance不变) - 更新扣税记录状态为成功 - 发放提现奖励(如果有) **拒绝提现流程:** 1. 验证提现记录存在且状态为申请中 2. 验证提现类型为银行卡 3. 事务内操作: - 更新提现记录状态为失败,记录拒绝原因 - 解冻资金(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` 模型(可选) 如果实现历史记录功能,需要: 1. 创建 `agent_bank_card.sql` 表结构文件 2. 使用 goctl 生成模型: ```bash 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 状态管理 **提现状态常量:** ```go const ( StatusPending = 1 // 申请中/处理中(支付宝和银行卡共用) StatusSuccess = 2 // 成功 StatusFailed = 3 // 失败 ) const ( WithdrawTypeAlipay = 1 // 支付宝提现 WithdrawTypeBankCard = 2 // 银行卡提现 ) ``` **银行卡提现状态流转:** - 申请 → StatusPending(申请中) - 管理员确认 → StatusSuccess(成功) - 管理员拒绝 → StatusFailed(失败) ## 四、前端开发 ### 4.1 用户端(tyass-webview-v2) #### 4.1.1 修改提现页面(`src/views/Withdraw.vue`) **方案A:在同一页面添加切换标签** - 添加"支付宝提现"和"银行卡提现"两个标签页 - 根据选择的标签显示不同的表单字段 **方案B:创建新的银行卡提现页面** - 创建 `src/views/BankCardWithdraw.vue` - 在路由中添加银行卡提现入口 **推荐方案A,用户体验更好** **银行卡提现表单字段:** - 银行卡号(必填,格式验证) - 开户支行(必填) - 提现金额(必填,验证规则同支付宝) - 显示实名信息(姓名、身份证号,只读) - 提示:银行卡信息需与实名信息一致 **功能点:** 1. 页面加载时调用接口获取历史银行卡信息,自动填充 2. 显示用户实名认证信息(姓名、身份证号) 3. 表单验证: - 银行卡号格式(16-19位数字) - 开户支行不能为空 - 金额验证(≥50,≤可提现金额) 4. 提交后显示申请成功提示 5. 可在提现记录中查看审核状态 #### 4.1.2 修改提现记录页面(`src/views/WithdrawDetails.vue`) - 显示提现类型(支付宝/银行卡) - 银行卡提现显示银行卡号和开户支行 - 显示审核状态(申请中/已确认/已拒绝) #### 4.1.3 API接口调用 **新增接口调用:** ```javascript // 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 管理端(tyass-admin) #### 4.2.1 修改提现列表页面(`apps/web-antd/src/views/agent/agent-withdrawal/list.vue`) **新增功能:** 1. 列表显示提现类型(支付宝/银行卡) 2. 银行卡提现显示银行卡号和开户支行 3. 银行卡提现申请中状态显示"审核"操作按钮 4. 点击审核按钮打开审核弹窗 #### 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接口调用 **新增接口:** ```typescript // 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天) 1. ✅ 编写数据库变更SQL脚本 2. ✅ 执行SQL脚本更新数据库表结构 3. ✅ 如果实现历史记录功能,创建 `agent_bank_card` 表 ### 阶段二:后端开发(3-5天) 1. ✅ 修改API定义文件(`agent.api`、`admin_agent.api`) 2. ✅ 使用goctl重新生成代码(包括模型和类型定义) 3. ✅ 实现银行卡提现申请逻辑(`BankCardWithdrawalLogic`) 4. ✅ 实现银行卡提现审核逻辑(`AdminReviewBankCardWithdrawalLogic`) 5. ✅ 修改现有提现列表逻辑,支持银行卡信息查询 6. ✅ 实现获取历史银行卡信息接口(可选) 7. ✅ 单元测试和接口测试 ### 阶段三:前端开发(3-5天) #### 用户端(tyass-webview-v2) 1. ✅ 修改提现页面,添加银行卡提现选项 2. ✅ 实现银行卡提现表单和验证 3. ✅ 实现历史信息自动填充 4. ✅ 修改提现记录页面,显示银行卡信息 5. ✅ 测试提现流程 #### 管理端(tyass-admin) 1. ✅ 修改提现列表页面,显示银行卡信息 2. ✅ 实现审核弹窗组件 3. ✅ 实现审核操作逻辑 4. ✅ 测试审核流程 ### 阶段四:测试与优化(2-3天) 1. ✅ 功能测试(申请、审核、拒绝流程) 2. ✅ 边界测试(金额、状态、并发等) 3. ✅ 性能测试 4. ✅ Bug修复 5. ✅ 代码审查 ### 阶段五:部署上线(1天) 1. ✅ 数据库迁移脚本执行 2. ✅ 后端服务部署 3. ✅ 前端应用部署 4. ✅ 生产环境验证 ## 六、注意事项 ### 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 业务风险 - **资金安全**:银行卡提现涉及资金操作 - **应对**:严格权限控制,操作日志记录 - **审核效率**:管理员需要手动审核,可能影响用户体验 - **应对**:提供审核提醒功能,优化审核流程 ## 八、后续优化建议 1. **审核提醒**:管理员审核列表增加待审核数量提醒 2. **批量审核**:支持批量确认/拒绝操作 3. **审核历史**:记录审核操作人和操作时间 4. **银行卡管理**:用户可管理多张银行卡,设置默认卡 5. **提现限额**:银行卡提现可设置不同的限额规则 ## 九、文件清单 ### 后端文件 - `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个工作日**