# 系统生成卷子分析数据获取修复报告 ## 问题概述 在考试系统中,**系统生成的卷子**(通过智能出卷功能生成)没有出现在"最近上传记录"中,导致用户无法通过点击"查看分析"按钮来查看这些卷子的分析数据。 ## 根本原因 系统中有两种不同类型的试卷记录,存储在不同的数据表中: 1. **OCR图片识别卷子** - 存储在 `ocr_records` 表 - 通过"上传卷子照片"功能创建 - 状态:pending, processing, completed, failed 2. **系统生成卷子** - 存储在 `papers` 表 - 通过"智能出卷"功能创建 - 状态:draft, published, completed **问题所在**: - `UploadExamPaper.php` 中的 `recentRecords()` 方法**只查询了 `ocr_records` 表**,没有包含系统生成卷子 - `ExamAnalysis.php` 页面**只接受 `recordId` 参数**,无法处理系统生成卷子的 `paperId` ## 修复方案 ### 1. 修改 UploadExamPaper.php **文件位置**:`/Volumes/T9/code/math/apis/FilamentAdmin/app/Filament/Pages/UploadExamPaper.php` **修改内容**: - 重构 `recentRecords()` 方法 - 同时查询 `ocr_records` 和 `papers` 表 - 合并两种记录并按时间排序 - 为每条记录添加 `type` 字段标识('ocr' 或 'generated') **关键代码**: ```php #[Computed] public function recentRecords(): array { // 1. 获取OCR记录 $ocrRecords = OCRRecord::with('student') ->latest() ->take(5) ->get() ->map(function($record) { return [ 'type' => 'ocr', 'id' => $record->id, 'record_id' => $record->id, 'paper_id' => null, 'student_id' => $record->student_id, 'student_name' => $record->student?->name ?? $record->student_id, 'paper_type' => $record->paper_type_label, 'paper_name' => $record->image_filename ?: '未命名图片', 'status' => $record->status, 'total_questions' => $record->total_questions, 'created_at' => $record->created_at->format('Y-m-d H:i'), 'is_completed' => $record->status === 'completed', ]; })->toArray(); // 2. 获取系统生成卷子 $generatedPapers = \App\Models\Paper::with('student') ->latest() ->take(5) ->get() ->map(function($paper) { return [ 'type' => 'generated', 'id' => $paper->paper_id, 'record_id' => null, 'paper_id' => $paper->paper_id, 'student_id' => $paper->student_id, 'student_name' => $paper->student?->name ?? $paper->student_id, 'paper_type' => '系统生成', 'paper_name' => $paper->paper_name ?? '未命名试卷', 'status' => $paper->status, 'total_questions' => $paper->question_count, 'created_at' => $paper->created_at->format('Y-m-d H:i'), 'is_completed' => $paper->status !== 'draft', ]; })->toArray(); // 3. 合并并排序 $allRecords = array_merge($ocrRecords, $generatedPapers); usort($allRecords, function($a, $b) { return strcmp($b['created_at'], $a['created_at']); }); return array_slice($allRecords, 0, 10); } ``` ### 2. 修改 ExamAnalysis.php **文件位置**:`/Volumes/T9/code/math/apis/FilamentAdmin/app/Filament/Pages/ExamAnalysis.php` **修改内容**: - 添加 `$paperId` URL参数 - 添加 `$recordType` 属性标识记录类型 - 重构 `loadAnalysisData()` 方法支持两种记录类型 - 添加 `loadLearningAnalysis()` 辅助方法 - 更新 `getPaperTypeLabel()` 和 `getStatusBadge()` 方法 **关键代码**: ```php #[Url] public ?string $recordId = null; // OCR记录ID #[Url] public ?string $paperId = null; // 系统生成卷子ID protected function loadAnalysisData() { // 处理OCR记录 if ($this->recordId) { $this->recordType = 'ocr'; $record = OCRRecord::with('student')->find($this->recordId); // ... 处理逻辑 $this->loadLearningAnalysis($record->student_id, $this->recordId); } // 处理系统生成卷子 elseif ($this->paperId) { $this->recordType = 'generated'; $paper = \App\Models\Paper::with('student')->find($this->paperId); // ... 处理逻辑 $this->loadLearningAnalysis($paper->student_id, $this->paperId); } } ``` ### 3. 修改前端视图 **文件位置**:`/Volumes/T9/code/math/apis/FilamentAdmin/resources/views/filament/pages/upload-exam-paper.blade.php` **修改内容**: - 更新"最近上传记录"表格的链接逻辑 - 根据记录类型生成正确的URL参数 - 添加图标区分OCR记录和系统生成卷子 - 优化状态显示(支持 'draft' 状态) **关键代码**: ```blade