用户投资记录表 (User Investments)
user_investments 表记录用户对各期理财产品的申购和持有情况,是理财系统的核心业务表之一。
投资状态枚举
系统定义了以下投资状态类型:
CREATE TYPE investment_status AS ENUM (
'holding', -- 持有中:投资已生效,正在计息
'redeemed', -- 已赎回:已到期并完成收益结算
'failed' -- 失败:申购失败或异常状态
);
表结构
完整的 user_investments 表定义:
CREATE TABLE user_investments (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL, -- 用户ID
product_id INT REFERENCES financial_products(id),
invested_amount NUMERIC(20, 6) NOT NULL, -- 投资本金
expected_interest NUMERIC(20, 6) NOT NULL, -- 预期利息 (计算得出)
actual_interest NUMERIC(20, 6) DEFAULT 0, -- 实际派息
status investment_status DEFAULT 'holding',
invested_at TIMESTAMPTZ DEFAULT NOW(), -- 投资时间
redeemed_at TIMESTAMPTZ -- 自动赎回/到期时间
);
字段详解
核心字段
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
id | SERIAL | PRIMARY KEY | 投资记录唯一标识(自增主键) |
user_id | INT | NOT NULL | 用户 ID,关联用户表 |
product_id | INT | REFERENCES financial_products(id) | 理财产品 ID,外键关联 financial_products 表 |
金额字段
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
invested_amount | NUMERIC(20, 6) | NOT NULL | 用户实际投资的本金金额(USDT) 例: 1000.000000 表示投资 1000 U |
expected_interest | NUMERIC(20, 6) | NOT NULL | 预期收益金额,根据产品利率计算 公式: invested_amount × product.period_yield |
actual_interest | NUMERIC(20, 6) | DEFAULT 0 | 实际派发的利息金额 结算时更新,通常等于 expected_interest |
利息计算示例:如果投资 1000 U 到年化 150%、期限 7 天的产品(当期利率 2.88%),则预期利息 = 1000 × 0.0288 = 28.8 U
状态和时间
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
status | investment_status | DEFAULT 'holding' | 投资状态,见上方状态枚举说明 |
invested_at | TIMESTAMPTZ | DEFAULT NOW() | 申购成功时间(起息时间) |
redeemed_at | TIMESTAMPTZ | - | 赎回时间,到期自动结算时填充 |
投资生命周期
用户投资记录的典型状态流转:
申购 → holding (持有中) → redeemed (已赎回)
↓
failed (失败)
- holding(持有中):用户成功申购后,资金锁定,开始计息
- redeemed(已赎回):到达产品
settlement_time,系统自动结算收益并返还本息 - failed(失败):申购过程中出现异常(如余额不足、产品售罄等)
示例数据
示例 1:用户 ID 1001 投资第 1 期理财
-- 假设用户投资 5000 U 到第 1 期理财产品
-- 第 1 期:年化 150%,7 天期,当期利率 2.88%
INSERT INTO user_investments (
user_id,
product_id,
invested_amount,
expected_interest,
status,
invested_at
) VALUES (
1001,
1, -- 第 1 期产品
5000.000000, -- 投资 5000 U
144.000000, -- 预期利息: 5000 × 0.0288 = 144 U
'holding',
'2026-01-10 10:30:00+08'
);
示例 2:多个用户投资同一产品
-- 用户 1002 投资 10000 U(达到个人限额)
INSERT INTO user_investments (
user_id, product_id, invested_amount, expected_interest, status, invested_at
) VALUES (
1002, 1, 10000.000000, 288.000000, 'holding', '2026-01-10 11:00:00+08'
);
-- 用户 1003 投资 100 U(最低起购额)
INSERT INTO user_investments (
user_id, product_id, invested_amount, expected_interest, status, invested_at
) VALUES (
1003, 1, 100.000000, 2.880000, 'holding', '2026-01-10 11:15:00+08'
);
示例 3:已结算的投资记录
-- 用户 1004 的投资已到期结算
INSERT INTO user_investments (
user_id,
product_id,
invested_amount,
expected_interest,
actual_interest,
status,
invested_at,
redeemed_at
) VALUES (
1004,
1,
3000.000000, -- 投资 3000 U
86.400000, -- 预期利息 86.4 U
86.400000, -- 实际派息 86.4 U
'redeemed',
'2026-01-10 12:00:00+08',
'2026-01-17 10:00:00+08' -- 7天后到期
);
查询示例
1. 查询用户的所有投资记录
SELECT
ui.id,
fp.period_name,
ui.invested_amount,
ui.expected_interest,
ui.actual_interest,
ui.status,
ui.invested_at,
ui.redeemed_at
FROM user_investments ui
JOIN financial_products fp ON ui.product_id = fp.id
WHERE ui.user_id = 1001
ORDER BY ui.invested_at DESC;
2. 查询用户当前持有的投资
SELECT
fp.period_name,
fp.period_number,
ui.invested_amount,
ui.expected_interest,
fp.settlement_time,
EXTRACT(DAY FROM (fp.settlement_time - NOW())) AS days_to_settle
FROM user_investments ui
JOIN financial_products fp ON ui.product_id = fp.id
WHERE ui.user_id = 1001
AND ui.status = 'holding'
ORDER BY fp.settlement_time ASC;
3. 统计某期产品的投资情况
-- 统计第 1 期产品的投资人数和金额
SELECT
COUNT(DISTINCT user_id) AS total_investors,
COUNT(*) AS total_orders,
SUM(invested_amount) AS total_invested,
SUM(expected_interest) AS total_expected_interest,
AVG(invested_amount) AS avg_invested_per_order
FROM user_investments
WHERE product_id = 1
AND status != 'failed';