docs: 归档任务 #108
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
# 108 安全移除勾选的本地任务记录
|
||||
|
||||
- 类型:需求
|
||||
- 父级大工单:#1
|
||||
- 所属 MVP / 版本:#2
|
||||
- 状态:已完成(待验收)
|
||||
- 日期:2026-08-10
|
||||
- Gitea 工单:<http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/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)
|
||||
Reference in New Issue
Block a user