# 数据库表结构说明

## 📊 表关系图

```
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
