D:\chengma\cmautobuy
server/app/goauto/sybinnercode/
admin/service/inner_code_*.go
398b1da
5c6655f
syb_inner_code_record
syb_inner_code_apply_batch
parser.go parseBusinessDate
service.go Import
service.go Delete
planRecord → ListByOrderNumber
NormalizeInnerCodeSpecKey
NormalizeSpecKey
matchEvidence
match.go strictStall
strings.Contains(blob, stall)
strings.Cut(stall, "#")
50
50公斤
PDD256437
067
67
#
inner_code_match.go innerCodeStallMatches
planExistingMatchedInnerCodeItems
planRecord
sybinnercode/match.go
strictStall
inner_code_match_test.go
sybinnercode
origin/main
abdf907
9d23b44
57b0f15
sybclient.AcquireSession
sybimport.Connect
runtime.go
Connect
开始实施:按已确认方案移植 cmautobuy 档口货号匹配规则(#273/#259)到 sybinnercode/match.go,并针对 #289 多件逐件绑定场景编写回归测试与(如复现)最小修正。仅修改 server/app/goauto/sybinnercode/ 下匹配/规划逻辑与其测试,不改导入、删除、执行、接口与前端。
分支:fix/344-inner-code-stall-match(基于 main abdf907),提交 e99bbc2、9dace6a,已推送。未合并。仅改 server/app/goauto/sybinnercode/match.go 与 match_test.go。
fix/344-inner-code-stall-match
e99bbc2
9dace6a
server/app/goauto/sybinnercode/match.go
match_test.go
strictStall 的子串判断改为 stallMatches,与 cmautobuy innerCodeStallMatches 及辅助函数(splitStall、isNumericArticle、textHasNumericArticle、normalizeNumericArticle、textHasExactArticle、productSpecStartsWithArticle、articleTokens)逐行一致:最后一个 # 拆分;货号只与连续字母/数字令牌比较;纯数字货号须同时命中档口名才允许前导零等价;规格仅以货号开头命中;货号为空时按档口名包含。matchEvidence 流程(原始 SKU 优先 → 冲突拒绝 → 档口 → 无 SKU 兜底)不变。
stallMatches
innerCodeStallMatches
splitStall
isNumericArticle
textHasNumericArticle
normalizeNumericArticle
textHasExactArticle
productSpecStartsWithArticle
articleTokens
回归测试 TestRunMatchJobPreservesExistingBindingWhenCandidateOrderDiffers 在旧逻辑上失败(按 ID 顺序会把已写好的码改绑到另一明细)、新逻辑通过。新增 assignExistingBoundItems:保留已带目标码的明细绑定,只把剩余码填入空白明细;并按 cmautobuy 补齐防护:明细 ID 无效/重复拒绝、候选规格原文/SKU/变体 SKU 必须一致、档口非空时每条候选须通过 stallMatches、存在非目标码或同码多次、空白明细多或少均拒绝。数量=1 与已有采购信息排除沿用原有检查。
TestRunMatchJobPreservesExistingBindingWhenCandidateOrderDiffers
assignExistingBoundItems
go build ./...
go vet
状态:待验收。
source_row,id
ordinal
transaction_read_only=1
syb_inner_code_plan
用户确认:「#344通过验收,合并到main」。
abdf907..9dace6a
状态:验收通过,关闭。
No dependencies set.
The note is not visible to the blocked user.
来源与原始需求摘要
D:\chengma\cmautobuy与本项目的档口入库码模块。前置依赖
server/app/goauto/sybinnercode/,不碰 SYB 商品页、采购与退货代码)。基于 main 开分支。当前事实(2026-09-28 核对)
admin/service/inner_code_*.go等约 5200 行,自 #231 起持续修复至 #318(HEAD398b1da)。server/app/goauto/sybinnercode/约 2800 行,#119~#121 一次实现(5c6655f),此后仅 #139、#237 顺带修改,匹配逻辑未演进。syb_inner_code_record仅 2026-08-22 的 33 条试用记录(already_filled 31、ready 1、skipped 1),syb_inner_code_apply_batch为 0——未投入生产使用。已对齐(无需改动)
parser.go parseBusinessDateservice.go Importservice.go DeleteplanRecord → ListByOrderNumberNormalizeInnerCodeSpecKeyNormalizeSpecKey(逻辑一致)matchEvidence不一致(本单范围)
match.go strictStall只做子串包含:strings.Contains(blob, stall)或 同时包含档口名与货号(strings.Cut(stall, "#")取第一个 #)。已知误配:50命中50公斤);PDD256437);067与67不能对齐;#时拆分错误。后果:入库码可能回写到错误的 SYB 商品明细。
cmautobuy 现行规则(
inner_code_match.go innerCodeStallMatches及相关函数):按最后一个#拆分;货号只与「连续字母/数字」令牌精确比较(标点、【】、空格为边界);纯数字货号要求候选同时包含档口名才允许前导零等价;规格仅允许以货号开头(首个空格/逗号前)。planExistingMatchedInnerCodeItems在「多个单件码 ↔ 多条数量为 1 的现成明细」时,已存在目标码的明细优先保留原绑定、只补缺失;goautoplanRecord按明细 ID 排序顺序分配,可能把已写好的码换到另一条明细上(多余写入或覆盖)。需先用测试复现再决定是否修改。方案
sybinnercode/match.go(拆分、令牌化、数字货号前导零与档口名约束、规格前缀规则),strictStall与无 SKU 回退路径统一使用新规则。inner_code_match_test.go中 #273/#259 相关场景)为 goauto 回归测试。非目标
验收
067/67在同档口名时等价、不同档口名时不等价;档口名含#正确拆分;规格以货号开头可命中。sybinnercode既有测试全部通过;gofmt / build / vet 通过。风险
设计证据
文档影响
替代 cmautobuy 前的后续事项(不在本单)
基线核对(2026-09-28)
origin/main=abdf907(含 Codex 已合并的 #338、#339、#341、#342、#343);cmautobuy398b1da。重新 fetch 后 main 无更新。sybinnercode模块在 main 上的全部历史仍只有5c6655f(#119~#121)、9d23b44(#139)、57b0f15(#237);#338~#343 均未改动该模块;其他远程分支也无未合并改动。sybclient.AcquireSession;sybimport.Connect已改为调用它,本模块runtime.go经Connect取会话,因此回写已走统一会话刷新,无需在本单处理。开始实施:按已确认方案移植 cmautobuy 档口货号匹配规则(#273/#259)到
sybinnercode/match.go,并针对 #289 多件逐件绑定场景编写回归测试与(如复现)最小修正。仅修改server/app/goauto/sybinnercode/下匹配/规划逻辑与其测试,不改导入、删除、执行、接口与前端。实施回写(2026-09-28)
分支:
fix/344-inner-code-stall-match(基于 mainabdf907),提交e99bbc2、9dace6a,已推送。未合并。仅改server/app/goauto/sybinnercode/match.go与match_test.go。1. 档口货号匹配(#273/#259)
strictStall的子串判断改为stallMatches,与 cmautobuyinnerCodeStallMatches及辅助函数(splitStall、isNumericArticle、textHasNumericArticle、normalizeNumericArticle、textHasExactArticle、productSpecStartsWithArticle、articleTokens)逐行一致:最后一个 # 拆分;货号只与连续字母/数字令牌比较;纯数字货号须同时命中档口名才允许前导零等价;规格仅以货号开头命中;货号为空时按档口名包含。matchEvidence流程(原始 SKU 优先 → 冲突拒绝 → 档口 → 无 SKU 兜底)不变。2. 多件逐件绑定(#289)——问题复现并修正
回归测试
TestRunMatchJobPreservesExistingBindingWhenCandidateOrderDiffers在旧逻辑上失败(按 ID 顺序会把已写好的码改绑到另一明细)、新逻辑通过。新增assignExistingBoundItems:保留已带目标码的明细绑定,只把剩余码填入空白明细;并按 cmautobuy 补齐防护:明细 ID 无效/重复拒绝、候选规格原文/SKU/变体 SKU 必须一致、档口非空时每条候选须通过stallMatches、存在非目标码或同码多次、空白明细多或少均拒绝。数量=1 与已有采购信息排除沿用原有检查。验证
sybinnercode全部 34 个测试通过(审核人复跑)。gofmt /go build ./.../go vet干净。未验证 / 遗留
状态:待验收。
验收第 4 条:线上试用样本只读新旧对比(2026-09-28,用户授权「做」)
abdf907(旧规则)与本分支9dace6a(新规则)编译,在线上服务器以 goauto 用户、线上配置运行;按正式匹配任务相同顺序(记录source_row,id、入库码ordinal)对营业日期 2026-08-22 的全部记录逐条调用planRecord。SYB 会话经sybimport.Connect(统一会话管理)复用线上缓存会话;只调用「按订单号查货运单」「货运单明细」两个只读接口。数据库连接开启transaction_read_only=1,任何写库都会失败;未执行任何 SYB 写操作。syb_inner_code_record状态分布与运行前一致(31/1/1),syb_inner_code_plan32 条未变。验收(2026-09-28)
用户确认:「#344通过验收,合并到main」。
fix/344-inner-code-stall-match快进合并到 main(abdf907..9dace6a),无合并提交;验证沿用同一提交9dace6a的测试与线上只读对比结果。状态:验收通过,关闭。