From 8e7226ae6a8b8a8ce7cb5248d11290022c3a4c12 Mon Sep 17 00:00:00 2001 From: luoweijian <1329394916@qq.com> Date: Thu, 26 Feb 2026 15:47:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9E=84=E5=BB=BA=E9=97=AE=E9=A2=98=E8=AF=A6?= =?UTF-8?q?=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExamRecordApplicationService.java | 2 + .../ExamRecordApplicationServiceImpl.java | 7 ++++ .../exam/controller/ExamRecordController.java | 6 +++ .../exam/domain/dto/ExamRecordDTO.java | 4 ++ .../GetDetailExamRecordDomainService.java | 9 +++++ .../impl/AssemblePaperDomainServiceImpl.java | 18 ++------- .../BuildExamRecordDomainServiceImpl.java | 37 ++++++++++++++++--- .../GetDetailExamRecordDomainServiceImpl.java | 24 ++++++++++++ 8 files changed, 87 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/project/exam/domain/service/GetDetailExamRecordDomainService.java create mode 100644 src/main/java/com/project/exam/domain/service/impl/GetDetailExamRecordDomainServiceImpl.java diff --git a/src/main/java/com/project/exam/application/ExamRecordApplicationService.java b/src/main/java/com/project/exam/application/ExamRecordApplicationService.java index a9c192e..6103260 100644 --- a/src/main/java/com/project/exam/application/ExamRecordApplicationService.java +++ b/src/main/java/com/project/exam/application/ExamRecordApplicationService.java @@ -21,4 +21,6 @@ public interface ExamRecordApplicationService { Result> adminSearch(ExamRecordParam param) throws Exception; void export(ExamRecordParam appealParam, HttpServletResponse response) throws Exception; + + Result getDetail(Long id) throws Exception; } diff --git a/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java b/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java index a35c465..88a8b78 100644 --- a/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java +++ b/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java @@ -33,6 +33,8 @@ public class ExamRecordApplicationServiceImpl implements ExamRecordApplicationSe @Autowired private AdminExportExamRecordDomainService adminExportExamRecordDomainService; + @Autowired + private GetDetailExamRecordDomainService getDetailExamRecordDomainService; @Override public Result> adminSearch(ExamRecordParam param) throws Exception { @@ -44,6 +46,11 @@ public class ExamRecordApplicationServiceImpl implements ExamRecordApplicationSe adminExportExamRecordDomainService.export(examRecordParam , response); } + @Override + public Result getDetail(Long id) throws Exception { + return getDetailExamRecordDomainService.getDetail(id); + } + @Override public Result assemblePaper(Long taskId) throws Exception { return Result.success(assemblePaperDomainService.assemblePaper(taskId , SecurityUtils.getUserId())); diff --git a/src/main/java/com/project/exam/controller/ExamRecordController.java b/src/main/java/com/project/exam/controller/ExamRecordController.java index a7e7b24..7dc4f06 100644 --- a/src/main/java/com/project/exam/controller/ExamRecordController.java +++ b/src/main/java/com/project/exam/controller/ExamRecordController.java @@ -6,6 +6,7 @@ import com.project.exam.application.ExamRecordApplicationService; import com.project.exam.domain.dto.ExamRecordDTO; import com.project.exam.domain.dto.ExamRecordPictureDTO; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -38,5 +39,10 @@ public class ExamRecordController { return examRecordApplicationService.savePicture(file , recordId); } + @GetMapping("/getDetail") + public Result getDetail(Long id) throws Exception { + return examRecordApplicationService.getDetail(id); + } + } diff --git a/src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java b/src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java index 211a65c..a6060de 100644 --- a/src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java +++ b/src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java @@ -46,11 +46,15 @@ public class ExamRecordDTO extends BaseDTO { @Data public static class QuestionSnapshotDTO { + // 序号 + private Integer index; private Long questionId; // 题干原文 private String questionContent; // 题型 private Integer type; + // 题型中文 + private String typeText; // 用户看的选项:{"A":"xxx", "B":"yyy"} private Map options; // 正确项 diff --git a/src/main/java/com/project/exam/domain/service/GetDetailExamRecordDomainService.java b/src/main/java/com/project/exam/domain/service/GetDetailExamRecordDomainService.java new file mode 100644 index 0000000..70d1e85 --- /dev/null +++ b/src/main/java/com/project/exam/domain/service/GetDetailExamRecordDomainService.java @@ -0,0 +1,9 @@ +package com.project.exam.domain.service; + +import com.project.base.domain.result.Result; +import com.project.exam.domain.dto.ExamRecordDTO; + +public interface GetDetailExamRecordDomainService { + + Result getDetail(Long id) throws Exception; +} diff --git a/src/main/java/com/project/exam/domain/service/impl/AssemblePaperDomainServiceImpl.java b/src/main/java/com/project/exam/domain/service/impl/AssemblePaperDomainServiceImpl.java index dc970d5..91f0329 100644 --- a/src/main/java/com/project/exam/domain/service/impl/AssemblePaperDomainServiceImpl.java +++ b/src/main/java/com/project/exam/domain/service/impl/AssemblePaperDomainServiceImpl.java @@ -83,11 +83,6 @@ public class AssemblePaperDomainServiceImpl implements AssemblePaperDomainServic @Autowired private QuestionInventoryDomainService questionInventoryDomainService; - private final static String X_DEBUG_MODE_HEADER = "X-Debug-Mode"; - - - - private final static String X_DEBUG_MODE_VALUE = "true"; @Override @Transactional(rollbackFor = Exception.class) @@ -160,8 +155,9 @@ public class AssemblePaperDomainServiceImpl implements AssemblePaperDomainServic recordDTO.setSubLineId(taskDTO.getSubLineId()); recordDTO.setTaskName(taskDTO.getName()); recordDTO.setAnswerSnapshotDTOList(buildPaperSnapshot(selectedQuestionList)); - ExamRecordDTO examRecordDTO = examRecordBaseService.saveDTO(recordDTO, ExamRecordEntity::new, ExamRecordDTO::new); - return buildExamRecordDomainService.buildDTO(examRecordDTO); + + recordDTO = examRecordBaseService.saveDTO(recordDTO, ExamRecordEntity::new, ExamRecordDTO::new); + return buildExamRecordDomainService.buildDTO(recordDTO); } private List buildPaperSnapshot(List questionDTOList) { @@ -169,13 +165,7 @@ public class AssemblePaperDomainServiceImpl implements AssemblePaperDomainServic QuestionDTO.QuestionDetailDTO detail = questionDTO.getQuestionDetailDTO(); ExamRecordDTO.QuestionSnapshotDTO snapshot = new ExamRecordDTO.QuestionSnapshotDTO(); BeanUtils.copyProperties(detail , snapshot); - // 拥有admin权限且请求头有特殊标识才在此接口返回答案和解析 - boolean isDebugMode = SecurityUtils.hasRole(UserRoleEnum.ROLE_ADMIN.name()) - && StrUtil.equals(X_DEBUG_MODE_VALUE , ServletUtils.getHeader(X_DEBUG_MODE_HEADER)); - if (!isDebugMode) { - detail.setRightAnswer(null); - detail.setAnalysis(null); - } + snapshot.setQuestionId(questionDTO.getId()); return snapshot; }).toList(); } diff --git a/src/main/java/com/project/exam/domain/service/impl/BuildExamRecordDomainServiceImpl.java b/src/main/java/com/project/exam/domain/service/impl/BuildExamRecordDomainServiceImpl.java index 2d95760..ac8f37c 100644 --- a/src/main/java/com/project/exam/domain/service/impl/BuildExamRecordDomainServiceImpl.java +++ b/src/main/java/com/project/exam/domain/service/impl/BuildExamRecordDomainServiceImpl.java @@ -1,25 +1,44 @@ package com.project.exam.domain.service.impl; import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.project.base.domain.utils.ServletUtils; +import com.project.ding.domain.enums.UserRoleEnum; +import com.project.ding.utils.SecurityUtils; import com.project.exam.domain.dto.ExamRecordDTO; import com.project.exam.domain.service.BuildExamRecordDomainService; import com.project.task.domain.enums.QuestionTypeEnum; -import com.project.task.domain.service.TaskBaseService; -import org.springframework.beans.factory.annotation.Autowired; +import io.vavr.control.Try; import org.springframework.stereotype.Service; import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; @Service public class BuildExamRecordDomainServiceImpl implements BuildExamRecordDomainService { - @Autowired - private TaskBaseService taskBaseService; + + + private final static String X_DEBUG_MODE_HEADER = "X-Debug-Mode"; + + + + private final static String X_DEBUG_MODE_VALUE = "true"; @Override public ExamRecordDTO buildDTO(ExamRecordDTO dto) throws Exception { // 补全题目分数 if (Objects.nonNull(dto.getTaskDTO())) { - dto.getAnswerSnapshotDTOList().stream().map(answerSnapshotDTO -> { + dto.getAnswerSnapshotDTOList().forEach(answerSnapshotDTO -> { + // 拥有admin权限且请求头有特殊标识才在此接口返回答案和解析 + boolean isDebugMode = SecurityUtils.hasRole(UserRoleEnum.ROLE_ADMIN.name()) + && StrUtil.equals(X_DEBUG_MODE_VALUE , ServletUtils.getHeader(X_DEBUG_MODE_HEADER)); + boolean isSubmitted = Objects.nonNull(dto.getSubmitTime()); + boolean canShowDetails = isDebugMode || isSubmitted; + + if (!canShowDetails) { + answerSnapshotDTO.setRightAnswer(null); + answerSnapshotDTO.setAnalysis(null); + } if (QuestionTypeEnum.SINGLE_CHOICE.getValue().equals(answerSnapshotDTO.getType())) { answerSnapshotDTO.setScore(dto.getTaskDTO().getSingleChoiceScore()); answerSnapshotDTO.setUserScore(BooleanUtil.isTrue(answerSnapshotDTO.getIsRight()) ? @@ -33,9 +52,15 @@ public class BuildExamRecordDomainServiceImpl implements BuildExamRecordDomainSe answerSnapshotDTO.setUserScore(BooleanUtil.isTrue(answerSnapshotDTO.getIsRight()) ? dto.getTaskDTO().getMultipleChoiceScore() : 0); } - return answerSnapshotDTO; + answerSnapshotDTO.setTypeText(Try.of(() -> + QuestionTypeEnum.findByValue(answerSnapshotDTO.getType()).getDescription()) + .getOrElse("")); }); } + AtomicInteger index = new AtomicInteger(0); + dto.getAnswerSnapshotDTOList().forEach(answerSnapshotDTO -> { + answerSnapshotDTO.setIndex(index.incrementAndGet()); + }); return dto; } } diff --git a/src/main/java/com/project/exam/domain/service/impl/GetDetailExamRecordDomainServiceImpl.java b/src/main/java/com/project/exam/domain/service/impl/GetDetailExamRecordDomainServiceImpl.java new file mode 100644 index 0000000..460e5f9 --- /dev/null +++ b/src/main/java/com/project/exam/domain/service/impl/GetDetailExamRecordDomainServiceImpl.java @@ -0,0 +1,24 @@ +package com.project.exam.domain.service.impl; + +import com.project.base.domain.result.Result; +import com.project.exam.domain.dto.ExamRecordDTO; +import com.project.exam.domain.service.BuildExamRecordDomainService; +import com.project.exam.domain.service.GetDetailExamRecordDomainService; +import com.project.exam.mapper.ExamRecordMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class GetDetailExamRecordDomainServiceImpl implements GetDetailExamRecordDomainService { + + @Autowired + private BuildExamRecordDomainService buildExamRecordDomainService; + @Autowired + private ExamRecordMapper examRecordMapper; + @Override + public Result getDetail(Long id) throws Exception { + ExamRecordDTO dto = examRecordMapper.selectById(id).toDTO(ExamRecordDTO::new); + + return Result.success(buildExamRecordDomainService.buildDTO(dto)); + } +}