Files
X-Financial/document/development/2026-07-16/feature/commercial-metering-and-roi/CONCEPT.md
caoxiaozhu 787bc3a481 feat(platform): close AI expense value loop
Add tenant-safe value, telemetry, connector, commercial, and production-readiness foundations.
2026-07-17 14:14:08 +08:00

238 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 商业计量、客户 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 行。