| | |
| | | package com.ycl.jxkg.service.impl; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; |
| | | import com.ycl.jxkg.context.WebContext; |
| | | import com.ycl.jxkg.domain.entity.Exam; |
| | | import com.ycl.jxkg.domain.entity.ExamSubmitTemp; |
| | | import com.ycl.jxkg.domain.entity.Question; |
| | | import com.ycl.jxkg.domain.vo.DoQuestionVO; |
| | | import com.ycl.jxkg.domain.vo.ExamSubmitVO; |
| | | import com.ycl.jxkg.enums.QuestionTypeEnum; |
| | | import com.ycl.jxkg.enums.general.ExamStatusEnum; |
| | | import com.ycl.jxkg.enums.general.ExamSubmitTempStatusEnum; |
| | | import com.ycl.jxkg.mapper.ExamMapper; |
| | | import com.ycl.jxkg.mapper.ExamSubmitTempMapper; |
| | | import com.ycl.jxkg.mapper.QuestionMapper; |
| | | import com.ycl.jxkg.service.ExamService; |
| | | import com.ycl.jxkg.base.Result; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.util.Assert; |
| | | |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | |
| | | public class ExamServiceImpl extends ServiceImpl<ExamMapper, Exam> implements ExamService { |
| | | |
| | | private final ExamMapper examMapper; |
| | | private final WebContext webContext; |
| | | private final QuestionMapper questionMapper; |
| | | private final ExamSubmitTempMapper examSubmitTempMapper; |
| | | |
| | | /** |
| | | * 添加 |
| | | * |
| | | * @param form |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Result add(ExamForm form) { |
| | | Exam entity = ExamForm.getEntityByForm(form, null); |
| | | entity.setStatus(ExamStatusEnum.getStatusByTime(form.getStartTime(), form.getEndTime(), null)); |
| | | entity.setTeacherId(webContext.getCurrentUser().getId()); |
| | | baseMapper.insert(entity); |
| | | return Result.ok("添加成功"); |
| | | } |
| | | |
| | | /** |
| | | * 修改 |
| | | * |
| | | * @param form |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Result update(ExamForm form) { |
| | | Exam entity = baseMapper.selectById(form.getId()); |
| | | |
| | | // 为空抛IllegalArgumentException,做全局异常处理 |
| | | Assert.notNull(entity, "记录不存在"); |
| | | BeanUtils.copyProperties(form, entity); |
| | | entity.setStatus(ExamStatusEnum.getStatusByTime(form.getStartTime(), form.getEndTime(), null)); |
| | | baseMapper.updateById(entity); |
| | | return Result.ok("修改成功"); |
| | | } |
| | | |
| | | /** |
| | | * 批量删除 |
| | | * |
| | | * @param ids |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * id删除 |
| | | * |
| | | * @param id |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 分页查询 |
| | | * |
| | | * @param query |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 根据id查找 |
| | | * |
| | | * @param id |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 列表 |
| | | * |
| | | * @return |
| | | */ |
| | | @Override |
| | |
| | | .collect(Collectors.toList()); |
| | | return Result.ok().data(vos); |
| | | } |
| | | |
| | | @Override |
| | | public Result examSubmit(ExamSubmitVO submitData) { |
| | | // 校验 |
| | | Exam exam = examMapper.selectById(submitData.getExamId()); |
| | | if (Objects.isNull(exam)) { |
| | | throw new RuntimeException("该考试不存在"); |
| | | } |
| | | // 判断单选、多选、判断题对错 |
| | | List<Integer> questionIds = submitData.getQuestionList().stream().map(DoQuestionVO::getId).collect(Collectors.toList()); |
| | | List<Question> questionList = questionMapper.getAnswerInfo(questionIds); |
| | | Map<Integer, Question> answerMap = questionList.stream().collect(Collectors.toMap(Question::getId, entity -> entity)); |
| | | submitData.getQuestionList().stream().forEach(item -> { |
| | | Question question = answerMap.get(item.getId()); |
| | | if (Objects.nonNull(question) |
| | | && (QuestionTypeEnum.SingleChoice.getCode().equals(question.getQuestionType()) |
| | | || QuestionTypeEnum.MultipleChoice.getCode().equals(question.getQuestionType()) |
| | | || QuestionTypeEnum.TrueFalse.getCode().equals(question.getQuestionType()) |
| | | )) { |
| | | String correct = question.getCorrect(); |
| | | if (QuestionTypeEnum.MultipleChoice.getCode().equals(question.getQuestionType())) { |
| | | // 如果是选择题,那么将答案转为list |
| | | List<String> answerList = JSON.parseArray(correct, String.class); |
| | | item.setRight(answerList.containsAll(item.getAnswerList())); |
| | | } else { |
| | | item.setRight(question.getCorrect().equals(item.getAnswer())); |
| | | } |
| | | } |
| | | }); |
| | | // 阅卷后才往exam_paper_answer保存考试成绩、以及保存到exam_paper_customer_answer |
| | | // 现在只需要保存到一张临时表 |
| | | // 该接口是主动提交,所以状态都设置为完成,以便后续老师阅卷 |
| | | saveTempExam(submitData, ExamSubmitTempStatusEnum.FINISH); |
| | | return Result.ok(); |
| | | } |
| | | |
| | | @Override |
| | | public Result timingSubmit(ExamSubmitVO submitData) { |
| | | saveTempExam(submitData, ExamSubmitTempStatusEnum.TEMP); |
| | | return Result.ok(); |
| | | } |
| | | |
| | | /** |
| | | * 保存临时试卷 |
| | | * |
| | | * @param submitData 前端传递的试卷数据 |
| | | * @param status 试卷的状态 |
| | | */ |
| | | public void saveTempExam(ExamSubmitVO submitData, ExamSubmitTempStatusEnum status) { |
| | | ExamSubmitTemp one = new LambdaQueryChainWrapper<>(examSubmitTempMapper) |
| | | .eq(ExamSubmitTemp::getExamId, submitData.getExamId()) |
| | | .eq(ExamSubmitTemp::getUserId, webContext.getCurrentUser().getId()) |
| | | .one(); |
| | | if (Objects.nonNull(one)) { |
| | | if (ExamSubmitTempStatusEnum.FINISH.equals(one.getStatus())) { |
| | | return; |
| | | } |
| | | one.setDoTime(submitData.getDoTime()); |
| | | one.setExamSubmit(JSON.toJSONString(submitData.getQuestionList())); |
| | | one.setCreateTime(new Date()); |
| | | one.setStatus(status); |
| | | examSubmitTempMapper.updateById(one); |
| | | } else { |
| | | ExamSubmitTemp examSubmitTemp = new ExamSubmitTemp(); |
| | | examSubmitTemp.setExamId(submitData.getExamId()); |
| | | examSubmitTemp.setDoTime(submitData.getDoTime()); |
| | | examSubmitTemp.setStatus(status); |
| | | examSubmitTemp.setUserId(webContext.getCurrentUser().getId()); |
| | | examSubmitTemp.setExamSubmit(JSON.toJSONString(submitData.getQuestionList())); |
| | | examSubmitTempMapper.insert(examSubmitTemp); |
| | | } |
| | | } |
| | | } |