BatchExamServiceImpl.java 6.01 KB
package com.meishu.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.meishu.dto.exam.ExamPaperDTO;
import com.meishu.mapper.BatchExamsStudentsMapper;
import com.meishu.mapper.ExerciseDoneHistoryMapper;
import com.meishu.mapper.PaperDictMapper;
import com.meishu.model.*;
import com.meishu.mapper.BatchExamMapper;
import com.meishu.service.BatchExamService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.meishu.util.ConstantUtils;
import com.meishu.vo.exam.ExamPaperVO;
import com.meishu.vo.exam.ExamsVO;
import com.meishu.vo.exercise.ExercisesWithAnswerVO;
import com.meishu.vo.paper.ExercisesVO;
import com.meishu.vo.student.StudentVO;
import net.sf.json.JSONArray;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author Tuyp
 * @since 2023-07-12
 */
@Service
public class BatchExamServiceImpl extends ServiceImpl<BatchExamMapper, BatchExamDO> implements BatchExamService {

    @Autowired
    private BatchExamsStudentsMapper batchExamsStudentsMapper;

    @Autowired
    private PaperDictMapper paperDictMapper;

    @Autowired
    private ExerciseDoneHistoryMapper exerciseDoneHistoryMapper;

    public List<ExamsVO> exams(BatchExamDO batchExamDO) {

        List<ExamsVO> exams = this.baseMapper.exams(batchExamDO.getBatchId());

        for (ExamsVO examsVO : exams) {
            //考生名单
            List<StudentVO> studentVOS = batchExamsStudentsMapper.batchExamStudents(examsVO.getId());
            examsVO.setStudentVOS(studentVOS);
        }
        return exams;
    }

    @Transactional(rollbackFor = Exception.class)
    public String addExam(BatchExamDO batchExamDO) {
        this.baseMapper.insert(batchExamDO);
        return ConstantUtils.ADD_SUCCESS;
    }

    @Transactional(rollbackFor = Exception.class)
    public String deleteExam(BatchExamDO batchExamDO) {

        this.baseMapper.deleteById(batchExamDO.getId());

        batchExamsStudentsMapper.delete(new QueryWrapper<BatchExamStudentsDO>()
                .lambda()
                .eq(BatchExamStudentsDO::getBatchExamId, batchExamDO.getId()));

        return ConstantUtils.DELETE_SUCCESS;
    }

    public String updateExam(BatchExamDO batchExamDO) {

        this.baseMapper.updateById(batchExamDO);

        return ConstantUtils.SET_SUCCESS;
    }

    public ExamPaperVO examPaper(ExamPaperDTO examPaperDTO) {

        ExamPaperVO examPaperVO = new ExamPaperVO();
        BatchExamDO batchExamDO = this.baseMapper.selectById(examPaperDTO.getExamId());

        examPaperVO.setStartDate(batchExamDO.getStartDate());
        examPaperVO.setEndDate(batchExamDO.getEndDate());
        examPaperVO.setExamName(batchExamDO.getExamName());

        //查看是否已经查看过卷子,没有的话重新生成一次,有的话就用以前的
        int count = exerciseDoneHistoryMapper.selectCount(new QueryWrapper<ExerciseDoneHistoryDO>()
                .lambda()
                .eq(ExerciseDoneHistoryDO::getStudentId, examPaperDTO.getUserId())
                .eq(ExerciseDoneHistoryDO::getBatchExamId, examPaperDTO.getExamId()));

        //试卷 不返回答案
        List<ExercisesVO> exercisesVOS = new ArrayList<>();

        if (count == 0) {
            List<ExercisesWithAnswerVO> exercisesWithAnswerVOS = new ArrayList<>();
            //查卷子题型
            List<String> types = paperDictMapper.exerciseTypes(examPaperDTO.getPaperId());
            //每个 题型的题目随机 然后组卷
            for (String type : types) {
                List<ExercisesWithAnswerVO> exerciseTmp = paperDictMapper.exercisesWithAnswer(examPaperDTO.getPaperId(), type);
                Collections.shuffle(exerciseTmp);
                exercisesWithAnswerVOS.addAll(exerciseTmp);
            }
            //返回
            int i = 1;
            for (ExercisesWithAnswerVO exercise : exercisesWithAnswerVOS) {
                ExercisesVO exercisesVO = new ExercisesVO();
                BeanUtils.copyProperties(exercise, exercisesVO);
                ExerciseDoneHistoryDO exerciseDoneHistoryDO = new ExerciseDoneHistoryDO();
                exerciseDoneHistoryDO.setStudentId(examPaperDTO.getUserId());
                exerciseDoneHistoryDO.setBatchExamId(examPaperDTO.getExamId());
                exerciseDoneHistoryDO.setPaperId(examPaperDTO.getPaperId());
                exerciseDoneHistoryDO.setExerciseId(exercise.getId());
                exerciseDoneHistoryDO.setOrderNo(i);
                exerciseDoneHistoryMapper.insert(exerciseDoneHistoryDO);
                if ("填空题".equals(exercise.getExerciseType()) || "主观题".equals(exercise.getExerciseType())) {
                    JSONArray jsonArray = JSONArray.fromObject(exercise.getRightAnswer());
                    exercisesVO.setCnt(jsonArray.size());
                }
                exercisesVO.setId(exerciseDoneHistoryDO.getId());
                exercisesVOS.add(exercisesVO);
                i++;
            }
        } else {
            List<ExercisesWithAnswerVO> exercisesWithAnswerVOS = paperDictMapper.examExercises(examPaperDTO.getExamId(), examPaperDTO.getUserId(), examPaperDTO.getPaperId());
            for (ExercisesWithAnswerVO exercise : exercisesWithAnswerVOS) {
                ExercisesVO exercisesVO = new ExercisesVO();
                BeanUtils.copyProperties(exercise, exercisesVO);
                if ("填空题".equals(exercise.getExerciseType()) || "主观题".equals(exercise.getExerciseType())) {
                    JSONArray jsonArray = JSONArray.fromObject(exercise.getRightAnswer());
                    exercisesVO.setCnt(jsonArray.size());
                }
                exercisesVOS.add(exercisesVO);
            }
        }

        examPaperVO.setExercises(exercisesVOS);
        return examPaperVO;
    }

}