Files
cmautobuy/docs/task/226-三个蝦皮Excel回填PDD正式价格.md
T

74 lines
4.9 KiB
Markdown
Raw Normal View History

2026-08-14 16:42:58 +08:00
# 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)