Client:任务失败不自动重试并继续下一条 #170

Closed
opened 2026-08-11 18:10:56 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / Client 可运行任务闭环
  • 阶段:自动任务队列
  • 状态:待验收

要解决什么

当前采集任务遇到可恢复错误会进入 retry_wait,界面显示“等待重试”,自动获取还会停止。这会让采购人员误以为系统正在倒计时重试,也会让一条坏任务阻塞 Admin 指派给当前 Client 的后续任务。

目标是“一条任务自动执行一次”:任务自身失败后明确显示采集失败或采购失败,不自动重试当前任务;失败信息成功保存并上报 Admin 后继续下一条。只有用户明确点击重新采集或重新采购,才再次执行。

做什么 / 不做什么

  • 做:新发生的普通采集失败不再进入 retry_wait,保存为明确失败状态。
  • 做:自动调度不再选择历史 retry_wait,已有记录作为失败记录保留。
  • 做:任务列表按任务类型显示“采集失败”或“采购失败”,详情保留错误码和失败原因。
  • 做:任务自身失败且失败信息成功上报后,自动获取继续下一条。
  • 做:增加队列测试,验证第一条失败后执行第二条,且失败任务不会被自动再次选择。
  • 做:保留全局阻塞停止条件:设备断开、PDD 登录/验证码/风控、Admin 不可用、用户停止、不可逆采购待核单。
  • 不做:不自动重试任何失败任务。
  • 不做:不删除手动“重新采集/重新采购”入口。
  • 不做:不放宽采购不可逆安全门禁,不自动付款。
  • 不做:不修改 Admin 接口和 pdd_data schema。

已确认的实现方案

  1. 将采集服务默认错误分类从 retry_wait/retryable=true 调整为失败且不自动重试;需要人工判断的规格、登录等仍保留相应错误状态。
  2. Repository 自动待执行查询只选择 claimed,不再把 retry_wait 当作自动候选;已有 retry_wait 不迁移删除,只作为历史失败显示。
  3. 调度结果区分“任务自身失败”和“全局环境失败”。任务失败已成功提交 Admin 后安排下一轮;设备、认证/风控、Admin/Outbox 阻塞等停止。
  4. UI 状态根据 task_type + status 显示中文:采集失败、采购失败;可在详情查看 last_error_message。
  5. 手动重新执行仍通过现有预检创建新执行记录;采购进入过不可逆阶段时继续永久拒绝重新下单。
  6. 增加 Collect/Purchase 服务、Repository、Dispatcher/UI 自动循环回归测试。

预计修改:

  • client/src/collect_task_service.py
  • client/src/task_repository.py
  • client/src/task_models.py 或状态显示相关文件
  • client/src/pdd_ui_event.py
  • 对应 client/test 测试
  • docs/task/<工单号>-失败后继续下一任务.md

验收标准

  • 新采集失败不再显示“等待重试”,任务列表显示“采集失败”。
  • 采购失败显示“采购失败”,失败原因仍可在详情查看。
  • 一条任务自身失败且失败信息成功上报后,自动执行下一条。
  • 同一失败任务不会被自动再次执行。
  • 只有用户手动重新采集或重新采购才允许再次执行,并继续通过现有安全预检。
  • 设备断开、登录/验证码/风控、Admin 不可用、用户停止和不可逆待核单仍停止队列。
  • 不修改 Admin 接口、数据结构和采购不可逆安全规则。
  • 精确测试、Client 全量测试和 py_compile 通过;不执行真实采购、下单或付款。

验证方式

从 client/ 运行任务服务、Repository、调度器、PDD UI 事件精确测试,再运行完整 test_*.py 和修改文件 py_compile。使用 Mock/Fake,不连接真机,不执行真实下单。

风险和回退

  • 如果所有失败都继续,设备或登录等全局故障会批量制造失败,因此必须保留全局阻塞分类。
  • 失败信息未成功上报 Admin 时不得继续领取更多任�����,避免 Outbox 无限堆积。
  • 采购不可逆标记存在时必须优先只读核单并停止普通任务。
  • 回退本工单代码提交即可;不做数据库迁移。
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 / Client 可运行任务闭环 - 阶段:自动任务队列 - 状态:待验收 ## 要解决什么 当前采集任务遇到可恢复错误会进入 `retry_wait`,界面显示“等待重试”,自动获取还会停止。这会让采购人员误以为系统正在倒计时重试,也会让一条坏任务阻塞 Admin 指派给当前 Client 的后续任务。 目标是“一条任务自动执行一次”:任务自身失败后明确显示采集失败或采购失败,不自动重试当前任务;失败信息成功保存并上报 Admin 后继续下一条。只有用户明确点击重新采集或重新采购,才再次执行。 ## 做什么 / 不做什么 - 做:新发生的普通采集失败不再进入 `retry_wait`,保存为明确失败状态。 - 做:自动调度不再选择历史 `retry_wait`,已有记录作为失败记录保留。 - 做:任务列表按任务类型显示“采集失败”或“采购失败”,详情保留错误码和失败原因。 - 做:任务自身失败且失败信息成功上报后,自动获取继续下一条。 - 做:增加队列测试,验证第一条失败后执行第二条,且失败任务不会被自动再次选择。 - 做:保留全局阻塞停止条件:设备断开、PDD 登录/验证码/风控、Admin 不可用、用户停止、不可逆采购待核单。 - 不做:不自动重试任何失败任务。 - 不做:不删除手动“重新采集/重新采购”入口。 - 不做:不放宽采购不可逆安全门禁,不自动付款。 - 不做:不修改 Admin 接口和 `pdd_data` schema。 ## 已确认的实现方案 1. 将采集服务默认错误分类从 `retry_wait/retryable=true` 调整为失败且不自动重试;需要人工判断的规格、登录等仍保留相应错误状态。 2. Repository 自动待执行查询只选择 `claimed`,不再把 `retry_wait` 当作自动候选;已有 `retry_wait` 不迁移删除,只作为历史失败显示。 3. 调度结果区分“任务自身失败”和“全局环境失败”。任务失败已成功提交 Admin 后安排下一轮;设备、认证/风控、Admin/Outbox 阻塞等停止。 4. UI 状态根据 `task_type + status` 显示中文:采集失败、采购失败;可在详情查看 `last_error_message`。 5. 手动重新执行仍通过现有预检创建新执行记录;采购进入过不可逆阶段时继续永久拒绝重新下单。 6. 增加 Collect/Purchase 服务、Repository、Dispatcher/UI 自动循环回归测试。 预计修改: - client/src/collect_task_service.py - client/src/task_repository.py - client/src/task_models.py 或状态显示相关文件 - client/src/pdd_ui_event.py - 对应 client/test 测试 - docs/task/<工单号>-失败后继续下一任务.md ## 验收标准 - [x] 新采集失败不再显示“等待重试”,任务列表显示“采集失败”。 - [x] 采购失败显示“采购失败”,失败原因仍可在详情查看。 - [x] 一条任务自身失败且失败信息成功上报后,自动执行下一条。 - [x] 同一失败任务不会被自动再次执行。 - [x] 只有用户手动重新采集或重新采购才允许再次执行,并继续通过现有安全预检。 - [x] 设备断开、登录/验证码/风控、Admin 不可用、用户停止和不可逆待核单仍停止队列。 - [x] 不修改 Admin 接口、数据结构和采购不可逆安全规则。 - [x] 精确测试、Client 全量测试和 py_compile 通过;不执行真实采购、下单或付款。 ## 验证方式 从 `client/` 运行任务服务、Repository、调度器、PDD UI 事件精确测试,再运行完整 `test_*.py` 和修改文件 `py_compile`。使用 Mock/Fake,不连接真机,不执行真实下单。 ## 风险和回退 - 如果所有失败都继续,设备或登录等全局故障会批量制造失败,因此必须保留全局阻塞分类。 - 失败信息未成功上报 Admin 时不得继续领取更多任�����,避免 Outbox 无限堆积。 - 采购不可逆标记存在时必须优先只读核单并停止普通任务。 - 回退本工单代码提交即可;不做数据库迁移。
Author
Owner

实施完成,等待验收

  • 实现提交:8b8a542
  • 归档提交:88d59e4
  • 本地归档:docs/task/170-任务失败后继续下一条.md

实现结果:

  • 普通采集/采购失败只自动执行一次,保存为失败且上报 retryable=false;
  • 自动选择只读取 claimed,失败及历史 retry_wait 不会再次自动执行;
  • 任务自身失败返回 task_failed,上报成功后继续下一轮;
  • 设备、登录、验证码、风控、支付页、Admin/Outbox 和不可逆核单等全局阻塞仍停止;
  • 列表与详情显示“采集失败”或“采购失败”,并保留错误原因;
  • 手动重新执行和采购不可逆安全预检保持不变。

验证:

  • 第一条采集超时失败后,第二条本地任务继续并成功;
  • 历史 retry_wait 会被自动选择器跳过;
  • 全局错误仍停止自动获取;
  • Client 完整 429 项测试及语法检查通过。

未验证:未连接真实 Admin/Android 连续执行多条任务,未执行真实采购、下单或付款。工单保持打开,等待用户验收。

## 实施完成,等待验收 - 实现提交:`8b8a542` - 归档提交:`88d59e4` - 本地归档:`docs/task/170-任务失败后继续下一条.md` 实现结果: - 普通采集/采购失败只自动执行一次,保存为失败且上报 `retryable=false`; - 自动选择只读取 `claimed`,失败及历史 `retry_wait` 不会再次自动执行; - 任务自身失败返回 `task_failed`,上报成功后继续下一轮; - 设备、登录、验证码、风控、支付页、Admin/Outbox 和不可逆核单等全局阻塞仍停止; - 列表与详情显示“采集失败”或“采购失败”,并保留错误原因; - 手动重新执行和采购不可逆安全预检保持不变。 验证: - 第一条采集超时失败后,第二条本地任务继续并成功; - 历史 `retry_wait` 会被自动选择器跳过; - 全局错误仍停止自动获取; - Client 完整 429 项测试及语法检查通过。 未验证:未连接真实 Admin/Android 连续执行多条任务,未执行真实采购、下单或付款。工单保持打开,等待用户验收。
Author
Owner

用户于 2026-08-13 明确验收通过。本地归档状态已更新,批量验收记录提交:ad44f83。现关闭工单。

用户于 2026-08-13 明确验收通过。本地归档状态已更新,批量验收记录提交:`ad44f83`。现关闭工单。
ila closed this issue 2026-08-13 15:58:29 +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#170