user paper exam

dev-tmp1
luotaiqian 2026-08-25 13:45:24 +08:00
parent 2866589177
commit 107ae45d48
7 changed files with 130 additions and 19 deletions

View File

@ -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<PaperExamInfoVO> paperExamInfo(@RequestParam("paperExamId") @ApiParam(value = "考试试卷id", required = true) Long paperExamId) {
PaperExamInfoVO examInfo = paperExamService.paperExamInfo(paperExamId);
public SingleResponse<PaperExamDetailVO> paperExamInfo(@RequestParam("paperExamId") @ApiParam(value = "考试试卷id", required = true) Long paperExamId) {
PaperExamDetailVO examInfo = paperExamService.paperExamInfo(paperExamId);
return SingleResponse.success(examInfo);
}
}

View File

@ -63,12 +63,12 @@ public interface QuestionMapper extends BaseMapper<QuestionDO> {
List<StartExamQuestionVO> listExamQuestions(@Param("paperId") Long paperId);
/**
*
*
*
* @param paperExamId id
* @return VO
* @return VO
*/
List<QuestionVO> listPaperExamQuestions(@Param("paperExamId") Long paperExamId);
List<PaperExamQuestionVO> listPaperExamQuestions(@Param("paperExamId") Long paperExamId);
/**
* SQL

View File

@ -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<PaperExamQuestionVO> questionVOList;
}

View File

@ -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<QuestionOptionVO> questionOptionVOList;
/**
* (1:,2:)
*/
private Integer source;
}

View File

@ -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<PaperExamDO> {
void submitExam(SubmitExamDTO dto, Long userId);
/**
*
*
*
* @param paperExamId id
* @return
* @return
*/
PaperExamInfoVO paperExamInfo(Long paperExamId);
PaperExamDetailVO paperExamInfo(Long paperExamId);
}

View File

@ -207,7 +207,7 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
}
@Override
public PaperExamInfoVO paperExamInfo(Long paperExamId) {
public PaperExamDetailVO paperExamInfo(Long paperExamId) {
PaperExamDO paperExam = this.lambdaQuery()
.eq(PaperExamDO::getId, paperExamId)
.eq(PaperExamDO::getDeleteEnum, DeleteEnum.FALSE.getCode())
@ -215,13 +215,13 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
if (paperExam == null) {
throw new IllegalArgumentException("考试试卷不存在");
}
PaperExamInfoVO examInfoVO = new PaperExamInfoVO();
examInfoVO.setPaperBasicInfoVO(paperService.paperBasicInfo(paperExam.getPaperId()));
// 试题按考试作答记录关联查询(分值取作答记录中的试题分数)并填充选项
List<QuestionVO> questionVOList = questionMapper.listPaperExamQuestions(paperExamId);
PaperExamDetailVO examDetailVO = new PaperExamDetailVO();
examDetailVO.setPaperBasicInfoVO(paperService.paperBasicInfo(paperExam.getPaperId()));
// 试题按考试作答记录关联查询(含用户作答答案、作答状态、得分)并填充选项
List<PaperExamQuestionVO> 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<PaperExamMapper, PaperExam
*
* @param questionVOList VO
*/
private void fillQuestionOptions(List<QuestionVO> questionVOList) {
private void fillQuestionOptions(List<PaperExamQuestionVO> questionVOList) {
if (CollectionUtils.isEmpty(questionVOList)) {
return;
}

View File

@ -91,10 +91,12 @@
ORDER BY pqr.question_num ASC, pqr.id ASC
</select>
<select id="listPaperExamQuestions" resultType="org.qinan.cedu.model.vo.QuestionVO">
<select id="listPaperExamQuestions" resultType="org.qinan.cedu.model.vo.PaperExamQuestionVO">
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