xiangpei
2024-06-28 6043c55ce5a3c4f146e20286a707f67d09384674
src/main/java/com/ycl/jxkg/service/impl/ExamPaperScoreServiceImpl.java
New file
@@ -0,0 +1,290 @@
package com.ycl.jxkg.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ycl.jxkg.domain.ExamPaperAnswerInfo;
import com.ycl.jxkg.domain.entity.*;
import com.ycl.jxkg.domain.other.ExamPaperAnswerUpdate;
import com.ycl.jxkg.domain.other.KeyValue;
import com.ycl.jxkg.domain.vo.admin.paper.ExamPaperAnswerPageRequestVO;
import com.ycl.jxkg.domain.vo.student.exam.ExamPaperSubmitItemVO;
import com.ycl.jxkg.domain.vo.student.exam.ExamPaperSubmitVO;
import com.ycl.jxkg.domain.vo.student.exampaper.ExamPaperAnswerPageResponseVO;
import com.ycl.jxkg.domain.vo.student.exampaper.ExamPaperAnswerPageVO;
import com.ycl.jxkg.enums.ExamPaperAnswerStatusEnum;
import com.ycl.jxkg.enums.ExamPaperTypeEnum;
import com.ycl.jxkg.enums.QuestionTypeEnum;
import com.ycl.jxkg.mapper.ExamPaperScoreMapper;
import com.ycl.jxkg.mapper.ExamPaperMapper;
import com.ycl.jxkg.mapper.QuestionMapper;
import com.ycl.jxkg.mapper.TaskExamCustomerAnswerMapper;
import com.ycl.jxkg.service.ExamPaperScoreService;
import com.ycl.jxkg.service.ExamPaperScoreDetailService;
import com.ycl.jxkg.service.TextContentService;
import com.ycl.jxkg.utils.DateTimeUtil;
import com.ycl.jxkg.utils.ExamUtil;
import com.ycl.jxkg.utils.JsonUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class ExamPaperScoreServiceImpl extends ServiceImpl<ExamPaperScoreMapper, ExamPaperScore> implements ExamPaperScoreService {
    private final ExamPaperScoreMapper examPaperScoreMapper;
    private final ExamPaperMapper examPaperMapper;
    private final TextContentService textContentService;
    private final QuestionMapper questionMapper;
    private final ExamPaperScoreDetailService examPaperScoreDetailService;
    private final TaskExamCustomerAnswerMapper taskExamCustomerAnswerMapper;
    @Override
    public PageInfo<ExamPaperScore> studentPage(ExamPaperAnswerPageVO requestVM) {
        return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize(), "id desc").doSelectPageInfo(() ->
                examPaperScoreMapper.studentPage(requestVM));
    }
    @Override
    public ExamPaperAnswerInfo calculateExamPaperAnswer(ExamPaperSubmitVO examPaperSubmitVO, User user) {
        ExamPaperAnswerInfo examPaperAnswerInfo = new ExamPaperAnswerInfo();
        Date now = new Date();
        ExamPaper examPaper = examPaperMapper.selectById(examPaperSubmitVO.getId());
        ExamPaperTypeEnum paperTypeEnum = ExamPaperTypeEnum.fromCode(examPaper.getPaperType());
        //任务试卷只能做一次
        if (paperTypeEnum == ExamPaperTypeEnum.RandomOrder) {
            ExamPaperScore examPaperScore = examPaperScoreMapper.getByPidUid(examPaperSubmitVO.getId(), user.getId());
            if (null != examPaperScore)
                return null;
        }
        //TODO:待完成
//        String frameTextContent = textContentService.getById(examPaper.getFrameTextContentId()).getContent();
//        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<Question> questions = questionMapper.selectByIds(questionIds);
//        //将题目结构的转化为题目答案
//        List<ExamPaperQuestionCustomerAnswer> examPaperQuestionCustomerAnswers = examPaperTitleItemObjects.stream()
//                .flatMap(t -> t.getQuestionItems().stream()
//                        .map(q -> {
//                            Question question = questions.stream().filter(tq -> tq.getId().equals(q.getId())).findFirst().get();
//                            ExamPaperSubmitItemVO customerQuestionAnswer = examPaperSubmitVO.getAnswerItems().stream()
//                                    .filter(tq -> tq.getQuestionId().equals(q.getId()))
//                                    .findFirst()
//                                    .orElse(null);
//                            return ExamPaperQuestionCustomerAnswerFromVM(question, customerQuestionAnswer, examPaper, q.getItemOrder(), user, now);
//                        })
//                ).collect(Collectors.toList());
//
//        ExamPaperAnswer examPaperAnswer = ExamPaperAnswerFromVM(examPaperSubmitVO, examPaper, examPaperQuestionCustomerAnswers, user, now);
//        examPaperAnswerInfo.setExamPaper(examPaper);
//        examPaperAnswerInfo.setExamPaperAnswer(examPaperAnswer);
//        examPaperAnswerInfo.setExamPaperQuestionCustomerAnswers(examPaperQuestionCustomerAnswers);
        return examPaperAnswerInfo;
    }
    @Override
    @Transactional
    public String judge(ExamPaperSubmitVO examPaperSubmitVO) {
//        ExamPaperScore examPaperScore = examPaperScoreMapper.selectById(examPaperSubmitVO.getId());
//        List<ExamPaperSubmitItemVO> judgeItems = examPaperSubmitVO.getAnswerItems().stream().filter(d -> d.getDoRight() == null).collect(Collectors.toList());
//        List<ExamPaperAnswerUpdate> examPaperAnswerUpdates = new ArrayList<>(judgeItems.size());
//        Integer customerScore = examPaperScore.getUserScore();
//        Integer questionCorrect = examPaperScore.getQuestionCorrect();
//        for (ExamPaperSubmitItemVO d : judgeItems) {
//            ExamPaperAnswerUpdate examPaperAnswerUpdate = new ExamPaperAnswerUpdate();
//            examPaperAnswerUpdate.setId(d.getId());
//            examPaperAnswerUpdate.setCustomerScore(ExamUtil.scoreFromVM(d.getScore()));
//            boolean doRight = examPaperAnswerUpdate.getCustomerScore().equals(ExamUtil.scoreFromVM(d.getQuestionScore()));
//            examPaperAnswerUpdate.setDoRight(doRight);
//            examPaperAnswerUpdates.add(examPaperAnswerUpdate);
//            customerScore += examPaperAnswerUpdate.getCustomerScore();
//            if (examPaperAnswerUpdate.getDoRight()) {
//                ++questionCorrect;
//            }
//        }
//        examPaperScore.setUserScore(customerScore);
//        examPaperScore.setQuestionCorrect(questionCorrect);
//        examPaperScore.setStatus(ExamPaperAnswerStatusEnum.Complete.getCode());
//        examPaperScoreMapper.updateById(examPaperScore);
//        examPaperScoreDetailService.updateScore(examPaperAnswerUpdates);
//
//        ExamPaperTypeEnum examPaperTypeEnum = ExamPaperTypeEnum.fromCode(examPaperScore.getPaperType());
//        switch (examPaperTypeEnum) {
//            case RandomOrder:
                //TODO:待完成
                //任务试卷批改完成后,需要更新任务的状态
//                ExamPaper examPaper = examPaperMapper.selectById(examPaperAnswer.getExamPaperId());
//                Integer taskId = examPaper.getTaskExamId();
//                Integer userId = examPaperAnswer.getCreateUser();
//                TaskExamCustomerAnswer taskExamCustomerAnswer = taskExamCustomerAnswerMapper.getByTUid(taskId, userId);
//                TextContent textContent = textContentService.getById(taskExamCustomerAnswer.getTextContentId());
//                List<TaskItemAnswerObject> taskItemAnswerObjects = JsonUtil.toJsonListObject(textContent.getContent(), TaskItemAnswerObject.class);
//                taskItemAnswerObjects.stream()
//                        .filter(d -> d.getExamPaperAnswerId().equals(examPaperAnswer.getId()))
//                        .findFirst().ifPresent(taskItemAnswerObject -> taskItemAnswerObject.setStatus(examPaperAnswer.getStatus()));
//                textContentService.jsonConvertUpdate(textContent, taskItemAnswerObjects, null);
//                textContentService.updateById(textContent);
//                break;
//            default:
//                break;
//        }
//        return ExamUtil.scoreToVM(customerScore);
        return "1";
    }
    @Override
    public ExamPaperSubmitVO examPaperAnswerToVM(Integer id) {
        ExamPaperSubmitVO examPaperSubmitVO = new ExamPaperSubmitVO();
//        ExamPaperScore examPaperScore = examPaperScoreMapper.selectById(id);
//        examPaperSubmitVO.setId(examPaperScore.getId());
//        examPaperSubmitVO.setDoTime(examPaperScore.getDoTime());
//        examPaperSubmitVO.setScore(ExamUtil.scoreToVM(examPaperScore.getUserScore()));
//        List<ExamPaperScoreDetail> examPaperScoreDetails = examPaperScoreDetailService.selectListByPaperAnswerId(examPaperScore.getId());
//        List<ExamPaperSubmitItemVO> examPaperSubmitItemVOS = examPaperScoreDetails.stream()
//                .map(a -> examPaperScoreDetailService.examPaperQuestionCustomerAnswerToVM(a))
//                .collect(Collectors.toList());
//        examPaperSubmitVO.setAnswerItems(examPaperSubmitItemVOS);
        return examPaperSubmitVO;
    }
    @Override
    public Integer selectAllCount() {
        return examPaperScoreMapper.selectAllCount();
    }
    @Override
    public Integer selectAllQuestionCount() {
        return examPaperScoreMapper.selectAllQuestionCount();
    }
    @Override
    public List<Integer> selectMothCount() {
        Date startTime = DateTimeUtil.getMonthStartDay();
        Date endTime = DateTimeUtil.getMonthEndDay();
        List<KeyValue> mouthCount = examPaperScoreMapper.selectCountByDate(startTime, endTime);
        List<String> mothStartToNowFormat = DateTimeUtil.MothStartToNowFormat();
        return mothStartToNowFormat.stream().map(md -> {
            KeyValue keyValue = mouthCount.stream().filter(kv -> kv.getName().equals(md)).findAny().orElse(null);
            return null == keyValue ? 0 : keyValue.getValue();
        }).collect(Collectors.toList());
    }
    /**
     * 用户提交答案的转化存储对象
     *
     * @param question               question
     * @param customerQuestionAnswer customerQuestionAnswer
     * @param examPaper              examPaper
     * @param itemOrder              itemOrder
     * @param user                   user
     * @param now                    now
     * @return ExamPaperQuestionCustomerAnswer
     */
    private ExamPaperScoreDetail ExamPaperQuestionCustomerAnswerFromVM(Question question, ExamPaperSubmitItemVO customerQuestionAnswer, ExamPaper examPaper, Integer itemOrder, User user, Date now) {
        ExamPaperScoreDetail examPaperScoreDetail = new ExamPaperScoreDetail();
        examPaperScoreDetail.setQuestionId(question.getId());
        examPaperScoreDetail.setExamPaperId(examPaper.getId());
        examPaperScoreDetail.setQuestionScore(null);
        examPaperScoreDetail.setSubjectId(examPaper.getSubjectId());
        examPaperScoreDetail.setItemOrder(itemOrder);
        examPaperScoreDetail.setCreateTime(now);
        examPaperScoreDetail.setCreateUser(user.getId());
        examPaperScoreDetail.setQuestionType(question.getQuestionType());
        examPaperScoreDetail.setQuestionContent(question.getContent());
        if (null == customerQuestionAnswer) {
            examPaperScoreDetail.setCustomerScore(0);
        } else {
            setSpecialFromVM(examPaperScoreDetail, question, customerQuestionAnswer);
        }
        return examPaperScoreDetail;
    }
    /**
     * 判断提交答案是否正确,保留用户提交的答案
     *
     * @param examPaperScoreDetail examPaperQuestionCustomerAnswer
     * @param question                        question
     * @param customerQuestionAnswer          customerQuestionAnswer
     */
    private void setSpecialFromVM(ExamPaperScoreDetail examPaperScoreDetail, Question question, ExamPaperSubmitItemVO customerQuestionAnswer) {
        QuestionTypeEnum questionTypeEnum = QuestionTypeEnum.fromCode(examPaperScoreDetail.getQuestionType());
        switch (questionTypeEnum) {
            case SingleChoice:
            case TrueFalse:
                examPaperScoreDetail.setAnswer(customerQuestionAnswer.getContent());
                examPaperScoreDetail.setDoRight(question.getCorrect().equals(customerQuestionAnswer.getContent()));
                examPaperScoreDetail.setCustomerScore(examPaperScoreDetail.getDoRight() ? null : 0);
                break;
            case MultipleChoice:
                String customerAnswer = ExamUtil.contentToString(customerQuestionAnswer.getContentArray());
                examPaperScoreDetail.setAnswer(customerAnswer);
                examPaperScoreDetail.setDoRight(customerAnswer.equals(question.getCorrect()));
                examPaperScoreDetail.setCustomerScore(examPaperScoreDetail.getDoRight() ? null : 0);
                break;
            case GapFilling:
                String correctAnswer = JsonUtil.toJsonStr(customerQuestionAnswer.getContentArray());
                examPaperScoreDetail.setAnswer(correctAnswer);
                examPaperScoreDetail.setCustomerScore(0);
                break;
            default:
                examPaperScoreDetail.setAnswer(customerQuestionAnswer.getContent());
                examPaperScoreDetail.setCustomerScore(0);
                break;
        }
    }
    private ExamPaperScore ExamPaperAnswerFromVM(ExamPaperSubmitVO examPaperSubmitVO, ExamPaper examPaper, List<ExamPaperScoreDetail> examPaperScoreDetails, User user, Date now) {
        Integer systemScore = examPaperScoreDetails.stream().mapToInt(a -> a.getCustomerScore()).sum();
        long questionCorrect = examPaperScoreDetails.stream().filter(a -> a.getCustomerScore().equals(a.getQuestionScore())).count();
        ExamPaperScore examPaperScore = new ExamPaperScore();
        //TODO:待完成
//        examPaperAnswer.setPaperName(examPaper.getName());
//        examPaperAnswer.setDoTime(examPaperSubmitVO.getDoTime());
//        examPaperAnswer.setExamPaperId(examPaper.getId());
//        examPaperAnswer.setCreateUser(user.getId());
//        examPaperAnswer.setCreateTime(now);
//        examPaperAnswer.setSubjectId(examPaper.getSubjectId());
//        examPaperAnswer.setQuestionCount(examPaper.getQuestionCount());
//        examPaperAnswer.setPaperScore(examPaper.getScore());
//        examPaperAnswer.setPaperType(examPaper.getPaperType());
//        examPaperAnswer.setSystemScore(systemScore);
//        examPaperAnswer.setUserScore(systemScore);
//        examPaperAnswer.setTaskExamId(examPaper.getTaskExamId());
//        examPaperAnswer.setQuestionCorrect((int) questionCorrect);
//        boolean needJudge = examPaperQuestionCustomerAnswers.stream().anyMatch(d -> QuestionTypeEnum.needSaveTextContent(d.getQuestionType()));
//        if (needJudge) {
//            examPaperAnswer.setStatus(ExamPaperAnswerStatusEnum.WaitJudge.getCode());
//        } else {
//            examPaperAnswer.setStatus(ExamPaperAnswerStatusEnum.Complete.getCode());
//        }
        return examPaperScore;
    }
    @Override
    public PageInfo<ExamPaperAnswerPageResponseVO> adminPage(ExamPaperAnswerPageRequestVO requestVM) {
        return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize()).doSelectPageInfo(() ->
                examPaperScoreMapper.adminPage(requestVM));
    }
    @Override
    public List<ExamPaperAnswerPageResponseVO> list(ExamPaperAnswerPageRequestVO requestVM) {
        return examPaperScoreMapper.adminPage(requestVM);
    }
    @Override
    public PageInfo<ExamPaperAnswerPageResponseVO> pageExamPaper(ExamPaperAnswerPageRequestVO model) {
        return PageHelper.startPage(model.getPageIndex(), model.getPageSize()).doSelectPageInfo(() ->
                examPaperScoreMapper.pageExamPaper(model));
    }
}