优化履约匹配:指定匹配(91中文名→sku映射)最高优先 + 映射键归一化

- 91 商品编码全部为中文名(幸运币90个等),运营按中文名→affiliate_dash sku 配置显式映射
- resolveFulfillmentRoute 新增 preferredExecutorKey:映射命中强制优先(规则之前),停用/不可用回退原逻辑
- matchAffiliateDashSku 归一化:NFKC 全角→半角、去空白、小写,先精确再遍历
- preferredMatchEnabled 配置(默认 true,可一键回退,不耽误现有 cloud/feifei 生产)
- 测试 +9(221 全绿);行为验证:映射命中/全角/空格命中,未映射回退
This commit is contained in:
yml2213
2026-08-05 16:44:37 +08:00
parent 5f5506bb19
commit 769d41655a
9 changed files with 249 additions and 3 deletions
@@ -612,3 +612,79 @@ order_site 处理要求:
- 91 卡券(91kaquan/kuaishou)真实 productNo 是否带 `----店铺ID` 后缀(决定 P2 是否为实际故障)。
- 33 个 affiliate_dash 商品 displayName 与 91 商品名的重合度(决定 P4 兜底收益)。
---
## 22. 履约匹配优化实施(v2.7 · 已完成)
**背景确认**:91 商品编码全部为**中文名**(如「幸运币90个」「星际漫游服装礼包」),无独立编码体系;运营按「中文名 → affiliate_dash sku」配置显式映射表(33 条,见 §22.3)。
### 22.1 匹配策略(两级)
1. **指定匹配(显式映射)最高优先**skuMapping 命中(91 中文名 → affiliate_dash sku)即**强制走 affiliate_dash**,不受 cloudtentacles / feifei 名字匹配抢占、不受全局优先级影响。受通道 `enabled` 约束:affiliate_dash 停用或商品不可用时回退原逻辑(规则 → 全局优先级)。
2. **默认匹配(名字匹配)**:无指定匹配时,三平台按商品名匹配,按可配置优先级选择(`defaultExecutorPriority`,现状 cloud → feifei → affiliate_dash,管理后台可改顺序)。
### 22.2 改动清单
| 文件 | 改动 |
| --- | --- |
| `routing-config-service.ts` | `resolveFulfillmentRoute` 新增 `preferredExecutorKey` 参数:指定匹配在**规则匹配之前**优先尝试,命中即选;停用/不可用回退 |
| `product-resolution-service.ts` | 91 分支:映射命中且 `preferredMatchEnabled!==false` 时传 `preferredExecutorKey=AFFILIATE_DASH``matchAffiliateDashSku` 归一化匹配(NFKC 全角→半角、去空白、小写),先原样精确再归一化遍历 |
| 配置层 | `preferredMatchEnabled` 字段(默认 true):types/runtime-config.ts、defaults.ts、source-config-service.ts、config.ts merge 全链 |
| 测试 | routing-config-service.test.ts +4preferred 优先/停用回退/不可用回退/无 preferred 走优先级);product-resolution-service.test.ts 新建 +5(精确/全角/空格/大小写/未命中) |
**安全性**:「不耽误生产」保证——现有 cloud/feifei 商品未配置映射表(或映射表为空),`preferredExecutorKey` 为空走原逻辑,行为零变化;映射表只影响显式配置的 91 商品,且可通过 `preferredMatchEnabled=false` 一键回退。
### 22.3 91 中文名 → affiliate_dash sku 映射表(可直接导入配置)
```json
{
"套装-Alan Walker": "suit_alan_walker",
"套装-暗影哥特": "suit_shadow_gothic",
"黑色高级特训官上衣": "top_black_elite_trainer",
"M416-仓鼠灰灰": "m416_hamster_gray",
"萌熊伴侣背包": "bag_cute_bear",
"套装-双彩绵绵": "suit_dual_fluffy",
"套装-糯粉咩咩": "suit_pink_sheep",
"套装-恋恋初桃": "suit_first_peach",
"套装-浪漫天命": "suit_romantic_destiny",
"西部牛仔大礼包": "pack_western_cowboy",
"烟雾弹-糯粉咩咩": "smoke_pink_sheep",
"破片手榴弹-糯粉咩咩": "frag_pink_sheep",
"套装-仓鼠灰灰": "suit_hamster_gray",
"套装-萌熊伴侣": "suit_cute_bear",
"糯粉咩咩背包": "bag_pink_sheep",
"糯粉咩咩头盔": "helmet_pink_sheep",
"仓鼠灰灰背包": "bag_hamster_gray",
"仓鼠灰灰头盔": "helmet_hamster_gray",
"套装-西部谜踪": "suit_western_mystery",
"国宝胖达头盔": "helmet_panda_treasure",
"套装-胖达圆圆": "suit_panda_round",
"套装-胖达团团": "suit_panda_tuan",
"熔岩游骑兵礼包": "pack_lava_ranger",
"套装-狂沙舞者": "suit_sand_dancer",
"星际漫游服装礼包": "pack_star_roam_outfit",
"星际漫游枪械礼包": "pack_star_roam_weapon",
"套装-绵云熊熊": "suit_cloud_bear",
"荣耀勋章2个": "honor_medal_x2",
"荣耀勋章30个": "honor_medal_x30",
"荣耀勋章90个": "honor_medal_x90",
"幸运币2个": "lucky_coin_x2",
"幸运币30个": "lucky_coin_x30",
"幸运币90个": "lucky_coin_x90"
}
```
### 22.4 行为验证
用上述映射表模拟 91 商品名解析,全部符合预期:
| 输入 | executor | sku |
| --- | --- | --- |
| 幸运币90个 | affiliate_dash | lucky_coin_x90 |
| 星际漫游服装礼包 | affiliate_dash | pack_star_roam_outfit |
| 幸运币90个(全角) | affiliate_dash | lucky_coin_x90 |
| 幸运币 90 个(带空格) | affiliate_dash | lucky_coin_x90 |
| 神秘新商品(未映射) | (无)回退 | — |
**验证**typecheck 通过;后端全量 221 测试通过(新增 9 个)。