PDD 任务表增加批量勾选和重新上报 #89

Closed
opened 2026-08-10 10:33:32 +08:00 by ila · 4 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 Client 可运行任务闭环
  • 阶段:Admin Gateway 闭环 / PDD 任务页操作

要解决什么

PDD 任务表目前只有单行当前选择,“刷新”与搜索区视觉分离,也没有把本地已保存结果手动再次提交给 Admin 的入口。操作人员需要勾选一条或多条本地任务,安全地批量重新上报既有结果;重新执行仍应保持单条采集限制,避免批量操作手机和采购风险。

做什么 / 不做什么

  • 做:表格最左侧增加基于 remote_task_id 的勾选列和当前已选数量;搜索条件变化清空勾选,普通刷新保留仍存在的勾选。
  • 做:把“刷新”移动到“搜索”右侧;在“重新执行”右侧增加“重新上报”。
  • 做:重新执行仅允许恰好勾选一条符合现有规则的采集任务。
  • 做:重新上报批量复用每条任务最新的 collect_result / purchase_result Outbox 原始 payload_json 和 idempotency_key,后台逐条提交并反馈成功、失败、跳过数量。
  • 做:更新 Client 界面基线和操作约束。
  • 不做:不批量重新执行手机自动化;不重新采购、不重新采集、不要求 Android 设备在线。
  • 不做:不重新组装结果、不创建新 Outbox、不发送 task_failure、不新增或修改 Admin 接口、不承诺覆盖 Admin 数据。
  • 不做:不启用真实下单,不改变采购安全门禁。

怎么做

  1. 修改 client/src/pdd_ui.py:
    • 模型第一列实现 Qt.CheckStateRole 和 Qt.ItemIsUserCheckable,只保存稳定任务编号集合;
    • 空白占位行不可勾选;刷新时清理已经不存在的勾选;
    • 增加“已选 N 条”和“重新上报”按钮,重新执行按钮按勾选数量启用;
    • “刷新”紧邻“搜索”,批量操作位于右侧。
  2. 修改 client/src/task_repository.py:
    • 按稳定任务编号查找最新结果 Outbox;
    • 只返回采集/采购结果事件,不修改原始负载和幂等键。
  3. 修改 client/src/pdd_ui_event.py:
    • 新建 QObject + moveToThread 批量上报 Worker;
    • 自动获取或重新执行忙碌时阻止启动;
    • 确认框明确“不操作手机、不修改本地数据”;
    • 逐条调用现有 Gateway,按原幂等键发送,并更新原 Outbox 状态;
    • 完成后刷新表格,成功项取消勾选,失败/跳过项保留。
  4. 更新相关测试、docs/client/05-ui-specification.md,并修正 client/AGENTS.md 中“其余操作只读本地数据库”的旧表述。

预计修改文件:

  • client/src/pdd_ui.py
  • client/src/pdd_ui_event.py
  • client/src/task_repository.py
  • client/test/test_pdd_ui.py
  • client/test/test_pdd_ui_event.py
  • client/test/test_task_repository.py
  • docs/client/05-ui-specification.md
  • client/AGENTS.md

不修改数据库表结构,不修改 Admin 接口契约。

验收标准

  • 表格第一列可逐行勾选;占位空行不可勾选,勾选身份使用 remote_task_id。
  • 页面显示准确的“已选 N 条”;搜索条件变化清空勾选,普通刷新保留仍存在的勾选。
  • “刷新”紧邻“搜索”;“重新上报”位于“重新执行”右侧,窄窗口仍可访问主要命令。
  • 恰好勾选一条允许重新采集的任务时可重新执行;多选不能批量操作手机。
  • 重新上报前显示数量和无手机操作说明;取消、Escape、关闭都不提交。
  • 重新上报不检查 Android 设备,不执行 uiautomator2,不创建新 Outbox。
  • 每条上报复用最新结果 Outbox 的原始幂等键和负载,仅支持 collect_result / purchase_result。
  • 自动获取、重新执行或另一批上报运行时,不能重复启动重新上报。
  • 批量结束显示成功、失败、跳过数量;成功项取消勾选,失���和跳过项保留。
  • Admin 暂时失败、永久拒绝、无结果 Outbox及窗口提前关闭均有自动测试,Qt 主线程不执行网络请求。
  • Client 全量测试通过,未启用真实下单。

怎么验证

从 client/ 目录执行:

C:/Python310/python.exe -m py_compile src/pdd_ui.py src/pdd_ui_event.py src/task_repository.py
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -m unittest discover -s test -v
Remove-Item Env:QT_QPA_PLATFORM

手工界面验收:

C:/Python310/python.exe buyer_main.py

检查单选、多选、筛选、刷新、确认取消、批量部分成功和按钮忙碌状态。重新上报联调需要可用 Admin,但不需要 Android 真机。

风险和回退

  • 风险:重复提交必须保持相同幂等键和相同负载,否则 Admin 会返回幂等冲突。
  • 风险:自动获取与手动上报并发处理同一 Outbox 会产生竞态,因此两者互斥。
  • 风险:采购结果只允许重发既有 Outbox,任何路径都不得重新执行采购或越过不可逆安全规则。
  • 回退:按本工单实现提交整体回退;数据库无迁移,回退不影响既有 Outbox 数据。
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 Client 可运行任务闭环 - 阶段:Admin Gateway 闭环 / PDD 任务页操作 ## 要解决什么 PDD 任务表目前只有单行当前选择,“刷新”与搜索区视觉分离,也没有把本地已保存结果手动再次提交给 Admin 的入口。操作人员需要勾选一条或多条本地任务,安全地批量重新上报既有结果;重新执行仍应保持单条采集限制,避免批量操作手机和采购风险。 ## 做什么 / 不做什么 - 做:表格最左侧增加基于 `remote_task_id` 的勾选列和当前已选数量;搜索条件变化清空勾选,普通刷新保留仍存在的勾选。 - 做:把“刷新”移动到“搜索”右侧;在“重新执行”右侧增加“重新上报”。 - 做:重新执行仅允许恰好勾选一条符合现有规则的采集任务。 - 做:重新上报批量复用每条任务最新的 `collect_result` / `purchase_result` Outbox 原始 `payload_json` 和 `idempotency_key`,后台逐条提交并反馈成功、失败、跳过数量。 - 做:更新 Client 界面基线和操作约束。 - 不做:不批量重新执行手机自动化;不重新采购、不重新采集、不要求 Android 设备在线。 - 不做:不重新组装结果、不创建新 Outbox、不发送 `task_failure`、不新增或修改 Admin 接口、不承诺覆盖 Admin 数据。 - 不做:不启用真实下单,不改变采购安全门禁。 ## 怎么做 1. 修改 `client/src/pdd_ui.py`: - 模型第一列实现 `Qt.CheckStateRole` 和 `Qt.ItemIsUserCheckable`,只保存稳定任务编号集合; - 空白占位行不可勾选;刷新时清理已经不存在的勾选; - 增加“已选 N 条”和“重新上报”按钮,重新执行按钮按勾选数量启用; - “刷新”紧邻“搜索”,批量操作位于右侧。 2. 修改 `client/src/task_repository.py`: - 按稳定任务编号查找最新结果 Outbox; - 只返回采集/采购结果事件,不修改原始负载和幂等键。 3. 修改 `client/src/pdd_ui_event.py`: - 新建 `QObject + moveToThread` 批量上报 Worker; - 自动获取或重新执行忙碌时阻止启动; - 确认框明确“不操作手机、不修改本地数据”; - 逐条调用现有 Gateway,按原幂等键发送,并更新原 Outbox 状态; - 完成后刷新表格,成功项取消勾选,失败/跳过项保留。 4. 更新相关测试、`docs/client/05-ui-specification.md`,并修正 `client/AGENTS.md` 中“其余操作只读本地数据库”的旧表述。 预计修改文件: - `client/src/pdd_ui.py` - `client/src/pdd_ui_event.py` - `client/src/task_repository.py` - `client/test/test_pdd_ui.py` - `client/test/test_pdd_ui_event.py` - `client/test/test_task_repository.py` - `docs/client/05-ui-specification.md` - `client/AGENTS.md` 不修改数据库表结构,不修改 Admin 接口契约。 ## 验收标准 - [ ] 表格第一列可逐行勾选;占位空行不可勾选,勾选身份使用 `remote_task_id`。 - [ ] 页面显示准确的“已选 N 条”;搜索条件变化清空勾选,普通刷新保留仍存在的勾选。 - [ ] “刷新”紧邻“搜索”;“重新上报”位于“重新执行”右侧,窄窗口仍可访问主要命令。 - [ ] 恰好勾选一条允许重新采集的任务时可重新执行;多选不能批量操作手机。 - [ ] 重新上报前显示数量和无手机操作说明;取消、Escape、关闭都不提交。 - [ ] 重新上报不检查 Android 设备,不执行 uiautomator2,不创建新 Outbox。 - [ ] 每条上报复用最新结果 Outbox 的原始幂等键和负载,仅支持 `collect_result` / `purchase_result`。 - [ ] 自动获取、重新执行或另一批上报运行时,不能重复启动重新上报。 - [ ] 批量结束显示成功、失败、跳过数量;成功项取消勾选,失���和跳过项保留。 - [ ] Admin 暂时失败、永久拒绝、无结果 Outbox及窗口提前关闭均有自动测试,Qt 主线程不执行网络请求。 - [ ] Client 全量测试通过,未启用真实下单。 ## 怎么验证 从 `client/` 目录执行: ```powershell C:/Python310/python.exe -m py_compile src/pdd_ui.py src/pdd_ui_event.py src/task_repository.py $env:QT_QPA_PLATFORM="offscreen" C:/Python310/python.exe -m unittest discover -s test -v Remove-Item Env:QT_QPA_PLATFORM ``` 手工界面验收: ```powershell C:/Python310/python.exe buyer_main.py ``` 检查单选、多选、筛选、刷新、确认取消、批量部分成功和按钮忙碌状态。重新上报联调需要可用 Admin,但不需要 Android 真机。 ## 风险和回退 - 风险:重复提交必须保持相同幂等键和相同负载,否则 Admin 会返回幂等冲突。 - 风险:自动获取与手动上报并发处理同一 Outbox 会产生竞态,因此两者互斥。 - 风险:采购结果只允许重发既有 Outbox,任何路径都不得重新执行采购或越过不可逆安全规则。 - 回退:按本工单实现提交整体回退;数据库无迁移,回退不影响既有 Outbox 数据。
Author
Owner

已按用户确认方案创建工单,并同步到父级 Epic #1 与 MVP #2。开始实施;严格复用原始结果 Outbox,不触发 Android 自动化,不新增 Admin 接口。

已按用户确认方案创建工单,并同步到父级 Epic #1 与 MVP #2。开始实施;严格复用原始结果 Outbox,不触发 Android 自动化,不新增 Admin 接口。
Author
Owner

实施完成,等待用户验收

已按确认方案完成开发:

  • PDD 任务表增加逐行勾选,勾选状态按 remote_task_id 保存;普通刷新保留仍存在任务的勾选,搜索清空勾选。
  • “刷新”移动到“搜索”右侧;“重新执行”右侧增加“重新上报”。窄窗口会自动换成两行操作区。
  • “重新执行”只接受一条勾选任务,不增加批量手机自动化。
  • “重新上报”支持多条任务,复用每条任务最新结果 Outbox 的原始负载和幂等键;不操作 Android、不创建新 Outbox、不生成失败事件。
  • 成功任务取消勾选,失败或跳过任务保留勾选,并汇总显示处理数量。
  • 自动获取、重新执行、重新上报互斥。

验证结果

  • Client 完整测试:Ran 232 tests in 10.121s,OK
  • PyQt 离屏窗口初始化冒烟测试:OK
  • 暂存内容空白检查:通过

未验证:真实 Admin 手工批量重新上报;真实 Windows 显示器不同 DPI、窗口宽度和主题下的视觉检查。

提交与归档

  • 实现提交:34ff39a feat: 增加任务批量勾选和重新上报 (#89)
  • 归档提交:d81aa25 docs: 归档任务 #89
  • 归档:docs/task/89-PDD任务批量勾选和重新上报.md

当前保持工单开启,状态为待用户验收;验收通过后再关闭并更新 #1、#2。

## 实施完成,等待用户验收 已按确认方案完成开发: - PDD 任务表增加逐行勾选,勾选状态按 `remote_task_id` 保存;普通刷新保留仍存在任务的勾选,搜索清空勾选。 - “刷新”移动到“搜索”右侧;“重新执行”右侧增加“重新上报”。窄窗口会自动换成两行操作区。 - “重新执行”只接受一条勾选任务,不增加批量手机自动化。 - “重新上报”支持多条任务,复用每条任务最新结果 Outbox 的原始负载和幂等键;不操作 Android、不创建新 Outbox、不生成失败事件。 - 成功任务取消勾选,失败或跳过任务保留勾选,并汇总显示处理数量。 - 自动获取、重新执行、重新上报互斥。 ### 验证结果 - Client 完整测试:`Ran 232 tests in 10.121s`,`OK` - PyQt 离屏窗口初始化冒烟测试:`OK` - 暂存内容空白检查:通过 未验证:真实 Admin 手工批量重新上报;真实 Windows 显示器不同 DPI、窗口宽度和主题下的视觉检查。 ### 提交与归档 - 实现提交:`34ff39a` `feat: 增加任务批量勾选和重新上报 (#89)` - 归档提交:`d81aa25` `docs: 归档任务 #89` - 归档:`docs/task/89-PDD任务批量勾选和重新上报.md` 当前保持工单开启,状态为待用户验收;验收通过后再关闭并更新 #1、#2。
Author
Owner

新增后续交互优化工单 #131:在 #89 已有逐行勾选基础上增加全选/反选,并移除表格详情列;详情继续通过双击任务行或按 Enter 打开。#131 不改变重新执行、重新上报或删除的业务规则。

新增后续交互优化工单 #131:在 #89 已有逐行勾选基础上增加全选/反选,并移除表格详情列;详情继续通过双击任务行或按 Enter 打开。#131 不改变重新执行、重新上报或删除的业务规则。
Author
Owner

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

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