diff --git a/src/main/java/com/project/classicpaper/application/impl/ClassicPaperSetApplicationServiceImpl.java b/src/main/java/com/project/classicpaper/application/impl/ClassicPaperSetApplicationServiceImpl.java index 68fee9b..6f5a0d7 100644 --- a/src/main/java/com/project/classicpaper/application/impl/ClassicPaperSetApplicationServiceImpl.java +++ b/src/main/java/com/project/classicpaper/application/impl/ClassicPaperSetApplicationServiceImpl.java @@ -22,6 +22,7 @@ import com.project.classicpaper.domain.entity.ClassicCategoryEntity; import com.project.classicpaper.domain.service.*; import com.project.question.domain.entity.QuestionEntity; import com.project.question.domain.service.QuestionBaseService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.web.multipart.MultipartFile; import org.springframework.beans.factory.annotation.Autowired; @@ -34,6 +35,7 @@ import java.util.stream.Collectors; import com.fasterxml.jackson.databind.ObjectMapper; @Service +@Slf4j public class ClassicPaperSetApplicationServiceImpl implements ClassicPaperSetApplicationService { @Autowired @@ -63,9 +65,6 @@ public class ClassicPaperSetApplicationServiceImpl implements ClassicPaperSetApp @Autowired private ClassicCategoryBaseService classicCategoryBaseService; - @Autowired - private com.project.task.config.ExamScoreRatioConfig examScoreRatioConfig; - @Override public Result generate(ClassicPaperSetDTO request) throws Exception { return generateClassicPaperDomainService.generate(request); @@ -259,39 +258,39 @@ public class ClassicPaperSetApplicationServiceImpl implements ClassicPaperSetApp } /** - * 计算分值比例并填充到 DTO 的四个独立字段 - * 优先取实体已存储的 scoreRatio JSON,否则从 ExamScoreRatioConfig 计算 - * 题型数量为 0 时对应字段设为 null + * 从 scoreRatio JSON 解析分值比例并填充到 DTO 的四个独立字段 + * 没有 scoreRatio 或解析失败时,不设值(前端自己处理) */ private void computeScoreRatio(ClassicPaperSetEntity paperSet, ClassicPaperSetDTO dto) { - Map ratioMap = null; - if (StrUtil.isNotBlank(paperSet.getScoreRatio())) { - try { - ratioMap = new ObjectMapper().readValue(paperSet.getScoreRatio(), - Map.class); - } catch (Exception e) { - // 解析失败时使用配置默认值 - } + if (StrUtil.isBlank(paperSet.getScoreRatio())) { + return; } - if (ratioMap == null) { - ratioMap = new LinkedHashMap<>(); + Map ratioMap; + try { + String scoreRatio = paperSet.getScoreRatio(); + // DB 中存的是带转义符的 JSON 字符串,需先还原 + scoreRatio = scoreRatio.replace("\\\"", "\""); + // 可能有外层引号,去掉 + if (scoreRatio.startsWith("\"") && scoreRatio.endsWith("\"")) { + scoreRatio = scoreRatio.substring(1, scoreRatio.length() - 1); + } + ratioMap = new ObjectMapper().readValue(scoreRatio, Map.class); + } catch (Exception e) { + log.warn(">>> [经典套题] scoreRatio 解析失败, setId={}", paperSet.getId(), e); + return; } - dto.setSingleChoiceScoreRatio( - paperSet.getSingleChoiceNum() != null && paperSet.getSingleChoiceNum() > 0 - ? ratioMap.getOrDefault("single", examScoreRatioConfig.getSingle()) - : null); - dto.setMultipleChoiceScoreRatio( - paperSet.getMultipleChoiceNum() != null && paperSet.getMultipleChoiceNum() > 0 - ? ratioMap.getOrDefault("multiple", examScoreRatioConfig.getMultiple()) - : null); - dto.setTrueFalseScoreRatio( - paperSet.getTrueFalseNum() != null && paperSet.getTrueFalseNum() > 0 - ? ratioMap.getOrDefault("trueFalse", examScoreRatioConfig.getTrueFalse()) - : null); - dto.setShortAnswerScoreRatio( - paperSet.getShortAnswerNum() != null && paperSet.getShortAnswerNum() > 0 - ? ratioMap.getOrDefault("shortAnswer", examScoreRatioConfig.getShortAnswer()) - : null); + if (paperSet.getSingleChoiceNum() != null && paperSet.getSingleChoiceNum() > 0) { + dto.setSingleChoiceScoreRatio(ratioMap.get("single")); + } + if (paperSet.getMultipleChoiceNum() != null && paperSet.getMultipleChoiceNum() > 0) { + dto.setMultipleChoiceScoreRatio(ratioMap.get("multiple")); + } + if (paperSet.getTrueFalseNum() != null && paperSet.getTrueFalseNum() > 0) { + dto.setTrueFalseScoreRatio(ratioMap.get("trueFalse")); + } + if (paperSet.getShortAnswerNum() != null && paperSet.getShortAnswerNum() > 0) { + dto.setShortAnswerScoreRatio(ratioMap.get("shortAnswer")); + } } }