Преглед изворни кода

错题本api 返回字段优化

yemeishu пре 8 часа
родитељ
комит
5e36997167

+ 87 - 9
app/Http/Controllers/Api/IntelligentExamController.php

@@ -16,6 +16,7 @@ use App\Models\Student;
 use App\Models\Teacher;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Http;
 use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\URL;
@@ -85,8 +86,10 @@ class IntelligentExamController extends Controller
             // 错题本类型专用参数
             'paper_ids' => 'nullable|array',
             'paper_ids.*' => 'string',
+            // 修改:使用series_id + semester_code + grade替代textbook_id
+            'series_id' => 'nullable|integer|min:1',              // 教材系列ID(替代textbook_id)
+            'semester_code' => 'nullable|integer|in:1,2',          // 上下册:1=上册,2=下册
             // 新增:各组卷类型的专用参数
-            'textbook_id' => 'nullable|integer|min:1',           // 摸底和智能组卷专用
             'chapter_id_list' => 'nullable|array',                // 教材组卷专用
             'chapter_id_list.*' => 'integer|min:1',
             'kp_code_list' => 'nullable|array',                   // 知识点组卷专用
@@ -123,6 +126,12 @@ class IntelligentExamController extends Controller
         $data['total_questions'] = $data['total_questions'] ?? 20;
         $this->ensureStudentTeacherRelation($data);
 
+        // 【修改】使用series_id、semester_code和grade获取textbook_id
+        $textbookId = $this->resolveTextbookId($data);
+        if ($textbookId) {
+            $data['textbook_id'] = $textbookId;
+        }
+
         // 确保 kp_codes 是数组
         $data['kp_codes'] = $data['kp_codes'] ?? [];
         if (!is_array($data['kp_codes'])) {
@@ -515,15 +524,26 @@ class IntelligentExamController extends Controller
             }
         }
 
-        // 处理 textbook_id:字符串转换为整数
-        if (isset($payload['textbook_id'])) {
-            if (is_string($payload['textbook_id'])) {
-                $payload['textbook_id'] = (int) trim($payload['textbook_id']);
-                if ($payload['textbook_id'] <= 0) {
-                    unset($payload['textbook_id']);
+        // 【修改】处理series_id:字符串转换为整数
+        if (isset($payload['series_id'])) {
+            if (is_string($payload['series_id'])) {
+                $payload['series_id'] = (int) trim($payload['series_id']);
+                if ($payload['series_id'] <= 0) {
+                    unset($payload['series_id']);
                 }
-            } elseif (!is_int($payload['textbook_id']) || $payload['textbook_id'] <= 0) {
-                unset($payload['textbook_id']);
+            } elseif (!is_int($payload['series_id']) || $payload['series_id'] <= 0) {
+                unset($payload['series_id']);
+            }
+        }
+
+        // 【新增】处理semester_code:确保是1或2
+        if (isset($payload['semester_code'])) {
+            if (is_string($payload['semester_code'])) {
+                $payload['semester_code'] = (int) trim($payload['semester_code']);
+            }
+            // 只保留1或2,其他值都移除
+            if (!in_array($payload['semester_code'], [1, 2], true)) {
+                unset($payload['semester_code']);
             }
         }
 
@@ -1002,4 +1022,62 @@ class IntelligentExamController extends Controller
 
         return $questions;
     }
+
+    /**
+     * 【新增】根据series_id、semester_code和grade获取textbook_id
+     * 替代原来直接传入textbook_id的方式
+     */
+    private function resolveTextbookId(array $data): ?int
+    {
+        // 如果提供了series_id和semester_code,则查询textbook_id
+        $seriesId = $data['series_id'] ?? null;
+        $semesterCode = $data['semester_code'] ?? null;
+        $grade = $data['grade'] ?? null;
+
+        // 如果没有提供series_id或semester_code,则不设置textbook_id
+        if (!$seriesId || !$semesterCode) {
+            return null;
+        }
+
+        try {
+            // 根据series_id、semester_code和grade查询textbooks表
+            $query = DB::connection('mysql')
+                ->table('textbooks')
+                ->where('series_id', $seriesId)
+                ->where('semester', $semesterCode);
+
+            // 如果提供了grade,可以作为额外筛选条件
+            if ($grade) {
+                $query->where('grade', $grade);
+            }
+
+            $textbook = $query->first();
+
+            if ($textbook) {
+                Log::info('成功解析textbook_id', [
+                    'series_id' => $seriesId,
+                    'semester_code' => $semesterCode,
+                    'grade' => $grade,
+                    'textbook_id' => $textbook->id
+                ]);
+                return (int) $textbook->id;
+            }
+
+            Log::warning('未找到匹配的教材', [
+                'series_id' => $seriesId,
+                'semester_code' => $semesterCode,
+                'grade' => $grade
+            ]);
+            return null;
+
+        } catch (\Exception $e) {
+            Log::error('查询textbook_id失败', [
+                'series_id' => $seriesId,
+                'semester_code' => $semesterCode,
+                'grade' => $grade,
+                'error' => $e->getMessage()
+            ]);
+            return null;
+        }
+    }
 }

+ 2 - 2
app/Services/ExamPdfExportService.php

@@ -1004,7 +1004,7 @@ class ExamPdfExportService
             'XDG_RUNTIME_DIR' => $runtimeXdg,
         ]);
 
-        $process->setTimeout(60);
+        $process->setTimeout(120);
         $killSignal = \defined('SIGKILL') ? \SIGKILL : 9;
 
         try {
@@ -1014,7 +1014,7 @@ class ExamPdfExportService
 
             // 轮询检测PDF是否生成
             $pollStart = microtime(true);
-            $maxPollSeconds = 30;
+            $maxPollSeconds = 90;
             while ($process->isRunning() && (microtime(true) - $pollStart) < $maxPollSeconds) {
                 if (file_exists($tmpPdf) && filesize($tmpPdf) > 0) {
                     $pdfGenerated = true;

+ 92 - 7
app/Services/MistakeBookService.php

@@ -157,7 +157,7 @@ class MistakeBookService
 
             // 转换数据格式
             $data = $mistakes->map(function ($mistake) {
-                return $this->transformMistakeRecord($mistake);
+                return $this->transformMistakeRecord($mistake, false);
             })->toArray();
 
             // 获取统计信息
@@ -680,6 +680,12 @@ class MistakeBookService
      */
     private function transformMistakeRecord(MistakeRecord $mistake, bool $detailed = false): array
     {
+        // 【新增】通过 question_id 关联获取题目详情
+        $questionDetails = $this->getQuestionDetails($mistake->question_id);
+
+        // 【新增】通过 kp_ids 获取知识点信息
+        $knowledgePoints = $this->getKnowledgePoints($mistake->kp_ids);
+
         $data = [
             'id' => $mistake->id,
             'student_id' => $mistake->student_id,
@@ -687,11 +693,8 @@ class MistakeBookService
             'paper_id' => $mistake->paper_id,
             'question_text' => $mistake->question_text,
             'student_answer' => $mistake->student_answer,
-            'correct_answer' => $mistake->correct_answer,
-            'knowledge_point' => $mistake->knowledge_point,
-            'explanation' => $mistake->explanation,
-            'source' => $mistake->source,
-            'source_label' => $mistake->source_label,
+            // 【优先】questions 表的答案,其次才是错题本自带的
+            'correct_answer' => $questionDetails['answer'] ?? $mistake->correct_answer,
             'created_at' => $mistake->created_at?->toISOString(),
             'review_status' => $mistake->review_status,
             'review_status_label' => $mistake->review_status_label,
@@ -702,12 +705,25 @@ class MistakeBookService
             'next_review_at' => $mistake->next_review_at?->toISOString(),
             'error_type' => $mistake->error_type,
             'error_type_label' => $mistake->error_type_label,
-            'kp_ids' => $mistake->kp_ids,
+            // 【移除】kp_ids、source、source_label、knowledge_point、explanation 字段
+            // 'kp_ids' => $mistake->kp_ids,
+            // 'source' => $mistake->source,
+            // 'source_label' => $mistake->source_label,
+            // 'knowledge_point' => $mistake->knowledge_point,
+            // 'explanation' => $mistake->explanation,
             'skill_ids' => $mistake->skill_ids,
             'difficulty' => $mistake->difficulty,
             'difficulty_level' => $mistake->difficulty_level,
             'importance' => $mistake->importance,
             'mastery_level' => $mistake->mastery_level,
+            // 【新增】知识点信息
+            'knowledge_points' => $knowledgePoints,
+            // 【保留】options、question_type 字段(从 questions 表查询的)
+            'options' => $questionDetails['options'] ?? null,
+            'question_type' => $questionDetails['question_type'] ?? null,
+            // 【移除】answer、solution 字段(从 questions 表查询的)
+            // 'answer' => $questionDetails['answer'] ?? null,
+            // 'solution' => $questionDetails['solution'] ?? null,
         ];
 
         if ($detailed) {
@@ -751,4 +767,73 @@ class MistakeBookService
             Log::debug('缓存清除失败(可忽略)', ['error' => $e->getMessage()]);
         }
     }
+
+    /**
+     * 【新增】通过 question_id 获取题目详情
+     */
+    private function getQuestionDetails(?string $questionId): ?array
+    {
+        if (!$questionId) {
+            return null;
+        }
+
+        try {
+            $question = \DB::connection('mysql')
+                ->table('questions')
+                ->where('id', $questionId)
+                ->first();
+
+            if (!$question) {
+                return null;
+            }
+
+            return [
+                'stem' => $question->stem ?? null,
+                'options' => $question->options ?? null,
+                'answer' => $question->answer ?? null,
+                'solution' => $question->solution ?? null,
+                'difficulty' => $question->difficulty ?? null,
+                'question_type' => $question->question_type ?? null,
+            ];
+        } catch (\Exception $e) {
+            Log::warning('获取题目详情失败', [
+                'question_id' => $questionId,
+                'error' => $e->getMessage()
+            ]);
+            return null;
+        }
+    }
+
+    /**
+     * 【新增】通过 kp_ids 获取知识点信息
+     */
+    private function getKnowledgePoints(?array $kpIds): array
+    {
+        if (empty($kpIds)) {
+            return [];
+        }
+
+        try {
+            $knowledgePoints = \DB::connection('mysql')
+                ->table('knowledge_points')
+                ->whereIn('kp_code', $kpIds)
+                ->select(['kp_code', 'name', 'parent_kp_code'])
+                ->get()
+                ->toArray();
+
+            return array_map(function ($kp) {
+                return [
+                    'kp_code' => $kp->kp_code,
+                    'name' => $kp->name ?? $kp->kp_code,
+                    'parent_kp_code' => $kp->parent_kp_code,
+                ];
+            }, $knowledgePoints);
+        } catch (\Exception $e) {
+            Log::warning('获取知识点信息失败', [
+                'kp_ids' => $kpIds,
+                'error' => $e->getMessage()
+            ]);
+            return [];
+        }
+    }
 }