# 考试工作流联调文档

**版本：** v2.0  
**状态：** ✅ 已完成  
**最后更新：** 2025-10-12

---

## 一、基本信息

### 考试页面
- **URL：** `http://localhost:3001/trainee/exam?courseId=1`
- **流程：** 三轮考试（正式考试 + 两次错题重考）

### 两个Dify工作流

#### 工作流1：试题生成器
- **API：** `http://dify.ireborn.com.cn/v1/workflows/run`
- **Token：** `app-tDlrmXyS9NtWCShsOx5FH49L`
- **功能：** 根据课程知识点生成试题

#### 工作流2：答案判断器
- **API：** `http://dify.ireborn.com.cn/v1/workflows/run`
- **Token：** `app-FvMdrvbRBz547DVZEorgO1WT`
- **功能：** 判断填空题和问答题答案

---

## 二、API接口

### 后端接口列表

| 接口 | 方法 | 功能 |
|------|------|------|
| `/api/v1/exams/generate` | POST | 生成试题 |
| `/api/v1/exams/judge-answer` | POST | 判断主观题答案 |
| `/api/v1/exams/record-mistake` | POST | 记录错题 |
| `/api/v1/exams/mistakes` | GET | 获取错题记录 |

**文件：** `kaopeilian-backend/app/api/v1/exam.py`

---

## 三、参数说明

### 生成试题参数

**第一轮（不传mistake_records）：**
```json
{
  "course_id": 1,
  "single_choice_count": 4,
  "multiple_choice_count": 2,
  "true_false_count": 1,
  "fill_blank_count": 2,
  "essay_count": 1,
  "difficulty_level": 3
}
```

**第二、三轮（传入错题记录）：**
```json
{
  "course_id": 1,
  "mistake_records": "[{\"question_id\":null,\"knowledge_point_id\":456,...}]",
  "single_choice_count": 2,
  ...
}
```

⚠️ **关键**：
- 第一轮：完全不传`mistake_records`参数
- 第二三轮：传入JSON字符串格式

### 判断答案参数

```json
{
  "question": "题目内容",
  "correct_answer": "正确答案",
  "user_answer": "用户答案",
  "analysis": "答案解析"
}
```

**返回：** `result: "正确"/"错误"` 或 `is_correct: true/false`

---

## 四、数据库表

### exam_mistakes（错题记录表）

**核心字段：**
- user_id, exam_id（必填，外键CASCADE）
- question_id, knowledge_point_id（可空，SET NULL）
- question_content, correct_answer, user_answer

**索引：** user_id, exam_id, knowledge_point_id

---

## 五、三轮考试流程

```
第一轮
  ↓ 答错N题
  ├─ 记录错题到数据库
  └─ 获取错题记录 → 第二轮

第二轮（针对第一轮错题）
  ↓ 答错M题
  ├─ 记录错题到数据库
  └─ 获取错题记录 → 第三轮

第三轮（针对第二轮错题）
  ↓ 完成
  └─ 显示最终成绩
```

---

## 六、关键技术点

### 1. 路由顺序
```python
# ✅ 正确
@router.get("/mistakes")      # 具体路由在前
@router.get("/{exam_id}")     # 动态路由在后
```

### 2. 数据格式转换

**Dify → 前端：**
```
single_choice → single
multiple_choice → multiple
true_false → judge
fill_blank → blank
essay → essay
```

### 3. 超时配置
- 试题生成：300秒（5分钟）
- 答案判断：60秒（1分钟）

---

## 七、测试验证

**测试账号：** admin / admin123  
**测试课程：** courseId=1

**验证要点：**
- ✅ 试题成功生成
- ✅ 所有题型正常答题
- ✅ 错题正确记录
- ✅ AI判断正常工作
- ✅ 三轮流程完整

---

**文档维护：** 开发团队  
**参考：** `试题生成器的核心提示词与输出示例.md`
