主要修改:
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前端资产页面现在可以正确显示用户资产
- 充值审批后余额正确更新
- 资金账户数据查询正常
9.6 KiB
9.6 KiB
数据库表结构说明
📊 表关系图
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) | 手机号 | |
| 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 唯一索引保证)
充值审批逻辑:
// 充值审批通过时
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 = 卖出
充值审批流水记录:
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 (更新):
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查询
查询用户资金账户
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];
查询用户交易账户
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;
查询充值订单及账户余额
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 交易账户
-
资金账户 (account_fund):
- 每个用户只有1个
- 存储USDT余额
- 充值/提现操作
- 划转操作的来源/目标
-
交易账户 (account_trade):
- 每个用户可以有多个(每个币种一个)
- 存储各币种持仓
- 买入/卖出操作
- 划转操作的目标/来源
充值资金流向
充值审批通过
↓
资金账户.balance += 充值金额 (⭐ 必须更新)
资金账户.total_deposit += 充值金额 (⭐ 必须更新)
↓
创建资金流水记录
↓
用户可以:
1. 提现(从资金账户扣除)
2. 划转到交易账户(资金账户 -> 交易账户USDT)
3. 用USDT买入其他币种(交易账户USDT -> 交易账户BTC/ETH等)
最后更新: 2026-03-24 13:45 数据库版本: V1.0 字符集: utf8mb4 引擎: InnoDB