后端维护两套独立连接池:employee_connections(员工 H5)与 active_connections(坐席 Web)。
一次 AI 推理产出的统一消息 {text,action,options} 经后端解析后,拆分为
ai_reply(聊天气泡)与 dynamic_recommend(侧边栏卡片),并通过 ai_thinking 事件同时推送两端,实现"员工看到思考过程、坐席同步可见"的协同体验。
早期各场景各自调用 AI、消息格式不统一。重构后统一为 单通道:Dify 仅输出结构化 JSON {text, action, options},
后端做阻塞式解析与降级(30s 超时 / 15s still_thinking),再向双端推送——
文字进聊天气泡、选项卡片进侧边栏、思考状态两端同步,彻底消除"员工与坐席看到不同 AI 状态"的断层。
| 分层 | 技术选型与说明 |
|---|---|
| 员工前端 | Vue3 + Vant4,运行于企微 H5 环境,集成企微 JS-SDK(OAuth2 免登、语音转文字、原生审批表单) |
| 坐席 / 管理前端 | Vue3 + Element Plus(坐席三栏工作台)/ Tailwind(管理后台);键盘快捷键 v2.3 中央管理器 |
| 后端 | FastAPI + SQLAlchemy + PostgreSQL + Redis;消息管线 process_h5_ai_reply、诊断闭环(queue/quiz/closing)、内容审核 |
| AI 中台 | Dify(工作流编排:主对话/分诊/审批意图/知识)+ RAGFlow(知识检索,10.80.0.85:8080)+ 千问大模型(LLM 推理) |
| 实时通道 | WebSocket 双连接池(employee_connections / active_connections),推送 ai_reply / dynamic_recommend / ai_thinking |
| 外部集成 | 企微通讯录(Secret 鉴权、access_token 缓存)+ JS-SDK 双鉴权;联软(主)/aTrust( VPN )/eHR(静态) 终端→用户映射 |
| 部署 | Docker Compose:后端 + nginx + 多前端 ro bind mount;WAF 前置按 path 缓存,版本化 PATH + 302 跳板破除缓存 |
| 系统 | 用途 / 接入点 | 状态 |
|---|---|---|
| Dify | 主对话 app-8f0f3d62…、分诊 app-z3S9…、审批 app-7jkRk…(老应用 app-UaTWY… 已禁用) | ✅ 已上线 |
| RAGFlow | 知识检索服务 http://10.80.0.85:8080/(API :9380) | ✅ 已上线 |
| 企微通讯录 | 通讯录 Secret 鉴权、access_token 缓存(Redis key wecom:contact_access_token);JS-SDK wx.config + wx.agentConfig 双鉴权 | ✅ 已上线 |
| 联软 / aTrust / eHR | 终端 IP / 主机名 → 用户身份映射(联软为主,aTrust 备选,eHR 静态兜底) | ✅ 已接入 |
| ITSM 工单平台 | 工单卡片跳转与目标系统打通(需 app_id/app_secret 授权) | ⏸️ 待授权(BLK-B,阻塞 26 天) |
| 企微会议室 | 会议室预定功能所需 Secret(影响 /itterminal/) | ⏸️ 待申请(BLK-A,阻塞 26 天) |
dist 均为只读 bind mount,仅能在宿主机源路径(含 /src/,如 /opt/wecom-it-desk/src/frontend-h5/dist)操作;
域名前置 WAF 按 path 缓存、忽略 query,故发版须用版本化 PATH + 302 跳板(如 /h5/go → /h5/v<日期>/),禁用 ?v= 查询参数打缓存。