Admin:修复顺运宝采集中孤儿状态并建立任务来源关联 #165

Closed
opened 2026-08-11 16:44:51 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#14
  • 所属 MVP / 版本:#15 / 当前 Admin 闭环
  • 阶段:顺运宝到 PDD 采集任务状态一致性

要解决什么

顺运宝订单 2608100A0SHGN5 在顺运宝页面显示“PDD 采集中”,但采集采购模块按顺运宝订单号、顺运宝明细 ID 和 PDD 商品 ID 均找不到对应任务。已确认该 PDD 商品的 collect_status=collecting 已超过 15 分钟,且数据库中不存在任何关联采集任务。

复现路径:

  1. 从顺运宝明细创建 PDD 采集任务。
  2. 在采集采购模块删除该任务,或出现历史孤儿状态。
  3. 返回顺运宝列表,仍显示“PDD 采集中”,无法判断对应任务,也缺少明确恢复入口。
  4. 在采集采购模块输入顺运宝订单号,无法找到从该明细创建的采集任务。

根因是任务删除和 PDD 采集状态没有一起回收;顺运宝阶段只读取 PDD 商品状态,不核对有效采集任务和超时时间;从顺运宝批量去重创建任务时没有保存一个任务对应一个或多个顺运宝明细的来源关系。

做什么 / 不做什么

  • 做:新增采集任务与顺运���明细的多对多来源关联;从顺运宝创建任务时在同一事务中保存全部来源。
  • 做:采集采购模块的关键字搜索支持顺运宝订单号和顺运宝明细 ID。
  • 做:删除采集任务后,若同一 PDD 商品已无其他有效采集任务,则在同一事务中把孤立的 collecting 回收到 pending。
  • 做:顺运宝页面把超时或无有效任务的 collecting 明确显示为“PDD 采集中(超时)”,并允许重新创建采集任务。
  • 做:MySQL 新版本迁移创建来源表,并安全修复“collecting 但没有有效任务”的存量孤儿状态。
  • 不做:不推断或回填历史任务的顺运宝来源;不修改 Client 四接口;不自动删除、取消或重派仍存在的任务;不改变采集结果结构。

怎么做

  1. admin/repository/mysql_db.go 追加可重放并带形状自检的 MySQL 迁移,创建 task_syb_sources(task_id, syb_id, created_at),以 (task_id, syb_id) 为主键并建立顺运宝明细反查索引;迁移只回收没有有效采集任务的孤儿 collecting 商品。
  2. admin/repository/task.go 增加来源批量写入、按顺运宝订单号/明细 ID 搜索、删除前查询相关 PDD 商品及删除后有效任务检查、条件回收状态的仓储方法。
  3. admin/service/shopee_pdd.go 保留批量按 PDD 商品去重,但同时聚合同一商品的全部顺运宝明细,在建任务事务内写入来源关系。
  4. admin/service/task.go 将任务删除和孤立采集状态回收放在同一事务中。
  5. admin/repository/syb.go / admin/service/syb.go 在顺运宝上下文中核对有效采集任务及更新时间,增加显式超时阶段和恢复动作;错误状态靠文字与动作表达,不只依赖颜色。
  6. 补充 repository/service/MySQL 迁移测试,并同步数据模型、界面规范等受影响的稳定文档。

验收标准

  • 从两个指向同一 PDD 商品的顺运宝明细批量创建时只生成一条采集任务,并保存两条来源关系。
  • 采集采购模块使用任一来源的顺运宝订单号或明细 ID,均能搜索到对应采集任务,列表统计与筛选结果一致。
  • 删除某商品最后一条有效采集任务后,该商品的 collect_status 从 collecting 原子回收到 pending;仍有其他有效任务时不回收。
  • 顺运宝明细处于 collecting 但无有效任务或已超过 15 分钟时,显示“PDD 采集中(超时)”并提供重新创建采集任务入口。
  • 正常未超时且存在有效任务的明细继续显示“PDD 采集中”,不得重复创建。
  • MySQL v12 首次建库、从 v11 升级、中断后重放和重复启动均通过自检;迁移能修复无有效任务的存量孤儿状态且不影响有任务的商品。
  • Client 四接口及既有 PDD/顺运宝/任务回归测试通过。

怎么验证

从 admin/ 执行:

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

使用库名以 _test 结尾的 MySQL 8.4 隔离测试库执行:

$env:CMAUTOBUY_MYSQL_TEST="1"
go test ./repository -run "TestMySQLMigrate" -count=1
Remove-Item Env:CMAUTOBUY_MYSQL_TEST

浏览器验证:用两个映射到同一 PDD 商品的顺运宝明细批量建任务,分别按两个订单号搜索;删除最后一条任务后返回顺运宝页面,确认出现可恢复状态并可重新创建。

风险和回退

  • 数据库风险:MySQL DDL 会隐式提交,迁移必须逐项检查后创建、自检通过后才记录 v12;失败时保留未记录版本并允许重跑,不修改已发布 v1-v11。
  • 并发风险:删除与状态回收必须在事务中执行;回收前再次确认不存在 pending/assigned/claimed 的同商品采集任务,避免覆盖仍在执行的状态。
  • 兼容风险:来源表只记录新建任务,不伪造历史来源;旧任务仍可按任务号和 PDD 商品 ID 搜索。
  • 回退:应用代码可回退;来源表为附加数据,回退旧程序不会读取它。状态修复只将无任务的孤儿 collecting 改为 pending,允许重新采集,不删除已采集详情。
## 基本信息 - 类型:缺陷 - 父级大工单:#14 - 所属 MVP / 版本:#15 / 当前 Admin 闭环 - 阶段:顺运宝到 PDD 采集任务状态一致性 ## 要解决什么 顺运宝订单 `2608100A0SHGN5` 在顺运宝页面显示“PDD 采集中”,但采集采购模块按顺运宝订单号、顺运宝明细 ID 和 PDD 商品 ID 均找不到对应任务。已确认该 PDD 商品的 `collect_status=collecting` 已超过 15 分钟,且数据库中不存在任何关联采集任务。 复现路径: 1. 从顺运宝明细创建 PDD 采集任务。 2. 在采集采购模块删除该任务,或出现历史孤儿状态。 3. 返回顺运宝列表,仍显示“PDD 采集中”,无法判断对应任务,也缺少明确恢复入口。 4. 在采集采购模块输入顺运宝订单号,无法找到从该明细创建的采集任务。 根因是任务删除和 PDD 采集状态没有一起回收;顺运宝阶段只读取 PDD 商品状态,不核对有效采集任务和超时时间;从顺运宝批量去重创建任务时没有保存一个任务对应一个或多个顺运宝明细的来源关系。 ## 做什么 / 不做什么 - 做:新增采集任务与顺运���明细的多对多来源关联;从顺运宝创建任务时在同一事务中保存全部来源。 - 做:采集采购模块的关键字搜索支持顺运宝订单号和顺运宝明细 ID。 - 做:删除采集任务后,若同一 PDD 商品已无其他有效采集任务,则在同一事务中把孤立的 `collecting` 回收到 `pending`。 - 做:顺运宝页面把超时或无有效任务的 `collecting` 明确显示为“PDD 采集中(超时)”,并允许重新创建采集任务。 - 做:MySQL 新版本迁移创建来源表,并安全修复“collecting 但没有有效任务”的存量孤儿状态。 - 不做:不推断或回填历史任务的顺运宝来源;不修改 Client 四接口;不自动删除、取消或重派仍存在的任务;不改变采集结果结构。 ## 怎么做 1. `admin/repository/mysql_db.go` 追加可重放并带形状自检的 MySQL 迁移,创建 `task_syb_sources(task_id, syb_id, created_at)`,以 `(task_id, syb_id)` 为主键并建立顺运宝明细反查索引;迁移只回收没有有效采集任务的孤儿 `collecting` 商品。 2. `admin/repository/task.go` 增加来源批量写入、按顺运宝订单号/明细 ID 搜索、删除前查询相关 PDD 商品及删除后有效任务检查、条件回收状态的仓储方法。 3. `admin/service/shopee_pdd.go` 保留批量按 PDD 商品去重,但同时聚合同一商品的全部顺运宝明细,在建任务事务内写入来源关系。 4. `admin/service/task.go` 将任务删除和孤立采集状态回收放在同一事务中。 5. `admin/repository/syb.go` / `admin/service/syb.go` 在顺运宝上下文中核对有效采集任务及更新时间,增加显式超时阶段和恢复动作;错误状态靠文字与动作表达,不只依赖颜色。 6. 补充 repository/service/MySQL 迁移测试,并同步数据模型、界面规范等受影响的稳定文档。 ## 验收标准 - [ ] 从两个指向同一 PDD 商品的顺运宝明细批量创建时只生成一条采集任务,并保存两条来源关系。 - [ ] 采集采购模块使用任一来源的顺运宝订单号或明细 ID,均能搜索到对应采集任务,列表统计与筛选结果一致。 - [ ] 删除某商品最后一条有效采集任务后,该商品的 `collect_status` 从 `collecting` 原子回收到 `pending`;仍有其他有效任务时不回收。 - [ ] 顺运宝明细处于 `collecting` 但无有效任务或已超过 15 分钟时,显示“PDD 采集中(超时)”并提供重新创建采集任务入口。 - [ ] 正常未超时且存在有效任务的明细继续显示“PDD 采集中”,不得重复创建。 - [ ] MySQL v12 首次建库、从 v11 升级、中断后重放和重复启动均通过自检;迁移能修复无有效任务的存量孤儿状态且不影响有任务的商品。 - [ ] Client 四接口及既有 PDD/顺运宝/任务回归测试通过。 ## 怎么验证 从 `admin/` 执行: ```powershell $env:GOTOOLCHAIN="go1.23.0" go test ./... -count=1 go build ./... go vet ./... Remove-Item Env:GOTOOLCHAIN ``` 使用库名以 `_test` 结尾的 MySQL 8.4 隔离测试库执行: ```powershell $env:CMAUTOBUY_MYSQL_TEST="1" go test ./repository -run "TestMySQLMigrate" -count=1 Remove-Item Env:CMAUTOBUY_MYSQL_TEST ``` 浏览器验证:用两个映射到同一 PDD 商品的顺运宝明细批量建任务,分别按两个订单号搜索;删除最后一条任务后返回顺运宝页面,确认出现可恢复状态并可重新创建。 ## 风险和回退 - 数据库风险:MySQL DDL 会隐式提交,迁移必须逐项检查后创建、自检通过后才记录 v12;失败时保留未记录版本并允许重跑,不修改已发布 v1-v11。 - 并发风险:删除与状态回收必须在事务中执行;回收前再次确认不存在 `pending/assigned/claimed` 的同商品采集任务,避免覆盖仍在执行的状态。 - 兼容风险:来源表只记录新建任务,不伪造历史来源;旧任务仍可按任务号和 PDD 商品 ID 搜索。 - 回退:应用代码可回退;来源表为附加数据,回退旧程序不会读取它。状态修复只将无任务的孤儿 `collecting` 改为 `pending`,允许重新采集,不删除已采集详情。
Author
Owner

实施完成,状态:待验收

已按确认方案完成:

  • MySQL v12 新增 task_syb_sources,保存一条采集任务的多个顺运宝明细来源;迁移包含孤儿 collecting 回收和字段、索引、外键、级联规则自检。
  • 顺运宝批量创建按 PDD 商品去重的同时原子保存全部来源;任务列表支持按来源顺运宝订单号/明细 ID 搜索。
  • 删除采集任务后,仅在同商品已无其他有效任务时原子回收为 pending。
  • 顺运宝增加“PDD 采集中(超时)”及“重新创建采集任务”;无有效任务、超过 15 分钟或更新时间损坏均可恢复,正常进行中继续防重复。
  • 已同步需求、数据模型和界面规范,并归档任务文档。

验证:固定 Go 1.23.0 下 go test ./... -count=1、go build ./...、go vet ./... 和 git diff --check 全部通过。

未验证:真实 MySQL 8.4 _test 测试未执行。已尝试 autobuy_test,线上 buy 账号按安全规则仅有生产 autobuy 权限;本机只有 MySQL 5.7。未使用、清理或迁移生产 schema。v12 的首次建库、v11 升级、重放和错误形状用例已编写,部署前仍需提供独立 MySQL 8.4 测试库执行。

提交:

  • 9e32898 fix: 修复顺运宝采集任务孤儿状态 (#165)
  • f5d91cd docs: 归档任务 #165

归档:docs/task/165-修复顺运宝采集任务孤儿状态.md

## 实施完成,状态:待验收 已按确认方案完成: - MySQL v12 新增 `task_syb_sources`,保存一条采集任务的多个顺运宝明细来源;迁移包含孤儿 `collecting` 回收和字段、索引、外键、级联规则自检。 - 顺运宝批量创建按 PDD 商品去重的同时原子保存全部来源;任务列表支持按来源顺运宝订单号/明细 ID 搜索。 - 删除采集任务后,仅在同商品已无其他有效任务时原子回收为 `pending`。 - 顺运宝增加“PDD 采集中(超时)”及“重新创建采集任务”;无有效任务、超过 15 分钟或更新时间损坏均可恢复,正常进行中继续防重复。 - 已同步需求、数据模型和界面规范,并归档任务文档。 验证:固定 Go 1.23.0 下 `go test ./... -count=1`、`go build ./...`、`go vet ./...` 和 `git diff --check` 全部通过。 未验证:真实 MySQL 8.4 `_test` 测试未执行。已尝试 `autobuy_test`,线上 `buy` 账号按安全规则仅有生产 `autobuy` 权限;本机只有 MySQL 5.7。未使用、清理或迁移生产 schema。v12 的首次建库、v11 升级、重放和错误形状用例已编写,部署前仍需提供独立 MySQL 8.4 测试库执行。 提交: - `9e32898` `fix: 修复顺运宝采集任务孤儿状态 (#165)` - `f5d91cd` `docs: 归档任务 #165` 归档:`docs/task/165-修复顺运宝采集任务孤儿状态.md`
Author
Owner

生产部署完成

  • 发布代码:9e32898
  • 发布目录:/opt/cmautobuy/releases/9e32898/
  • 二进制 SHA-256:078723d246cf578104bfe79dcd2fd43eaee6123f33fe46487b636fbb39f8fd88
  • 部署前备份:/opt/cmautobuy/backups/autobuy-before-165-20260811T172735.sql.gz,权限 600,gzip 校验通过
  • 服务:active / enabled,仅监听 127.0.0.1:18080
  • HTTP:本机根路径 303 到登录页;https://buy.833729.com/login 返回 200
  • 数据库:MySQL 8.4.8,schema v12,task_syb_sources 存在,启动迁移/自检错误为 0
  • 一致性:未删除商品中“collecting 但没有有效采集任务”的记录数为 0

部署前已发现生产 schema 被另一处 Admin 提前推进到 v12,而服务器仍运行只支持 v11 的旧二进制。本次切换消除了旧二进制重启后无法启动的兼容风险。

订单 2608100A0SHGN5 在部署后收到 Client 的实际采集失败上报,当前 PDD 状态为 failed 且没有有效任务;它已不再是孤儿 collecting,页面应显示采集失败并允许重新创建。

仍未执行独立 MySQL 8.4 _test 清库型测试,原因和边界见上一条实施记录;没有拿生产 schema 代替测试库。

部署归档更新提交:b97b108。

## 生产部署完成 - 发布代码:`9e32898` - 发布目录:`/opt/cmautobuy/releases/9e32898/` - 二进制 SHA-256:`078723d246cf578104bfe79dcd2fd43eaee6123f33fe46487b636fbb39f8fd88` - 部署前备份:`/opt/cmautobuy/backups/autobuy-before-165-20260811T172735.sql.gz`,权限 `600`,gzip 校验通过 - 服务:active / enabled,仅监听 `127.0.0.1:18080` - HTTP:本机根路径 303 到登录页;`https://buy.833729.com/login` 返回 200 - 数据库:MySQL 8.4.8,schema v12,`task_syb_sources` 存在,启动迁移/自检错误为 0 - 一致性:未删除商品中“`collecting` 但没有有效采集任务”的记录数为 0 部署前已发现生产 schema 被另一处 Admin 提前推进到 v12,而服务器仍运行只支持 v11 的旧二进制。本次切换消除了旧二进制重启后无法启动的兼容风险。 订单 `2608100A0SHGN5` 在部署后收到 Client 的实际采集失败上报,当前 PDD 状态为 `failed` 且没有有效任务;它已不再是孤儿 `collecting`,页面应显示采集失败并允许重新创建。 仍未执行独立 MySQL 8.4 `_test` 清库型测试,原因和边界见上一条实施记录;没有拿生产 schema 代替测试库。 部署归档更新提交:`b97b108`。
Author
Owner

用户于 2026-08-12 明确验收通过。已确认本地归档 docs/task/165-修复顺运宝采集任务孤儿状态.md 存在,现关闭工单。

用户于 2026-08-12 明确验收通过。已确认本地归档 `docs/task/165-修复顺运宝采集任务孤儿状态.md` 存在,现关闭工单。
ila closed this issue 2026-08-12 10:32:18 +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#165