Admin:确认三个 Excel 回填 PDD 规格可用于采购 #227

Open
opened 2026-08-14 17:03:53 +08:00 by ila · 1 comment
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#14
  • 所属 MVP / 版本:#15 / Admin 四模块可用闭环后续数据修复
  • 阶段:生产 PDD 可售状态修复

要解决什么

#226 为三个已处理 Excel 对应的 PDD 规格回填了正式价格,并按用户要求把商品标记为已采集;但这些规格原本来自 shopee_backfill 骨架,available 仍为空、availability_status 仍为 unknown。SYB 详情只把 available=true 的 SKU 作为可购买规格,因此出现“PDD 详情有规格和价格,SYB 却没有可购买规格组合”的状态矛盾。

生产示例:SYB 订单 2608139P0EJWFD、蝦皮商品 56664206910 关联 PDD 934053028134,有 8 个完整 SKU 且价格均为 6120 分,但可购买 SKU 数为 0,无法保存规格映射并创建采购任务。

用户确认这批 PDD 商品不再通过 Client 采集,三个 Excel 中已确认的完整规格和正式价格直接作为采购候选;Client 真正下单时仍必须按既有门禁核对商品、���格、数量和价格,不自动付款。

做什么 / 不做什么

  • 做:只处理 #226 使用的三个固定 Excel、店铺 qwg8fkb044 对应的 PDD 商品。
  • 做:仅对 spec_source=shopee_backfill、商品已采集、SKU 选项完整、正式价格大于 0、available 为空且 availability_status=unknown 的 SKU 写入 available=true,并删除过期的 availability_status 标记。
  • 做:默认 dry-run,应用前备份逐商品原始 skus_json 和状态,使用单事务及原值乐观锁更新,应用后复核目标订单能够出现规格候选。
  • 不做:不修改已有 available=true/false 的真实结果;不修改价格、规格选项、库存、列表价和商品关联;不自动保存规格映射、不创建采购任务、不下单、不付款;不新增字段或表。

怎么做

  • 增加一次性 Go 命令,复用 #226 的三个 Excel 白名单及 PDD 关联集合,禁止扩大到任意文件或其他店铺。
  • 解析现有 skus_json,整件商品必须满足安全条件后才纳入候选;任一 SKU 有真实可售值、空选项、非正价格或结构异常时整件跳过并统计原因,避免形成半修复数据。
  • 对候选商品的全部完整 SKU 写入 available=true,删除 availability_status;保留 spec_source=shopee_backfill 作为来源标记。
  • 应用前生成权限 0600 的 JSON 原值备份;所有候选在单事务内以原 skus_json/collect_status/updated_at 乐观锁更新,任一冲突整批回滚。
  • 预计修改:admin/cmd/confirm-backfilled-pdd-availability/、admin/service/、admin/repository/ 及测试;不修改页面、数据库结构或 Client 接口。

验收标准

  • 工具只接受三个固定 Excel 且只处理 qwg8fkb044 的关联 PDD。
  • 仅完整、正价格、可售状态未知的 shopee_backfill SKU 被确认为 available=true。
  • 已有真实 available=true/false、异常 JSON、空规格、非正价格、非目标来源和非目标商品不被修改。
  • 价格、规格、列表价、库存、关联及 collect_status 保持不变。
  • dry-run 不写库;apply 前生成 0600 原值备份;乐观锁冲突时整批回滚。
  • 生产 apply 数与 dry-run 候选一致,应用后再次 dry-run 候选为 0。
  • PDD 934053028134 的 8 个规格成为可购买候选,SYB 订单 2608139P0EJWFD 详情不再显示“没有可购买的规格组合”。
  • 未自动创建规格映射、采购任务或付款;后续由采购员在页面核对并保存映射。

怎么验证

从 admin/ 执行:

go test ./... -count=1
go vet ./...
go run ./cmd/confirm-backfilled-pdd-availability -dir ../raw_data
go run ./cmd/confirm-backfilled-pdd-availability -dir ../raw_data -apply

生产执行前先完整备份数据库并 dry-run;应用后使用只读 SQL 核对候选数、可购买 SKU 数、字段未变化,以及指定 SYB 详情的规格候选。

风险和回退

  • 这些规格来自业务确认的蝦皮/PDD 对应数据,不是 Android 实时采集结果;若 PDD 页面已经改版或规格下架,Client 必须在不可逆操作前通过现有商品、规格、数量和价格复核停止任务。
  • 不得把该规则扩大到三个 Excel 之外的普通 PDD 商品。
  • 若候选范围或字段校验异常,停止 apply;已应用时按逐商品原值备份恢复 skus_json,并再次核对采购链路。
## 基本信息 - 类型:缺陷 - 父级大工单:#14 - 所属 MVP / 版本:#15 / Admin 四模块可用闭环后续数据修复 - 阶段:生产 PDD 可售状态修复 ## 要解决什么 #226 为三个已处理 Excel 对应的 PDD 规格回填了正式价格,并按用户要求把商品标记为已采集;但这些规格原本来自 `shopee_backfill` 骨架,`available` 仍为空、`availability_status` 仍为 `unknown`。SYB 详情只把 `available=true` 的 SKU 作为可购买规格,因此出现“PDD 详情有规格和价格,SYB 却没有可购买规格组合”的状态矛盾。 生产示例:SYB 订单 `2608139P0EJWFD`、蝦皮商品 `56664206910` 关联 PDD `934053028134`,有 8 个完整 SKU 且价格均为 6120 分,但可购买 SKU 数为 0,无法保存规格映射并创建采购任务。 用户确认这批 PDD 商品不再通过 Client 采集,三个 Excel 中已确认的完整规格和正式价格直接作为采购候选;Client 真正下单时仍必须按既有门禁核对商品、���格、数量和价格,不自动付款。 ## 做什么 / 不做什么 - 做:只处理 #226 使用的三个固定 Excel、店铺 `qwg8fkb044` 对应的 PDD 商品。 - 做:仅对 `spec_source=shopee_backfill`、商品已采集、SKU 选项完整、正式价格大于 0、`available` 为空且 `availability_status=unknown` 的 SKU 写入 `available=true`,并删除过期的 `availability_status` 标记。 - 做:默认 dry-run,应用前备份逐商品原始 `skus_json` 和状态,使用单事务及原值乐观锁更新,应用后复核目标订单能够出现规格候选。 - 不做:不修改已有 `available=true/false` 的真实结果;不修改价格、规格选项、库存、列表价和商品关联;不自动保存规格映射、不创建采购任务、不下单、不付款;不新增字段或表。 ## 怎么做 - 增加一次性 Go 命令,复用 #226 的三个 Excel 白名单及 PDD 关联集合,禁止扩大到任意文件或其他店铺。 - 解析现有 `skus_json`,整件商品必须满足安全条件后才纳入候选;任一 SKU 有真实可售值、空选项、非正价格或结构异常时整件跳过并统计原因,避免形成半修复数据。 - 对候选商品的全部完整 SKU 写入 `available=true`,删除 `availability_status`;保留 `spec_source=shopee_backfill` 作为来源标记。 - 应用前生成权限 0600 的 JSON 原值备份;所有候选在单事务内以原 `skus_json/collect_status/updated_at` 乐观锁更新,任一冲突整批回滚。 - 预计修改:`admin/cmd/confirm-backfilled-pdd-availability/`、`admin/service/`、`admin/repository/` 及测试;不修改页面、数据库结构或 Client 接口。 ## 验收标准 - [x] 工具只接受三个固定 Excel 且只处理 `qwg8fkb044` 的关联 PDD。 - [x] 仅完整、正价格、可售状态未知的 `shopee_backfill` SKU 被确认为 `available=true`。 - [x] 已有真实 `available=true/false`、异常 JSON、空规格、非正价格、非目标来源和非目标商品不被修改。 - [x] 价格、规格、列表价、库存、关联及 `collect_status` 保持不变。 - [x] dry-run 不写库;apply 前生成 0600 原值备份;乐观锁冲突时整批回滚。 - [x] 生产 apply 数与 dry-run 候选一致,应用后再次 dry-run 候选为 0。 - [x] PDD `934053028134` 的 8 个规格成为可购买候选,SYB 订单 `2608139P0EJWFD` 详情不再显示“没有可购买的规格组合”。 - [x] 未自动创建规格映射、采购任务或付款;后续由采购员在页面核对并保存映射。 ## 怎么验证 从 `admin/` 执行: ```powershell go test ./... -count=1 go vet ./... go run ./cmd/confirm-backfilled-pdd-availability -dir ../raw_data go run ./cmd/confirm-backfilled-pdd-availability -dir ../raw_data -apply ``` 生产执行前先完整备份数据库并 dry-run;应用后使用只读 SQL 核对候选数、可购买 SKU 数、字段未变化,以及指定 SYB 详情的规格候选。 ## 风险和回退 - 这些规格来自业务确认的蝦皮/PDD 对应数据,不是 Android 实时采集结果;若 PDD 页面已经改版或规格下架,Client 必须在不可逆操作前通过现有商品、规格、数量和价格复核停止任务。 - 不得把该规则扩大到三个 Excel 之外的普通 PDD 商品。 - 若候选范围或字段校验异常,停止 apply;已应用时按逐商品原值备份恢复 `skus_json`,并再次核对采购链路。
Author
Owner

实施完成,待用户验收

  • 实现提交:abc37db(fix: 确认回填PDD规格可用于采购 (#227))
  • 归档提交:4d6ee8c(docs: 归档任务 #227)
  • 归档:docs/task/227-确认回填PDD规格可用于采购.md

验证结果

  • 固定 GOTOOLCHAIN=go1.23.0 的 go test ./... -count=1:通过
  • 固定 GOTOOLCHAIN=go1.23.0 的 go vet ./...:通过
  • Linux amd64、CGO_ENABLED=0 构建:通过
  • 首轮测试发现候选状态常量与结构体同名的编译错误,已在任何生产执行前改名并通过全量回归
  • 生产 dry-run:候选 1,735 个 PDD、27,537 个 SKU
  • 生产 apply:实际更新 1,735 个 PDD、27,537 个 SKU
  • apply 后再次 dry-run:候选为 0
  • 去重核对:1,735 个 PDD、27,537 个 SKU 全部 available=true 且价格非空;available 空值和 availability_status 残留均为 0
  • 示例 PDD 934053028134:保持 collected,8 个规格选项非空、均为 available=true、价格均为 6120 分
  • 示例订单当前规格映射 0、关联任务 0,确认本任务没有自动映射、建任务或下单
  • cmautobuy-admin 保持运行,登录页返回 HTTP 200

备份与清理

  • 完整业务库备份:/opt/cmautobuy/backups/autobuy-before-227-20260814T090931Z-notablespaces.sql.gz,权限 0600,gzip 完整性检查通过
  • 逐商品回退备份:/tmp/cmautobuy_xlsx_availability_backup_484364457.json,1,735 项,权限 0600
  • 上传到服务器的临时 Excel 副本已删除;一次性程序保留在 /opt/cmautobuy/maintenance/227-abc37db/

未验证

未使用登录后的浏览器人工打开 SYB 详情;采购员尚未保存示例订单的规格映射,未创建真实采购任务,也未执行 Client 真机下单或付款。

## 实施完成,待用户验收 - 实现提交:`abc37db`(`fix: 确认回填PDD规格可用于采购 (#227)`) - 归档提交:`4d6ee8c`(`docs: 归档任务 #227`) - 归档:`docs/task/227-确认回填PDD规格可用于采购.md` ### 验证结果 - 固定 `GOTOOLCHAIN=go1.23.0` 的 `go test ./... -count=1`:通过 - 固定 `GOTOOLCHAIN=go1.23.0` 的 `go vet ./...`:通过 - Linux amd64、`CGO_ENABLED=0` 构建:通过 - 首轮测试发现候选状态常量与结构体同名的编译错误,已在任何生产执行前改名并通过全量回归 - 生产 dry-run:候选 1,735 个 PDD、27,537 个 SKU - 生产 apply:实际更新 1,735 个 PDD、27,537 个 SKU - apply 后再次 dry-run:候选为 0 - 去重核对:1,735 个 PDD、27,537 个 SKU 全部 `available=true` 且价格非空;`available` 空值和 `availability_status` 残留均为 0 - 示例 PDD `934053028134`:保持 `collected`,8 个规格选项非空、均为 `available=true`、价格均为 6120 分 - 示例订单当前规格映射 0、关联任务 0,确认本任务没有自动映射、建任务或下单 - `cmautobuy-admin` 保持运行,登录页返回 HTTP 200 ### 备份与清理 - 完整业务库备份:`/opt/cmautobuy/backups/autobuy-before-227-20260814T090931Z-notablespaces.sql.gz`,权限 `0600`,gzip 完整性检查通过 - 逐商品回退备份:`/tmp/cmautobuy_xlsx_availability_backup_484364457.json`,1,735 项,权限 `0600` - 上传到服务器的临时 Excel 副本已删除;一次性程序保留在 `/opt/cmautobuy/maintenance/227-abc37db/` ### 未验证 未使用登录后的浏览器人工打开 SYB 详情;采购员尚未保存示例订单的规格映射,未创建真实采购任务,也未执行 Client 真机下单或付款。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#227