fix(server): 修复 SYB 连写尺码未识别导致颜色尺码对换,并定向纠正受污染规格 #358
Open
opened 2026-10-06 10:57:39 +08:00 by ila
·
5 comments
No Branch/Tag Specified
main
fix/358-syb-size-weight
feat/357-syb-cancel-status
feat/356-purchase-order-filter
fix/355-syb-list-timeout
feat/353-syb-shop-multiselect
fix/354-syb-top-pagination
fix/352-syb-source-created
fix/348-reveal-swipe
feat/340-syb-excluded-products
fix/351-inner-code-apply-selection
fix/350-match-layout
fix/350-inner-code-matching
feat/349-batch-return-use
feat/347-batch-return-cancel
feat/345-yeeke-reship
fix/346-root-serves-spa
fix/344-inner-code-stall-match
fix/343-syb-writeback-session
feat/339-syb-page-size
feat/338-return-match
feat/337-yeeke-admin-ui
feat/336-yeeke-return-sync
fix/335-bottom-submit-node
fix/334-spec-probe-top-swipe
fix/333-purchaser-device-owner
fix/331-spec-panel-recognition
fix/330-syb-writeback-session
feat/327-syb-writeback-filter
feat/326-order-information
fix/325-order-result
feat/316-chrome-order-backfill
fix/307-backfill-entry
feat/305-syb-order-writeback
feat/306-order-paid-amount
release/283
fix/283-purchase-mapping-consistency
fix/230-horizontal-spec-selection
feat/263-spec-rematch
fix/262-purchase-handoff
fix/260-261-purchase-readiness
fix/259-partial-collection-link
feat/258-one-click-replace
fix/257-color-normalized-match
fix/256-collection-single-dimension
fix/255-current-page-reidentify
feat/253-one-click-link
fix/254-match-loading
fix/251-syb-spec-candidates
feat/250-continuous-collection
fix/249-local-purchase-diagnostics
fix/248-bottom-submit
fix/247-short-address-panel
fix/246-address-return-panel
fix/245-purchase-failure-diagnostics
fix/244-selected-card-duplicates
fix/243-spec-entry-recovery
feat/242-agent-order-backfill
feat/241-order-backfill-endpoint
fix/239-syb-partial-sync
fix/238-spec-panel-preswipe
feat/237-client-api-keys
feat/236-purchaser-syb-sync
fix/235-syb-pagination-overlap
release/234-integrated
fix/229-address-entry-dedup
fix/228-selection-proof-panel-transition
fix/227-address-panel-return
fix/226-reopen-pdd-on-manual-retry
fix/225-in-place-purchase-retry
fix/224-final-spec-revalidation
fix/223-probed-confirmed-mapping
chore/221-devharness-sync
feat/218-purchase-result-bubble
fix/217-agent-retry-current-spec
fix/216-syb-spec-role-order
feat/215-mandatory-live-spec-probe
feat/214-verified-purchase-actions
fix/212-syb-sync-shop-snapshot
feat/211-spec-entry-ready-wait
feat/210-order-result-payment-transition
feat/209-pdd-bottom-spec-entry
feat/200-ai-match-result-purchase-ready
feat/199-job-execution-logs
feat/198-syb-ai-parse
feat/195-scheduled-spec-auto-match
fix/197-ai-write-timeout
feat/190-syb-inline-correction
fix/193-address-entry-reveal
feat/194-one-click-spec-match
fix/192-order-result-scroll
No results found.
Labels
No items
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: OPC/goauto#358
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
基本信息
原始需求与基线
20261006-0a79c83-356,源码提交0a79c83a958c5d4edc3798c21e15402afa787af1;本地 main955b34ad810d8f9d54b60491b039d2804375c350。依赖与并行
子项目影响
根因与代码证据
server/app/goauto/sybspec/parse.go的 explicitSizePattern 使用首尾完整匹配,能识别独立字母尺码或独立重量范围,却不能识别两者连写。server/app/goauto/sybimport/apply.go的 mergeParsedSpec 将错误值并入蝦皮商品档案。server/app/goauto/task/spec_sync.go与server/app/goauto/shopeeproduct/specs.go:Merge按维度增量补充、保留旧映射,不承担旧错误值删除或 SYB 明细重解析。server/app/goauto/sybimport/ai_parse_batch.go仅挑选 uncertain/failed;这条 success 明细不会进入异常 AI 解析。复现与目标契约(合成样例)
XL65-70kg,123深藍。123深藍,XL65-70kg应得到同样结果。2XL 60.0-67.5公斤,黑色及反向输入均正确识别;独立输入2XL 60.0-67.5公斤应识别为仅尺码。这是有意纠正此前“仅颜色”的错误,必须单独测试。已确认最小方案 / 不做什么(v2,整合审核 M1~M3)
M1:最小识别语法与共享路径
(?:x{0,4}[sml]|[2-9]xl)\s*<体重或范围><单位>;继续仅在一侧有明确尺码证据时决定角色,不用任意 XL/L 前缀匹配。XL(65-70kg)、XL/65-70kg、异常单位后缀不顺手兼容;只读对比发现时分类报告,是否纳入另行确认。M2:合并前只读回归差异清单
M3:历史修复路径与边界
不做:修改 ERPGo/Web/Android、改变通用 Merge 语义、每次同步全量覆盖、额外 AI、全局跨角色删除、定时任务成功数据重扫。AI 匹配不能代替源规格纠正。
预计涉及:
server/app/goauto/sybspec/parse.go及测试,必要的 sybimport 回归测试;优先使用现有 ReparseBatch。若需新增接口、迁移或通用工具,须重新确认范围。设计与原型门禁
验收标准
验证方式
go test ./app/goauto/sybspec ./app/goauto/sybimport ./app/goauto/shopeeproduct ./app/goauto/shopeespec。风险与回退
文档影响与任务记录
需求变化记录
2026-10-06 v1:建单,最小识别修复及已报告对象定向纠正。
2026-10-06 v2:按用户要求将评论 8836 整合进正文;明确接受带空格写法、新增合并前只读回归差异清单,拆清明细重解析与一次性档案清理,并补充测试基线核验。当前待实施。
2026-10-06 实施:用户授权做 #358;代码 a8233ec、文档
fb3efc9已推送 fix/358-syb-size-weight。M2 对比完成,无新增测试失败。M3 生产数据纠正、main 合并及发布未执行,详见集中验证评论。2026-10-06 发布:用户另行授权合并 main、部署线上;main 合并 e76de6f,发布 /home/goauto/releases/20261006-e76de6f-358,服务重启 active,公网 SPA/静态资源/健康验证通过。无迁移;历史明细与反向档案值的定向清理未执行。发布文档提交 e2a68b3。
2026-10-06 档案清理:用户明确授权继续在本单定向清理两项旧反向值。单独事务仅修改原报告档案的 specs_json 与 updated_at;删除 2 项无映射 import 值,保留其余全部维度元数据、规格和映射。颜色 10→9、尺码 6→5,数据库与 Admin 详情接口回读通过;恢复依据保存在服务器受限目录。未重跑 AI、未触发采购或同步、未扩大对象范围,工单保持待验收。
方案审核意见(2026-10-06,Claude Code,基于 main
955b34a)审核由用户授权,经 SynapBus #goauto(消息 #47)发起;只做审核,未改代码或数据。按用户要求以评论形式补充,不改工单正文。
结论:根因成立,最小方案方向正确,可以实施;以下 M1~M3 须先补入方案。
已核实的事实
explicitSizePattern为整段匹配(server/app/goauto/sybspec/parse.go:26),XL65-70kg匹配不上;逗号两侧均未命中尺码时,按「前颜色、后尺码」处理并记 success(parse.go:145-152)。根因属实。RawSpecHalves判断角色时直接比对Parse的结果(sybspec/raw_spec.go:45),ResolveKeys又建立在Parse和RawSpecHalves之上(sybspec/resolve_keys.go:22-44)。只改explicitSizePattern一处,三条路径自动保持一致,不需要另写角色判断。ApplyDetail对已存在的行会重新Parse,并覆盖非人工确认行的target_color/target_size(sybimport/apply.go:185-196);mergeParsedSpec只追加正确值。因此修复上线后,同步窗口内的同格式错误明细会自动纠正,但商品档案中的反向旧值不会被清除。必须补齐
M1. 带空格的写法
parse.go的注释里就出现过2XL 60.0-67.5公斤。它在逗号分支同样整段匹配不上,2XL 60.0-67.5公斤,黑色也会被对调。语法须明确二选一:(?:x{0,4}[sml]|[2-9]xl)\s*<体重或范围><单位>;如果选择包含,无逗号分支的整串
2XL 60.0-67.5公斤会从「仅识别到颜色」变为「仅识别到尺码」,需在测试中覆盖并说明。M2. 回归差异清单(只读)
合并前,用新旧两版
Parse跑一遍线上所有不重复的productSpec:只读规格字符串,在受限位置处理,不导出业务数据。按类别统计结果变化:工单只记录数量和合成样例。这份清单既能验证规则足够窄、不误伤正常颜色或描述,也能量化同格式污染涉及多少明细和商品。
M3. 写清修复路径与范围
ReparseBatch(sybimport/reparse.go:137,默认跳过人工确认),不需要新工具。建议(不阻塞)
XL(65-70kg)、XL/65-70kg)只在 M2 实际出现时才另行决定,不顺手扩展。RawSpecHalves和ResolveKeys单独写对调样例的测试;再加一个「同商品多规格且会塌缩」的样例,确认键稳定、不塌缩的键与修改前逐字一致。go test ./app/goauto/sybimport在 main 上原有 12 个失败(#353 审核时核对过)。验收时应按失败列表对比基线,确认没有新增失败,而不是期望全部通过。#358 v2 实施与验证结果(2026-10-06)
已完成 / 状态边界
a8233ec:仅修改 shared sybspec 的 explicitSizePattern,新增 sybspec/sybimport 合成测试;RawSpecHalves、ResolveKeys、ERPGo、Merge、Web/Android 不改业务实现。fb3efc9;已推送fix/358-syb-size-weight,工作区干净。M1 与回归
M2 线上只读差异清单
955b34a;新解析源码与a8233ec完全一致。XL65-70kg,123深藍从前颜色后尺码纠正为颜色123深藍、尺码XL65-70kg。线上样本没有出现额外变化类别,无需扩大清理范围。测试结果与存量限制
go test ./app/goauto/sybspec ./app/goauto/sybimport -run SizeWeight358 -count=1:通过。go test -json ./app/goauto/sybspec ./app/goauto/sybimport ./app/goauto/shopeeproduct ./app/goauto/shopeespec:sybspec/shopeeproduct/shopeespec 通过;sybimport 仍有 12 个基线既有失败,新旧失败名称集合完全相同,没有新增失败,不能标记整包全绿。go test ./app/goauto/task ./app/goauto/purchase -run 'Test(IncomingDimensions|IncomingDeduplicates|SpecSynced|BatchPreviewRefusesCollapsed)' -count=1:通过。git diff --check:通过。harness.py check --strict:基线 main 与本分支均同样失败,原因是已有docs/evidence/pdd-home-35727-summary.md为未登记 Wiki 镜像;本单未修改该文件/规则,不顺手修复。M3 执行前须知 / 未执行项
文档闭环
Business-Rules-and-Glossary已在线更新并回读 revisione0ac4bb20494a2659b8b6a4f8598884b56a94fa3,明确分支实现、未发布及历史纠正边界。harness.py sync和一次sync --check完成,17 个核心镜像一致。同环境复核的 12 项存量失败
TestRepairReversedSpecRolesKeepsAmbiguousColorUncertainTestScheduledAIParseConfirmsClosedCandidatesAndDoesNotRepeatTestScheduledAIParseLeavesLowConfidenceUnmatchedForSameFingerprintTestScheduledAIParseRetriesProviderFailureAtMostThreeTimesTestApplyDetailOnlyMergesSuccessfullyParsedSpecIntoArchiveTestParseRealSample_AmbiguousColorWithAnnotationAndSeparatorTestParseNoSeparatorIsUncertainNotFailedTestParseBothSidesEmptyAfterStrippingIsUncertainTestReparseUpdatesStatusWhenRuleImprovesTestManualCorrectMergesIntoArchiveLikeASuccessfulParseTestReimportPreservesIdenticalAIInputAndInvalidatesChangedSourceTestServiceListFiltersByOrderCodesShopAndParseStatus授权合并与线上发布完成(2026-10-06)
e76de6fc08f8b8f0a4bec6a51eb9193451aa784e已推送 main,发布文档提交e2a68b3已推送。/home/goauto/releases/20261006-e76de6f-358,GoAuto 重启 active;旧目录/home/goauto/releases/20261006-0a79c83-356保留用于代码回滚。a4cf6c7028a2bbbfd86a1d657ad9c3daad7b4d08445405d8ca9a778adc584760,上传后及发布后均核对一致。Web 与旧线上源码无差异,沿用已验证 dist,全目录比较一致;无 APK 构建或安装。/、/index.html、/syb-products/index与本次发布 SPA index 字节一致;10 项 JS/CSS 及健康接口正常,非 go-admin 默认欢迎页。发布后日志 panic/fatal/1054/1146 均为 0。f5077a19801882ebb4e94c5b0fe93f00fa6ebc7d,Deployment-and-Operations revision8be38ac192b9e1930fdc3d998c23027fda17e8f3;均在线回读,一次 sync 与一次 sync --check 完成,17 页一致。main 工作区干净。状态:代码已发布、待验收;历史错误明细和两项反向档案值尚未执行定向纠正,仍须独立授权。新规则对后续正常导入/重同步生效,不等于历史档案已被清理。工单不关闭。
指定历史明细纠正完成(2026-10-06)
/home/goauto/backups/20261006-358-detail/before.json,目录0700、文件0600,不下载或复制到工单/仓库。剩余:两项旧反向档案值未清理,保留待独立授权;不以明细纠正代表整个档案已清理。工单保持开放。
授权定向档案清理完成(2026-10-06,待验收)