PDD 任务表已经支持按稳定任务编号批量勾选,但没有从普通列表移除不再需要查看的本地记录的入口。直接物理删除 pdd_tasks 会通过外键级联删除执行记录和 Outbox,丢失审计、防重复领取和崩溃恢复依据,也会违反“已完成任务永久保留”的基线。
pdd_tasks
需要在“重新上报”右边增加“删除”按钮,使符合安全条件的勾选记录不再显示,同时仍在 SQLite 中保留完整历史。
succeeded
failed
cancelled
irreversible_action_at
task_runs
outbox_events
client/src/db_schema.py
removed_at
client/src/task_repository.py
remote_task_id
list_tasks()
count_tasks()
removed_at IS NULL
client/src/pdd_ui.py
client/src/pdd_ui_event.py
QObject + moveToThread
docs/client/03-data-model.md
docs/client/05-ui-specification.md
从 client/ 执行:
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
离屏界面冒烟:
$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
手工验证至少覆盖:单条、多条、取消、混合合法/非法记录、未发送 Outbox、不可逆采购记录、重启后列表状态。不得执行真实下单。
开始实施。先完成 SQLite v4 软删除迁移与仓储层原子安全校验,再接入任务列表“删除”按钮和后台线程,最后补充测试及 Client 基线文档。该改动沿用现有已确认的任务页布局,因此不另做 HTML 原型;确认框会显示准确数量、默认聚焦取消并支持 Esc。当前工作区已有的无关修改不纳入本工单。
实现和自动化验证已完成:
pdd_tasks.removed_at
05-ui-specification.md
验证结果:专项测试 80 项通过;Client 全量测试 304 项通过;4 个修改模块 py_compile 通过;离屏主窗口冒烟输出 OK。测试仅有现有 PyQt/qfluentwidgets 弃用警告和离屏字体提示,未发现功能失败。接下来提交实现并归档任务。
py_compile
OK
b272107
feat: 安全移除本地任务记录 (#108)
4c9bf38
docs: 归档任务 #108
docs/task/108-安全移除勾选的本地任务记录.md
git diff --check
工单保持开启并标记为待验收。用户验收通过后再关闭本单,并同步 #2、#1 的任务清单;当前不提前修改父工单完成状态。
用户已于 2026-08-11 明确验收通过。
eca9289
No dependencies set.
The note is not visible to the blocked user.
基本信息
要解决什么
PDD 任务表已经支持按稳定任务编号批量勾选,但没有从普通列表移除不再需要查看的本地记录的入口。直接物理删除
pdd_tasks会通过外键级联删除执行记录和 Outbox,丢失审计、防重复领取和崩溃恢复依据,也会违反“已完成任务永久保留”的基线。需要在“重新上报”右边增加“删除”按钮,使符合安全条件的勾选记录不再显示,同时仍在 SQLite 中保留完整历史。
做什么 / 不做什么
succeeded、failed、cancelled终态任务。irreversible_action_at有值时禁止移除。pdd_tasks、task_runs或outbox_events。怎么做
client/src/db_schema.py追加新版本迁移,为pdd_tasks增加可空的removed_at字段;不得修改已发布迁移。client/src/task_repository.py增加批量安全移除方法:使用一个事务按稳定remote_task_id校验全部记录,任一记录不满足条件时整体拒绝,不做部分修改;更新removed_at而不执行 DELETE。list_tasks()和count_tasks()默认只返回removed_at IS NULL;稳定任务编号唯一约束和历史记录继续保留,避免相同 Admin 任务被当成新任务再次插入。client/src/pdd_ui.py增加 Fluent 删除按钮、信号、勾选启用状态和无障碍名称。client/src/pdd_ui_event.py增加居中确认、后台执行、错误反馈和刷新;Worker 通过QObject + moveToThread执行数据库操作,不从工作线程访问 QWidget。docs/client/03-data-model.md、docs/client/05-ui-specification.md及相关测试。文档明确“删除”只表示从普通列表移除,本地审计数据仍永久保留。验收标准
remote_task_id唯一性仍有效。怎么验证
从
client/执行:离屏界面冒烟:
手工验证至少覆盖:单条、多条、取消、混合合法/非法记录、未发送 Outbox、不可逆采购记录、重启后列表状态。不得执行真实下单。
风险和回退
removed_at IS NULL会让已移除记录重新出现;迁移或批量校验错误可能隐藏不应移除的任务。开始实施。先完成 SQLite v4 软删除迁移与仓储层原子安全校验,再接入任务列表“删除”按钮和后台线程,最后补充测试及 Client 基线文档。该改动沿用现有已确认的任务页布局,因此不另做 HTML 原型;确认框会显示准确数量、默认聚焦取消并支持 Esc。当前工作区已有的无关修改不纳入本工单。
实现和自动化验证已完成:
pdd_tasks.removed_at和可见列表索引;普通列表/计数默认排除已软隐藏记录。QObject + moveToThreadWorker;成功后清除勾选并刷新,失败保留勾选并显示中文原因。docs/client/03-data-model.md与05-ui-specification.md。验证结果:专项测试 80 项通过;Client 全量测试 304 项通过;4 个修改模块
py_compile通过;离屏主窗口冒烟输出OK。测试仅有现有 PyQt/qfluentwidgets 弃用警告和离屏字体提示,未发现功能失败。接下来提交实现并归档任务。实施完成,等待用户验收
b272107feat: 安全移除本地任务记录 (#108)4c9bf38docs: 归档任务 #108docs/task/108-安全移除勾选的本地任务记录.mdpy_compile、git diff --check和离屏主窗口冒烟均通过。工单保持开启并标记为待验收。用户验收通过后再关闭本单,并同步 #2、#1 的任务清单;当前不提前修改父工单完成状态。
用户已于 2026-08-11 明确验收通过。
eca9289