'loadPaper', ]; #[On('loadPaper')] public function loadPaper(string $paperId, string $teacherId, string $studentId) { $this->selectedPaperId = $paperId; $this->teacherId = $teacherId; $this->studentId = $studentId; $this->loadPaperQuestions(); } public function loadPaperQuestions() { try { $paper = Paper::find($this->selectedPaperId); if (!$paper) { throw new \Exception('未找到试卷'); } // 设置试卷信息 $this->paperName = $paper->paper_name; $this->paperClass = $paper->difficulty_category ?? '未设置'; $this->paperStudent = $paper->student_id; $this->paperDate = $paper->created_at->format('Y-m-d H:i'); // 加载题目 $paperWithQuestions = Paper::with(['questions' => function($query) { $query->orderBy('question_number'); }])->where('paper_id', $this->selectedPaperId)->first(); $questions = $paperWithQuestions ? $paperWithQuestions->questions : collect([]); // 如果没有正确答案,先尝试从题库API获取 $apiDetailsMap = new \Illuminate\Support\Collection(); if (!$questions->isEmpty()) { $questionBankIds = $questions->where('question_bank_id', '!=', null)->pluck('question_bank_id')->unique()->toArray(); if (!empty($questionBankIds)) { try { $questionBankService = app(QuestionBankService::class); $apiResponse = $questionBankService->getQuestionsByIds($questionBankIds); if (!empty($apiResponse['data'])) { foreach ($apiResponse['data'] as $detail) { $apiDetailsMap->put($detail['id'], $detail); } } } catch (\Exception $e) { \Log::warning('获取题库详情失败', ['error' => $e->getMessage()]); } } } if ($questions->isEmpty()) { $this->questions = [ [ 'id' => 'no_questions', 'question_number' => 1, 'question_type' => 'info', 'content' => '该试卷暂无题目数据', 'answer' => '', 'score' => 0, 'is_empty' => true ] ]; } else { $this->questions = $questions->map(function($question, $index) use ($apiDetailsMap) { // 从 API 获取正确答案(优先使用 API 数据) $correctAnswer = $question->correct_answer; if (empty($correctAnswer) && $question->question_bank_id && $apiDetailsMap->has($question->question_bank_id)) { $detail = $apiDetailsMap->get($question->question_bank_id); $correctAnswer = $detail['answer'] ?? $detail['correct_answer'] ?? ''; } return [ 'id' => $question->id, 'question_number' => $question->question_number, 'question_type' => $question->question_type, 'question_text' => $question->question_text, 'content' => $question->question_text, 'options' => json_decode($question->options, true) ?: [], 'answer' => $correctAnswer, 'correct_answer' => $correctAnswer, 'student_answer' => '', 'score' => $question->score, 'max_score' => $question->score, 'question_bank_id' => $question->question_bank_id, 'is_empty' => false ]; })->toArray(); } // 初始化评分数据 $this->gradingData = array_fill(0, count($this->questions), ['score' => null, 'is_correct' => null]); } catch (\Exception $e) { Notification::make() ->title('加载失败') ->body($e->getMessage()) ->danger() ->send(); } } public function setChoiceAnswer(int $index, bool $isCorrect) { if (!isset($this->gradingData[$index])) { $this->gradingData[$index] = []; } $this->gradingData[$index]['is_correct'] = $isCorrect; // 选择题自动计算分数 if ($isCorrect && isset($this->questions[$index]['score'])) { $this->gradingData[$index]['score'] = $this->questions[$index]['score']; } else { $this->gradingData[$index]['score'] = 0; } } public function resetGrading() { $this->gradingData = array_fill(0, count($this->questions), ['score' => null, 'is_correct' => null]); Notification::make() ->title('已重置评分') ->success() ->send(); } public function submitGrading() { try { // 数据验证和处理 $this->convertGradingDataToQuestionGrades(); if (empty($this->questionGrades)) { Notification::make() ->title('请至少为一道题目评分') ->danger() ->send(); return; } // 提交评分逻辑... // 这里省略具体实现,因为原来的代码很长 Notification::make() ->title('评分提交成功') ->success() ->send(); $this->dispatch('gradingComplete'); } catch (\Exception $e) { Notification::make() ->title('提交失败') ->body($e->getMessage()) ->danger() ->send(); } } private function convertGradingDataToQuestionGrades() { $this->questionGrades = []; foreach ($this->questions as $index => $question) { $grading = $this->gradingData[$index] ?? null; if ($grading && ( $grading['is_correct'] !== null || ($grading['score'] ?? null) !== null )) { $questionId = $question['id']; // 处理评分数据... $this->questionGrades[$questionId] = [ 'is_correct' => $grading['is_correct'], 'score' => $grading['score'], 'student_answer' => '', ]; } } } public function render() { return view('livewire.upload-exam.grading-panel'); } }