智慧保安后台管理-外网
Administrator
2022-03-01 7c2c09439da3dccf1e032e89e1cb950b8fa1cc26
src/main/java/org/springblade/modules/simulateexam/service/impl/SimulateExamRecordServiceImpl.java
@@ -3,16 +3,32 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.redisson.misc.Hash;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition;
import org.springblade.modules.exam.entity.ExamAnswerRecord;
import org.springblade.modules.exam.entity.ExamScore;
import org.springblade.modules.exam.entity.ExamSubjectChoices;
import org.springblade.modules.exam.service.ExamPaperService;
import org.springblade.modules.exam.service.ExamSubjectChoicesService;
import org.springblade.modules.exam.vo.ExamSubjectChoicesVO;
import org.springblade.modules.simulateexam.entity.SimulateExamAnswerRecord;
import org.springblade.modules.simulateexam.entity.SimulateExamRecord;
import org.springblade.modules.simulateexam.mapper.SimulateExamRecordMapper;
import org.springblade.modules.simulateexam.service.SimulateExamAnswerRecordService;
import org.springblade.modules.simulateexam.service.SimulateExamRecordService;
import org.springblade.modules.simulateexam.vo.SimulateExamRecordVO;
import org.springblade.modules.system.entity.User;
import org.springblade.modules.system.service.IUserService;
import org.springblade.modules.training.entity.TrainingRegistration;
import org.springblade.modules.vip.entity.VipTopic;
import org.springblade.modules.vip.service.VipTopicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.lang.reflect.Array;
import java.util.*;
import java.util.stream.Collectors;
/**
 *  模拟考试记录服务实现类
@@ -23,6 +39,20 @@
@Service
public class SimulateExamRecordServiceImpl extends ServiceImpl<SimulateExamRecordMapper, SimulateExamRecord> implements SimulateExamRecordService {
   @Autowired
   private ExamSubjectChoicesService examSubjectChoicesService;
   @Autowired
   private VipTopicService vipTopicService;
   @Autowired
   private IUserService userService;
   @Autowired
   private ExamPaperService examPaperService;
   @Autowired
   private SimulateExamAnswerRecordService simulateExamAnswerRecordService;
   /**
    * 自定义分页查询模拟考试记录数据
@@ -34,4 +64,180 @@
   public IPage<SimulateExamRecordVO> selectSimulateExamRecordPage(IPage<SimulateExamRecordVO> page, SimulateExamRecordVO simulateExamRecord) {
      return page.setRecords(baseMapper.selectSimulateExamRecordPage(page, simulateExamRecord));
   }
   /**
    * 首次点击开始考试,创建模拟考试,并返回考试
    * @param simulateExamRecord 模拟考试记录对象信息
    * @return
    */
   @Override
   public Object insertSimulateExamRecord(SimulateExamRecord simulateExamRecord) {
      //创建返回信息map
      Map<String, Object> map = new HashMap<>();
      //使用身份证号码匹配人员信息(user_id)
      User user = new User();
      user.setIsDeleted(0);
      user.setStatus(1);
      user.setCardid(simulateExamRecord.getIdCardNo());
      List<User> list = userService.list(Condition.getQueryWrapper(user));
      List<ExamSubjectChoicesVO> choicesVOList = new ArrayList<>();
      if (list.size()>0){
         User user1 = list.get(0);
         //查询当前人员的考试题库,已缴费id
         VipTopic vipTopic = new VipTopic();
         vipTopic.setUserId(user1.getId());
         VipTopic topic = vipTopicService.getOne(Condition.getQueryWrapper(vipTopic));
         //从当前人员考试题库随机取60题存入
         if (null!=topic){
            List<String> list1 = Arrays.asList(topic.getTopicIds().split(","));
            //获取随机的题目
            List<String> radio = list1.subList(0, 49);
            List<String> checkbox = list1.subList(50, 69);
            List<String> judge = list1.subList(70, 109);
            List<String> sort = list1.subList(110, 119);
            //随机题目
            List<ExamSubjectChoicesVO> radioRandomSubjectList = examPaperService.queryRandomSubjectList(radio,25);
            List<ExamSubjectChoicesVO> checkboxRandomSubjectList = examPaperService.queryRandomSubjectList(checkbox,10);
            List<ExamSubjectChoicesVO> judgeRandomSubjectList = examPaperService.queryRandomSubjectList(judge,20);
//            List<ExamSubjectChoicesVO> sortRandomSubjectList = examPaperService.queryRandomSubjectList(sort,5);
            //合并集合数据
            choicesVOList.addAll(radioRandomSubjectList);
            choicesVOList.addAll(checkboxRandomSubjectList);
            choicesVOList.addAll(judgeRandomSubjectList);
//            choicesVOList.addAll(sortRandomSubjectList);
            //取出考试id
            List<Long> longList = choicesVOList.stream().map(ExamSubjectChoicesVO::getId).collect(Collectors.toList());
            //装换为字符串
            List<String> list2 = new ArrayList<>();
            for (Long aLong : longList) {
               list2.add(aLong.toString());
            }
            String collect = list2.stream().collect(Collectors.joining(","));
            //设置题目信息
            simulateExamRecord.setSubjectIds(collect);
            simulateExamRecord.setStartTime(new Date());
            //考试剩余时长初始值为60分钟
            simulateExamRecord.setAnswerTime(60*60*1000L);
            //考试中,开始计时
            simulateExamRecord.setStatus(1);
            //新增模拟考试记录信息
            boolean status = this.save(simulateExamRecord);
            ExamSubjectChoices examSubjectChoices = new ExamSubjectChoices();
            examSubjectChoices.setId(choicesVOList.get(0).getId());
            ExamSubjectChoicesVO examSubjectChoicesVO = examSubjectChoicesService.selectExamSubjectChoicesInfo(examSubjectChoices);
            if (status){
               map.put("simulateExamRecord",simulateExamRecord);
               map.put("examSubjectInfo",choicesVOList);
               map.put("examSubjectChoicesVO",examSubjectChoicesVO);
               //返回信息
               return map;
            }
         }else {
            throw new ServiceException("未查询到该人员缴费信息");
         }
      }else {
         throw new ServiceException("未查询到该人员信息");
      }
      //返回数据
      return map;
   }
   /**
    * 暂停模拟考试
    * @param simulateExamRecord
    * @return
    */
   @Override
   public Object pauseExam(SimulateExamRecord simulateExamRecord) {
      simulateExamRecord.setStatus(2);
      //计算时长
      return this.updateById(simulateExamRecord);
   }
   /**
    * 模拟考试开始页面,查询是否有暂停中的模拟考试
    * @param simulateExamRecord 模拟考试记录对象信息(必须包含 idCardNo)
    * @return
    */
   @Override
   public Object getSimulateExamRecordInfo(SimulateExamRecord simulateExamRecord) {
      simulateExamRecord.setStatus(2);
      return this.getOne(Condition.getQueryWrapper(simulateExamRecord));
   }
   /**
    * 考试暂停后继续,1查询所有的答题信息,2查询所有的已答信息  3其他信息
    * @param simulateExamRecord 必须包含 模拟考试id,, type 1: 继续考试  2: 放弃之前的考试,重新生成题目考试
    * @return
    */
   @Override
   public Object getSimulateExamRefreshInfo(SimulateExamRecordVO simulateExamRecord) {
      if (null!=simulateExamRecord.getId()) {
         Map<String, Object> map = new HashMap<>();
         //1. 继续考试
         if (simulateExamRecord.getType().equals(1)){
            //其他信息
            SimulateExamRecord simulateExamRecord1 = this.getById(simulateExamRecord.getId());
            List<String> list = Arrays.asList(simulateExamRecord1.getSubjectIds().split(","));
            List<Long> list1 = new ArrayList<>();
            //装换为Long 类型,不然返回的题目顺序会乱
            for (String s : list) {
               list1.add(Long.parseLong(s));
            }
            //修改信息,修改回考试中的状态
            simulateExamRecord1.setStatus(1);
            this.updateById(simulateExamRecord1);
            //1.查询当前人员当前模拟考试的考试题目信息
            List<ExamSubjectChoicesVO> examSubjectChoicesVOSList = baseMapper.getSimulateExamRefreshList(list1);
            //2.查询当前人员已答的题目信息
            SimulateExamAnswerRecord simulateExamAnswerRecord = new SimulateExamAnswerRecord();
            simulateExamAnswerRecord.setSimulateExamId(simulateExamRecord.getId());
            List<SimulateExamAnswerRecord> simulateExamAnswerRecordList = simulateExamAnswerRecordService.list(Condition.getQueryWrapper(simulateExamAnswerRecord));
            //3.查询正在答题的信息
            int count  = simulateExamAnswerRecordList.size();
            //查询下一题题目信息
            ExamSubjectChoicesVO examSubjectChoicesVO = new ExamSubjectChoicesVO();
            ExamSubjectChoices examSubjectChoices = new ExamSubjectChoices();
            if (count>0) {
               examSubjectChoices.setId(examSubjectChoicesVOSList.get(count).getId());
               examSubjectChoicesVO = examSubjectChoicesService.selectExamSubjectChoicesInfo(examSubjectChoices);
            }
            if (count==0) {
               examSubjectChoices.setId(examSubjectChoicesVOSList.get(0).getId());
               examSubjectChoicesVO = examSubjectChoicesService.selectExamSubjectChoicesInfo(examSubjectChoices);
            }
            //5.数据封装
            map.put("simulateExamRecord",simulateExamRecord1);
            map.put("examSubjectInfo",examSubjectChoicesVOSList);
            map.put("simulateExamAnswerRecordList",simulateExamAnswerRecordList);
            map.put("examSubjectChoicesVO",examSubjectChoicesVO);
            //6.返回数据
            return map;
         }
         //2. 放弃之前的考试,重新获取题目返回
         if (simulateExamRecord.getType().equals(2)){
            SimulateExamRecord examRecord = this.getById(simulateExamRecord.getId());
            //修改当前模拟考试状态为废弃
            examRecord.setStatus(4);
            //修改信息
            this.updateById(examRecord);
            //重新获取题目
            SimulateExamRecord simulateExamRecord1 = new SimulateExamRecord();
            simulateExamRecord1.setIdCardNo(examRecord.getIdCardNo());
            //去获取题目
            return insertSimulateExamRecord(simulateExamRecord1);
         }
      }
      return null;
   }
}