chore: 清理 docs 目录冗余文档(55个→9个)

删除:
- docs/1.0/ 全部22个(旧Simple KB文档,已被替代)
- docs/2.0/ 全部2个(空文件/过时)
- docs/design/ 全部4个(旧功能设计)
- docs/plans/ 旧版5个(保留v2.0设计文档)
- docs/superpowers/ 全部4个(飞书集成文档)
- docs/根目录杂项 8个(开发规范/快速参考/调试/飞书/Git设置)
- docs/3.0/knowledge_graph_analysis.md(不相关)

保留:
- docs/3.0/ 考核工作流设计 2个
- docs/plans/ v2.0设计文档 1个
- docs/tests/ 测试文档 6个
合计: 55个 → 9个

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Developer
2026-06-16 14:31:44 +08:00
parent 3d73618270
commit b21899055d
51 changed files with 0 additions and 12885 deletions
@@ -1,405 +0,0 @@
# L1 人才育成测评系统设计文档
## 文档信息
- **版本**: 1.1
- **日期**: 2026-04-18
- **状态**: 评审通过
- **关联**: AI 人才育成计划
---
## 1. 业务背景
### 1.1 目标
针对讯和 AI 人才育成计划的 L1 级别(认知与起步),建立系统化的在线评估认证体系。
### 1.2 L1 级别定义
- **目标**: 建立安全使用习惯,理解基本概念
- **面向**: 全员
- **内容**: AI基础概念、安全合规、Prompt入门、IDE基本操作
- **认证**: 在线考试 ≥90分
---
## 2. 评估范围
### 2.1 五门课程
| 序号 | 课程名称 | 对应维度 | 知识组 |
|------|----------|----------|--------|
| 1 | 工作能力-安全 | 工作能力 | AI基础概念 + 安全合规 |
| 2 | 技术能力-LLM | 技术能力 | 大语言模型原理 |
| 3 | 技术能力-提示词 | 技术能力 | 提示词工程 |
| 4 | IDE协作能力 | IDE协作 | IDE操作、代码辅助 |
| 5 | AI开发范式 | AI开发范式 | Flow-State理解 |
### 2.2 知识组说明
知识组存储在 KnowledgeGroup 中,每个组包含:
- 课程名称
- 相关学习资料(文档、PDF等)
- 评估要点说明
---
## 3. 评估流程设计
### 3.1 基本流程
```
发起评估 → 知识组检索 → 生成问题 → 用户回答 → 即时评分/追问 → 全部完成 → 生成报告 → 发放证书
```
### 3.2 评估步骤
1. **发起评估**: 用户选择 L1 认证评估,系统自动关联五个知识组
2. **问题生成**: 基于五个知识组内容生成 8-10 道理解性问题
3. **答题交互**: 用户逐题回答,AI 判断理解深度,如不足则追问确认
4. **即时反馈**: 每题回答后即时反馈分数和简短评语
5. **最终报告**: 全部完成后生成综合报告
6. **证书发放**: 通过者发放电子证书
### 3.3 追问策略
- 每题最多追问 1-2 次以确认理解深度
- 根据回答情况动态调整追问深度
- 超过追问次数后强制进入下一题
---
## 4. 评分设计
### 4.1 权重配置
| 维度 | 权重 | 分值 |
|------|------|------|
| 技术能力-提示词 | 50% | 50分 |
| 其他四门 | 50% | 50分 |
### 4.2 理解深度层级
| 分数 | 层级 | 说明 |
|------|------|------|
| 1-3 | 基础 | 知道概念,无法应用 |
| 4-6 | 理解 | 理解含义,可简单应用 |
| 7-8 | 应用 | 理解本质,能解释原因 |
| 9-10 | 创新 | 能迁移到新场景 |
### 4.3 维度计分规则
- **题目维度归属**:生成问题时确定维度归属(从哪个知识组出题就属于哪个维度)
- **dimensionScores 生成**:每道题记录所属维度,积分时按维度汇总
### 4.4 权重计算
| 维度 | 权重 | 分值 | 说明 |
|------|------|------|------|
| 技术能力-提示词 | 50% | 50分 | 4-5道题 |
| 其他四门 | 50% | 50分 | 4-5道题,平均分配 |
- **计算公式**
- 各维度得分 = 该维度所有题目平均分(0-10)
- 其他四门平均分 = (LLM + IDE + 开发范式 + 工作能力) / 4
- 总分 = 提示词平均分 × 0.5 + 其他四门平均分 × 0.5
- 最终分数 = 总分 × 10(转换为100分制)
- **示例**
- 提示词4题得分:10, 8, 9, 7 → 平均8.5
- 其他四门各1题得分:9, 7, 8, 6 → 平均7.5
- 总分 = 8.5×0.5 + 7.5×0.5 = 8.0
- 最终分数 = 8.0×10 = 80分 → 未通过(需≥90)
### 4.5 通过标准
- 总分 ≥ 90 分即可通过
- 各维度分别计分,支持薄弱环节识别
### 4.6 题目数量
- 总计 8-10 道题
- 提示词相关 4-5 道(50分)
- 其他四门 4-5 道(50分)
---
## 5. 模板设计
### 5.1 评估模板字段
| 字段 | 类型 | 说明 | 默认值 |
|------|------|------|--------|
| name | string | 模板名称 | L1-AI人才育成认证 |
| description | string | 描述 | L1级别能力认证评估 |
| linkedGroups | string[] | 关联知识组ID列表 | [] |
| weightConfig | JSON | 权重配置 | {"prompt":50,"other":50} |
| difficultyConfig | JSON | 难度配置 | {"standard":60,"advanced":30,"specialist":10} |
| questionCount | number | 题目数量 | 8-10 |
| questionCountMin | number | 最小题数 | 8 |
| questionCountMax | number | 最大题数 | 10 |
| passingScore | number | 通过分数 | 90 |
| style | string | 评估风格 | conversation |
| isActive | boolean | 是否启用 | true |
### 5.2 模板配置(扩展现有 AssessmentTemplate
```typescript
// 新增字段
@Column({ type: 'simple-json', name: 'linked_group_ids', nullable: true })
linkedGroupIds: string[]; // 支持多知识组
@Column({ type: 'simple-json', name: 'weight_config', nullable: true })
weightConfig: {
prompt: number; // 提示词权重 默认50
other: number; // 其他维度权重 默认50
};
@Column({ type: 'simple-json', name: 'difficulty_config', nullable: true })
difficultyConfig: {
standard: number; // 基础题比例 默认60
advanced: number; // 理解题比例 默认30
specialist: number; // 创新题比例 默认10
};
@Column({ type: 'int', name: 'question_count_min', default: 8 })
questionCountMin: number;
@Column({ type: 'int', name: 'question_count_max', default: 10 })
questionCountMax: number;
@Column({ type: 'int', name: 'passing_score', default: 90 })
passingScore: number;
```
---
## 6. 角色权限设计
### 6.1 角色说明
基于现有角色体系扩展,管理员角色(admin/super_admin)具备模板和题目调整权限。
| 角色 | 说明 |
|------|------|
| user | 普通员工/学员 |
| admin | 管理员(含题目/模板调整权限) |
| super_admin | 超级管理员(含全部权限) |
| instructor | 讲师(可选,复查功能) |
### 6.2 权限矩阵
| 功能 | 学员 | 管理员 | 超级管理员 | 讲师 |
|------|------|--------|------------|-----------|------|
| 发起评估 | ✓ | ✓ | ✓ | - |
| 查看个人报告 | ✓ | ✓ | ✓ | - |
| 查看全部报告 | - | ✓ | ✓ | ✓ |
| 创建/编辑模板 | - | ✓ | ✓ | - |
| 调整题目配置 | - | ✓ | ✓ | - |
| 配置知识组 | - | ✓ | ✓ | - |
| 导出统计数据 | - | ✓ | ✓ | - |
| 人工复查 | - | - | ✓ | ✓ |
| 手动调整分数 | - | - | ✓ | ✓ |
| 系统配置 | - | - | ✓ | - |
| 用户管理 | - | - | ✓ | - |
---
## 7. 评估结果设计
### 7.1 报告结构
```json
{
"sessionId": "uuid",
"userId": "uuid",
"templateId": "uuid",
"status": "COMPLETED",
"totalScore": 95,
"passed": true,
"dimensionScores": {
"prompt": 48,
"llm": 18,
"ide": 14,
"devPattern": 10,
"workCapability": 5
},
"radarData": {
"prompt": 9.6,
"llm": 9.0,
"ide": 7.0,
"devPattern": 5.0,
"workCapability": 5.0
},
"level": "Proficient",
"questions": [
{
"id": "uuid",
"dimension": "prompt",
"questionText": "...",
"score": 9,
"followUpCount": 1,
"feedback": "..."
}
],
"report": "总体评价...",
"suggestions": ["改进建议1", "改进建议2"],
"certifiedAt": "2026-04-18T10:00:00Z"
}
```
### 7.2 雷达图数据
五维度得分(归一化到 0-10:
1. 提示词工程 (prompt) - 出题自提示词知识组
2. LLM原理 (llm) - 出题自LLM知识组
3. IDE协作 (ide) - 出题自IDE知识组
4. AI开发范式 (devPattern) - 出题自开发范式知识组
5. 工作能力 (workCapability) - 出题自工作能力知识组
**维度归属规则**:生成问题时从哪个知识组检索内容,该题就属于哪个维度。
### 7.3 证书设计
| 字段 | 说明 |
|------|------|
| certificateId | 证书唯一ID |
| userId | 持有者ID |
| templateId | 评估模板ID |
| level | 通过级别 |
| totalScore | 总分 |
| issuedAt | 发放时间 |
| expiresAt | 有效期(null=永久) |
| qrCode | 防伪二维码 |
---
## 8. 功能设计
### 8.1 用户功能
| 功能 | 说明 |
|------|------|
| 发起评估 | 选择模板,开始评估流程 |
| 继续评估 | 断点续答 |
| 查看历史 | 查看历次评估记录和报告 |
| 下载证书 | 下载电子证书PDF |
| 重考 | 通过后重新考试 |
### 8.2 管理员功能
| 功能 | 说明 |
|------|------|
| 模板管理 | 创建/编辑/启用禁用模板 |
| 知识组配置 | 关联评估模板与知识组 |
| 评估记录 | 查看所有用户评估记录 |
| 统计分析 | 查看通过率、各维度得分分布 |
| 导出报表 | 导出CSV/Excel |
### 8.3 讲师功能(可选)
| 功能 | 说明 |
|------|------|
| 人工复查 | 查看并复查评估结果 |
| 手动评分 | 调整AI评分 |
| 添加评语 | 添加人工评语 |
---
## 9. 技术设计
### 9.1 现有架构复用
基于 AuraK 现有评估系统扩展:
```
AssessmentTemplate (扩展)
AssessmentSession (扩展)
LangGraph: generator → interviewer → grader → analyzer
```
### 9.2 新增数据库表
```sql
-- 证书表
CREATE TABLE assessment_certificates (
id UUID PRIMARY KEY,
user_id UUID NOT NULL,
session_id UUID NOT NULL,
template_id UUID NOT NULL,
level VARCHAR(50),
total_score FLOAT,
qr_code VARCHAR(255),
issued_at TIMESTAMP,
created_at TIMESTAMP
);
```
### 9.3 新增 API 接口
| 接口 | 方法 | 说明 | 权限 |
|------|------|------|------|
| /templates | GET | 模板列表 | 公开 |
| /templates | POST | 创建模板 | 管理员 |
| /templates/:id | PUT | 更新模板 | 管理员 |
| /templates/:id (软删除) | DELETE | 禁用模板 | 管理员 |
| /certificates/:sessionId | GET | 获取证书 | 所有者 |
| /certificates/:sessionId/download | GET | 下载证书PDF | 所有者 |
| /certificates/verify | POST | 二维码验真 | 公开 |
| /admin/statistics | GET | 统计报表 | 管理员 |
### 9.4 前端页面
| 页面 | 说明 |
|------|------|
| /assessment/templates | 模板管理 |
| /assessment/history | 评估历史 |
| /assessment/report/:id | 评估报告详情 |
| /assessment/certificate/:id | 证书查看/下载 |
| /admin/statistics | 管理统计 |
---
## 10. 实施计划
### 10.1 优先级
| 优先级 | 模块 | 说明 |
|--------|------|------|
| P0 | 模板扩展 | 支持多知识组、权重配置 |
| P0 | 评估流程 | 适配L1五课程流程 |
| P0 | 评分逻辑 | 调整追问策略、加权计分 |
| P1 | 报告生成 | 结构化报告、雷达图数据 |
| P1 | 证书功能 | 证书生成、下载 |
| P2 | 统计分析 | 管理后台统计 |
| P2 | 人工复查 | 讲师功能 |
### 10.2 里程碑
1. **M1**: 模板扩展 + 基本评估流程(1周)
2. **M2**: 报告生成 + 证书功能(1周)
3. **M3**: 管理后台 + 统计分析(1周)
4. **M4**: 测试优化 + 上线(1周)
---
## 11. 附录
### 11.1 参考文档
- AI人才育成计划.md
- 提示词工程.md
- 大语言模型入门.md
- AI安全使用指南.md
- Open Code使用指南.md
- GitHub Copilot使用指南.md
- Claude Code使用指南.md
- L1-开发范式是什么.md
### 11.2 现有代码参考
- `server/src/assessment/` - 评估模块
- `web/components/views/AssessmentView.tsx` - 前端评估界面
@@ -1,490 +0,0 @@
# L1人才育成评估系统实施计划
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
**Goal:** 实现L1人才育成评估系统,支持五门课程考核、多知识组关联、加权计分、证书生成
**Architecture:** 基于现有AuraK评估系统(LangGraph状态机)扩展,新增模板多知识组支持、维度计分、证书功能
**Tech Stack:** NestJS + TypeORM + LangGraph + React
---
## Phase 1: 模板扩展(P0
### Task 1.1: 扩展 AssessmentTemplate 实体
**Files:**
- Modify: `server/src/assessment/entities/assessment-template.entity.ts:1-80`
**Step 1: Add new columns**
```typescript
// Add after existing columns (line ~79)
@Column({ type: 'simple-json', name: 'linked_group_ids', nullable: true })
linkedGroupIds: string[];
@Column({ type: 'simple-json', name: 'weight_config', nullable: true })
weightConfig: {
prompt: number;
other: number;
};
@Column({ type: 'simple-json', name: 'difficulty_config', nullable: true })
difficultyConfig: {
standard: number;
advanced: number;
specialist: number;
};
@Column({ type: 'int', name: 'question_count_min', default: 8 })
questionCountMin: number;
@Column({ type: 'int', name: 'question_count_max', default: 10 })
questionCountMax: number;
@Column({ type: 'int', name: 'passing_score', default: 90 })
passingScore: number;
```
**Step 2: Commit**
```bash
git add server/src/assessment/entities/assessment-template.entity.ts
git commit -m "feat: extend AssessmentTemplate with multi-group and weight config"
```
---
### Task 1.2: 创建数据库迁移
**Files:**
- Create: `server/src/migrations/XXXXXX-add-template-extensions.sql`
**Step 1: Write migration**
```sql
ALTER TABLE assessment_templates
ADD COLUMN linked_group_ids TEXT,
ADD COLUMN weight_config TEXT,
ADD COLUMN difficulty_config TEXT,
ADD COLUMN question_count_min INTEGER DEFAULT 8,
ADD COLUMN question_count_max INTEGER DEFAULT 10,
ADD COLUMN passing_score INTEGER DEFAULT 90;
```
**Step 2: Test migration**
```bash
cd server && npx typeorm query "SELECT linked_group_ids, weight_config FROM assessment_templates LIMIT 1"
```
**Step 3: Commit**
```bash
git add server/src/migrations/
git commit -m "db: add template extension columns"
```
---
### Task 1.3: 更新 TemplateService CRUD
**Files:**
- Modify: `server/src/assessment/services/template.service.ts`
**Step 1: Add linkedGroupIds handling**
```typescript
// In create() method, add:
if (createTemplateDto.linkedGroupIds) {
template.linkedGroupIds = createTemplateDto.linkedGroupIds;
}
if (createTemplateDto.weightConfig) {
template.weightConfig = createTemplateDto.weightConfig;
}
// ... other fields
```
**Step 2: Verify compilation**
```bash
cd server && npx tsc --noEmit
```
**Step 3: Commit**
```bash
git add server/src/assessment/services/template.service.ts
git commit -m "feat: support linkedGroupIds in TemplateService"
```
---
## Phase 2: 评估流程适配(P0
### Task 2.1: 修改 QuestionGenerator 支持多知识组
**Files:**
- Modify: `server/src/assessment/assessment.service.ts:266-368` (startSession method)
**Step 1: Support multi-group content retrieval**
```typescript
// In startSession(), replace single content retrieval with multi-group:
private async getMultiGroupContent(
groupIds: string[],
userId: string,
tenantId: string,
): Promise<string> {
const contents: string[] = [];
for (const groupId of groupIds) {
const files = await this.groupService.getGroupFiles(groupId, userId, tenantId);
const content = files.map(f => f.content).join('\n\n---\n\n');
contents.push(content);
}
return contents.join('\n\n');
}
```
**Step 2: Pass content with dimension tag**
```typescript
// In getSessionContent, add dimension tag:
// === Document: [工作能力] ===
// ...content...
```
**Step 3: Commit**
```bash
git add server/src/assessment/assessment.service.ts
git commit -m "feat: support multi-group content retrieval"
```
---
### Task 2.2: Generator 输出维度信息
**Files:**
- Modify: `server/src/assessment/graph/nodes/generator.node.ts:176-182`
**Step 1: Add dimension field**
```typescript
const mappedNewQuestions = newQuestions.map((q: any) => ({
id: (existingQuestions.length + 1).toString(),
questionText: q.question_text,
keyPoints: q.key_points,
difficulty: q.difficulty,
basis: q.basis,
dimension: q.dimension || this.inferDimension(knowledgeBaseContent), // NEW FIELD
}));
private inferDimension(content: string): string {
// Detect dimension from content tags
if (content.includes('[提示词]')) return 'prompt';
if (content.includes('[LLM]')) return 'llm';
// ... etc
}
```
**Step 2: Commit**
```bash
git add server/src/assessment/graph/nodes/generator.node.ts
git commit -m "feat: generator outputs dimension field"
```
---
## Phase 3: 评分逻辑(P0
### Task 3.1: DimensionScores 计算
**Files:**
- Modify: `server/src/assessment/assessment.service.ts:600-630` (score calculation)
**Step 1: Calculate dimension scores**
```typescript
// Replace simple weighted score with dimension-aware calculation:
const calculateDimensionScores = (questions: any[], scores: Record<string, number>) => {
const dimensionScores: Record<string, number> = {
prompt: 0, llm: 0, ide: 0, devPattern: 0, workCapability: 0
};
const dimensionCounts: Record<string, number> = { prompt: 0, llm: 0, ide: 0, devPattern: 0, workCapability: 0 };
questions.forEach((q, idx) => {
const dim = q.dimension || 'workCapability';
dimensionScores[dim] += scores[q.id || idx.toString()] || 0;
dimensionCounts[dim]++;
});
// Average per dimension
Object.keys(dimensionScores).forEach(d => {
dimensionScores[d] = dimensionCounts[d] > 0
? dimensionScores[d] / dimensionCounts[d]
: 0;
});
return dimensionScores;
};
```
**Step 2: Commit**
```bash
git add server/src/assessment/assessment.service.ts
git commit -m "feat: calculate dimension scores"
```
---
### Task 3.2: 追问策略调整
**Files:**
- Modify: `server/src/assessment/graph/nodes/grader.node.ts:207`
**Step 1: Increase follow-up limit**
```typescript
// Current: currentFollowUpCount >= 1
// Change to:
if (currentFollowUpCount >= 2 || result.score >= 8 || saysIDontKnow) {
shouldFollowUp = false;
}
```
**Step 2: Commit**
```bash
git add server/src/assessment/graph/nodes/grader.node.ts
git commit -m "feat: increase follow-up limit to 2"
```
---
## Phase 4: 报告生成(P1
### Task 4.1: 扩展 Session 存储 dimension 数据
**Files:**
- Modify: `server/src/assessment/entities/assessment-session.entity.ts`
**Step 1: Add dimension fields**
```typescript
@Column({ type: 'simple-json', name: 'dimension_scores', nullable: true })
dimensionScores: Record<string, number>;
@Column({ type: 'simple-json', name: 'radar_data', nullable: true })
radarData: Record<string, number>;
```
**Step 2: Commit**
```bash
git add server/src/assessment/entities/assessment-session.entity.ts
git commit -m "feat: add dimension scores to session entity"
```
---
### Task 4.2: Analyzer 生成结构化报告
**Files:**
- Modify: `server/src/assessment/graph/nodes/analyzer.node.ts`
**Step 1: Generate dimension-aware report**
```typescript
// Modify system prompt to include:
const dimensionSummary = Object.entries(dimensionScores)
.map(([dim, score]) => `${dim}: ${score}/10`)
.join('\n');
const reportPrompt = `...
维度得分:
${dimensionSummary}
请在报告中包含:
1. 各维度得分分析
2. 薄弱环节识别
3. 针对性改进建议
`;
```
**Step 2: Commit**
```bash
git add server/src/assessment/graph/nodes/analyzer.node.ts
git commit -m "feat: generate structured report with dimension analysis"
```
---
## Phase 5: 证书功能(P1
### Task 5.1: 创建证书表
**Files:**
- Create: `server/src/assessment/entities/assessment-certificate.entity.ts`
**Step 1: Define entity**
```typescript
@Entity('assessment_certificates')
export class AssessmentCertificate {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ name: 'user_id' })
userId: string;
@Column({ name: 'session_id' })
sessionId: string;
@Column({ name: 'template_id' })
templateId: string;
@Column()
level: string;
@Column({ type: 'float', name: 'total_score' })
totalScore: number;
@Column({ name: 'qr_code', nullable: true })
qrCode: string;
@CreateDateColumn({ name: 'issued_at' })
issuedAt: Date;
}
```
**Step 2: Commit**
```bash
git add server/src/assessment/entities/assessment-certificate.entity.ts
git commit -m "feat: create certificate entity"
```
---
### Task 5.2: 证书生成API
**Files:**
- Modify: `server/src/assessment/assessment.controller.ts`
**Step 1: Add certificate endpoints**
```typescript
@Get('certificate/:sessionId')
async getCertificate(
@Param('sessionId') sessionId: string,
@Req() req,
): Promise<AssessmentCertificate> {
// Generate or return existing certificate
}
@Get('certificate/:sessionId/download')
async downloadCertificate(
@Param('sessionId') sessionId: string,
): Promise<StreamableFile> {
// Generate PDF with jsPDF
}
```
**Step 2: Commit**
```bash
git add server/src/assessment/assessment.controller.ts
git commit -m "feat: add certificate endpoints"
```
---
## Phase 6: 前端集成(P2
### Task 6.1: 模板选择页面
**Files:**
- Modify: `web/components/views/AssessmentView.tsx`
**Step 1: Add template selection**
```typescript
// Add state:
const [templates, setTemplates] = useState<AssessmentTemplate[]>([]);
// Load templates on mount:
useEffect(() => {
const loadTemplates = async () => {
const res = await assessmentService.getTemplates();
setTemplates(res.data);
};
loadTemplates();
}, []);
```
**Step 2: Commit**
```bash
git add web/components/views/AssessmentView.tsx
git commit -m "feat: add template selection to frontend"
```
---
### Task 6.2: 报告页面的雷达图
**Files:**
- Create: `web/components/RadarChart.tsx`
**Step 1: Create component**
```typescript
export const RadarChart = ({ data }) => {
// Use recharts or echarts for radar
// Data: { prompt: 9.6, llm: 9.0, ide: 7.0, devPattern: 5.0, workCapability: 5.0 }
};
```
**Step 2: Commit**
```bash
git add web/components/RadarChart.tsx
git commit -m "feat: add radar chart component"
```
---
## 实施顺序
1. Task 1.1 → 1.3 (模板扩展)
2. Task 2.1 → 2.2 (评估流程)
3. Task 3.1 → 3.2 (评分逻辑)
4. Task 4.1 → 4.2 (报告)
5. Task 5.1 → 5.2 (证书)
6. Task 6.1 → 6.2 (前端)
**每个Task约需1-2小时**
---
## 依赖说明
- Phase 1 (模板) → Phase 2 → Phase 3 → Phase 4 → Phase 5
- 前端(Phase 6) 可在后端基本完成后并行开发
- 测试贯穿每个Task
---
## 验收标准
- [ ] 模板支持多知识组关联
- [ ] 题目带dimension字段
- [ ] 报告含dimensionScores和radarData
- [ ] 可生成书PDF
- [ ] 前端显示雷达图
- [ ] E2E测试通过
@@ -1,593 +0,0 @@
# AuraK 评估系统完整实施计划
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
**Goal:** 构建完整的AI人才评估系统,包含题库管理、维度均衡抽取、审核流程、评估统计
**Architecture:**
- 题库通过模板间接关联知识库分组
- 评估时从题库维度均衡抽取,不足时实时生成备用
- 管理员通过独立页面管理题库和查看统计
**Tech Stack:** NestJS + TypeORM + LangGraph + React + TypeScript
---
## 一、问题与方案对照表
| # | 待修复问题 | 解决思路 | 对应Task |
|---|------------|----------|----------|
| 1 | 评分计算错误 | 已修复 | ✅ |
| 2 | 题目维度分配不均 | 已修复 | ✅ |
| 3 | 多轮对话中断 | 已修复 | ✅ |
| 4 | 计数器显示错误 | 已修复 | ✅ |
| 5 | 历史问答查询 | 统计页面 | Task 4 |
| 6 | 知识覆盖度来源 | 用户不 care | - |
| 7 | 实时反馈无内容 | 用户确认已有内容 | - |
| 8 | 预生成题目功能 | 题库+抽取 | Task 1,2,3 |
| 9 | 题目生成不稳定 | 题库前置 | Task 1,7 |
| 10 | 题目来源不是知识库 | 题库+范围控制 | Task 1,3 |
| 11 | 选择题实际无选项 | 题库管理 | Task 1,5 |
---
## 二、系统架构
### 2.1 数据层级
```
KnowledgeGroup(知识库分组)
AssessmentTemplate(模板)→ 题目数量、知识库配置
QuestionBank(题库)→ 审核状态
QuestionBankItem(题目)→ 维度/难度/答案
评估抽取使用
```
### 2.2 评估流程
```
开始评估
1. 加载模板配置(题目数量、维度配置)
2. 检查已发布题库题目数量
充足 → 维度均衡随机抽取 → 进入答题
不足 → 实时生成题目(备用) → 进入答题
3. 用户答题 → 即时评分 → 实时反馈
4. 追问(如Grader判断需要)
5. 答题完成 → 生成报告 + 记录统计
```
---
## 三、数据模型
### 3.1 QuestionBank(题库)
```typescript
// server/src/assessment/entities/question-bank.entity.ts
@Entity('question_banks')
export class QuestionBank {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ name: 'template_id' })
templateId: string;
@ManyToOne(() => AssessmentTemplate)
@JoinColumn({ name: 'template_id' })
template: AssessmentTemplate;
@Column({ name: 'name' })
name: string; // 题库名称
@Column({ type: 'text', description: '题库描述' })
description: string;
@Column({ type: 'enum', enum: QuestionBankStatus, default: QuestionBankStatus.DRAFT })
status: QuestionBankStatus; // DRAFT | PENDING_REVIEW | PUBLISHED
@Column({ name: 'created_by' })
createdBy: string;
@Column({ name: 'reviewed_by', nullable: true })
reviewedBy: string;
@Column({ name: 'reviewed_at', nullable: true })
reviewedAt: Date;
@Column({ name: 'review_comment', nullable: true })
reviewComment: string; // 审核意见
@OneToMany(() => QuestionBankItem, item => item.bank)
items: QuestionBankItem[];
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;
@UpdateDateColumn({ name: 'updated_at' })
updatedAt: Date;
}
enum QuestionBankStatus {
DRAFT = 'DRAFT', // 草稿
PENDING_REVIEW = 'PENDING_REVIEW', // 待审核
PUBLISHED = 'PUBLISHED', // 已发布
REJECTED = 'REJECTED', // 审核拒绝
}
```
### 3.2 QuestionBankItem(题目)
```typescript
// server/src/assessment/entities/question-bank-item.entity.ts
@Entity('question_bank_items')
export class QuestionBankItem {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ name: 'bank_id' })
bankId: string;
@ManyToOne(() => QuestionBank, bank => bank.items)
@JoinColumn({ name: 'bank_id' })
bank: QuestionBank;
@Column({ type: 'text', name: 'question_text' })
questionText: string;
@Column({ type: 'enum', enum: QuestionType })
questionType: QuestionType; // SHORT_ANSWER | MULTIPLE_CHOICE | TRUE_FALSE
@Column({ type: 'simple-json', nullable: true })
options: string[]; // 选择题选项 ["A. xxx", "B. xxx", ...]
@Column({ type: 'text', nullable: true })
correctAnswer: string; // 正确答案
@Column({ type: 'simple-json', name: 'key_points' })
keyPoints: string[]; // 关键点 ["point1", "point2"]
@Column({ type: 'enum', enum: QuestionDifficulty })
difficulty: QuestionDifficulty; // STANDARD | ADVANCED | SPECIALIST
@Column({ type: 'enum', enum: QuestionDimension })
dimension: QuestionDimension; // PROMPT | LLM | IDE | DEV_PATTERN | WORK_CAPABILITY
@Column({ type: 'text', name: ' basis', nullable: true })
basis: string; // 出题依据
@Column({ name: 'created_by' })
createdBy: string;
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;
}
enum QuestionType {
SHORT_ANSWER = 'SHORT_ANSWER', // 简答题
MULTIPLE_CHOICE = 'MULTIPLE_CHOICE', // 选择题
TRUE_FALSE = 'TRUE_FALSE', // 判断题
}
enum QuestionDifficulty {
STANDARD = 'STANDARD', // 标准
ADVANCED = 'ADVANCED', // 进阶
SPECIALIST = 'SPECIALIST', // 专家
}
enum QuestionDimension {
PROMPT = 'PROMPT', // 提示词
LLM = 'LLM', // LLM原理
IDE = 'IDE', // IDE协作
DEV_PATTERN = 'DEV_PATTERN', // 开发范式
WORK_CAPABILITY = 'WORK_CAPABILITY', // 工作能力
}
```
### 3.3 评估统计
```typescript
// API返回结构
interface AssessmentStats {
// 统计卡片
totalAttempts: number; // 总考核次数
highestScore: number; // 最高分
averageScore: number; // 平均分
completionRate: number; // 完成率
// 得分趋势(可选用于图表)
scoreTrend: { date: string; score: number }[];
// 历史记录
recentRecords: {
id: string;
knowledgeBase: string;
template: string;
score: number;
status: 'IN_PROGRESS' | 'COMPLETED';
createdAt: string;
}[];
}
```
---
## 四、API设计
### 4.1 题库管理API
```typescript
// 题库CRUD
POST /api/question-banks // 创建题库
GET /api/question-banks // 列表(带分页)
GET /api/question-banks/:id // 详情(含题目)
PUT /api/question-banks/:id // 更新题库信息
DELETE /api/question-banks/:id // 删除题库
// 题目管理
POST /api/question-banks/:bankId/items // 添加单题
PUT /api/question-banks/:bankId/items/:id // 更新题目
DELETE /api/question-banks/:bankId/items/:id // 删除题目
// 批量操作
POST /api/question-banks/:bankId/batch-add // 批量添加题目(AI生成或Excel导入)
POST /api/question-banks/:bankId/generate // AI批量生成待审核
// 审核流程
PUT /api/question-banks/:id/submit // 提交审核(草稿→待审核)
PUT /api/question-banks/:id/review // 审核(通过/拒绝,附带意见)
PUT /api/question-banks/:id/publish // 发布(审核通过→已发布)
PUT /api/question-banks/:id/unpublish // 下架
// 模板关联
GET /api/question-banks/by-template/:templateId // 按模板查询题库
```
### 4.2 统计API
```typescript
// 评估统计
GET /api/assessment/stats // 当前用户统计
GET /api/assessment/stats/admin // 管理员统计(所有用户)
Query: startDate, endDate, templateId, knowledgeGroupId
```
---
## 五、前端页面设计
### 5.1 题库管理页面(QuestionBankView
```
┌──────────────────────────────────────────────────────────────────────────┐
│ 题库管理 [新建题库] │
├────────────┬─────────────────────────────────────────────────────┤
│ 我的题库 │ 筛选: [模板▼] [状态▼] [维度▼] [难度▼] [搜索...] │
│ ├─────────────────────────────────────────────────────┤
│ □ AI开发 │ ┌────┬────────┬────────┬──────┬────────────┐ │
│ □ Python │ │选择│ 题目内容│ 题型 │ 维度 │ 难度 │ 操作│ │
│ │ ├────┼────────┼────────┼──────┼────────────┤ │
│ │ │ ○ │xxx │ 简答 │ llm │ 标准 │编辑│ │
│ │ │ ○ │xxx │ 选择 │ ide │ 进阶 │编辑│ │
│ │ │ ○ │xxx │ 判断 │ Work │ 专家 │删除│ │
│ │ └────┴────────┴────────┴──────┴────────────┘ │
│ │ [批量导入] │
│ ├─────────────────────────────────────────────────────┤
│ │ [AI批量生成] [提交审核] [全选] [取消选择] │
└────────────┴─────────────────────────────────────────────────────┘
```
### 5.2 题库详情/编辑面板
```
┌────────────────────────────────────┐
│ 编辑题目 [保存] │
├────────────────────────────────────┤
│ 题目内容 │
│ ┌──────────────────────────────┐ │
│ │ │ │
│ └────────────────────────────┘ │
│ │
│ 题型: ●简答 ○选择 ○判断 │
│ │
│ [选择题时显示] │
│ 选项: │
│ A. ___________________ │
│ B. ___________________ │
│ C. ___________________ │
│ D. ___________________ │
│ │
│ 正确答案: ________________ │
│ │
│ 关键点: │
│ _________________________ │
│ _________________________ │
│ │
│ 维度: [prompt▼] 难度: [标准▼] │
│ │
│ 出题依据: │
│ _________________________ │
└────────────────────────────────────┘
```
### 5.3 统计页面(AssessmentStatsView
```
┌─────────────────────────────────────────────────────────────────┐
│ 评估统计 [导出] │
├─────────────────────────────────────────────────────────────────┤
│ 筛选: [时间范围▼] [知识库▼] [重置] │
├─────────────────────────────────────────────────────────────────┤
│ 总考核 │ 最高分 │ 平均分 │ 完成率 │
│ 15 │ 9.2 │ 7.8 │ 80% │
├─────────────────────────────────────────────────────────────────┤
│ 得分趋势(折线图 - 可选) │
│ 10 ____ │
│ 8 ____▓▓▓____▓▓ │
│ 6 ____▓▓▓▓▓____▓▓▓▓___ │
│ 4 _______________________________________ │
│ 2 ____________________________________________│
│ 04/10 04/12 04/14 04/16 04/18 │
├─────────────────────────────────────────────────────────────────┤
│ 历史记录 │
│ 日期 知识库 模板 得分 状态 操作│
│ 04/18 AI开发 AI基础 9.2 完成 查看 │
│ 04/15 Python 编程基础 7.5 完成 查看 │
│ 04/12 AI开发 AI基础 8.1 完成 查看 │
│ 04/10 - LLM原理 - 进行中 查看 │
└─────────────────────────────────────────────────────────────────┘
```
---
## 六、实施计划
### Task 1: 题库管理功能(核心)
**Files:**
- Create: `server/src/assessment/entities/question-bank.entity.ts`
- Create: `server/src/assessment/entities/question-bank-item.entity.ts`
- Create: `server/src/assessment/question-bank.service.ts`
- Create: `server/src/assessment/question-bank.controller.ts`
- Modify: `server/src/assessment/assessment.module.ts` (import)
- Create: 迁移文件 `add_question_banks.sql`
**实施步骤:**
1. 创建 QuestionBank 实体 + 迁移
2. 创建 QuestionBankItem 实体 + 迁移
3. 实现 QuestionBankServiceCRUD
4. 实现 QuestionBankControllerAPI
5. 注册模块
**验收标准:**
- [ ] 可以创建题库
- [ ] 可以添加/编辑/删除题目
- [ ] 可以设置题目维度/难度/答案
- [ ] 支持审核流程(草稿→待审核→发布)
---
### Task 2: AI批量生成
**目标:** 调用AI批量生成题目,待人工审核
**Files:**
- Modify: `server/src/assessment/question-bank.service.ts` (generate)
- Modify: `server/src/assessment/graph/nodes/generator.node.ts` (复用)
**实施步骤:**
1. 实现批量生成逻辑
2. 调用generator node生成题目
3. 保存为草稿状态
4. 提供审核界面
**验收标准:**
- [ ] 点击生成按钮,调用AI生成题目
- [ ] 生成的题目进入草稿状态
- [ ] 可以批量审核通过
---
### Task 3: 题目抽取逻
**目标:** 评估时从题库维度均衡随机抽取
**Files:**
- Modify: `server/src/assessment/question-bank.service.ts` (selectQuestions)
**实施步骤:**
1. 实现维度均衡抽取算法
2. 处理题目不足情况
3. 单元测试
**验收标准:**
- [ ] 抽取的题目维度大致均衡
- [ ] 不重复抽取同一题目
- [ ] 数量不足时有补充逻辑
---
### Task 4: 评估接入题库
**目标:** 评估优先使用题库题目
**Files:**
- Modify: `server/src/assessment/assessment.service.ts` (startSession)
**实施步骤:**
1. 修改startSession逻辑
2. 先查询题库
3. 题库不足时使用实时生成
4. 测试完整流程
**验收标准:**
- [ ] 有题库时优先从题库抽取
- [ ] 题库不足时使用实时生成
- [ ] 两者都可正常工作
---
### Task 5: 统计页面
**目标:** 独立统计页面
**Files:**
- Create: `server/src/assessment/assessment.controller.ts` (stats API)
- Create: `web/src/services/assessmentStatsService.ts`
- Create: `web/components/views/AssessmentStatsView.tsx`
- Modify: `web/index.tsx` (路由)
- Modify: `web/components/layouts/WorkspaceLayout.tsx` (侧边栏)
**验收标准:**
- [ ] 统计卡片显示正确
- [ ] 支持时间筛选
- [ ] 管理员可查看所有用户
- [ ] 历史记录表格完整
---
### Task 6: 选择题渲染
**目标:** 前端支持选择题渲染
**Files:**
- Modify: `web/components/views/AssessmentView.tsx`
**验收标准:**
- [ ] 选择题显示选项按钮
- [ ] 点击选项提交答案
---
### Task 7: 判断题渲染
**目标:** 前端支持判断题渲染
**Files:**
- Modify: `web/components/views/AssessmentView.tsx`
**验收标准:**
- [ ] 判断题显示True/False按钮
- [ ] 点击提交答案
---
### Task 8: 稳定性优化
**目标:** 提高AI生成稳定性
**Files:**
- Modify: `server/src/assessment/graph/nodes/generator.node.ts`
**实施步骤:**
1. 添加重试逻辑
2. 优化prompt
3. 错误处理
---
## 七、执行顺序
```
Task 1 (题库管理)
Task 2 (AI批量生成)
Task 3 (抽取逻辑)
Task 4 (评估接入)
Task 5 (统计页面)
Task 6 (选择题)
Task 7 (判断题)
Task 8 (稳定性)
```
---
## 八、技术要点
### 8.1 维度均衡算法
```typescript
// 伪代码
function selectQuestions(bankId: string, count: number): Question[] {
const allItems = getPublishedItems(bankId);
const dimensions = ['prompt', 'llm', 'ide', 'devPattern', 'workCapability'];
const selected: Question[] = [];
const usedIds = new Set<string>();
// 轮询从各维度选取
let dimIdx = 0;
while (selected.length < count && dimIdx < count * dimensions.length) {
const dim = dimensions[dimIdx % dimensions.length];
const available = allItems.filter(
(i) => i.dimension === dim && !usedIds.has(i.id)
);
if (available.length > 0) {
const random = available[Math.floor(Math.random() * available.length)];
selected.push(random);
usedIds.add(random.id);
}
dimIdx++;
}
// 补充不足的题目(随机)
if (selected.length < count) {
const remaining = allItems.filter((i) => !usedIds.has(i.id));
// ... 随机补充
}
return selected;
}
```
### 8.2 审核工作流
```
草稿(DRAFT) → 提交审核 → 待审核(PENDING_REVIEW)
审核通过 → 已发布(PUBLISHED)
审核拒绝 → 草稿(DRAFT) + 意见
```
---
## 九、注意事项
1. **权限控制**:题库管理、统计只对管理员开放
2. **数据隔离**:用户只能看到自己的评估记录,管理员可见所有
3. **维度映射**:确保题目维度与评估维度一致
4. **题库状态**:只有已发布的题目才能被抽取
5. **回退机制**:题库不足时使用实时生成作为备用
---
## Plan Complete
**Two execution options:**
**1. Subagent-Driven (this session)** - 继续在此会话,使用 subagent 逐个执行任务
**2. Parallel Session (separate)** - 开新会话使用 executing-plans,分批执行
**Which approach?**
@@ -1,517 +0,0 @@
# AuraK 人才测评体系完整实施计划
> **文档状态**: 待评审
> **创建日期**: 2026-04-23
> **版本**: 1.0
---
## 一、系统概述
### 1.1 目标
构建一个完整的AI人才测评体系,实现"选→育→评→用"闭环。聚焦在**评(认证)阶段**,形成包含题库管理、评估执行、成绩管理、证书管理的完整系统。
### 1.2 核心流程
```
人才输入 → 评估执行 → 结果输出 → 应用决策
↑___________↓
持续反馈
```
### 1.3 评估发起模式
| 场景 | 发起方式 |
|------|---------|
| 新人入职认证 | 管理员发起(强制) |
| 认证后自评 | 学员可自评 |
---
## 二、组织架构与权限设计
### 2.1 组织结构
```
公司
├── 本部A
│ ├── 开发部
│ └── 其他部门
└── 本部B
├── 开发部
└── 其他部门
```
### 2.2 角色权限矩阵
| 角色 | 查看自己 | 查看本部门 | 查看全公司 | 题库管理 | 发起评估 | 复查 |
|------|---------|-----------|-----------|---------|---------|------|
| 学员 | ✅ | ❌ | ❌ | ❌ | 自评 | ❌ |
| 开发部长 | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| 本部长 | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| 公司高管 | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| 管理员 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 讲师 | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ |
### 2.3 权限规则
- 学员只能看自己的历史成绩
- 各级管理者可查看下属员工成绩
- 管理员可查看全部数据、管理题库
- 讲师仅用于复查调整分数
---
## 三、模块A:题库管理
### 3.1 功能清单
| 功能 | 说明 | 优先级 |
|------|------|--------|
| 创建题库 | 关联知识库,设定题目范围 | P0 |
| 单题管理 | 增删改查,支持简答/选择/判断 | P0 |
| AI批量生成 | 按模板维度配置生成待审题目 | P0 |
| 智能标注 | AI自动标注维度、难度 | P1 |
| 审核流程 | 草稿→待审→发布/否决 | P0 |
| 相似检测 | 检测与已有题目重复度 | P2 |
| 查询统计 | 多条件筛选、维度分布、使用统计 | P1 |
### 3.2 题目属性
| 属性 | 类型 | 说明 |
|------|------|------|
| questionText | string | 题干文字 |
| questionType | enum | SHORT_ANSWER/MULTIPLE_CHOICE/TRUE_FALSE |
| options | string[] | ABCD选项 |
| correctAnswer | string | 正确答案 |
| keyPoints | string[] | 评分要点 |
| difficulty | enum | STANDARD/ADVANCED/SPECIALIST |
| dimension | enum | PROMPT/LLM/IDE/DEV_PATTERN/WORK_CAPABILITY |
| basis | string | 出题依据 |
### 3.3 题目与知识库关联
- **方案**:题目不单独关联知识库
- 由模板指定知识库范围,范围内题目均可被抽取
- 模板预设各维度的题目数量
### 3.4 审核流程
```
草稿(DRAFT)
↓ [提交审核]
待审核(PENDING_REVIEW)
↓ [通过] ↓ [否决]
已发布(PUBLISHED) 草稿(DRAFT)
+ 审核意见
```
### 3.5 版本管理
- 简化版:仅记录最近一次修改时间和修改人
### 3.6 数据模型
```typescript
// QuestionBank 实体
{
id: string;
templateId: string; // 关联模板
name: string; // 题库名称
description: string; // 描述
status: enum; // DRAFT/PENDING_REVIEW/PUBLISHED
createdBy: string;
reviewedBy: string; // 审核人
reviewedAt: Date; // 审核时间
reviewComment: string; // 审核意见
createdAt: Date;
updatedAt: Date;
}
// QuestionBankItem 实体
{
id: string;
bankId: string; // 关联题库
questionText: string; // 题干
questionType: enum; // 题型
options: string[]; // 选项
correctAnswer: string; // 答案
keyPoints: string[]; // 关键点
difficulty: enum; // 难度
dimension: enum; // 维度
basis: string; // 出题依据
createdBy: string;
createdAt: Date;
}
```
### 3.7 API设计
```typescript
// 题库CRUD
POST /api/question-banks // 创建题库
GET /api/question-banks // 列表(分页)
GET /api/question-banks/:id // 详情
PUT /api/question-banks/:id // 更新
DELETE /api/question-banks/:id // 删除
// 题目管理
POST /api/question-banks/:bankId/items // 添加题目
PUT /api/question-banks/:bankId/items/:id // 更新题目
DELETE /api/question-banks/:bankId/items/:id // 删除题目
// 批量操作
POST /api/question-banks/:bankId/generate // AI批量生成
POST /api/question-banks/:bankId/batch-add // 批量导入
// 审核流程
PUT /api/question-banks/:id/submit // 提交审核
PUT /api/question-banks/:id/review // 审核
PUT /api/question-banks/:id/publish // 发布
PUT /api/question-banks/:id/unpublish // 下架
// 查询
GET /api/question-banks/by-template/:templateId // 按模板查询
```
---
## 四、模块B:评估执行
### 4.1 功能清单
| 功能 | 说明 | 优先级 |
|------|------|--------|
| 题目抽取 | 按模板/维度均衡/高频优先抽取 | P0 |
| 答题交互 | 展示题目、接收答案、即时反馈 | P0 |
| AI评分 | 按关键点评分,0-10分 | P0 |
| 追问机制 | 预置追问+超时降级 | P0 |
| 时间控制 | 单题限时+总时长限制 | P1 |
| 成绩判定 | ≥6分通过 | P0 |
### 4.2 题目抽取算法
```typescript
function selectQuestions(bankId, templateConfig) {
// 1. 按模板指定的知识库范围查已发布题目
// 2. 按维度比例随机抽取
// 3. 高频题目优先被抽(不限制重复次数)
// 4. 不足时提示"题库不足"
}
```
### 4.3 追问机制
| 方案 | 说明 |
|------|------|
| 预置追问 | 题库中预存追问内容 |
| 实时补充 | 超时则降级跳过 |
| 追问限制 | 最多2次追问 |
### 4.4 时间控制
| 限制 | 说明 | 默认值 |
|------|------|--------|
| 单题限时 | 超时强制下一题 | 300秒 |
| 总时长限制 | 超时强制提交 | 1800秒 |
### 4.5 评估流程
```
开始评估
加载模板(数量/维度/时长)
从题库抽取题目(维度均衡)
展示第1题
用户答题
AI评分(按关键点0-10分)
追问?(预置+超时降级)
下一题(循环至最后一题)
生成报告 + 判断通过/未通过(≥6分)
通过 → 发放证书
```
### 4.6 API设计
```typescript
// 评估管理
POST /api/assessment/start // 发起评估
GET /api/assessment/:id/state // 获取状态
POST /api/assessment/:id/answer // 提交答案
// 评估管理(管理员)
GET /api/assessment // 所有评估列表
GET /api/assessment/:id // 评估详情
DELETE /api/assessment/:id // 删除评估
```
---
## 五、模块C:成绩管理
### 5.1 功能清单
| 功能 | 说明 | 优先级 |
|------|------|--------|
| 成绩查看 | 按权限查看成绩 | P0 |
| 统计报表 | 通过率/分数/趋势/雷达图 | P1 |
| 历史管理 | 保留最近3次 | P1 |
| 导出功能 | Excel/PDF/CSV | P1 |
| 复查功能 | 讲师调整分数 | P2 |
### 5.2 统计维度
| 维度 | 说明 |
|------|------|
| 通过人数/通过率 | 整体和分组 |
| 平均分/最高分/最低分 | 按组统计 |
| 各维度平均分 | 雷达图数据 |
| 评估次数趋势 | 时序折线图 |
### 5.3 报表页面
```
┌──────────────────────────────────────────┐
│ 成绩统计 [导出] [筛选] │
├──────────────────────────────────────────┤
│ 总人数 │ 通过率 │ 平均分 │ 待审核 │
│ 156 │ 82% │ 7.5 │ 3 │
├──────────────────────────────────────────┤
│ 雷达图(各维度平均分) │
│ prompt ████████ 8.2 │
│ llm ███████░░ 7.6 │
│ ide ██████░░░ 6.8 │
│ devPattern █████░░░░ 6.2 │
│ workCap ██████░░░░ 6.5 │
├──────────────────────────────────────────┤
│ 成绩列表(按组织筛选) │
│ 姓名 │ 部门 │ 分数 │ 状态 │ 时间 │ 操作 │
│ [查看] │ [复查] │
└─────────────────────────────────────────┘
```
### 5.4 API设计
```typescript
// 成绩统计
GET /api/assessment/stats // 当前用户统计
GET /api/assessment/stats/admin // 管理员统计
Query: startDate, endDate, templateId, groupId
// 复查
PUT /api/assessment/:id/review // 调整分数
```
---
## 六、模块D:证书管理
### 6.1 功能清单
| 功能 | 说明 | 优先级 |
|------|------|--------|
| 证书生成 | 通过即发 | P1 |
| 证书下载 | PDF导出 | P1 |
| 证书验真 | 二维码/ID查询 | P1 |
### 6.2 证书内容
| 字段 | 说明 |
|------|------|
| certificateId | 唯一ID |
| userId | 持证人 |
| templateId | 评估模板 |
| totalScore | 总分 |
| passedAt | 通过时间 |
| qrCode | 防伪二维码 |
### 6.3 有效期
- **永久有效**:一次通过,终身有效
### 6.4 证书样式
```
┌────────────────────────────────────────┐
│ [公司LOGO] │
│ │
│ 能力认证证书 │
│ │
│ 兹证明 [学员姓名] 通过 │
│ [评估模板名称] 能力评估 │
│ 总分:[分数] 分 │
│ │
│ 发证日期:[日期] │
│ 证书编号:[ID] │
│ │
│ [二维码] │
│ 验证真伪 │
└────────────────────────────────────────┘
```
### 6.5 API设计
```typescript
// 证书
GET /api/assessment/:id/certificate // 获取证书
GET /api/assessment/:id/certificate/download // 下载PDF
POST /api/assessment/certificate/verify // 验证证书
```
---
## 七、实施计划
### 7.1 任务分解
| Phase | Task | 内容 | 优先级 |
|-------|------|------|--------|
| 1 | A1 | 题库实体创建 | P0 |
| 1 | A2 | 题目实体创建 | P0 |
| 1 | A3 | 题库Service/Controller | P0 |
| 1 | A4 | AI批量生成 | P0 |
| 1 | A5 | 审核流程 | P0 |
| 2 | B1 | 题目抽取算法 | P0 |
| 2 | B2 | 评估流程接入题库 | P0 |
| 2 | B3 | 追问预置+降级 | P0 |
| 2 | B4 | 时间控制 | P1 |
| 3 | C1 | 统计API | P1 |
| 3 | C2 | 报表前端 | P1 |
| 3 | C3 | 历史管理 | P1 |
| 3 | C4 | 导出功能 | P1 |
| 4 | D1 | 证书实体 | P1 |
| 4 | D2 | 证书生成 | P1 |
| 4 | D3 | 证书下载/验真 | P1 |
| 5 | E1 | 复查功能 | P2 |
### 7.2 执行顺序
```
Phase 1 (题库)
Phase 2 (评估)
Phase 3 (成绩)
Phase 4 (证书)
Phase 5 (复查)
```
### 7.3 里程碑
| 里程碑 | 内容 | 时间 |
|--------|------|------|
| M1 | 题库管理基础功能 | 1周 |
| M2 | 评估流程优化 | 1周 |
| M3 | 成绩报表 | 1周 |
| M4 | 证书功能 | 1周 |
| M5 | 测试优化 | 1周 |
---
## 八、待评审问题
### 8.1 功能确认
| # | 问题 | 选项 |
|---|------|------|
| 1 | 题目抽取是否允许重复? | A.不可重复 B.可重复(推荐) C.限制次数 |
| 2 | 追问方案选择? | A.预置 B.实时 C.预置+降级(推荐) |
| 3 | 单题限时默认值? | 默认300秒 |
| 4 | 总时长限制默认值? | 默认1800秒 |
### 8.2 待扩展功能
- 多维度得分(当前为二元制)
- 组织架构动态调整
- 定时评估任务
---
## 九、验收标准
- [ ] 题库支持创建/编辑/审核/发布
- [ ] AI批量生成题目进入待审状态
- [ ] 评估可从题库维度均衡抽取
- [ ] 追问支持预置+降级
- [ ] 成绩按组织架构权限隔离
- [ ] 统计报表显示通过率/雷达图
- [ ] 通过后自动生成证书
- [ ] 证书可下载/验真
- [ ] 历史记录保留最近3次
---
## 十、技术要点
### 10.1 维度均衡算法
```typescript
function selectQuestions(bankId, count, dimensionRatio) {
const dimensions = ['prompt', 'llm', 'ide', 'devPattern', 'workCapability'];
const selected = [];
const usedIds = new Set();
// 轮询从各维度选取
let dimIdx = 0;
while (selected.length < count) {
const dim = dimensions[dimIdx % dimensions.length];
const available = allItems.filter(
(i) => i.dimension === dim && !usedIds.has(i.id) && i.status === 'PUBLISHED'
);
if (available.length > 0) {
// 高频题目优先
const random = available.sort((a, b) => b.useCount - a.useCount)[0];
selected.push(random);
usedIds.add(random.id);
}
dimIdx++;
}
return selected;
}
```
### 10.2 追问降级策略
```typescript
function getFollowUp(question, userAnswer, followUpCount) {
// 1. 检查预置追问
if (question.predefinedFollowUps && followUpCount < question.predefinedFollowUps.length) {
return question.predefinedFollowUps[followUpCount];
}
// 2. 降级:跳过追问
return null; // 进入下一题
}
```
---
## 附录
### A. 相关文档
- `docs/plans/2026-04-18-l1-talent-assessment-design.md` - L1设计
- `docs/plans/2026-04-20-assessment-system-complete-plan.md` - 旧版计划
### B. 现有代码参考
- `server/src/assessment/` - 评估模块
- `web/components/views/AssessmentView.tsx` - 前端评估界面
---
**文档状态**: 待评审后定稿
**下一步**: 评审并确认各模块功能
@@ -1,366 +0,0 @@
# AuraK 人才评测系统代码整合性检查报告
> **文档状态**: ✅ 已完成修复
> **创建日期**: 2026-05-14
> **版本**: 1.1
> **检查日期**: 2026-05-14
> **修复日期**: 2026-05-14
---
## 一、检查背景
本次代码整合性检查从**各角色使用者**视角出发,对题目生成、测试、评估全流程进行系统性的审查。涵盖:
- 用户故事与功能矩阵
- API 路由与参数传递
- 业务流与关系链
- 特殊场景与边界情况
- 前后端集成度
---
## 二、角色与用户故事
### 2.1 角色定义
| 角色 | 说明 |
|------|------|
| 普通用户 (User) | 被评估者,参与测评答题 |
| 管理员 (Admin) | 系统管理,全权限 |
| 审核员 (Reviewer) | 题目/题库审核 |
| 租户管理员 (Tenant Admin) | 租户内管理 |
### 2.2 用户故事矩阵
#### 普通用户
| 编号 | 用户故事 | API 端点 | 状态 |
|------|---------|----------|------|
| US-01 | 开始评估 | POST /assessment/start | ✅ |
| US-02 | 回答问题 | POST /assessment/:id/answer | ✅ |
| US-03 | 追问回答 | POST /assessment/:id/answer | ✅ |
| US-04 | 查看历史(最新3条) | GET /assessment/history | ✅ |
| US-05 | 查看最终报告 | GET /assessment/:id/state | ✅ |
| US-06 | 下载证书 | GET /assessment/:id/certificate | ✅ |
| US-07 | 导出Excel报告 | GET /assessment/:id/export/excel | ✅ |
| US-08 | 导出PDF报告 | GET /assessment/:id/export/pdf | ✅ |
| US-09 | 时间检查 | GET /assessment/:id/time-check | ✅ |
| US-10 | 下一题计时 | POST /assessment/:id/next-question | ✅ |
#### 管理员
| 编号 | 用户故事 | API 端点 | 状态 |
|------|---------|----------|------|
| AM-01 | 创建模板 | POST /assessment/templates | ✅ |
| AM-02 | 编辑模板 | PUT /assessment/templates/:id | ✅ |
| AM-03 | 删除模板 | DELETE /assessment/templates/:id | ✅ |
| AM-04 | 创建题库 | POST /question-banks | ✅ |
| AM-05 | 编辑题库 | PUT /question-banks/:id | ✅ |
| AM-06 | 删除题库 | DELETE /question-banks/:id | ✅ |
| AM-07 | AI生成题目 | POST /question-banks/:bankId/generate | ✅ |
| AM-08 | 添加题目 | POST /question-banks/:bankId/items | ✅ |
| AM-09 | 编辑题目 | PUT /question-banks/:bankId/items/:id | ✅ |
| AM-10 | 删除题目 | DELETE /question-banks/:bankId/items/:id | ✅ |
| AM-11 | 提交审核 | PUT /question-banks/:id/submit | ✅ |
| AM-12 | 审核题库 | PUT /question-banks/:id/review | ✅ |
| AM-13 | 发布题库 | PUT /question-banks/:id/publish | ✅ |
| AM-14 | 批量审核题目 | POST /question-banks/:bankId/items/batch-review | ✅ |
| AM-15 | 审核评估 | PUT /assessment/:id/review | ✅ |
| AM-16 | 删除评估 | DELETE /assessment/:id | ✅ |
| AM-17 | 查看统计 | GET /assessment/stats | ✅ |
| AM-18 | 查看雷达图 | GET /assessment/stats/radar | ✅ |
| AM-19 | 查看趋势图 | GET /assessment/stats/trend | ✅ |
| AM-20 | 验证证书 | GET /assessment/certificate/verify/:id | ✅ |
| AM-21 | 公开证书信息 | GET /assessment/certificate/public/:id | ✅ |
#### 审核员
| 编号 | 用户故事 | API 端点 | 状态 |
|------|---------|----------|------|
| RV-01 | 审核题库 | PUT /question-banks/:id/review | ✅ |
| RV-02 | 批量审核题目 | POST /question-banks/:bankId/items/batch-review | ✅ |
---
## 三、发现的问题清单
### 3.1 高优先级问题
| 编号 | 问题描述 | 位置 | 类型 | 修复建议 |
|------|---------|------|------|---------|
| P1-01 | 两个 `Get('history')` 路由冲突,会导致第一个被覆盖 | assessment.controller.ts:109, :159 | 路由冲突 | 删除或重命名其中一个 |
| P1-02 | 前端缺少多个API调用方法 | web/services/assessmentService.ts | 前端集成 | 添加缺失的API方法 |
| P1-03 | 前端缺少题库/模板服务 | web/services/ | 前端集成 | 新增 QuestionBankService, TemplateService |
### 3.2 中优先级问题
| 编号 | 问题描述 | 位置 | 类型 | 修复建议 |
|------|---------|------|------|---------|
| P2-01 | QuestionBank.status 字段无默认值 | question-bank.entity.ts:53 | Entity配置 | 添加 default: QuestionBankStatus.DRAFT |
| P2-02 | 状态前置检查缺失 | question-bank.service.ts | 业务逻辑 | 审核/发布/提交前检查当前状态 |
| P2-03 | 缺少强制结束评估功能 | assessment.controller.ts | 功能缺失 | 添加 POST /assessment/:id/force-end |
### 3.3 低优先级问题
| 编号 | 问题描述 | 位置 | 类型 | 修复建议 |
|------|---------|------|------|---------|
| P3-01 | `@Put` 未导入 | assessment.controller.ts:224 | 导入缺失 | 在 import 中添加 Put |
| P3-02 | 缺少操作审计日志 | 整体设计 | 架构设计 | 可选:添加审计日志表 |
| P3-03 | 批量操作功能缺失 | assessment.service.ts | 功能缺失 | 可选:批量删除/导出 |
| P3-04 | 无事务/并发控制 | 整体设计 | 架构设计 | 可选:后续优化 |
---
## 四、特殊场景检查
### 4.1 考核过程特殊场景
| 场景 | 状态 | 说明 |
|------|------|------|
| 时间超时处理 | ✅ | checkTimeLimits, isTotalTimeout/isQuestionTimeout |
| 中断恢复 | ✅ | interruptAfter + MemorySaver |
| 追问场景 | ✅ | shouldFollowUp 逻辑 |
| 网络中断恢复 | ⚠️ | 依赖LangGraph MemorySaver,无重连机制 |
| 并发答题 | ⚠️ | 无分布式锁,可能冲突 |
| 中途放弃 | ✅ | 用户可删除自己的session |
### 4.2 管理员特殊场景
| 场景 | 状态 | 说明 |
|------|------|------|
| 强制结束评估 | ❌ | 无此功能 |
| 批量删除评估 | ❌ | 无批量删除API |
| 批量导出数据 | ❌ | 无批量导出 |
| 强制重置分数 | ⚠️ | 需通过 review 接口手动调整 |
### 4.3 业务规则验证
| 规则 | 状态 | 说明 |
|------|------|------|
| 只能审核已提交的题库 | ⚠️ | 无状态前置检查 |
| 只能发布已审核通过的 | ⚠️ | 无状态前置检查 |
| 只能在评估进行中回答 | ⚠️ | 无状态前置检查 |
| 只能在评估完成后生成证书 | ✅ | 已检查 |
| 只能删除自己的评估(非admin) | ✅ | 已实现 |
---
## 五、API 路由检查
### 5.1 后端路由清单
| 端点 | 方法 | 功能 | 状态 |
|------|------|------|------|
| /assessment/start | POST | 开始评估 | ✅ |
| /assessment/:id/answer | POST | 回答问题 | ✅ |
| /assessment/:id/state | GET | 获取状态 | ✅ |
| /assessment/:id/certificate | GET | 获取证书 | ✅ |
| /assessment/:id/review | PUT | 审核评估 | ✅ |
| /assessment/:id/time-check | GET | 时间检查 | ✅ |
| /assessment/:id/next-question | POST | 下一题计时 | ✅ |
| /assessment/:id/export/excel | GET | 导出Excel | ✅ |
| /assessment/:id/export/pdf | GET | 导出PDF | ✅ |
| /assessment/stats | GET | 统计数据 | ✅ |
| /assessment/stats/radar | GET | 雷达图数据 | ✅ |
| /assessment/stats/trend | GET | 趋势图数据 | ✅ |
| /assessment/history | GET | 用户历史 | ⚠️ 冲突 |
| /assessment/certificate/verify/:id | GET | 验证证书 | ✅ |
| /assessment/certificate/public/:id | GET | 公开证书 | ✅ |
| /assessment/templates | POST/GET | 模板CRUD | ✅ |
| /question-banks | POST/GET | 题库CRUD | ✅ |
| /question-banks/:id/submit | PUT | 提交审核 | ✅ |
| /question-banks/:id/review | PUT | 审核题库 | ✅ |
| /question-banks/:id/publish | PUT | 发布题库 | ✅ |
| /question-banks/:bankId/items | CRUD | 题目CRUD | ✅ |
| /question-banks/:bankId/generate | POST | AI生成题目 | ✅ |
| /question-banks/:bankId/items/batch-review | POST | 批量审核 | ✅ |
---
## 六、数据关系链
### 6.1 Entity 关系图
```
AssessmentTemplate (1) ←→ (N) AssessmentSession
QuestionBank (1) ←→ (N) QuestionBankItem
AssessmentSession (1) ←→ (N) AssessmentQuestion
AssessmentQuestion (1) ←→ (N) AssessmentAnswer
AssessmentSession (1) ←→ (1) AssessmentCertificate
```
### 6.2 字段继承关系
| 源 | 目标 | 字段 |
|------|------|------|
| AssessmentTemplate | AssessmentSession | name, keywords, questionCount, difficultyConfig, weightConfig, passingScore, totalTimeLimit, perQuestionTimeLimit |
| TemplateService | startSession | templateId → templateId |
| question-bank.service | startSession | bankId → questions |
---
## 七、前后端集成检查
### 7.1 前端缺失的 API 方法
| 后端API | 前端需要的方法 |
|---------|---------------|
| GET /assessment/:id/certificate | getCertificate() |
| PUT /assessment/:id/review | reviewAssessment() |
| GET /assessment/stats | getStats() |
| GET /assessment/stats/radar | getRadarStats() |
| GET /assessment/stats/trend | getTrendStats() |
| GET /assessment/:id/export/excel | exportExcel() |
| GET /assessment/:id/export/pdf | exportPdf() |
| GET /assessment/:id/time-check | checkTimeLimits() |
| POST /assessment/:id/next-question | startNextQuestion() |
| POST /question-banks/* | questionBankService (缺失) |
| POST /assessment/templates/* | templateService (缺失) |
---
## 八、修复优先级与计划
### 立即修复 (P0)
1. **P1-01**: 修复路由冲突 - 删除或重命名第109行的 Get('history')
2. **P1-02**: 补全前端 assessmentService.ts 缺失的 API 方法
3. **P1-03**: 新增前端题库/模板服务
### 短期修复 (P1)
4. **P2-01**: QuestionBank.status 添加默认值
5. **P2-02**: 添加状态前置检查逻辑
6. **P2-03**: 添加强制结束评估功能
### 后续优化 (P2)
7. **P3-01**: 修复 Put 导入
8. **P3-02**: 审计日志 (可选)
9. **P3-03**: 批量操作 (可选)
10. **P3-04**: 事务控制 (可选)
---
## 九、版本信息
| 版本 | 日期 | 说明 |
|------|------|------|
| 1.0 | 2026-05-14 | 初始版本,涵盖代码整合性检查 |
| 1.1 | 2026-05-14 | 修复路由冲突、前后端集成等问题 |
---
## 十、修复记录
### 2026-05-14 修复内容
| ID | 问题 | 修复文件 | 修复内容 |
|----|------|---------|---------|
| R1 | 路由冲突 | assessment.controller.ts | 删除第109行 Get() 方法 |
| R2 | Put 导入缺失 | assessment.controller.ts | 添加 Put 到 import 解构 |
| R3 | Req 导入缺失 | assessment.controller.ts | 添加 Req 到 import 解构 |
| R4 | ForbiddenException 缺失 | assessment.controller.ts | 添加 ForbiddenException 导入 |
| S1 | publish 状态检查缺失 | question-bank.service.ts | 添加 PUBLISHED/REJECTED 状态检查 |
| M1 | QuestionBank status 默认值 | question-bank.entity.ts | 添加 default: DRAFT |
| M2 | 强制结束评估功能 | assessment.service.ts | 添加 forceEndAssessment 方法 |
| M3 | 强制结束端点 | assessment.controller.ts | 添加 POST :id/force-end |
| F1 | 前端 API 方法缺失 | web/services/assessmentService.ts | 添加所有缺失的 API 方法 |
---
## 十一、修复后验证
### 11.1 路由清单 (修复后)
```
POST /assessment/start - 开始评估
POST /assessment/:id/answer - 回答问题
GET /assessment/:id/state - 获取状态
DELETE /assessment/:id - 删除评估
GET /assessment/:id/certificate - 获取证书
GET /assessment/certificate/verify/:certificateId - 验证证书
GET /assessment/certificate/public/:sessionId - 公开证书
GET /assessment/history - 用户历史 (最新3条)
GET /assessment/stats - 统计数据
GET /assessment/stats/radar - 雷达图数据
GET /assessment/stats/trend - 趋势图数据
PUT /assessment/:id/review - 审核评估
GET /assessment/:id/time-check - 时间检查
POST /assessment/:id/next-question - 下一题计时
POST /assessment/:id/force-end - 强制结束 (admin)
GET /assessment/:id/export/excel - 导出Excel
GET /assessment/:id/export/pdf - 导出PDF
```
### 11.2 参数传递链验证
| 功能 | Controller 参数 | Service 参数 | 状态 |
|------|----------------|-------------|------|
| startSession | knowledgeBaseId?, language?, templateId? | userId, kbId, tenantId, language, templateId | ✅ |
| submitAnswer | answer, language | sessionId, userId, answer, language | ✅ |
| review | newScore, comment | sessionId, newScore, comment, reviewerId, tenantId | ✅ |
| forceEnd | sessionId | sessionId | ✅ |
### 11.3 状态检查验证
| 操作 | 前置检查 | 状态 |
|------|---------|------|
| submitForReview | DRAFT | ✅ |
| review | PENDING_REVIEW | ✅ |
| publish | PUBLISHED/REJECTED | ✅ 已修复 |
| reviewAssessment | COMPLETED | ✅ |
| forceEnd | 无限制 | ✅ |
---
## 十二、前端画面验证修复
### 12.1 AssessmentView (主评估界面) 修复
| 功能 | 修复前 | 修复后 | 状态 |
|------|--------|--------|------|
| 查看证书 | 未实现 | 添加 getCertificate 调用 | ✅ |
| 导出PDF报告 | 按钮无功能 | 添加 exportPdf 调用 | ✅ |
| 导出Excel报告 | 未实现 | 添加 exportExcel 调用 | ✅ |
| 时间显示 | 未实现 | 添加 checkTimeLimits 定期调用 | ✅ |
### 12.2 画面功能验证
| 画面 | 用户故事覆盖 | API完整性 | 参数传递 | 闭环 |
|------|-------------|-----------|---------|------|
| AssessmentView | 10/10 | ✅ | ✅ | ✅ |
| AssessmentStatsView | 7/7 | ✅ | ✅ | ✅ |
| AssessmentTemplateManager | 5/5 | ✅ | ✅ | ✅ |
| QuestionBankView | 6/6 | ✅ | ✅ | ✅ |
| QuestionBankDetailView | 7/7 | ✅ | ✅ | ✅ |
---
## 十三、附录
### A. 相关文件路径
- Controller: `server/src/assessment/assessment.controller.ts`
- Service: `server/src/assessment/assessment.service.ts`
- Entities: `server/src/assessment/entities/`
- Graph: `server/src/assessment/graph/`
- 前端服务: `web/services/assessmentService.ts`
- 前端题库服务: `web/services/questionBankService.ts`
- 前端模板服务: `web/services/templateService.ts`
### B. 参考文档
- `docs/plans/2026-04-23-assessment-system-full-plan-v2.md`
- `docs/debugging-checklist.md`
- `docs/admin-credentials.md`