From 107ae45d48c8ec8765ab44119f9df4952cfc54ab Mon Sep 17 00:00:00 2001 From: luotaiqian <1147642922@qq.com> Date: Tue, 25 Aug 2026 13:45:24 +0800 Subject: [PATCH] user paper exam --- .../cedu/controller/PaperExamController.java | 7 +- .../org/qinan/cedu/mapper/QuestionMapper.java | 6 +- .../cedu/model/vo/PaperExamDetailVO.java | 21 +++++ .../cedu/model/vo/PaperExamQuestionVO.java | 87 +++++++++++++++++++ .../qinan/cedu/service/PaperExamService.java | 8 +- .../service/impl/PaperExamServiceImpl.java | 16 ++-- .../main/resources/mapper/QuestionMapper.xml | 4 +- 7 files changed, 130 insertions(+), 19 deletions(-) create mode 100644 safety-cedu-service/src/main/java/org/qinan/cedu/model/vo/PaperExamDetailVO.java create mode 100644 safety-cedu-service/src/main/java/org/qinan/cedu/model/vo/PaperExamQuestionVO.java diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/controller/PaperExamController.java b/safety-cedu-service/src/main/java/org/qinan/cedu/controller/PaperExamController.java index 0fac3fc7..bd66cbf4 100644 --- a/safety-cedu-service/src/main/java/org/qinan/cedu/controller/PaperExamController.java +++ b/safety-cedu-service/src/main/java/org/qinan/cedu/controller/PaperExamController.java @@ -8,6 +8,7 @@ import lombok.RequiredArgsConstructor; import org.qinan.cedu.model.dto.AnswerQuestionDTO; import org.qinan.cedu.model.dto.StartExamDTO; import org.qinan.cedu.model.dto.SubmitExamDTO; +import org.qinan.cedu.model.vo.PaperExamDetailVO; import org.qinan.cedu.model.vo.PaperExamInfoVO; import org.qinan.cedu.model.vo.StartExamVO; import org.qinan.cedu.service.PaperExamService; @@ -62,12 +63,12 @@ public class PaperExamController { } /** - * 考试试卷信息查询:根据考试记录id查询试卷考试信息(含试题列表及参考答案) + * 考试试卷信息查询:根据考试记录id查询试卷考试信息(含试题列表、参考答案及用户作答信息) */ @ApiOperation("考试试卷信息查询") @GetMapping("/exam/info") - public SingleResponse paperExamInfo(@RequestParam("paperExamId") @ApiParam(value = "考试试卷id", required = true) Long paperExamId) { - PaperExamInfoVO examInfo = paperExamService.paperExamInfo(paperExamId); + public SingleResponse paperExamInfo(@RequestParam("paperExamId") @ApiParam(value = "考试试卷id", required = true) Long paperExamId) { + PaperExamDetailVO examInfo = paperExamService.paperExamInfo(paperExamId); return SingleResponse.success(examInfo); } } diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/mapper/QuestionMapper.java b/safety-cedu-service/src/main/java/org/qinan/cedu/mapper/QuestionMapper.java index ba0e1e85..80300810 100644 --- a/safety-cedu-service/src/main/java/org/qinan/cedu/mapper/QuestionMapper.java +++ b/safety-cedu-service/src/main/java/org/qinan/cedu/mapper/QuestionMapper.java @@ -63,12 +63,12 @@ public interface QuestionMapper extends BaseMapper { List listExamQuestions(@Param("paperId") Long paperId); /** - * 按考试作答记录查询试题列表(关联试题表,分值取作答记录中的试题分数,仅查询需要的字段) + * 按考试作答记录查询试题列表(关联试题表,含用户作答答案、作答状态、正确状态、试题分数及作答得分) * * @param paperExamId 考试记录id - * @return 试题VO列表 + * @return 试题VO列表(含用户作答信息) */ - List listPaperExamQuestions(@Param("paperExamId") Long paperExamId); + List listPaperExamQuestions(@Param("paperExamId") Long paperExamId); /** * 按题型统计试题数量(按关联课件过滤,一条SQL聚合) diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/model/vo/PaperExamDetailVO.java b/safety-cedu-service/src/main/java/org/qinan/cedu/model/vo/PaperExamDetailVO.java new file mode 100644 index 00000000..dd506663 --- /dev/null +++ b/safety-cedu-service/src/main/java/org/qinan/cedu/model/vo/PaperExamDetailVO.java @@ -0,0 +1,21 @@ +package org.qinan.cedu.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 考试试卷详情(含试题列表、参考答案及用户作答信息) + */ +@Data +@ApiModel(value = "PaperExamDetailVO", description = "考试试卷详情(含用户作答信息)") +public class PaperExamDetailVO { + + @ApiModelProperty("试卷基本信息") + private PaperBasicInfoVO paperBasicInfoVO; + + @ApiModelProperty("试题信息(含用户作答信息)") + private List questionVOList; +} diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/model/vo/PaperExamQuestionVO.java b/safety-cedu-service/src/main/java/org/qinan/cedu/model/vo/PaperExamQuestionVO.java new file mode 100644 index 00000000..bb87679b --- /dev/null +++ b/safety-cedu-service/src/main/java/org/qinan/cedu/model/vo/PaperExamQuestionVO.java @@ -0,0 +1,87 @@ +package org.qinan.cedu.model.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 考试试卷试题项(试题信息 + 用户作答记录信息) + */ +@Data +@ApiModel(value = "PaperExamQuestionVO", description = "考试试卷试题项(含用户作答信息)") +public class PaperExamQuestionVO { + + @ApiModelProperty("用户作答答案") + private String userAnswer; + + @ApiModelProperty("用户作答答案选项id 多个逗号隔开") + private String userAnswerQuestionOptionIds; + + @ApiModelProperty("作答状态 non 未作答,done 已作答") + private String answerStatus; + + @ApiModelProperty("正确状态 false 作答错误,true 作答正确") + private String rightStatus; + + @ApiModelProperty("试题分数") + private BigDecimal questionScore; + + @ApiModelProperty("作答得分") + private BigDecimal answerScore; + + @ApiModelProperty("主键") + @JsonSerialize(using = ToStringSerializer.class) + private String id; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + @ApiModelProperty("题目内容") + private String title; + + @ApiModelProperty("题型:single单选/multiple多选/judge判断/fill填空/short简答") + private String questionType; + + @ApiModelProperty("参考答案:逗号隔开") + private String answer; + + @ApiModelProperty("答案选项id 多个逗号隔开") + private String answerQuestionOptionIds; + + @ApiModelProperty("子题 多个逗号分割") + private String childrenQuestionIds; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty("答案解析") + private String analysis; + + @ApiModelProperty("标签类型") + private String tagType; + + @ApiModelProperty("关联课件管理id") + @JsonSerialize(using = ToStringSerializer.class) + private Long coursewareManagementId; + + @ApiModelProperty("关联课件管理名称") + private String coursewareManagementName; + + @ApiModelProperty("试题选项信息") + private List questionOptionVOList; + /** + * 来源(1:管理员添加,2:三方添加) + */ + private Integer source; +} diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/service/PaperExamService.java b/safety-cedu-service/src/main/java/org/qinan/cedu/service/PaperExamService.java index 2cc2ee1d..883c32a2 100644 --- a/safety-cedu-service/src/main/java/org/qinan/cedu/service/PaperExamService.java +++ b/safety-cedu-service/src/main/java/org/qinan/cedu/service/PaperExamService.java @@ -8,7 +8,7 @@ import org.qinan.cedu.model.dto.PaperExamPageQueryDTO; import org.qinan.cedu.model.dto.StartExamDTO; import org.qinan.cedu.model.dto.SubmitExamDTO; import org.qinan.cedu.model.entity.PaperExamDO; -import org.qinan.cedu.model.vo.PaperExamInfoVO; +import org.qinan.cedu.model.vo.PaperExamDetailVO; import org.qinan.cedu.model.vo.PaperExamVO; import org.qinan.cedu.model.vo.StartExamVO; @@ -82,10 +82,10 @@ public interface PaperExamService extends IService { void submitExam(SubmitExamDTO dto, Long userId); /** - * 查询考试试卷的试卷考试信息(含试题列表及参考答案) + * 查询考试试卷的试卷考试信息(含试题列表、参考答案及用户作答信息) * * @param paperExamId 考试试卷id - * @return 试卷考试信息 + * @return 试卷考试信息(含用户作答信息) */ - PaperExamInfoVO paperExamInfo(Long paperExamId); + PaperExamDetailVO paperExamInfo(Long paperExamId); } diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/PaperExamServiceImpl.java b/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/PaperExamServiceImpl.java index 2e16129b..9270b70e 100644 --- a/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/PaperExamServiceImpl.java +++ b/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/PaperExamServiceImpl.java @@ -207,7 +207,7 @@ public class PaperExamServiceImpl extends ServiceImpl questionVOList = questionMapper.listPaperExamQuestions(paperExamId); + PaperExamDetailVO examDetailVO = new PaperExamDetailVO(); + examDetailVO.setPaperBasicInfoVO(paperService.paperBasicInfo(paperExam.getPaperId())); + // 试题按考试作答记录关联查询(含用户作答答案、作答状态、得分)并填充选项 + List questionVOList = questionMapper.listPaperExamQuestions(paperExamId); fillQuestionOptions(questionVOList); - examInfoVO.setQuestionVOList(questionVOList); - return examInfoVO; + examDetailVO.setQuestionVOList(questionVOList); + return examDetailVO; } /** @@ -229,7 +229,7 @@ public class PaperExamServiceImpl extends ServiceImpl questionVOList) { + private void fillQuestionOptions(List questionVOList) { if (CollectionUtils.isEmpty(questionVOList)) { return; } diff --git a/safety-cedu-service/src/main/resources/mapper/QuestionMapper.xml b/safety-cedu-service/src/main/resources/mapper/QuestionMapper.xml index dded252d..e775ed41 100644 --- a/safety-cedu-service/src/main/resources/mapper/QuestionMapper.xml +++ b/safety-cedu-service/src/main/resources/mapper/QuestionMapper.xml @@ -91,10 +91,12 @@ ORDER BY pqr.question_num ASC, pqr.id ASC - SELECT q.id, q.title, q.question_type, q.answer, q.answer_question_option_ids , pequ.question_score AS score, q.analysis, q.tag_type, q.courseware_management_id , cm.courseware_name AS coursewareManagementName + , pequ.user_answer, pequ.user_answer_question_option_ids + , pequ.answer_status, pequ.right_status, pequ.question_score, pequ.answer_score FROM paper_exam_question_user pequ JOIN question q ON pequ.question_id = q.id LEFT JOIN courseware_management cm ON cm.id = q.courseware_management_id