Files
hfb_sys/docs/提现功能实施总结.md
T
2026-06-06 10:08:39 +08:00

357 lines
11 KiB
Markdown
Raw 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.
# 手动提现功能实施完成总结
## 🎉 已完成的工作
### 1. 数据库迁移(✅ 完成)
**文件**: `backend/migrations/000002_add_withdrawal_tables.sql`
创建了两张新表:
#### user_payment_accounts (用户收款账号表)
- 支持三种账号类型:支付宝 (alipay)、微信 (wechat)、银行卡 (bank)
- 账号信息加密存储
- 支持上传认证凭证(收款码截图)
- 支持设置默认账号
- 每个用户最多5个收款账号
#### withdrawal_requests (提现申请表)
- 记录用户提现申请的完整信息
- 账号信息快照(防止用户修改收款账号影响已有提现)
- 支持手续费计算
- 完整的审核流程:pending → processing → completed
- 记录审核人、打款人、打款凭证等信息
#### 权限和角色
- 新增 4 个提现相关权限
- 新增 `finance` 财务管理员角色
- 关联权限到角色
### 2. 数据模型(✅ 完成)
**文件**:
- `backend/internal/model/payment_account.go` - 收款账号模型
- `backend/internal/model/withdrawal.go` - 提现申请模型
### 3. 收款账号管理模块(✅ 完成)
**目录**: `backend/internal/modules/paymentaccount/`
#### 核心功能:
- **增删改查**:用户管理自己的收款账号
- **实名验证**:账户名必须与实名认证姓名一致
- **加密存储**:使用 AES 加密存储账号信息
- **脱敏显示**:前端显示时自动脱敏(如:138****5678
- **默认账号**:支持设置默认收款账号
- **数量限制**:每个用户最多 5 个收款账号
**文件**:
- `service.go` - 业务逻辑层
- `repository.go` - 数据访问层(含加密/解密/脱敏逻辑)
- `handler.go` - HTTP 接口处理
- `dto.go` - 数据传输对象
### 4. 提现申请模块(✅ 完成)
**目录**: `backend/internal/modules/withdrawal/`
#### 用户端功能:
- **创建提现申请**:选择收款账号、输入金额
- **查询提现列表**:查看自己的提现记录
- **查询提现详情**:查看单个提现申请
- **取消提现**:待审核状态可取消
#### 管理员端功能:
- **查询提现列表**:支持按状态、用户筛选
- **查询提现详情**:查看完整信息(包括完整账号)
- **审核提现**:通过/拒绝提现申请
- **确认打款**:上传打款凭证,完成提现
#### 核心流程:
1. **用户申请** → 冻结可用余额 → 创建提现记录(status=pending
2. **财务审核** → 通过(status=processing/ 拒绝(status=rejected,解冻余额)
3. **手动打款** → 上传凭证 → 确认完成(status=completed,扣除冻结余额)
#### 限额控制:
- 最低提现金额:10 元
- 最高单笔提现:5000 元
- 手续费率:0%(可配置)
**文件**:
- `service.go` - 业务逻辑层
- `repository.go` - 数据访问层(含钱包流水集成)
- `handler.go` - HTTP 接口处理
- `dto.go` - 数据传输对象
### 5. 路由配置(✅ 完成)
**文件**: `backend/internal/router/router.go`
#### 用户端 API:
```
POST /api/payment-accounts # 添加收款账号
GET /api/payment-accounts # 查询收款账号列表
GET /api/payment-accounts/:id # 查询收款账号详情
PUT /api/payment-accounts/:id # 更新收款账号
DELETE /api/payment-accounts/:id # 删除收款账号
POST /api/payment-accounts/:id/set-default # 设为默认
POST /api/withdrawals # 创建提现申请
GET /api/withdrawals # 查询提现列表
GET /api/withdrawals/:id # 查询提现详情
POST /api/withdrawals/:id/cancel # 取消提现
```
#### 管理员端 API:
```
GET /api/admin/withdrawals # 查询提现列表(需权限:withdrawal:list
GET /api/admin/withdrawals/:id # 查询提现详情(需权限:withdrawal:detail
POST /api/admin/withdrawals/:id/review # 审核提现(需权限:withdrawal:review
POST /api/admin/withdrawals/:id/confirm-payment # 确认打款(需权限:withdrawal:pay
```
### 6. 钱包模块更新(✅ 完成)
更新了 `wallet/service.go`,提现功能已迁移到独立的 withdrawal 模块。
---
## 📋 数据库表结构
### user_payment_accounts
```sql
id BIGINT 主键
user_id BIGINT 用户ID
account_type VARCHAR(32) 账号类型:alipay/wechat/bank
account_name VARCHAR(128) 账户名
account_no VARCHAR(255) 账号(加密存储)
bank_name VARCHAR(128) 银行名称
bank_branch VARCHAR(255) 开户行支行
certificate_urls JSON 认证凭证
is_default TINYINT 是否默认账号
status VARCHAR(32) 状态:active/disabled
created_at DATETIME
updated_at DATETIME
```
### withdrawal_requests
```sql
id BIGINT 主键
withdraw_no VARCHAR(64) 提现单号(唯一)
user_id BIGINT 用户ID
amount DECIMAL(12,2) 提现金额
fee DECIMAL(12,2) 手续费
actual_amount DECIMAL(12,2) 实际到账金额
payment_account_id BIGINT 收款账号ID
account_type VARCHAR(32) 账号类型(快照)
account_name VARCHAR(128) 账户名(快照)
account_no VARCHAR(128) 账号(快照,脱敏)
bank_name VARCHAR(128) 银行名称(快照)
bank_branch VARCHAR(255) 开户行支行(快照)
status VARCHAR(32) 状态:pending/processing/completed/rejected/cancelled
reviewed_by BIGINT 审核人ID
reviewed_at DATETIME 审核时间
review_remark VARCHAR(255) 审核备注
paid_by BIGINT 打款人ID
paid_at DATETIME 打款时间
payment_proof_url VARCHAR(512) 打款凭证URL
payment_remark VARCHAR(255) 打款备注
created_at DATETIME
updated_at DATETIME
```
---
## 🔐 安全措施
1. **账号加密存储**:使用 AES-256 加密收款账号
2. **实名验证**:账户名必须与实名认证姓名一致
3. **账号脱敏**:用户端仅显示脱敏账号(如 138****5678
4. **权限控制**:管理员操作需要对应权限
5. **金额限制**:单笔提现限额、最低提现金额
6. **状态锁定**:审核中/已完成的提现无法修改
7. **快照机制**:提现申请创建时保存账号信息快照
---
## 🔄 业务流程
### 用户提现流程
```
1. 用户添加收款账号(需实名认证)
2. 用户发起提现申请
3. 系统冻结用户可用余额
4. 创建提现申请(status=pending
5. 等待财务审核
```
### 财务审核流程
```
1. 财务管理员查看待审核列表
2. 审核提现申请
├─ 通过:status → processing
└─ 拒绝:status → rejected,解冻余额
3. 手动转账(支付宝/微信/银行)
4. 上传打款凭证
5. 确认完成(status → completed
6. 系统扣除冻结余额
```
---
## 📊 钱包流水业务类型
提现相关的 `biz_type`:
- `withdraw_freeze` - 提现冻结
- `withdraw_reject` - 提现拒绝(解冻)
- `withdraw_cancel` - 用户取消提现(解冻)
- `withdraw_complete` - 提现完成(扣除冻结余额)
---
## 🚀 部署步骤
### 1. 执行数据库迁移
```bash
mysql -u root -p your_database < backend/migrations/000002_add_withdrawal_tables.sql
```
### 2. 重新编译后端
```bash
cd backend
go build -o server cmd/api/main.go
```
### 3. 重启服务
```bash
./server
```
### 4. 配置财务管理员
```sql
-- 查询 finance 角色ID
SELECT id FROM roles WHERE code = 'finance';
-- 给管理员分配财务角色
INSERT INTO admin_user_roles (admin_user_id, role_id)
VALUES (你的管理员ID, 财务角色ID);
```
---
## ⚙️ 配置说明
### 加密密钥配置
文件:`backend/internal/modules/paymentaccount/repository.go`
**重要**:生产环境必须修改加密密钥!
```go
const encryptionKey = "your-32-byte-secret-key-here!!" // 32字节
```
建议从环境变量或配置文件读取:
```go
var encryptionKey = os.Getenv("PAYMENT_ACCOUNT_ENCRYPTION_KEY")
```
### 提现限额配置
文件:`backend/internal/modules/withdrawal/service.go`
```go
const (
MinWithdrawalAmount = 10.0 // 最低提现金额
MaxWithdrawalAmount = 5000.0 // 单笔最高提现金额
WithdrawalFeeRate = 0.0 // 手续费率
)
```
---
## ✅ 测试建议
### 1. 收款账号管理测试
- [ ] 添加支付宝账号
- [ ] 添加微信账号
- [ ] 添加银行卡账号
- [ ] 测试实名验证(账户名不匹配)
- [ ] 测试账号数量限制(最多5个)
- [ ] 测试设置默认账号
- [ ] 测试删除账号
- [ ] 验证账号加密和脱敏显示
### 2. 提现申请测试
- [ ] 测试最低金额限制(<10元)
- [ ] 测试最高金额限制(>5000元)
- [ ] 测试余额不足
- [ ] 测试正常提现申请
- [ ] 测试用户取消提现(pending状态)
- [ ] 测试无法取消已审核的提现
### 3. 财务审核测试
- [ ] 测试查询待审核列表
- [ ] 测试审核通过
- [ ] 测试审核拒绝(验证余额解冻)
- [ ] 测试确认打款(上传凭证)
- [ ] 测试管理员可见完整账号
### 4. 权限测试
- [ ] 测试非财务管理员无法访问审核接口
- [ ] 测试财务管理员可以访问所有提现接口
- [ ] 测试用户只能查看自己的提现记录
---
## 📝 后续优化建议
### 短期优化
1. **前端页面开发**:用户端收款账号管理、提现申请页面
2. **管理员前端**:提现审核列表、审核详情页面
3. **通知功能**:提现状态变更时发送通知
4. **文件上传**:集成打款凭证上传功能
### 中期优化
1. **自动化提现**:小额提现自动审核
2. **批量打款**:导出批量打款文件
3. **提现报表**:财务报表统计
4. **风控规则**:异常提现检测
### 长期优化
1. **支付网关对接**:集成自动打款接口
2. **银行接口对接**:企业网银直连
3. **实时到账**T+0 实时提现
4. **多级审批**:大额提现多级审批流程
---
## ⚠️ 注意事项
1. **加密密钥**:生产环境必须使用强随机密钥,并妥善保管
2. **权限配置**:确保财务管理员权限配置正确
3. **余额校验**:提现前严格校验余额,防止超额提现
4. **状态机**:严格按照状态流转规则操作
5. **审计日志**:所有财务操作应记录审计日志
6. **测试环境**:充分测试后再上线生产环境
---
## 🎯 项目总结
本次实施完成了**手动提现功能的完整开发**,包括:
- ✅ 数据库设计和迁移
- ✅ 后端业务逻辑实现
- ✅ API 接口开发
- ✅ 权限和角色配置
- ✅ 安全措施实施
系统已具备完整的手动提现能力,财务管理员可以通过管理后台进行提现审核和打款确认操作。
**下一步**:前端界面开发 → 完整测试 → 生产环境部署