diff --git a/docs/sql/20260820_paper_question_rel_add_score.sql b/docs/sql/20260820_paper_question_rel_add_score.sql new file mode 100644 index 00000000..0ea0f1d3 --- /dev/null +++ b/docs/sql/20260820_paper_question_rel_add_score.sql @@ -0,0 +1,15 @@ +-- ===================================================================== +-- 变更说明: +-- 1. paper_question_rel 表新增 score(分值, decimal(5,1), 非空, 默认0.0) +-- 2. 存量数据回填:以试题库 question.score 初始化关系分值 +-- 变更时间: 2026-08-20 +-- ===================================================================== + +ALTER TABLE `paper_question_rel` + ADD COLUMN `score` decimal(5, 1) NOT NULL DEFAULT 0.0 COMMENT '分值' AFTER `question_id`; + +-- 存量数据回填(如无需保留历史分值可跳过) +UPDATE `paper_question_rel` pqr + JOIN `question` q ON pqr.`question_id` = q.`id` +SET pqr.`score` = q.`score` +WHERE pqr.`delete_enum` = 'false'; diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/model/entity/PaperQuestionRelDO.java b/safety-cedu-service/src/main/java/org/qinan/cedu/model/entity/PaperQuestionRelDO.java index 9a3d5ded..baa8b7cb 100644 --- a/safety-cedu-service/src/main/java/org/qinan/cedu/model/entity/PaperQuestionRelDO.java +++ b/safety-cedu-service/src/main/java/org/qinan/cedu/model/entity/PaperQuestionRelDO.java @@ -8,6 +8,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + /** * 试卷试题关系 */ @@ -31,4 +33,7 @@ public class PaperQuestionRelDO extends BaseEntity { @ApiModelProperty("试题号") private Integer questionNum; + + @ApiModelProperty("分值") + private BigDecimal score; } diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/PaperServiceImpl.java b/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/PaperServiceImpl.java index ce509b8d..fe4e94a7 100644 --- a/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/PaperServiceImpl.java +++ b/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/PaperServiceImpl.java @@ -262,6 +262,7 @@ public class PaperServiceImpl extends ServiceImpl implemen // 创建试卷 PaperDO paper = new PaperDO(); + paper.setPaperType(PaperTypeEnum.FIXED.getValue()); paper.setPaperName(importDTO.getPaperName().trim()); paper.setPaperTotalScore(importDTO.getPaperTotalScore()); paper.setPaperPassScore(importDTO.getPaperPassScore()); @@ -280,6 +281,7 @@ public class PaperServiceImpl extends ServiceImpl implemen PaperQuestionRelDO rel = new PaperQuestionRelDO(); rel.setPaperId(paper.getId()); rel.setQuestionId(questions.get(i).getId()); + rel.setScore(questions.get(i).getScore()); rel.setQuestionNum(i + 1); InsertFieldDefaults.applyIgnoreOrgId(rel); rels.add(rel); @@ -296,8 +298,9 @@ public class PaperServiceImpl extends ServiceImpl implemen @Override @Transactional(rollbackFor = Exception.class) public PaperBasicInfoVO coursewareQuestionRule(PaperCoursewareQuestionRuleDTO dto) { - // 1. 循环题型规则从关联课件下随机抽题,某题型数量不足直接报错 - List questionIds = new ArrayList<>(); + // 1. 循环题型规则从关联课件下随机抽题,某题型数量不足直接报错;按题型规则初始化关系(试题id+每题分值+试题号) + List rels = new ArrayList<>(); + int questionNum = 1; for (PaperConfigRuleDTO.QuestionTypeRule rule : dto.getQuestionTypeRuleList()) { List ids = questionMapper.listRandomQuestionIds( dto.getCoursewareManagementIdList(), rule.getQuestionType(), rule.getNum()); @@ -307,7 +310,14 @@ public class PaperServiceImpl extends ServiceImpl implemen throw new IllegalArgumentException( typeDesc + "题数量不足:需要" + rule.getNum() + "道,当前仅有" + ids.size() + "道"); } - questionIds.addAll(ids); + for (Long questionId : ids) { + PaperQuestionRelDO rel = new PaperQuestionRelDO(); + rel.setQuestionId(questionId); + rel.setQuestionNum(questionNum++); + rel.setScore(rule.getScore()); + InsertFieldDefaults.applyIgnoreOrgId(rel); + rels.add(rel); + } } // 2. 创建试卷(规则试卷,保存抽题规则) @@ -321,16 +331,8 @@ public class PaperServiceImpl extends ServiceImpl implemen InsertFieldDefaults.applyIgnoreOrgId(paper); this.savePaper(paper); - // 3. 绑定试卷试题关系(含试题号) - List rels = new ArrayList<>(questionIds.size()); - for (int i = 0; i < questionIds.size(); i++) { - PaperQuestionRelDO rel = new PaperQuestionRelDO(); - rel.setPaperId(paper.getId()); - rel.setQuestionId(questionIds.get(i)); - rel.setQuestionNum(i + 1); - InsertFieldDefaults.applyIgnoreOrgId(rel); - rels.add(rel); - } + // 3. 绑定试卷试题关系(回填试卷id后批量保存) + rels.forEach(rel -> rel.setPaperId(paper.getId())); Db.saveBatch(rels); return paperConvertor.convertEToBasicVo(paper); } diff --git a/safety-cedu-service/src/main/resources/mapper/QuestionMapper.xml b/safety-cedu-service/src/main/resources/mapper/QuestionMapper.xml index 965600ac..5c5b54f4 100644 --- a/safety-cedu-service/src/main/resources/mapper/QuestionMapper.xml +++ b/safety-cedu-service/src/main/resources/mapper/QuestionMapper.xml @@ -3,7 +3,7 @@