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 夹具改为自包含(不依赖共享库既有数据)。
This commit is contained in:
yeuimu
2026-09-02 18:39:35 +08:00
parent e34398a002
commit f1e81872e7
25 changed files with 848 additions and 78 deletions
+58
View File
@@ -0,0 +1,58 @@
# 修复:人工修改标签后 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 的 包邮/不包邮/不同工艺 链接归一族(物流/工艺/印花
是矩阵维度,不是分族维度);分类键优先级不变。