fix(workbench): remove synthetic check projections

This commit is contained in:
2026-09-24 12:01:01 +08:00
parent 1a6ff64bbe
commit e374b5b3cb
25 changed files with 953 additions and 935 deletions
+17 -115
View File
@@ -108,119 +108,16 @@ WORK_ORDER_TEMPLATES = (
)
def _clock(value: datetime) -> str:
return value.astimezone(SHANGHAI).strftime("%H:%M")
def _clock_range(start: datetime, duration_minutes: int) -> str:
return f"{_clock(start)}-{_clock(start + timedelta(minutes=duration_minutes))}"
def _stage_statuses(phase: str, position: str) -> tuple[str, str, str]:
if position == "before":
return "done", "done", "done"
if position == "after":
return "pending", "pending", "pending"
if phase == "dispatch":
return "current", "pending", "pending"
if phase == "execution":
return "done", "current", "pending"
return "done", "done", "current"
def _subtask_status(phase: str, position: str) -> str:
if position == "before":
return "completed"
if position == "after" or phase == "dispatch":
return "pending"
return "running"
def _build_subtasks(template: dict, scheduled_at: datetime) -> list[dict]:
requirements = template["reply_requirements"]
phase = template["phase"]
active_index = {
"dispatch": 0,
"execution": min(1, len(requirements) - 1),
"reply": len(requirements) - 1,
}[phase]
subtask_duration = max(
5,
(template["duration_minutes"] + len(requirements) - 1) // len(requirements),
)
subtasks = []
for index, requirement in enumerate(requirements):
position = (
"before"
if index < active_index
else "after"
if index > active_index
else "active"
)
subtask_start = scheduled_at + timedelta(minutes=index * subtask_duration)
execution_end = subtask_start + timedelta(minutes=subtask_duration)
reply_end = execution_end + timedelta(minutes=template["reply_window_minutes"])
dispatch_status, execution_status, reply_status = _stage_statuses(
phase, position
)
subtasks.append(
{
"id": f"{template['id']}-subtask-{index + 1}",
"title": requirement,
"summary": f"完成“{requirement}”并保留可复核的阶段记录。",
"status": _subtask_status(phase, position),
"scheduled_at": subtask_start,
"location": template["location"],
"assignee": template["assignee"],
"duration_minutes": subtask_duration,
"reply_window_minutes": template["reply_window_minutes"],
"stages": [
{
"id": "dispatch",
"sequence": 1,
"title": "派发",
"status": dispatch_status,
"owner": template["dispatcher"],
"time_label": _clock(
subtask_start
- timedelta(minutes=template["dispatch_lead_minutes"])
),
"description": (
f"确认{template['location']}任务范围、优先级和到场窗口,"
f"派发给{template['assignee']}。"
),
},
{
"id": "execution",
"sequence": 2,
"title": "执行中",
"status": execution_status,
"owner": template["assignee"],
"time_label": _clock_range(subtask_start, subtask_duration),
"description": template["summary"],
},
{
"id": "reply",
"sequence": 3,
"title": "待复令",
"status": reply_status,
"owner": f"{template['assignee']} → 调度中心",
"time_label": _clock_range(
execution_end,
template["reply_window_minutes"],
),
"description": (
"提交处置结果、现场照片和影响复核,"
f"最迟 {_clock(reply_end)} 前完成复令。"
),
},
],
"reply_requirements": [f"回传“{requirement}”的执行结果"],
}
)
return subtasks
def _build_activity(template: dict, scheduled_at: datetime, updated_at: datetime) -> list[dict]:
created_at = scheduled_at - timedelta(minutes=template["dispatch_lead_minutes"])
activity = [{"sequence": 1, "occurred_at": created_at,
"actor": template["dispatcher"], "kind": "created",
"title": "演示工单创建", "detail": template["summary"]}]
if template["phase"] != "dispatch":
activity.append({"sequence": 2, "occurred_at": updated_at,
"actor": template["assignee"], "kind": "updated",
"title": "演示状态更新", "detail": template["detail"]})
return activity
def build_demo_work_orders() -> list[dict]:
@@ -256,7 +153,10 @@ def build_demo_work_orders() -> list[dict]:
"source": template["source"],
"dispatcher": template["dispatcher"],
"priority": template["priority"],
"subtasks": _build_subtasks(template, scheduled_at),
"location": template["location"],
"assignee": template["assignee"],
"feedback_requirements": template["reply_requirements"],
"activity": _build_activity(template, scheduled_at, updated_at),
}
documents.append(
WorkbenchRuntimeWorkOrder.model_validate(projected).model_dump(mode="json")
@@ -352,7 +252,9 @@ def main() -> int:
"code": document["code"],
"title": document["title"],
"status": document["status"],
"subtask_count": len(document["subtasks"]),
"feedback_requirement_count": len(
document["feedback_requirements"]
),
}
for document in documents
],