# 智能出卷优化计划 ## 目标 优化“智能出卷”页面,确保必须选择学生,提供智能的默认试卷名称,优雅地处理无历史数据的学生,并验证自动生成的兜底逻辑。 ## 需要用户审查 > [!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”(或自动跳转),检查生成的页面是否符合中学试卷格式,是否包含判卷标记。