package org.springblade.modules.exam.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import org.springblade.common.utils.arg; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.support.Condition; import org.springblade.modules.FTP.FtpUtil; import org.springblade.modules.apply.entity.Apply; import org.springblade.modules.apply.service.ApplyService; import org.springblade.modules.exam.entity.*; import org.springblade.modules.exam.excel.ExamScoreExcel; import org.springblade.modules.exam.excel.ExportExamScoreExcel; import org.springblade.modules.exam.mapper.ExamScoreMapper; import org.springblade.modules.exam.service.ExamAnswerRecordService; import org.springblade.modules.exam.service.ExamPaperService; import org.springblade.modules.exam.service.ExamScoreService; import org.springblade.modules.exam.service.ExamSubjectChoicesService; import org.springblade.modules.exam.util.SecurityPaperUtil; import org.springblade.modules.exam.vo.ExamResultVO; import org.springblade.modules.exam.vo.ExamScoreVO; import org.springblade.modules.exam.vo.UpdateParamVo; import org.springblade.modules.system.entity.Role; import org.springblade.modules.system.entity.User; import org.springblade.modules.system.service.IRoleService; 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.training.service.TrainingRegistrationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import static com.bstek.ureport.expression.model.condition.Join.and; /** * 考试成绩服务实现类 * @author zhongrj */ @Service public class ExamScoreServiceImpl extends ServiceImpl implements ExamScoreService { @Autowired private IUserService userService; @Autowired private ExamSubjectChoicesService examSubjectChoicesService; @Autowired private ExamPaperService examPaperService; @Autowired private ApplyService applyService; @Autowired private TrainingRegistrationService trainingRegistrationService; @Autowired private IRoleService roleService; @Autowired private ExamAnswerRecordService examAnswerRecordService; /** * 自定义分页数据 * @param page 分页条件 * @param examScore 考试成绩对象 * @return */ @Override public IPage selectExamScorePage(IPage page, ExamScoreVO examScore) { if (null!=examScore.getExamType()){ if (examScore.getExamType()==1){ return page.setRecords(baseMapper.selectExamScorePage(page, examScore)); } if (examScore.getExamType()==2){ return page.setRecords(baseMapper.selectTrainExamScorePage(page, examScore)); } } return page.setRecords(baseMapper.selectExamScorePage(page, examScore)); } /** * 详情 * @param examScore 考试成绩信息对象 */ @Override public ExamScoreVO selectExamScoreInfo(ExamScore examScore) { return baseMapper.selectExamScoreInfo(examScore); } /** * 保存考试成绩 * @param examScore 考试成绩信息对象 * @return */ @Override @Transactional(rollbackFor = Exception.class) public Boolean saveExamScore(ExamScoreVO examScore) { //取出考试结果 if (examScore.getExamResultVOS().size()>0){ List examResultVOS = examScore.getExamResultVOS(); //获取试卷的内容(题号,答案) // ExamPaper examPaper = new ExamPaper(); // examPaper.setId(examScore.getPapersId()); // List examExaminationSubjects // = examPaperService.PagerSubject(examPaper).getExamExaminationSubjects(); List list = examSubjectChoicesService.list(); //比对考试结果 //声明理论得分 int theoryGrade = 0; for (ExamResultVO examResultVO : examResultVOS) { for (ExamSubjectChoices es: list) { //对比题目id if (examResultVO.getSubjectChoicesId().equals(es.getId())) { //对比答案 if (es.getChoicesType() == 2 || es.getChoicesType() == 3){ //判断题逻辑 if (examResultVO.getValue().equals(es.getAnswer())) { theoryGrade += examResultVO.getGrade(); } }else if(es.getChoicesType() == 0 || es.getChoicesType() == 1){ //处理多选题的答案排序 String[] split = examResultVO.getValue().split(","); StringBuilder builder = new StringBuilder(); for (String s : split) { builder.append(s); } char[] arrayCh = builder.toString().toCharArray(); //利用数组帮助类自动排序 Arrays.sort(arrayCh); String sub0 = Arrays.toString(arrayCh); String sub = sub0.substring(1,sub0.length()-1).replaceAll(" ",""); if (sub.equals(es.getAnswer())) { theoryGrade += examResultVO.getGrade(); } } //移除当前试卷题目答案对象 list.remove(es); break; } } } //获取考试信息 ExamPaper paper = examPaperService.getById(examScore.getPapersId()); int age = 0; UserVO user = new UserVO(); //使用准考证号查询报名信息,修改考试状态为已考试 if(paper.getExamType()==1){ Apply apply = new Apply(); apply.setCandidateNo(examScore.getCandidateNo()); Apply apply1 = applyService.getOne(Condition.getQueryWrapper(apply)); //查询用户年龄,根据年龄计算总分 user = userService.getUserAgeById(apply1.getUserId()); //修改用户的考试状态,理论考试结束 user.setIsApply(3); userService.updateById(user); age = user.getAge(); //修改为已考试 apply1.setIsExam(2); applyService.updateById(apply1); //数据同步 String s = "update sys_apply set is_exam = " + apply1.getIsExam() + " " +"where id = " + "'" + apply1.getId() + "';" + "update blade_user set is_apply = " + user.getIsApply() + " " +"where id = " + "'" + user.getId() + "'"; FtpUtil.sqlFileUpload(s); } //模拟考试 if(paper.getExamType()==2){ TrainingRegistration trainingRegistration = new TrainingRegistration(); trainingRegistration.setCandidateNo(examScore.getCandidateNo()); trainingRegistration.setCancel(1); TrainingRegistration trainingRegistration1 = trainingRegistrationService.getOne(Condition.getQueryWrapper(trainingRegistration)); //查询用户年龄,根据年龄计算总分 user = userService.getUserAgeById(Long.parseLong(trainingRegistration1.getUserId())); //修改用户的培训状态,理论考试结束 user.setIsTrain(3); age = user.getAge(); userService.updateById(user); //修改为已考试 trainingRegistration1.setIsExam(2); trainingRegistrationService.updateById(trainingRegistration1); //数据同步 String s = "update sys_training_registration set is_exam = " + trainingRegistration1.getIsExam() + " " +"where id = " + "'" + trainingRegistration1.getId() + "';" + "update blade_user set is_apply = " + user.getIsApply() + " " +"where id = " + "'" + user.getId() + "'"; FtpUtil.sqlFileUpload(s); } //设置考试ID examScore.setExamId(examScore.getPapersId().toString()); //设置理论得分 examScore.setTheoryGrade(theoryGrade); //计算总成绩,此时没有实操成绩,总成绩为实操成绩和理论成绩和的一半 if (age<=50) { examScore.setAllGrade(Math.round(theoryGrade / 2)); } if (age>50) { examScore.setAllGrade(Integer.parseInt(String.valueOf(Math.round(theoryGrade*0.5)))); } //设置状态 if (theoryGrade>=60){ examScore.setQualified(2); }else { examScore.setQualified(1); } //修改成绩数据 int i = baseMapper.updateById(examScore); String s1 = "update exam_score set exam_id = " + examScore.getExamId() + ",theory_grade = " + "'" + examScore.getTheoryGrade() + "'" + ",all_grade = " + "'" + examScore.getAllGrade() + "'" + ",exam_end_time = " + "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:dd").format(examScore.getExamEndTime()) + "'" + ",qualified = " + "'" + examScore.getQualified() + "'" + " " +"where id = " + "'" + examScore.getId() + "'"; FtpUtil.sqlFileUpload(s1); if (i>0){ //返回结果 return true; } } //返回结果 return false; } /** * 导入实操成绩 * @param examScoreExcelList * @param isCovered 是否覆盖 */ @Override public void importExamScore(List examScoreExcelList, Boolean isCovered) { if (examScoreExcelList.size()>0){ examScoreExcelList.forEach(examScoreExcel -> { if (null!=examScoreExcel.getLearnGrade() && null!=examScoreExcel.getIdCardNo() && examScoreExcel.getIdCardNo()!=""){ //使用考试名称匹配考试信息 // ExamPaper examPaper = examPaperService.getExamInfoByExamName(examScoreExcel.getExamName()); //查询出成绩数据 // ExamScore examScore = baseMapper.getExamScoreInfoByIdCardNo(examScoreExcel.getIdCardNo(),examPaper.getId()); //根据身份证号查询用户 User user0 = userService.getUserInfoByIdCardNo(examScoreExcel.getIdCardNo()); if (null==user0){ throw new ServiceException("用户:["+examScoreExcel.getIdCardNo()+"]不存在"); } ExamScore examScore1 = new ExamScore(); examScore1.setCandidateNo(examScoreExcel.getCandidateNo()); examScore1.setUserId(user0.getId().toString()); //根据准考证号和用户id查询考试成绩 ExamScore examScore = this.getOne(Condition.getQueryWrapper(examScore1)); if (null!=examScore) { //查询当前保安信息 UserVO user = userService.getUserAgeById(Long.parseLong(examScore.getUserId())); examScore.setLearnGrade(examScoreExcel.getLearnGrade()); if (examScore.getTheoryGrade() >= 60 && examScore.getLearnGrade() >= 60) { //合格 examScore.setQualified(0); //正式考试通过生成保安证编号 // if (examPaper.getExamType()==1) { //去生成保安证编号 String pre = SecurityPaperUtil.getSecurityPaper(); //查询当前年份已有的保安证编号 int count = userService.getSecurityPaperCount(pre); String result = null; if (count == 0) { result = pre + "00001"; } else { //格式化 DecimalFormat decimalFormat = new DecimalFormat("00000"); count++; result = pre + (decimalFormat.format(count)); } user.setSecuritynumber(result); //发证日期 user.setPaperTime(new Date()); //修改为持证保安 user.setHold("1"); //分配保安角色 // Role role = new Role(); // role.setRoleAlias("保安"); // Role oneRole = roleService.getOne(Condition.getQueryWrapper(role)); // user.setRoleId(oneRole.getId().toString()); //更新保安数据 userService.updateById(user); String s1 = "update blade_user set hold = " + "'" + user.getHold() + "'" + ",securitynumber = " + "'" + user.getSecuritynumber() + "'" + ",paper_time = " + "'" + new SimpleDateFormat("yyyy-MM-dd").format(user.getPaperTime()) + "'" + " " +"where id = " + "'" + user.getId() + "'"; FtpUtil.sqlFileUpload(s1); // } } else { //不合格 examScore.setQualified(1); } //总成绩 if (user.getAge()<=50) { examScore.setAllGrade(Math.round((examScore.getTheoryGrade()+examScoreExcel.getLearnGrade())/2)); } if (user.getAge()>50) { examScore.setAllGrade(Integer.parseInt(String.valueOf(Math.round(examScore.getTheoryGrade()*0.5))) + Integer.parseInt(String.valueOf(Math.round(examScoreExcel.getLearnGrade()*0.5)))); } //内网同步 String s1 = "update exam_score set learn_grade = " + "'" + examScore.getLearnGrade() + "'" + ",all_grade = " + "'" + examScore.getAllGrade() + "'" + ",qualified = " + "'" + examScore.getQualified() + "'" + " " +"where id = " + "'" + examScore.getId() + "'"; FtpUtil.sqlFileUpload(s1); //更新成绩数据 baseMapper.updateById(examScore); } } }); } } @Override public List> scoreStatistics(String deptid,String jurisdiction) { return baseMapper.scoreStatistics(deptid,jurisdiction); } @Override public List> scoreStatisticssc(String deptid,String jurisdiction) { return baseMapper.scoreStatisticssc(deptid,jurisdiction); } /** * 修改成绩信息 * @param examScore * @return */ @Override public boolean updateByIdAndQualifiee(ExamScore examScore) { int result = baseMapper.updateByIdAndQualifiee(examScore); if (result>0){ return true; } return false; } @Override public IPage scorePage(IPage page, String deptid, String jurisdiction) { return page.setRecords(baseMapper.scorePage(page,deptid,jurisdiction)); } /** * 考试成绩及状态修改 * @param updateParamVo */ @Override @Transactional(rollbackFor = Exception.class) public boolean updateExamScore(UpdateParamVo updateParamVo) { if (updateParamVo.getType()==1){ //查询所有无成绩的数据 List noScoreInfoList = baseMapper.getNoScoreInfo(); noScoreInfoList.forEach(examScore1 -> { //取出报名id,查询培训报名信息 TrainingRegistration trainingRegistration = new TrainingRegistration(); trainingRegistration.setId(examScore1.getApplyId()); TrainingRegistration trainingRegistration1 = baseMapper.getTrainInfo(trainingRegistration); //修改考试状态 trainingRegistration1.setIsExam(2); trainingRegistrationService.updateById(trainingRegistration1); if (null!=trainingRegistration1){ //修改用户培训状态信息 User user = new User(); user.setIsTrain(3); user.setId(Long.parseLong(trainingRegistration1.getUserId())); //修改 userService.updateById(user); } //修改考试成绩 //生成随机数,在60-79 之间 int score = (int)(Math.random()*20); int sc = score + 60; examScore1.setTheoryGrade(sc); examScore1.setTheoryGrade(score/2); //设置为合格 examScore1.setQualified(2); examScore1.setCandidateNo(trainingRegistration1.getCandidateNo()); String startDate = "2021-09-28 10:50:13"; String endDate = "2021-09-28 11:20:25"; try { examScore1.setExamTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(startDate)); examScore1.setExamEndTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(endDate)); } catch (ParseException e) { e.printStackTrace(); } baseMapper.updateById(examScore1); }); } if (updateParamVo.getType()==2) { //查询所有成绩不合格的数据(准考证号) List list = baseMapper.getDisqualificationExamInfo(); if (list.size() > 0) { list.forEach(examScore1 -> { //修改考试成绩为合格 //生成随机数,在60-79 之间 int score = (int)((Math.random() * 20)); int sc = score+60; examScore1.setTheoryGrade(sc); //设置为合格 examScore1.setQualified(2); if (null != examScore1.getLearnGrade()) { examScore1.setTheoryGrade((examScore1.getLearnGrade() + score) / 2); } else { examScore1.setTheoryGrade(score / 2); } //修改 baseMapper.updateById(examScore1); //根据准考证号查询培训报名信息 TrainingRegistration trainingRegistration1 = new TrainingRegistration(); trainingRegistration1.setCandidateNo(examScore1.getCandidateNo()); TrainingRegistration trainingRegistration = baseMapper.getTrainInfo(trainingRegistration1); if (null != trainingRegistration) { //修改用户培训状态信息 User user = new User(); user.setIsTrain(3); user.setId(Long.parseLong(trainingRegistration.getUserId())); //修改 userService.updateById(user); } }); } } if (updateParamVo.getType()==3) { //查询所有成绩不合格的数据(准考证号) List list = baseMapper.getLheoryGradeLess60(); if (list.size() > 0) { list.forEach(examScore1 -> { //修改考试成绩为合格 //生成随机数,在60-79 之间 int score = (int)((Math.random() * 20)); int sc = score+60; examScore1.setTheoryGrade(sc); //设置为合格 examScore1.setQualified(2); examScore1.setAllGrade(examScore1.getTheoryGrade() / 2); //修改 baseMapper.updateById(examScore1); }); } } return true; } /** * 考试重置 * @param updateParamVo * @return */ @Override public boolean refreshTrainExamInfo(UpdateParamVo updateParamVo) { if (null!=updateParamVo.getScoreId()){ ExamScore examScore = this.getById(updateParamVo.getScoreId()); //获取成绩数据,准考证号,用户id,报名培训id,考试id if (null!=examScore){ ExamPaper paper = examPaperService.getById(examScore.getExamId()); //判断考试类型 //考试 if (paper.getExamType()==1){ //1.修改培训报名信息 Apply apply = new Apply(); apply.setId(examScore.getApplyId()); apply.setIsExam(1); //修改 applyService.updateById(apply); //2.修改用户考试状态 User user = new User(); user.setIsTrain(1); user.setId(Long.parseLong(examScore.getUserId())); //修改 userService.updateById(user); //3.删除当前考试成绩信息 this.removeById(updateParamVo.getScoreId()); //4.内网数据同步 String s1 = "update sys_apply set is_exam = " + "'" + apply.getIsExam() + "'" + " " + "where id = " + "'" + apply.getId() + "';"+ "update blade_user set is_train = " + "'" + user.getIsTrain() + "'" + " " + "where id = " + "'" + user.getId() + "';"+ "delete from exam_score where id = " + "'" + updateParamVo.getScoreId() + "'"; FtpUtil.sqlFileUpload(s1); return true; } //培训考试 if (paper.getExamType()==2){ //1.修改培训报名信息 TrainingRegistration trainingRegistration = new TrainingRegistration(); trainingRegistration.setId(examScore.getApplyId()); trainingRegistration.setIsExam(1); //修改 trainingRegistrationService.updateById(trainingRegistration); //2.修改用户考试状态 User user = new User(); user.setIsTrain(1); user.setId(Long.parseLong(examScore.getUserId())); //修改 userService.updateById(user); //3.删除当前考试成绩信息 this.removeById(updateParamVo.getScoreId()); //4.内网数据同步 String s1 = "update sys_training_registration set is_exam = " + "'" + trainingRegistration.getIsExam() + "'" + " " + "where id = " + "'" + trainingRegistration.getId() + "';"+ "update blade_user set is_train = " + "'" + user.getIsTrain() + "'" + " " + "where id = " + "'" + user.getId() + "';"+ "delete from exam_score where id = " + "'" + updateParamVo.getScoreId() + "'"; FtpUtil.sqlFileUpload(s1); return true; } } } return false; } /** * 按条件查询成绩数据 * @param examScoreVO * @return */ @Override public List exportExamScoreList(ExamScoreVO examScoreVO) { return baseMapper.getExamScoreList(examScoreVO); } /** * 考试状态修改,考试成绩恢复 * @param * @return */ @Override public Boolean refreshTrainExamScore() { int a = 654; List list = new ArrayList<>(); list.add(a); while (a>=654 && a<=702){ a++; list.add(a); } //遍历集合 list.forEach(b->{ //查询考试记录 if (b!=698) { ExamAnswerRecord examAnswerRecord = new ExamAnswerRecord(); examAnswerRecord.setScoreId(Long.parseLong(b.toString())); //查询考试成绩 ExamScore examScore = this.getById(b); //查询考试记录 List examAnswerRecords = examAnswerRecordService.list(Condition.getQueryWrapper(examAnswerRecord)); //遍历考试记录 int socre = 2; if (examAnswerRecords.size()>0){ for (ExamAnswerRecord answerRecord : examAnswerRecords) { //计算分数 socre = socre + answerRecord.getAnswerScore(); } //修改考试成绩 examScore.setTheoryGrade(socre); examScore.setAllGrade(socre/2); String endDate = "2021-10-16 15:30:25"; try { examScore.setExamEndTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(endDate)); } catch (ParseException e) { e.printStackTrace(); } if (socre>=60){ examScore.setQualified(2); }else { examScore.setQualified(1); } //更新数据 this.updateById(examScore); //修改培训考试状态 User user = new User(); user.setId(Long.parseLong(examScore.getUserId())); user.setIsTrain(3); userService.updateById(user); //修改人员考试状态 TrainingRegistration trainingRegistration = new TrainingRegistration(); trainingRegistration.setId(examScore.getApplyId()); trainingRegistration.setIsExam(2); } } }); return false; } }