user paper exam

dev-tmp1
luotaiqian 2026-08-25 12:02:31 +08:00
parent ca2092bd82
commit acedb439b8
4 changed files with 68 additions and 4 deletions

View File

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

View File

@ -58,7 +58,7 @@ public interface PaperExamService extends IService<PaperExamDO> {
boolean deleteById(Long id); boolean deleteById(Long id);
/** /**
* id *
* *
* @param dto ididController * @param dto ididController
* @return * @return
@ -74,9 +74,9 @@ public interface PaperExamService extends IService<PaperExamDO> {
void answerQuestion(AnswerQuestionDTO dto, Long userId); void answerQuestion(AnswerQuestionDTO dto, Long userId);
/** /**
* * id
* *
* @param dto id * @param dto idid
* @param userId id * @param userId id
*/ */
void submitExam(SubmitExamDTO dto, Long userId); void submitExam(SubmitExamDTO dto, Long userId);

View File

@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.qinan.cedu.convertor.PaperExamConvertor; import org.qinan.cedu.convertor.PaperExamConvertor;
import org.qinan.cedu.convertor.PaperExamQuestionUserConvertor; import org.qinan.cedu.convertor.PaperExamQuestionUserConvertor;
import org.qinan.cedu.convertor.QuestionConvertor;
import org.qinan.cedu.enums.AnswerStatusEnum; import org.qinan.cedu.enums.AnswerStatusEnum;
import org.qinan.cedu.enums.DeleteEnum; import org.qinan.cedu.enums.DeleteEnum;
import org.qinan.cedu.enums.PaperExamStatusEnum; import org.qinan.cedu.enums.PaperExamStatusEnum;
@ -15,11 +16,13 @@ import org.qinan.cedu.mapper.PaperExamMapper;
import org.qinan.cedu.mapper.PaperExamQuestionUserMapper; import org.qinan.cedu.mapper.PaperExamQuestionUserMapper;
import org.qinan.cedu.mapper.PaperMapper; import org.qinan.cedu.mapper.PaperMapper;
import org.qinan.cedu.mapper.QuestionMapper; import org.qinan.cedu.mapper.QuestionMapper;
import org.qinan.cedu.mapper.QuestionOptionMapper;
import org.qinan.cedu.model.dto.*; import org.qinan.cedu.model.dto.*;
import org.qinan.cedu.model.entity.PaperDO; import org.qinan.cedu.model.entity.PaperDO;
import org.qinan.cedu.model.entity.PaperExamDO; import org.qinan.cedu.model.entity.PaperExamDO;
import org.qinan.cedu.model.entity.PaperExamQuestionUserDO; import org.qinan.cedu.model.entity.PaperExamQuestionUserDO;
import org.qinan.cedu.model.entity.QuestionDO; import org.qinan.cedu.model.entity.QuestionDO;
import org.qinan.cedu.model.entity.QuestionOptionDO;
import org.qinan.cedu.model.vo.*; import org.qinan.cedu.model.vo.*;
import org.qinan.cedu.service.ClassStudentExamRecordService; import org.qinan.cedu.service.ClassStudentExamRecordService;
import org.qinan.cedu.service.PaperExamQuestionUserService; import org.qinan.cedu.service.PaperExamQuestionUserService;
@ -30,6 +33,7 @@ import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter;
import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -38,6 +42,7 @@ import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -56,6 +61,10 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
private final QuestionMapper questionMapper; private final QuestionMapper questionMapper;
private final QuestionOptionMapper questionOptionMapper;
private final QuestionConvertor questionConvertor;
private final PaperExamQuestionUserService paperExamQuestionUserService; private final PaperExamQuestionUserService paperExamQuestionUserService;
private final PaperExamQuestionUserMapper paperExamQuestionUserMapper; private final PaperExamQuestionUserMapper paperExamQuestionUserMapper;
@ -206,7 +215,41 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
if (paperExam == null) { if (paperExam == null) {
throw new IllegalArgumentException("考试试卷不存在"); throw new IllegalArgumentException("考试试卷不存在");
} }
return paperService.paperExamInfo(paperExam.getPaperId()); PaperExamInfoVO examInfoVO = new PaperExamInfoVO();
examInfoVO.setPaperBasicInfoVO(paperService.paperBasicInfo(paperExam.getPaperId()));
// 试题按考试作答记录关联查询(分值取作答记录中的试题分数)并填充选项
List<QuestionVO> questionVOList = questionMapper.listPaperExamQuestions(paperExamId);
fillQuestionOptions(questionVOList);
examInfoVO.setQuestionVOList(questionVOList);
return examInfoVO;
}
/**
* id
*
* @param questionVOList VO
*/
private void fillQuestionOptions(List<QuestionVO> questionVOList) {
if (CollectionUtils.isEmpty(questionVOList)) {
return;
}
List<Long> questionIds = questionVOList.stream()
.map(question -> Long.valueOf(question.getId()))
.collect(Collectors.toList());
// 查询选项信息仅查询VO需要的字段按显示顺序排序
List<QuestionOptionDO> optionList = questionOptionMapper.selectList(new LambdaQueryWrapper<QuestionOptionDO>()
.select(QuestionOptionDO::getId, QuestionOptionDO::getQuestionId,
QuestionOptionDO::getOptionKey, QuestionOptionDO::getOptionName,
QuestionOptionDO::getOptionText, QuestionOptionDO::getIsCorrect,
QuestionOptionDO::getSortOrder)
.in(QuestionOptionDO::getQuestionId, questionIds)
.eq(QuestionOptionDO::getDeleteEnum, DeleteEnum.FALSE.getCode())
.orderByAsc(QuestionOptionDO::getSortOrder));
Map<Long, List<QuestionOptionVO>> optionMap = questionConvertor.convertOptionEListToVoList(optionList)
.stream()
.collect(Collectors.groupingBy(QuestionOptionVO::getQuestionId));
questionVOList.forEach(question -> question.setQuestionOptionVOList(
optionMap.getOrDefault(Long.valueOf(question.getId()), new ArrayList<>())));
} }
/** /**

View File

@ -91,6 +91,19 @@
ORDER BY pqr.question_num ASC, pqr.id ASC ORDER BY pqr.question_num ASC, pqr.id ASC
</select> </select>
<select id="listPaperExamQuestions" resultType="org.qinan.cedu.model.vo.QuestionVO">
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
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
WHERE pequ.paper_exam_id = #{paperExamId}
AND pequ.delete_enum = 'false'
AND q.delete_enum = 'false'
ORDER BY pequ.id ASC
</select>
<select id="pageCourseware" resultType="org.qinan.cedu.model.vo.QuestionCoursewareVO"> <select id="pageCourseware" resultType="org.qinan.cedu.model.vo.QuestionCoursewareVO">
SELECT q.id SELECT q.id
, q.title , q.title