Files
cmautobuy/docs/task/227-确认回填PDD规格可用于采购.md
T
2026-08-14 17:12:17 +08:00

75 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 227 Admin:确认三个 Excel 回填 PDD 规格可用于采购
- 类型:缺陷
- 父级大工单:#14
- 所属 MVP / 版本:#15 / Admin 四模块可用闭环后续数据修复
- 状态:已完成
- 日期:2026-08-14
- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/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=1`
- `GOTOOLCHAIN=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 商品、规格、数量和价格。
## 相关提交
- `abc37db` fix: 确认回填PDD规格可用于采购 (#227)