sequenceDiagram autonumber actor User as 员工 participant H5 as H5 ConversationStore participant WS as FastAPI ws.py participant DB as PostgreSQL/messages participant WSM as ws_manager participant Agent as 坐席 Store/MessageBubble participant Task as h5_ai_task.py participant Dify as Dify Workflow participant REST as messages.py User->>H5: 点击选项 H5->>H5: 首次生成 client_msg_id(UUID) H5->>WS: option_select(6字段) WS->>DB: BEGIN + pg_advisory_xact_lock(key) WS->>DB: 查询同会话同 client_msg_id alt 5秒内重复 DB-->>WS: 返回首次 Message WS-->>H5: 不重复落库/广播/Dify else 首次受理 WS->>DB: INSERT Message(msg_type=option_select) WS->>DB: COMMIT WS->>WSM: broadcast new_message(masked message) WSM-->>Agent: new_message Agent->>Agent: 追加消息并按 question_id 计算最新 WS->>Task: create_task(feedback_context) Task->>Dify: inputs{feedback_type, question_id, option_id...} Dify-->>Task: 下一轮结构化回复 end Agent-xWSM: 网络断开 Agent->>REST: GET /conversations/{id}/messages REST->>DB: SELECT conversation_id ORDER BY created_at DB-->>REST: 含 option_select 历史 REST-->>Agent: masked items Agent->>Agent: 用 created_at + id 恢复最新高亮