Files
Znc_V2/银行卡提现功能实施计划.md

440 lines
15 KiB
Markdown
Raw Normal View History

2026-01-12 18:14:32 +08:00
# 银行卡提现功能实施计划
## 一、功能概述
新增银行卡提现功能,与现有支付宝提现功能并行。银行卡提现采用申请-审核模式:
- 用户提交银行卡提现申请(银行卡号、开户支行、提现金额)
- 系统冻结申请金额
- 管理员审核(确认/拒绝)
- 确认后扣除金额,拒绝后解冻金额
- 实际转账由管理员线下手动完成
## 二、数据库变更
### 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个工作日**