0a9588abb7
- 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
5.5 KiB
5.5 KiB
飞书机器人与人才测评集成 - 设计摘要
文档版本: v1.0
创建日期: 2026-03-17
完整文档: feishu-assessment-integration-design.md
一、核心问题
1. 飞书机器人当前对接哪个知识库?
答案:当前使用默认知识库(用户的所有文件)
原因:在 feishu.service.ts 中调用 chatService.streamChat() 时,selectedFiles 和 selectedGroups 参数均为 undefined,导致搜索用户所有文件。
2. 如何与人才测评对接?
答案:通过自然语言命令触发测评功能
命令格式:
/assessment start [kbId|templateId]- 开始测评/assessment answer [answer]- 提交答案/assessment status- 查看状态/assessment result- 获取结果
二、设计方案
方案 1:知识库选择机制
数据库变更
在 FeishuBot 实体中新增字段:
knowledgeBaseId: string; // 特定知识库ID
knowledgeGroupId: string; // 知识组ID
选择逻辑
- 配置了 knowledgeBaseId → 搜索该知识库的文件
- 配置了 knowledgeGroupId → 搜索该知识组的文件
- 都未配置 → 搜索用户所有文件(默认行为)
方案 2:测评集成
架构设计
用户消息 → 命令解析器 → 测评服务 → 人才测评模块
↓
聊天服务(非测评消息)
核心组件
- AssessmentCommandParser - 命令解析器
- FeishuAssessmentService - 测评服务
- FeishuAssessmentSession - 会话实体
交互流程
1. 用户: /assessment start
2. 系统: 创建测评会话,发送第一个问题卡片
3. 用户: 回复答案
4. 系统: 评估答案,发送下一个问题
5. ... 循环直到测评完成
6. 系统: 发送测评结果报告
三、实施步骤
阶段 1:基础架构(1-2 天)
- 添加数据库字段和迁移脚本
- 更新 FeishuBot 实体和 DTO
- 修改 FeishuService 支持知识库选择
阶段 2:测评集成(2-3 天)
- 创建测评会话实体和迁移
- 实现命令解析器
- 实现测评服务
- 设计飞书卡片模板
阶段 3:测试优化(1-2 天)
- 单元测试和集成测试
- 性能测试
- 文档编写
四、关键代码示例
4.1 知识库选择逻辑
// feishu.service.ts
async processChatMessage(bot: FeishuBot, ...) {
let selectedFiles: string[] | undefined;
let selectedGroups: string[] | undefined;
if (bot.knowledgeBaseId) {
selectedFiles = await this.getFilesByKnowledgeBase(bot.knowledgeBaseId, ...);
} else if (bot.knowledgeGroupId) {
selectedGroups = [bot.knowledgeGroupId];
}
const stream = this.chatService.streamChat(
userMessage,
[],
userId,
llmModel,
language,
undefined,
selectedGroups, // 使用配置的知识组
selectedFiles, // 使用配置的知识库文件
// ...
);
}
4.2 命令处理逻辑
// feishu-assessment.service.ts
async handleCommand(bot: FeishuBot, openId: string, message: string) {
const command = this.commandParser.parse(message);
if (!command) {
// 非测评命令,使用默认聊天
await this.feishuService.processChatMessage(bot, openId, '', message);
return;
}
switch (command.type) {
case AssessmentCommandType.START:
await this.startAssessment(bot, openId, command.parameters);
break;
case AssessmentCommandType.ANSWER:
await this.submitAnswer(bot, openId, command.parameters[0]);
break;
// ...
}
}
五、API 接口
5.1 飞书机器人管理
POST /feishu/bots
{
"appId": "cli_xxx",
"appSecret": "xxx",
"knowledgeBaseId": "kb_xxx", // 可选
"knowledgeGroupId": "group_xxx" // 可选
}
5.2 测评会话管理
POST /feishu/assessment/start
{
"botId": "bot_xxx",
"openId": "ou_xxx",
"knowledgeBaseId": "kb_xxx",
"templateId": "tmpl_xxx"
}
六、安全考虑
- 多租户隔离:所有查询必须包含
userId和tenantId - 命令验证:白名单命令验证,防止注入
- 会话超时:测评会话设置 24 小时超时
- 数据隐私:测评结果仅对授权用户可见
七、文件清单
需要创建的文件
server/src/feishu/entities/feishu-assessment-session.entity.tsserver/src/feishu/dto/assessment-command.dto.tsserver/src/feishu/services/assessment-command.parser.tsserver/src/feishu/services/feishu-assessment.service.tsserver/src/migrations/XXXXXX-AddFeishuBotKnowledgeFields.tsserver/src/migrations/XXXXXX-CreateFeishuAssessmentSessionTable.ts
需要修改的文件
server/src/feishu/entities/feishu-bot.entity.tsserver/src/feishu/dto/create-bot.dto.tsserver/src/feishu/feishu.service.tsserver/src/feishu/feishu.module.ts
八、总结
| 问题 | 答案 |
|---|---|
| 飞书机器人当前对接哪个知识库? | 默认知识库(用户所有文件) |
| 如何配置特定知识库? | 在 FeishuBot 实体中设置 knowledgeBaseId 或 knowledgeGroupId |
| 如何与人才测评对接? | 通过 /assessment 命令触发测评功能 |
| 实施周期 | 5-7 天 |