Files
inkreach-official-website/plans/fix/no-print-links-removal-fix.md
T
yeuimu dd6a540bf3 fix(product-families): 不打印链接移出族(纯数据修复)——矩阵不再计算不打印工艺,BRTF004 恢复烫画×单面
- 生产数据操作(未改源代码):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需显式重算/数据修复三件套 三条经验
2026-09-03 02:53:10 +08:00

61 lines
4.4 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.
# 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 cause2026-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` 全库 + 受影响行 CSVorigin_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