From 2e88fbc0fe455b33d44be2040158207cf3f7c411 Mon Sep 17 00:00:00 2001 From: luogw <3132758203@qq.com> Date: Tue, 7 Jul 2026 19:45:27 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SubmitPaperDomainServiceImpl.java | 9 ++--- .../strategy/ObjectiveScoringStrategy.java | 18 +++++++++- ...ErrorProneStatisticsDomainServiceImpl.java | 25 ++++---------- .../CandidateSearchTaskDomainServiceImpl.java | 34 +++++++++++-------- 4 files changed, 45 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/project/exam/domain/service/impl/SubmitPaperDomainServiceImpl.java b/src/main/java/com/project/exam/domain/service/impl/SubmitPaperDomainServiceImpl.java index 1d4574a..94587c1 100644 --- a/src/main/java/com/project/exam/domain/service/impl/SubmitPaperDomainServiceImpl.java +++ b/src/main/java/com/project/exam/domain/service/impl/SubmitPaperDomainServiceImpl.java @@ -111,13 +111,8 @@ public class SubmitPaperDomainServiceImpl implements SubmitPaperDomainService { // 汇总总分:客观题 + 简答题 finalScore = scoringContext.getTotalScore(); - if (scoringContext.getRightCount() == scoringContext.getObjectiveTotal() && scoringContext.getSubjectiveScore() == 0) { - // 全部客观题答对且无简答题,直接给满分(避免小数点误差) - finalScore = new BigDecimal("100").doubleValue(); - } else { - // 四舍五入处理(不能超过100分) - finalScore = new BigDecimal(finalScore).setScale(2, RoundingMode.HALF_UP).min(new BigDecimal("100")).doubleValue(); - } + // 四舍五入处理(不能超过100分) + finalScore = new BigDecimal(finalScore).setScale(2, RoundingMode.HALF_UP).min(new BigDecimal("100")).doubleValue(); boolean isPassed = (finalScore >= task.getPassScore()); record.setScore(finalScore); record.setPass(isPassed); diff --git a/src/main/java/com/project/exam/domain/service/strategy/ObjectiveScoringStrategy.java b/src/main/java/com/project/exam/domain/service/strategy/ObjectiveScoringStrategy.java index 5f664e3..3d77cb5 100644 --- a/src/main/java/com/project/exam/domain/service/strategy/ObjectiveScoringStrategy.java +++ b/src/main/java/com/project/exam/domain/service/strategy/ObjectiveScoringStrategy.java @@ -33,7 +33,10 @@ public class ObjectiveScoringStrategy implements ScoringStrategy { boolean isRight = false; if (userAnswer != null && rightAnswer != null) { if (QuestionTypeEnum.MULTIPLE_CHOICE.getValue().equals(snapshot.getType())) { - // 多选题:集合比较(忽略顺序) + // 多选题:归一化格式后做集合比较(忽略顺序) + // 兼容 rightAnswer 可能为 "ABC" 或 "A,B,C" 两种格式 + userAnswer = normalizeMultipleChoice(userAnswer); + rightAnswer = normalizeMultipleChoice(rightAnswer); Set userSet = Arrays.stream(userAnswer.split(",")).map(String::trim).collect(Collectors.toSet()); Set rightSet = Arrays.stream(rightAnswer.split(",")).map(String::trim).collect(Collectors.toSet()); isRight = userSet.equals(rightSet); @@ -46,6 +49,19 @@ public class ObjectiveScoringStrategy implements ScoringStrategy { snapshot.setIsRight(isRight); if (isRight) { context.setRightCount(context.getRightCount() + 1); + context.setObjectiveScore(context.getObjectiveScore() + snapshot.getScore()); } } + + /** + * 归一化多选题答案格式,将 "ABC" 转为 "A,B,C" + */ + private static String normalizeMultipleChoice(String answer) { + if (answer == null || answer.contains(",")) { + return answer; + } + return answer.chars() + .mapToObj(c -> String.valueOf((char) c)) + .collect(Collectors.joining(",")); + } } diff --git a/src/main/java/com/project/statistics/domain/service/impl/SaveSaveErrorProneStatisticsDomainServiceImpl.java b/src/main/java/com/project/statistics/domain/service/impl/SaveSaveErrorProneStatisticsDomainServiceImpl.java index 52084fc..f75c1b9 100644 --- a/src/main/java/com/project/statistics/domain/service/impl/SaveSaveErrorProneStatisticsDomainServiceImpl.java +++ b/src/main/java/com/project/statistics/domain/service/impl/SaveSaveErrorProneStatisticsDomainServiceImpl.java @@ -85,12 +85,10 @@ public class SaveSaveErrorProneStatisticsDomainServiceImpl implements SaveErrorP } try { - Double shortAnswerScore = taskDTO.getShortAnswerScore(); - if (ExamModeEnum.GENERATIVE.getValue().equals(taskDTO.getExamMode())) { - collectGenerativeStatistics(taskDTO.getId(), shortAnswerScore, filtered); + collectGenerativeStatistics(taskDTO.getId(), filtered); } else if (ExamModeEnum.CLASSIC.getValue().equals(taskDTO.getExamMode())) { - collectClassicStatistics(taskDTO.getId(), shortAnswerScore, filtered); + collectClassicStatistics(taskDTO.getId(), filtered); } } catch (Exception e) { log.error("[易错统计] 收集失败, taskId={}", taskDTO.getId(), e); @@ -100,7 +98,7 @@ public class SaveSaveErrorProneStatisticsDomainServiceImpl implements SaveErrorP /** * 生成式套题:以知识点为单位统计 */ - private void collectGenerativeStatistics(Long taskId, Double shortAnswerScore, List snapshots) { + private void collectGenerativeStatistics(Long taskId, List snapshots) { for (ExamRecordEntity.QuestionSnapshot snapshot : snapshots) { Long questionId = snapshot.getQuestionId(); if (questionId == null) { @@ -150,7 +148,7 @@ public class SaveSaveErrorProneStatisticsDomainServiceImpl implements SaveErrorP } entity.setQuestionIdList(questionIdList); entity.setAppearCount(entity.getAppearCount() + 1); - if (isErrorQuestion(snapshot, shortAnswerScore)) { + if (Boolean.FALSE.equals(snapshot.getIsRight())) { entity.setErrorCount(entity.getErrorCount() + 1); } @@ -165,7 +163,7 @@ public class SaveSaveErrorProneStatisticsDomainServiceImpl implements SaveErrorP /** * 经典套题:以题目为单位统计,并统计选项选择情况 */ - private void collectClassicStatistics(Long taskId, Double shortAnswerScore, List snapshots) { + private void collectClassicStatistics(Long taskId, List snapshots) { for (ExamRecordEntity.QuestionSnapshot snapshot : snapshots) { String content = snapshot.getQuestionContent(); if (StrUtil.isBlank(content)) { @@ -208,7 +206,7 @@ public class SaveSaveErrorProneStatisticsDomainServiceImpl implements SaveErrorP } entity.setAppearCount(entity.getAppearCount() + 1); - if (isErrorQuestion(snapshot, shortAnswerScore)) { + if (Boolean.FALSE.equals(snapshot.getIsRight())) { entity.setErrorCount(entity.getErrorCount() + 1); } @@ -340,17 +338,6 @@ public class SaveSaveErrorProneStatisticsDomainServiceImpl implements SaveErrorP return !isShortAnswer(snapshot); } - /** - * 判断是否为错题:客观题按 isRight,简答题按 aiScore 是否得满 - */ - private boolean isErrorQuestion(ExamRecordEntity.QuestionSnapshot snapshot, Double shortAnswerScore) { - if (isShortAnswer(snapshot)) { - Double aiScore = snapshot.getAiScore(); - return aiScore == null || aiScore < shortAnswerScore; - } - return Boolean.FALSE.equals(snapshot.getIsRight()); - } - // ==================== 审批通过减少错题数 ==================== @Override diff --git a/src/main/java/com/project/task/domain/service/impl/CandidateSearchTaskDomainServiceImpl.java b/src/main/java/com/project/task/domain/service/impl/CandidateSearchTaskDomainServiceImpl.java index adf736b..98e51c1 100644 --- a/src/main/java/com/project/task/domain/service/impl/CandidateSearchTaskDomainServiceImpl.java +++ b/src/main/java/com/project/task/domain/service/impl/CandidateSearchTaskDomainServiceImpl.java @@ -13,15 +13,12 @@ import com.project.base.domain.result.Result; import com.project.base.domain.utils.PageConverter; import com.project.classicpaper.domain.entity.ClassicCategoryEntity; import com.project.classicpaper.domain.entity.ClassicPaperSetEntity; -import com.project.classicpaper.domain.service.ClassicCategoryBaseService; -import com.project.classicpaper.domain.service.ClassicPaperSetBaseService; import com.project.classicpaper.mapper.ClassicCategoryMapper; import com.project.classicpaper.mapper.ClassicPaperSetMapper; import com.project.ding.utils.SecurityUtils; import com.project.exam.domain.entity.ExamRecordEntity; import com.project.exam.mapper.ExamRecordMapper; import com.project.information.domain.entity.ProductLineEntity; -import com.project.information.domain.service.ProductLineBaseService; import com.project.information.mapper.ProductLineMapper; import com.project.task.domain.dto.TaskDTO; import com.project.task.domain.entity.TaskEntity; @@ -37,9 +34,6 @@ import com.project.task.mapper.TaskUserMapper; import io.vavr.control.Try; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.math.RoundingMode; import java.text.NumberFormat; import java.util.Date; import java.util.List; @@ -128,24 +122,23 @@ public class CandidateSearchTaskDomainServiceImpl implements CandidateSearchTask // 排序 if (Objects.nonNull(param.getSortType())) { switch (param.getSortType()) { - case 1: // 截止时间从近到远 (ASC) + case 1: // 截止时间从近到远 queryWrapper.orderByAsc(TaskEntity::getEndTime); break; - case 2: // 截止时间从远到近 (DESC) + case 2: // 截止时间从远到近 queryWrapper.orderByDesc(TaskEntity::getEndTime); break; - case 3: // 开考时间从近到远 (ASC) + case 3: // 开考时间从近到远 queryWrapper.orderByAsc(TaskEntity::getStartTime); break; - case 4: // 开考时间从远到近 (DESC) + case 4: // 开考时间从远到近 queryWrapper.orderByDesc(TaskEntity::getStartTime); break; - default: - queryWrapper.orderByAsc(TaskEntity::getEndTime); // 默认排序 + default: // 默认排序(兜底) + defaultSort(queryWrapper); } } else { - // 默认按开始时间倒序 - queryWrapper.orderByDesc(TaskEntity::getStartTime); + defaultSort(queryWrapper); } IPage entityPage = taskMapper.selectPage(PageConverter.toMpPage(param), queryWrapper); @@ -237,4 +230,17 @@ public class CandidateSearchTaskDomainServiceImpl implements CandidateSearchTask } return dto; } + + private void defaultSort(LambdaQueryWrapper queryWrapper) { + String userId = SecurityUtils.getUserId(); + String sortSql = "ORDER BY CASE " + + "WHEN end_time < NOW() THEN 6 " + + "WHEN start_time > NOW() THEN 4 " + + "WHEN (SELECT status FROM evaluator_task_user WHERE task_id = evaluator_task.id AND user_id = '" + userId + "' AND deleted = 0) = 1 THEN 1 " + + "WHEN (SELECT status FROM evaluator_task_user WHERE task_id = evaluator_task.id AND user_id = '" + userId + "' AND deleted = 0) = 0 THEN 2 " + + "WHEN (SELECT status FROM evaluator_task_user WHERE task_id = evaluator_task.id AND user_id = '" + userId + "' AND deleted = 0) = 3 THEN 3 " + + "WHEN (SELECT status FROM evaluator_task_user WHERE task_id = evaluator_task.id AND user_id = '" + userId + "' AND deleted = 0) = 2 THEN 5 " + + "ELSE 99 END ASC, create_time DESC"; + queryWrapper.last(sortSql); + } }