Files
inkreach-official-website/plans/fix/family-auto-merge-fix.md
T
yeuimu f1e81872e7 fix(product-family): auto-merge SKUs after manual tag edits; fix session cookie path
问题2(SKU 无法自动合并,GBIU017 案例)四处叠加根因修复:
- 人工标签旧词「热转印」被封闭词表静默踢出合并矩阵 → CRAFT_TAG_ALIASES
  别名归一为「烫画」(矩阵归因与 CUSTOM 标签同路径生效)
- updateTags 缺任一定价维度组即整链掉出矩阵且人工接管后永不恢复 →
  缺啥补啥(按链接名派生补齐,人工勾选值不动,响应带 filledDimensionTags)
- autoGroup 只建新族从不并入已有族(产生 USIU005-2 类碎片)→ 并入已有
  autoManaged 同款族优先,无匹配才新建;同款仅人工锁定族则跳过并报告
- 名称回退分组键含物流备注,包邮/不包邮永不同组 → 新增族语义键
  familyNameKey(国家+品名+SKU),api/admin 两侧同构,合并默认勾选随之修复

附加:
- updateTags 后未归族链接自动并入匹配族(attachToMatchingFamily,响应带
  attachedFamilyId)
- 整理新增碎片族合并 consolidateFragments:纯碎片族并入带商品族并删除
  (保公开 goodId=族ID 稳定),带商品/覆盖价/人工锁定进人工复审报告
- admin:保存标签提示补齐明细,整理完成消息含并入/碎片合并/待人工数

问题1(后台频繁 Unauthorized 掉线):
- refresh cookie path '/auth' 与代理前缀(/api、/v2-api)不匹配导致浏览器
  永远带不上 refresh cookie → 两 cookie path 统一为 '/'
- v2 构建基址带尾斜杠 + 手工拼接产生 /v2-api//auth/refresh 双斜杠 404 →
  request.ts 规范拼接

测试:api jest 187/187、admin vitest 22/22、双侧 tsc 0 错误;
public.service 夹具改为自包含(不依赖共享库既有数据)。
2026-09-02 18:39:35 +08:00

59 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.
# 修复:人工修改标签后 SKU 无法自动合并 + 后台频繁掉线
- 日期:2026-09-02
- 分支:`bugfix/family-auto-merge-auth-cookie-yeuimu`
- 状态:已完成(2026-09-02,全量测试 187+22 通过)
## 现象与根因(数据实证)
### 问题2:人工修改标签后 SKU 无法自动合并(GBIU017 案例)
排查(v2 库 + 部署镜像比对)确认四处叠加缺陷:
1. **旧词表「热转印」不在矩阵封闭词表**:16 条人工接管标签的链接(GBIU014/15/16、
USIU002/005/012、JPIU014/20/21、GBIU009 等)勾的工艺词是旧词「热转印」,而
`memberMatrixCombos` 只认 烫画/直喷/不打印 → 这些链接的 SKU 全部被静默踢出合并矩阵。
线上 v2 镜像被人直接把 热转印 塞进 `DIM_VALUES` 救急(**未提交**,镜像与仓库分叉)。
2. **人工标签缺维度无守护**`updateTags` 全量替换为人工勾选行,缺任一定价维度组
(印花数量/工艺/物流)时链接掉出矩阵,且 `tagsManual=true` 后整理永不补 → 死锁。
3. **自动建族只建不并**`autoGroup` 只扫 `familyId=null` 链接且直接新建族(撞款号加
-2/-3 后缀),从不并入已有族 → USIU005 分裂成 USIU005 / USIU005-2,整理无法修复。
4. **名称回退分组键含物流备注**`originGroupKey` 前 3 段精确比较,第 1 段括号内即
包邮/不包邮 → 无分类链接永不同组;admin `sameOriginGroup`(合并默认勾选)同语义。
GBIU017 本身(v2 库)两条链接已同族且矩阵正常(4 行),用户"后来看到"系 18:00 手动
挂族操作 + 页面缓存,非计算延迟。
### 问题1:后台频繁「Unauthorized, please login」
refresh cookie `path:'/auth'`auth.controller.ts)与浏览器实际请求路径
`/api/auth/*`dev/Vite、v1)或 `/v2-api/auth/*`(v2 nginx)永不匹配 → 浏览器带不上
refresh cookie → 30 分钟访问令牌一过期必掉线。v2 构建另有 `VITE_API_BASE=/v2-api/`
(尾斜杠)+ request.ts 手工拼接 → `/v2-api//auth/refresh` 双斜杠 404(已在生产包中实证)。
## 实施内容
| # | 内容 | 文件 |
| --- | --- | --- |
| A1 | updateTags 缺啥补啥:三个维度组按链接名派生补齐(人工值优先);响应返回补齐明细 | origin-goods.service.ts / organize.service.ts |
| A2 | 保存标签后自动归族:无族链接并入匹配已有族(同 SDS 分类优先→规范名称键;仅 autoManaged 族),响应附 attachedFamilyId | product-families.service.ts |
| A3 | autoGroup 并入已有族:分组后先匹配已有族(多候选取最老),无匹配才新建;attach 联动 goods.familyIdpreview 标注并入/新建 | product-families.service.ts |
| A4 | 名称键族语义化:api/admin 新增 familyNameKey(第 1 段剥物流备注、全半角归一、保 国家+品名+SKU、丢工艺/仓库段);autoGroup 回退键与 admin sameFamily 回退改用它 | origin-name.parser.ts / admin utils/origin-name.ts、family-match.ts |
| A5 | 整理碎片清理:同分类多族时,纯碎片族(无商品、无覆盖价、autoManaged)并入最老族并删除;其余写报告提示人工 | organize.service.ts |
| A6 | admin 提示:保存标签提示补齐明细;整理完成消息含碎片合并/待人工数 | GoodsEditDialog.vue / GoodsView.vue |
| 别名 | 热转印→烫画 归一(矩阵归因 + CUSTOM 标签 + admin 展示),写进仓库取代镜像热修 | auto-tag-rules.ts / family-recompute.service.ts / admin |
| B | 两 cookie path 改 '/'clearCookie 同步);request.ts refresh URL 规范拼接 | auth.controller.ts / admin api/request.ts |
### 存量数据修复(部署后)
1. 从仓库重建 v2 镜像(消除未提交热修分叉)。
2. 跑一次「整理」:无族链接自动并入;USIU005-2(若为纯碎片)自动合并;16 条 热转印
链接经别名归一后重算进矩阵(矩阵 craft 列统一为 烫画)。
3. 若有带商品/覆盖价的碎片族,按整理报告人工移动成员(编辑弹窗「加入族」已支持跨族移动)。
### 行为变更说明
- 人工接管语义从"全量替换"变为"人工修正 + 缺维自动补齐"(人工勾选值永不被动)。
- 名称回退分族:同 国家+品名+SKU 的 包邮/不包邮/不同工艺 链接归一族(物流/工艺/印花
是矩阵维度,不是分族维度);分类键优先级不变。