From 15c9ab6f912084810f59751b1347a9fbb603aa06 Mon Sep 17 00:00:00 2001 From: qubiaobiao <3294694717@qq.com> Date: Thu, 8 Oct 2026 10:23:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(big-question):=20=E5=B0=8F=E9=97=AE?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E4=B8=8E=E5=90=8E=E5=8F=B0=E4=B8=80=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E3=80=8C=E9=80=89=E5=A1=AB=E3=80=8D=EF=BC=8C=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E8=AF=B4=E6=98=8E=E8=A1=A5=E5=85=85=E5=B8=B8=E8=A7=81?= =?UTF-8?q?=E7=96=91=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 去掉 Excel 导入里「三个小问必须全部填写」的硬拦截:后台手工录入的弹窗标签写明 「可留空」,且 validateQuestionPayload 对小问无非空校验 ⇒ 导入比手工更严会让测试人员 困惑「手工能录、Excel 被拒」。现行为与后台一致,「建议三问写全」改为在模板说明中提示。 模板「填写说明」新增【常见疑问】5 问(29 行 → 46 行),直接回答:排序/状态填 0 是否有误、为何建议状态 0、导入后是否会一直不参与考试、题干与题干HTML 填哪个、小问能否留空。 「排序」补上「数值越小越靠前」(此前说明缺失,与后台弹窗标签不一致); 「状态」补上「1=启用(参与随机抽题)· 0=停用」的完整语义与启用操作路径。 --- app/service/bigQuestion.js | 43 +++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/app/service/bigQuestion.js b/app/service/bigQuestion.js index e0e8c81..7a57e2b 100644 --- a/app/service/bigQuestion.js +++ b/app/service/bigQuestion.js @@ -491,12 +491,12 @@ class BigQuestionService extends Service { ['标题', '必填', '大题标题,不超过 200 字。同一组内标题不可重复(重复的行会被跳过并报错)'], ['题干', '选填', '纯文本题干。若题目需要表格/加粗等富文本,请把 HTML 填进右侧「题干HTML」列;两列都填时以 HTML 为准'], ['题干HTML', '选填', '富文本 HTML,可用 Excel 单元格编辑。例:
系统由 3 部分组成
。留空则使用「题干」纯文本'], - ['小问1', '必填', '第 1 小问题干'], - ['小问2', '必填', '第 2 小问题干'], - ['小问3', '必填', '第 3 小问题干'], + ['小问1', '选填', '第 1 小问题干(考生作答区上方的提示文字)。可留空,但建议三问都写全'], + ['小问2', '选填', '第 2 小问题干。可留空,但建议三问都写全'], + ['小问3', '选填', '第 3 小问题干。可留空,但建议三问都写全'], ['每小题分值', '选填', '每道小问的分值,默认 10。大题总分 = 每小题分值 × 3'], - ['排序', '选填', '数字,缺省 0'], - ['状态', '选填', '1 = 启用(参与随机抽题);0 = 停用'], + ['排序', '选填', '大题在管理列表里的显示顺序:**数值越小越靠前**。缺省 0;想让某题排在前面就填 1、2、3'], + ['状态', '选填', '★ **1 = 启用(参与考生随机抽题)· 0 = 停用(留在题库但不参与抽题)**。本模板建议填 0,理由见下方【常见疑问】'], [], ['【组别说明】'], ['本文件不需要填写组别。导入时以「管理端当前选择的组别」为准,表格里的组别一律忽略。'], @@ -509,11 +509,28 @@ class BigQuestionService extends Service { ['【常见被拒原因(导入时会逐行报错)】'], ['1. 标题为空,或超过 200 字'], ['2. 同一组内标题重复 → 跳过并报错'], - ['3. 三个小问未填全'], - ['4. 每小题分值不是大于 0 的数字'], - ['5. 题干或小问中出现「参考答案 / 标准答案 / 评分标准 / 评分细则 / 答案要点」等字样 → 判定为泄题并拒绝'], - ['6. 题干中直接给出可照抄的成品答案(如带具体参数的指令示例)→ 判定为泄题并拒绝'], + ['3. 每小题分值不是大于 0 的数字'], + ['4. 题干或小问中出现「参考答案 / 标准答案 / 评分标准 / 评分细则 / 答案要点」等字样 → 判定为泄题并拒绝'], + ['5. 题干中直接给出可照抄的成品答案(如带具体参数的指令示例)→ 判定为泄题并拒绝'], [' 说明:题干提供「指令格式定义」是允许的,给出「能照抄的成品」才构成泄题。'], + [], + ['【常见疑问】'], + ['Q1:「排序」和「状态」都填 0,是填错了吗?'], + ['A:不是填错。排序 0 = 默认显示顺序(数值越小越靠前,可按需改成 1、2、3);'], + [' 状态 0 = 停用,即题目已入库但暂不参与抽题。'], + ['Q2:为什么建议「状态」填 0 而不是 1?'], + ['A:这是有意设计的保险。考生抽到题目时,题目会被「快照固化」,事后再怎么改题库,'], + [' 也影响不到已经抽到该题的考生。所以未经人工校对的题不应该直接进考卷 ——'], + [' 先以停用状态入库,校对无误后再启用。'], + ['Q3:导入后题目会不会一直不参与考试?'], + ['A:不会。到管理端「题库管理 → 综合大题」列表点「编辑」,'], + [' 把「状态」开关拨到「启用」并保存,该题即刻参与抽题。'], + ['Q4:「题干」和「题干HTML」填哪个?'], + ['A:普通文字填「题干」即可;需要表格、加粗等排版时填「题干HTML」(写 HTML 代码,'], + [' 建议写成一行避免换行被拆断)。两列都填时以「题干HTML」为准。'], + [' 例:北斗三号由 空间段、地面段、用户段 三部分组成。
'], + ['Q5:小问可以留空吗?'], + ['A:可以,与后台手工录入一致。但建议三问都写全,否则该小问考生作答区没有提示文字。'], ]; const notesWs = XLSX.utils.aoa_to_sheet(notes); notesWs['!cols'] = [{ wch: 16 }, { wch: 10 }, { wch: 92 }]; @@ -590,11 +607,9 @@ class BigQuestionService extends Service { result.errors.push({ row: rowIndex, message: `标题「${row.title}」在本组已存在,跳过(避免重复题)` }); continue; } - if (!row.sub1 || !row.sub2 || !row.sub3) { - result.skipped++; - result.errors.push({ row: rowIndex, message: '三个小问必须全部填写' }); - continue; - } + // 小问允许留空:与后台手工录入保持一致(弹窗标签写明「可留空」,且 + // validateQuestionPayload 对小问无非空校验),故 Excel 导入也不在此处拦截。 + // 说明 sheet 中仍提示「建议三问都写全」,由录入人自行把握。 // 题干:HTML 列优先;未填时用纯文本包const html = row.descriptionHtml;