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 3a9d44b8..ba0e1e85 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 @@ -62,6 +62,14 @@ public interface QuestionMapper extends BaseMapper { */ List listExamQuestions(@Param("paperId") Long paperId); + /** + * 按考试作答记录查询试题列表(关联试题表,分值取作答记录中的试题分数,仅查询需要的字段) + * + * @param paperExamId 考试记录id + * @return 试题VO列表 + */ + List listPaperExamQuestions(@Param("paperExamId") Long paperExamId); + /** * 按题型统计试题数量(按关联课件过滤,一条SQL聚合) * 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 794ed4e6..2cc2ee1d 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 @@ -58,7 +58,7 @@ public interface PaperExamService extends IService { boolean deleteById(Long id); /** - * 去考试:根据试卷生成考试记录及用户试题作答记录(携带班级id时同时生成班级学员考试记录) + * 去考试:根据试卷生成考试记录及用户试题作答记录 * * @param dto 去考试入参(试卷id必填,用户id由Controller填充) * @return 考试信息(含试题列表及参考答案) @@ -74,9 +74,9 @@ public interface PaperExamService extends IService { void answerQuestion(AnswerQuestionDTO dto, Long userId); /** - * 交卷:汇总用户最近一次进行中考试各试题作答得分,更新考试成绩、是否通过并结束考试 + * 交卷:汇总用户最近一次进行中考试各试题作答得分,更新考试成绩、是否通过并结束考试(携带班级id时保存班级学员考试记录) * - * @param dto 交卷入参(试卷id必填) + * @param dto 交卷入参(试卷id必填,班级id非空时保存班级学员考试记录) * @param userId 当前用户id */ void submitExam(SubmitExamDTO dto, Long userId); 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 bf8e4720..2e16129b 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 @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import org.qinan.cedu.convertor.PaperExamConvertor; import org.qinan.cedu.convertor.PaperExamQuestionUserConvertor; +import org.qinan.cedu.convertor.QuestionConvertor; import org.qinan.cedu.enums.AnswerStatusEnum; import org.qinan.cedu.enums.DeleteEnum; 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.PaperMapper; import org.qinan.cedu.mapper.QuestionMapper; +import org.qinan.cedu.mapper.QuestionOptionMapper; import org.qinan.cedu.model.dto.*; import org.qinan.cedu.model.entity.PaperDO; import org.qinan.cedu.model.entity.PaperExamDO; import org.qinan.cedu.model.entity.PaperExamQuestionUserDO; import org.qinan.cedu.model.entity.QuestionDO; +import org.qinan.cedu.model.entity.QuestionOptionDO; import org.qinan.cedu.model.vo.*; import org.qinan.cedu.service.ClassStudentExamRecordService; 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.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.math.BigDecimal; @@ -38,6 +42,7 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -56,6 +61,10 @@ public class PaperExamServiceImpl extends ServiceImpl questionVOList = questionMapper.listPaperExamQuestions(paperExamId); + fillQuestionOptions(questionVOList); + examInfoVO.setQuestionVOList(questionVOList); + return examInfoVO; + } + + /** + * 批量填充试题选项:一次查询所有试题的选项后按试题id分组回填 + * + * @param questionVOList 试题VO列表 + */ + private void fillQuestionOptions(List questionVOList) { + if (CollectionUtils.isEmpty(questionVOList)) { + return; + } + List questionIds = questionVOList.stream() + .map(question -> Long.valueOf(question.getId())) + .collect(Collectors.toList()); + // 查询选项信息(仅查询VO需要的字段,按显示顺序排序) + List optionList = questionOptionMapper.selectList(new LambdaQueryWrapper() + .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> optionMap = questionConvertor.convertOptionEListToVoList(optionList) + .stream() + .collect(Collectors.groupingBy(QuestionOptionVO::getQuestionId)); + questionVOList.forEach(question -> question.setQuestionOptionVOList( + optionMap.getOrDefault(Long.valueOf(question.getId()), new ArrayList<>()))); } /** diff --git a/safety-cedu-service/src/main/resources/mapper/QuestionMapper.xml b/safety-cedu-service/src/main/resources/mapper/QuestionMapper.xml index def75af8..dded252d 100644 --- a/safety-cedu-service/src/main/resources/mapper/QuestionMapper.xml +++ b/safety-cedu-service/src/main/resources/mapper/QuestionMapper.xml @@ -91,6 +91,19 @@ ORDER BY pqr.question_num ASC, pqr.id ASC + +