yeuimu
027ef2b296
docs: 性能整改落地文档——structs 补缓存层与部署参数说明、报告标注 P0 实施进度、AGENTS 沉淀切片缓存陷阱与 bullseye 跑测经验
2026-09-03 03:40:33 +08:00
yeuimu
9f856858e2
perf(deploy): 边缘 nginx 承压调优与连接池/PG 参数(P0-2/P0-3)
...
- 主配置 nginx.conf 进镜像(worker_connections 16384 + rlimit 65536 + gzip
+ 带上游耗时的访问日志):官方默认 1024×4=4096 连接硬顶是 1w 并发第一道墙
- admin.conf:upstream keepalive 64(proxy_http 1.1 + Connection "")、
/public/ /v2-api/ 限流 50r/s burst 200(429)、代理超时 5s/30s、
/uploads/ /assets/ 30d 缓存头;admin.v2.conf 的 /v2/h5/ 哈希产物长缓存
- compose:PG 显式参数(statement_timeout=10s/max_connections=200/
shared_buffers=512MB)、DATABASE_URL connection_limit=50&pool_timeout=3
(单位秒,勿写毫秒;勿加 statement_cache_size=0)、admin ulimits nofile 65536
- 部署注意:主配置走镜像须 rebuild;PG 参数重启前按全局约束 pg_dump+快照存档
2026-09-03 03:40:28 +08:00
yeuimu
ab79325ab0
perf(public): 公开读路径进程内分域缓存——meta/goods/matrix 版本域 + TTL 兜底 + in-flight 合并
...
- PublicCacheService:分域版本号失效(bump 即作废,不等 TTL)、loader 期间
bump 的竞态防护(返回但不回写)、并发 miss 单飞、PUBLIC_CACHE_DISABLED
/TTL_MS/MAX_ENTRIES 应急开关;@Global 模块
- PublicService 六端点接缓存:列表缓存全量物化(分页切片在缓存外按请求执行,
修复'所有页返回第一页'的切片缓存错误)、详情/首页/树/标签组/树序元数据/
族最低价聚合各按依赖域缓存
- 全写路径挂钩 bump:admin CRUD(goods/categories/countries/tags/tag-groups/
positions/origin-goods 标签)、sync 三同步、族重算、整理全家桶——
事务提交成功后失效对应域,product-families 经 recompute 天然覆盖
- 测试:PublicCacheService 单测 13 例 + 失效链路集成 8 例(读命中/写后立即可见
端到端/每条写路径域断言);既有两套件测数据语义改为显式禁缓存
2026-09-03 03:40:20 +08:00
yeuimu
ca38476047
docs(perf): public 端口 1w 瞬时并发审查报告与整改计划——逐层瓶颈证据、P0/P1/P2 分级、全局约束(DB 变更先备份/写路径必失效缓存)
2026-09-03 03:40:12 +08:00
yeuimu
44de8e670f
merge: bugfix/no-print-links-removal-yeuimu into develop (不打印链接移出族,SKU 矩阵恢复烫画)
2026-09-03 02:53:14 +08:00
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
yeuimu
0d2a954153
deploy(single-stack): 单栈收敛——v2 并入 deploy compose,v1 退役
...
- docker-compose.yml 重写为单栈 4 容器(admin 边缘 + v2-api/v2-admin/v2-postgres),
v2 数据卷 deploy-v2_pgdata/uploads 以 external 引用,数据零迁移
- nginx:/uploads/ /assets/ 上游改 v2-api(product-center 覆盖块随之冗余移除),
/ 跳转 /v2/admin/;docker-compose.v2.yml 删除(血统已并入 develop)
- v1 api+postgres 已停用未删,终档/快照/回滚手册见 deploy/backups/consolidation-*/
- 切换验证:v2 库切换前后行数完全一致;/v2-api /public /v2/admin /v2/h5
/assets 全路由冒烟 + 公网端到端通过
2026-09-03 02:09:24 +08:00
yeuimu
a554b77379
fix(product-families): 热转印词表以 v2 为准——归因不再映射回烫画
...
合并冲突的行为级裁决:develop 侧 memberMatrixCombos 曾把 热转印→烫画
归一(旧别名方案),与 v2 线上一等公民词表(8903afd)矛盾,导致 v2 侧
三个矩阵用例失败。取 v2 版 family-recompute.service.{ts,spec}(即当前
线上行为)。另修复 v2 分支 structs.md 残留的冲突标记。
Tests: api 23 suites/217 passed (runInBand), admin 27 passed, tsc clean
2026-09-03 02:00:33 +08:00
yeuimu
5e69397adc
merge: refactor/v2 完全并入 develop(v2 为准,v2 血统 20+ 提交收敛为主干)
2026-09-03 01:54:32 +08:00
yeuimu
37353470e7
fix(categories): 分类名去括号——同步入库整段删除括号段
...
左侧分类树/官网分类名的括号段(型号限定词(JSA002)与内容性括号
(黑+卡其)/(短裤 & 长裤))整段删除。分类名每小时被 SDS 同步覆盖,
清洗落在 syncCategories 入库路径(cleanCategoryDisplayName,款号 token
保留,剥空守卫),另附幂等存量脚本 fix:category-names。
已执行:V1/V2 各 33 条分类名去括号,复跑幂等 0。注意 api 容器重建
部署前旧镜像的下一轮同步会把名称写回原文,部署后自动恢复干净。
Tests: api 23 suites/206 passed(含新增 category-name.spec 7 例),tsc clean
2026-09-03 01:27:38 +08:00
yeuimu
9eafac7204
fix(goods): 商品展示名统一「品名 SKU」——剥 ASCII 型号限定词、纯款号补描述
...
左栏商品名显示成光款号(如 PLTK016)的根因是双层解析不一致:api 写路径按
首括号对解析产出「童装…(DTG180) PLTK016」,admin 展示解析按末括号取品名
误显示成 PLTK016。
- admin parseLinkName 对齐 api 首括号对解析 + 无 SKU 段中文品名守卫,
cleanLinkName 剥离 ASCII 型号限定词(中文括号内容保留)
- api 新增 cleanGoodDisplayName/describePureSkuGoodName,接入 create/update/
batchCreate(batchCreate 补上缺失的 normalize);纯款号按 SDS 分类名补描述
- 新增幂等存量修复脚本 fix:good-names(默认 dry-run,--apply 写库)
- 已执行:V2 栈 34 条限定词名、V1 栈 213 条原始链接名规范化,复跑幂等 0
Tests: api 22 suites/199 passed, admin 27 passed, tsc clean
2026-09-03 01:27:26 +08:00
yeuimu
0ffab120e9
merge: bugfix/category-name-parens-yeuimu into develop (分类名去括号)
2026-09-03 01:20:17 +08:00
yeuimu
814f45c5a3
fix(categories): 分类名去括号——同步入库整段删除括号段
...
左侧分类树/官网分类名的括号段(型号限定词(JSA002)与内容性括号
(黑+卡其)/(短裤 & 长裤))整段删除。分类名每小时被 SDS 同步覆盖,
清洗落在 syncCategories 入库路径(cleanCategoryDisplayName,款号 token
保留,剥空守卫),另附幂等存量脚本 fix:category-names。
已执行:V1/V2 各 33 条分类名去括号,复跑幂等 0。注意 api 容器重建
部署前旧镜像的下一轮同步会把名称写回原文,部署后自动恢复干净。
Tests: api 23 suites/206 passed(含新增 category-name.spec 7 例),tsc clean
2026-09-03 01:20:17 +08:00
yeuimu
39eb06b6a2
merge: bugfix/pure-sku-good-name-yeuimu into develop (商品名剥型号限定词 + 纯款号补描述)
2026-09-03 01:04:26 +08:00
yeuimu
c3be8ab979
fix(goods): 商品展示名统一「品名 SKU」——剥 ASCII 型号限定词、纯款号补描述
...
左栏商品名显示成光款号(如 PLTK016)的根因是双层解析不一致:api 写路径按
首括号对解析产出「童装…(DTG180) PLTK016」,admin 展示解析按末括号取品名
误显示成 PLTK016。
- admin parseLinkName 对齐 api 首括号对解析 + 无 SKU 段中文品名守卫,
cleanLinkName 剥离 ASCII 型号限定词(中文括号内容保留)
- api 新增 cleanGoodDisplayName/describePureSkuGoodName,接入 create/update/
batchCreate(batchCreate 补上缺失的 normalize);纯款号按 SDS 分类名补描述
- 新增幂等存量修复脚本 fix:good-names(默认 dry-run,--apply 写库)
- 已执行:V2 栈 34 条限定词名、V1 栈 213 条原始链接名规范化,复跑幂等 0
Tests: api 22 suites/199 passed, admin 27 passed, tsc clean
2026-09-03 01:04:22 +08:00
yeuimu
ae9901e6cc
merge: bugfix/family-auto-merge-auth-cookie-yeuimu into develop (SKU 自动合并 + 掉线修复)
2026-09-02 18:40:22 +08:00
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
yeuimu
b81d944c38
docs(agent): add dimension-value onboarding lesson
2026-09-02 16:37:56 +08:00
yeuimu
f09a629311
merge: add heat-transfer craft to matrix vocabularies
2026-09-02 16:34:27 +08:00
yeuimu
8903afdc82
feat(product-families): add heat-transfer (热转印) craft to matrix vocabularies
...
Append 热转印 to DIM_VALUES.craft so links manually tagged with the new
tag enter the price matrix (previously the closed vocabulary filtered it
out and the link's prices would silently disappear), and to
OPTION_DISPLAY_ORDER.craft so the button group renders it after 不打印.
No derivation rules changed: existing links are unaffected until an
operator explicitly tags them.
2026-09-02 16:33:41 +08:00
yeuimu
fb85a56444
docs(plan): add heat-transfer craft tag feature plan
2026-09-02 16:31:26 +08:00
yeuimu
5f81b18388
docs(agent): add materialized-array order determinism lesson
2026-09-02 16:08:35 +08:00
yeuimu
f828cc0bd9
merge: fix price-matrix option sort (canonical display order)
2026-09-02 16:05:05 +08:00
yeuimu
a84b3b5daa
fix(product-families): sort price-matrix option arrays by canonical display order
...
printCounts/crafts/logistics were materialized in first-encounter order
(originGoods had no orderBy), so the H5 print/craft/logistics button
groups rendered in an unstable, per-family arbitrary order. Add
OPTION_DISPLAY_ORDER (单面→双面, 烫画→直喷→不打印, 不包邮→包邮) and
stable-sort the aggregated arrays before materializing; out-of-vocabulary
free-text labels (e.g. 海运) sink to the end preserving encounter order.
Fix traversal order with orderBy id asc so recomputes are fully
deterministic. Add recompute:families script for one-off re-materialize.
2026-09-02 16:00:12 +08:00
yeuimu
1ffd73a1af
docs(plan): add price-matrix option sort fix plan
2026-09-02 15:52:41 +08:00
yeuimu
ae880ff346
docs(agent): add representative-row convergence lesson
2026-09-02 14:59:29 +08:00
yeuimu
26a5b08b56
merge: bugfix/public-goodname-representative (列表/首页族代表行对齐详情)
2026-09-02 14:58:59 +08:00
yeuimu
63820a3e6f
fix(public): unify family representative selection with detail endpoint
...
List/home endpoints picked the family representative row via goods[0],
which drifted with the list sort parameter (cheapest under PRICE_ASC,
lowest id under DEFAULT ties), causing goodName and other
representative-derived fields to differ from the detail endpoint.
Extract pickFamilyRepresentative (goodPriority desc -> createdAt desc
-> id asc, same as getGoodByFamilyId) and use it in getGoods and
getHomeGoods grouping. Group ordering and API contracts unchanged.
2026-09-02 14:58:42 +08:00
yeuimu
e34398a002
deploy(nginx): route /assets/product-center/ to v2 api for shared icons; ignore backups/
2026-09-02 11:40:51 +08:00
yeuimu
b32a5575df
deploy(nginx): route /assets/product-center/ to v2 api for shared icons
...
沙特国旗等新增图标只需放入 v2 仓库 public 目录;nginx 按最长前缀把
product-center 静态资源转发给 v2 api,其余 /assets/、/uploads/ 仍走 v1。
同步沉淀 AGENTS.md:入口 nginx 真实挂载源在 v1 仓库、文件型 bind mount 的
inode 陷阱。
2026-09-02 11:19:49 +08:00
yeuimu
a0ad6da9c7
chore(api): add Saudi Arabia flag icon
2026-09-02 11:01:11 +08:00
yeuimu
2bec7822f0
merge: feature/category-tree-sort (public goods style-order sorting)
2026-09-02 10:34:12 +08:00
yeuimu
76eb849b49
docs: record style-order semantics, container-run pitfalls and lessons
2026-09-02 10:33:54 +08:00
yeuimu
bea0bf14d8
feat(api): order public goods by country > mid-category > style > priority
2026-09-02 10:27:23 +08:00
yeuimu
3ccddc5982
feat(api): backfill category/country sort order from reference table
2026-09-02 10:22:49 +08:00
yeuimu
dc90712c4f
feat(api): add sort_order column to categories
2026-09-02 10:16:29 +08:00
yeuimu
d01c1e1b97
docs(plan): keep legacy tree as nav, treat sds leaves as style-order metadata, drop tree-switch tasks
2026-09-02 10:00:29 +08:00
yeuimu
3d431f8375
docs(plan): add backup/rollback section, fix backfill run channel and sink semantics
2026-09-02 09:36:17 +08:00
yeuimu
6973f863b5
chore: ignore local db snapshots (backups/)
2026-09-02 09:27:08 +08:00
yeuimu
88f60ba2e2
docs: add category-sort implementation plan (single categoryId, dual-path filter)
2026-09-01 19:26:50 +08:00
yeuimu
01fe444f93
docs: add category sort reference table (country > level2 > level3 order)
2026-09-01 19:00:24 +08:00
yeuimu
318f5c2a64
deploy(v2): update h5 build artifacts (new entry & products chunks)
2026-09-01 17:15:19 +08:00
yeuimu
5c5fb88f58
merge: refactor/v2 (v2 stack deploy, new h5 build, miniprogram assets) into develop
2026-09-01 16:30:43 +08:00
yeuimu
007ad2c831
deploy(v2): h5 build with base /v2/h5, admin dockerfile & nginx route, shared compose
2026-09-01 16:26:22 +08:00
yeuimu
60992cb3d9
deploy: new h5 build, /v2/h5 route, restore /v2-api & /public proxy
...
- replace deploy/h5 with latest h5 build (base /h5/)
- nginx: add /v2/h5/ passthrough to v2-admin
- nginx: restore lost /v2-api/ and /public/ proxy locations
- compose: join inkreach-shared network so v1 admin can resolve v2-admin
2026-09-01 16:21:45 +08:00
yeuimu
62f968c1c1
chore(api): add miniprogram static assets to /app/public (served at /assets/miniprogram)
2026-08-31 19:02:23 +08:00
yeuimu
a5884c638c
merge: fix/test-fixture-junk-badge into develop
2026-08-30 03:15:23 +08:00
yeuimu
f55e7ba4bb
merge: develop (fixture junk cleanup + badge text) into refactor/v2
2026-08-30 03:15:23 +08:00
yeuimu
674d38a9a7
fix(api,admin): stop test fixture junk leaking to shared dev DB; badge text x个配置
...
清理标签筛选里的「Upd {ts}-v2」空分组与原产品库树里的
「Tree Cat {ts}」垃圾分类——两者均为集成测试夹具残留:
- tag-groups spec「改名」用例把分组改成 -v2 后缀,afterAll 按原名
删除永远漏掉它(累积 31 个空分组);修复:改名前把 v2 名一并登记
- origin-goods spec getTree 用例的 finally 先删 good,被
goodOriginGood 外键限制挡住且错误被 .catch 吞掉,分类/商品/国家/
链接全部残留;修复:先删引用行再删 good
- 已清库:31 个 Upd 空分组、Tree Cat 分类 + Tree Good 商品 +
Tree Country 国家 + 2 条 tree-a/b 链接;复跑两 spec 复核零残留
左树一族一行徽标文案按用户反馈去掉「N 条链接」,仅显示「M 个配置」
(memberCount 字段保留在 DTO,悬浮弹层行为不变)
验证:tag-groups + origin-goods spec 13/13 绿且零残留;admin
vue-tsc 干净 + vitest 22/22
2026-08-30 03:15:18 +08:00
yeuimu
102d61c181
merge: develop (family composition badge) into refactor/v2
2026-08-30 03:07:21 +08:00
yeuimu
12882e7d5a
merge: fix/family-composition-badge into develop
2026-08-30 03:07:20 +08:00
yeuimu
a756c8c3c8
fix(admin,api): always show family composition badge N条链接·M个配置
...
按用户反馈(PLTM006 明明能查到配置数却不显示):左树徽标此前只在
同分类内 ≥2 个配置时才出现,单配置族一行上什么都不显示,而右树同族
链接都挂着绿色已配置徽标,两边数字对不上,反复造成「配置数没显示」
的误解。
- goods API:GOOD_INCLUDE 的 family 带 _count.originGoods,
GoodDto.originGood.family 增加 memberCount(族成员链接数)
- admin:distinctByFamily 记录 linkCount;一族一行的徽标常显
「N 条链接 · M 个配置」(链接数=族成员数,配置数=该族官网商品数),
悬浮仍列出全部配置可打开
- 文档同步徽标语义
效果:PLTM006 行显示「4 条链接 · 1 个配置」(真值:4 条链接仅配了
1 个官网商品);PLTF026 的「4 条链接 · 4 个配置」同屏可对比,其中
4 个配置为历史同国家重复配置,建议另行清理。
验证:admin vue-tsc 干净 + vitest 22/22;api goods spec 18/18;
Prisma _count 查询实测返回 originGoods=4
2026-08-30 03:07:16 +08:00
yeuimu
ab42cb49a3
merge: develop (block family re-config) into refactor/v2
2026-08-30 02:55:33 +08:00
yeuimu
5d089bdb43
merge: fix/block-family-reconfig into develop
2026-08-30 02:55:32 +08:00
yeuimu
49d28c8d4f
fix(admin): block re-config for family-configured links
...
按用户反馈:族已配置后不允许再配置(撤回上一轮的「再配置」入口):
- 「配置」按钮仅在本链接及其同款族均未配置时显示(configuredCount
与 familyConfiguredCount 均为 0),族已配置的链接只显示「同款已配置」徽标
- openConfigModal 增加统一拦截(按钮与右树拖拽两条路径都覆盖):
已配置/族已配置的链接弹出警告并阻止打开配置弹窗,避免产生官网
不可见的冗余商品
- 文档同步:撤回「再配置」语义,恢复拦截说明
已核实 PLTF004(族 786)实际仅 1 个官网商品,「四个配置」是右树
族聚合徽标造成的观感误解;149 个族无一跨分类,左树一族一行计数无误。
验证:admin vue-tsc 干净 + vitest 22/22 绿
2026-08-30 02:55:28 +08:00
yeuimu
ab51052d26
merge: develop (family-configured badge fix) into refactor/v2
2026-08-30 02:40:44 +08:00
yeuimu
7ff12fc69b
merge: fix/family-configured-badge into develop
2026-08-30 02:40:43 +08:00
yeuimu
fa4a95af98
fix(admin): relabel family-configured badge to 同款已配置; button 再配置
...
按用户反馈修正右树「已配置徽标 + 配置按钮」并存的矛盾观感:
- 徽标改为链接级真值:本链接未单独建商品但所属族已配置时显示
「同款已配置」(此前沿用拦截时代的「已配置」文案,与恢复出的
配置入口语义打架)
- 该场景下按钮文案改为「再配置」,悬浮说明指向调整归族/加配国家;
本链接自身已配置时按钮照旧隐藏,行为不变
- 文档撤回过时的「族已配置后配置入口会被拦截」说法(6f2d836 已
撤回拦截,徽标文案此番补齐)
验证:admin vue-tsc 干净 + vitest 22/22 绿
2026-08-30 02:40:39 +08:00
yeuimu
ff8aad171c
merge: develop (organize refactor) into refactor/v2
2026-08-30 01:27:28 +08:00
yeuimu
b6c19ae859
merge: refactor/organize-script-dev into develop (local only, not pushed)
2026-08-30 01:27:26 +08:00
yeuimu
93ac525c55
refactor(api): parsing out of runtime — pure-mirror sync, explicit organize, auto aggregate recompute
...
解析去运行时化(三层架构,plans/refactor/organize-script-refactor.md):
- 同步 = 纯镜像:upsertOriginGood 不再写解析列、不再自动挂族;详情同步仍触发重算
- 整理 = 显式人工动作(OrganizeService):解析列回填 → 派生标签(人工接管永不
覆盖)→ auto-group 建族 → 全量重算;入口 CLI(pnpm --filter @inkreach/api
organize)+ POST /product-families/organize + 后台「整理」按钮
- 重算 = 纯结构化聚合:不再按名称重派生标签(防上游改名倒灌,回归测试覆盖);
矩阵维度只认标签/CUSTOM 显式标签,未整理成员不进矩阵;工艺=不打印时
印花数量以单面占位(纯结构化规则);「恢复自动」走整理的单链接派生
- 派生默认补齐(脚本层假设):名称无单/双面且工艺非不打印 → 印花数量单面印花
- goods 服务建品/更新后仅镜像标签+重算(不派生);含商品名入库规范化
(normalizeGoodName,管理员输入边界质检)
- organize.service.spec 由 tag-sync spec 迁移 + 防倒灌回归;sync/recompute/
public/families spec 全部适配;API 173/173,admin typecheck+22/22
2026-08-30 01:27:01 +08:00
yeuimu
976f308e3c
Merge remote-tracking branch 'origin/develop' into develop
2026-08-29 09:13:11 +08:00
yeuimu
64a6fa7004
merge: fix/size-chart-local-size-code-dev into develop (local only, not pushed)
2026-08-29 08:55:16 +08:00
yeuimu
b5875d33b2
fix(sync): drop local size-code column (P/M/G/GG) from SDS size charts
...
巴西/西语市场上游尺码表带一个名为「尺码」的列,值是本地尺码码
P/M/G/GG(=S/M/L/XL),与行首尺码重复且非测量值;解析时整列丢弃。
其他非数字参考列(身高/体重/建议体重)保留。存量 2 条详情已修复
并重算受影响族。
2026-08-29 08:55:16 +08:00
yeuimu
ce283dff78
merge: fix/origin-name-mixed-bracket-dev into develop (local only, not pushed)
2026-08-29 02:36:26 +08:00
yeuimu
6498a198ef
fix(parser): normalize half/full-width bracket mix in link name segment 1
...
SDS 上游存在 '美国(不包邮)…' 混用括号:先归一为全角再配对,
否则国家/物流/品名三字段全部解析失败
2026-08-29 02:36:26 +08:00
yeuimu
7c46f15967
merge: feature/admin-ui-polish-dev into develop (local only, not pushed)
2026-08-29 02:32:41 +08:00
yeuimu
d625b40873
fix(admin): merge-candidates by SKU/family; config dialog merge block always shown; cfg badge adjacency
...
- 修正合并同名候选匹配:此前用名称 3 段组键(含工艺段),工艺写法不同的
同款(如 光板不打印 vs 单面印花(前印))全部漏配导致候选为空、合并同名
区块被 v-if 隐藏 —— 用户看到的"checkbox 和搜索框被吞"即此因。
改为 族归属精确匹配 或 款号(名称第 2 段,如 BRTF004)一致,全局跨分类;
区块常显,无候选时空态提示
- 修左树「N 个配置」徽标错位:good-name-col 改 flex 布局,徽标紧贴名称
- 验证:admin typecheck + 22/22 + 构建绿;DB 实测 BRTF004 光板链接候选池
恢复(单面印花(前印),同族 857)
2026-08-29 02:16:35 +08:00
yeuimu
6f2d836ef5
fix(admin): one row per family on left tree; restore right-tree config entry
...
按用户反馈调整上一批优化:
- 左树撤回族组展开层(虚线层+重复名称行):改为一族只显示一行(排序最前的
代表商品),行内「N 个配置」徽标悬浮列出该族全部配置(名称/国家·分类/打开
按钮),不再有额外层级与重复名称
- 右树恢复配置入口:撤回「族已配置拦截」,本链接未单独建商品即显示「配置」
按钮(含族已配置情形,供调整归族/重新配置),拖拽路径同步解除拦截
- 国家模式拖拽排序回退为分组内简单排序(族组节点已不存在)
- 文档同步更新徽标/入口语义
验证:admin typecheck + 22/22 + 构建绿;浏览器实测美国分组 25 行一族一行、
「8 个配置」徽标悬浮列表可打开、国内工厂深层成族链接显示「配置」按钮
2026-08-29 01:53:09 +08:00
yeuimu
5e8183c220
feat(admin): family-folded left tree, toolbar regroup, sync log humanize
...
视觉走查驱动的后台优化(feature/admin-ui-polish-dev,确认后再合并):
- 左树(国家/品类模式)同款多配置折叠为一行族组节点:代表名 + "N 个配置"
徽标,展开看各行;locateInLeftTree 沿父链展开保证定位有效;国家模式
拖拽排序适配族嵌套(同容器内排序,按折叠后展示顺序保序重分配优先级)
- 工具栏分区重排:模式切换(品类/国家/全局)移至最左,筛选组居中,
新增自定义商品靠右,消除 1680 宽下的折行错乱
- 商品行属性小字/国家徽标颜色加深提升对比度
- 右树原产品行加拖拽提示 title
- 数据同步日志人话化:inserted/updated/total/delisted 等报文渲染为
"新增 0 · 更新 536 · 共计 536",原始报文进 tooltip
- 计划文档 plans/feature/admin-ui-polish-feature.md(含一项误报修正:
右树 29/3 计数为截图裁切误读,实际 29/33 无 bug)
验证:admin typecheck + 22/22 + 构建绿;浏览器实机复拍国家模式折叠、
族组展开、同步页文案均生效
2026-08-28 23:22:04 +08:00
yeuimu
4ddbf486bd
merge: fix/country-mode-good-reorder-dev into develop (local only, not pushed)
2026-08-28 21:37:27 +08:00
yeuimu
0e451d07e6
fix(admin): drag-to-reorder goods inside country groups
...
国家模式左树商品节点支持拖拽排序:行内 before/after 指示线,落点即保存。
优先级采用保序重排(该国家现有优先级集合不变、按新顺序重新分配),
尽量少扰动全局/品类维度的既有排序;跨国家拖动不支持(商品归属固定)。
2026-08-28 21:37:27 +08:00
yeuimu
aba90cb011
merge: fix/config-dialog-global-siblings-dev into develop (local only, not pushed)
2026-08-28 20:04:30 +08:00
yeuimu
fdfe435ecd
fix(admin): config dialog merge candidates search globally by name group
...
合并同名候选不再局限于当前分类节点:collectSiblings 改为按名称 3 段组键
(sameOriginGroup)遍历整棵右树收集同款链接(含已配置,勾选归族幂等),
跨分类的同款链接(如 BRTF004 分布在多个分类组)也能勾选归族
2026-08-28 20:04:29 +08:00
yeuimu
a14b8ecf4a
merge: feat/country-sort-and-sync-btn-dev into develop (local only, not pushed)
2026-08-28 20:01:04 +08:00
yeuimu
1e07c62fc8
feat(admin): country drag-sort + always-available member detail sync
...
- Country 加 sort_order(默认 0 保持 id 序);PATCH /countries/sort 批量保存
顺序(对齐 /tags/sort 模式);findAll 与公开 /public/countries 均按
sortOrder 排序
- CountriesView 表格改为可拖拽行列表:拖动松开即全量保存新顺序,失败回滚
- 商品编辑弹窗成员展开面板:同步详情按钮常驻(已同步显示 重新同步详情),
不再只在未同步态出现
- goods.service.spec 的 FamilyRecomputeService mock 补齐 syncFamilyTags 等
方法(全量并行时其他套件的扫名归族会把本套件夹具收进族,create/update
会调用到,mock 缺方法导致偶发 TypeError)
- api 164/164、admin typecheck+22/22+构建全绿
2026-08-28 20:00:56 +08:00
yeuimu
77f9c05346
merge: fix/tree-badge-family-aware-dev into develop (local only, not pushed)
2026-08-28 19:16:22 +08:00
yeuimu
fe6ab3825d
fix(admin): family-aware right-tree badges; flatten union size-chart cells
...
- 右树徽标/定位/配置按钮改按族语义:族内任一链接已配置 → 全族显示绿色
已配置(本链接未单独建商品时标题注明并入该款),配置入口在全族未配置时
才出现;拖拽已配置族链接配置时拦截提示(公开契约一族一款,重复商品官网
不可见);分组头计数与仅未配置筛选同步族感知(AUTM003/DG120 场景)
- 编辑弹窗族级尺码表把 measurements 数组摊平成列键(与成员级渲染一致),
修复列头在、格子全空的问题
2026-08-28 19:16:15 +08:00
yeuimu
8a6db1bdee
docs(agents): lessons — stop dev server before full jest; Chinese sort assertions
2026-08-28 18:51:22 +08:00
yeuimu
d0102ec4e8
merge: feature/public-family-id-dev home-goods test into develop (local only, not pushed)
2026-08-28 18:44:25 +08:00
yeuimu
63b436fe41
test(public): cover home-goods family dedupe
2026-08-28 18:44:24 +08:00
yeuimu
5a7a2841de
merge: feature/public-family-id-dev into develop (local only, not pushed)
2026-08-28 18:43:33 +08:00
yeuimu
8a052773cd
feat(public): family-first contract — goodId=familyId, strict 5-dim price matrix
...
公开契约族化(前端只需知道款号/族):
- GET /public/goods 一族一条(goodId=族ID,price=族起价,分页作用于分组后);
无族商品(自定义)不进任何公开端点(列表/首页/分类树/标签统计)
- GET /public/goods/:goodId 仅认族 ID;公共字段取代表 Good,变体=全体成员并集,
尺码表/包装规格=族物化并集;旧 SDS 链接 ID 寻址 404
- priceMatrix 严格五维:尺码×颜色×印花数量×工艺×物流;维度来源改为链接级
标签(人工接管按人工标签),弃用原始 craftLabel;CUSTOM 成员尊重显式标签
- 名称派生补裸「单面/双面」写法(直喷双面→双面印花+直喷,18 条存量链接修复)
- family_price_overrides 加 print_count 列(五键唯一),PUT/DELETE/校验五键化
- admin 编辑弹窗矩阵消费适配(SKU 列直读 printCount,成员格子三维匹配,
改价 payload 带 printCount)
- 存量 339 族已全量重算;api 162/162、admin 22/22、双端构建绿
2026-08-28 18:43:30 +08:00
yeuimu
e5ec022834
merge: fix/swagger-csp-dev into develop (local only, not pushed)
2026-08-28 17:50:39 +08:00
yeuimu
e018f16d0b
fix(api): drop helmet CSP upgrade-insecure-requests so Swagger UI loads over plain http
2026-08-28 17:50:39 +08:00
yeuimu
b055aedd3e
merge: fix/swagger-proxy-dev into develop (local only, not pushed)
2026-08-28 17:43:41 +08:00
yeuimu
1ef82c4c14
fix(admin): proxy /api/docs without prefix strip so Swagger UI works through vite dev server
2026-08-28 17:43:41 +08:00
yeuimu
f07e843130
fix(admin): move family union tabs to the bottom of edit dialog
2026-08-28 17:37:58 +08:00
yeuimu
6054cb556a
docs: family union tabs and searchable merge list
2026-08-28 17:27:53 +08:00
yeuimu
d4515631b1
merge: feat/family-detail-tabs-dev into develop (local only, not pushed)
2026-08-28 17:26:41 +08:00
yeuimu
c7e6c35fbf
feat(admin): family-level size/package/SKU union tabs in edit dialog; searchable merge-sibling list in config dialog
2026-08-28 17:26:41 +08:00
yeuimu
6d9305b878
merge: fix/config-dialog-siblings-dev into develop (local only, not pushed)
2026-08-28 17:11:36 +08:00
yeuimu
7c85f7fe9f
fix(admin): config dialog lists all same-category sibling links (incl. configured); drop merge tip text
2026-08-28 17:11:36 +08:00
yeuimu
f280b1daf5
docs: reflect simplified member price table
2026-08-28 17:03:12 +08:00
yeuimu
d67858c69b
merge: fix/session-restore-and-price-table-dev into develop (local only, not pushed)
2026-08-28 17:02:26 +08:00
yeuimu
c2d50c9fa3
fix(admin): restore session via /auth/me in router guard (refresh no longer logs out); simplify member price table (no title/source/action columns)
2026-08-28 17:02:25 +08:00
yeuimu
9863346c6d
merge: fix/goods-view-feedback-dev into develop (local only, not pushed)
2026-08-28 16:55:08 +08:00
yeuimu
f28f51155f
feat(goods): per-member detail tabs in edit dialog; revert right-tree to raw names; split configured/family badges; add GET /origin-goods/:id
2026-08-28 16:55:07 +08:00
yeuimu
753b554413
merge: feature/goods-dialog-split-dev into develop (local only, not pushed)
2026-08-28 16:40:48 +08:00
yeuimu
10197c47a8
refactor(admin): split GoodsView into dialog components; fix(GoodsView): raw member names, no primary badges, member price grid; feat(tag): 光板 maps to 不打印
2026-08-28 16:40:48 +08:00