Files
wecom_it_smart_desk/docs/11-历史归档/IT智能服务台-技术架构设计-archived-20260704.md
T

659 lines
26 KiB
Markdown
Raw Normal View History

# IT智能服务台 — 系统架构设计文档
> **文档版本**: v1.0
> **创建日期**: 2025-07-11
> **最近更新**: 2026-07-04
> **架构师**: 高见远 (Bob)
> **状态**: 正式版
---
## 目录
1. [技术文档索引](#1-技术文档索引)
2. [系统概述](#2-系统概述)
3. [整体架构](#3-整体架构)
4. [技术选型](#4-技术选型)
5. [部署架构](#5-部署架构)
6. [统一入口设计](#6-统一入口设计)
7. [模块架构](#7-模块架构)
8. [AI Wingman 设计](#8-ai-wingman-设计)
9. [外部系统集成](#9-外部系统集成)
10. [安全设计](#10-安全设计)
11. [复杂对话场景设计](#11-复杂对话场景设计)
12. [数据库设计](#12-数据库设计)
13. [API设计规范](#13-api设计规范)
---
## 1. 技术文档索引
本文档为技术架构主文档,相关详细设计文档如下:
| 文档 | 说明 | 状态 |
|------|------|------|
| [IT智能服务台-技术架构设计.md](./IT智能服务台-技术架构设计.md) | 本文档 — 系统架构总览 | ✅ 正式 |
| [统一入口技术设计文档.md](./统一入口技术设计文档.md) | Portal 统一入口详细设计 | ✅ 实施中 |
| [ExternalSystemAdapter设计文档.md](./ExternalSystemAdapter设计文档.md) | 外部系统适配层设计 | ✅ 设计完成 |
| [Wingman设计.md](./Wingman设计.md) | AI 僚机系统设计 | ✅ 设计阶段 |
| [重构方案-复杂场景技术方案.md](./重构方案-复杂场景技术方案.md) | 复杂对话场景技术方案 | ✅ 设计完成 |
| [消息功能详细方案.md](./消息功能详细方案.md) | 消息功能详细设计 | ✅ 已实现 |
| [摇人-多坐席协作-技术方案.md](./摇人-多坐席协作-技术方案.md) | 多坐席协作方案 | ✅ 已实现 |
| [邀请功能-技术方案.md](./邀请功能-技术方案.md) | 邀请功能方案 | ✅ 已实现 |
---
## 2. 系统概述
### 2.1 项目背景
IT智能服务台是为企业提供 IT support 的智能化服务平台,核心目标:
- **员工侧**:通过 H5 页面提交 IT 问题、AI 自助解答、人工坐席服务
- **坐席侧**:通过自研工作台处理会话、AI 辅助( Wingman )、知识推荐
- **管理侧**:通过管理后台配置系统、管理坐席、查看数据
### 2.2 核心能力
| 能力 | 说明 |
|------|------|
| 消息路由 | AI 与人工无缝切换 |
| 实时会话 | 坐席工作台实时消息 |
| AI 辅助 | Wingman 草稿/摘要/知识推荐 |
| 外部集成 | 联软/火绒/aTrust/eHR 终端数据 |
| 角色管理 | 统一入口 + RBAC 权限 |
---
## 3. 整体架构
### 3.1 系统架构图
```
┌─────────────────────────────────────────────────────────────────────┐
│ Linux 服务器 Docker │
│ │
│ ┌──────────┐ ┌──────────────┐ ┌──────────────┐ ┌────────────┐ │
│ │ Nginx │ │ Frontend │ │ Frontend │ │ Frontend │ │
│ │ (反代) │──│ Agent │ │ H5 User │ │ Portal │ │
│ │ :80/:443│ │ (Vue3+EP) │ │ (Vue3+Vant4)│ │ (Vue3) │ │
│ └────┬─────┘ └──────────────┘ └──────────────┘ └────────────┘ │
│ │ :5173 :5174 :5176 │
│ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ FastAPI │ │ Redis │ │PostgreSQL│ │ Dify AI │ │
│ │ Backend │──│ (缓存/Session)│──│ (持久化) │──│ (外部依赖) │ │
│ │ :8000 │ │ :6379 │ │ :5432 │ │ │ │
│ └────┬─────┘ └──────────┘ └──────────┘ └──────────────┘ │
│ │ │
└───────┼──────────────────────────────────────────────────────────────────┘
│ HTTPS
┌───────────────┐
│ 企微服务器 │
│ (消息回调API) │
└───────────────┘
```
### 3.2 前端架构
| 端 | 路径 | 技术栈 | 端口 |
|----|------|--------|------|
| Portal | /itportal/ | Vue3 + Element Plus | 5176 |
| 坐席端 | /itagent/ | Vue3 + Element Plus | 5173 |
| H5用户端 | /itdesk/ | Vue3 + Vant 4 | 5174 |
| 管理后台 | /itadmin/ | Vue3 + Element Plus + Tailwind | 5175 |
### 3.3 后端架构
```
backend/
├── app/
│ ├── api/ # API 路由
│ │ ├── admin.py # 管理后台 API
│ │ ├── agents.py # 坐席 API
│ │ ├── h5.py # H5 用户端 API
│ │ ├── portal.py # 统一入口 API
│ │ └── wecom.py # 企微回调 API
│ ├── models/ # 数据模型
│ ├── schemas/ # Pydantic Schema
│ ├── services/ # 业务逻辑
│ │ ├── wingman.py # AI 僚机服务
│ │ ├── external/ # 外部系统适配器
│ │ └── message_router.py # 消息路由
│ └── config.py # 配置管理
├── alembic/ # 数据库迁移
└── requirements.txt
```
---
## 4. 技术选型
### 4.1 核心技术栈
| 层级 | 技术 | 版本 | 说明 |
|------|------|------|------|
| 前端框架 | Vue 3 | ^3.4.0 | Composition API |
| 前端路由 | Vue Router | ^4.3.0 | SPA 路由 |
| 状态管理 | Pinia | ^2.1.0 | 轻量级状态管理 |
| UI 组件 | Element Plus | ^2.7.0 | 坐席端/Portal |
| UI 组件 | Vant 4 | ^4.0 | H5 移动端 |
| 样式 | Tailwind CSS | ^3.4.0 | 管理后台 |
| 构建工具 | Vite | ^5.3.0 | 快速构建 |
| 后端框架 | FastAPI | 0.110+ | 异步高性能 |
| ORM | SQLAlchemy | 2.0+ | async ORM |
| 数据库 | PostgreSQL | 16 | 主数据存储 |
| 缓存 | Redis | 7 | Session/Token/缓存 |
| AI 引擎 | Dify | — | 外部依赖 |
### 4.2 关键技术挑战与解决方案
| # | 挑战 | 解决方案 |
|---|------|---------|
| 1 | 企微消息加解密 | 使用 `cryptography` 库实现 AES-CBC-256 加解密 |
| 2 | access_token 管理 | Redis 缓存 + 过期自动刷新(提前 300 秒刷新) |
| 3 | 坐席端实时性 | 短轮询(3-5 秒)+ WebSocket 推送 |
| 4 | 消息路由 | 路由层统一分发,AI/人工无缝切换 |
| 5 | OAuth2 静默授权 | 企微 OAuth2 授权 + 后端换算用户身份 |
---
## 5. 部署架构
### 5.1 部署拓扑
```
┌────────────────────────────┐
│ 企微服务器(外部) │
│ qyapi.weixin.qq.com │
└──────────┬─────────────────┘
│ HTTPS :443
┌──────────────── 办公网络 ────────────────────────────────┐
│ │
│ ┌──────────┐ ┌──────────────────────────┐ │
│ │ 坐席浏览器 │────────▶│ https://itsupport. │ │
│ │ (内网) │ HTTPS │ servyou.com.cn │ │
│ └──────────┘ └──────────┬───────────────┘ │
│ │ │
├────────────────── OA 服务器网络 ──┼───────────────────────┤
│ │ │
│ ┌───────▼──────────────┐ │
│ │ 服务器 (Docker) │ │
│ │ │ │
│ │ ┌────────────────┐ │ │
│ │ │ Nginx :80/443 │ │ │
│ │ │ 独立容器 │ │ │
│ │ └───────┬────────┘ │ │
│ │ │ │ │
│ │ ┌───────▼────────┐ │ │
│ │ │ FastAPI :8000 │ │ │
│ │ │ 独立容器 │ │ │
│ │ └───┬───────┬────┘ │ │
│ │ │ │ │ │
│ │ ┌───▼──┐ ┌──▼───┐ │ │
│ │ │ PG16 │ │Redis7│ │ │
│ │ │独立容器│ │独立容器│ │ │
│ │ └──────┘ └──────┘ │ │
│ └──────────────────────┘ │
│ │ │
│ ┌────────▼──────────────┐ │
│ │ 现有 AI 服务(外部依赖)│ │
│ │ ├─ Dify │ │
│ │ ├─ RAGFlow │ │
│ │ └─ Qwen3-30B │ │
│ └───────────────────────┘ │
└──────────────────────────────────────────────────────────┘
```
### 5.2 Docker 容器拓扑
```
新服务器 Docker Engine
├── Docker Network: itdesk_net (bridge, internal)
│ │
│ ├── Container: wecom_it_postgres
│ │ Image: postgres:16-alpine
│ │ Volume: wecom_it_postgres_data
│ │ Port: 5432 (仅 itdesk_net 内部)
│ │
│ ├── Container: wecom_it_redis
│ │ Image: redis:7-alpine
│ │ Volume: wecom_it_redis_data
│ │ Port: 6379 (仅 itdesk_net 内部)
│ │
│ ├── Container: wecom_it_backend
│ │ Image: wecom-it-desk-backend:latest
│ │ Port: 8000 (仅 itdesk_net 内部)
│ │ Env: DATABASE_URL, REDIS_URL, WECOM_*
│ │ Healthcheck: GET /health
│ │
│ └── Container: wecom_it_nginx
│ Image: nginx:1.27-alpine
│ Port: 80:80, 443:443 (宿主机映射)
│ Volumes: nginx.conf:ro, 前端dist:ro, SSL:ro
│ Healthcheck: GET /health
└── Volumes (命名卷,持久化)
├── wecom_it_postgres_data
└── wecom_it_redis_data
```
### 5.3 关键隔离策略
| 隔离层面 | 方案 | 隔离效果 |
|---------|------|---------|
| 服务器级 | 独立 VM | 挂了不影响其他系统 |
| 网络级 | Docker 内部网络 | PG/Redis 不暴露端口 |
| 存储级 | 独立命名卷 | 数据完全隔离 |
| 域名级 | 独立子域名 | 变更不影响其他系统 |
| 认证级 | JWT + 独立 Redis | 账户体系独立 |
---
## 6. 统一入口设计
### 6.1 概述
统一入口(Portal)是系统的唯一认证入口,所有用户必须通过企微工作台进入系统。
**核心功能**
- 企微 OAuth2 静默授权
- 角色检测与路由选择
- 统一 Token 管理
### 6.2 角色路由逻辑
```
OAuth2 授权完成
查询角色列表: GET /api/portal/roles
├── 仅 user 角色 → 直接跳转 /itdesk/
├── user + agent → 显示选择页(2张卡片)
├── user + admin → 显示选择页(2张卡片)
└── user + agent + admin → 显示选择页(3张卡片)
```
### 6.3 URL 路径规划
| 端 | 路径 | 说明 |
|---|------|------|
| 统一入口 | /itportal/ | 路由选择页 |
| 用户端 | /itdesk/ | 员工提交工单 |
| 坐席端 | /itagent/ | IT坐席处理会话 |
| 管理端 | /itadmin/ | 系统配置 |
| API | /api/ | 后端接口 |
### 6.4 数据库设计
#### 角色表 (roles)
```sql
CREATE TABLE roles (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL UNIQUE, -- 角色标识: user/agent/admin
display_name VARCHAR(100) NOT NULL, -- 显示名称
description TEXT, -- 角色描述
permissions JSONB DEFAULT '[]', -- 权限列表
is_default BOOLEAN DEFAULT FALSE, -- 是否默认角色
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
#### 用户角色关联表 (user_roles)
```sql
CREATE TABLE user_roles (
id SERIAL PRIMARY KEY,
employee_id VARCHAR(100) NOT NULL, -- 企微 UserID
role_id INTEGER NOT NULL REFERENCES roles(id),
source VARCHAR(50) NOT NULL, -- 来源: auto/tag/ehr/manual
assigned_by VARCHAR(100), -- 分配者
assigned_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expires_at TIMESTAMP, -- 过期时间
UNIQUE(employee_id, role_id)
);
```
---
## 7. 模块架构
### 7.1 管理后台模块
详见 [ARCHITECTURE-admin.md](./ARCHITECTURE-admin.md)
**技术栈**Vue 3 + TypeScript + Element Plus + Tailwind CSS + Pinia
**核心功能**
- 运营仪表盘
- 功能开关配置
- 坐席管理(角色/技能标签)
- 外部系统集成配置
- 快速回复审核
- 会话监控
### 7.2 坐席工作台模块
**技术栈**Vue 3 + TypeScript + Element Plus + Pinia
**核心功能**
- 会话列表(排队/进行中/已解决)
- 实时聊天
- 快速回复
- AI Wingman 右侧栏
- 消息标记(VIP/招手/情绪)
### 7.3 H5 用户端模块
**技术栈**Vue 3 + Vant 4 + TypeScript
**核心功能**
- 消息发送/接收
- 排查步骤引导
- 会话状态查看
- 满意度评价
---
## 8. AI Wingman 设计
详见 [Wingman设计.md](./Wingman设计.md)
### 8.1 什么是 Wingman
Wingman 是坐席工作台的 AI 辅助系统,在坐席处理会话时实时提供:
- **草稿回复**:坐席打字 → AI 实时生成 3 条草稿
- **自动摘要**:会话结束 → AI 200 字摘要
- **知识推荐**:对话中识别关键字 → 推 FAQ
- **排查步骤**:员工描述问题 → AI 给 step-by-step
### 8.2 系统架构
```
┌─────────────────────────────────────────────────────────┐
│ FastAPI 后端 │
│ ┌──────────────────────────────────────────────┐ │
│ │ WingmanService (wingman.py) │ │
│ │ ├── draft_reply() 草稿回复 │ │
│ │ ├── summarize() 自动摘要 │ │
│ │ ├── recommend_knowledge() 知识推荐 │ │
│ │ └── troubleshoot() 排查步骤 │ │
│ └────────────────┬─────────────────────────────┘ │
│ │ │
│ ┌────────────────▼─────────────────────────────┐ │
│ │ DifyClient (dify_client.py) │ │
│ └──────────────────────────────────────────────┘ │
└────────────────────┬────────────────────────────────────┘
│ HTTPS
┌─────────────────────────────────────────────────────────┐
│ Dify 平台 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 工作流 A │ │ 工作流 B │ │ 工作流 C │ │
│ │ 草稿回复 │ │ 摘要生成 │ │ 排查步骤 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────┘
```
### 8.3 数据模型
```python
class WingmanDraft(Base):
"""草稿回复"""
__tablename__ = "wingman_drafts"
conv_id = Column(String, ForeignKey("conversations.id"))
agent_id = Column(String, ForeignKey("agents.id"))
drafts = Column(JSON) # ["draft1", "draft2", "draft3"]
context_messages = Column(JSON) # 最近 10 条消息
accepted_index = Column(Integer, nullable=True)
expires_at = Column(DateTime) # 5 分钟后过期
class WingmanSummary(Base):
"""会话摘要"""
__tablename__ = "wingman_summaries"
conv_id = Column(String, unique=True)
summary = Column(String(2000)) # AI 生成
edited_summary = Column(String(2000)) # 坐席修改
final_summary = Column(String(2000)) # 最终版本
agent_id = Column(String)
```
---
## 9. 外部系统集成
详见 [ExternalSystemAdapter设计文档.md](./ExternalSystemAdapter设计文档.md)
### 9.1 系统角色与优先级
| 系统 | 角色 | 核心能力 | 认证方式 |
|------|------|---------|---------|
| 联软LV7000 | 主映射源(P0) | 终端查询、硬件详情、在线状态 | IP白名单+账号密码 |
| 火绒企业版 | 安全源(P0) | 终端列表、漏洞/病毒事件 | HMAC-SHA1 AccessKey |
| aTrust | VPN源(P1) | 在线用户+VPN IP、终端查询 | HMAC-SHA256签名 |
| 北森eHR | 辅助静态数据(P2) | 员工基础信息、任职信息 | OAuth2.0 |
### 9.2 架构分层
```
┌─────────────────────────────────────────────────┐
│ 上层业务代码(AI Wingman等) │
├─────────────────────────────────────────────────┤
│ ExternalSystemService(统一门面) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 缓存层 │ │ 降级策略 │ │ 配置管理 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
├─────────────────────────────────────────────────┤
│ ExternalSystemAdapter(抽象基类) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────┐│
│ │ LianRuan │ │ HuoRong │ │ aTrust │ │eHR ││
│ │ Adapter │ │ Adapter │ │ Adapter │ │适配││
│ └──────────┘ └──────────┘ └──────────┘ └────┘│
├─────────────────────────────────────────────────┤
│ MockAdapter(开发期) │
└─────────────────────────────────────────────────┘
```
### 9.3 核心抽象接口
```python
class ExternalSystemAdapter(ABC):
@property
@abstractmethod
def system_name(self) -> str: ...
@property
@abstractmethod
def is_available(self) -> bool: ...
@abstractmethod
async def health_check(self) -> bool: ...
async def get_terminal_by_user(self, username: str) -> Optional[TerminalInfo]: ...
async def get_security_status(self, terminal_id: str) -> Optional[SecurityStatus]: ...
```
---
## 10. 安全设计
### 10.1 认证安全
| 安全措施 | 说明 |
|----------|------|
| OAuth2 静默授权 | scope=snsapi_base,用户无感知 |
| state 参数防 CSRF | 随机 state,回调时验证 |
| Token 密码学安全 | secrets.token_urlsafe(32) |
| Token TTL 8小时 | Redis 自动过期 |
| redirect_uri 白名单 | 生产环境仅允许正式域名 |
| 企微 UA 检测 | 非企微 WebView 拒绝访问 |
### 10.2 角色安全
| 安全措施 | 说明 |
|----------|------|
| 角色最小权限 | 默认仅 user 角色 |
| 角色来源追溯 | user_roles 表记录 source 和 assigned_by |
| 管理端 IP 白名单 | 仅内网/VPN 可访问 |
| OTP 二次验证 | 管理后台访问需 OTP 验证 |
### 10.3 API 安全
| 安全措施 | 说明 |
|----------|------|
| API Key 认证 | 外部系统独立认证通道 |
| 速率限制 | slowapi 中间件 |
| CORS 配置 | 限制允许的来源 |
---
## 11. 复杂对话场景设计
详见 [重构方案-复杂场景技术方案.md](./重构方案-复杂场景技术方案.md)
### 11.1 设计理念:TeliChat 三重约束
| 约束 | 作用 | 实现方式 |
|------|------|---------|
| 拓扑结构限制 | 限制对话可以走到哪里 | Neo4j DAG 边定义 |
| 信息状态约束 | 决定当前已经知道什么 | 信息项组合状态 |
| Python 代码约束 | 负责真正的业务判断 | FastAPI 业务逻辑 |
### 11.2 信息项修饰机制
| 修饰 | 含义 | 应用场景 |
|------|------|---------|
| 固定 | 用户回答后不再重复询问 | 已通过系统获取的信息 |
| 增量 | 允许用户补充新信息 | 故障描述、错误信息 |
| 明确 | 必须明确回答 | 紧急程度确认 |
| 隐含 | 可以从上下文推断 | AI 推断的问题类型 |
| 复述 | 要求用户确认信息正确性 | 重要操作确认 |
| 必需 | 必须填写才能进入下一节点 | 必填字段 |
### 11.3 全局意图类型
| 意图 | 用户表达示例 | 处理策略 |
|------|-------------|---------|
| SKIP | "这个问题先不管了" | 跳过当前节点 |
| INSERT | "对了,我的打印机也有问题" | 插入新任务到队列 |
| RESUME | "还是说回刚才那个网络问题" | 恢复之前话题 |
| SWITCH | "先帮我看看VPN吧" | 切换到指定话题 |
| CORRECT | "刚才说错了,是win10" | 更新信息项值 |
| PAUSE | "我先去开会,等会继续" | 保存状态,等待恢复 |
| ESCALATE | "叫个人工来" | 转接坐席 |
### 11.4 核心场景
| 场景 | 支持状态 |
|------|---------|
| 非线性跳转 | ✅ 支持 |
| 多意图并行 | ✅ 支持 |
| 信息更正 | ✅ 支持 |
| 任务中断恢复 | ✅ 支持 |
---
## 12. 数据库设计
### 12.1 核心表结构
| 表名 | 说明 |
|------|------|
| agents | 坐席信息 |
| conversations | 会话表 |
| messages | 消息表 |
| quick_reply_templates | 快速回复模板 |
| system_configs | 系统配置 |
| roles | 角色表 |
| user_roles | 用户角色关联 |
| role_mapping_rules | 角色映射规则 |
### 12.2 Alembic 迁移
所有数据库迁移位于 `backend/alembic/versions/` 目录,按序号执行:
```
alembic/
├── env.py # 迁移环境配置
├── script.py.mako
└── versions/
├── 001_initial.py # 初始表结构
├── 002_agents.py # 坐席扩展
├── 003_conversations.py
├── 004_messages.py
├── 005_system_configs.py
└── ... # 后续迁移
```
---
## 13. API 设计规范
### 13.1 响应格式
```json
// 成功
{"code": 0, "data": {...}, "message": "success"}
// 失败
{"code": 1001, "data": null, "message": "参数错误"}
```
### 13.2 错误码规范
| 错误码 | 含义 |
|--------|------|
| 0 | 成功 |
| 1001 | 参数错误 |
| 1002 | 未授权 |
| 1003 | 资源不存在 |
| 1004 | 无权限访问 |
| 1005 | 服务器内部错误 |
### 13.3 认证方式
| 端 | localStorage 键 | 说明 |
|----|-----------------|------|
| 坐席端 | `agent_token` | 坐席工作台 |
| 管理后台 | `admin_token` | 管理后台 |
| 统一入口 | `user_token` | Portal |
---
## 附录
### A. 项目阶段规划
| 阶段 | 内容 |
|------|------|
| 阶段一 | 转人工改H5+坐席MVP+邀请+管理后台 |
| 阶段二 | H5全流程+WS+排队+满意度+OAuth2 |
| 阶段三 | AI Wingman+排查流程图+标注 |
| 阶段四 | 迭代闭环+数据看板+知识库 |
| 阶段五 | 自动/辅助审核、开单、结单 |
### B. 部署信息
| 环境 | 域名 | IP |
|------|------|-----|
| 生产 | itsupport.servyou.com.cn | 10.90.5.110 |
| 测试 | itdesk.amanzac.com | NAS |
### C. 技术文档更新日志
| 版本 | 日期 | 修改内容 |
|------|------|---------|
| v1.0 | 2026-07-04 | 整合技术架构文档,统一入口、部署、AI Wingman、外部系统集成等模块 |
---
> **文档结束** — 本文档为 IT 智能服务台系统架构设计主文档