为选中的采集任务增加重新执行入口 #63

Closed
opened 2026-08-09 21:31:18 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 Client 可运行任务闭环(MVP)
  • 阶段:PDD 采集执行与本地任务管理

要解决什么

任务列表目前只能查看和刷新。采集任务因页面变化、数据不完整或人工复核需要再次采集时,只能直接改数据库或等待重新派发,操作不安全且不可追踪。

做什么 / 不做什么

  • 做:在刷新按钮右侧增加“重新执行”;仅允许对当前单选、已结束的采集任务重新采集;明确确认后在后台线程执行指定任务;新结果覆盖 Client 和 Admin 的当前采集结果;每次成功结果保存在对应 task_runs 记录;刷新列表并显示结果。
  • 不做:不重新执行采购任务;不自动下单、不付款;不新增或修改 Admin 接口;不清理历史任务;不允许执行中、待提交或自动获取忙碌时重复启动。

怎么做

  • client/src/pdd_ui.py:增加重新执行信号和按钮,跟随当前选中行更新可用状态,并与只读刷新操作保持间距。
  • client/src/pdd_ui_event.py:读取并校验选中任务,使用明确的“重新采集”确认弹窗;用 QObject + moveToThread 执行指定任务,完成后刷新列表。
  • client/src/task_repository.py:事务内把符合条件的终态采集任务恢复为待执行;拒绝采购、运行中、结果待提交及仍有未发送 Outbox 的任务。
  • client/src/collect_task_service.py:复用现有采集闭环,但可按稳定任务编号执行指定任务,避免误执行队列中的其他任务。
  • SQLite 追加迁移,在 task_runs 增加本次成功采集结果 JSON;pdd_tasks.pdd_data 仍表示最新结果。
  • 同步 Client 数据模型/界面基线,并补充 Repository、服务和事件层测试。

验收标准

  • 任务列表刷新按钮右侧显示“重新执行”,没有有效选中项时不可用。
  • 选中已完成或失败的采集任务后,弹窗明确提示任务信息及“重新采集”动作。
  • 采购任务、执行中、结果待提交、Outbox 未发送或自动获取忙碌时不会启动重新采集,并给出中文原因。
  • 确认后只执行选中的采集任务,生成新的 attempt_id 和幂等键,不会执行队列中的其他任务。
  • 成功后 Client 当前结果与 Admin 当前结果按既有接口更新;旧结果保存在原 task_runs 中。
  • 自动化和网络操作不阻塞 Qt 主线程,完成或失败后列表与状态提示更新。
  • 不触发采购流程,真实下单开关保持关闭。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m unittest discover -s test -v
C:/Python310/python.exe -m py_compile src/pdd_ui.py src/pdd_ui_event.py src/task_repository.py src/collect_task_service.py src/db_schema.py
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()"
Remove-Item Env:QT_QPA_PLATFORM

真机验证:选中一条已结束采集任务,确认重新采集只控制已保存 Android 设备执行该任务,并核对本地最新结果、执行历史和 Admin 当前结果。不得用采购任务做真机重执行测试。

风险和回退

  • 数据库只追加可空字段,旧库升级后原执行记录保持有效;回退旧代码时新增列会被忽略。
  • 重新采集会覆盖两端当前结果,因此确认弹窗必须显示稳定任务编号和标题;历史结果保存在执行记录中用于追踪。
  • 若 Client 在准备后、启动线程前退出,恢复逻辑会把任务转为可重试状态,不会触发采购。
  • 可按本工单提交回退代码;SQLite 已增加的可空列无需删除。
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 Client 可运行任务闭环(MVP) - 阶段:PDD 采集执行与本地任务管理 ## 要解决什么 任务列表目前只能查看和刷新。采集任务因页面变化、数据不完整或人工复核需要再次采集时,只能直接改数据库或等待重新派发,操作不安全且不可追踪。 ## 做什么 / 不做什么 - 做:在刷新按钮右侧增加“重新执行”;仅允许对当前单选、已结束的采集任务重新采集;明确确认后在后台线程执行指定任务;新结果覆盖 Client 和 Admin 的当前采集结果;每次成功结果保存在对应 `task_runs` 记录;刷新列表并显示结果。 - 不做:不重新执行采购任务;不自动下单、不付款;不新增或修改 Admin 接口;不清理历史任务;不允许执行中、待提交或自动获取忙碌时重复启动。 ## 怎么做 - `client/src/pdd_ui.py`:增加重新执行信号和按钮,跟随当前选中行更新可用状态,并与只读刷新操作保持间距。 - `client/src/pdd_ui_event.py`:读取并校验选中任务,使用明确的“重新采集”确认弹窗;用 `QObject + moveToThread` 执行指定任务,完成后刷新列表。 - `client/src/task_repository.py`:事务内把符合条件的终态采集任务恢复为待执行;拒绝采购、运行中、结果待提交及仍有未发送 Outbox 的任务。 - `client/src/collect_task_service.py`:复用现有采集闭环,但可按稳定任务编号执行指定任务,避免误执行队列中的其他任务。 - SQLite 追加迁移,在 `task_runs` 增加本次成功采集结果 JSON;`pdd_tasks.pdd_data` 仍表示最新结果。 - 同步 Client 数据模型/界面基线,并补充 Repository、服务和事件层测试。 ## 验收标准 - [ ] 任务列表刷新按钮右侧显示“重新执行”,没有有效选中项时不可用。 - [ ] 选中已完成或失败的采集任务后,弹窗明确提示任务信息及“重新采集”动作。 - [ ] 采购任务、执行中、结果待提交、Outbox 未发送或自动获取忙碌时不会启动重新采集,并给出中文原因。 - [ ] 确认后只执行选中的采集任务,生成新的 `attempt_id` 和幂等键,不会执行队列中的其他任务。 - [ ] 成功后 Client 当前结果与 Admin 当前结果按既有接口更新;旧结果保存在原 `task_runs` 中。 - [ ] 自动化和网络操作不阻塞 Qt 主线程,完成或失败后列表与状态提示更新。 - [ ] 不触发采购流程,真实下单开关保持关闭。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m unittest discover -s test -v C:/Python310/python.exe -m py_compile src/pdd_ui.py src/pdd_ui_event.py src/task_repository.py src/collect_task_service.py src/db_schema.py $env:QT_QPA_PLATFORM="offscreen" C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()" Remove-Item Env:QT_QPA_PLATFORM ``` 真机验证:选中一条已结束采集任务,确认重新采集只控制已保存 Android 设备执行该任务,并核对本地最新结果、执行历史和 Admin 当前结果。不得用采购任务做真机重执行测试。 ## 风险和回退 - 数据库只追加可空字段,旧库升级后原执行记录保持有效;回退旧代码时新增列会被忽略。 - 重新采集会覆盖两端当前结果,因此确认弹窗必须显示稳定任务编号和标题;历史结果保存在执行记录中用于追踪。 - 若 Client 在准备后、启动线程前退出,恢复逻辑会把任务转为可重试状态,不会触发采购。 - 可按本工单提交回退代码;SQLite 已增加的可空列无需删除。
Author
Owner

实施进度

已完成代码和自动化回归,准备提交:

  • 任务列表增加“重新执行”,使用明确的重新采集确认弹窗;
  • 仅允许已结束采集任务,采购、活动状态、未发送 Outbox 和自动获取忙碌均拦截;
  • 后台线程按 remote_task_id 只执行选中任务;
  • SQLite 升级到 v2,task_runs.result_data 保存每次成功结果,当前结果仍按既有契约覆盖并提交 Admin;
  • 已同步 Client 数据模型和界面基线。

验证结果:C:/Python310/python.exe -m unittest discover -s test -v 共 182 项通过;离屏主窗口冒烟输出 OK。真机重新采集尚未执行,留待用户验收。

## 实施进度 已完成代码和自动化回归,准备提交: - 任务列表增加“重新执行”,使用明确的重新采集确认弹窗; - 仅允许已结束采集任务,采购、活动状态、未发送 Outbox 和自动获取忙碌均拦截; - 后台线程按 `remote_task_id` 只执行选中任务; - SQLite 升级到 v2,`task_runs.result_data` 保存每次成功结果,当前结果仍按既有契约覆盖并提交 Admin; - 已同步 Client 数据模型和界面基线。 验证结果:`C:/Python310/python.exe -m unittest discover -s test -v` 共 182 项通过;离屏主窗口冒烟输出 `OK`。真机重新采集尚未执行,留待用户验收。
Author
Owner

完成记录

状态:待用户验收。

最终实现:

  • “重新执行”仅针对选中的终态采集任务,确认后由工作线程执行指定 remote_task_id;
  • 采购任务、活动状态、未发送 Outbox、自动获取忙碌及设备设置缺失均不会启动;
  • 新结果继续使用既有 Admin 提交接口并覆盖当前结果;SQLite v2 在 task_runs.result_data 保存每次成功结果;
  • 未改 Admin 接口,未触发采购或真实下单。

提交:

  • eda3661 feat: 增加采集任务重新执行入口 (#63)
  • 5c9ebd9 docs: 归档任务 #63

归档:docs/task/63-采集任务重新执行入口.md

测试:182 项单元测试全部通过;语法检查通过;离屏主窗口冒烟输出 OK。

未验证:真机重新采集和真实 Admin 当前结果覆盖,等待用户验收。

## 完成记录 状态:待用户验收。 最终实现: - “重新执行”仅针对选中的终态采集任务,确认后由工作线程执行指定 `remote_task_id`; - 采购任务、活动状态、未发送 Outbox、自动获取忙碌及设备设置缺失均不会启动; - 新结果继续使用既有 Admin 提交接口并覆盖当前结果;SQLite v2 在 `task_runs.result_data` 保存每次成功结果; - 未改 Admin 接口,未触发采购或真实下单。 提交: - `eda3661` `feat: 增加采集任务重新执行入口 (#63)` - `5c9ebd9` `docs: 归档任务 #63` 归档:`docs/task/63-采集任务重新执行入口.md` 测试:182 项单元测试全部通过;语法检查通过;离屏主窗口冒烟输出 `OK`。 未验证:真机重新采集和真实 Admin 当前结果覆盖,等待用户验收。
Author
Owner

用户已于 2026-08-11 明确验收通过。

  • 本地归档状态已更新为“已完成,用户验收通过”
  • 验收记录提交:eca9289
  • 本工单按项目流程关闭
用户已于 2026-08-11 明确验收通过。 - 本地归档状态已更新为“已完成,用户验收通过” - 验收记录提交:`eca9289` - 本工单按项目流程关闭
ila closed this issue 2026-08-11 10:58:09 +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#63