yemeishu 6 днів тому
батько
коміт
c533e4717c

+ 6 - 6
app/Filament/Pages/IntelligentExamGeneration.php

@@ -1459,16 +1459,16 @@ Cache::put('generated_exam_' . $paperId, $examData, now()->addHour());
         // 3. 根据题目已有类型字段判断(作为后备)
         if (!empty($question['question_type']) && is_string($question['question_type'])) {
             $type = strtolower(trim($question['question_type']));
-            if (in_array($type, ['choice', '选择题', 'choice question'])) return 'choice';
-            if (in_array($type, ['fill', '填空题', 'fill in the blank'])) return 'fill';
-            if (in_array($type, ['answer', '解答题', 'calculation', '简答题'])) return 'answer';
+            if (in_array($type, ['choice', '选择题', 'choice question', 'single_choice', 'multiple_choice', 'choice', 'single_choice', 'multiple_choice'])) return 'choice';
+            if (in_array($type, ['fill', '填空题', 'fill in the blank', 'blank', 'fill_in_the_blank'])) return 'fill';
+            if (in_array($type, ['answer', '解答题', 'calculation', '简答题', 'word_problem', 'proof'])) return 'answer';
         }
 
         if (!empty($question['type']) && is_string($question['type'])) {
             $type = strtolower(trim($question['type']));
-            if (in_array($type, ['choice', '选择题', 'choice question'])) return 'choice';
-            if (in_array($type, ['fill', '填空题', 'fill in the blank'])) return 'fill';
-            if (in_array($type, ['answer', '解答题', 'calculation', '简答题'])) return 'answer';
+            if (in_array($type, ['choice', '选择题', 'choice question', 'single_choice', 'multiple_choice', 'choice', 'single_choice', 'multiple_choice'])) return 'choice';
+            if (in_array($type, ['fill', '填空题', 'fill in the blank', 'blank', 'fill_in_the_blank'])) return 'fill';
+            if (in_array($type, ['answer', '解答题', 'calculation', '简答题', 'word_problem', 'proof'])) return 'answer';
         }
 
         // 4. 根据标签判断

+ 3 - 6
app/Filament/Resources/PaperPartResource.php

@@ -47,8 +47,7 @@ class PaperPartResource extends Resource
                 ->options([
                     'choice' => '选择题',
                     'fill' => '填空题',
-                    'short' => '简答题',
-                    'calc' => '计算题',
+                    'answer' => '解答题',
                     'mixed' => '混合',
                 ]),
             Forms\Components\TextInput::make('question_count')->label('题量')->numeric(),
@@ -68,8 +67,7 @@ class PaperPartResource extends Resource
                     ->options([
                         'choice' => '选择题',
                         'fill' => '填空题',
-                        'short' => '简答题',
-                        'calc' => '计算题',
+                        'answer' => '解答题',
                         'mixed' => '混合',
                     ]),
                 Tables\Columns\TextInputColumn::make('question_count')
@@ -110,8 +108,7 @@ class PaperPartResource extends Resource
                             ->options([
                                 'choice' => '选择题',
                                 'fill' => '填空题',
-                                'short' => '简答题',
-                                'calc' => '计算题',
+                                'answer' => '解答题',
                                 'mixed' => '混合',
                             ])
                             ->required(),

+ 2 - 4
app/Filament/Resources/QuestionResource.php

@@ -53,8 +53,7 @@ class QuestionResource extends Resource
                             ->options([
                                 'choice' => '选择题',
                                 'fill' => '填空题',
-                                'short' => '解答题',
-                                'calc' => '计算题',
+                                'answer' => '解答题',
                             ])
                             ->required(),
                         Textarea::make('stem')->required()->rows(6),
@@ -81,8 +80,7 @@ class QuestionResource extends Resource
                     ->options([
                         'choice' => '选择题',
                         'fill' => '填空题',
-                        'short' => '解答题',
-                        'calc' => '计算题',
+                        'answer' => '解答题',
                     ]),
                 Filter::make('difficulty_range')
                     ->form([

+ 2 - 1
app/Filament/Resources/QuestionResource/Widgets/QuestionStats.php

@@ -13,7 +13,8 @@ class QuestionStats extends BaseWidget
         return [
             Stat::make('题目总数', Question::query()->count()),
             Stat::make('选择题', Question::query()->where('question_type', 'choice')->count()),
-            Stat::make('解答题', Question::query()->where('question_type', 'short')->count()),
+            Stat::make('填空题', Question::query()->where('question_type', 'fill')->count()),
+            Stat::make('解答题', Question::query()->where('question_type', 'answer')->count()),
         ];
     }
 }

+ 1 - 2
app/Filament/Resources/SourcePaperResource/RelationManagers/PaperPartsRelationManager.php

@@ -24,8 +24,7 @@ class PaperPartsRelationManager extends RelationManager
                     ->options([
                         'choice' => '选择题',
                         'fill' => '填空题',
-                        'short' => '简答题',
-                        'calc' => '计算题',
+                        'answer' => '解答题',
                         'mixed' => '混合',
                     ]),
                 Tables\Columns\TextInputColumn::make('question_count')->label('题量(人工)')->type('number'),

+ 1 - 0
app/Filament/Resources/TextbookResource/Tables/TextbookTable.php

@@ -26,6 +26,7 @@ class TextbookTable
                 TextColumn::make('id')->label('ID')->sortable(),
                 TextColumn::make('official_title')->label('教材名称')->searchable()->wrap(),
                 TextColumn::make('series_name')->label('教材系列')->sortable(),
+                TextColumn::make('series_id')->label('系列ID')->sortable(),
                 TextColumn::make('stage')
                     ->label('学段')
                     ->sortable()

+ 7 - 1
app/Filament/Traits/HandlesMindmapDetails.php

@@ -116,7 +116,13 @@ trait HandlesMindmapDetails
                     'fill' => '填空题',
                     'answer' => '解答题',
                 ];
-                $type = $typeMap[$question['question_type'] ?? 'answer'] ?? '解答题';
+                $rawType = strtolower((string) ($question['question_type'] ?? 'answer'));
+                $normalizedType = match (true) {
+                    str_contains($rawType, 'choice') || str_contains($rawType, '选择') => 'choice',
+                    str_contains($rawType, 'fill') || str_contains($rawType, 'blank') || str_contains($rawType, '填空') => 'fill',
+                    default => 'answer',
+                };
+                $type = $typeMap[$normalizedType] ?? '解答题';
 
                 $stem = $question['stem'] ?? $question['content'] ?? '练习题';
 

+ 118 - 21
app/Http/Controllers/Api/IntelligentExamController.php

@@ -10,6 +10,7 @@ use App\Services\ExamPdfExportService;
 use App\Services\QuestionBankService;
 use App\Services\PaperPayloadService;
 use App\Services\TaskManager;
+use App\Models\MistakeRecord;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Http;
@@ -60,6 +61,10 @@ class IntelligentExamController extends Controller
             'question_type_ratio' => 'array',
             'difficulty_ratio' => 'array',
             'total_score' => 'nullable|numeric|min:1|max:1000',
+            'mistake_ids' => 'nullable|array',
+            'mistake_ids.*' => 'string',
+            'mistake_question_ids' => 'nullable|array',
+            'mistake_question_ids.*' => 'string',
         ]);
 
         if ($validator->fails()) {
@@ -82,27 +87,59 @@ class IntelligentExamController extends Controller
         $difficultyRatio = $this->normalizeDifficultyRatio($data['difficulty_ratio'] ?? []);
         $paperName = $data['paper_name'] ?? ('智能试卷_' . now()->format('Ymd_His'));
         $difficultyCategory = $this->normalizeDifficultyCategory($data['difficulty_category'] ?? null);
+        $mistakeIds = $data['mistake_ids'] ?? [];
+        $mistakeQuestionIds = $data['mistake_question_ids'] ?? [];
 
         try {
-            // 第一步:生成智能试卷(同步)
-            $result = $this->learningAnalyticsService->generateIntelligentExam([
-                'student_id' => $data['student_id'],
-                'grade' => $data['grade'] ?? null,
-                'total_questions' => $data['total_questions'],
-                'kp_codes' => $data['kp_codes'],
-                'skills' => $data['skills'] ?? [],
-                'question_type_ratio' => $questionTypeRatio,
-                'difficulty_ratio' => $difficultyRatio,
-            ]);
+            $questions = [];
+            $result = null;
+
+            if (!empty($mistakeIds) || !empty($mistakeQuestionIds)) {
+                $questionIds = $this->resolveMistakeQuestionIds(
+                    $data['student_id'],
+                    $mistakeIds,
+                    $mistakeQuestionIds
+                );
+
+                if (empty($questionIds)) {
+                    return response()->json([
+                        'success' => false,
+                        'message' => '未找到可用的错题题目,请检查错题ID或学生ID',
+                    ], 400);
+                }
 
-            if (empty($result['success'])) {
-                return response()->json([
-                    'success' => false,
-                    'message' => $result['message'] ?? '智能出卷失败',
-                ], 400);
-            }
+                $bankQuestions = $this->questionBankService->getQuestionsByIds($questionIds)['data'] ?? [];
+                if (empty($bankQuestions)) {
+                    return response()->json([
+                        'success' => false,
+                        'message' => '错题对应的题库题目不存在或不可用',
+                    ], 400);
+                }
 
-            $questions = $this->hydrateQuestions($result['questions'] ?? [], $data['kp_codes']);
+                $questions = $this->hydrateQuestions($bankQuestions, $data['kp_codes']);
+                $questions = $this->sortQuestionsByRequestedIds($questions, $questionIds);
+                $paperName = $data['paper_name'] ?? ('错题复习_' . $data['student_id'] . '_' . now()->format('Ymd_His'));
+            } else {
+                // 第一步:生成智能试卷(同步)
+                $result = $this->learningAnalyticsService->generateIntelligentExam([
+                    'student_id' => $data['student_id'],
+                    'grade' => $data['grade'] ?? null,
+                    'total_questions' => $data['total_questions'],
+                    'kp_codes' => $data['kp_codes'],
+                    'skills' => $data['skills'] ?? [],
+                    'question_type_ratio' => $questionTypeRatio,
+                    'difficulty_ratio' => $difficultyRatio,
+                ]);
+
+                if (empty($result['success'])) {
+                    return response()->json([
+                        'success' => false,
+                        'message' => $result['message'] ?? '智能出卷失败',
+                    ], 400);
+                }
+
+                $questions = $this->hydrateQuestions($result['questions'] ?? [], $data['kp_codes']);
+            }
 
             if (empty($questions)) {
                 return response()->json([
@@ -112,6 +149,8 @@ class IntelligentExamController extends Controller
             }
 
             $totalScore = array_sum(array_column($questions, 'score'));
+            $totalQuestions = min($data['total_questions'], count($questions));
+            $questions = array_slice($questions, 0, $totalQuestions);
 
             // 第二步:保存试卷到数据库(同步)
             $paperId = $this->questionBankService->saveExamToDatabase([
@@ -165,7 +204,10 @@ class IntelligentExamController extends Controller
                         'exam_paper_pdf' => null,
                         'grading_pdf' => null,
                     ],
-                    'stats' => $result['stats'] ?? null,
+                    'stats' => $result['stats'] ?? [
+                        'total_selected' => count($questions),
+                        'mistake_based' => !empty($mistakeIds) || !empty($mistakeQuestionIds),
+                    ],
                     'created_at' => now()->toISOString(),
                 ],
             ];
@@ -311,6 +353,19 @@ class IntelligentExamController extends Controller
             $payload['skills'] = array_values(array_filter(array_map('trim', explode(',', $payload['skills']))));
         }
 
+        foreach (['mistake_ids', 'mistake_question_ids'] as $key) {
+            if (isset($payload[$key])) {
+                if (is_string($payload[$key])) {
+                    $raw = trim($payload[$key]);
+                    $payload[$key] = $raw === ''
+                        ? []
+                        : array_values(array_filter(array_map('trim', explode(',', $raw))));
+                } elseif (!is_array($payload[$key])) {
+                    $payload[$key] = [];
+                }
+            }
+        }
+
         return $payload;
     }
 
@@ -350,13 +405,13 @@ class IntelligentExamController extends Controller
     private function normalizeQuestionTypeKey(string $key): ?string
     {
         $key = trim($key);
-        if (in_array($key, ['choice', '选择题', 'single_choice', 'multiple_choice'])) {
+        if (in_array($key, ['choice', '选择题', 'single_choice', 'multiple_choice', 'CHOICE', 'SINGLE_CHOICE', 'MULTIPLE_CHOICE'], true)) {
             return '选择题';
         }
-        if (in_array($key, ['fill', '填空题', 'blank'])) {
+        if (in_array($key, ['fill', '填空题', 'blank', 'FILL_IN_THE_BLANK', 'FILL'], true)) {
             return '填空题';
         }
-        if (in_array($key, ['answer', '解答题', '计算题'])) {
+        if (in_array($key, ['answer', '解答题', '计算题', 'CALCULATION', 'WORD_PROBLEM', 'PROOF'], true)) {
             return '解答题';
         }
 
@@ -455,4 +510,46 @@ class IntelligentExamController extends Controller
 
         return 10;
     }
+
+    private function resolveMistakeQuestionIds(string $studentId, array $mistakeIds, array $mistakeQuestionIds): array
+    {
+        $questionIds = [];
+
+        if (!empty($mistakeQuestionIds)) {
+            $questionIds = array_merge($questionIds, $mistakeQuestionIds);
+        }
+
+        if (!empty($mistakeIds)) {
+            $mistakeQuestionIdsFromDb = MistakeRecord::query()
+                ->where('student_id', $studentId)
+                ->whereIn('id', $mistakeIds)
+                ->pluck('question_id')
+                ->filter()
+                ->values()
+                ->all();
+
+            $questionIds = array_merge($questionIds, $mistakeQuestionIdsFromDb);
+        }
+
+        $questionIds = array_values(array_unique(array_filter($questionIds)));
+        return $questionIds;
+    }
+
+    private function sortQuestionsByRequestedIds(array $questions, array $requestedIds): array
+    {
+        if (empty($requestedIds)) {
+            return $questions;
+        }
+
+        $order = array_flip($requestedIds);
+        usort($questions, function ($a, $b) use ($order) {
+            $aId = (string) ($a['id'] ?? '');
+            $bId = (string) ($b['id'] ?? '');
+            $aPos = $order[$aId] ?? PHP_INT_MAX;
+            $bPos = $order[$bId] ?? PHP_INT_MAX;
+            return $aPos <=> $bPos;
+        });
+
+        return $questions;
+    }
 }

+ 44 - 2
app/Http/Controllers/ExamPdfController.php

@@ -101,6 +101,44 @@ class ExamPdfController extends Controller
         return 'answer';
     }
 
+    private function normalizeQuestionTypeValue(string $type): string
+    {
+        $type = trim($type);
+        $lower = strtolower($type);
+
+        if (in_array($lower, ['choice', 'single_choice', 'multiple_choice'], true)) {
+            return 'choice';
+        }
+        if (in_array($lower, ['fill', 'blank', 'fill_in_the_blank'], true)) {
+            return 'fill';
+        }
+        if (in_array($lower, ['answer', 'calculation', 'word_problem', 'proof'], true)) {
+            return 'answer';
+        }
+
+        if (in_array($type, ['CHOICE', 'SINGLE_CHOICE', 'MULTIPLE_CHOICE'], true)) {
+            return 'choice';
+        }
+        if (in_array($type, ['FILL', 'FILL_IN_THE_BLANK'], true)) {
+            return 'fill';
+        }
+        if (in_array($type, ['CALCULATION', 'WORD_PROBLEM', 'PROOF'], true)) {
+            return 'answer';
+        }
+
+        if (in_array($type, ['选择题'], true)) {
+            return 'choice';
+        }
+        if (in_array($type, ['填空题'], true)) {
+            return 'fill';
+        }
+        if (in_array($type, ['解答题', '计算题'], true)) {
+            return 'answer';
+        }
+
+        return $lower ?: 'answer';
+    }
+
     /**
      * 从题目内容中提取选项
      */
@@ -523,7 +561,9 @@ class ExamPdfController extends Controller
             $solution = $q['solution'] ?? '';
 
             // 优先使用 question_type 字段,如果没有则根据内容智能判断
-            $type = $q['question_type'] ?? $this->determineQuestionType($q);
+            $type = isset($q['question_type'])
+                ? $this->normalizeQuestionTypeValue((string) $q['question_type'])
+                : $this->determineQuestionType($q);
 
             // 详细调试:记录题目类型判断结果
             Log::info('题目类型判断', [
@@ -694,7 +734,9 @@ class ExamPdfController extends Controller
             $options = $q['options'] ?? $extractedOptions;
             $answer = $q['answer'] ?? '';
             $solution = $q['solution'] ?? '';
-            $type = $q['question_type'] ?? $this->determineQuestionType($q);
+            $type = isset($q['question_type'])
+                ? $this->normalizeQuestionTypeValue((string) $q['question_type'])
+                : $this->determineQuestionType($q);
             if (!isset($questions[$type])) {
                 $type = 'answer';
             }

+ 1 - 1
app/Services/AIQuestionStructService.php

@@ -39,7 +39,7 @@ class AiQuestionStructService
             return 'fill';
         }
 
-        return 'short';
+        return 'answer';
     }
 
     public function estimateDifficulty(string $questionText, array $meta = []): int

+ 3 - 3
app/Services/LearningAnalyticsService.php

@@ -1692,13 +1692,13 @@ class LearningAnalyticsService
         $typeField = $q['question_type'] ?? $q['type'] ?? '';
         if (is_string($typeField)) {
             $t = strtolower($typeField);
-            if (in_array($t, ['choice', 'single_choice', 'multiple_choice', '选择题'])) {
+            if (in_array($t, ['choice', 'single_choice', 'multiple_choice', '选择题', 'choice', 'single_choice', 'multiple_choice'])) {
                 return 'choice';
             }
-            if (in_array($t, ['fill', 'blank', 'fill_blank', '填空题'])) {
+            if (in_array($t, ['fill', 'blank', 'fill_blank', 'fill_in_the_blank', '填空题'])) {
                 return 'fill';
             }
-            if (in_array($t, ['answer', 'calculation', '解答题'])) {
+            if (in_array($t, ['answer', 'calculation', 'word_problem', 'proof', '解答题'])) {
                 return 'answer';
             }
         }

+ 1 - 1
app/Services/PaperPartExtractorService.php

@@ -99,7 +99,7 @@ class PaperPartExtractorService
         return match (true) {
             Str::contains($title, '选择') => 'choice',
             Str::contains($title, '填空') => 'fill',
-            Str::contains($title, ['解答', '简答', '分析']) => 'short',
+            Str::contains($title, ['解答', '简答', '分析']) => 'answer',
             Str::contains($title, ['计算', '推导']) => 'calc',
             default => 'mixed',
         };

+ 39 - 1
app/Services/QuestionBankService.php

@@ -632,7 +632,7 @@ class QuestionBankService
                     }
 
                     // 获取题目类型
-                    $questionType = $question['question_type'] ?? 'answer';
+                    $questionType = $this->normalizeQuestionTypeValue($question['question_type'] ?? $question['type'] ?? 'answer');
                     if (!$questionType) {
                         // 如果没有类型,根据内容推断
                         $content = $question['stem'] ?? $question['content'] ?? '';
@@ -748,6 +748,44 @@ class QuestionBankService
         return app(QuestionLocalService::class);
     }
 
+    private function normalizeQuestionTypeValue(string $type): string
+    {
+        $type = trim($type);
+        $lower = strtolower($type);
+
+        if (in_array($lower, ['choice', 'single_choice', 'multiple_choice'], true)) {
+            return 'choice';
+        }
+        if (in_array($lower, ['fill', 'blank', 'fill_in_the_blank'], true)) {
+            return 'fill';
+        }
+        if (in_array($lower, ['answer', 'calculation', 'word_problem', 'proof'], true)) {
+            return 'answer';
+        }
+
+        if (in_array($type, ['CHOICE', 'SINGLE_CHOICE', 'MULTIPLE_CHOICE'], true)) {
+            return 'choice';
+        }
+        if (in_array($type, ['FILL', 'FILL_IN_THE_BLANK'], true)) {
+            return 'fill';
+        }
+        if (in_array($type, ['CALCULATION', 'WORD_PROBLEM', 'PROOF'], true)) {
+            return 'answer';
+        }
+
+        if (in_array($type, ['选择题'], true)) {
+            return 'choice';
+        }
+        if (in_array($type, ['填空题'], true)) {
+            return 'fill';
+        }
+        if (in_array($type, ['解答题', '计算题'], true)) {
+            return 'answer';
+        }
+
+        return $lower ?: 'answer';
+    }
+
     /**
      * 检查数据完整性 - 发现没有题目的试卷
      */

+ 2 - 2
app/Services/QuestionPromptService.php

@@ -89,7 +89,7 @@ PROMPT;
 要求:
 - 只输出 JSON
 - 必须包含字段:stem, options, answer, solution, question_type, difficulty, knowledge_points, solution_steps
-- short/answer 类题目必须提供 solution_steps(分步评分),每步包含 score 与 kp_codes
+- answer 类题目必须提供 solution_steps(分步评分),每步包含 score 与 kp_codes
 - knowledge_points 为题目级知识点列表
 
 材料内容:
@@ -101,7 +101,7 @@ PROMPT;
   "options": {"A": "...", "B": "..."},
   "answer": "...",
   "solution": "...",
-  "question_type": "short",
+  "question_type": "answer",
   "difficulty": 0.6,
   "knowledge_points": ["A01"],
   "solution_steps": [

+ 1 - 1
app/Services/QuestionReviewService.php

@@ -70,7 +70,7 @@ class QuestionReviewService
             return 'choice';
         }
 
-        return 'short';
+        return 'answer';
     }
 
     private function buildQuestionCode(PreQuestionCandidate $candidate): string

+ 0 - 78
resources/views/examples/exam-analysis-components-example.blade.php

@@ -1,78 +0,0 @@
-<!--
-组件化设计示例
-展示如何在不同的页面中使用这些组件
--->
-
-<!-- 示例1: OCR记录页面 (紧凑模式) -->
-<div>
-    <div class="space-y-4">
-        @if($loading)
-            <x-exam-analysis.loading message="正在分析试卷数据..." />
-        @else
-            <x-exam-analysis.header :recordData="$recordData" title="📊 OCR试卷分析" />
-            <x-exam-analysis.quick-stats :recordData="$recordData" />
-            <x-exam-analysis.learning-analysis :analysisData="$analysisData" />
-            <x-exam-analysis.question-details :questions="$recordData['questions'] ?? []" />
-            @if(isset($analysisData['recommendations']))
-                <x-exam-analysis.recommendations :recommendations="$analysisData['recommendations']" />
-            @endif
-        @endif
-    </div>
-</div>
-
-<!-- 示例2: 系统生成卷子页面 (标准模式) -->
-<div>
-    <div class="space-y-6">
-        @if($loading)
-            <x-exam-analysis.loading message="正在加载试卷数据..." />
-        @else
-            <x-exam-analysis.header :recordData="$recordData" title="📊 试卷分析报告" />
-
-            <!-- 试卷基本信息 -->
-            <div class="bg-white rounded-lg shadow-sm border border-gray-200">
-                <div class="p-6 border-b border-gray-200">
-                    <h2 class="text-lg font-semibold text-gray-900">📝 试卷信息</h2>
-                </div>
-                <div class="p-6">
-                    <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
-                        <div>
-                            <label class="block text-sm font-medium text-gray-500 mb-1">试卷名称</label>
-                            <p class="text-lg font-medium text-gray-900">{{ $recordData['paper_name'] ?? 'N/A' }}</p>
-                        </div>
-                        <div>
-                            <label class="block text-sm font-medium text-gray-500 mb-1">试卷编号</label>
-                            <p class="text-lg font-mono text-gray-900">{{ $recordData['paper_id'] ?? 'N/A' }}</p>
-                        </div>
-                        <div>
-                            <label class="block text-sm font-medium text-gray-500 mb-1">题目数量</label>
-                            <p class="text-lg font-medium text-gray-900">{{ $recordData['total_questions'] ?? 0 }} 题</p>
-                        </div>
-                    </div>
-                </div>
-            </div>
-
-            <x-exam-analysis.learning-analysis :analysisData="$analysisData" />
-            <x-exam-analysis.question-details :questions="$recordData['questions'] ?? []" />
-
-            @if(isset($analysisData['recommendations']))
-                <x-exam-analysis.recommendations :recommendations="$analysisData['recommendations']" />
-            @endif
-        @endif
-    </div>
-</div>
-
-<!-- 示例3: 自定义页面布局 -->
-<div>
-    <div class="space-y-6">
-        <!-- 只显示题目详情 -->
-        <x-exam-analysis.question-details :questions="$questions" />
-
-        <!-- 只显示学习分析 -->
-        <x-exam-analysis.learning-analysis :analysisData="$analysisData" />
-
-        <!-- 只显示学习建议 -->
-        @if(isset($recommendations))
-            <x-exam-analysis.recommendations :recommendations="$recommendations" />
-        @endif
-    </div>
-</div>