diff --git a/docs/task/226-三个蝦皮Excel回填PDD正式价格.md b/docs/task/226-三个蝦皮Excel回填PDD正式价格.md new file mode 100644 index 0000000..7f4207b --- /dev/null +++ b/docs/task/226-三个蝦皮Excel回填PDD正式价格.md @@ -0,0 +1,73 @@ +# 226 Admin:用三个蝦皮 Excel 最大价回填关联 PDD 正式价格 + +- 类型:需求 +- 父级大工单:#14 +- 所属 MVP / 版本:#15 +- 状态:已完成 +- 日期:2026-08-14 +- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/226 + +## 背景与目标 + +三个已处理 Excel 中包含蝦皮商品价格及蝦皮与 PDD 商品的关联。目标是仅针对这些文件中 `qwg8fkb044` 店铺的数据,按价格区间最大值换算人民币价格,回填到符合安全条件的 PDD SKU;回填成功后将 PDD 商品状态改为已采集,以便进入后续人工审核和采购流程。 + +## 最终方案 + +- 新增一次性命令 `backfill-xlsx-pdd-prices`,只读取固定白名单中的三个 Excel 文件,不接受任意文件名。 +- 每个蝦皮商品取价格区间最大值;多个蝦皮商品关联同一 PDD 商品时,再取全局最大值。 +- 按 `台币价格 ÷ 10 × 100` 换算为人民币分,使用正数四舍五入。例如 `249` 回填为 `2490` 分。 +- 只更新未删除、规格来源为 `shopee_backfill`、规格 JSON 有效且全部 SKU 尚无正式价格、可售状态仍为未知、采集状态为待采集或采集失败的 PDD 商品。 +- 写入每个 SKU 的 `price_cent`,保留 `list_price_cent`、库存和可售状态;同时把商品改为 `collected`,清除原采集错误和产物字段并记录采集时间。 +- 已有正式价格、已采集、规格来源不同、规格为空或 JSON 无效的数据全部跳过,不新增字段或数据表。 +- 更新使用单事务和原值乐观锁;任意一行冲突时整批回滚。正式执行前保留完整数据库备份和逐商品回退备份。 +- Excel 价格只作为本次计算来源。当前蝦皮商品表没有正式价格字段,因此不向蝦皮表增加价格字段,也不触发真实下单或付款。 + +## 改了哪些 + +- `admin/cmd/backfill-xlsx-pdd-prices/main.go`:新增固定文件、默认预演、显式执行、备份和结果汇总的一次性工具。 +- `admin/repository/price_backfill.go`:新增候选数据查询和带乐观锁的事务更新。 +- `admin/service/xlsx_price_backfill.go`:实现 Excel 解析、价格换算、共享 PDD 去重取最大值、安全候选判定和回填计划。 +- `admin/service/xlsx_price_backfill_test.go`:覆盖价格解析、白名单、店铺过滤、共享关联、安全跳过、字段保留和事务回滚。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 仅处理三个指定 Excel 中 `qwg8fkb044` 店铺的数据 | 通过 | +| 价格区间取最大值,共享 PDD 再取全局最大值,并按约定换算为分 | 通过 | +| 只更新安全候选,不覆盖任何已有正式价格 | 通过 | +| 回填 `price_cent` 后把 PDD 商品状态改为已采集 | 通过 | +| 保留标价、库存和可售状态,不新增字段或表 | 通过 | +| 默认预演,正式执行具备备份、事务和冲突回滚 | 通过 | +| 生产执行后不存在仍可回填的候选数据 | 通过 | + +生产执行结果: + +- Excel 共读取 33,049 行,解析到 2,075 个蝦皮商品和 1,883 个关联 PDD 商品。 +- 实际更新 1,735 个 PDD 商品、27,537 个 SKU;所有被更新 SKU 均已填写 `price_cent`,对应 PDD 商品均为已采集。 +- 蝦皮商品 `24948397488` 关联的 PDD 商品 `763183548813` 已回填为 `2490` 分,并改为已采集。 +- 跳过 6 个原本已采集商品、141 个规格为空或 JSON 无效商品、1 个规格来源不符合条件的商品。 +- 非目标店铺的 22 个关联 PDD 商品在执行前后数量和价格校验和一致。 +- 完整业务库备份:`/opt/cmautobuy/backups/autobuy-before-226-20260814T083844Z-notablespaces.sql.gz`,已通过 gzip 完整性检查。 +- 逐商品回退备份:`/tmp/cmautobuy_xlsx_price_backup_509969788.json`,共 1,735 项,权限为 `0600`。 +- 服务器上的临时 Excel 副本已删除;一次性程序保留在 `/opt/cmautobuy/maintenance/226-7055519`。 + +## 测试 + +- 执行的命令: + - `cd admin && go test ./... -count=1` + - `cd admin && go vet ./...` + - Linux amd64 交叉编译一次性程序 + - 生产环境先 dry-run,再执行 `./backfill-xlsx-pdd-prices -dir ./input -apply`,随后再次 dry-run + - 查询生产数据库核对商品数、SKU 数、空价格、标价、可售状态、目标示例和非目标店铺校验和 + - 检查 `cmautobuy-admin` 服务状态和本机 `/login` HTTP 状态 +- 结果:全部通过。执行后再次预演候选数为 0;Admin 服务保持运行,登录页返回 HTTP 200。 +- **没验证到的部分**:未使用登录后的浏览器逐项查看 PDD 列表;未创建真实采购任务、未在 Client 真机采集,也未执行下单或付款。 + +## 遗留问题 + +141 个规格为空或 JSON 无效的 PDD 商品以及 1 个非 `shopee_backfill` 规格来源的商品未被本次回填修改,需按其各自数据问题另行处理。 + +## 相关提交 + +- `7055519` feat: 回填三个Excel关联PDD正式价格 (#226)