# paper_132736388400529 题目不足根因分析 ## 一、现象 - 请求:知识点组卷,20 题,kp_code_list 含 7 个知识点 - 实际:仅产出 7 题 ## 二、日志链路复盘 ### 1. ExamTypeStrategy 阶段 ``` QuestionExpansionService: Step1 - 获取直接关联知识点题目 added_count: 20, total_count: 20(expansion 未用 exclude,拿到 20 个 ID) 知识点组卷题池评估: pool_count_after_expand: 20, total_questions: 20 → basePoolCount >= totalQuestions,mistake_question_ids = [](不传扩展结果) 从 paper_questions 获取学生已做题目: exclude_count: 219 ``` ### 2. getQuestionsFromBank 阶段 ``` 应用知识点筛选: kp_codes 含 7 个(含 typo S06-002_003) 应用学段筛选: grade=11 → stage_grade=3(高中) 应用排除筛选: exclude_count=219 getQuestionsFromBank: 查询完成 raw_count: 7, total_needed: 0, database_query_count: 7 ``` ### 3. selectQuestionsByMastery 阶段 ``` 题目数量不足,将使用所有可用题目 (available: 7, requested: 20) 题型分配: choice 7, fill 0, answer 0(全部为选择题,填空/解答无题) 题型缺口补充: deficit=13, 最终仍为 7(无更多题目可补) ``` --- ## 三、根因归纳 ### 根因 1:poolLimit=0 导致智能补充不触发(主因) | 现象 | 原因 | |------|------| | total_needed: 0 | 调用 getQuestionsFromBank 时传入的第 5 参为 poolLimit=0 | | 智能补充未执行 | 条件 `totalNeeded > 0 && count < totalNeeded && grade !== null`,因 totalNeeded=0 不成立 | **代码位置**:`LearningAnalyticsService.php` 约 1456 行 ```php $additionalQuestions = $this->getQuestionsFromBank( ... $poolLimit, // ← 传入 0,导致 totalNeeded=0 ... ); ``` 智能补充条件(约 1801 行): ```php if ($totalNeeded > 0 && count($selectedQuestions) < $totalNeeded && $grade !== null) { // 智能补充逻辑 } ``` 当 `totalNeeded=0` 时,永远不进入智能补充。 ### 根因 2:指定知识点下可用题目仅 7 道 - 指定 7 个 kp 下,审核通过的题目约 60 道(grade=3) - 排除学生已做 219 题后,剩余 7 道(约 53 道与 exclude 重合) - 即该学生在这些知识点上已做过大部分题,题池接近耗尽 ### 根因 3:参数 typo 导致 1 个知识点无题 - 输入为 `S06-002_003`(连字符),应为 `S06_002_003`(下划线) - 该 typo 导致该知识点匹配 0 题(对本次 7 题结果影响有限,因其他知识点仍有题) --- ## 四、修复建议 ### 建议 1:修正 totalNeeded 传参(已修复) 已修改:调用 getQuestionsFromBank 时传入 `$needCount = $totalQuestions - count($priorityQuestions)`,使 `totalNeeded > 0`,从而在题目不足时触发智能补充。 ### 建议 2:知识点组卷传入 grade(必须) - 当前 textbook_id=null,但 grade=11 已传入 - 智能补充只需 grade 即可从同年级其他知识点补题 - 需确认 params 中 grade 正确传到 getQuestionsFromBank(日志显示已传入) ### 建议 3:前端参数校验(可选) - 对 kp_code 格式做基础校验,避免 `S06-002_003` 类 typo - 或在后端对 `S06-002_003` 自动规范为 `S06_002_003`