Files
aurak/docs/feishu-assessment-implementation-summary.md
Developer 0a9588abb7 feat: implement QuestionBank CRUD with pagination and template query
- Add pagination support to findAll (page, limit query params)
- Add findByTemplateId method to service
- Add GET /by-template/:templateId endpoint to controller
- Service already includes CRUD for QuestionBank and QuestionBankItem
2026-04-23 17:19:11 +08:00

298 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 飞书机器人与人才测评集成 - 实现总结
> **文档版本**: v1.0
> **创建日期**: 2026-03-17
> **状态**: 实现完成
---
## 一、实现概述
### 已完成的功能
1.**知识库选择机制** - 飞书机器人支持配置特定知识库或知识组
2.**命令解析器** - 支持多种语言的测评命令识别
3.**测评会话管理** - 完整的会话生命周期管理
4.**飞书卡片交互** - 友好的问题展示和结果报告
### 架构图
```
用户消息
FeishuController._handleMessage()
[命令识别] → 是测评命令? → FeishuAssessmentService.handleCommand()
↓ ↓
否 命令解析器
↓ ↓
FeishuService.processChatMessage() 执行对应操作
↓ ↓
ChatService.streamChat() [开始/回答/状态/结果]
↓ ↓
RAG搜索 + LLM生成 AssessmentService
↓ ↓
飞书消息回复 飞书消息回复
```
---
## 二、数据库变更
### 1. FeishuBot 实体新增字段
**文件**: `server/src/feishu/entities/feishu-bot.entity.ts`
```typescript
@Column({ name: 'knowledge_base_id', nullable: true, length: 36 })
knowledgeBaseId: string;
@Column({ name: 'knowledge_group_id', nullable: true, length: 36 })
knowledgeGroupId: string;
```
### 2. 新增测评会话表
**文件**: `server/src/feishu/entities/feishu-assessment-session.entity.ts`
```sql
CREATE TABLE feishu_assessment_sessions (
id VARCHAR(36) PRIMARY KEY,
bot_id VARCHAR(36) NOT NULL,
open_id VARCHAR(255) NOT NULL,
assessment_session_id VARCHAR(36) NOT NULL,
status ENUM('active', 'completed', 'cancelled') DEFAULT 'active',
current_question_index INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_bot_open (bot_id, open_id),
INDEX idx_assessment_session (assessment_session_id),
CONSTRAINT fk_feishu_assessment_bot
FOREIGN KEY (bot_id)
REFERENCES feishu_bots(id)
ON DELETE CASCADE
);
```
### 3. 迁移脚本
- `1773200000000-AddFeishuBotKnowledgeFields.ts` - 添加知识库字段
- `1773200000001-CreateFeishuAssessmentSessionTable.ts` - 创建测评会话表
---
## 三、核心组件实现
### 1. 命令解析器 (AssessmentCommandParser)
**文件**: `server/src/feishu/services/assessment-command.parser.ts`
**功能**
- 识别测评命令前缀:`/assessment`, `/测评`, `/eval`, `/测评评估`
- 支持多语言命令:start/开始, answer/回答, status/状态, result/结果
- 解析命令参数
**示例**
```typescript
const parser = new AssessmentCommandParser();
const command = parser.parse('/assessment start kb_xxx');
// 结果: { type: 'start', parameters: ['kb_xxx'], ... }
```
### 2. 测评服务 (FeishuAssessmentService)
**文件**: `server/src/feishu/services/feishu-assessment.service.ts`
**核心方法**
- `handleCommand()` - 处理测评命令
- `startAssessment()` - 开始测评会话
- `submitAnswer()` - 提交答案
- `getStatus()` - 获取测评状态
- `getResult()` - 获取测评结果
- `cancelAssessment()` - 取消测评
**会话流程**
1. 用户发送 `/assessment start`
2. 系统创建测评会话,发送第一个问题卡片
3. 用户回复答案(直接回复或 `/assessment answer`
4. 系统评估答案,发送下一个问题
5. 重复步骤3-4直到完成
6. 系统发送测评结果报告
### 3. 集成到 FeishuService
**文件**: `server/src/feishu/feishu.service.ts`
**新增方法**
```typescript
isAssessmentCommand(message: string): boolean {
const trimmed = message.trim().toLowerCase();
const commandPrefixes = ['/assessment', '/测评', '/eval', '/测评评估'];
return commandPrefixes.some(prefix => trimmed.startsWith(prefix.toLowerCase()));
}
```
### 4. 集成到 FeishuController
**文件**: `server/src/feishu/feishu.controller.ts`
**修改 _handleMessage 方法**
```typescript
if (this.feishuService.isAssessmentCommand(userText)) {
// 委托给测评服务
await this.feishuAssessmentService.handleCommand(bot, openId, userText);
} else {
// 使用默认聊天处理
await this.feishuService.processChatMessage(bot, openId, messageId, userText);
}
```
---
## 四、API 接口更新
### 1. 创建/更新飞书机器人
**端点**: `POST /feishu/bots`
**请求体**
```json
{
"appId": "cli_xxx",
"appSecret": "xxx",
"botName": "测评机器人",
"knowledgeBaseId": "kb_xxx", // 可选:特定知识库
"knowledgeGroupId": "group_xxx" // 可选:知识组
}
```
### 2. 更新知识库配置
**端点**: `PATCH /feishu/bots/:id/knowledge`
**请求体**
```json
{
"knowledgeBaseId": "kb_xxx",
"knowledgeGroupId": null
}
```
---
## 五、命令参考
### 支持的命令前缀
- `/assessment`
- `/测评`
- `/eval`
- `/测评评估`
### 命令列表
| 命令 | 参数 | 说明 |
|------|------|------|
| `start [kbId\|templateId]` | 可选 | 开始测评 |
| `answer [answer]` | 必需 | 提交答案 |
| `status` | - | 查看状态 |
| `result` | - | 获取结果 |
| `help` | - | 显示帮助 |
| `cancel` | - | 取消测评 |
### 使用示例
```
用户: /assessment start
系统: [发送第一个问题卡片]
用户: 这是我的答案
系统: [评估答案并发送下一个问题]
用户: /assessment status
系统: 测评状态: 进度 3/10, 状态: 进行中
用户: /assessment result
系统: [发送测评结果报告]
```
---
## 六、文件清单
### 新增文件
1. `server/src/feishu/dto/assessment-command.dto.ts` - 命令DTO
2. `server/src/feishu/entities/feishu-assessment-session.entity.ts` - 测评会话实体
3. `server/src/feishu/services/assessment-command.parser.ts` - 命令解析器
4. `server/src/feishu/services/feishu-assessment.service.ts` - 测评服务
5. `server/src/migrations/1773200000000-AddFeishuBotKnowledgeFields.ts` - 迁移脚本1
6. `server/src/migrations/1773200000001-CreateFeishuAssessmentSessionTable.ts` - 迁移脚本2
### 修改文件
1. `server/src/feishu/entities/feishu-bot.entity.ts` - 添加知识库字段
2. `server/src/feishu/dto/create-bot.dto.ts` - 添加知识库配置字段
3. `server/src/feishu/feishu.service.ts` - 添加命令识别方法
4. `server/src/feishu/feishu.controller.ts` - 集成测评服务
5. `server/src/feishu/feishu.module.ts` - 注册新服务
---
## 七、实施步骤
### 阶段 1: 基础架构 ✅
- [x] 创建数据库迁移脚本
- [x] 更新 FeishuBot 实体和 DTO
- [x] 修改 FeishuService 支持知识库选择
### 阶段 2: 测评集成 ✅
- [x] 创建测评会话实体
- [x] 实现命令解析器
- [x] 实现测评服务
- [x] 集成到 FeishuService 和 Controller
### 阶段 3: 测试优化 ⏳
- [ ] 运行数据库迁移
- [ ] 测试命令解析功能
- [ ] 测试完整测评流程
- [ ] 性能测试和优化
---
## 八、安全考虑
1. **多租户隔离**:所有查询包含 `userId``tenantId` 过滤
2. **命令验证**:白名单命令验证,防止注入攻击
3. **会话超时**:建议设置测评会话超时时间(如 24 小时)
4. **数据隐私**:测评结果仅对授权用户可见
---
## 九、下一步工作
1. **运行数据库迁移**
```bash
yarn migration:run
```
2. **测试命令解析**
```bash
node test-feishu-assessment.js
```
3. **集成测试**
- 创建飞书机器人
- 配置知识库
- 发送 `/assessment start` 命令
- 完成测评流程
4. **文档完善**
- 更新用户使用文档
- 添加 API 文档
- 编写故障排除指南
---
## 十、总结
本次实现完成了飞书机器人与人才测评的完整集成:
1. **知识库选择**:飞书机器人现在可以配置特定知识库或知识组
2. **命令解析**:支持多语言的测评命令识别
3. **会话管理**:完整的测评会话生命周期管理
4. **交互体验**:友好的飞书卡片交互
系统架构清晰,代码结构良好,易于维护和扩展。
---
**相关文档**:
- [完整设计文档](./feishu-assessment-integration-design.md)
- [设计摘要](./feishu-assessment-integration-summary.md)
- [快速参考](./QUICK-REFERENCE.md)