feat: 移除“租户管理员为用户充值 / 每租户一套余额”能力:余额统一为全局用户余额
This commit is contained in:
@@ -149,27 +149,19 @@
|
||||
- refunding 期间不得重复扣款/重复回收权益;
|
||||
- 失败可重试(明确重试幂等键策略)。
|
||||
|
||||
## Epic E:审计字段结构化(当前充值操作者更多在 snapshot/remark)
|
||||
## Epic E:审计字段结构化(操作者/业务引用结构化)
|
||||
|
||||
### E1(P1, DB/API)tenant_ledgers 增加操作者字段与业务引用字段
|
||||
|
||||
- **DB 变更**(建议):
|
||||
- `tenant_ledgers.operator_user_id bigint NULL`
|
||||
- `tenant_ledgers.biz_ref_type varchar(32) NULL`(order/refund/topup/etc)
|
||||
- `tenant_ledgers.biz_ref_type varchar(32) NULL`(order/refund/etc)
|
||||
- `tenant_ledgers.biz_ref_id bigint NULL`
|
||||
- 对 `(tenant_id, biz_ref_type, biz_ref_id, type)` 做唯一约束(或与 idempotency_key 二选一作为主幂等源)。
|
||||
- **验收用例**:
|
||||
- 充值/退款/购买相关 ledger 必须写入 operator_user_id(admin/buyer/system);
|
||||
- 购买/退款/调账等敏感 ledger 必须写入 operator_user_id(admin/buyer/system);
|
||||
- 后台可按 operator_user_id 检索敏感操作流水。
|
||||
|
||||
### E2(P1, DB/Order)topup 结构化操作者字段(可选)
|
||||
|
||||
- **DB 变更**(二选一):
|
||||
1) 在 `orders` 增加 `operator_user_id`(对 topup 更直观)
|
||||
2) 保持在 snapshot,但保证 ledger/operator 字段可追溯
|
||||
- **验收用例**:
|
||||
- 导出订单时能明确区分“充值发起人”和“充值受益人”。
|
||||
|
||||
## 1. 建议交付顺序(最小闭环)
|
||||
|
||||
1) A1 → A2(先把公开读能力与语义定死)
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
- **加入租户**:支持邀请码加入与申请加入(tenantjoin 模块)。
|
||||
|
||||
### 1.2 余额体系(可用 + 冻结)与账本流水
|
||||
- **账户维度**:`tenant_users(tenant_id,user_id)`;字段包含 `balance`、`balance_frozen`。
|
||||
- **账户维度**:`users(id)`;字段包含 `balance`、`balance_frozen`(全局余额,可在已加入租户间共享消费)。
|
||||
- **账本流水**:`tenant_ledgers` 记录每次余额变更,含:
|
||||
- `type`(credit_topup / freeze / unfreeze / debit_purchase / credit_refund 等);
|
||||
- `type`(freeze / unfreeze / debit_purchase / credit_refund 等);
|
||||
- `balance_before/after`、`frozen_before/after` 快照;
|
||||
- `idempotency_key` 唯一约束(tenant+user 维度)用于幂等落账。
|
||||
- **一致性**:账本落地实现包含行锁与“余额/冻结余额不得为负”的不变量校验。
|
||||
@@ -28,10 +28,10 @@
|
||||
- **试看**:区分 preview/main 资源角色;`/preview` 不要求购买,`/assets` 要求已购/免费/作者。
|
||||
|
||||
### 1.4 订单、购买、充值与退款
|
||||
- **订单与明细**:`orders` + `order_items`;支持 type=content_purchase/topup 与状态流转。
|
||||
- **订单与明细**:`orders` + `order_items`;支持 type=content_purchase 与状态流转。
|
||||
- **购买(余额支付)**:支持冻结→扣款(消耗冻结)→授予权益;并发靠行锁+冻结方案防止透支。
|
||||
- **购买幂等**:`idempotency_key` 支持“至多一次”购买语义;失败会写回滚标记并稳定返回“失败+已回滚”。
|
||||
- **充值**:租户管理员可为租户成员单笔充值 + 批量充值;写 topup 订单 + credit_topup 账本。
|
||||
- **充值**:已移除(不提供按租户充值能力)。
|
||||
- **退款**:租户管理员可对已支付订单退款;默认时间窗(paid_at + 24h),可 force 绕过;退款入账 + 回收权益。
|
||||
- **后台订单查询**:支持管理员按条件分页查询与导出(CSV)。
|
||||
|
||||
|
||||
@@ -172,8 +172,7 @@
|
||||
### 7.1 订单类型(建议)
|
||||
为后续扩展预留 `order_type`:
|
||||
- `content_purchase`:购买内容(本 spec 核心)
|
||||
- `topup`:充值订单(租户发放/用户支付)
|
||||
> 你已确认本期只做 1.A + 2.A,因此 `content_purchase` + `topup(tenant_grant)` 为主,`user_pay`/`service_fee` 仅作为未来扩展位保留。
|
||||
> 已移除“租户为用户充值 / topup”特性:用户余额为全局属性(`users.balance`),可在加入的任意租户内消费。
|
||||
|
||||
### 7.2 订单状态(建议)
|
||||
以余额支付为例(不接三方):
|
||||
@@ -218,7 +217,6 @@
|
||||
- 所有入账/出账/退款都强制关联“业务单据”(订单/退款单)。
|
||||
|
||||
### 8.2 流水类型(建议)
|
||||
- `credit_topup`:充值入账
|
||||
- `debit_purchase`:购买扣款
|
||||
- `credit_refund`:退款回滚
|
||||
- `freeze` / `unfreeze`:冻结/解冻(可选)
|
||||
@@ -235,12 +233,8 @@
|
||||
2) 创建 `TenantUser(tenant_id,user_id,role=member,balance=0)`
|
||||
3) tenant_admin 可提升为 `tenant_admin`
|
||||
|
||||
### 9.2 租户为用户充值
|
||||
1) tenant_admin 在后台选择 tenant_user、输入金额、填写备注/原因
|
||||
2) 创建 `topup` 订单(或 topup 记录)
|
||||
3) 写入 ledger:`credit_topup`
|
||||
4) 增加 tenant_user.balance
|
||||
5) 返回充值结果与可用余额
|
||||
### 9.2 (已移除)租户为用户充值
|
||||
本项目不支持“租户管理员为用户充值”。余额为 users 全局余额,用户可在已加入租户内共享消费。
|
||||
|
||||
### 9.3 用户购买内容(余额支付)
|
||||
1) buyer 选择 tenant 下某 content
|
||||
@@ -259,7 +253,7 @@
|
||||
1) tenant_admin 选中订单,校验可退款(状态/风控/时间窗)
|
||||
2) 创建退款记录(可选),订单状态→refunding
|
||||
3) 写入 ledger:`credit_refund`(金额=退款金额)
|
||||
4) 增加 tenant_user.balance(可用余额)
|
||||
4) 增加用户全局余额(可用余额)
|
||||
5) 订单状态→refunded,记录 refunded_at 与操作者
|
||||
6) 收回/标记权益(若需要)
|
||||
|
||||
@@ -370,7 +364,7 @@
|
||||
### 13.7 balance_ledgers(强烈建议新增)
|
||||
- `id`, `tenant_id`, `user_id`(或 `tenant_user_id`)
|
||||
- `direction`(credit/debit)
|
||||
- `type`(credit_topup/debit_purchase/credit_refund/...)
|
||||
- `type`(debit_purchase/credit_refund/...)
|
||||
- `amount`(正数)
|
||||
- `balance_before`, `balance_after`(可选但强审计)
|
||||
- `biz_ref_type`, `biz_ref_id`(唯一约束,幂等)
|
||||
@@ -385,8 +379,6 @@
|
||||
## 14. API 草案(只描述意图,不锁死路径)
|
||||
|
||||
### 14.1 租户侧(Tenant Admin)
|
||||
- 充值:
|
||||
- `POST /tenants/:tenant_id/users/:user_id/topup`(amount, note, idempotency_key)
|
||||
- 订单查询:
|
||||
- `GET /tenants/:tenant_id/orders`(分页+筛选)
|
||||
- `GET /tenants/:tenant_id/orders/:id`
|
||||
|
||||
Reference in New Issue
Block a user