Admin:将指定蝦皮店铺正式规格补入关联 PDD 空规格 #194

Closed
opened 2026-08-12 18:19:07 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#14
  • 所属 MVP / 版本:#15
  • 阶段:蝦皮与 PDD 规格数据补全

要解决什么

#193 的只读报告确认:qwg8fkb044 店铺共 2075 件商品,其中 1917 件关联 PDD 暂无可比较规格。用户已确认允许以蝦皮正式颜色、尺码创建 PDD 规格骨架,但价格和库存必须保持未知。

做什么 / 不做什么

  • 做:为店铺名精确等于 qwg8fkb044、有明确有效 PDD 关联、存在 parse_ok=1 正式规格、且 PDD skus_json 为空或为合法空规格结构的商品创建规格骨架。
  • 做:只写颜色、尺码组合;缺少某一维时只保留实际存在的维度。
  • 做:价格字段写 null,库存字段不作“有货”承诺,并标记规格来源为蝦皮回填。
  • 做:默认 dry-run,只有显式 --apply 才在单个事务中写入;输出候选、更新和跳过汇总。
  • 不做:不覆盖已有非空 PDD 规格,不覆盖非法 JSON,不处理 #193 的 3 件差异商品,不猜测价格和库存,不修改采集状态,不删除数据。

怎么做

  • 新增 admin/cmd/backfill-shop-pdd-specs 命令,固定通过 --shop 精确限定店铺;默认只预览,--apply 才写入。
  • repository 复用只读来源数据,并增加带“目标 skus_json 仍为空/合法空结构”前置条件的参数化更新,整个批次使用事务。
  • service 将 parse_ok=1 的颜色、尺码去重组成稳定 JSON;写入 source=shopee_backfill 和生成时间,价格为 null,不把未知库存伪装成可售。
  • 写入前再次验证多蝦皮商品共用同一个 PDD 时正式规格集合完全一致;不一致整组跳过。
  • 添加纯逻辑测试和数据库回归测试,随后先 dry-run、再 apply、最后再次 dry-run 核对结果。

预计修改:

  • admin/cmd/backfill-shop-pdd-specs/main.go
  • admin/repository/spec_compare.go
  • admin/service/spec_backfill.go
  • 对应测试

验收标准

  • 默认运行不写库,只有显式 --apply 才执行更新。
  • 仅处理精确店铺、明确关联、正式规格存在且 PDD 规格为空的商品。
  • 生成的 PDD 规格只含正式颜色/尺码组合,价格保持 null,不声明未知库存为有货。
  • 已有规格、非法 JSON、差异规格、关联缺失、软删除和多对一歧义均不覆盖。
  • 写入使用事务和目标行前置条件;并发变化时安全跳过或回滚。
  • apply 后再次 dry-run 能核对实际更新数,Go 1.23 全量验证通过。

怎么验证

从 admin/ 执行:

$env:GOTOOLCHAIN="go1.23.0"
go test ./... -count=1
go run ./cmd/backfill-shop-pdd-specs --shop qwg8fkb044
go run ./cmd/backfill-shop-pdd-specs --shop qwg8fkb044 --apply
go run ./cmd/backfill-shop-pdd-specs --shop qwg8fkb044
Remove-Item Env:GOTOOLCHAIN

风险和回退

  • 风险:蝦皮规格不等于 PDD 当前真实可售规格,骨架只能用于数据整理,不能当作已采集库存或价格。
  • 控制:只补空规格、不改采集状态、不覆盖已有/异常数据;多对一不一致跳过。
  • 回退:命令执行前将候选 PDD 的原 skus_json 写入本机临时备份;如需回退,使用同一商品编号按备份恢复。备份不得提交 Git 或写入工单。
## 基本信息 - 类型:需求 - 父级大工单:#14 - 所属 MVP / 版本:#15 - 阶段:蝦皮与 PDD 规格数据补全 ## 要解决什么 #193 的只读报告确认:`qwg8fkb044` 店铺共 2075 件商品,其中 1917 件关联 PDD 暂无可比较规格。用户已确认允许以蝦皮正式颜色、尺码创建 PDD 规格骨架,但价格和库存必须保持未知。 ## 做什么 / 不做什么 - 做:为店铺名精确等于 `qwg8fkb044`、有明确有效 PDD 关联、存在 `parse_ok=1` 正式规格、且 PDD `skus_json` 为空或为合法空规格结构的商品创建规格骨架。 - 做:只写颜色、尺码组合;缺少某一维时只保留实际存在的维度。 - 做:价格字段写 `null`,库存字段不作“有货”承诺,并标记规格来源为蝦皮回填。 - 做:默认 dry-run,只有显式 `--apply` 才在单个事务中写入;输出候选、更新和跳过汇总。 - 不做:不覆盖已有非空 PDD 规格,不覆盖非法 JSON,不处理 #193 的 3 件差异商品,不猜测价格和库存,不修改采集状态,不删除数据。 ## 怎么做 - 新增 `admin/cmd/backfill-shop-pdd-specs` 命令,固定通过 `--shop` 精确限定店铺;默认只预览,`--apply` 才写入。 - repository 复用只读来源数据,并增加带“目标 `skus_json` 仍为空/合法空结构”前置条件的参数化更新,整个批次使用事务。 - service 将 `parse_ok=1` 的颜色、尺码去重组成稳定 JSON;写入 `source=shopee_backfill` 和生成时间,价格为 `null`,不把未知库存伪装成可售。 - 写入前再次验证多蝦皮商品共用同一个 PDD 时正式规格集合完全一致;不一致整组跳过。 - 添加纯逻辑测试和数据库回归测试,随后先 dry-run、再 apply、最后再次 dry-run 核对结果。 预计修改: - `admin/cmd/backfill-shop-pdd-specs/main.go` - `admin/repository/spec_compare.go` - `admin/service/spec_backfill.go` - 对应测试 ## 验收标准 - [x] 默认运行不写库,只有显式 `--apply` 才执行更新。 - [x] 仅处理精确店铺、明确关联、正式规格存在且 PDD 规格为空的商品。 - [x] 生成的 PDD 规格只含正式颜色/尺码组合,价格保持 `null`,不声明未知库存为有货。 - [x] 已有规格、非法 JSON、差异规格、关联缺失、软删除和多对一歧义均不覆盖。 - [x] 写入使用事务和目标行前置条件;并发变化时安全跳过或回滚。 - [x] apply 后再次 dry-run 能核对实际更新数,Go 1.23 全量验证通过。 ## 怎么验证 从 `admin/` 执行: ```powershell $env:GOTOOLCHAIN="go1.23.0" go test ./... -count=1 go run ./cmd/backfill-shop-pdd-specs --shop qwg8fkb044 go run ./cmd/backfill-shop-pdd-specs --shop qwg8fkb044 --apply go run ./cmd/backfill-shop-pdd-specs --shop qwg8fkb044 Remove-Item Env:GOTOOLCHAIN ``` ## 风险和回退 - 风险:蝦皮规格不等于 PDD 当前真实可售规格,骨架只能用于数据整理,不能当作已采集库存或价格。 - 控制:只补空规格、不改采集状态、不覆盖已有/异常数据;多对一不一致跳过。 - 回退:命令执行前将候选 PDD 的原 `skus_json` 写入本机临时备份;如需回退,使用同一商品编号按备份恢复。备份不得提交 Git 或写入工单。
Author
Owner

实施进度:正式回填与复核完成

  • apply 前 dry-run:2075 件蝦皮商品;1917 件候选蝦皮商品,去重后对应 1738 件 PDD;155 件无正式蝦皮规格、3 件已有 PDD 规格跳过。
  • 正式执行:事务已提交,1738 件 PDD 写入规格骨架;执行前已在本机临时目录生成原值备份,未提交仓库或工单。
  • 首次命令等待超过工具 120 秒:根因是提交后的复查查询把同一份 PDD JSON 随每个蝦皮 SKU 重复传输,且 go run 子进程未随外层超时退出。已终止本次残留子进程,并把查询拆成“商品一次 + 规格一次”,不改变业务范围。
  • 优化后复核:候选 0;1738 件 PDD(对应 1917 件蝦皮商品)均被识别为已安全回填;3 件已有规格、155 件无正式规格保持不变。
  • 已回填骨架复核条件:spec_source=shopee_backfill、规格集合与蝦皮正式规格一致、价格字段为 null、没有 available=true/false 声明、availability_status=unknown。
## 实施进度:正式回填与复核完成 - apply 前 dry-run:2075 件蝦皮商品;1917 件候选蝦皮商品,去重后对应 1738 件 PDD;155 件无正式蝦皮规格、3 件已有 PDD 规格跳过。 - 正式执行:事务已提交,1738 件 PDD 写入规格骨架;执行前已在本机临时目录生成原值备份,未提交仓库或工单。 - 首次命令等待超过工具 120 秒:根因是提交后的复查查询把同一份 PDD JSON 随每个蝦皮 SKU 重复传输,且 `go run` 子进程未随外层超时退出。已终止本次残留子进程,并把查询拆成“商品一次 + 规格一次”,不改变业务范围。 - 优化后复核:候选 0;1738 件 PDD(对应 1917 件蝦皮商品)均被识别为已安全回填;3 件已有规格、155 件无正式规格保持不变。 - 已回填骨架复核条件:`spec_source=shopee_backfill`、规格集合与蝦皮正式规格一致、价格字段为 `null`、没有 `available=true/false` 声明、`availability_status=unknown`。
Author
Owner

实施完成,待验收

正式结果

  • 精确店铺:qwg8fkb044
  • 蝦皮商品:2075 件
  • 已回填:1917 件蝦皮商品,对应 1738 件去重后的 PDD 商品
  • 跳过:155 件无正式蝦皮规格;3 件已有 PDD 规格
  • apply 后复核:候选 0;1738 件均通过来源、规格集合、空价格和未知库存校验

安全措施

  • 默认 dry-run,只有 --apply 写库
  • apply 前本机临时备份
  • 单事务 + 原值乐观锁
  • 不改采集状态,不覆盖已有/异常规格
  • 价格为 null;不写 available,库存标记 unknown

验证与提交

  • Go 1.23 vet/build/test ./...:全部通过
  • 实现提交:8f7fb09
  • 归档提交:4089033
  • 归档:docs/task/194-蝦皮规格回填PDD.md
## 实施完成,待验收 ### 正式结果 - 精确店铺:`qwg8fkb044` - 蝦皮商品:2075 件 - 已回填:1917 件蝦皮商品,对应 1738 件去重后的 PDD 商品 - 跳过:155 件无正式蝦皮规格;3 件已有 PDD 规格 - apply 后复核:候选 0;1738 件均通过来源、规格集合、空价格和未知库存校验 ### 安全措施 - 默认 dry-run,只有 `--apply` 写库 - apply 前本机临时备份 - 单事务 + 原值乐观锁 - 不改采集状态,不覆盖已有/异常规格 - 价格为 `null`;不写 `available`,库存标记 `unknown` ### 验证与提交 - Go 1.23 `vet/build/test ./...`:全部通过 - 实现提交:`8f7fb09` - 归档提交:`4089033` - 归档:`docs/task/194-蝦皮规格回填PDD.md`
Author
Owner

用户于 2026-08-14 明确验收通过。验收清单已确认,现关闭工单。

用户于 2026-08-14 明确验收通过。验收清单已确认,现关闭工单。
ila closed this issue 2026-08-14 09:20:37 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#194