Files
hm-server/银行卡提现功能实施计划.md
2025-12-24 17:38:08 +08:00

440 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 银行卡提现功能实施计划
## 一、功能概述
新增银行卡提现功能,与现有支付宝提现功能并行。银行卡提现采用申请-审核模式:
- 用户提交银行卡提现申请(银行卡号、开户支行、提现金额)
- 系统冻结申请金额
- 管理员审核(确认/拒绝)
- 确认后扣除金额,拒绝后解冻金额
- 实际转账由管理员线下手动完成
## 二、数据库变更
### 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 用户端tydata-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 管理端tydata-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天
#### 用户端tydata-webview-v2
1. ✅ 修改提现页面,添加银行卡提现选项
2. ✅ 实现银行卡提现表单和验证
3. ✅ 实现历史信息自动填充
4. ✅ 修改提现记录页面,显示银行卡信息
5. ✅ 测试提现流程
#### 管理端tydata-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个工作日**