feat(workbench): persist operational workflows and events

This commit is contained in:
2026-09-24 04:19:02 +08:00
parent baff7dfe9e
commit 9335bdc1ea
66 changed files with 16580 additions and 238 deletions
+16 -3
View File
@@ -263,7 +263,13 @@ class PostgresStore:
f"SELECT document FROM peripheral_sample.{table} WHERE project_id=%s AND {id_column}=%s AND deleted_at IS NULL",
(who.project_id, resource_id)).fetchone()
ensure(row is not None, missing_code, missing_message, 404)
return row["document"]
return self._active_managed_document(row["document"])
@staticmethod
def _active_managed_document(document: dict[str, Any]) -> dict[str, Any]:
"""Project a current active row without legacy soft-delete metadata."""
return {key: value for key, value in document.items()
if key not in {"deleted_at", "deleted_by"}}
def _list_managed(self, who: Identity, table: str, id_column: str,
limit: int, cursor: UUID | None) -> dict[str, Any]:
@@ -277,7 +283,7 @@ class PostgresStore:
sql += f" AND {id_column}>%s"
params.append(cursor)
rows = conn.execute(sql + f" ORDER BY {id_column} LIMIT %s", params + [limit + 1]).fetchall()
docs = [row["document"] for row in rows[:limit]]
docs = [self._active_managed_document(row["document"]) for row in rows[:limit]]
return {"items": docs, "next_cursor": docs[-1][id_column] if len(rows) > limit else None}
def _save_work_order(self, conn, who: Identity, document: dict[str, Any]) -> dict[str, Any]:
@@ -319,11 +325,18 @@ class PostgresStore:
"WORK_ORDER_NOT_FOUND", "测试工单不存在")
ensure(document["revision"] == command.expected_revision, "REVISION_CONFLICT", "工单版本已变化,请重新读取", 409)
changes = command.model_dump(mode="json", exclude_unset=True,
exclude={"request_id", "expected_revision", "clear_assignee", "clear_scheduled_at"})
exclude={"request_id", "expected_revision", "clear_assignee", "clear_scheduled_at",
"clear_location", "clear_scenario_code", "clear_subtasks"})
if command.clear_assignee:
changes["assignee"] = None
if command.clear_scheduled_at:
changes["scheduled_at"] = None
if command.clear_location:
changes["location"] = None
if command.clear_scenario_code:
changes["scenario_code"] = None
if command.clear_subtasks:
changes["subtasks"] = None
document.update(changes)
document.update(revision=document["revision"] + 1, updated_at=datetime.now(timezone.utc).isoformat(),
updated_by=who.user_id)