Admin:允许已采集 PDD 商品明确重新采集 #121

Closed
opened 2026-08-10 19:34:12 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#14
  • 所属 MVP / 版本:#15 Admin 四模块可用闭环
  • 阶段:PDD 商品数据与采集任务分配
  • 依赖:复用现有普通采集任务创建、客户端可见范围和采集超时规则

要解决什么

PDD 商品详情弹窗对已采集商品显示“重新采集”,但按钮仍提交普通 POST /pdd/collect。普通批量采集规则会跳过 collected,因此不会向任务表插入记录,“采集采购”模块也看不到新任务。

复现步骤:

  1. 打开一条状态为“已采集”的 PDD 商品详情。
  2. 点击“重新采集”。
  3. 页面提示该商品已采集并跳过。
  4. “采集采购”列表中没有新的采集任务。

做什么 / 不做什么

  • 做:
    • 为商品详情“重新采集”建立明确、独立的服务端语义。
    • 允许已采集商品保留旧标题、规格和价格数据的同时进入 collecting 并创建新采集任务。
    • 继续阻止未超时的 collecting 商品重复创建任务。
    • 继续允许 failed 和超时 collecting 恢复采集。
    • 保留当前账号的 Client 可见范围校验和可选指定客户端能力。
    • 给操作员准确区分“创建成功”和“已有任务正在采集”。
  • 不做:
    • 不修改普通批量“创建采集任务”跳过已采集商品的规则。
    • 不提前清空或覆盖旧采集结果;只有 Client 成功提交后才由现有结果写入逻辑覆盖。
    • 不修改数据库结构、Client 四接口、Android 自动化或采购下单流程。
    • 不自动触发采集。

怎么做

  1. 在 admin/repository/pdd.go 增加专用于重新采集的原子状态占用方法:允许 collected、pending、failed 和超时 collecting 进入 collecting;未超时 collecting 返回不允许。
  2. 在 admin/service/pdd.go 增加单商品重新采集服务,复用商品存在性、Client 可见范围、事务和任务插入规则;不复用会跳过 collected 的批量入口。
  3. 在 admin/handler/web/pdd.go 和路由中增加独立 POST 入口;详情表单改投该入口,并允许按现有规则选择/默认不指定 Client。
  4. 重新采集仅更新状态和创建任务,不清空 title、shop_name、skus_json、collected_at。
  5. 增加 Repository、Service、Handler/页面回归测试;更新 Admin 稳定需求说明。

预计修改文件:

  • admin/repository/pdd.go
  • admin/service/pdd.go
  • admin/handler/web/pdd.go
  • Admin ���由文件
  • admin/templates/pdd/edit_modal.html
  • 相邻测试与必要的 docs/admin/ 文档
  • 完成后归档 docs/task/<工单号>-admin-pdd已采集商品重新采集.md

验收标准

  • 已采集商品点击“重新采集”后创建且只创建一条采集任务。
  • 新任务出现在“采集采购”模块,商品状态变为“采集中”。
  • 创建任务时旧标题、规格、价格和采集时间仍保留可查看。
  • 未超时的采集中商品再次点击时不创建重复任务,并明确提示正在采集。
  • 失败或超时采集状态仍可重新创建任务。
  • 普通批量“创建采集任务”仍跳过已采集商品。
  • 伪造不可见 Client 时整次请求失败且不改变商品状态、不创建任务。
  • 不修改数据库结构和 Client 四接口。
  • Go build、test、vet 通过。

怎么验证

从 admin/ 目录执行:

$env:GOTOOLCHAIN='go1.23.0'
gofmt -l .
go build ./...
go test ./... -count=1
go vet ./...
Remove-Item Env:GOTOOLCHAIN

人工验证:使用一条已有规格数据的已采集商品点击“重新采集”,立即检查旧详情仍可查看、状态为采集中且“采集采购”出现一条任务;在任务完成前再次点击,确认不产生第二条任务。

风险和回退

  • 风险:重复点击产生并发任务。通过事务内条件更新原子占用状态,只有一个请求能成功。
  • 风险:重采开始时清空旧结果影响规格匹配和采购判断。本工单禁止提前清空,成功结果提交后才覆盖。
  • 风险:指定越权 Client。服务端继续按当前账号可见范围验证。
  • 回退:回退本工单代码即可;无数据库迁移。已创建的采集任务按现有任务状态继续执行。
## 基本信息 - 类型:缺陷 - 父级大工单:#14 - 所属 MVP / 版本:#15 Admin 四模块可用闭环 - 阶段:PDD 商品数据与采集任务分配 - 依赖:复用现有普通采集任务创建、客户端可见范围和采集超时规则 ## 要解决什么 PDD 商品详情弹窗对已采集商品显示“重新采集”,但按钮仍提交普通 `POST /pdd/collect`。普通批量采集规则会跳过 `collected`,因此不会向任务表插入记录,“采集采购”模块也看不到新任务。 复现步骤: 1. 打开一条状态为“已采集”的 PDD 商品详情。 2. 点击“重新采集”。 3. 页面提示该商品已采集并跳过。 4. “采集采购”列表中没有新的采集任务。 ## 做什么 / 不做什么 - 做: - 为商品详情“重新采集”建立明确、独立的服务端语义。 - 允许已采集商品保留旧标题、规格和价格数据的同时进入 `collecting` 并创建新采集任务。 - 继续阻止未超时的 `collecting` 商品重复创建任务。 - 继续允许 `failed` 和超时 `collecting` 恢复采集。 - 保留当前账号的 Client 可见范围校验和可选指定客户端能力。 - 给操作员准确区分“创建成功”和“已有任务正在采集”。 - 不做: - 不修改普通批量“创建采集任务”跳过已采集商品的规则。 - 不提前清空或覆盖旧采集结果;只有 Client 成功提交后才由现有结果写入逻辑覆盖。 - 不修改数据库结构、Client 四接口、Android 自动化或采购下单流程。 - 不自动触发采集。 ## 怎么做 1. 在 `admin/repository/pdd.go` 增加专用于重新采集的原子状态占用方法:允许 `collected`、`pending`、`failed` 和超时 `collecting` 进入 `collecting`;未超时 `collecting` 返回不允许。 2. 在 `admin/service/pdd.go` 增加单商品重新采集服务,复用商品存在性、Client 可见范围、事务和任务插入规则;不复用会跳过 `collected` 的批量入口。 3. 在 `admin/handler/web/pdd.go` 和路由中增加独立 POST 入口;详情表单改投该入口,并允许按现有规则选择/默认不指定 Client。 4. 重新采集仅更新状态和创建任务,不清空 `title`、`shop_name`、`skus_json`、`collected_at`。 5. 增加 Repository、Service、Handler/页面回归测试;更新 Admin 稳定需求说明。 预计修改文件: - `admin/repository/pdd.go` - `admin/service/pdd.go` - `admin/handler/web/pdd.go` - Admin ���由文件 - `admin/templates/pdd/edit_modal.html` - 相邻测试与必要的 `docs/admin/` 文档 - 完成后归档 `docs/task/<工单号>-admin-pdd已采集商品重新采集.md` ## 验收标准 - [x] 已采集商品点击“重新采集”后创建且只创建一条采集任务。 - [x] 新任务出现在“采集采购”模块,商品状态变为“采集中”。 - [x] 创建任务时旧标题、规格、价格和采集时间仍保留可查看。 - [x] 未超时的采集中商品再次点击时不创建重复任务,并明确提示正在采集。 - [x] 失败或超时采集状态仍可重新创建任务。 - [x] 普通批量“创建采集任务”仍跳过已采集商品。 - [x] 伪造不可见 Client 时整次请求失败且不改变商品状态、不创建任务。 - [x] 不修改数据库结构和 Client 四接口。 - [x] Go build、test、vet 通过。 ## 怎么验证 从 `admin/` 目录执行: ```powershell $env:GOTOOLCHAIN='go1.23.0' gofmt -l . go build ./... go test ./... -count=1 go vet ./... Remove-Item Env:GOTOOLCHAIN ``` 人工验证:使用一条已有规格数据的已采集商品点击“重新采集”,立即检查旧详情仍可查看、状态为采集中且“采集采购”出现一条任务;在任务完成前再次点击,确认不产生第二条任务。 ## 风险和回退 - 风险:重复点击产生并发任务。通过事务内条件更新原子占用状态,只有一个请求能成功。 - 风险:重采开始时清空旧结果影响规格匹配和采购判断。本工单禁止提前清空,成功结果提交后才覆盖。 - 风险:指定越权 Client。服务端继续按当前账号可见范围验证。 - 回退:回退本工单代码即可;无数据库迁移。已创建的采集任务按现有任务状态继续执行。
Author
Owner

状态:进行中。

已完成独立 /pdd/recollect 入口、详情页可选客户端、Service 事务编排和 Repository 原子状态占用。普通批量入口保持不变;重新采集只改变状态并创建任务,不清空旧标题、店铺、规格和采集时间。已增加已采集重采、连续点击防重复、越权客户端完整回滚和模板入口测试。正在执行最终全量验证与归档。

状态:进行中。 已完成独立 `/pdd/recollect` 入口、详情页可选客户端、Service 事务编排和 Repository 原子状态占用。普通批量入口保持不变;重新采集只改变状态并创建任务,不清空旧标题、店铺、规格和采集时间。已增加已采集重采、连续点击防重复、越权客户端完整回滚和模板入口测试。正在执行最终全量验证与归档。
Author
Owner

实施完成,等待用户验收

最终实现

  • PDD 详情“重新采集”改走独立 POST /pdd/recollect,不再被普通批量入口的 collected 跳过规则拦截。
  • 已采集商品可原子进入 collecting 并创建一条任务;未超时的采集中商品连续点击不会重复建任务。
  • 重采开始时保留旧标题、店铺、规格、价格和采集时间,Client 成功提交后才覆盖。
  • 详情页可默认不指定 Client,也可选择当前账号可见 Client;伪造不可见 Client 时完整回滚。
  • 普通批量 /pdd/collect 行为保持不变。

验证结果

从 admin/ 执行 Go 1.23.0:

  • gofmt -l:通过
  • go build ./...:通过
  • go test ./... -count=1:全部通过
  • go vet ./...:通过
  • git diff --check:通过

未验证:真实浏览器人工点击、真实 Client 领取并完成重采。

提交与归档

  • 实现提交:546d9ef
  • 归档提交:7e4adf2
  • 归档:docs/task/121-admin-pdd已采集商品重新采集.md

工单保持开启,状态为待验收;父工单 #14、#15 暂不勾选。

## 实施完成,等待用户验收 ### 最终实现 - PDD 详情“重新采集”改走独立 `POST /pdd/recollect`,不再被普通批量入口的 `collected` 跳过规则拦截。 - 已采集商品可原子进入 `collecting` 并创建一条任务;未超时的采集中商品连续点击不会重复建任务。 - 重采开始时保留旧标题、店铺、规格、价格和采集时间,Client 成功提交后才覆盖。 - 详情页可默认不指定 Client,也可选择当前账号可见 Client;伪造不可见 Client 时完整回滚。 - 普通批量 `/pdd/collect` 行为保持不变。 ### 验证结果 从 `admin/` 执行 Go 1.23.0: - `gofmt -l`:通过 - `go build ./...`:通过 - `go test ./... -count=1`:全部通过 - `go vet ./...`:通过 - `git diff --check`:通过 未验证:真实浏览器人工点击、真实 Client 领取并完成重采。 ### 提交与归档 - 实现提交:`546d9ef` - 归档提交:`7e4adf2` - 归档:`docs/task/121-admin-pdd已采集商品重新采集.md` 工单保持开启,状态为待验收;父工单 #14、#15 暂不勾选。
Author
Owner

用户已明确验收通过。验收清单已回填,本工单关闭。

用户已明确验收通过。验收清单已回填,本工单关闭。
ila closed this issue 2026-08-10 23:25:10 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#121