- 生产数据操作(未改源代码):11 条光板/不打印链接 family_id 置空(族 1/2/63/135/148), 名下 3 商品脱族,族 148 主链接 964→965、族 135 主链接置空 - 容器内直调已部署 FamilyRecomputeService 重算 5 族:全库矩阵不再含「不打印」, 族 148 = 烫画×单面印花×不包邮(min 19),public 端口验证通过 - 回滚存档:deploy/backups/20260903-noprint-removal/(全库 dump + 受影响行 CSV + RESTORE.md) - 文档:product-center/structs 记录数据约定与回流风险(organize/autoGroup/人工改标签会回挂散链接); AGENTS.md 沉淀 占位借词表值/物化JSON需显式重算/数据修复三件套 三条经验
61 lines
4.4 KiB
Markdown
61 lines
4.4 KiB
Markdown
# No-Print Links Removal Fix Implementation Plan(纯数据修复,不改源代码)
|
||
|
||
> **For agentic workers:** REQUIRED SUB-SKILL: Use executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||
|
||
**Goal:** 「不打印/光板」链接移出商品族,SKU 矩阵不再出现「不打印」工艺(含其「单面印花」占位组合);BRTF004(族 148)恢复烫画×单面印花矩阵。**用户明确:本修复不修改源代码,纯数据操作。**
|
||
|
||
**Background / Root cause(2026-09-03 诊断):**
|
||
|
||
1. 「不打印×单面印花」来自 `family-recompute.service.ts` 的结构化占位规则(不打印链接无印花数量标签 → 占位单面印花)。占位逻辑在代码里,**但不需要改代码**:把不打印链接移出族后,占位分支对无成员的族不再生效,矩阵自然无该组合。
|
||
2. 族 148 烫画消失根因:**陈旧物化矩阵**。族 148 两成员(964 光板不打印、965 烫画单面)均在族内、未下架、标签齐全;矩阵物化于 09-02 16:00(旧容器时期),09-03 02:05 新镜像部署后无任何事件触发重算。用**当前已部署的正确代码**重算即恢复烫画。
|
||
3. 全库审计(141 个有活跃烫画成员的族):除族 148 外全部健康(crafts 含烫画、printCounts 为单面或单面+双面)。无 craft=不打印 覆盖价,无 autoManaged=false 冻结族,无未归族烫画链接。
|
||
|
||
**最终数据修复面:**
|
||
|
||
| 族 | 移出的不打印成员链接 | 主链接修正 | 名下商品脱族 |
|
||
| --- | --- | --- | --- |
|
||
| 1 (DG001) | 166, 731, 859, 961 | 无需(primary=163 不变) | good 361 |
|
||
| 2 (DG004) | 171, 749, 763, 852 | 无需(primary=167 不变) | — |
|
||
| 63 (METP001) | 759 | 无需(primary=339 不变) | — |
|
||
| 135 (PLJM030) | 760 | primary→NULL(移除后无剩余成员,族变空矩阵,公列表自然消失) | good 554 |
|
||
| 148 (BRTF004) | 964 | primary→965(烫画链接承接) | good 359(good 360 承接公开代表行) |
|
||
|
||
**回流风险(不改代码的代价,需文档化 + 运行纪律):**
|
||
- `organize` / `POST /product-families/autoGroup`:会把 family_id=null 的链接按分类重新归族 → **不打印链接会回流**。运行前须先排查,或将来补代码守卫。
|
||
- 人工编辑链接标签(`origin-goods.service.ts:184`)会触发 `attachToMatchingFamily` 把散链接挂回匹配族。
|
||
- 同步钩子无回流风险(`sync.service.ts:690` 只对 familyId 非空的链接重算)。
|
||
|
||
---
|
||
|
||
### Task 1: 备份(用户要求的风险回滚存档)
|
||
|
||
- [ ] `deploy/backups/20260903-noprint-removal/`:`pg_dump -Fc` 全库 + 受影响行 CSV(origin_goods 11 行改前 family_id、goods 3 行、product_families 5 行含 price_matrix 全量)+ `RESTORE.md` 逐表恢复命令;`pg_restore --list` 验证备份完整
|
||
|
||
### Task 2: 数据修复(单事务)
|
||
|
||
- [ ] `UPDATE origin_goods SET family_id=NULL` 11 条链接
|
||
- [ ] `UPDATE goods SET family_id=NULL`(origin_good_id ∈ 859/760/964 且 family_id 非空)
|
||
- [ ] 族 148 `primary_origin_good_id=965`;族 135 `primary_origin_good_id=NULL`
|
||
- [ ] 提交前逐条核对影响行数 = 预期(11 / 3 / 1 / 1)
|
||
|
||
### Task 3: 容器内直调重算(用已部署代码,不重建镜像)
|
||
|
||
- [ ] `docker exec deploy-v2-api-1 node -e` 实例化 `FamilyRecomputeService(new PrismaClient())`,对族 1/2/63/135/148 依次 `recomputeFamily`
|
||
|
||
### Task 4: 验证
|
||
|
||
- [ ] SQL 终检:全库无 price_matrix 含「不打印」;族 148 矩阵 crafts=['烫画']、printCounts=['单面印花']、minPrice=烫画链接价(19)
|
||
- [ ] `GET /public/goods?keyword=BRTF004`:一条代表行(good 360),价格 19
|
||
- [ ] `GET /public/goods/148`:family 块 crafts 含烫画、printCounts=['单面印花']、无不打印
|
||
- [ ] `GET /public/goods?keyword=PLJM030`:无结果(仅光板的族已隐去)
|
||
|
||
### Task 5: 文档与沉淀
|
||
|
||
- [ ] `docs/references/product-center.md`:不打印链接不参与族矩阵的数据约定 + 回流风险
|
||
- [ ] `docs/references/structs.md` 同步
|
||
- [ ] AGENTS.md 沉淀:①矩阵维度占位借用词表既有值导致语义硬伤(本次以数据收口:不打印链接不入族)②代码修复/重部署后物化 JSON 不会自愈——须显式触发全量重算(族 148 教训)③批量数据修复前 pg_dump+受影响行导出+RESTORE.md 三件套
|
||
|
||
### Task 6: 提交合并
|
||
|
||
- [ ] 本文档 + 文档更新提交 `bugfix/no-print-links-removal-yeuimu`,合并回 develop
|