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.apply.entity.Apply; import org.springblade.modules.exam.entity.ExamAnswerRecord; import org.springblade.modules.exam.entity.ExamPaper; 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.ExamResultVO; 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.simulateexam.vo.SimulateExamScoreVO; import org.springblade.modules.system.entity.User; import org.springblade.modules.system.service.IUserService; import org.springblade.modules.system.vo.UserVO; import org.springblade.modules.training.entity.TrainingRegistration; import org.springblade.modules.vip.entity.VipTopic; import org.springblade.modules.vip.service.UserVipService; 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.text.SimpleDateFormat; 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 UserVipService userVipService; @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 = userService.getById(simulateExamRecord.getIdCardNo()); boolean status = false; List choicesVOList = new ArrayList<>(); if (null!=user){ //查询当前人员是否已缴费 VipTopic vipTopic = new VipTopic(); vipTopic.setUserId(user.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); }else { //未缴费人员从大题库随机抽取60道题目 choicesVOList = examPaperService.simulateQueryRandomSubjectList(); } //取出考试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); //新增模拟考试记录信息 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("未查询到该人员信息"); } //返回数据 return map; } // /** // * 首次点击开始考试,创建模拟考试,并返回考试 // * @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<>(); // boolean status = false; // if (list.size()>0){ // User user1 = list.get(0); // //查询当前人员是否已缴费 // 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); // }else { // //未缴费人员从大题库随机抽取60道题目 // choicesVOList = examPaperService.simulateQueryRandomSubjectList(); // } // //取出考试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); // //新增模拟考试记录信息 // 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("未查询到该人员信息"); // } // //返回数据 // 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; } /** * 提交考试 * @param simulateExamScore 模拟考试成绩信息对象 * @return */ @Override public Object saveSimulateExam(SimulateExamScoreVO simulateExamScore) { //取出考试结果 if (simulateExamScore.getExamResultVOS().size() > 0) { List examResultVOS = simulateExamScore.getExamResultVOS(); //查询模拟考试信息 SimulateExamRecord simulateExamRecord = this.getById(simulateExamScore.getSimulateExamId()); int count = 0; //计算考试得分,并存入考试答题记录 for (ExamResultVO examResultVO : examResultVOS) { SimulateExamAnswerRecord answerRecord = new SimulateExamAnswerRecord(); answerRecord.setSimulateExamId(simulateExamScore.getSimulateExamId()); answerRecord.setSubjectChoicesId(examResultVO.getSubjectChoicesId()); answerRecord.setAnswerOption(examResultVO.getValue()); answerRecord.setAnswerScore(examResultVO.getGrade()); if (examResultVO.getGrade() > 0) { answerRecord.setAnswerResult(1); } else { answerRecord.setAnswerResult(2); } count = count + examResultVO.getGrade(); answerRecord.setAnswerTime(new Date()); //新增 simulateExamAnswerRecordService.save(answerRecord); } //设置总分 simulateExamRecord.setScore(count); //更新模拟考试信息 this.updateById(simulateExamRecord); //返回 return true; } //返回结果 return false; } }