Files
cmautobuy/docs/task/165-修复顺运宝采集任务孤儿状态.md
T

76 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 165 Admin:修复顺运宝采集中孤儿状态并建立任务来源关联
- 类型:缺陷
- 父级大工单:#14
- 所属 MVP / 版本:#15 / 当前 Admin 闭环
- 状态:已完成
- 日期:2026-08-11
- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/165
## 背景与目标
顺运宝订单 `2608100A0SHGN5` 显示“PDD 采集中”,但采集采购模块不存在对应任务。
生产数据确认 PDD 商品仍为 `collecting`、更新时间已超过 15 分钟,按顺运宝明细、
订单号和 PDD 商品 ID 均查不到任务。目标是消除删除任务后的孤儿状态,提供明确恢复
入口,并让从顺运宝创建的采集任务可以按全部来源订单反查。
## 最终方案
- 新增 MySQL v12 `task_syb_sources` 多对多关联表。顺运宝批量创建仍按 PDD 商品去重,
但任务与全部来源明细在同一事务写入;历史任务不做不可靠的来源猜测回填。
- 任务关键字搜索通过来源表匹配顺运宝订单号和明细 ID,列表与状态统计复用同一条件。
- 删除采集任务前记录相关 PDD 商品;删除后若已无 `pending/assigned/claimed` 采集任务,
在同一事务把仍为 `collecting` 的商品回收到 `pending`。有其他有效任务时保持不变。
- 顺运宝上下文同时读取有效采集任务事实。`collecting` 超过 15 分钟、没有有效任务或
更新时间损坏时显示“PDD 采集中(超时)”,允许重新创建;正常进行中继续禁止重复。
- `MarkCollecting` 和 `MarkRecollecting` 的原子条件同步支持“无有效任务”恢复,避免页面
提供恢复按钮但服务端仍按更新时间拒绝。
- v12 迁移创建来源表、自检字段/索引/外键及级联规则,并把未删除且没有有效任务的
存量孤儿 `collecting` 安全回收到 `pending`。生产数据库在服务器部署前已由另一处
Admin 连接提前迁移到 v12;本次发布将服务器旧的 v11 二进制切换为兼容 v12 的版本。
## 改了哪些
- `admin/repository/mysql_db.go`:追加 MySQL v12、存量状态修复和完整形状自检。
- `admin/repository/task.go`、`pdd.go`、`syb.go`:来源写入与搜索、删除状态回收、原子
重建条件和有效采集任务查询。
- `admin/service/pdd.go`、`shopee_pdd.go`、`task.go`、`syb.go`:来源聚合、事务编排、
超时阶段和恢复能力。
- `admin/templates/syb/detail_modal.html`:超时状态显示“重新创建采集任务”。
- `admin/**/*_test.go`:覆盖来源去重与搜索、重复创建防护、孤儿恢复、删除回收和 v12 迁移。
- `docs/admin/01-requirements.md`、`03-data-model.md`、`05-ui-specification.md`:同步稳定规则。
## 验收结果
| 验收标准 | 结果 |
|---|---|
| 同一 PDD 商品只建一条任务并保存全部顺运宝来源 | 通过(自动化用例已编写;真实 MySQL 执行环境未提供) |
| 按任一来源订单号或明细 ID 可搜索任务,统计与列表一致 | 通过(自动化用例已编写;真实 MySQL 执行环境未提供) |
| 删除最后有效采集任务回收状态,有其他任务时不回收 | 通过(自动化用例已编写;真实 MySQL 执行环境未提供) |
| 无任务、超时或损坏时间显示明确恢复状态并可重建 | 通过(阶段单测通过;数据库链路用例已编写) |
| 正常未超时且有有效任务时禁止重复创建 | 通过(自动化用例已编写;真实 MySQL 执行环境未提供) |
| MySQL v12 首次建库、v11 升级、重放和错误形状拒绝 | 生产 v12 自检与重启通过;独立 `_test` 用例未执行 |
| Client 四接口和 Admin 固定 Go 1.23 回归 | 通过;未修改 Client 接口契约 |
## 测试
- 执行的命令:在 `admin/` 设置 `GOTOOLCHAIN=go1.23.0` 后执行
`go test ./... -count=1`、`go build ./...`、`go vet ./...`,并执行 `git diff --check`。
- 结果:全部通过;未引入新依赖,模板可以正常解析,代码提交为 `9e32898`。
- 生产部署:构建 Linux amd64 二进制,SHA-256 为
`078723d246cf578104bfe79dcd2fd43eaee6123f33fe46487b636fbb39f8fd88`;部署前备份为
`/opt/cmautobuy/backups/autobuy-before-165-20260811T172735.sql.gz`,权限 `600` 且 gzip
校验通过。服务切换到 `/opt/cmautobuy/releases/9e32898/` 后保持 active/enabled,
仅监听 `127.0.0.1:18080`;本机根路径返回 303,公网登录页返回 200,近期启动错误为 0。
生产 schema 为 v12,`task_syb_sources` 存在,未删除商品中“采集中但无有效任务”的
数量为 0。订单 `2608100A0SHGN5` 在部署后收到 Client 采集失败上报,当前为 `failed`
且无有效任务,可从页面重新创建,不再是孤儿 `collecting`。
- **没验证到的部分**:未在独立 MySQL 8.4 `_test` 库执行数据库型测试。已尝试连接
`autobuy_test`,但线上 `buy` 按安全规则只拥有生产 `autobuy` 权限;本机监听实例为
MySQL 5.7,不符合项目要求。没有在生产 schema 执行清库型测试;尚未使用生产账号
登录浏览器人工核对超时筛选、订单号搜索和重新创建按钮。
## 相关提交
- `9e32898` 修复顺运宝采集任务孤儿状态