Admin:用三个蝦皮 Excel 最大价回填关联 PDD 正式价格 #226

Open
opened 2026-08-14 16:28:23 +08:00 by ila · 1 comment
Owner

基本信息

  • 类型:需求
  • 父级大工单:#14
  • 所属 MVP / 版本:#15 / Admin 四模块可用闭环后续数据修复
  • 阶段:生产价格回填

要解决什么

三个已处理蝦皮工作簿包含蝦皮商品价格区间。此前商品目录导入没有提交或保存该价格;qwg8fkb044 店铺关联 PDD 的规格骨架已有颜色尺码,但正式 price_cent 为空,因此仍显示待采集。

用户确认把 Excel 价格按业务公式转换为对应 PDD 的正式价格;采购单生成后仍由人工审核和付款,因此接受该业务换算。成功填价且规格完整的 PDD 商品改为已采集。

仅允许读取以下三个文件,不扩大到其他文件或店铺外数据:

  • shopee_chanpin_1_已处理.xlsx
  • shopee_chanpin_2_已处理.xlsx
  • shopee_chanpin_3_已处理.xlsx

做什么 / 不做什么

  • 做:按蝦皮商品聚合 Excel“价格”列,解析区间并取最大台币价格;除以 10 后换算为人民币分。
  • 做:同一个 PDD 被多个蝦皮商品关联时,取所有来源商品最大值���的最大值,保证结果与处理顺序无关。
  • 做:只对有效关联、现有规格完整、所有 price_cent 均为空且未被真实价格覆盖的 PDD 商品填充所有规格的 price_cent,并改为 collect_status=collected。
  • 做:执行前 dry-run,应用前生成本机权限受限的原值备份;事务更新并使用原值乐观锁;应用后复核示例和汇总。
  • 不做:不新增数据库字段或表;不把蝦皮价格写入其他无关字段;不修改三个文件之外的商品;不覆盖任何非空 PDD 价格;不自动创建采购单、登录或付款。

怎么做

  • 增加一次性 Go 命令,使用 --dir 读取目录下且仅允许存在于白名单中的三个固定文件名;缺一、重复或文件名不匹配立即停止。
  • 使用十进制定点计算:每件蝦皮商品取价格区间最大值,同 PDD 再取最大值;人民币分按 台币最大值 ÷ 10 × 100 四舍五入到整数分。例如 249 → 2490 分。
  • 读取 Excel 中的蝦皮商品 ID、货源 PDD 商品 ID、店铺和价格;只处理店铺 qwg8fkb044,并验证同一蝦皮商品只关联一个 PDD。
  • 只更新 spec_source=shopee_backfill、skus 非空且每个规格选项有效、所有正式价格为空的活动 PDD。已有任意非空价格、已删除、JSON 异常或规格不完整时整件跳过并统计原因。
  • 写入每个 SKU 的 price_cent,保留 list_price_cent 和库存字段原值;同时设置 collect_status=collected、清理旧采集失败信息、写入 collected_at/updated_at。
  • 备份至少包含 PDD 商品 ID、原 skus_json、状态、采集时间、错误和更新时间;apply 使用单事务和原值乐观锁,任一目标变化则整批回滚。
  • 预计修改:admin/cmd/backfill-xlsx-pdd-prices/、admin/service/、admin/repository/ 及对应测试;不修改正式页面和数据库结构。

验收标准

  • 工具只接受目录中的三个指定 Excel,缺失、重复或额外文件参数均不能进入应用。
  • 价格区间正确取最大值并按公式转换;249 得到 2490 人民币分。
  • 同 PDD 多蝦皮来源价格不同时取全局最大值,结果与文件和行顺序无关。
  • 只更新 qwg8fkb044、有效关联、规格完整且所有正式价格为空的 PDD 商品。
  • 所有目标 SKU 得到正式 price_cent,商品状态改为 collected;列表价和库存字段保持原值。
  • 已有非空价格、已删除、异常 JSON、规格不完整和非目标数据不被覆盖。
  • dry-run 不写库;apply 前生成 0600 原值备份,事务及乐观锁失败时整批回滚。
  • 生产执行后示例 24948397488 → 763183548813 的 4 个 PDD SKU 价格均为 2490 分且状态为 collected。
  • 生产复核更新数与 dry-run 候选数一致,三个文件之外的数据未变化。

怎么验证

从 admin/ 执行:

go test ./... -count=1
go run ./cmd/backfill-xlsx-pdd-prices --dir ../raw_data
go run ./cmd/backfill-xlsx-pdd-prices --dir ../raw_data --apply

生产先执行 dry-run,保存数据库完整备份,再显式 --apply;随后使用只读 SQL 核对状态、非空价格数量和示例商品。

风险和回退

  • 该价格由蝦皮台币价格按用户确认公式换算,不是 Android 实采 PDD 价格。业务接受依据是下单后仍由人工审核和付款;本工具不得触发自动付款。
  • 若同 PDD 被多个蝦皮商品共用,统一取最大值,避免低估和顺序覆盖。
  • 已有 PDD 正式价格一律不覆盖,避免破坏真实采集结果。
  • 应用前保存生产库完整备份和逐商品原值备份。异常时按备份恢复 skus_json、状态、采集时间、错误和更新时间,并再次只读复核。
## 基本信息 - 类型:需求 - 父级大工单:#14 - 所属 MVP / 版本:#15 / Admin 四模块可用闭环后续数据修复 - 阶段:生产价格回填 ## 要解决什么 三个已处理蝦皮工作簿包含蝦皮商品价格区间。此前商品目录导入没有提交或保存该价格;`qwg8fkb044` 店铺关联 PDD 的规格骨架已有颜色尺码,但正式 `price_cent` 为空,因此仍显示待采集。 用户确认把 Excel 价格按业务公式转换为对应 PDD 的正式价格;采购单生成后仍由人工审核和付款,因此接受该业务换算。成功填价且规格完整的 PDD 商品改为已采集。 仅允许读取以下三个文件,不扩大到其他文件或店铺外数据: - `shopee_chanpin_1_已处理.xlsx` - `shopee_chanpin_2_已处理.xlsx` - `shopee_chanpin_3_已处理.xlsx` ## 做什么 / 不做什么 - 做:按蝦皮商品聚合 Excel“价格”列,解析区间并取最大台币价格;除以 10 后换算为人民币分。 - 做:同一个 PDD 被多个蝦皮商品关联时,取所有来源商品最大值���的最大值,保证结果与处理顺序无关。 - 做:只对有效关联、现有规格完整、所有 `price_cent` 均为空且未被真实价格覆盖的 PDD 商品填充所有规格的 `price_cent`,并改为 `collect_status=collected`。 - 做:执行前 dry-run,应用前生成本机权限受限的原值备份;事务更新并使用原值乐观锁;应用后复核示例和汇总。 - 不做:不新增数据库字段或表;不把蝦皮价格写入其他无关字段;不修改三个文件之外的商品;不覆盖任何非空 PDD 价格;不自动创建采购单、登录或付款。 ## 怎么做 - 增加一次性 Go 命令,使用 `--dir` 读取目录下且仅允许存在于白名单中的三个固定文件名;缺一、重复或文件名不匹配立即停止。 - 使用十进制定点计算:每件蝦皮商品取价格区间最大值,同 PDD 再取最大值;人民币分按 `台币最大值 ÷ 10 × 100` 四舍五入到整数分。例如 `249 → 2490` 分。 - 读取 Excel 中的蝦皮商品 ID、货源 PDD 商品 ID、店铺和价格;只处理店铺 `qwg8fkb044`,并验证同一蝦皮商品只关联一个 PDD。 - 只更新 `spec_source=shopee_backfill`、`skus` 非空且每个规格选项有效、所有正式价格为空的活动 PDD。已有任意非空价格、已删除、JSON 异常或规格不完整时整件跳过并统计原因。 - 写入每个 SKU 的 `price_cent`,保留 `list_price_cent` 和库存字段原值;同时设置 `collect_status=collected`、清理旧采集失败信息、写入 `collected_at/updated_at`。 - 备份至少包含 PDD 商品 ID、原 `skus_json`、状态、采集时间、错误和更新时间;apply 使用单事务和原值乐观锁,任一目标变化则整批回滚。 - 预计修改:`admin/cmd/backfill-xlsx-pdd-prices/`、`admin/service/`、`admin/repository/` 及对应测试;不修改正式页面和数据库结构。 ## 验收标准 - [x] 工具只接受目录中的三个指定 Excel,缺失、重复或额外文件参数均不能进入应用。 - [x] 价格区间正确取最大值并按公式转换;`249` 得到 `2490` 人民币分。 - [x] 同 PDD 多蝦皮来源价格不同时取全局最大值,结果与文件和行顺序无关。 - [x] 只更新 `qwg8fkb044`、有效关联、规格完整且所有正式价格为空的 PDD 商品。 - [x] 所有目标 SKU 得到正式 `price_cent`,商品状态改为 `collected`;列表价和库存字段保持原值。 - [x] 已有非空价格、已删除、异常 JSON、规格不完整和非目标数据不被覆盖。 - [x] dry-run 不写库;apply 前生成 0600 原值备份,事务及乐观锁失败时整批回滚。 - [x] 生产执行后示例 `24948397488 → 763183548813` 的 4 个 PDD SKU 价格均为 `2490` 分且状态为 `collected`。 - [x] 生产复核更新数与 dry-run 候选数一致,三个文件之外的数据未变化。 ## 怎么验证 从 `admin/` 执行: ```powershell go test ./... -count=1 go run ./cmd/backfill-xlsx-pdd-prices --dir ../raw_data go run ./cmd/backfill-xlsx-pdd-prices --dir ../raw_data --apply ``` 生产先执行 dry-run,保存数据库完整备份,再显式 `--apply`;随后使用只读 SQL 核对状态、非空价格数量和示例商品。 ## 风险和回退 - 该价格由蝦皮台币价格按用户确认公式换算,不是 Android 实采 PDD 价格。业务接受依据是下单后仍由人工审核和付款;本工具不得触发自动付款。 - 若同 PDD 被多个蝦皮商品共用,统一取最大值,避免低估和顺序覆盖。 - 已有 PDD 正式价格一律不覆盖,避免破坏真实采集结果。 - 应用前保存生产库完整备份和逐商品原值备份。异常时按备份恢复 `skus_json`、状态、采集时间、错误和更新时间,并再次只读复核。
Author
Owner

实施完成,待用户验收

  • 实现提交:7055519(feat: 回填三个Excel关联PDD正式价格 (#226))
  • 归档提交:9d4974d(docs: 归档任务 #226)
  • 归档:docs/task/226-三个蝦皮Excel回填PDD正式价格.md

验证结果

  • go test ./... -count=1:通过
  • go vet ./...:通过
  • Linux amd64 构建:通过
  • 生产 dry-run:候选 1,735 个 PDD、27,537 个 SKU
  • 生产 apply:实际更新 1,735 个 PDD、27,537 个 SKU
  • apply 后再次 dry-run:候选为 0
  • 示例 24948397488 → 763183548813:4 个 SKU 均为 2490 分,商品状态为 collected
  • 被更新 SKU:正式价格空值 0;list_price_cent 未被写入;可售状态保持 unknown
  • 跳过:原已采集 6 个、规格为空或 JSON 无效 141 个、规格来源不符合条件 1 个
  • 非目标店铺关联 PDD 的数量与价格校验和执行前后一致
  • cmautobuy-admin 保持运行,本机登录页返回 HTTP 200

备份与清理

  • 完整业务库备份:/opt/cmautobuy/backups/autobuy-before-226-20260814T083844Z-notablespaces.sql.gz,gzip 完整性检查通过
  • 逐商品回退备份:/tmp/cmautobuy_xlsx_price_backup_509969788.json,1,735 项,权限 0600
  • 上传到服务器的临时 Excel 副本已删除

未验证

未使用登录后的浏览器逐项检查 PDD 列表;未创建真实采购任务、未进行 Client 真机采集,也未执行下单或付款。

## 实施完成,待用户验收 - 实现提交:`7055519`(`feat: 回填三个Excel关联PDD正式价格 (#226)`) - 归档提交:`9d4974d`(`docs: 归档任务 #226`) - 归档:`docs/task/226-三个蝦皮Excel回填PDD正式价格.md` ### 验证结果 - `go test ./... -count=1`:通过 - `go vet ./...`:通过 - Linux amd64 构建:通过 - 生产 dry-run:候选 1,735 个 PDD、27,537 个 SKU - 生产 apply:实际更新 1,735 个 PDD、27,537 个 SKU - apply 后再次 dry-run:候选为 0 - 示例 `24948397488 → 763183548813`:4 个 SKU 均为 `2490` 分,商品状态为 `collected` - 被更新 SKU:正式价格空值 0;`list_price_cent` 未被写入;可售状态保持 `unknown` - 跳过:原已采集 6 个、规格为空或 JSON 无效 141 个、规格来源不符合条件 1 个 - 非目标店铺关联 PDD 的数量与价格校验和执行前后一致 - `cmautobuy-admin` 保持运行,本机登录页返回 HTTP 200 ### 备份与清理 - 完整业务库备份:`/opt/cmautobuy/backups/autobuy-before-226-20260814T083844Z-notablespaces.sql.gz`,gzip 完整性检查通过 - 逐商品回退备份:`/tmp/cmautobuy_xlsx_price_backup_509969788.json`,1,735 项,权限 `0600` - 上传到服务器的临时 Excel 副本已删除 ### 未验证 未使用登录后的浏览器逐项检查 PDD 列表;未创建真实采购任务、未进行 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#226