From 4c9bf3865b077d475934705d162caf2c5ec6c894 Mon Sep 17 00:00:00 2001 From: chengma Date: Mon, 10 Aug 2026 17:24:03 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E5=BD=92=E6=A1=A3=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?#108?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/task/108-安全移除勾选的本地任务记录.md | 76 +++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 docs/task/108-安全移除勾选的本地任务记录.md diff --git a/docs/task/108-安全移除勾选的本地任务记录.md b/docs/task/108-安全移除勾选的本地任务记录.md new file mode 100644 index 0000000..9a82a60 --- /dev/null +++ b/docs/task/108-安全移除勾选的本地任务记录.md @@ -0,0 +1,76 @@ +# 108 安全移除勾选的本地任务记录 + +- 类型:需求 +- 父级大工单:#1 +- 所属 MVP / 版本:#2 +- 状态:已完成(待验收) +- 日期:2026-08-10 +- Gitea 工单: + +## 背景与目标 + +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)