10 KiB
10 KiB
AIChatController 交互流程图
1. AI流式问答流程 (/ai/chat/stream)
1.1 流程图
flowchart TD
A[开始: 用户发起AI问答] --> B{用户已登录?}
B -->|否| C[返回错误: 用户未登录]
B -->|是| D{用户信息获取成功?}
D -->|否| E[返回错误: 用户信息获取失败]
D -->|是| F[获取部门信息]
F --> G[获取用户可访问知识库]
G --> H{知识库列表为空?}
H -->|是| I[返回错误: 没有可用的知识库]
H -->|否| J[获取或生成session_id]
J --> K[从数据库获取历史记录]
K --> L[调用AI服务进行流式问答]
L --> M[返回SseEmitter流式响应]
C --> N[结束]
E --> N
I --> N
M --> N
1.2 时序图
sequenceDiagram
autonumber
participant Client as 用户
participant AI as AIChatController
participant Auth as AuthService
participant Dept as DepartmentService
participant KB as KnowledgeBasePathService
participant Chat as ChatService
participant AIChat as AiChatService
Client->>+AI: POST /ai/chat/stream
AI->>+Auth: validateToken(token)
Auth-->>-AI: User对象
AI->>+Dept: getDepartmentById(deptId)
Dept-->>-AI: Department
AI->>+KB: getUserAccessibleKnowledgeBaseNames(userId, deptId, deptCode)
KB-->>-AI: List<String> collections
alt 知识库为空
AI-->>Client: 错误: 没有可用的知识库
end
AI->>+Chat: getSessionMessagesAsHistory(sessionId)
Chat-->>-AI: List<HistoryItem>
AI->>+AIChat: streamFromRagService(request, userId, deptId)
loop 流式响应
AIChat-->>Client: SSE事件流
end
AIChat-->>-AI: SseEmitter
AI-->>-Client: SseEmitter流式响应
1.3 流程说明
| 步骤 | 说明 | 代码位置 |
|---|---|---|
| 1. 用户发起请求 | POST /ai/chat/stream | AIChatController:56 |
| 2. 验证登录状态 | 检查Authorization header | AIChatController:61-73 |
| 3. 验证用户信息 | validateToken获取用户 | AIChatController:75-87 |
| 4. 获取部门信息 | 根据deptId获取Department | AIChatController:94-104 |
| 5. 获取知识库列表 | getUserAccessibleKnowledgeBaseNames | AIChatController:106 |
| 6. 生成session_id | 无session_id时生成新的 | AIChatController:123-127 |
| 7. 获取历史记录 | getSessionMessagesAsHistory | AIChatController:134-140 |
| 8. 调用AI服务 | streamFromRagService | AIChatController:145 |
2. 获取用户会话列表 (/ai/sessions)
2.1 流程图
flowchart TD
A[开始: 获取会话列表] --> B{用户已登录?}
B -->|否| C[返回: success=false, 用户未登录]
B -->|是| D[获取用户所有会话]
D --> E[实现简单分页]
E --> F[返回会话列表及分页信息]
C --> G[结束]
F --> G
2.2 时序图
sequenceDiagram
autonumber
participant Client as 用户
participant AI as AIChatController
participant Auth as AuthService
participant Chat as ChatService
Client->>+AI: GET /ai/sessions
AI->>+Auth: validateToken(token)
Auth-->>-AI: User对象
AI->>+Chat: getUserSessions(userId)
Chat-->>-AI: List<ChatSession>
Note over AI: 实现简单分页<br/>计算start/end
AI-->>-Client: 返回会话列表及分页信息
2.3 流程说明
| 步骤 | 说明 | 代码位置 |
|---|---|---|
| 1. 用户发起请求 | GET /ai/sessions | AIChatController:163 |
| 2. 验证登录状态 | getCurrentUserId | AIChatController:170-175 |
| 3. 获取会话列表 | chatService.getUserSessions | AIChatController:177 |
| 4. 分页处理 | 计算start/end | AIChatController:179-185 |
| 5. 返回结果 | 返回data/total/page等信息 | AIChatController:187-192 |
3. 获取会话详情 (/ai/session/{sessionId})
3.1 流程图
flowchart TD
A[开始: 获取会话详情] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D[获取用户所有会话]
D --> E{会话属于当前用户?}
E -->|否| F[返回: 无权访问该会话]
E -->|是| G[获取会话消息列表]
G --> H[实现简单分页]
H --> I[返回会话详情及分页信息]
C --> J[结束]
F --> J
I --> J
3.2 时序图
sequenceDiagram
autonumber
participant Client as 用户
participant AI as AIChatController
participant Auth as AuthService
participant Chat as ChatService
Client->>+AI: GET /ai/session/{sessionId}
AI->>+Auth: validateToken(token)
Auth-->>-AI: User对象
AI->>+Chat: getUserSessions(userId)
Chat-->>-AI: List<ChatSession>
Note over AI: 验证会话所属权
alt 会话不属于用户
AI-->>Client: 错误: 无权访问该会话
else 会话属于用户
AI->>+Chat: getSessionMessages(sessionId)
Chat-->>-AI: List<ChatMessage>
Note over AI: 实现简单分页
AI-->>-Client: 返回会话详情及分页信息
end
4. 删除单个会话 (/ai/session/{sessionId})
4.1 流程图
flowchart TD
A[开始: 删除单个会话] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D[获取用户所有会话]
D --> E{会话属于当前用户?}
E -->|否| F[返回: 无权删除该会话]
E -->|是| G[执行删除操作]
G --> H{删除成功?}
H -->|是| I[返回: 删除成功]
H -->|否| J[返回: 删除失败]
C --> K[结束]
F --> K
I --> K
J --> K
4.2 时序图
sequenceDiagram
autonumber
participant Client as 用户
participant AI as AIChatController
participant Auth as AuthService
participant Chat as ChatService
Client->>+AI: DELETE /ai/session/{sessionId}
AI->>+Auth: validateToken(token)
Auth-->>-AI: User对象
AI->>+Chat: getUserSessions(userId)
Chat-->>-AI: List<ChatSession>
Note over AI: 验证会话所属权
alt 会话不属于用户
AI-->>Client: 错误: 无权删除该会话
else 会话属于用户
AI->>+Chat: deleteSession(sessionId, userId)
Chat-->>-AI: boolean success
alt 删除成功
AI-->>Client: {success: true, message: "删除成功"}
else 删除失败
AI-->>Client: {success: false, message: "删除失败"}
end
end
5. 批量删除会话 (/ai/sessions)
5.1 流程图
flowchart TD
A[开始: 批量删除会话] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D{sessionIds列表有效?}
D -->|否| E[返回: 会话ID列表不能为空]
D -->|是| F[获取用户所有会话]
F --> G[提取用户会话ID集合]
G --> H{所有会话属于用户?}
H -->|否| I[返回: 无权删除部分会话]
H -->|是| J[执行批量删除]
J --> K{删除成功?}
K -->|是| L[返回: 批量删除成功]
K -->|否| M[返回: 批量删除失败]
C --> N[结束]
E --> N
I --> N
L --> N
M --> N
5.2 时序图
sequenceDiagram
autonumber
participant Client as 用户
participant AI as AIChatController
participant Auth as AuthService
participant Chat as ChatService
Client->>+AI: DELETE /ai/sessions
AI->>+Auth: validateToken(token)
Auth-->>-AI: User对象
alt sessionIds为空
AI-->>Client: 错误: 会话ID列表不能为空
end
AI->>+Chat: getUserSessions(userId)
Chat-->>-AI: List<ChatSession>
Note over AI: 提取用户会话ID集合<br/>验证所有会话属于用户
alt 部分会话不属于用户
AI-->>Client: 错误: 无权删除部分会话
else 所有会话属于用户
AI->>+Chat: deleteSessions(sessionIds, userId)
Chat-->>-AI: boolean success
alt 删除成功
AI-->>Client: {success: true, deletedCount: N}
else 删除失败
AI-->>Client: {success: false, message: "批量删除失败"}
end
end
6. 中断AI流式问答 (/ai/chat/stop)
6.1 流程图
flowchart TD
A[开始: 中断AI问答] --> B{用户已登录?}
B -->|否| C[返回: 用户未登录]
B -->|是| D[调用sseEmitterManager.stop]
D --> E{中断成功?}
E -->|是| F[返回: 已中断AI回答]
E -->|否| G[返回: 未找到活跃AI进程]
C --> H[结束]
F --> H
G --> H
6.2 时序图
sequenceDiagram
autonumber
participant Client as 用户
participant AI as AIChatController
participant Auth as AuthService
participant SSE as SseEmitterManager
Client->>+AI: POST /ai/chat/stop
AI->>+Auth: validateToken(token)
Auth-->>-AI: User对象
AI->>+SSE: stop(sessionId)
SSE-->>-AI: boolean success
alt 中断成功
AI-->>Client: {success: true, message: "已中断AI回答"}
else 中断失败
AI-->>Client: {success: false, message: "未找到活跃的AI进程或已结束"}
end
核心服务调用关系
flowchart LR
subgraph Controller
AI[AIChatController]
end
subgraph Service
AS[AuthService]
CS[ChatService]
ACS[AiChatService]
SS[SseEmitterManager]
KBS[KnowledgeBasePathService]
DS[DepartmentService]
end
subgraph Entity
U[User]
D[Department]
CS1[ChatSession]
CM[ChatMessage]
CR[ChatReference]
end
subgraph Database
DB[(MySQL)]
end
AI --> AS
AI --> CS
AI --> ACS
AI --> SS
AI --> KBS
AI --> DS
AS --> U
CS --> CS1
CS --> CM
CS --> CR
KBS --> DB
DS --> U
DS --> D
接口汇总
| 接口 | 方法 | 路径 | 功能 |
|---|---|---|---|
| chatStream | POST | /ai/chat/stream | AI流式问答 |
| getUserSessions | GET | /ai/sessions | 获取用户会话列表 |
| getSessionDetail | GET | /ai/session/{sessionId} | 获取会话详情 |
| getMessageReferences | GET | /ai/message/{messageId}/references | 获取消息引用 |
| getSessionReferences | GET | /ai/session/{sessionId}/references | 获取会话引用 |
| deleteSession | DELETE | /ai/session/{sessionId} | 删除单个会话 |
| deleteSessions | DELETE | /ai/sessions | 批量删除会话 |
| stopChatStream | POST | /ai/chat/stop | 中断AI流式问答 |