# 智能出卷优化计划

## 目标
优化“智能出卷”页面，确保必须选择学生，提供智能的默认试卷名称，优雅地处理无历史数据的学生，并验证自动生成的兜底逻辑。

## 需要用户审查
> [!IMPORTANT]
> **校验变更**：生成试卷时，**必须**选择学生。
> **默认行为**：如果“试卷名称”留空，将自动生成为 `[学生姓名]_[日期]_[时间]_智能试卷`。

## 建议变更

### Filament Admin
#### [修改] [IntelligentExamGeneration.php](file:///Volumes/T9/code/math/apis/FilamentAdmin/app/Filament/Pages/IntelligentExamGeneration.php)
- **校验**：在 `generateExam` 校验规则中添加 `'selectedStudentId' => 'required'`。
- **默认试卷名称**：
    - 移除 `paperName` 的 `required` 规则。
    - 在 `generateExam` 中，检查 `paperName` 是否为空。如果为空，使用以下格式生成：`$studentName . '_' . now()->format('Ymd_His') . '_智能试卷'`。
- **兜底逻辑**：
    - 更新 `updatedSelectedStudentId`：
        - 检查 `studentWeaknesses` 是否为空。
        - 如果为空，发送 Filament 通知：“该学生暂无薄弱点数据，将随机生成题目或根据年级推荐”。
        - 将 `filterByStudentWeakness` 设置为 `false`（或者保持启用但未选中任何知识点，提示用户手动选择）。

#### [修改] [intelligent-exam-generation-simple.blade.php](file:///Volumes/T9/code/math/apis/FilamentAdmin/resources/views/filament/pages/intelligent-exam-generation-simple.blade.php)
- **UI 调整**：将“试卷名称”输入框移至“基本信息”部分的底部或不太显眼的位置，并标记为可选（占位符：“未填则自动生成”）。

## 验证计划

### 自动化测试
创建一个新的特性测试文件：`tests/Feature/Livewire/IntelligentExamGenerationTest.php`

- **测试 1：强制校验**
    - 尝试在未选择 `selectedStudentId` 的情况下调用 `generateExam`。
    - 断言验证错误。

- **测试 2：默认试卷名称**
    - 选择一个学生。
    - 将 `paperName` 留空。
    - 调用 `generateExam`（模拟服务调用）。
    - 断言生成的试卷具有预期的默认名称。

- **测试 3：无薄弱点兜底通知**
    - 模拟 `LearningAnalyticsService` 返回空薄弱点。
    - 触发 `updatedSelectedStudentId`。
    - 断言发送了通知。

### 试卷格式化与 PDF 生成
#### [新增] [ExamPdfController.php](file:///Volumes/T9/code/math/apis/FilamentAdmin/app/Http/Controllers/ExamPdfController.php)
- 创建一个新的控制器来处理试卷预览/PDF 生成。
- 方法 `show(Request $request, $paper_id)`:
    - 获取试卷数据（通过 `QuestionBankService` 或直接查库）。
    - 渲染视图 `pdf.exam-paper`。

#### [新增] [resources/views/pdf/exam-paper.blade.php](file:///Volumes/T9/code/math/apis/FilamentAdmin/resources/views/pdf/exam-paper.blade.php)
- **布局**：标准 A4 试卷布局。
- **头部**：老师姓名、学生年级、学生姓名、密封线。
- **题型分类**：
    - 一、选择题（每题带 OMR 标记圆圈，如 `( A ) ( B ) ( C ) ( D )` 或空心圆）。
    - 二、填空题（留出填写下划线）。
    - 三、解答题（留出足够空白）。
- **标记位**：每题前添加 OMR 标记位，用于判卷和未来拍照 OCR 定位识别。
- **样式**：使用 CSS `@media print` 确保打印效果良好。

#### [修改] [routes/web.php](file:///Volumes/T9/code/math/apis/FilamentAdmin/routes/web.php)
- 注册路由：`Route::get('/admin/intelligent-exam/pdf/{paper_id}', [ExamPdfController::class, 'show'])->name('filament.admin.auth.intelligent-exam.pdf');`

### 手动验证
1.  **校验**：尝试在未选择学生的情况下点击“生成”。预期报错。
2.  **默认名称**：选择学生，名称留空，点击“生成”。检查成功通知/数据库中生成的名称。
3.  **无薄弱点**：选择一个已知无数据的学生（或模拟）。检查警告通知。
4.  **PDF 预览**：生成试卷后，点击“导出 PDF”（或自动跳转），检查生成的页面是否符合中学试卷格式，是否包含判卷标记。
