From 3bfaf44799f169209a67741d4ee527f2e9193c26 Mon Sep 17 00:00:00 2001 From: chengma Date: Mon, 10 Aug 2026 11:19:45 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E5=BD=92=E6=A1=A3=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?#91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/task/91-修复重新上报任务状态不一致.md | 65 ++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 docs/task/91-修复重新上报任务状态不一致.md diff --git a/docs/task/91-修复重新上报任务状态不一致.md b/docs/task/91-修复重新上报任务状态不一致.md new file mode 100644 index 0000000..bb5a2f6 --- /dev/null +++ b/docs/task/91-修复重新上报任务状态不一致.md @@ -0,0 +1,65 @@ +# 91 修复重新上报导致任务状态与 Outbox 不一致 + +- 类型:缺陷 +- 父级大工单:#1 +- 所属 MVP / 版本:#2 +- 状态:已完成,待用户验收 +- 日期:2026-08-10 +- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/91 + +## 背景与目标 + +已完成任务在后续重新采集失败后,如果重新上报旧结果,旧代码会把任务主状态重新改成“已完成”。任务实际上仍有待发送的失败事件,因此再次点击“重新执行”又会被未发送 Outbox 拦截。 + +本次修复重新上报的事件选择和状态更新规则,保证历史事件不能覆盖最新一次执行状态,并让现有“假完成”记录在最新失败信息上报成功后恢复正确状态。 + +## 最终方案 + +- 重新上报优先选择任务最早一条尚未发送的 Outbox,包括 `task_failure`;全部事件已发送时才重发最新结果。 +- Worker 根据事件类型分别调用 Admin 的结果提交接口或失败提交接口,继续使用原始幂等键和负载。 +- 事件首次发送和历史重发通过 `sent_at` 区分。历史结果重发成功只更新 Outbox,不再修改任务主状态。 +- 只有事件的 `attempt_id` 与最新执行记录一致时,事件才能更新任务状态。 +- 最新失败事件上报成功后,使用原始失败负载恢复 `failed`、`retry_wait`、`manual_review` 或 `cancelled` 状态;旧失败事件不能覆盖新成功。 +- 重新执行的拦截提示区分“结果”和“失败信息”,并提示勾选任务点击“重新上报”。 +- 没有修改数据库表结构、Admin 接口或 Android 自动化代码。 + +实现与建单方案一致。 + +## 改了哪些 + +- `client/src/task_repository.py`:增加重新上报事件选择,并按最新执行安全更新任务状态。 +- `client/src/pdd_ui_event.py`:失败事件改用失败提交接口,更新确认和进度文案。 +- `client/test/test_task_repository.py`:覆盖旧结果、新失败、旧失败和新成功的状态顺序。 +- `client/test/test_pdd_ui_event.py`:覆盖失败事件优先上报、状态修复和不调用 Android。 +- `client/AGENTS.md`:明确重新上报优先处理未发送 Outbox。 +- `docs/client/03-data-model.md`:记录重新上报的状态一致性规则。 +- `docs/client/05-ui-specification.md`:更新重新上报范围和交互说明。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 重发旧结果不会隐藏最新失败状态 | 通过 | +| 存在待发送失败事件时优先上报该事件 | 通过 | +| 最新失败事件上报后恢复对应失败状态 | 通过 | +| 旧失败事件不会覆盖新成功状态 | 通过 | +| 全部事件已发送时仍可重发最新结果 | 通过 | +| 重新执行提示准确区分结果和失败信息 | 通过 | +| 不创建新 Outbox、不改 Admin 接口、不调用 Android | 通过 | +| Client 完整自动测试通过 | 通过,共 235 项 | + +## 测试 + +- 执行的命令:在 `client/` 目录执行 `C:/Python310/python.exe -m unittest discover -s test -p "test_task_repository.py"`。 +- 结果:17 项通过。 +- 执行的命令:在 `client/` 目录执行 `C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_ui_event.py"`。 +- 结果:37 项通过。 +- 执行的命令:在 `client/` 目录执行 `C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"`。 +- 结果:`Ran 235 tests in 9.777s`,`OK`。 +- 执行的命令:PyQt5 离屏创建并关闭 `MainWindow`。 +- 结果:输出 `OK`。 +- **没验证到的部分**:没有用真实 Admin 上报现场任务 `COL-3dec8b1e10f28954`,因此没有修改用户现有数据库中的这条记录;没有操作 Android 手机。 + +## 相关提交 + +- `077cba6` 修复重新上报任务状态不一致