账户余额与积分表 (User Assets)
user_assets 表用于管理用户的账户余额、DEX 交易积分以及积分兑换的理财额度,是用户资产管理的核心表。
表 结构
完整的 user_assets 表定义(关联 DEX 积分逻辑):
CREATE TABLE user_assets (
user_id INT PRIMARY KEY,
balance_u NUMERIC(20, 6) DEFAULT 0, -- U 余额
total_points INT DEFAULT 0, -- DEX 交易积分
available_quota NUMERIC(20, 6) DEFAULT 0, -- 积分兑换的可理财额度
updated_at TIMESTAMPTZ DEFAULT NOW()
);
字段详解
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
user_id | INT | PRIMARY KEY | 用户 ID,唯一标识(主键) |
balance_u | NUMERIC(20, 6) | DEFAULT 0 | 用户的 USDT 余额 用于理财申购、提现等操作 |
total_points | INT | DEFAULT 0 | DEX 交易累计积分 通过在 DEX 交易获得 |
available_quota | NUMERIC(20, 6) | DEFAULT 0 | 积分兑换的可用理财额度 使用积分兑换后可用于申购理财产品 |
updated_at | TIMESTAMPTZ | DEFAULT NOW() | 最后更新时间(带时区) |
字段关系说明
1. balance_u(USDT 余额)
用户的 USDT 现金余额,来源包括:
- 充值(从外部钱包充值)
- 理财到期返还(本金 + 利息)
- 其他收入(推荐奖励等)
用途包括:
- 申购理财产品
- 提现到外部钱包
- 其他平台消费
2. total_points(DEX 交易积分)
用户通过在 DEX 交易累计获得的积分:
- 获取方式:在关联的 DEX 平台进行交易
- 积分规则:
- 每交易 1,000 USD 获得 X 积分(具体比例可配置)
- 不同 VIP 等级可能有积分加成
- 用途:兑换理财额度
3. available_quota(可用理财额度)
用户使用积分兑换获得的额外理财申购额度:
- 兑换规则:
- 消耗一定数量的积分可兑换相应的理财额度
- 例如:1000 积分 = 100 USDT 理财额度
- 使用方式:
- 申购理财产品时,可以使用此额度(无需消耗 balance_u)
- 额度使用后不返还,理财到期时本金和利息返还到 balance_u
重要:
available_quota是额外的理财权限,不是实际资金。使用额度申购理财后,到期返还的本息会计入balance_u。
示例数据
示例 1:新用户初始状态
-- 用户 1001 刚注册,所有字段为初始值
INSERT INTO user_assets (user_id) VALUES (1001);
-- 查询结果:
-- user_id: 1001
-- balance_u: 0.000000
-- total_points: 0
-- available_quota: 0.000000
示例 2:用户充值后的状态
-- 用户 1001 充值 10000 USDT
UPDATE user_assets
SET balance_u = balance_u + 10000.000000,
updated_at = NOW()
WHERE user_id = 1001;
-- 查询结果:
-- user_id: 1001
-- balance_u: 10000.000000
-- total_points: 0
-- available_quota: 0.000000
示例 3:用户在 DEX 交易获得积分
-- 用户 1001 在 DEX 交易了 50000 USD,获得 500 积分
UPDATE user_assets
SET total_points = total_points + 500,
updated_at = NOW()
WHERE user_id = 1001;
-- 查询结果:
-- user_id: 1001
-- balance_u: 10000.000000
-- total_points: 500
-- available_quota: 0.000000
示例 4:用户使用积分兑换理财额度
-- 用户 1001 使用 500 积分兑换 5000 USDT 理财额度(1:10 兑换比例)
UPDATE user_assets
SET total_points = total_points - 500,
available_quota = available_quota + 5000.000000,
updated_at = NOW()
WHERE user_id = 1001
AND total_points >= 500; -- 确保积分足够
-- 查询结果:
-- user_id: 1001
-- balance_u: 10000.000000
-- total_points: 0
-- available_quota: 5000.000000
示例 5:用户使用额度申购理财
-- 用户 1001 使用 5000 额度申购理财产品
UPDATE user_assets
SET available_quota = available_quota - 5000.000000,
updated_at = NOW()
WHERE user_id = 1001
AND available_quota >= 5000.000000; -- 确保额度足够
-- 查询结果:
-- user_id: 1001
-- balance_u: 10000.000000 (现金余额不变)
-- total_points: 0
-- available_quota: 0.000000
示例 6:理财到期,本息返还到余额
-- 理财到期,返还本金 5000 + 利息 144 到现金余额
UPDATE user_assets
SET balance_u = balance_u + 5144.000000, -- 5000 + 144
updated_at = NOW()
WHERE user_id = 1001;
-- 查询结果:
-- user_id: 1001
-- balance_u: 15144.000000 (10000 + 5144)
-- total_points: 0
-- available_quota: 0.000000