package org.springblade.modules.simulateexam.service.impl; 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.lang.reflect.Array; import java.util.*; import java.util.stream.Collectors; /** * 模拟考试记录服务实现类 * * @author zhongrj * @since 2022-02-23 */ @Service public class SimulateExamRecordServiceImpl extends ServiceImpl implements SimulateExamRecordService { @Autowired private ExamSubjectChoicesService examSubjectChoicesService; @Autowired private VipTopicService vipTopicService; @Autowired private IUserService userService; @Autowired private ExamPaperService examPaperService; @Autowired private SimulateExamAnswerRecordService simulateExamAnswerRecordService; /** * 自定义分页查询模拟考试记录数据 * @param page * @param simulateExamRecord * @return */ @Override public IPage selectSimulateExamRecordPage(IPage page, SimulateExamRecordVO simulateExamRecord) { return page.setRecords(baseMapper.selectSimulateExamRecordPage(page, simulateExamRecord)); } /** * 首次点击开始考试,创建模拟考试,并返回考试 * @param simulateExamRecord 模拟考试记录对象信息 * @return */ @Override public Object insertSimulateExamRecord(SimulateExamRecord simulateExamRecord) { //创建返回信息map Map map = new HashMap<>(); //使用身份证号码匹配人员信息(user_id) User user = new User(); user.setIsDeleted(0); user.setStatus(1); user.setCardid(simulateExamRecord.getIdCardNo()); List list = userService.list(Condition.getQueryWrapper(user)); List 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 list1 = Arrays.asList(topic.getTopicIds().split(",")); //获取随机的题目 List radio = list1.subList(0, 49); List checkbox = list1.subList(50, 69); List judge = list1.subList(70, 109); List sort = list1.subList(110, 119); //随机题目 List radioRandomSubjectList = examPaperService.queryRandomSubjectList(radio,25); List checkboxRandomSubjectList = examPaperService.queryRandomSubjectList(checkbox,10); List judgeRandomSubjectList = examPaperService.queryRandomSubjectList(judge,20); // List sortRandomSubjectList = examPaperService.queryRandomSubjectList(sort,5); //合并集合数据 choicesVOList.addAll(radioRandomSubjectList); choicesVOList.addAll(checkboxRandomSubjectList); choicesVOList.addAll(judgeRandomSubjectList); // choicesVOList.addAll(sortRandomSubjectList); //取出考试id List longList = choicesVOList.stream().map(ExamSubjectChoicesVO::getId).collect(Collectors.toList()); //装换为字符串 List 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 map = new HashMap<>(); //1. 继续考试 if (simulateExamRecord.getType().equals(1)){ //其他信息 SimulateExamRecord simulateExamRecord1 = this.getById(simulateExamRecord.getId()); List list = Arrays.asList(simulateExamRecord1.getSubjectIds().split(",")); List list1 = new ArrayList<>(); //装换为Long 类型,不然返回的题目顺序会乱 for (String s : list) { list1.add(Long.parseLong(s)); } //修改信息,修改回考试中的状态 simulateExamRecord1.setStatus(1); this.updateById(simulateExamRecord1); //1.查询当前人员当前模拟考试的考试题目信息 List examSubjectChoicesVOSList = baseMapper.getSimulateExamRefreshList(list1); //2.查询当前人员已答的题目信息 SimulateExamAnswerRecord simulateExamAnswerRecord = new SimulateExamAnswerRecord(); simulateExamAnswerRecord.setSimulateExamId(simulateExamRecord.getId()); List 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; } }