feat(workbench): add dynamic task approval lifecycle

This commit is contained in:
2026-09-24 16:36:12 +08:00
parent db092b0f5e
commit ad813a7c16
35 changed files with 2956 additions and 564 deletions
+8 -2
View File
@@ -8,12 +8,18 @@
`017_workbench_schema_comments.sql` 只为 `workbench` schema 及其 17 张表和关键列增加数据库可见注释。它先在 `tjwater_v2` 应用;其他项目数据库保持原状,直到 `tjwater_v2` 验证通过并获得明确扩展确认。
`018_remove_synthetic_check_task_projections.sql` 清理曾被错误同步为预约任务的通用合成检查投影。它按完整 `peripheral_sample:<work_order_id>` 标识关联外围源,只匹配 `general` 类型、没有调查动作回执关联且由专用 seed actor 创建的旧检查任务;不使用用户可编辑的标题或工单状态作为删除依据。`workbench.work_orders` 中三条演示工单、投诉与爆管事件以及调查产生的现场采样工单均不在清理范围。同步器使用同一专用 seed actor 阻止旧种子检查再次生成。
`019_operational_task_access_requests.sql` 已只在 `tjwater_v2` 应用,新增带表级和列级注释的任务访问申请表;初始记录数为 0。旧 `workbench.work_orders` 已退役,因此应用后 `workbench` schema 仍为 17 张表,而不是继续增加重复投影。其他项目数据库尚未应用 `019`。
预约工单结构调整无需 DDL。`seed_workbench_work_orders.py --project-id <已核对的项目 UUID>` 只重建该项目的三条演示预约投影,保留工单 ID 和标题,改为单层字段与显式活动记录。执行前必须核对脚本删除谓词实际命中的 ID;它不修改 `peripheral_sample.work_orders`、历史修订或调查任务。其他项目不得随 `tjwater_v2` 自动重建。
未应用 `019` 的项目仍可读取既有工况任务,但创建访问申请会明确返回 `503 DEPENDENCY_UNAVAILABLE`,不会以缺表异常形成 500。单个任务同一时间只允许一个待审核访问申请;需要先审批或拒绝当前申请,避免 Agent 用不同请求号重复放大通知和事件。
`018_remove_synthetic_check_task_projections.sql` 清理曾被错误同步为预约任务的通用合成检查投影。它按完整 `peripheral_sample:<work_order_id>` 标识关联外围源,只匹配 `general` 类型、没有调查动作回执关联且由专用 seed actor 创建的旧检查任务;不使用用户可编辑的标题或工单状态作为删除依据。投诉与爆管事件以及调查产生的现场采样工单均不在清理范围。同步器使用同一专用 seed actor 阻止旧种子检查再次生成。
旧的三条演示工单已迁入 `peripheral_sample.work_orders`,并同步为有效的 `external_work_order` 任务。`021_retire_workbench_work_orders.sql` 仅在物理数据库为 `tjwater_v2`、旧表恰有这三条且每条都有有效外围工单和任务投影时删除旧表。其他四个项目数据库原本没有旧表,不执行本迁移。旧种子和迁入脚本已退役,不能再运行历史 `011` 重建双份数据。
后续数据库变更默认只写入 `tjwater_v2`。其他项目保持现状,必须等 `tjwater_v2` 验证通过并由维护者明确确认后,再逐库扩展。禁止把“所有活跃项目”作为写操作的默认范围。
通知生命周期迁移 `022_operational_notification_lifecycle.sql` 只修改现有通知 JSON 文档与列注释,不新增表或物理列。脚本带物理数据库名硬门禁;先在 `tjwater_v2` 核对待审批通知仍为 `active`、已审批通知变为 `resolved`,并验证 Header 只统计活动未读项。未取得维护者确认前,不向其他 BizDB 应用。
## 变更顺序
1. 核对目标 DSN,确认物理数据库名为 `tjwater_v2`,并确认没有其他项目共享该 BizDB。