# 商业计量、客户 ROI 与可持续定价 概念文档

更新时间：2026-07-17

## 功能一句话

把套餐、订阅、权益、真实用量、内部成本、客户确认价值和平台毛利拆成可审计事实，并只在成本与价值证据同时成立时给出可持续定价走廊。

## 背景与问题

- 平台要成为可长期经营的产品，既要证明客户省了钱，也要知道每个租户消耗了多少 OCR、AI、存储、连接器和支持成本。
- “风险金额”“预计节省”“流程耗时”不能直接作为客户 ROI；平台收入、平台内部成本和客户价值也不能混在一个指标里。
- 只有套餐创建而没有暂停、取消、历史查询和配额硬门禁，商业后台无法真正运营。
- 仅在执行前读取 `SUM(usage)` 再放行无法抵抗并发；两个工具可同时看到剩余额度并一起执行，事后计量再准确也已形成不可逆超卖。
- 固定拍一个价格无法适配客户规模、真实成本和价值覆盖。需要先计算平台可持续下限，再计算客户价值可接受上限；没有交集时不能强行报价。
- 试点期通常缺少 30/90 天真实成本和财务确认收益，因此系统必须显示“采集中”，而不是用 mock 或估计值伪造单位经济性。

本能力是 `2026-07-13/feature/ai-expense-closed-loop-and-value-proof` 中商业模式与价值证明部分的实施拆分。

## 目标与非目标

### 目标

- [G1] 建立租户隔离、版本化的套餐、订阅和权益配置。
- [G2] 建立追加式用量与内部成本事实，支持幂等、冲回、配额和并发门禁。
- [G3] 把商业权益门禁与安全门禁做收紧式合并，付费不能绕过高风险人工审核。
- [G4] 严格分开客户收费、内部成本、平台贡献毛利、财务确认现金节省、客户 ROI 和工时价值。
- [G5] 支持套餐/订阅/权益生命周期、历史查询、用量成本查询和数据质量状态。
- [G6] 根据真实成本和财务确认节省给出基础费下限、价值上限和可封顶成功费，不自动改合同。
- [G7] 形成“试点采集 → 基础订阅 → 基础费 + 封顶成功费”的可验证商业演进路径。
- [G8] 用不可变账期承载收费、用量、成本与配额历史，并对商业配置和自动续期保留脱敏追加式审计。

### 非目标

- [NG1] 不在代码中硬编码某个客户的最终价格、税率、折扣或合同条款。
- [NG2] 不把风险暴露、预计机会、未确认结果、未锁定汇率或未经客户认可的工时估值计入价值定价。
- [NG3] 不让套餐或配额放宽审批、风险、租户和人工确认门禁。
- [NG4] 不自建开票、税务、收款或第三方订阅扣费网络；只保存受控外部订阅引用。
- [NG5] 不跨币种直接求和，也不在缺少同币种成本/价值时生成综合 ROI。
- [NG6] 不把定价场景结果自动写成生效套餐，最终合同仍需平台商业负责人审批。

## 用户与场景

### 用户

1. 平台商业管理员：维护套餐版本、订阅、权益、状态和定价场景。
2. 平台运营/财务：查看用量、成本、毛利和异常数据质量。
3. 客户 CFO/财务负责人：查看自己租户的当前套餐、用量、配额和客户价值口径。
4. 产品运行时：在执行 OCR、AI 或连接器能力前检查配额，并写入真实用量。

### 核心场景

1. 试点客户先配置 `pilot` 套餐和明确的合同周期，开始采集真实用量、成本与已确认价值。
2. 运行时检查某项权益；只有商业配额允许且安全决策为 allow 时才最终允许。
3. 同一用量事件重试返回首次结果；不同内容复用幂等键返回冲突。
4. 客户暂停、逾期、取消或过期时，商业权益即时失败关闭，历史用量和成本不被删除。
5. 商业负责人选择 90 天窗口，输入目标贡献毛利率和客户最大价值分享比例，系统按币种输出定价走廊。
6. 成本下限高于价值上限时，系统建议先优化单位经济性或扩大可信价值，不生成强行报价。

## 功能能力

- [C1] 套餐版本：subscription、usage、hybrid、pilot、custom，支持生效区间和旧版本退役。
- [C2] 订阅快照：合同周期、计费周期、席位、基础费、外部订阅引用和状态历史。
- [C3] 权益与配额：feature、metered、unlimited，包含量、硬上限、重置周期和超额策略。
- [C4] 用量事实：usage、credit、adjustment、reversal，保存主体、来源、correlation 和首次请求指纹。
- [C5] 成本事实：AI、OCR、存储、连接器、支持、实施、基础设施、支付等分类及汇率快照。
- [C6] 商业分析：收费、成本、贡献毛利、确认节省、客户 ROI 和工时价值分账展示。
- [C7] 定价走廊：最低可持续收费、最高价值对齐收费、最大成功费和证据状态。
- [C8] 生命周期与查询：暂停、恢复、逾期、取消、过期，以及套餐/订阅/权益/用量/成本历史。
- [C9] 账期与审计：月/季/年自动续期、合同边界失败关闭、账期历史和商业管理追加审计。

## 方案设计

### 前端

- 商业工作台分为“当前账户”“套餐与订阅”“权益与配额”“用量与成本”“价值与定价”五块。
- 客户 ROI 与平台贡献毛利必须使用不同卡片、不同说明，不允许用一个“综合收益”混合展示。
- 多币种按币种分行；缺成本、缺确认价值、仅有试点数据和证据冲突使用不同状态。
- 暂停、取消和定价场景均需要确认；终态操作明确提示不能原地恢复。
- 普通客户财务只能查看本租户账户；平台级配置、成本、毛利和定价仅平台管理员可见。

### 后端

- `CommercialAdminService` 管理套餐、订阅、权益和状态转换。
- `CommercialBillingPeriodService` 签发和定位不可变账期；用量、成本和运行时预占必须绑定真实账期编号。
- `CommercialSubscriptionRolloverService` 在订阅行锁内按月/季/年边界幂等续期；合同制或跨越 `ends_at` 时失败关闭。
- `CommercialRolloverScheduler` 以 PostgreSQL advisory lock 选举单一执行者，再按订阅行锁串行签发到期账期。
- `CommercialAdminAuditService` 只记录字段白名单快照，排除合同正文、配置、外部订阅编号、元数据和凭证类字段。
- `CommercialQueryService` 负责租户范围内历史与追加事实查询。
- `CommercialEntitlementService` 计算配额和商业/安全合并门禁。
- `CommercialMeteringService` 写追加式用量和成本、执行幂等与冲回。
- `CommercialRuntimeReservationService` 在订阅/权益锁内完成执行前额度预占，管理 reserved、committed、released、expired、reconciliation_required 和 committed_reconciliation_required 状态。
- `CommercialRuntimeBridge` 把可信 AgentRun、中央工具执行、真实 AgentToolCall 和商业事实接成预占—执行—结算链；未配置商业计量时保持兼容。
- `CommercialRuntimeReconciler` 只根据可验证的工具/运行终态补偿过期预占，不按超时猜测业务是否发生。
- `CommercialAnalyticsService` 按窗口和币种分账聚合，不伪造缺失数据。
- `CommercialPricingService` 只读分析真实成本和确认节省，输出价格区间，不写套餐。
- HTTP 管理入口仅平台管理员可用；租户账户读取仅 finance、executive 或平台管理员可用。

### 算法/规则

- 用量硬配额在数据库锁内计算，最终用量超过限制时整个写入失败。
- 真实工具执行前按 `已用量 + 有效预占 + 本次预占 <= 硬上限` 原子判断；成功时真实量不得超过预占，失败/阻断只释放预占，不写用量或成本。
- call 基准可直接预占一次；token、duration 等变量基准必须由执行器声明并强制最大量。缺少可信 hard max 时拒绝执行，不用正文长度或估算值代替。
- 已有相同 tool call 的预占请求按指纹稳定重放；真实 AgentToolCall 的用量/成本继续使用追加式幂等键。用量已写入但成本失败时进入 `committed_reconciliation_required`，重试只补缺失成本，不重复占用额度或追加用量。
- 权益已有用量后，配额、定价和有效期不可回改，只允许暂停/恢复；结构变化必须新建订阅版本。
- 客户 ROI 只使用财务确认 canonical 现金节省与客户收费。
- 贡献毛利只使用平台收费与内部成本，不混入客户节省。
- 定价只在相同币种内计算，并保留成本/价值证据状态。

### 数据

- `tenant_commercial_plans`：租户、套餐编码、版本、价格模型、基础费、币种、生效期和合同条款摘要。
- `tenant_subscriptions`：租户、套餐、周期、基础费快照、状态、席位、外部引用和版本。
- `commercial_entitlements`：租户、订阅、权益键、计量键、配额、状态和有效期。
- `usage_meter_events`：追加式用量、冲回引用、幂等键、请求指纹和关联链。
- `commercial_cost_events`：追加式内部成本、原币/报告币、汇率、分摊键和冲回引用。
- `commercial_runtime_reservations`：工具执行前的可变运营占位，保存 tenant/subscription/entitlement/run/tool call、基准、预占量、真实量、周期、配置快照、状态和补偿原因；它参与配额但不是客户用量事实。
- `commercial_billing_periods`：不可变账期签发事实，保存订阅/套餐引用、窗口、顺序、币种、基础费、席位、计价模式和来源快照；PostgreSQL 禁止更新和删除。
- `commercial_admin_events`：套餐、订阅、权益、账期和续期动作的脱敏追加审计，保存 tenant、actor、`X-Request-Id`、原因、动作、资源版本和白名单 before/after。
- `usage_meter_events.period_key` 表示真实账期键，`quota_period_key` 独立表示权益重置周期；成本与运行时预占同样通过 `billing_period_id` 绑定账期，避免订阅当前周期滚动后污染历史。
- 事实表在 PostgreSQL 使用触发器禁止 UPDATE/DELETE，租户复合外键防止跨租户引用。

运行时占位状态如下：

```text
reserved -> committed                 # 成功且 actual <= reserved
reserved -> released                  # 工具失败或执行前阻断
reserved -> expired                   # 运行已终止且没有真实工具调用
reserved -> reconciliation_required   # 已发生调用但缺少执行前预占等人工补偿场景
committed -> committed_reconciliation_required -> committed
                                      # 用量已提交、成本等后续事实失败，幂等补齐后恢复
```

过期但运行仍在进行、运行记录缺失或工具终态不确定时继续保留额度，不允许补偿器仅因 TTL 到期释放后造成超卖。
`committed_reconciliation_required` 已有真实用量事实，因此不再计入有效预占；配额只消费一次，同时保留明确的待补偿队列。

### 权限

- 平台管理员可配置所有租户商业账户，但商业配置不能授予财务确认或风险审批能力。
- finance/executive 只读本租户当前账户，不读取平台内部成本或其他租户数据。
- manager、employee 默认无商业账户与商业分析权限。
- 所有管理接口从认证上下文判断平台管理员，目标租户来自受控路径参数。

### 降级策略

- 无订阅：返回 unavailable 和明确说明，不自动赠送无限权益。
- 订阅非 active/trialing：配额保留展示但最终消费失败关闭。
- 缺成本：贡献毛利和可持续价格下限不可用。
- 缺财务确认价值：客户 ROI、价值上限和成功费不可用，建议继续试点采集。
- 多币种缺少共同币种：分别展示，禁止跨币种净额。
- 并发或幂等冲突：返回 409，不覆盖首次事实。
- 生产中央工具路径未配置 runtime meter：兼容执行且不生成商业事实；配置只在当前订阅周期和权益有效期内参与门禁，历史过期配置不会误触发 enforcement。
- 已发生的旧直接工具路径缺少执行前预占：不补写为正常用量，持久化 `reconciliation_required` 并冻结对应容量，等待受控补偿；即使当前合同已暂停，也保留其唯一可验证的租户、订阅和权益归属。
- 用量已追加但内部成本写入失败：持久化 `committed_reconciliation_required`，配额以真实用量为准且预占归零；按相同 tool call 重试只补成本，完成后回到 committed。
- 自动续期只处理 `trialing/active + auto_renew`；月、季、年按自然月边界滚动。合同制、缺少可推导边界或下一完整账期越过 `ends_at` 时失败关闭，不创建部分账期或猜测续约。
- 调度器即使发生重复扫描或多进程竞争，也先获取 leader lease，再锁定订阅；账期窗口和幂等键的唯一约束保证同一周期最多签发一次。数据库触发器还会按租户与订阅获取事务级 advisory lock，并拒绝任何半开区间重叠账期，防止绕过服务层直接写入破坏时间线。

## 算法与公式

### 客户 ROI

```text
customer_roi = (verified_cash_savings - customer_charges) / customer_charges
```

- `verified_cash_savings` 只包含独立财务确认、canonical、已计冲回的现金节省。
- `customer_charges` 来自订阅基础费快照和有可信同币种单价的用量计费。
- 分母必须大于 0；否则状态为 unavailable。

### 平台贡献毛利

```text
contribution_margin = customer_charges - internal_costs
contribution_margin_rate = contribution_margin / customer_charges
```

- 内部成本来自追加式成本账本，不使用估算页面数字。

### 可持续定价走廊

```text
minimum_sustainable_charge = internal_costs / (1 - target_margin_rate)
maximum_value_aligned_charge = verified_cash_savings * max_value_share
maximum_success_fee = max(0, maximum_value_aligned_charge - minimum_sustainable_charge)
```

- 当 `minimum_sustainable_charge <= maximum_value_aligned_charge` 时，建议 hybrid：基础费不低于成本下限，成功费封顶为剩余价值空间。
- 只有成本证据时建议 subscription；成本与价值都不足时建议 pilot_collecting。
- 成本下限高于价值上限时建议 optimize_unit_economics，不自动提高客户报价。

## 测试方案

- 模型/迁移：租户复合外键、状态检查、金额符号、冲回引用和 append-only。
- 服务：套餐版本、订阅终态、权益不可回改、配额硬门禁、幂等、冲回和多币种。
- 权限：平台管理员、租户财务、manager、employee 与跨租户访问。
- 分析：收费/成本/节省/毛利/ROI 分账，缺证据状态和 `as_of` 回放。
- 定价：可行区间、成本高于价值、仅成本、完全无证据和多币种。
- 前端：状态、权限、操作确认、空态、错误态、币种分组与生产构建。
- PostgreSQL：并发配额、同幂等键、成本冲回单赢家和迁移完整性。
- PostgreSQL 账期：0020→0021→0020 升降级、账期/审计 UPDATE/DELETE 拒绝、重叠账期 INSERT 拒绝、历史事实账期绑定和双线程续期单赢家。
- 运行时预占：无配置兼容、成功结算、失败释放、变量 hard max、真实量超预占、幂等重放、历史配置隔离、直接路径补偿和过期补偿。
- 所有命令在 `local-x-financial-linux` 容器内执行，单次最长 60 秒。

## 指标与验收

- [A1] 每个商业消费可追溯到租户、订阅、权益、用量事件、来源和 correlation。
- [A2] 并发不能突破硬配额；重复事件稳定重放，冲突内容被拒绝。
- [A3] 付费状态不能绕过安全或人工审核门禁。
- [A4] 客户 ROI、平台毛利、客户节省和工时价值在 API/UI 中不混算。
- [A5] 暂停、恢复、取消、过期和历史查询可操作，终态不可原地复活。
- [A6] 定价场景只使用真实同币种成本与确认节省；证据不足时不输出虚假价格。
- [A7] 相关后端、PostgreSQL、前端、构建、Ruff 与迁移验证在容器内通过。

## 风险与开放问题

- 真实计费仍需把 OCR、LLM、存储、连接器和支持运行事件自动接入用量/成本账本；手工管理员写入只能用于校验，不是最终生产采集。
- 中央 Orchestrator 工具已经执行前预占；绕过中央执行器的其他生产入口仍须逐一迁移到 permit 契约，当前只会形成可见补偿积压，不会伪装成正常计量。
- 合同制自动续期仍不推断新合同窗口；管理员或外部订阅连接器必须先提供显式续约事实，再创建后继合同/订阅版本。
- 首个客户的实际套餐金额、席位、包含量、毛利目标、价值分享比例和折扣需要商业负责人确认。
- 发票、税率、回款、坏账、渠道分成与收入确认尚未接入，当前 `customer_charges` 是合同/用量计费基准，不等同已收现金。
- 价值分享合同必须定义基线、排除项、冲回、确认人、封顶和争议期。
- 工时价值默认不进入现金 ROI，只有客户确认活跃工时基线、角色成本和可释放比例后才单独披露。

## 本轮实现记录

- 2026-07-16：完成五张商业事实表与 0016 迁移、套餐/订阅/权益、用量/成本、配额门禁、幂等和冲回服务。
- 2026-07-16：完成客户收费、内部成本、贡献毛利、财务确认现金节省、客户 ROI 和工时价值分账分析；修正 ROI 为净收益口径并收紧角色、时区和权益历史不可变边界。
- 2026-07-16：补齐订阅暂停/逾期/取消/过期、恢复和套餐/订阅/权益/用量/成本历史查询。
- 2026-07-16：完成基于真实成本下限与确认价值上限的定价场景，禁止风险暴露、预计节省或跨币种混入报价。
- 2026-07-16：完成商业工作台五块能力、订阅生命周期确认、用量/成本与价值分账、按币种定价场景两步确认；全量前端 802 项、code-size 和生产构建通过。
- 2026-07-16：一次性 PostgreSQL 17 并发配额、幂等和成本冲回 3 项通过；真实开票、回款与客户合同参数继续保留为外部试点边界，不以 mock 标记完成。
- 2026-07-16：新增 `0019` 运行时预占迁移和中央 Agent 工具 permit；在订阅/权益锁内按已用量加有效预占原子控额，成功按真实 AgentToolCall 结算，失败/阻断释放，变量用量超过预占拒绝写入。
- 2026-07-16：新增持久补偿状态和过期补偿器；旧直接调用缺少预占时冻结容量并进入 reconciliation_required，运行终态不确定时不按 TTL 误释放；用量已提交但成本失败进入 committed_reconciliation_required，相同预占与用量/成本均可幂等重试。
- 2026-07-16：新增 `0021` 不可变账期和商业管理审计；订阅创建即签发首期，月/季/年到期由 leader 调度器和订阅行锁幂等滚动，合同制与越界周期失败关闭。
- 2026-07-16：用量、成本、运行时预占和配额查询改为绑定 `billing_period_id`，并以独立 `quota_period_key` 保留权益重置语义；客户收费基础费改从账期快照聚合，不再读取可变订阅当前周期。
- 2026-07-16：容器内商业/迁移前置定向 131 项、前端商业 35 项和 Vite 构建通过；一次性 PostgreSQL 17 商业并发 5 项通过。0021 的升级、模型/约束/触发器（含账期重叠阻断）/运行不变量及 0021→0020 降级通过；全链 44/45 唯一失败来自后继 0023 尚未接管的盲审临时表，不属于 0021。
- 2026-07-16：容器内商业/Agent/迁移组合 183 项通过、1 项因未显式配置外部迁移库跳过；运行时定向 27 项、PostgreSQL 商业并发 4 项和 0019→0020 完整迁移循环通过；全局 code-size 仅剩共享 `RiskRuleGenerationService` 817 行既有门禁失败，本轮所有相关核心类低于 800 行。
