From 5a5557d479723c62fdd366043aa0951604d7d22c Mon Sep 17 00:00:00 2001 From: Lqc Date: Tue, 2 Sep 2025 15:01:28 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E8=AF=95=E4=B8=BB=E8=A7=82=E9=A2=98?= =?UTF-8?q?=E6=89=B9=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aiol/controller/AiolExamController.java | 190 +++++++++++++++++- .../modules/aiol/dto/QuestionAnswerUser.java | 20 ++ 2 files changed, 205 insertions(+), 5 deletions(-) create mode 100644 jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/dto/QuestionAnswerUser.java diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolExamController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolExamController.java index 4f0c021a..aaf96c2e 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolExamController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolExamController.java @@ -17,6 +17,8 @@ import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.query.QueryRuleEnum; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.aiol.dto.QuestionAnswerDTO; +import org.jeecg.modules.aiol.dto.QuestionAnswerUser; import org.jeecg.modules.aiol.entity.*; import org.jeecg.modules.aiol.service.*; @@ -79,7 +81,7 @@ public class AiolExamController extends JeecgController pageList = aiolExamService.page(page, queryWrapper); return Result.OK(pageList); } - + /** * 添加 * @@ -95,7 +97,7 @@ public class AiolExamController extends JeecgController getExamInfo(@RequestParam String userId) { + return Result.OK(examService.list(new LambdaQueryWrapper().eq(AiolExam::getCreateBy, userId))); + } + + //获取考试相关答卷 + @GetMapping("/getExamRecord") + @Operation(summary = "获取考试相关答卷记录") + public Result getExamRecord(@RequestParam String examId) { + return Result.OK(examRecordService. + list(new LambdaQueryWrapper(). + eq(AiolExamRecord::getExamId, examId))); + } + + //获取考试相关答卷 + @GetMapping("/getExamRecordByUser") + @Operation(summary = "获取考试相关答卷答案") + public Result getExamRecordByUser(@RequestParam String examId,@RequestParam String userId) { + List list = examAnswerService. + list(new LambdaQueryWrapper(). + eq(AiolExamAnswer::getExamId, examId). + eq(AiolExamAnswer::getUserId, userId)); + Map questionIdToAnswerMap = list.stream() + .collect(Collectors.toMap( + AiolExamAnswer::getQuestionId, + answer -> answer + )); + if(!list.isEmpty()){ + List questionIds = list.stream() + .map(AiolExamAnswer::getQuestionId) + .collect(Collectors.toList()); + List questions = questionService.listByIds(questionIds); + //取出简答题 + List type4Questions = questions.stream() + .filter(question -> question.getType() == 4) + .collect(Collectors.toList()); + Map questionIdToTitleMap = type4Questions.stream().collect(Collectors.toMap(AiolQuestion::getId, question -> question)); + if(!type4Questions.isEmpty()){ + List collect = type4Questions.stream().map(AiolQuestion::getId).collect(Collectors.toList()); + //查询题目答案 + List list1 = questionAnswerService.list(new LambdaQueryWrapper() + .in(AiolQuestionAnswer::getQuestionId, collect) + ); + // 查询题目分数 + AiolExam exam = examService.getById(examId); + AiolPaper paper = paperService.getById(exam.getPaperId()); + + // 根据试卷生成模式获取分数 + Map questionIdToScoreMap = Optional.ofNullable(paper) + .filter(p -> p.getGenerateMode() == 0) + .map(p -> paperQuestionService.list(new LambdaQueryWrapper() + .eq(AiolPaperQuestion::getPaperId, p.getId()) + .in(AiolPaperQuestion::getQuestionId, collect))) + .orElse(Collections.emptyList()) + .stream() + .collect(Collectors.toMap( + AiolPaperQuestion::getQuestionId, + AiolPaperQuestion::getScore + )); + + // 获取类型4的题目分数(仅在非固定模式下) + Double type4Score = Optional.ofNullable(paper) + .filter(p -> p.getGenerateMode() != 0) + .map(p -> JSON.parseObject(p.getRules()).getDouble("type4_score")) + .orElse(0.0); + + // 构建用户答案列表 + List questionAnswerUserList = list1.stream() + .map(questionAnswer -> { + QuestionAnswerUser questionAnswerUser = new QuestionAnswerUser(); + questionAnswerUser.setQuestion(questionIdToTitleMap.get(questionAnswer.getQuestionId())); + questionAnswerUser.setUserAnswer(questionIdToAnswerMap.get(questionAnswer.getQuestionId())); + questionAnswerUser.setAnswer(questionAnswer); + questionAnswerUser.setFullMark(questionIdToScoreMap.getOrDefault( + questionAnswer.getQuestionId(), + type4Score + )); + return questionAnswerUser; + }) + .collect(Collectors.toList()); + return Result.OK(questionAnswerUserList); + } + } + return Result.OK("没有需要批改的题目数据"); + } + + @PostMapping("/submitGrade") + @Operation(summary = "提交批改") + @Transactional + public Result submitGrade(@RequestBody List examAnswers) { + // 检查输入参数是否为空 + if (CollectionUtils.isEmpty(examAnswers)) { + return Result.error("批改数据不能为空"); + } + try { + String examId = examAnswers.get(0).getExamId(); + String userId = examAnswers.get(0).getUserId(); + List list = examAnswerService.list(new LambdaQueryWrapper() + .eq(AiolExamAnswer::getExamId, examId) + .eq(AiolExamAnswer::getUserId, userId)); + // 创建examAnswers的ID映射,方便查找 + Map examAnswerMap = examAnswers.stream() + .collect(Collectors.toMap(AiolExamAnswer::getId, answer -> answer)); + // 创建list的id映射 + Map listIdMap = list.stream() + .collect(Collectors.toMap(AiolExamAnswer::getQuestionId, answer -> answer)); + //计算总分 + Double totalScore = list.stream().mapToDouble(AiolExamAnswer::getScore).sum() + examAnswers.stream().mapToDouble(AiolExamAnswer::getScore).sum(); + + // 复合题对错得分 + List sonList = list.stream() + .filter(answer -> answer.getParentQuestionId() != null && !answer.getParentQuestionId().isEmpty()) + .collect(Collectors.toList()); + + if (!sonList.isEmpty()) { + // 按父ID分组 + Map> parentGroup = sonList.stream() + .collect(Collectors.groupingBy(AiolExamAnswer::getParentQuestionId)); + + // 遍历每个父题组 + for (Map.Entry> entry : parentGroup.entrySet()) { + String parentId = entry.getKey(); + List children = entry.getValue(); + + Double parentScore = 0.0; + boolean isCorrect = true; + + // 计算每个子题的分数和正确性 + for (AiolExamAnswer childAnswer : children) { + Double sonScore = 0.0; + if (examAnswerMap.get(childAnswer.getId()) != null) { + if (isCorrect && examAnswerMap.get(childAnswer.getId()).getIzCorrect() == 0) { + isCorrect = false; + } + sonScore = examAnswerMap.get(childAnswer.getId()).getScore(); + } else { + if (isCorrect && childAnswer.getIzCorrect() == 0) { + isCorrect = false; + } + sonScore = childAnswer.getScore(); + } + parentScore += sonScore; + } + + // 更新父题的分数和正确性 + AiolExamAnswer parentAnswer = listIdMap.get(parentId); + if (parentAnswer != null) { + parentAnswer.setIzCorrect(isCorrect ? 1 : 0); + parentAnswer.setScore(parentScore); + examAnswers.add(parentAnswer); + } + } + } + // 更新考试记录的状态为已批改 + examRecordService.update(new LambdaUpdateWrapper() + .set(AiolExamRecord::getStatus, 2) + .set(AiolExamRecord::getTotalScore, totalScore) + .eq(AiolExamRecord::getExamId, examId) + .eq(AiolExamRecord::getUserId, userId)); + // 批量更新答题分数 + boolean success = examAnswerService.updateBatchById(examAnswers); + if (!success) { + return Result.error("批改失败"); + } + // 可选:更新考试的总分和平均分(如果需要) + // 这里可以添加额外的业务逻辑 + return Result.OK("批改成功"); + } catch (Exception e) { + log.error("提交批改失败", e); + return Result.error("系统错误:" + e.getMessage()); + } + } + + + + @GetMapping("/queryExamProgress") @Operation(summary = "查询考试进度") public Result queryExamProgress(@RequestParam String examId, @RequestParam String userId) { diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/dto/QuestionAnswerUser.java b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/dto/QuestionAnswerUser.java new file mode 100644 index 00000000..8354c9a9 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/dto/QuestionAnswerUser.java @@ -0,0 +1,20 @@ +package org.jeecg.modules.aiol.dto; + +import lombok.Data; +import org.jeecg.modules.aiol.entity.AiolExamAnswer; +import org.jeecg.modules.aiol.entity.AiolQuestion; +import org.jeecg.modules.aiol.entity.AiolQuestionAnswer; + +import java.util.List; + +@Data +public class QuestionAnswerUser { + //题目内容 + private AiolQuestion question; + //答案 + private AiolQuestionAnswer answer; + //用户答案 + private AiolExamAnswer userAnswer; + //满分 + private Double fullMark; +}