重构:硬切履约路由唯一真源

This commit is contained in:
yml2213
2026-11-08 19:44:27 +08:00
parent f6e193e7f6
commit 6bff1971dd
31 changed files with 1029 additions and 1022 deletions
@@ -12,7 +12,7 @@ updated_at: 2026-11-08
> 状态:**唯一权威文档**。
> 最后校准:2026-11-08。
> 生产基线:迁移 `146`。
> 开发基线:迁移 `159`(仅本地,尚未部署生产)。
> 开发基线:迁移 `162`(仅本地,尚未部署生产)。
>
> 从本文件生效起,订单、内部 SKU、履约渠道、履约载体、标准商品、成本和财务相关实现,
> 只能以本文件为业务口径。其他旧分析只作为历史资料,不再具备设计或验收效力。
@@ -311,7 +311,7 @@ finance_journal_* -- 总账凭证,可重建
2026-11-08 生产只读核对结果:
- 生产迁移 `146`,本地开发基线迁移 `159`。
- 生产迁移 `146`,本地开发基线迁移 `162`。
- 启用标准商品 `1127`:`aff:` 30、`tpl:` 903、`tpv:` 46、`man:` 148。
- `man:` 商品中只有 105 个当前主渠道为人工;41 个已走其他主渠道,2 个无主渠道。
- 人工页头部显示 `107`,商品列表显示 `148`,相差的 41 个就是跨渠道旧商品。
@@ -357,7 +357,7 @@ A 级数据只能追加新事件或做字段兼容迁移,不能为了“模型
### B 级:业务输入,必须迁移而不是重建
- `internal_sku_mappings`
- `internal_sku_channels` 中仍有效的路由意图
- `sku_channel_routes` 中的有效主渠道与显式兜底
- `work_product_rules` 及模板匹配配置
- `manual_fulfillment_configs`
- `product_catalog` 中仍有效的标准商品
@@ -383,6 +383,8 @@ A 级数据只能追加新事件或做字段兼容迁移,不能为了“模型
### D 级:兼容期结束后删除
- `product_channel_capabilities`
- 已冻结的 `internal_sku_channels`
- `sku_channel_rules` 中由 `internal_sku_mappings` 和 `sku_channel_routes` 取代的规则
- `manual_sku_registry` 中可由配置重建的登记行
- 订单项上的重复履约结果字段,在正式模型切换后删除
- 商品表中的历史来源前缀判断代码
@@ -504,9 +506,9 @@ has_active_cost
| --- | --- | --- |
| 0 口径冻结与文档收口 | 已完成 | 否 |
| 1 只读审计与领域约束 | 本地进行中 | 否 |
| 2 建立目标身份与投影 | 本地完成 | 只新增兼容结构 |
| 3 迁移路由与商品配置 | 本地进行中 | 是,需备份 |
| 4 重建履约模型 | 未开始 | 是,需断代 |
| 2 建立目标身份与投影 | 商品侧本地完成 | 只新增兼容结构 |
| 3 迁移路由与商品配置 | 本地完成,生产未执行 | 是,需备份 |
| 4 重建履约模型 | 本地准备中 | 是,需断代 |
| 5 重建财务派生数据 | 未开始 | 是,需备份与对账 |
| 6 停止旧写路径并删除兼容层 | 未开始 | 是,需观察期结束 |
@@ -575,17 +577,25 @@ assigned 且 carrier_status=missing 必须进入异常队列
- 迁移 `157`:保证只有兜底配置的 SKU 不会被误升级成主渠道。
- 迁移 `158`:禁止 `man:` 来源直接冒充人工主渠道;没有 primary route 时显示“未路由”。
- 迁移 `159`:只归档无主路由、无人工配置、无启用映射的孤儿 `man:` 商品。
- 迁移 `160`:商品身份全部补齐,运行硬切到 `sku_channel_routes`,删除旧同步触发器;
`v_product_current` 不再回退 `source_kind`,`v_fulfillment_item_state` 不再读取旧表。
- 迁移 `161`:履约影子同步触发器从旧表迁移到 `sku_channel_routes`。
- 迁移 `162`:删除旧履约只读视图和旧表最后一个触发器。
- 商品列表、总览、渠道映射和商品下拉统一读取商品当前渠道。
- 运行期代码停止写入 `product_channel_capabilities`,该表仅保留到兼容期结束。
- 只读审计:`npm run audit:product-routing -- --strict`。
- 本地严格审计关键异常归零:孤儿人工商品、多主路由、`man/tpv` 缺内部 SKU、非法来源。
- 15 个自动/卡券/接单主渠道商品的人工配置均保留为显式 `fallback`,没有被误升为人工主渠道。
- 自动/卡券/接单主渠道商品的人工配置均保留为显式 `fallback`,没有被误升为人工主渠道。
- 1 个无主路由、无人工配置、无启用映射的 `man:` 商品已归档,未删除历史引用。
- 旧 `internal_sku_channels` 已冻结:运行时不再读、不再写,也不再有视图或触发器依赖。
- 空库从迁移 `001` 顺序执行到 `162` 已通过;新库只保留
`sku_channel_routes` 影子同步触发器,旧表同步触发器不存在。
- 无主路由的活动商品会进入“未路由”,不自动猜测渠道。
当前本地仍需业务处理的数据:
- 1 个待分类订单项尚未命中内部 SKU 映射;
- 1 个已分配人工订单项没有启用的人工履约配置。
- 待分类订单项尚未命中内部 SKU 映射的,进入 `missing_channel`;
- 已分配人工订单项缺少启用人工配置的,进入 `manual_config_missing`。
验收:
@@ -595,6 +605,8 @@ assigned 且 carrier_status=missing 必须进入异常队列
### 阶段 3:迁移路由与商品配置
状态:本地完成,生产未执行。按确认后的硬切换方案,不保留双读、双写和旧表运行期兼容。
目标:
- 将 `internal_sku_channels` 迁移到 `sku_channel_routes`。
@@ -613,6 +625,8 @@ assigned 且 carrier_status=missing 必须进入异常队列
- 路由迁移前后主渠道结果一致。
- 人工页数量等于当前人工渠道商品数。
- 卡券和统一结算不再出现在人工页。
- 运行时 `internal_sku_channels` 读写点为 `0`。
- 旧路由表和影子同步触发器已停用,后续只通过 `sku_channel_routes` 修改路由。
### 阶段 4:重建履约模型