| | |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | |
| | | Exam entity = ExamForm.getEntityByForm(form, null); |
| | | entity.setStatus(ExamStatusEnum.getStatusByTime(form.getStartTime(), form.getEndTime(), null)); |
| | | entity.setTeacherId(webContext.getCurrentUser().getId()); |
| | | // 设置乐观锁版本 |
| | | entity.setUpdateVersion(0); |
| | | if (baseMapper.insert(entity) > 0) { |
| | | this.sendMQ(entity, 0); |
| | | |
| | | // 查出考试试卷 |
| | | ExamPaper examPaper = examPaperMapper.selectById(entity.getExamPaperId()); |
| | | // 校验能否生成一张试卷 |
| | | try { |
| | | this.checkGenExam(examPaper); |
| | | // 设置乐观锁版本 |
| | | entity.setUpdateVersion(0); |
| | | if (baseMapper.insert(entity) > 0) { |
| | | this.sendMQ(entity, 0); |
| | | } |
| | | } catch (RuntimeException e) { |
| | | e.printStackTrace(); |
| | | return Result.fail(500, e.getMessage()); |
| | | } |
| | | return Result.ok("添加成功"); |
| | | } |
| | |
| | | throw new RuntimeException("只能修改还未开始的考试"); |
| | | } |
| | | BeanUtils.copyProperties(form, entity); |
| | | entity.setStatus(ExamStatusEnum.getStatusByTime(form.getStartTime(), form.getEndTime(), null)); |
| | | // 如果修改成功发送mq消息 |
| | | if (baseMapper.updateById(entity) > 0) { |
| | | this.sendMQ(entity, entity.getUpdateVersion()); |
| | | entity.setStatus(ExamStatusEnum.getStatusByTime(form.getStartTime(), form.getEndTime(), new Date())); |
| | | |
| | | // 查出考试试卷 |
| | | ExamPaper examPaper = examPaperMapper.selectById(entity.getExamPaperId()); |
| | | try { |
| | | this.checkGenExam(examPaper); |
| | | // 如果修改成功发送mq消息 |
| | | if (baseMapper.updateById(entity) > 0) { |
| | | this.sendMQ(entity, entity.getUpdateVersion()); |
| | | } |
| | | } catch (RuntimeException e) { |
| | | e.printStackTrace(); |
| | | return Result.fail(500, e.getMessage()); |
| | | } |
| | | return Result.ok("修改成功"); |
| | | } |
| | |
| | | item.setExamPaperId(null); |
| | | } |
| | | }); |
| | | // |
| | | return Result.ok().data(page.getRecords()).total(page.getTotal()); |
| | | } |
| | | |
| | |
| | | public Result studentPage(ExamQuery query) { |
| | | IPage<ExamVO> page = PageUtil.getPage(query, ExamVO.class); |
| | | baseMapper.studentPage(page, query, webContext.getCurrentUser().getId()); |
| | | for (ExamVO record : page.getRecords()) { |
| | | ExamSubmitTemp one = new LambdaQueryChainWrapper<>(examSubmitTempMapper) |
| | | .eq(ExamSubmitTemp::getExamId, record.getId()) |
| | | .eq(ExamSubmitTemp::getUserId, webContext.getCurrentUser().getId()) |
| | | .one(); |
| | | record.setIsContinue(Objects.isNull(one) || ExamSubmitTempStatusEnum.temp.equals(one.getExamSubmit())); |
| | | } |
| | | return Result.ok().data(page.getRecords()).total(page.getTotal()); |
| | | } |
| | | |
| | | /** |
| | | * 测试试卷配置能否生成试卷 |
| | | * |
| | | * @param examPaper |
| | | */ |
| | | public void checkGenExam(ExamPaper examPaper) throws RuntimeException { |
| | | // 试卷内容 |
| | | List<PaperFixQuestionVO> examData = new ArrayList<>(); |
| | | // 拿到题目副本数据 |
| | | List<QuestionAnswerCopyVO> questionAnswerCopyVOList = new ArrayList<>(32); |
| | | if (ExamPaperTypeEnum.Fixed.getCode().equals(examPaper.getPaperType()) |
| | | || ExamPaperTypeEnum.RandomOrder.getCode().equals(examPaper.getPaperType())) { |
| | | if (!StringUtils.hasText(examPaper.getContent())) { |
| | | throw new RuntimeException("试卷题目为空"); |
| | | } |
| | | // 转换 |
| | | examData = this.coverTo(examPaper, questionAnswerCopyVOList); |
| | | } else if (ExamPaperTypeEnum.Random.getCode().equals(examPaper.getPaperType())) { |
| | | // 根据随机试卷的配置,随机生成对应题目 |
| | | if (!StringUtils.hasText(examPaper.getContent())) { |
| | | throw new RuntimeException("试卷配置异常,请联系老师"); |
| | | } |
| | | List<PaperQuestionSettingDTO> paperSettingList = JSON.parseArray(examPaper.getContent(), PaperQuestionSettingDTO.class); |
| | | examData = new ArrayList<>(8); |
| | | for (PaperQuestionSettingDTO paperSetting : paperSettingList) { |
| | | PaperFixQuestionVO paperFixQuestionVO = new PaperFixQuestionVO(); |
| | | paperFixQuestionVO.setTitle(paperSetting.getTitle()); |
| | | paperFixQuestionVO.setQuestionType(paperSetting.getQuestionType()); |
| | | //一个类型的题目list |
| | | List<DoQuestionVO> childQuestionList = new ArrayList<>(); |
| | | List<PaperSettingItem> settingList = paperSetting.getSettingList(); |
| | | for (PaperSettingItem settingItem : settingList) { |
| | | Integer num = settingItem.getNum(); |
| | | Integer difficult = settingItem.getDifficult(); |
| | | if(0 == difficult) { |
| | | difficult = null; |
| | | } |
| | | //需要配置的题目数量为0则跳过 |
| | | if (num == null || num == 0) continue; |
| | | List<Question> questions = questionMapper.getRandomQuestion(settingItem.getSubjectId(), paperSetting.getQuestionType(), difficult, settingItem.getNum()); |
| | | if (org.springframework.util.CollectionUtils.isEmpty(questions) || settingItem.getNum() > questions.size()) { |
| | | throw new RuntimeException("试卷配置的题目数不足以生成试卷"); |
| | | } |
| | | // 拿到题目后组装为可临时保存的题目结构 |
| | | List<DoQuestionVO> childQuestions = questions.stream().map(item -> { |
| | | DoQuestionVO doQuestionVO = new DoQuestionVO(); |
| | | doQuestionVO.setQuestionType(item.getQuestionType()); |
| | | //从配置里拿题目分数 |
| | | doQuestionVO.setQuestionScore(settingItem.getScore()); |
| | | if (StringUtils.hasText(item.getContent())) { |
| | | QuestionObject questionObject = JSON.parseObject(item.getContent(), QuestionObject.class); |
| | | doQuestionVO.setQuestionItemList(questionObject.getQuestionItemObjects()); |
| | | doQuestionVO.setTitle(questionObject.getTitleContent()); |
| | | } |
| | | doQuestionVO.setId(item.getId()); |
| | | doQuestionVO.setOriginalFile(item.getOriginalFile()); |
| | | doQuestionVO.setAudioFile(item.getAudioFile()); |
| | | |
| | | // 题目副本 |
| | | QuestionAnswerCopyVO copy = new QuestionAnswerCopyVO(); |
| | | copy.setId(item.getId()); |
| | | copy.setDifficult(item.getDifficult()); |
| | | copy.setAnalyze(JSON.parseObject(item.getContent(), PaperQuestion.class).getAnalyze()); |
| | | //填空的答案在Json里 |
| | | if (QuestionTypeEnum.GapFilling.getCode().equals(item.getQuestionType())) { |
| | | List<String> gapAnswer = new ArrayList<>(); |
| | | for (QuestionItemObject questionItemObject : doQuestionVO.getQuestionItemList()) { |
| | | gapAnswer.add(questionItemObject.getContent()); |
| | | } |
| | | copy.setCorrect(String.join(ANSWER_SPLIT, gapAnswer)); |
| | | } else { |
| | | copy.setCorrect(item.getCorrect()); |
| | | } |
| | | questionAnswerCopyVOList.add(copy); |
| | | |
| | | return doQuestionVO; |
| | | }).collect(Collectors.toList()); |
| | | //添加到这个类型的list中 |
| | | childQuestionList.addAll(childQuestions); |
| | | } |
| | | paperFixQuestionVO.setQuestionList(childQuestionList); |
| | | if (! CollectionUtils.isEmpty(childQuestionList)) { |
| | | examData.add(paperFixQuestionVO); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | .one(); |
| | | if (Objects.nonNull(hasJoin)) { |
| | | // 允许提交后继续作答 |
| | | // if(ExamSubmitTempStatusEnum.finish.equals(hasJoin.getStatus())){ |
| | | // throw new RuntimeException("您已提交试卷,请勿重复作答"); |
| | | // } |
| | | if(ExamSubmitTempStatusEnum.finish.equals(hasJoin.getStatus())){ |
| | | throw new RuntimeException("您已提交试卷,请勿重复作答"); |
| | | } |
| | | StartExamVO startExamVO = new StartExamVO(); |
| | | startExamVO.setExamName(exam.getExamName()); |
| | | startExamVO.setId(hasJoin.getExamId()); |
| | |
| | | for (PaperSettingItem settingItem : settingList) { |
| | | Integer num = settingItem.getNum(); |
| | | Integer difficult = settingItem.getDifficult(); |
| | | if(0 == difficult){ |
| | | difficult = null; |
| | | } |
| | | //需要配置的题目数量为0则跳过 |
| | | if (num == null || num == 0) continue; |
| | | List<Question> questions = questionMapper.getRandomQuestion(settingItem.getSubjectId(), paperSetting.getQuestionType(), difficult, settingItem.getNum()); |
| | |
| | | childQuestionList.addAll(childQuestions); |
| | | } |
| | | paperFixQuestionVO.setQuestionList(childQuestionList); |
| | | examData.add(paperFixQuestionVO); |
| | | if (! CollectionUtils.isEmpty(childQuestionList)) { |
| | | examData.add(paperFixQuestionVO); |
| | | } |
| | | } |
| | | } |
| | | ExamSubmitTemp examSubmitTemp = new ExamSubmitTemp(); |
| | |
| | | doQuestionVO.setQuestionType(item.getQuestionType()); |
| | | //增加题目分数 |
| | | doQuestionVO.setQuestionScore(question.getScore()); |
| | | |
| | | // 题目副本 |
| | | QuestionAnswerCopyVO copy = new QuestionAnswerCopyVO(); |
| | | copy.setId(question.getId()); |
| | |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Result all() { |
| | | List<Exam> entities = baseMapper.selectList(null); |
| | | public Result all(ExamQuery query) { |
| | | List<Exam> entities; |
| | | // 判断如果examName为空或空字符串,则查询所有 |
| | | if (query.getExamName() == null || query.getExamName().isEmpty()) { |
| | | entities = baseMapper.selectList(null); |
| | | }else { |
| | | entities = baseMapper.selectList(new LambdaQueryWrapper<>(Exam.class).like(Exam::getExamName,query.getExamName())); |
| | | } |
| | | List<ExamVO> vos = entities.stream() |
| | | .map(entity -> ExamVO.getVoByEntity(entity, null)) |
| | | .map(entity -> { |
| | | ExamVO vo = new ExamVO(); |
| | | vo = ExamVO.getVoByEntity(entity, vo); |
| | | vo.setStatus(entity.getStatus().getDesc()); |
| | | return vo; |
| | | }) |
| | | .collect(Collectors.toList()); |
| | | return Result.ok().data(vos); |
| | | } |
| | |
| | | ExamSubmitTemp one = new LambdaQueryChainWrapper<>(examSubmitTempMapper) |
| | | .eq(ExamSubmitTemp::getExamId, submitData.getId()) |
| | | .eq(ExamSubmitTemp::getUserId, webContext.getCurrentUser().getId()) |
| | | .eq(ExamSubmitTemp::getDeleted, 0) |
| | | .one(); |
| | | |
| | | if (Objects.nonNull(one)) { |
| | |
| | | for (PaperFixQuestionVO titleItem : titleItems) { |
| | | for (DoQuestionVO doQuestionVO : titleItem.getQuestionList()) { |
| | | Integer questionId = doQuestionVO.getId(); |
| | | Optional<QuestionAnswerCopyVO> first = answerList.stream().filter(answer -> questionId.equals(answer.getId())).findFirst(); |
| | | if (first.isPresent()) { |
| | | QuestionAnswerCopyVO answerCopyVO = first.get(); |
| | | doQuestionVO.setQuestionAnswer(answerCopyVO.getCorrect()); |
| | | doQuestionVO.setAnalyze(answerCopyVO.getAnalyze()); |
| | | doQuestionVO.setDifficult(answerCopyVO.getDifficult()); |
| | | if(questionId!=null) { |
| | | Optional<QuestionAnswerCopyVO> first = answerList.stream().filter(answer -> questionId.equals(answer.getId())).findFirst(); |
| | | if (first.isPresent()) { |
| | | QuestionAnswerCopyVO answerCopyVO = first.get(); |
| | | doQuestionVO.setQuestionAnswer(answerCopyVO.getCorrect()); |
| | | doQuestionVO.setAnalyze(answerCopyVO.getAnalyze()); |
| | | doQuestionVO.setDifficult(answerCopyVO.getDifficult()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | /** |
| | | * 作废 |
| | | * |
| | | * @param examId |
| | | * @param id |
| | | * @return {@link Result } |
| | | * @author |
| | | */ |
| | |
| | | Date currentTime = new Date(); |
| | | Date startTime = examInfo.getStartTime(); |
| | | Date endTime = examInfo.getEndTime(); |
| | | if (currentTime.before(startTime)) { |
| | | examInfo.setStatus(ExamStatusEnum.NOT_START); |
| | | } else if (currentTime.after(startTime) && currentTime.before(endTime)) { |
| | | examInfo.setStatus(ExamStatusEnum.ING); |
| | | } else { |
| | | examInfo.setStatus(ExamStatusEnum.FINISHED); |
| | | } |
| | | ExamStatusEnum statusByTime = ExamStatusEnum.getStatusByTime(startTime, endTime, currentTime); |
| | | examInfo.setStatus(statusByTime); |
| | | // 修改当前的考试状态 |
| | | new LambdaUpdateChainWrapper<>(examMapper) |
| | | .eq(Exam::getId, id) |