# 代办事项时序图 ## 1. 代办列表查询流程 ```mermaid sequenceDiagram participant FE as 前端 TodoPanel participant API as GET /api/todo-items participant Agg as TodoAggregatorService participant Cache as Redis Cache participant Appr as ApprovalTodoService participant Wecom as 企微审批API participant ITSM as ITSMService participant ITSM_API as ITSM OpenAPI FE->>API: GET /api/todo-items?type=approval API->>Agg: get_todo_list(agent_userid, type="approval") Agg->>Cache: GET todo:cache:{userid}:approval alt 缓存命中 Cache-->>Agg: cached_data Agg-->>API: {items, total, cached:true} else 缓存未命中 Agg->>Agg: asyncio.gather(approval_svc, itsm_svc, return_exceptions=True) par 并行查询审批 Agg->>Appr: get_todo_list() Appr->>Wecom: getapprovaldata(sp_status=1, templates=18) Wecom-->>Appr: sp_no_list Appr->>Appr: asyncio.gather(getapprovaldetail × N) loop 每个sp_no并发获取详情 Appr->>Wecom: getapprovaldetail(sp_no) Wecom-->>Appr: approval_detail end Appr->>Appr: _filter_by_current_approver(details) Appr->>Appr: _map_to_todo_item(detail) Appr-->>Agg: List[TodoItemData] and 并行查询工单 Agg->>ITSM: get_todo_list() Note over ITSM: ITSM列表API待实现
当前返回空列表+日志告警 ITSM-->>Agg: List[TodoItemData] (空) end Agg->>Agg: merge + sort by priority Agg->>Cache: SET todo:cache:{userid}:approval TTL=45s Agg-->>API: {items, total, cached:false} end API-->>FE: {code:0, data:{items, total}} ``` ## 2. 代办详情查询流程 ```mermaid sequenceDiagram participant FE as 前端 TaskDetailView participant API as GET /api/todo-items/{id} participant Agg as TodoAggregatorService participant Appr as ApprovalTodoService participant ITSM as ITSMService participant Wecom as 企微审批API participant ITSM_API as ITSM OpenAPI FE->>API: GET /api/todo-items/approval:{sp_no} API->>Agg: get_todo_detail(agent_userid, item_id, todo_type="approval") alt type == "approval" Agg->>Appr: get_todo_detail(sp_no) Appr->>Wecom: getapprovaldetail(sp_no) Wecom-->>Appr: approval_detail Appr->>Appr: _map_to_todo_item(detail) Appr-->>Agg: TodoItemData else type == "ticket" Agg->>ITSM: get_todo_detail(workitem_id) ITSM->>ITSM_API: POST /openapi/v1/process/workitem/detail ITSM_API-->>ITSM: {code:20000, data:{workitem_detail}} ITSM->>ITSM: _map_to_todo_item(detail) ITSM-->>Agg: TodoItemData end Agg-->>API: TodoItemData API-->>FE: {code:0, data:{item}} ``` ## 3. ITSM 签名认证流程 ```mermaid sequenceDiagram participant Svc as ITSMService participant Signer as ITSMSigner participant API as ITSM OpenAPI Svc->>Svc: timestamp = str(int(time.time()*1000)) Svc->>Signer: compute_signature(app_id, timestamp, app_secret, biz_data) Signer->>Signer: sign_params = {appId, timestamp, appSecret, bizData} Signer->>Signer: sort by key ASC Signer->>Signer: concat all values → canonicalized_str Signer->>Signer: quote_plus(canonicalized_str) Signer->>Signer: sha1(q2).hexdigest().upper() Signer-->>Svc: sign_str Svc->>API: POST url, headers={appId, timestamp, sign}, json=body API-->>Svc: {code:20000, data:{...}} ```