implementation_plan.md 4.1 KB

智能出卷优化计划

目标

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

需要用户审查

[!IMPORTANT] 校验变更:生成试卷时,必须选择学生。 默认行为:如果“试卷名称”留空,将自动生成为 [学生姓名]_[日期]_[时间]_智能试卷

建议变更

Filament Admin

[修改] IntelligentExamGeneration.php

  • 校验:在 generateExam 校验规则中添加 'selectedStudentId' => 'required'
  • 默认试卷名称
    • 移除 paperNamerequired 规则。
    • generateExam 中,检查 paperName 是否为空。如果为空,使用以下格式生成:$studentName . '_' . now()->format('Ymd_His') . '_智能试卷'
  • 兜底逻辑
    • 更新 updatedSelectedStudentId
      • 检查 studentWeaknesses 是否为空。
      • 如果为空,发送 Filament 通知:“该学生暂无薄弱点数据,将随机生成题目或根据年级推荐”。
      • filterByStudentWeakness 设置为 false(或者保持启用但未选中任何知识点,提示用户手动选择)。

[修改] intelligent-exam-generation-simple.blade.php

  • UI 调整:将“试卷名称”输入框移至“基本信息”部分的底部或不太显眼的位置,并标记为可选(占位符:“未填则自动生成”)。

验证计划

自动化测试

创建一个新的特性测试文件:tests/Feature/Livewire/IntelligentExamGenerationTest.php

  • 测试 1:强制校验

    • 尝试在未选择 selectedStudentId 的情况下调用 generateExam
    • 断言验证错误。
  • 测试 2:默认试卷名称

    • 选择一个学生。
    • paperName 留空。
    • 调用 generateExam(模拟服务调用)。
    • 断言生成的试卷具有预期的默认名称。
  • 测试 3:无薄弱点兜底通知

    • 模拟 LearningAnalyticsService 返回空薄弱点。
    • 触发 updatedSelectedStudentId
    • 断言发送了通知。

试卷格式化与 PDF 生成

[新增] ExamPdfController.php

  • 创建一个新的控制器来处理试卷预览/PDF 生成。
  • 方法 show(Request $request, $paper_id):
    • 获取试卷数据(通过 QuestionBankService 或直接查库)。
    • 渲染视图 pdf.exam-paper

[新增] resources/views/pdf/exam-paper.blade.php

  • 布局:标准 A4 试卷布局。
  • 头部:老师姓名、学生年级、学生姓名、密封线。
  • 题型分类
    • 一、选择题(每题带 OMR 标记圆圈,如 ( A ) ( B ) ( C ) ( D ) 或空心圆)。
    • 二、填空题(留出填写下划线)。
    • 三、解答题(留出足够空白)。
  • 标记位:每题前添加 OMR 标记位,用于判卷和未来拍照 OCR 定位识别。
  • 样式:使用 CSS @media print 确保打印效果良好。

[修改] 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”(或自动跳转),检查生成的页面是否符合中学试卷格式,是否包含判卷标记。