Files
cmautobuy/docs/task/108-安全移除勾选的本地任务记录.md
T

4.3 KiB

108 安全移除勾选的本地任务记录

背景与目标

PDD 任务表已经支持批量勾选,但没有移除本地记录的安全入口。直接物理删除任务会 连带删除执行记录和 Outbox,破坏审计、防重复领取和采购恢复依据。

本任务增加“删除”按钮。删除只让符合条件的终态任务不再显示,数据库中的任务、 执行记录和上报历史仍永久保留。

最终方案

  • SQLite 升级到 v4,为 pdd_tasks 增加可空的 removed_at 字段和可见列表索引。
  • 普通任务列表和计数固定查询 removed_at IS NULL;按任务编号读取详情和唯一约束 不变,已移除任务不会被当成新任务再次领取。
  • Repository 在一个事务中校验整批稳定任务编号。只允许 succeeded、failed、 cancelled,要求所有 Outbox 已发送,并拒绝任何进入不可逆阶段的执行记录。 任一任务不满足条件时整批回滚。
  • 任务页在“重新上报”右边增加 Fluent“删除”按钮。确认框显示准确数量,默认聚焦 “暂不删除”;取消、关闭或按 Escape 都不执行删除。
  • 数据库操作由 QObject + moveToThread Worker 执行。成功后清除对应勾选、刷新 当前筛选并更新底部状态;失败时保留勾选并显示中文原因。
  • 删除过程不调用 Admin,不检查或操作 Android,也不修改任务状态和 Outbox 状态。

实现与建单方案一致。

改了哪些

  • client/src/db_schema.py:增加 SQLite v4 软删除迁移和索引。
  • client/src/task_repository.py:增加批量原子安全校验与软删除,列表默认排除已移除任务。
  • client/src/pdd_ui.py:增加删除按钮、信号、勾选和忙碌状态。
  • client/src/pdd_ui_event.py:增加确认交互、后台 Worker、结果反馈和关闭收尾。
  • client/test/test_db.py:验证首次建库和 v3 到 v4 迁移。
  • client/test/test_task_repository.py:验证软删除、审计保留、全有或全无、Outbox 和不可逆门禁。
  • client/test/test_pdd_ui.py:验证按钮布局、启用条件和稳定任务编号信号。
  • client/test/test_pdd_ui_event.py:验证取消、成功刷新、混合批量拒绝及无外部调用。
  • docs/client/03-data-model.md:记录 removed_at、默认查询和安全校验规则。
  • docs/client/05-ui-specification.md:记录删除按钮、确认框和批量交互规范。

验收结果

验收标准 结果
未勾选时删除禁用,勾选后启用且位于重新上报右边 通过
确认框包含准确数量,安全取消默认聚焦,取消不修改数据 通过
合法终态任务软删除后不再出现在普通列表 通过
任务、执行记录、Outbox 和任务编号唯一性完整保留 通过
非终态、未完成 Outbox 和不可逆任务给出中文原因并拒绝 通过
混合批量采用全有或全无事务 通过
不请求 Admin、不操作 Android、不修改业务状态 通过
首次建库、上一版本迁移和 Client 全量测试通过 通过

测试

  • 执行的命令:
    • C:/Python310/python.exe -m pytest test/test_db.py test/test_task_repository.py test/test_pdd_ui.py test/test_pdd_ui_event.py -q
    • C:/Python310/python.exe -m pytest test -q
    • C:/Python310/python.exe -m py_compile src/db_schema.py src/task_repository.py src/pdd_ui.py src/pdd_ui_event.py
    • 设置 QT_QPA_PLATFORM=offscreen 后创建并关闭 MainWindow 的离屏冒烟命令
    • git diff --check
  • 结果:专项测试 80 项通过;Client 全量测试 304 项通过;语法和差异检查通过; 离屏冒烟输出 OK。现有 PyQt/qfluentwidgets 弃用警告和离屏字体提示不影响结果。
  • 没验证到的部分:未使用真实历史数据库手工升级后重启 Client;未人工检查 Windows 不同 DPI、浅色、深色和高对比度下确认框的视觉位置;未用鼠标实际点击 对话框关闭按钮和按 Escape(自动化测试覆盖了取消返回路径和安全默认焦点)。

相关提交

  • b272107 feat: 安全移除本地任务记录 (#108)