leftJoin('users as u', 'teachers.teacher_id', '=', 'u.user_id') ->select( 'teachers.teacher_id', 'teachers.name', 'teachers.subject', 'u.username', 'u.email' ) ->orderBy('teachers.name') ->get(); // 检查是否有学生没有对应的老师记录 $teacherIds = $teachers->pluck('teacher_id')->toArray(); $missingTeacherIds = Student::query() ->distinct() ->whereNotIn('teacher_id', $teacherIds) ->pluck('teacher_id') ->toArray(); $teachersArray = $teachers->all(); if (!empty($missingTeacherIds)) { foreach ($missingTeacherIds as $missingId) { $teachersArray[] = (object) [ 'teacher_id' => $missingId, 'name' => '未知老师 (' . $missingId . ')', 'subject' => '未知', 'username' => null, 'email' => null ]; } usort($teachersArray, function($a, $b) { return strcmp($a->name, $b->name); }); } return $teachersArray; } catch (\Exception $e) { \Illuminate\Support\Facades\Log::error('加载老师列表失败', [ 'error' => $e->getMessage() ]); return []; } } #[Computed] public function students(): array { if (empty($this->selectedTeacherId)) { return []; } try { return Student::query() ->leftJoin('users as u', 'students.student_id', '=', 'u.user_id') ->where('students.teacher_id', $this->selectedTeacherId) ->select( 'students.student_id', 'students.name', 'students.grade', 'students.class_name', 'u.username', 'u.email' ) ->orderBy('students.grade') ->orderBy('students.class_name') ->orderBy('students.name') ->get() ->all(); } catch (\Exception $e) { \Illuminate\Support\Facades\Log::error('加载学生列表失败', [ 'teacher_id' => $this->selectedTeacherId, 'error' => $e->getMessage() ]); return []; } } #[Computed] public function recentRecords(): array { return OCRRecord::with('student') ->latest() ->take(5) ->get() ->toArray(); } public function updatedSelectedTeacherId($value): void { // 当教师选择变化时,清空之前选择的学生 $this->selectedStudentId = null; } public function submitUpload(): void { if (!$this->selectedTeacherId) { Notification::make() ->title('请选择老师') ->danger() ->send(); return; } if (!$this->selectedStudentId) { Notification::make() ->title('请选择学生') ->danger() ->send(); return; } if (!$this->uploadedImage) { Notification::make() ->title('请上传图片') ->danger() ->send(); return; } $this->isUploading = true; try { // 保存图片 $path = $this->uploadedImage->store('ocr-uploads', 'public'); $filename = basename($path); // 创建OCR记录 $record = OCRRecord::create([ 'student_id' => $this->selectedStudentId, 'image_path' => $path, 'image_filename' => $filename, 'status' => 'pending', 'total_questions' => 0, 'processed_questions' => 0, ]); // 自动触发OCR处理 ProcessOCRRecord::dispatch($record->id); // 立即更新状态为处理中,提供更好的用户体验 $record->update(['status' => 'processing']); // 重置表单 $this->selectedTeacherId = null; $this->selectedStudentId = null; $this->uploadedImage = null; Notification::make() ->title('上传成功') ->body("卷子已上传并开始OCR处理。记录ID: {$record->id}") ->success() ->send(); // 刷新最近记录 unset($this->recentRecords); } catch (\Exception $e) { Notification::make() ->title('上传失败') ->body($e->getMessage()) ->danger() ->send(); } finally { $this->isUploading = false; } } public function removeImage(): void { $this->uploadedImage = null; } }