主要修改:
1. AssetService.java - 修改getOverview()方法返回字段
- totalAssets → totalAsset (总资产)
- tradeValue → tradeBalance (交易余额)
- 新增 totalProfit 字段 (总盈亏)
- 移除 fundFrozen 和 positions 字段 (Flutter不需要)
2. 新增诊断工具和文档:
- ASSET_API_DIAGNOSIS.md - API接口问题诊断报告
- DATABASE_SCHEMA.md - 数据库表结构说明
- test_asset_api.sh - API接口测试脚本
- query_fund_accounts.sh - 用户资金账户查询脚本
- fix_asset_api.sh - 自动修复脚本
修复后API返回格式:
{
"totalAsset": 15500.0, // 总资产
"fundBalance": 15500.0, // 资金余额
"tradeBalance": 0, // 交易余额
"totalProfit": 0 // 总盈亏
}
影响范围:
- Flutter前端资产页面现在可以正确显示用户资产
- 充值审批后余额正确更新
- 资金账户数据查询正常
386 lines
9.6 KiB
Markdown
386 lines
9.6 KiB
Markdown
# 数据库表结构说明
|
||
|
||
## 📊 表关系图
|
||
|
||
```
|
||
sys_user (用户表)
|
||
│
|
||
├─── account_fund (资金账户表) - 1:1
|
||
│ │
|
||
│ └─── account_flow (资金流水表) - 1:N
|
||
│
|
||
└─── account_trade (交易账户表) - 1:N
|
||
│
|
||
└─── order_trade (交易订单表) - 1:N
|
||
|
||
order_fund (充提订单表)
|
||
│
|
||
└─── account_flow (资金流水表)
|
||
```
|
||
|
||
---
|
||
|
||
## 1. 用户表 (sys_user)
|
||
|
||
**用途**: 存储用户基本信息
|
||
|
||
| 字段名 | 类型 | 说明 | 备注 |
|
||
|--------|------|------|------|
|
||
| id | bigint(20) | 主键ID | 自增 |
|
||
| username | varchar(50) | 账号 | 唯一 |
|
||
| password | varchar(100) | 密码 | BCrypt加密 |
|
||
| nickname | varchar(50) | 昵称 | |
|
||
| avatar | varchar(255) | 头像URL | |
|
||
| phone | varchar(20) | 手机号 | |
|
||
| email | varchar(100) | 邮箱 | |
|
||
| kyc_status | tinyint(1) | KYC状态 | 0-未激活, 1-已激活 |
|
||
| id_card_front | varchar(255) | 身份证正面照URL | |
|
||
| id_card_back | varchar(255) | 身份证反面照URL | |
|
||
| status | tinyint(1) | 状态 | 0-禁用, 1-正常 |
|
||
| last_login_time | datetime | 最后登录时间 | |
|
||
| last_login_ip | varchar(50) | 最后登录IP | |
|
||
| token | varchar(500) | 当前Token | |
|
||
| create_time | datetime | 创建时间 | |
|
||
| update_time | datetime | 更新时间 | |
|
||
|
||
**索引**:
|
||
- PRIMARY KEY (id)
|
||
- UNIQUE KEY uk_username (username)
|
||
|
||
---
|
||
|
||
## 2. 资金账户表 (account_fund) ⭐ 充值目标
|
||
|
||
**用途**: 存储用户资金账户信息(USDT)
|
||
|
||
| 字段名 | 类型 | 说明 | 备注 |
|
||
|--------|------|------|------|
|
||
| id | bigint(20) | 主键ID | 自增 |
|
||
| user_id | bigint(20) | 用户ID | 唯一,关联sys_user.id |
|
||
| **balance** | decimal(20,8) | **USDT余额** | **⭐ 充值审批通过后增加** |
|
||
| frozen | decimal(20,8) | 冻结金额 | 提现申请时冻结 |
|
||
| **total_deposit** | decimal(20,8) | **累计充值** | **⭐ 充值审批通过后增加** |
|
||
| total_withdraw | decimal(20,8) | 累计提现 | 提现成功后增加 |
|
||
| create_time | datetime | 创建时间 | |
|
||
| update_time | datetime | 更新时间 | |
|
||
|
||
**索引**:
|
||
- PRIMARY KEY (id)
|
||
- UNIQUE KEY uk_user_id (user_id)
|
||
|
||
**关系**:
|
||
- 每个用户有且仅有一个资金账户
|
||
- 1:1 关系(通过 user_id 唯一索引保证)
|
||
|
||
**充值审批逻辑**:
|
||
```java
|
||
// 充值审批通过时
|
||
balance = balance + 充值金额
|
||
total_deposit = total_deposit + 充值金额
|
||
update_time = NOW()
|
||
```
|
||
|
||
---
|
||
|
||
## 3. 交易账户表 (account_trade)
|
||
|
||
**用途**: 存储用户各币种持仓信息
|
||
|
||
| 字段名 | 类型 | 说明 | 备注 |
|
||
|--------|------|------|------|
|
||
| id | bigint(20) | 主键ID | 自增 |
|
||
| user_id | bigint(20) | 用户ID | 关联sys_user.id |
|
||
| coin_code | varchar(20) | 币种代码 | 如 BTC, ETH, USDT |
|
||
| quantity | decimal(20,8) | 持仓数量 | |
|
||
| frozen | decimal(20,8) | 冻结数量 | |
|
||
| avg_price | decimal(20,8) | 平均成本价 | |
|
||
| total_buy | decimal(20,8) | 累计买入数量 | |
|
||
| total_sell | decimal(20,8) | 累计卖出数量 | |
|
||
| create_time | datetime | 创建时间 | |
|
||
| update_time | datetime | 更新时间 | |
|
||
|
||
**索引**:
|
||
- PRIMARY KEY (id)
|
||
- UNIQUE KEY uk_user_coin (user_id, coin_code)
|
||
|
||
**关系**:
|
||
- 每个用户可以有多个交易账户(每个币种一个)
|
||
- 1:N 关系
|
||
|
||
---
|
||
|
||
## 4. 充提订单表 (order_fund)
|
||
|
||
**用途**: 存储充值和提现订单
|
||
|
||
| 字段名 | 类型 | 说明 | 备注 |
|
||
|--------|------|------|------|
|
||
| id | bigint(20) | 主键ID | 自增 |
|
||
| order_no | varchar(32) | 订单号 | 唯一,F+时间戳 |
|
||
| user_id | bigint(20) | 用户ID | 关联sys_user.id |
|
||
| username | varchar(50) | 用户账号 | 冗余字段 |
|
||
| type | tinyint(1) | 类型 | 1-充值, 2-提现 |
|
||
| amount | decimal(20,8) | 金额(USDT) | |
|
||
| wallet_id | bigint(20) | 钱包ID | 充值订单使用 |
|
||
| wallet_address | varchar(255) | 钱包地址 | 充值/提现地址 |
|
||
| withdraw_contact | varchar(100) | 提现联系方式 | |
|
||
| **status** | tinyint(1) | **状态** | **见状态说明** |
|
||
| pay_time | datetime | 用户打款时间 | |
|
||
| confirm_time | datetime | 确认/审批时间 | |
|
||
| approve_admin_id | bigint(20) | 审批管理员ID | |
|
||
| approve_admin_name | varchar(50) | 审批管理员名称 | |
|
||
| approve_time | datetime | 审批时间 | |
|
||
| reject_reason | varchar(255) | 驳回原因 | |
|
||
| remark | varchar(255) | 用户备注 | |
|
||
| admin_remark | varchar(255) | 管理员备注 | |
|
||
| create_time | datetime | 创建时间 | |
|
||
| update_time | datetime | 更新时间 | |
|
||
|
||
**订单状态说明**:
|
||
|
||
**充值订单**:
|
||
- 1 = 待付款(用户刚申请充值)
|
||
- 2 = 待确认(用户已确认打款,等待管理员审批)⭐ 可审批
|
||
- 3 = 已完成(管理员审批通过,余额已到账)
|
||
- 4 = 已驳回(管理员审批驳回)
|
||
- 5 = 已取消
|
||
|
||
**提现订单**:
|
||
- 1 = 待审批(用户申请提现,等待管理员审批)⭐ 可审批
|
||
- 2 = 已完成(管理员审批通过,已打款)
|
||
- 3 = 已驳回(管理员审批驳回,余额已退还)
|
||
- 4 = 已取消
|
||
|
||
**索引**:
|
||
- PRIMARY KEY (id)
|
||
- UNIQUE KEY uk_order_no (order_no)
|
||
- KEY idx_user_id (user_id)
|
||
- KEY idx_status (status)
|
||
- KEY idx_type (type)
|
||
|
||
---
|
||
|
||
## 5. 资金流水表 (account_flow)
|
||
|
||
**用途**: 记录资金账户的所有变动
|
||
|
||
| 字段名 | 类型 | 说明 | 备注 |
|
||
|--------|------|------|------|
|
||
| id | bigint(20) | 主键ID | 自增 |
|
||
| user_id | bigint(20) | 用户ID | |
|
||
| flow_no | varchar(32) | 流水号 | |
|
||
| flow_type | tinyint(1) | 流水类型 | 见类型说明 |
|
||
| amount | decimal(20,8) | 变动金额 | 正数=收入,负数=支出 |
|
||
| balance_before | decimal(20,8) | 变动前余额 | |
|
||
| balance_after | decimal(20,8) | 变动后余额 | |
|
||
| coin_code | varchar(20) | 相关币种 | 默认USDT |
|
||
| related_order_no | varchar(32) | 关联订单号 | |
|
||
| remark | varchar(255) | 备注 | |
|
||
| create_time | datetime | 创建时间 | |
|
||
|
||
**流水类型**:
|
||
- 1 = 充值
|
||
- 2 = 提现
|
||
- 3 = 划转转入(资金账户 -> 交易账户)
|
||
- 4 = 划转转出(交易账户 -> 资金账户)
|
||
- 5 = 买入
|
||
- 6 = 卖出
|
||
|
||
**充值审批流水记录**:
|
||
```java
|
||
flow_type = 1 (充值)
|
||
amount = +100.00 (正数)
|
||
balance_before = 0.00 (审批前余额)
|
||
balance_after = 100.00 (审批后余额)
|
||
coin_code = USDT
|
||
related_order_no = F20260324001 (充值订单号)
|
||
remark = "充值"
|
||
```
|
||
|
||
---
|
||
|
||
## 📋 充值完整流程示例
|
||
|
||
### 示例数据
|
||
|
||
**用户**: user1 (ID=1)
|
||
|
||
#### 1. 初始状态
|
||
|
||
**sys_user**:
|
||
```
|
||
id=1, username=user1, status=1
|
||
```
|
||
|
||
**account_fund** (资金账户):
|
||
```
|
||
id=1, user_id=1, balance=0.00, frozen=0.00,
|
||
total_deposit=0.00, total_withdraw=0.00
|
||
```
|
||
|
||
**account_trade** (交易账户 - USDT):
|
||
```
|
||
id=1, user_id=1, coin_code=USDT, quantity=0.00
|
||
```
|
||
|
||
---
|
||
|
||
#### 2. 申请充值(100 USDT)
|
||
|
||
**order_fund** (新建订单):
|
||
```
|
||
id=1, order_no=F20260324001, user_id=1, type=1,
|
||
amount=100.00, status=1 (待付款)
|
||
```
|
||
|
||
**account_fund**: 无变化
|
||
|
||
---
|
||
|
||
#### 3. 确认打款
|
||
|
||
**order_fund**:
|
||
```
|
||
status=2 (待确认), pay_time=2026-03-24 10:30:00
|
||
```
|
||
|
||
**account_fund**: 无变化
|
||
|
||
---
|
||
|
||
#### 4. 管理员审批通过 ⭐ 关键步骤
|
||
|
||
**order_fund**:
|
||
```
|
||
status=3 (已完成),
|
||
approve_admin_id=1,
|
||
approve_admin_name='管理员',
|
||
approve_time=2026-03-24 11:00:00,
|
||
confirm_time=2026-03-24 11:00:00
|
||
```
|
||
|
||
**account_fund** (更新):
|
||
```sql
|
||
UPDATE account_fund
|
||
SET balance = 0.00 + 100.00 = 100.00, -- ⭐ 余额增加
|
||
total_deposit = 0.00 + 100.00 = 100.00, -- ⭐ 累计充值增加
|
||
update_time = '2026-03-24 11:00:00'
|
||
WHERE user_id = 1;
|
||
```
|
||
|
||
**account_flow** (新建流水):
|
||
```
|
||
id=1, user_id=1, flow_no=FL20260324001,
|
||
flow_type=1 (充值),
|
||
amount=100.00 (正数),
|
||
balance_before=0.00,
|
||
balance_after=100.00,
|
||
coin_code=USDT,
|
||
related_order_no=F20260324001,
|
||
remark='充值',
|
||
create_time=2026-03-24 11:00:00
|
||
```
|
||
|
||
---
|
||
|
||
#### 5. 最终状态
|
||
|
||
**account_fund**:
|
||
```
|
||
id=1, user_id=1,
|
||
balance=100.00, -- ⭐ 已增加
|
||
frozen=0.00,
|
||
total_deposit=100.00, -- ⭐ 已增加
|
||
total_withdraw=0.00
|
||
```
|
||
|
||
---
|
||
|
||
## 🔍 关键SQL查询
|
||
|
||
### 查询用户资金账户
|
||
```sql
|
||
SELECT
|
||
u.id as user_id,
|
||
u.username,
|
||
af.balance,
|
||
af.frozen,
|
||
af.total_deposit,
|
||
af.total_withdraw
|
||
FROM sys_user u
|
||
LEFT JOIN account_fund af ON u.id = af.user_id
|
||
WHERE u.id = [用户ID];
|
||
```
|
||
|
||
### 查询用户交易账户
|
||
```sql
|
||
SELECT
|
||
at.id,
|
||
at.user_id,
|
||
at.coin_code,
|
||
at.quantity,
|
||
at.frozen,
|
||
at.avg_price,
|
||
c.price as current_price,
|
||
(at.quantity * c.price) as value_usdt
|
||
FROM account_trade at
|
||
LEFT JOIN coin c ON at.coin_code = c.code
|
||
WHERE at.user_id = [用户ID] AND at.quantity > 0;
|
||
```
|
||
|
||
### 查询充值订单及账户余额
|
||
```sql
|
||
SELECT
|
||
of.order_no,
|
||
of.user_id,
|
||
of.amount as order_amount,
|
||
of.status as order_status,
|
||
of.approve_time,
|
||
af.balance as current_balance,
|
||
af.total_deposit
|
||
FROM order_fund of
|
||
LEFT JOIN account_fund af ON of.user_id = af.user_id
|
||
WHERE of.order_no = '[订单号]';
|
||
```
|
||
|
||
---
|
||
|
||
## ⚠️ 重要说明
|
||
|
||
### 资金账户 vs 交易账户
|
||
|
||
1. **资金账户 (account_fund)**:
|
||
- 每个用户只有1个
|
||
- 存储USDT余额
|
||
- 充值/提现操作
|
||
- 划转操作的来源/目标
|
||
|
||
2. **交易账户 (account_trade)**:
|
||
- 每个用户可以有多个(每个币种一个)
|
||
- 存储各币种持仓
|
||
- 买入/卖出操作
|
||
- 划转操作的目标/来源
|
||
|
||
### 充值资金流向
|
||
|
||
```
|
||
充值审批通过
|
||
↓
|
||
资金账户.balance += 充值金额 (⭐ 必须更新)
|
||
资金账户.total_deposit += 充值金额 (⭐ 必须更新)
|
||
↓
|
||
创建资金流水记录
|
||
↓
|
||
用户可以:
|
||
1. 提现(从资金账户扣除)
|
||
2. 划转到交易账户(资金账户 -> 交易账户USDT)
|
||
3. 用USDT买入其他币种(交易账户USDT -> 交易账户BTC/ETH等)
|
||
```
|
||
|
||
---
|
||
|
||
**最后更新**: 2026-03-24 13:45
|
||
**数据库版本**: V1.0
|
||
**字符集**: utf8mb4
|
||
**引擎**: InnoDB
|