feat: add billing core models
This commit is contained in:
+10
-5
@@ -168,6 +168,7 @@ CREATE TABLE user_wallet (
|
||||
id INTEGER PRIMARY KEY,
|
||||
user_id INTEGER UNIQUE NOT NULL REFERENCES "user"(id),
|
||||
points_balance BIGINT NOT NULL DEFAULT 0, -- >=0,仅计费层可改
|
||||
created_at TEXT NOT NULL,
|
||||
updated_at TEXT NOT NULL
|
||||
);
|
||||
|
||||
@@ -180,7 +181,8 @@ CREATE TABLE api_key (
|
||||
key_prefix TEXT NOT NULL, -- 如 sk_live_abc…,列表展示/定位用
|
||||
status TEXT NOT NULL DEFAULT 'active', -- active / revoked
|
||||
last_used_at TEXT,
|
||||
created_at TEXT NOT NULL
|
||||
created_at TEXT NOT NULL,
|
||||
updated_at TEXT NOT NULL
|
||||
);
|
||||
|
||||
-- 充值订单(支付回调入账依据,订单号幂等)
|
||||
@@ -207,7 +209,7 @@ CREATE TABLE points_ledger (
|
||||
change_type TEXT NOT NULL, -- recharge / consume / adjust / refund
|
||||
points_delta BIGINT NOT NULL, -- 正为加、负为减
|
||||
balance_after BIGINT NOT NULL, -- 变动后余额,便于对账
|
||||
ref_order_id INTEGER REFERENCES recharge_order(id),
|
||||
ref_order_id INTEGER, -- T-201 先存数值引用;RechargeOrder 落地后再正式关联
|
||||
ref_call_id INTEGER REFERENCES call_record(id),
|
||||
reason TEXT, -- 运营手工调整必填原因
|
||||
created_at TEXT NOT NULL
|
||||
@@ -220,7 +222,7 @@ CREATE TABLE call_record (
|
||||
api_key_id INTEGER REFERENCES api_key(id), -- 本次调用所用的 Key
|
||||
operation_type TEXT NOT NULL, -- title / image
|
||||
alias TEXT, -- 调用方请求的能力别名(对外稳定标识)
|
||||
model_name TEXT, -- 实际服务该次请求的具体模型(解析后,便于排障/对账)
|
||||
model_used TEXT, -- 实际服务该次请求的具体模型(解析后,便于排障/对账)
|
||||
resolution TEXT,
|
||||
prompt TEXT,
|
||||
points_cost BIGINT NOT NULL DEFAULT 0,
|
||||
@@ -228,7 +230,9 @@ CREATE TABLE call_record (
|
||||
upstream_latency_ms INTEGER,
|
||||
error_message TEXT,
|
||||
result_ref TEXT, -- 结果引用(URL/路径/摘要),不存 raw/base64
|
||||
created_at TEXT NOT NULL
|
||||
result_summary TEXT, -- 可选短摘要,不存 provider raw
|
||||
created_at TEXT NOT NULL,
|
||||
updated_at TEXT NOT NULL
|
||||
);
|
||||
```
|
||||
|
||||
@@ -237,10 +241,11 @@ CREATE TABLE call_record (
|
||||
- 主键自增;`api_key.key_hash`、`recharge_order.order_no`、`user.username` 唯一。
|
||||
- 重要索引:`call_record(user_id, created_at)`、`points_ledger(user_id, created_at)`、`recharge_order(order_no)`、`api_key(key_hash)`。
|
||||
- 不软删除业务流水;用户/账号可标记 `disabled` 而非物理删;API Key 用 `revoked` 状态而非物理删。
|
||||
- 服务端生成字段:`api_key.key_hash`/`key_prefix`、`points_balance`、`balance_after`、各 `created_at`。
|
||||
- 服务端生成字段:`api_key.key_hash`/`key_prefix`、`points_balance`、`balance_after`、各 `created_at` / `updated_at`。
|
||||
- `payment_user_id`、`payment_txn_no` 为对账预留,字段先建。
|
||||
- `recharge_order.exchange_rate` 与 `points_granted` 在下单时写入,状态为 `pending` 时也必须有值;支付回调金额必须与订单金额一致,入账时不得按新的汇率重算。
|
||||
- `call_record.status` 状态机为 `pending -> success / failed`。上游失败退点后仍保持 `failed`,退款流水通过 `points_ledger(change_type=refund, ref_call_id=call_record.id)` 关联,不单独增加 `refunded` 状态,避免调用结果与账务动作混在一个字段里。
|
||||
- T-201 已落地 `UserWallet` / `ApiKey` 于 `apps.users`,`PointsLedger` / `CallRecord` 于 `apps.billing`;`ref_order_id` 在充值订单模型落地前保持索引化数值引用。
|
||||
|
||||
## 四、计费时序(核心,务必照此实现)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user