|
|
@@ -28,6 +28,11 @@ class ExamTypeStrategy
|
|
|
$this->difficultyDistributionService = $difficultyDistributionService ?? app(DifficultyDistributionService::class);
|
|
|
}
|
|
|
|
|
|
+ private static function defaultTotalQuestions(): int
|
|
|
+ {
|
|
|
+ return (int) config('question_bank.default_total_questions');
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 根据组卷类型构建参数
|
|
|
* assembleType: 0-章节摸底, 1-智能组卷, 2-知识点组卷, 3-教材组卷, 4-通用, 5-错题本, 8-智能组卷(新), 9-原摸底
|
|
|
@@ -108,7 +113,7 @@ class ExamTypeStrategy
|
|
|
$assembleType = (int) ($params['assemble_type'] ?? 4);
|
|
|
|
|
|
$difficultyCategory = (int) ($params['difficulty_category'] ?? 1);
|
|
|
- $totalQuestions = (int) ($params['total_questions'] ?? 20);
|
|
|
+ $totalQuestions = (int) ($params['total_questions'] ?? self::defaultTotalQuestions());
|
|
|
|
|
|
Log::debug('ExamTypeStrategy: 应用难度系数分布', [
|
|
|
'difficulty_category' => $difficultyCategory,
|
|
|
@@ -209,7 +214,7 @@ class ExamTypeStrategy
|
|
|
|
|
|
$textbookId = $params['textbook_id'] ?? null;
|
|
|
$grade = $params['grade'] ?? null;
|
|
|
- $totalQuestions = $params['total_questions'] ?? 20;
|
|
|
+ $totalQuestions = $params['total_questions'] ?? self::defaultTotalQuestions();
|
|
|
$endCatalogId = $params['end_catalog_id'] ?? null; // 截止章节ID
|
|
|
|
|
|
if (!$textbookId) {
|
|
|
@@ -284,7 +289,7 @@ class ExamTypeStrategy
|
|
|
$diagnosticService = app(DiagnosticChapterService::class);
|
|
|
$textbookId = $params['textbook_id'] ?? null;
|
|
|
$grade = $params['grade'] ?? null;
|
|
|
- $totalQuestions = $params['total_questions'] ?? 20;
|
|
|
+ $totalQuestions = $params['total_questions'] ?? self::defaultTotalQuestions();
|
|
|
|
|
|
Log::info('ExamTypeStrategy: 新摸底使用textbook_id', [
|
|
|
'textbook_id' => $textbookId,
|
|
|
@@ -403,11 +408,7 @@ class ExamTypeStrategy
|
|
|
|
|
|
// 组装增强参数(复用知识点组卷逻辑)
|
|
|
$questionCount = count($paperQuestionIds);
|
|
|
- $maxQuestions = 50; // 错题本最大题目数限制
|
|
|
- $targetQuestions = (int) ($maxTotalQuestions ?? $questionCount);
|
|
|
- $targetQuestions = min($targetQuestions, $maxQuestions);
|
|
|
-
|
|
|
- // 如果题量超过最大值,按上限截取
|
|
|
+ $maxQuestions = 50; // 源侧题量上限,避免一次拉过多
|
|
|
if ($questionCount > $maxQuestions) {
|
|
|
Log::warning('ExamTypeStrategy: 错题数量超过最大值限制,已截取', [
|
|
|
'question_count' => $questionCount,
|
|
|
@@ -417,11 +418,15 @@ class ExamTypeStrategy
|
|
|
$questionCount = $maxQuestions;
|
|
|
}
|
|
|
|
|
|
+ $requested = (int) ($params['total_questions'] ?? self::defaultTotalQuestions());
|
|
|
+ $fromPaper = (int) ($maxTotalQuestions ?? $questionCount);
|
|
|
+ $targetQuestions = min($requested, $fromPaper, $maxQuestions);
|
|
|
+
|
|
|
$enhanced = array_merge($params, [
|
|
|
'kp_code_list' => array_values($paperKnowledgePoints),
|
|
|
'paper_ids' => $paperIds,
|
|
|
'paper_name' => $params['paper_name'] ?? ('追练_' . now()->format('Ymd_His')),
|
|
|
- 'total_questions' => $targetQuestions, // 题目数量由卷子题目规模/参数决定
|
|
|
+ 'total_questions' => $targetQuestions, // 与 API/默认题量对齐,不超过源卷子可支撑题量
|
|
|
'total_score' => $maxTotalScore ?? ($params['total_score'] ?? null),
|
|
|
'difficulty_category' => $difficultyCategory,
|
|
|
'is_mistake_exam' => true,
|
|
|
@@ -663,7 +668,7 @@ class ExamTypeStrategy
|
|
|
Log::info('ExamTypeStrategy: 构建按知识点组卷参数', $params);
|
|
|
|
|
|
$studentId = $params['student_id'] ?? null;
|
|
|
- $totalQuestions = $params['total_questions'] ?? 20;
|
|
|
+ $totalQuestions = $params['total_questions'] ?? self::defaultTotalQuestions();
|
|
|
$knowledgePointsOptions = $params['knowledge_points_options'] ?? [];
|
|
|
$weaknessThreshold = $knowledgePointsOptions['weakness_threshold'] ?? 0.7;
|
|
|
$focusWeaknesses = $knowledgePointsOptions['focus_weaknesses'] ?? true;
|
|
|
@@ -846,7 +851,7 @@ class ExamTypeStrategy
|
|
|
|
|
|
$textbookId = $params['textbook_id'] ?? null;
|
|
|
$grade = $params['grade'] ?? null; // 年级信息
|
|
|
- $totalQuestions = $params['total_questions'] ?? 20;
|
|
|
+ $totalQuestions = $params['total_questions'] ?? self::defaultTotalQuestions();
|
|
|
$studentId = (int) ($params['student_id'] ?? 0);
|
|
|
|
|
|
if (!$textbookId) {
|
|
|
@@ -961,7 +966,7 @@ class ExamTypeStrategy
|
|
|
}
|
|
|
$kpCodeList = array_values(array_unique(array_filter($kpCodeList)));
|
|
|
$studentId = $params['student_id'] ?? null;
|
|
|
- $totalQuestions = $params['total_questions'] ?? 20;
|
|
|
+ $totalQuestions = $params['total_questions'] ?? self::defaultTotalQuestions();
|
|
|
$assembleType = (int) ($params['assemble_type'] ?? 4);
|
|
|
|
|
|
if (empty($kpCodeList)) {
|
|
|
@@ -1145,7 +1150,7 @@ class ExamTypeStrategy
|
|
|
|
|
|
$chapterIdList = $params['chapter_id_list'] ?? [];
|
|
|
$studentId = $params['student_id'] ?? null;
|
|
|
- $totalQuestions = $params['total_questions'] ?? 20;
|
|
|
+ $totalQuestions = $params['total_questions'] ?? self::defaultTotalQuestions();
|
|
|
|
|
|
// 【优化】如果用户没有指定章节,自动从教材所有有题目的章节中选择
|
|
|
if (empty($chapterIdList) && !empty($params['textbook_id'])) {
|
|
|
@@ -2012,7 +2017,7 @@ class ExamTypeStrategy
|
|
|
$textbookId = $params['textbook_id'] ?? null;
|
|
|
$studentId = (int) ($params['student_id'] ?? 0);
|
|
|
$grade = $params['grade'] ?? null;
|
|
|
- $totalQuestions = $params['total_questions'] ?? 20;
|
|
|
+ $totalQuestions = $params['total_questions'] ?? self::defaultTotalQuestions();
|
|
|
|
|
|
Log::info('ExamTypeStrategy: 构建章节摸底参数', [
|
|
|
'textbook_id' => $textbookId,
|
|
|
@@ -2072,7 +2077,7 @@ class ExamTypeStrategy
|
|
|
$textbookId = $params['textbook_id'] ?? null;
|
|
|
$studentId = (int) ($params['student_id'] ?? 0);
|
|
|
$grade = $params['grade'] ?? null;
|
|
|
- $totalQuestions = $params['total_questions'] ?? 20;
|
|
|
+ $totalQuestions = $params['total_questions'] ?? self::defaultTotalQuestions();
|
|
|
|
|
|
Log::info('ExamTypeStrategy: 构建按知识点顺序学习参数', [
|
|
|
'textbook_id' => $textbookId,
|