龚焕茏
2024-07-01 93b0c663078aa47828d5aabe901a4b4c4ee92632
src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java
@@ -10,6 +10,7 @@
import com.ycl.jxkg.context.WebContext;
import com.ycl.jxkg.domain.entity.*;
import com.ycl.jxkg.domain.exam.PaperFixQuestionDTO;
import com.ycl.jxkg.domain.exam.PaperQuestion;
import com.ycl.jxkg.domain.exam.PaperQuestionSettingDTO;
import com.ycl.jxkg.domain.form.AddTimeForm;
import com.ycl.jxkg.domain.form.ExamForm;
@@ -17,11 +18,8 @@
import com.ycl.jxkg.domain.query.ExamQuery;
import com.ycl.jxkg.domain.question.QuestionObject;
import com.ycl.jxkg.domain.vo.*;
import com.ycl.jxkg.domain.vo.admin.exam.ExamPaperEditRequestVO;
import com.ycl.jxkg.domain.vo.admin.exam.ExamPaperMarkAnswerVO;
import com.ycl.jxkg.domain.vo.admin.exam.ExamPaperMarkVO;
import com.ycl.jxkg.domain.vo.student.exam.ExamPaperReadVO;
import com.ycl.jxkg.domain.vo.student.exam.ExamPaperSubmitVO;
import com.ycl.jxkg.enums.DeductTypeEnum;
import com.ycl.jxkg.enums.ExamPaperTypeEnum;
import com.ycl.jxkg.enums.QuestionTypeEnum;
@@ -32,11 +30,9 @@
import com.ycl.jxkg.server.WebsocketServer;
import com.ycl.jxkg.service.ExamPaperService;
import com.ycl.jxkg.service.ExamService;
import com.ycl.jxkg.utils.JsonUtil;
import com.ycl.jxkg.utils.PageUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
@@ -192,6 +188,15 @@
            startExamVO.setDoTime(hasJoin.getDoTime());
            return Result.ok(startExamVO);
        }
        // 响应数据
        StartExamVO startExamVO = new StartExamVO();
        startExamVO.setExamName(exam.getExamName());
        startExamVO.setId(exam.getId());
        startExamVO.setSuggestTime(examPaper.getSuggestTime());
        // 试卷内容
        List<PaperFixQuestionVO> examData;
        // 拿到题目副本数据
        List<QuestionAnswerCopyVO> questionAnswerCopyVOList = new ArrayList<>(32);
        // 将题目转换为可临时保存的题目结构。固定试卷和随序试卷的题目是直接保存到content字段的
        if (ExamPaperTypeEnum.Fixed.getCode().equals(examPaper.getPaperType())
                || ExamPaperTypeEnum.RandomOrder.getCode().equals(examPaper.getPaperType())) {
@@ -199,17 +204,14 @@
                throw new RuntimeException("试卷题目为空");
            }
            // 转换
            List<PaperFixQuestionVO> data = this.coverTo(examPaper);
            return Result.ok().data(data);
            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);
            // 试卷内容
            List<PaperFixQuestionVO> examData = new ArrayList<>(8);
            examData = new ArrayList<>(8);
            for (PaperQuestionSettingDTO paperSetting : paperSettingList) {
                PaperFixQuestionVO paperFixQuestionVO = new PaperFixQuestionVO();
                paperFixQuestionVO.setTitle(paperSetting.getTitle());
@@ -219,6 +221,7 @@
                if (paperSetting.getNum() > questions.size()) {
                    throw new RuntimeException("配置的题目数不足以生成试卷");
                }
                // 拿到题目后组装为可临时保存的题目结构
                List<DoQuestionVO> childQuestions = questions.stream().map(item -> {
                    DoQuestionVO doQuestionVO = new DoQuestionVO();
@@ -231,6 +234,13 @@
                    doQuestionVO.setId(item.getId());
                    doQuestionVO.setOriginalFile(item.getOriginalFile());
                    doQuestionVO.setAudioFile(item.getAudioFile());
                    // 题目副本
                    QuestionAnswerCopyVO copy = new QuestionAnswerCopyVO();
                    copy.setAnalyze(JSON.parseObject(item.getContent(), PaperQuestion.class).getAnalyze());
                    copy.setCorrect(item.getCorrect());
                    questionAnswerCopyVOList.add(copy);
                    return doQuestionVO;
                }).collect(Collectors.toList());
                paperFixQuestionVO.setQuestionList(childQuestions);
@@ -238,19 +248,15 @@
            }
            ExamSubmitTemp examSubmitTemp = new ExamSubmitTemp();
            examSubmitTemp.setExamId(id);
            //TODO
            examSubmitTemp.setStatus(ExamSubmitTempStatusEnum.temp);
            examSubmitTemp.setExamSubmit(JSON.toJSONString(examData));
            examSubmitTemp.setCreateTime(new Date());
            examSubmitTemp.setUserId(webContext.getCurrentUser().getId());
            //TODO
            examSubmitTemp.setMarkPaperStatus(ExamSubmitTempStatusEnum.temp);
            examSubmitTemp.setQuestionAnswerCopy(JSON.toJSONString(questionAnswerCopyVOList));
            examSubmitTempMapper.insert(examSubmitTemp);
            StartExamVO startExamVO = new StartExamVO();
            startExamVO.setExamName(exam.getExamName());
            startExamVO.setId(exam.getId());
            startExamVO.setTitleList(examData);
            startExamVO.setSuggestTime(examPaper.getSuggestTime());
            return Result.ok(startExamVO);
        }
        return Result.ok();
@@ -260,9 +266,10 @@
     * 将数据库存储的题目,转为可临时保存的题目结构
     *
     * @param examPaper 试卷
     * @param questionAnswerCopyVOList 题目副本集合
     * @return
     */
    private List<PaperFixQuestionVO> coverTo(ExamPaper examPaper) {
    private List<PaperFixQuestionVO> coverTo(ExamPaper examPaper, List<QuestionAnswerCopyVO> questionAnswerCopyVOList) {
        if (!StringUtils.hasText(examPaper.getContent())) {
            throw new RuntimeException("试卷未配置题目,请联系老师");
        }
@@ -275,6 +282,7 @@
                DoQuestionVO doQuestionVO = new DoQuestionVO();
                doQuestionVO.setTitle(question.getTitle());
                doQuestionVO.setQuestionType(item.getQuestionType());
                // 填空题需要抹除content(因为是答案)
                if (QuestionTypeEnum.GapFilling.getCode().equals(doQuestionVO.getQuestionType())) {
                    question.getItems().stream().forEach(option -> {
@@ -285,6 +293,13 @@
                doQuestionVO.setId(question.getId());
                doQuestionVO.setOriginalFile(question.getOriginalFile());
                doQuestionVO.setAudioFile(question.getAudioFile());
                // 题目副本
                QuestionAnswerCopyVO copy = new QuestionAnswerCopyVO();
                copy.setAnalyze(question.getAnalyze());
                copy.setCorrect(question.getCorrect());
                questionAnswerCopyVOList.add(copy);
                return doQuestionVO;
            }).collect(Collectors.toList());
            if (ExamPaperTypeEnum.RandomOrder.getCode().equals(examPaper.getPaperType())) {
@@ -498,11 +513,11 @@
        //插入exam_paper_answer(成绩表)
        ExamPaperScore examPaperScore = new ExamPaperScore();
        BeanUtils.copyProperties(examPaperMark,examPaperScore);
        examPaperScore.setUserScore(new BigDecimal(examPaperMark.getScore()));
        examPaperScore.setPaperScore(new BigDecimal(examPaperMark.getTotalScore()));
        examPaperScore.setScore(new BigDecimal(examPaperMark.getScore()));
        examPaperScore.setTotalScore(new BigDecimal(examPaperMark.getTotalScore()));
        examPaperScore.setJudgeUser(userId);
        examPaperScore.setCreateUser(examPaperMark.getUserId());
        examPaperScore.setAnswerTime(examPaperMark.getSubmitTime());
        examPaperScore.setUserId(examPaperMark.getUserId());
        examPaperScore.setSubmitTime(examPaperMark.getSubmitTime());
        examPaperScore.setPaperContent(JSON.toJSONString(examPaperMark.getTitleItems()));
        long questionCorrect =0;
        long questionCount=0;