5.5 KiB
5.5 KiB
227 Admin:确认三个 Excel 回填 PDD 规格可用于采购
- 类型:缺陷
- 父级大工单:#14
- 所属 MVP / 版本:#15 / Admin 四模块可用闭环后续数据修复
- 状态:已完成
- 日期:2026-08-14
- Gitea 工单:#227
背景与目标
#226 为三个已处理 Excel 对应的 PDD 规格回填了正式价格并把商品标记为已采集,但规格骨架仍保留 available=null 和 availability_status=unknown。PDD 详情能够展示规格,SYB 采购流程却只接收 available=true 的 SKU,因此无法显示可购买组合、保存规格映射或创建采购任务。
用户确认这批商品不再通过 Client 采集,三个固定 Excel 中规格完整且已有正式正价格的 shopee_backfill 数据可以作为采购候选。本任务确认其可售状态,使采购员能够继续人工核对和保存规格映射;不自动创建采购任务、下单或付款。
最终方案
- 新增一次性命令
confirm-backfilled-pdd-availability,复用 #226 的三个固定文件白名单、qwg8fkb044店铺和 Excel 中的 PDD 集合。 - 整件商品必须同时满足:未删除、状态为已采集、
spec_source=shopee_backfill、SKU 非空、所有选项完整、所有正式价格大于 0、所有available为空且availability_status=unknown。 - 满足条件时给该商品全部 SKU 写入
available=true并删除过期的availability_status;价格、规格、列表价、库存、采集状态、采集时间和关联保持不变。 - 任一 SKU 已有真实
available=true/false,或者存在异常 JSON、空规格、非正价格、来源和状态不符时整件跳过,不进行半修复。 - 工具默认 dry-run;apply 前写出权限为
0600的逐商品原值备份,应用时使用单事务以及原skus_json/collect_status/updated_at乐观锁,任一冲突整批回滚。 - 生产执行前另存完整 MySQL 业务库备份;应用后再次 dry-run 并核对目标商品、全量候选、任务和映射均符合预期。
改了哪些
admin/cmd/confirm-backfilled-pdd-availability/main.go:新增固定范围、默认预演、显式应用、备份和汇总的一次性命令。admin/service/xlsx_availability_confirmation.go:新增候选判定、JSON 安全转换和整批事务应用逻辑。admin/repository/availability_confirmation.go:新增仅替换规格 JSON、带原值乐观锁的更新。admin/service/xlsx_availability_confirmation_test.go:覆盖候选确认、字段保留、异常整件跳过和事务回滚。
验收结果
| 验收标准 | 结果 |
|---|---|
只处理三个固定 Excel、qwg8fkb044 和对应 PDD 集合 |
通过 |
只确认完整、正价格、可售状态未知的 shopee_backfill SKU |
通过 |
| 已有真实可售值、异常数据、非目标来源和非目标状态不被修改 | 通过 |
| 价格、规格、列表价、库存、关联和采集状态保持不变 | 通过 |
| dry-run 不写库,备份权限为 0600,事务冲突整批回滚 | 通过 |
| 生产更新数与 dry-run 一致,更新后候选为 0 | 通过 |
| 示例 PDD 的 8 个规格均成为 SYB 可购买候选 | 通过 |
| 未自动创建规格映射、采购任务、订单或付款 | 通过 |
生产执行结果:
- dry-run 命中 1,735 个 PDD 商品、27,537 个 SKU;6 个非
shopee_backfill商品和 142 个非已采集商品被跳过。 - apply 实际更新 1,735 个 PDD 商品、27,537 个 SKU;再次 dry-run 候选为 0。
- 去重核对结果为 1,735 个 PDD、27,537 个 SKU:27,537 个均为
available=true、价格非空,available空值和availability_status残留均为 0。 - PDD
934053028134保持collected,8 个 SKU 均为available=true,规格非空,价格均为 6120 分。 - SYB 订单
2608139P0EJWFD当前仍没有规格映射,也没有采购或采集任务;数据修复没有绕过采购员保存映射的正常步骤。 - 完整业务库备份:
/opt/cmautobuy/backups/autobuy-before-227-20260814T090931Z-notablespaces.sql.gz,大小 4,677,638 字节,权限0600,gzip 完整性检查通过,共含 30 个建表段。 - 逐商品回退备份:
/tmp/cmautobuy_xlsx_availability_backup_484364457.json,1,735 项,大小 6,180,927 字节,权限0600。 - 服务器临时 Excel 副本已删除;一次性程序保留在
/opt/cmautobuy/maintenance/227-abc37db/,权限0700。
测试
- 执行的命令:
GOTOOLCHAIN=go1.23.0 go test ./... -count=1GOTOOLCHAIN=go1.23.0 go vet ./...- 固定 Go 1.23、Linux amd64、
CGO_ENABLED=0构建一次性命令 - 生产 dry-run、完整备份、apply、再次 dry-run
- 只读 SQL 核对去重商品数、SKU 数、可售值、未知标记、价格、规格、目标订单映射和任务数量
- 检查
cmautobuy-admin服务状态和本机登录页 HTTP 状态
- 结果:全部自动化测试、静态检查、构建和生产数据核对通过;Admin 服务保持运行,登录页返回 HTTP 200。
- 没验证到的部分:未使用登录后的浏览器人工打开 SYB 详情;采购员尚未为示例订单保存规格映射,未创建真实采购任务,也未执行 Client 真机下单或付款。
遗留问题
采购员需要刷新 SYB 页面,在订单 2608139P0EJWFD 详情中核对并保存目标 PDD 规格映射,之后才能创建采购任务。Client 执行时仍须按现有门禁核对真实 PDD 商品、规格、数量和价格。
相关提交
abc37dbfix: 确认回填PDD规格可用于采购 (#227)