Admin:同一顺运宝商品多件入库码合并回写 #240

Open
opened 2026-08-15 14:19:31 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#14
  • 所属 MVP / 版本:#224 / 档口入库码回写 MVP
  • 阶段:多件商品聚合回写修复

要解决什么

Shopee线下档口入库码映射_20260815_V3.3-R5.xlsx 第 50、51 行来自同一个顺运宝订单、同一个商品明细、同一档口和同一颜色尺码,原商品数量为 2,因此源文件按件序生成两个不同档口入库码。当前导入器把两行归为同一业务键后要求入库码相同,导致整批导入报错;即使放过导入,匹配器也会因 source_duplicate_count > 1 跳过,无法进入回写。

客户已确认:同一顺运宝商品明细的多个单件入库码使用英文逗号连接成一个字符串,写入该明细唯一的 innerExpCode 位置。

复现:

  1. 在“档口入库码”页面导入上述 2026-08-15 文件。
  2. 第 50、51 行业务键均为 2026-08-15 + 26081394YBWB17 + 山湖-易興网购#0035 + 黑色,6XL。
  3. 两行入库码分别为 DK260815A160101、DK260815A160102。
  4. 页面报“业务键相同但入库码不同”���

做什么 / 不做什么

  • 做:
    • 同一业务键的不同入库码按 Excel 行顺序稳定聚合,使用英文逗号且不加空格。
    • 相同入库码重复行只保留一个码,保留原有重复行统计。
    • 继续校验一个单件码不能在同一文件中属于不同业务键。
    • 聚合值超过现有 128 字符上限时,在写库和调用顺运宝前明确拒绝,不截断。
    • source_duplicate_count 保留源行数量,但数量大于 1 不再阻止确定性匹配。
    • 已存在、写前核验、写后复读和未知结果禁止重试继续按完整聚合字符串比较。
    • 补充真实 2026-08-15 文件的只解析验证以及脱敏自动化测试。
  • 不做:
    • 不新增数据库表、字段或迁移,不保存 Excel 原文件。
    • 不改变业务键“日期 + 订单号 + 档口及货号 + 标准化规格”。
    • 不拆成多个顺运宝写请求,不自动付款,不修改 Client 接口。
    • 不截断、拆分或静默丢弃任何入库码。

怎么做

  • admin/service/inner_code_import.go:分组后按 Excel 行顺序稳定收集不重复入库码,连接为 code1,code2;聚合后执行 128 字符及控制字符校验。
  • admin/service/inner_code_match.go:删除 source_duplicate_count > 1 的整组跳过,让聚合记录按原确定性规则匹配一个顺运宝明细。
  • admin/service/inner_code_import_test.go、admin/service/inner_code_match_test.go、admin/service/inner_code_apply_test.go:覆盖聚合顺序、重复码、超长、匹配放行及完整字符串回写/复读。
  • 现有 syb_inner_code_records.inner_code、remote_inner_code 均为 128 字符,样本两个码连接后为 31 字符,因此无需 schema 变更。

验收标准

  • 第 50、51 行导入为一条业务记录,目标值严格为 DK260815A160101,DK260815A160102。
  • 同一业务键三个及以上不同码仍按 Excel 行顺序连接;重复相同码不会重复拼接。
  • 聚合字符串超过 128 字符时整批导入失败,错误包含相关 Excel 行和长度原因,数据库不发生部分写入。
  • 聚合记录可以进入确定性匹配,不再因源数量大于 1 被跳过。
  • 回写只请求一次,并以完整聚合字符串执行写前比较、写入和写后复读核验。
  • 单件记录、重复导入、软删除恢复、未知结果禁止重试和同日单件码防串单行为保持兼容。
  • 固定 Go 1.23.0 的定向测试、全量测试、build 和 vet 通过。

怎么验证

从 admin/ 执行:

go test ./service ./repository ./syb -run InnerCode -count=1
$env:GOTOOLCHAIN="go1.23.0"
go build ./...
go test ./... -count=1
go vet ./...
Remove-Item Env:GOTOOLCHAIN

另以 raw_data/Shopee线下档口入库码映射_20260815_V3.3-R5.xlsx 做本地只解析验证,确认第 50、51 行聚合值和总记录数;不连接顺运宝、不执行真实回写。

风险和回退

  • 风险:顺运宝真实字段长度上限或页面展示可能小于 Admin 当前 128 字符假设;上线前应先对一条测试明细验证逗号保存与复读。代码严格保留 128 字符门禁,超过时不发请求。
  • 风险:一个订单存在两个独立顺运宝明细且档口、规格完全相同时仍会触发现有歧义保护,不自动选择。
  • 回退:回退服务代码即可恢复原拒绝/跳过行为;本任务无 schema 迁移。已经回写的远端聚合值不会随代码回退自动撤销,仍按现有核对流程处理。
## 基本信息 - 类型:缺陷 - 父级大工单:#14 - 所属 MVP / 版本:#224 / 档口入库码回写 MVP - 阶段:多件商品聚合回写修复 ## 要解决什么 `Shopee线下档口入库码映射_20260815_V3.3-R5.xlsx` 第 50、51 行来自同一个顺运宝订单、同一个商品明细、同一档口和同一颜色尺码,原商品数量为 2,因此源文件按件序生成两个不同档口入库码。当前导入器把两行归为同一业务键后要求入库码相同,导致整批导入报错;即使放过导入,匹配器也会因 `source_duplicate_count > 1` 跳过,无法进入回写。 客户已确认:同一顺运宝商品明细的多个单件入库码使用英文逗号连接成一个字符串,写入该明细唯一的 `innerExpCode` 位置。 复现: 1. 在“档口入库码”页面导入上述 2026-08-15 文件。 2. 第 50、51 行业务键均为 `2026-08-15 + 26081394YBWB17 + 山湖-易興网购#0035 + 黑色,6XL`。 3. 两行入库码分别为 `DK260815A160101`、`DK260815A160102`。 4. 页面报“业务键相同但入库码不同”��� ## 做什么 / 不做什么 - 做: - 同一业务键的不同入库码按 Excel 行顺序稳定聚合,使用英文逗号且不加空格。 - 相同入库码重复行只保留一个码,保留原有重复行统计。 - 继续校验一个单件码不能在同一文件中属于不同业务键。 - 聚合值超过现有 128 字符上限时,在写库和调用顺运宝前明确拒绝,不截断。 - `source_duplicate_count` 保留源行数量,但数量大于 1 不再阻止确定性匹配。 - 已存在、写前核验、写后复读和未知结果禁止重试继续按完整聚合字符串比较。 - 补充真实 2026-08-15 文件的只解析验证以及脱敏自动化测试。 - 不做: - 不新增数据库表、字段或迁移,不保存 Excel 原文件。 - 不改变业务键“日期 + 订单号 + 档口及货号 + 标准化规格”。 - 不拆成多个顺运宝写请求,不自动付款,不修改 Client 接口。 - 不截断、拆分或静默丢弃任何入库码。 ## 怎么做 - `admin/service/inner_code_import.go`:分组后按 Excel 行顺序稳定收集不重复入库码,连接为 `code1,code2`;聚合后执行 128 字符及控制字符校验。 - `admin/service/inner_code_match.go`:删除 `source_duplicate_count > 1` 的整组跳过,让聚合记录按原确定性规则匹配一个顺运宝明细。 - `admin/service/inner_code_import_test.go`、`admin/service/inner_code_match_test.go`、`admin/service/inner_code_apply_test.go`:覆盖聚合顺序、重复码、超长、匹配放行及完整字符串回写/复读。 - 现有 `syb_inner_code_records.inner_code`、`remote_inner_code` 均为 128 字符,样本两个码连接后为 31 字符,因此无需 schema 变更。 ## 验收标准 - [x] 第 50、51 行导入为一条业务记录,目标值严格为 `DK260815A160101,DK260815A160102`。 - [x] 同一业务键三个及以上不同码仍按 Excel 行顺序连接;重复相同码不会重复拼接。 - [x] 聚合字符串超过 128 字符时整批导入失败,错误包含相关 Excel 行和长度原因,数据库不发生部分写入。 - [x] 聚合记录可以进入确定性匹配,不再因源数量大于 1 被跳过。 - [x] 回写只请求一次,并以完整聚合字符串执行写前比较、写入和写后复读核验。 - [x] 单件记录、重复导入、软删除恢复、未知结果禁止重试和同日单件码防串单行为保持兼容。 - [x] 固定 Go 1.23.0 的定向测试、全量测试、build 和 vet 通过。 ## 怎么验证 从 `admin/` 执行: ```powershell go test ./service ./repository ./syb -run InnerCode -count=1 $env:GOTOOLCHAIN="go1.23.0" go build ./... go test ./... -count=1 go vet ./... Remove-Item Env:GOTOOLCHAIN ``` 另以 `raw_data/Shopee线下档口入库码映射_20260815_V3.3-R5.xlsx` 做本地只解析验证,确认第 50、51 行聚合值和总记录数;不连接顺运宝、不执行真实回写。 ## 风险和回退 - 风险:顺运宝真实字段长度上限或页面展示可能小于 Admin 当前 128 字符假设;上线前应先对一条测试明细验证逗号保存与复读。代码严格保留 128 字符门禁,超过时不发请求。 - 风险:一个订单存在两个独立顺运宝明细且档口、规格完全相同时仍会触发现有歧义保护,不自动选择。 - 回退:回退服务代码即可恢复原拒绝/跳过行为;本任务无 schema 迁移。已经回写的远端聚合值不会随代码回退自动撤销,仍按现有核对流程处理。
Author
Owner

实施前补充(不改变已确认交付范围):

  • 英文逗号是聚合分隔符,因此单个源入库码本身包含逗号或控制字符时整批拒绝,避免无法无歧义拆分。
  • 聚合后数据库的精确字符串唯一索引不能单独保证“某个组成码不被另一业务键复用”;导入事务会锁定同业务日期的现有记录,拆分已有聚合值并逐个核对组成码归属,继续保留同日防串单。
  • 导入成功提示把“文件内重复 N 行”改为“同业务键合并 N 行”,避免把正常的多件数量误报成脏重复。
  • 同步更新 docs/admin/03-data-model.md 的稳定数据规则。
实施前补充(不改变已确认交付范围): - 英文逗号是聚合分隔符,因此单个源入库码本身包含逗号或控制字符时整批拒绝,避免无法无歧义拆分。 - 聚合后数据库的精确字符串唯一索引不能单独保证“某个组成码不被另一业务键复用”;导入事务会锁定同业务日期的现有记录,拆分已有聚合值并逐个核对组成码归属,继续保留同日防串单。 - 导入成功提示把“文件内重复 N 行”改为“同业务键合并 N 行”,避免把正常的多件数量误报成脏重复。 - 同步更新 `docs/admin/03-data-model.md` 的稳定数据规则。
Author
Owner

实施完成,待用户验收

最终实现:

  • 同业务键按 Excel 源行顺序连接不同单件码,相同码只保留一次;样本第 50、51 行得到 DK260815A160101,DK260815A160102。
  • 聚合值超过 128 字符、单件码包含逗号或控制字符时,在写库前整批拒绝。
  • 导入事务锁定同日记录并逐个核对已有聚合值中的组成码,避免跨业务键复用。
  • source_duplicate_count > 1 不再阻止确定性匹配;歧义、已有采购信息、写前变化及未知写结果的安全门禁保持不变。
  • 导入反馈和数据模型文档已同步。

验证结果:

  • go test ./service ./repository ./syb -run InnerCode -count=1:通过。
  • 固定 GOTOOLCHAIN=go1.23.0 的 go build ./...、go test ./... -count=1、go vet ./...:通过。
  • 真实 2026-08-15 Excel 只解析:63 个源数据行形成 62 条业务记录、合并 1 行,目标聚合值正确;没有连接顺运宝或执行写入。
  • 未验证:真实 MySQL 8.4 _test 导入事务、真实顺运宝逗号值保存/展示/复读、生产部署。

提交与归档:

  • 实现提交:8e50060
  • 归档提交:17c2d45
  • 归档:docs/task/240-多件档口入库码合并回写.md
## 实施完成,待用户验收 最终实现: - 同业务键按 Excel 源行顺序连接不同单件码,相同码只保留一次;样本第 50、51 行得到 `DK260815A160101,DK260815A160102`。 - 聚合值超过 128 字符、单件码包含逗号或控制字符时,在写库前整批拒绝。 - 导入事务锁定同日记录并逐个核对已有聚合值中的组成码,避免跨业务键复用。 - `source_duplicate_count > 1` 不再阻止确定性匹配;歧义、已有采购信息、写前变化及未知写结果的安全门禁保持不变。 - 导入反馈和数据模型文档已同步。 验证结果: - `go test ./service ./repository ./syb -run InnerCode -count=1`:通过。 - 固定 `GOTOOLCHAIN=go1.23.0` 的 `go build ./...`、`go test ./... -count=1`、`go vet ./...`:通过。 - 真实 2026-08-15 Excel 只解析:63 个源数据行形成 62 条业务记录、合并 1 行,目标聚合值正确;没有连接顺运宝或执行写入。 - 未验证:真实 MySQL 8.4 `_test` 导入事务、真实顺运宝逗号值保存/展示/复读、生产部署。 提交与归档: - 实现提交:`8e50060` - 归档提交:`17c2d45` - 归档:`docs/task/240-多件档口入库码合并回写.md`
Author
Owner

2026-08-17 补充真实环境结论:用户提供的多件操作 HAR 已证明顺运宝不允许把多个单件入库码用逗号写入同一 innerExpCode。网页实际流程是保留原明细的一件码,调用 POST /am/stock/detail/createDetail 创建数量 1、价格 0 的额外明细,再通过 POST /am/stock/detail/updateDetailCode 把下一件码写入新 detailId。

因此本工单关于“本地按业务键聚合”的实现仍可保留,但“远端完整聚合字符串只写一次”的结论和对应验收项已被 #250 替代。原始 HAR 含会话和业务数据,不上传、不粘贴;#250 只记录脱敏后的接口结构和安全边界。

2026-08-17 补充真实环境结论:用户提供的多件操作 HAR 已证明顺运宝不允许把多个单件入库码用逗号写入同一 `innerExpCode`。网页实际流程是保留原明细的一件码,调用 `POST /am/stock/detail/createDetail` 创建数量 1、价格 0 的额外明细,再通过 `POST /am/stock/detail/updateDetailCode` 把下一件码写入新 `detailId`。 因此本工单关于“本地按业务键聚合”的实现仍可保留,但“远端完整聚合字符串只写一次”的结论和对应验收项已被 #250 替代。原始 HAR 含会话和业务数据,不上传、不粘贴;#250 只记录脱敏后的接口结构和安全边界。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#240