user paper exam
parent
ca2092bd82
commit
acedb439b8
|
|
@ -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聚合)
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ public interface PaperExamService extends IService<PaperExamDO> {
|
||||||
boolean deleteById(Long id);
|
boolean deleteById(Long id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 去考试:根据试卷生成考试记录及用户试题作答记录(携带班级id时同时生成班级学员考试记录)
|
* 去考试:根据试卷生成考试记录及用户试题作答记录
|
||||||
*
|
*
|
||||||
* @param dto 去考试入参(试卷id必填,用户id由Controller填充)
|
* @param dto 去考试入参(试卷id必填,用户id由Controller填充)
|
||||||
* @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 交卷入参(试卷id必填,班级id非空时保存班级学员考试记录)
|
||||||
* @param userId 当前用户id
|
* @param userId 当前用户id
|
||||||
*/
|
*/
|
||||||
void submitExam(SubmitExamDTO dto, Long userId);
|
void submitExam(SubmitExamDTO dto, Long userId);
|
||||||
|
|
|
||||||
|
|
@ -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<>())));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue