Explorar el Código

chore: 与 main 对齐 ExamPdfExportService 与 pdf-report,避免质检合并覆盖组卷/PDF 主路径

Made-with: Cursor
yemeishu hace 3 semanas
padre
commit
9150ce6dc8

+ 25 - 34
app/Services/ExamPdfExportService.php

@@ -4578,7 +4578,7 @@ class ExamPdfExportService
      * @param  array  $student  学生信息 ['name' => '', 'grade' => '']
      * @param  array  $teacher  教师信息 ['name' => '']
      * @param  bool  $includeGrading  是否包含判卷版本
-     * @return array 返回 ['pdf_url' => '...'] 或 ['pdf_url' => '...', 'grading_pdf_url' => '...'](includeGrading 时返回完整 PDF,pdf_url 与 grading_pdf_url 为同一份)
+     * @return array 返回 ['pdf_url' => '...', 'grading_pdf_url' => '...']
      */
     public function generateByQuestions(
         object $paper,
@@ -4600,31 +4600,14 @@ class ExamPdfExportService
         try {
             $result = [];
 
+            // 1. 生成试卷PDF(不含答案)
             $examHtml = $this->renderCustomExamHtml($paper, $groupedQuestions, $student, $teacher, false);
-            if (! $examHtml) {
-                return $result;
-            }
-            if ($this->katexRenderer) {
-                $examHtml = $this->katexRenderer->renderHtml($examHtml);
-            }
-
-            if ($includeGrading) {
-                // 生成完整一份 PDF:试卷 + 判卷(分页合并)
-                $gradingHtml = $this->renderCustomExamHtml($paper, $groupedQuestions, $student, $teacher, true);
-                if ($gradingHtml && $this->katexRenderer) {
-                    $gradingHtml = $this->katexRenderer->renderHtml($gradingHtml);
-                }
-                $unifiedHtml = $gradingHtml ? $this->mergeHtmlWithPageBreak($examHtml, $gradingHtml, null) : $examHtml;
-                $pdfBinary = $this->buildPdf($unifiedHtml ?? $examHtml, true);
-                if ($pdfBinary) {
-                    $path = "custom_exams/{$paper->paper_id}.pdf";
-                    $url = $this->pdfStorageService->put($path, $pdfBinary);
-                    $result['pdf_url'] = $url;
-                    $result['grading_pdf_url'] = $url; // 兼容:完整 PDF 含试卷+判卷,与 pdf_url 同一份
-                    Log::info('generateByQuestions: 完整 PDF(试卷+判卷)生成成功', ['url' => $url]);
+            if ($examHtml) {
+                // 【修复】使用服务端 KaTeX 预渲染 LaTeX 公式
+                if ($this->katexRenderer) {
+                    $examHtml = $this->katexRenderer->renderHtml($examHtml);
                 }
-            } else {
-                // 仅试卷
+                // 与学生卷 PDF 一致:扁长图走自适应宽度(与 renderAndStoreExamPdf 第二参语义对齐)
                 $examPdf = $this->buildPdf($examHtml, true);
                 if ($examPdf) {
                     $examPath = "custom_exams/{$paper->paper_id}_exam.pdf";
@@ -4634,6 +4617,24 @@ class ExamPdfExportService
                 }
             }
 
+            // 2. 如果需要,生成判卷PDF(含答案)
+            if ($includeGrading) {
+                $gradingHtml = $this->renderCustomExamHtml($paper, $groupedQuestions, $student, $teacher, true);
+                if ($gradingHtml) {
+                    // 【修复】使用服务端 KaTeX 预渲染 LaTeX 公式
+                    if ($this->katexRenderer) {
+                        $gradingHtml = $this->katexRenderer->renderHtml($gradingHtml);
+                    }
+                    $gradingPdf = $this->buildPdf($gradingHtml, true);
+                    if ($gradingPdf) {
+                        $gradingPath = "custom_exams/{$paper->paper_id}_grading.pdf";
+                        $gradingUrl = $this->pdfStorageService->put($gradingPath, $gradingPdf);
+                        $result['grading_pdf_url'] = $gradingUrl;
+                        Log::info('判卷PDF生成成功', ['url' => $gradingUrl]);
+                    }
+                }
+            }
+
             return $result;
 
         } catch (\Throwable $e) {
@@ -4775,15 +4776,6 @@ class ExamPdfExportService
     ): ?string {
         try {
             $viewName = $this->resolveExamViewName($grading);
-            $examCode = $paper->paper_id ?? 'unknown';
-            $studentName = $student['name'] ?? '________';
-            $pdfMeta = [
-                'student_name' => $studentName,
-                'exam_code' => $examCode,
-                'header_title' => $studentName . '|' . $examCode . '|质检',
-                'exam_pdf_title' => '试卷_' . $examCode,
-                'grading_pdf_title' => '判卷_' . $examCode,
-            ];
 
             $html = view($viewName, [
                 'paper' => $paper,
@@ -4792,7 +4784,6 @@ class ExamPdfExportService
                 'teacher' => $teacher,
                 'grading' => $grading,
                 'includeAnswer' => false, // exam-paper 视图需要这个变量
-                'pdfMeta' => $pdfMeta,
             ])->render();
 
             if (empty(trim($html))) {

+ 0 - 1
resources/views/exam-analysis/pdf-report.blade.php

@@ -812,7 +812,6 @@
                     return \App\Services\MathFormulaProcessor::processFormulas($text);
                 };
                 // 选择题:选项来自服务端 questions.options / 题干解析;正确答案字母用于打 ✅
-                // 展示时将 B / BC 映射为具体选项内容,减少来回翻题干。
                 $displayCorrectAnswer = is_array($correctAnswer)
                     ? json_encode($correctAnswer, JSON_UNESCAPED_UNICODE)
                     : (string) $correctAnswer;