Browse Source

bug修复

master
luogw 2 months ago
parent
commit
2e88fbc0fe
  1. 5
      src/main/java/com/project/exam/domain/service/impl/SubmitPaperDomainServiceImpl.java
  2. 18
      src/main/java/com/project/exam/domain/service/strategy/ObjectiveScoringStrategy.java
  3. 25
      src/main/java/com/project/statistics/domain/service/impl/SaveSaveErrorProneStatisticsDomainServiceImpl.java
  4. 34
      src/main/java/com/project/task/domain/service/impl/CandidateSearchTaskDomainServiceImpl.java

5
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();
}
boolean isPassed = (finalScore >= task.getPassScore());
record.setScore(finalScore);
record.setPass(isPassed);

18
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<String> userSet = Arrays.stream(userAnswer.split(",")).map(String::trim).collect(Collectors.toSet());
Set<String> 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(","));
}
}

25
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<ExamRecordEntity.QuestionSnapshot> snapshots) {
private void collectGenerativeStatistics(Long taskId, List<ExamRecordEntity.QuestionSnapshot> 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<ExamRecordEntity.QuestionSnapshot> snapshots) {
private void collectClassicStatistics(Long taskId, List<ExamRecordEntity.QuestionSnapshot> 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

34
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<TaskEntity> entityPage = taskMapper.selectPage(PageConverter.toMpPage(param), queryWrapper);
@ -237,4 +230,17 @@ public class CandidateSearchTaskDomainServiceImpl implements CandidateSearchTask
}
return dto;
}
private void defaultSort(LambdaQueryWrapper<TaskEntity> 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);
}
}

Loading…
Cancel
Save