linzhijie
2021-03-11 93af1c6ffb9ae0e894689ad3a37b548e57d54cff
src/main/java/com/ots/project/exam/service/impl/ExamPaperAnswerServiceImpl.java
@@ -1,4 +1,5 @@
package com.ots.project.exam.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ots.common.enums.QuestionTypeEnum;
@@ -26,15 +27,18 @@
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
public class ExamPaperAnswerServiceImpl implements ExamPaperAnswerService {
    private static final Logger log = LoggerFactory.getLogger(ExamPaperAnswerServiceImpl.class);
    @Autowired
    private TExamPaperMapper examPaperMapper;
    @Autowired
@@ -43,6 +47,7 @@
    private ITTextContentService textContentService;
    @Autowired
    private TQuestionMapper questionMapper;
    @Override
    public ExamPaperAnswerInfo calculateExamPaperAnswer(ExamPaperSubmitVM examPaperSubmitVM, ExamUser user) {
        ExamPaperAnswerInfo examPaperAnswerInfo = new ExamPaperAnswerInfo();
@@ -52,85 +57,103 @@
        List<ExamPaperTitleItemObject> examPaperTitleItemObjects = JsonUtil.toJsonListObject(frameTextContent, ExamPaperTitleItemObject.class);
        List<Integer> questionIds = examPaperTitleItemObjects.stream().flatMap(t -> t.getQuestionItems().stream().map(q -> q.getId())).collect(Collectors.toList());
        List<TQuestion> questions = questionMapper.selectByIds(questionIds);
        // 是否跳到下一段
        setWhichPart(examPaperSubmitVM, examPaperAnswerInfo, examPaperTitleItemObjects, questions);
        examPaperAnswerInfo.setExamPaper(examPaper);
        return examPaperAnswerInfo;
    }
    // 判断是否跳到下一段
    private void setWhichPart(ExamPaperSubmitVM examPaperSubmitVM, ExamPaperAnswerInfo examPaperAnswerInfo, List<ExamPaperTitleItemObject> examPaperTitleItemObjects, List<TQuestion> questions) {
        // 分片不足多少分不能答题,答题本应该的分数是否到了阀值。
        if (Objects.isNull(examPaperSubmitVM.getPartOrder())) {
            return;
        }
        int answerPartOrder = examPaperSubmitVM.getPartOrder();
        SubmitReport submitReport = new SubmitReport();
        if (Objects.isNull(answerPartOrder)) {
            submitReport.setJump("this");
            examPaperAnswerInfo.setSubmitReport(submitReport);
            return;
        }
        // 计算是否得分
        List<ExamPaperSubmitItemVM> answerItems = examPaperSubmitVM.getAnswerItems();
        // 用户答的选项
        // (questionId, content答的项)
        Map<Integer, String> answerContentMap = getAnswerContentMap(answerItems);
        // 原始分片
        Map<Integer, QuestionPart> partMap = getParts(examPaperTitleItemObjects);
        // 那一题是那一片
        // (questionId, partOrder)
        Map<Integer, Integer> questionPartOrdeMap = getQuestionPartOrdeMap(examPaperTitleItemObjects);
        // 用户答多少分得分
        // (partOrder, score)
        Map<Integer, Integer> partAnswerScoreMap = new HashMap<>();
        // 本段本来应该得多少分
        // (partOrder, score)
        Map<Integer, Integer> partQuestionScoreMap = new HashMap<>();
        // 用户本段耗时
        Map<Integer, Integer> partAnswerTimeMap = new HashMap<>();
        setAnswerScoreMap(questions, answerContentMap, questionPartOrdeMap, partAnswerScoreMap, partQuestionScoreMap);
        // 本应得多少分到了阀值。
//        System.out.println("本段应该得多少分:" + partQuestionScoreMap.get(answerPartOrder));
//        System.out.println("本段最低分:" + partMap.get(answerPartOrder).getLowestScore());
//        System.out.println("自己得分:" + partAnswerScoreMap.get(answerPartOrder));
//        if (Objects.nonNull(answerPartOrder) && partQuestionScoreMap.get(answerPartOrder) >= partMap.get(answerPartOrder).getLowestScore()) {
//            if (partAnswerScoreMap.get(answerPartOrder) < partQuestionScoreMap.get(answerPartOrder)) {
//                submitReport.setJump("next");
//            } else {
//                submitReport.setJump("this");
//            }
//        } else {
//            submitReport.setJump("this");
//        }
        examPaperAnswerInfo.setSubmitReport(submitReport);
        // 时间的判断
    }
    private void setAnswerScoreMap(List<TQuestion> questions, Map<Integer, String> answerContentMap, Map<Integer, Integer> questionPartOrdeMap, Map<Integer, Integer> partAnswerScoreMap, Map<Integer, Integer> partQuestionScoreMap) {
        for (TQuestion tQuestion : questions) {
            // 题目的段
            int partOrder = questionPartOrdeMap.get(tQuestion.getId().intValue());
            // 初始值集合
            if (Objects.isNull(partQuestionScoreMap.get(partOrder))){
                partQuestionScoreMap.put(partOrder, 0);
            }
            if (Objects.isNull(partAnswerScoreMap.get(partOrder))) {
                partAnswerScoreMap.put(partOrder, 0);
            }
            // 本来应该的多少分
            // 用户能答多少分得分
            if (Objects.nonNull(answerContentMap.get(tQuestion.getId().intValue()))) {
                setAnswerScoreMap(partQuestionScoreMap, tQuestion, partOrder);
            }
            // 分数的判断
//            System.out.println("题目号:" + tQuestion.getId().intValue());
//            System.out.println("题目的正确答案:" + tQuestion.getCorrect());
//            System.out.println("自己选择:" + answerContentMap.get(tQuestion.getId().intValue()));
            if (Objects.equals(tQuestion.getCorrect(), answerContentMap.get(tQuestion.getId().intValue()))) {
                // 用户能答多少分得分
                setAnswerScoreMap(partAnswerScoreMap, tQuestion, partOrder);
            }
        }
    }
    private Map<Integer, Integer> getQuestionPartOrdeMap(List<ExamPaperTitleItemObject> examPaperTitleItemObjects) {
        Map<Integer, Integer> questionPartOrdeMap = new HashMap<>();
        for (ExamPaperTitleItemObject examPaperTitleItemObject : examPaperTitleItemObjects) {
@@ -141,15 +164,17 @@
        }
        return questionPartOrdeMap;
    }
    private Map<Integer, QuestionPart> getParts(List<ExamPaperTitleItemObject> examPaperTitleItemObjects) {
        List<QuestionPart> parts = examPaperTitleItemObjects.get(0).getParts();
        // (partOrder, questionPart)
        Map<Integer, QuestionPart> partMap = new HashMap<>();
        for (QuestionPart questionPart : parts) {
            partMap.put(questionPart.getPartOrder(), questionPart);
        }
        return partMap;
    }
    private Map<Integer, String> getAnswerContentMap(List<ExamPaperSubmitItemVM> answerItems) {
        Map<Integer, String> answerContentMap = new HashMap<>();
        answerItems.stream().forEach(answerItem ->{
@@ -157,6 +182,7 @@
        });
        return answerContentMap;
    }
    private void setAnswerScoreMap(Map<Integer, Integer> partQuestionScoreMap, TQuestion tQuestion, int partOrder) {
        int questonScore = Objects.nonNull(tQuestion.getScore()) ? tQuestion.getScore().intValue() : 0;
        if (Objects.nonNull(partQuestionScoreMap.get(partOrder))) {
@@ -166,13 +192,24 @@
            partQuestionScoreMap.put(partOrder, questonScore);
        }
    }
    /**
     * 用户提交答案的转化存储对象
     *
     * @param question               question
     * @param customerQuestionAnswer customerQuestionAnswer
     * @param examPaper              examPaper
     * @param itemOrder              itemOrder
     * @param user                   user
     * @param now                    now
     * @return ExamPaperQuestionCustomerAnswer
     */
    private ExamPaperQuestionCustomerAnswer ExamPaperQuestionCustomerAnswerFromVM(TQuestion question, ExamPaperSubmitItemVM customerQuestionAnswer, TExamPaper examPaper, Integer itemOrder, ExamUser user, Date now) {
        ExamPaperQuestionCustomerAnswer examPaperQuestionCustomerAnswer = new ExamPaperQuestionCustomerAnswer();
        examPaperQuestionCustomerAnswer.setQuestionId(question.getId().intValue());
        examPaperQuestionCustomerAnswer.setExamPaperId(examPaper.getId().intValue());
        // examPaperQuestionCustomerAnswer.setWhichPart(question.getScore().intValue());
        // examPaperQuestionCustomerAnswer.setSubjectId(examPaper.getSubjectId().intValue());
        examPaperQuestionCustomerAnswer.setItemOrder(itemOrder);
        examPaperQuestionCustomerAnswer.setCreateTime(now);
        examPaperQuestionCustomerAnswer.setCreateUser(user.getId());
@@ -185,7 +222,14 @@
        }
        return examPaperQuestionCustomerAnswer;
    }
    /**
     * 判断提交答案是否正确,保留用户提交的答案
     *
     * @param examPaperQuestionCustomerAnswer examPaperQuestionCustomerAnswer
     * @param question                        question
     * @param customerQuestionAnswer          customerQuestionAnswer
     */
    private void setSpecialFromVM(ExamPaperQuestionCustomerAnswer examPaperQuestionCustomerAnswer, TQuestion question, ExamPaperSubmitItemVM customerQuestionAnswer) {
        QuestionTypeEnum questionTypeEnum = QuestionTypeEnum.fromCode(examPaperQuestionCustomerAnswer.getQuestionType());
        switch (questionTypeEnum) {
@@ -212,47 +256,60 @@
                break;
        }
    }
    @Override
    public PageInfo<ExamPaperAnswer> studentPage(ExamPaperAnswerPageVM requestVM) {
        return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize(), "id desc").doSelectPageInfo(() ->
                examPaperAnswerMapper.studentPage(requestVM));
    }
    @Override
    public String judge(ExamPaperSubmitVM examPaperSubmitVM) {
        return null;
    }
    @Override
    public ExamPaperSubmitVM examPaperAnswerToVM(Integer id) {
        return null;
    }
    @Override
    public Integer selectAllCount() {
        return null;
    }
    @Override
    public List<Integer> selectMothCount() {
        return null;
    }
    @Override
    public int deleteById(Integer id) {
        return 0;
    }
    @Override
    public int insert(ExamPaperAnswer record) {
        return examPaperAnswerMapper.insertSelective(record);
    }
    @Override
    public int insertByFilter(ExamPaperAnswer record) {
        return examPaperAnswerMapper.insertSelective(record);
    }
    @Override
    public ExamPaperAnswer selectById(Integer id) {
        return null;
    }
    @Override
    public int updateByIdFilter(ExamPaperAnswer record) {
        return 0;
    }
    @Override
    public int updateById(ExamPaperAnswer record) {
        return 0;