package org.springblade.modules.training.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springblade.common.constant.AgeUtil; import org.springblade.common.utils.IdCardNoUtil; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.support.Condition; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.BeanUtil; import org.springblade.modules.FTP.FtpUtil; import org.springblade.modules.FTP.Monitor; import org.springblade.modules.FTP.Result; import org.springblade.modules.absentrecords.entity.AbsentRecords; import org.springblade.modules.absentrecords.service.AbsentRecordsService; import org.springblade.modules.apply.entity.Apply; import org.springblade.modules.apply.excel.ApplyInfoExcel; 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.service.ExamAnswerRecordService; import org.springblade.modules.exam.service.ExamPaperService; import org.springblade.modules.exam.service.ExamScoreService; import org.springblade.modules.system.entity.User; import org.springblade.modules.system.service.IUserDeptService; import org.springblade.modules.system.service.IUserService; import org.springblade.modules.system.service.MyAsyncService; import org.springblade.modules.training.entity.TrainingRegistration; import org.springblade.modules.training.excel.TrainingRegistrationExcel; import org.springblade.modules.training.mapper.TrainingRegistrationMapper; import org.springblade.modules.training.service.TrainingRegistrationService; import org.springblade.modules.training.util.LongTimeUtil; import org.springblade.modules.training.vo.TrainingRegistrationVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; 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 java.util.concurrent.atomic.AtomicBoolean; /** * 报名培训服务实现类 * @author zhongrj */ @Service @AllArgsConstructor public class TrainingRegistrationServiceImpl extends ServiceImpl implements TrainingRegistrationService { private final IUserService userService; private final IUserDeptService userDeptService; private final ExamPaperService examPaperService; private final AbsentRecordsService absentRecordsService; private final ExamScoreService examScoreService; private final RedisTemplate redisTemplate; @Autowired private MyAsyncService myAsyncService; @Autowired private ExamAnswerRecordService examAnswerRecordService; @Override public IPage selectTrainingRegistrationPage(IPage page, TrainingRegistrationVo trainingRegistration) { List trainingRegistrationVos = baseMapper.selectTrainingRegistrationPage(page, trainingRegistration); trainingRegistrationVos.forEach(trainingRegistrationVo -> { //如果考试id 为空,考试尚未提交审核 if (null==trainingRegistrationVo.getAuditStatus()){ trainingRegistrationVo.setAuditStatus(4); } }); return page.setRecords(trainingRegistrationVos); } /** * 详情 * @param trainingRegistration 报名培训信息对象 */ @Override public TrainingRegistrationVo selectTrainingRegistrationInfo(TrainingRegistration trainingRegistration) { return baseMapper.selectTrainingRegistrationInfo(trainingRegistration); } /** * 导出报名数数据 * @param trainingRegistration 培训报名对象 * @return */ @Override public List getTrainingRegistrationExcelList(TrainingRegistrationVo trainingRegistration) { return baseMapper.getTrainingRegistrationExcelList(trainingRegistration); } /** * 培训考试清册导入 * @param data * @param isCovered */ @Override @Transactional(rollbackFor = Exception.class) public void importTrainingRegistration(List data, Boolean isCovered,String deptId) { //需要推送内网的保安员信息集合 List trainingRegistrationList = new ArrayList<>(); //年龄不符的保安员信息存入集合 List ageErrorList = new ArrayList<>(); List cardErrorList = new ArrayList<>(); AtomicBoolean ageStatus = new AtomicBoolean(true); AtomicBoolean cardStatus = new AtomicBoolean(true); if (data.size()>0){ for (TrainingRegistrationExcel trainingRegistrationExcel : data) { //判断是否为当前单位 String deptIds = userDeptService.selectIn(trainingRegistrationExcel.getDeptName()); if (null!=deptIds && !deptIds.equals("")) { if (null != deptId && !deptId.equals("")) { if (!deptId.equals(deptIds)) { throw new ServiceException("导入失败!不能给予不是本公司的保安员报名!"); } } }else { //如果deptIds 为空,则说明还没有改公司 throw new ServiceException("导入失败!公司名:["+trainingRegistrationExcel.getDeptName()+"]不存在!"); } //身份证校验 if (null==trainingRegistrationExcel.getIdCardNo() || trainingRegistrationExcel.getIdCardNo().equals("")){ throw new ServiceException("导入失败!身份证号码不能为空!"); } //姓名校验 if (null==trainingRegistrationExcel.getRealName() || trainingRegistrationExcel.getRealName().equals("")){ throw new ServiceException("导入失败!姓名不能为空!"); } if (null!=trainingRegistrationExcel.getIdCardNo() && !trainingRegistrationExcel.getIdCardNo().equals("")){ //去除所有空格 String cardid = trainingRegistrationExcel.getIdCardNo().replaceAll(" ", ""); //校验 boolean b = IdCardNoUtil.checkIdCardNo(cardid); if(!b){ cardStatus.set(false); cardErrorList.add(trainingRegistrationExcel.getIdCardNo()); continue; } } //计算年龄 Integer age = AgeUtil.idCardToAge(trainingRegistrationExcel.getIdCardNo()); //判断年龄 if (age<18 || age>60) { ageStatus.set(false); ageErrorList.add(trainingRegistrationExcel.getIdCardNo()); continue; } //向内网推送数据 //生成随机数 String uuid = UUID.randomUUID().toString(); //创建培训对象 TrainingRegistration trainingRegistration = new TrainingRegistration(); trainingRegistration.setName(trainingRegistrationExcel.getRealName()); trainingRegistration.setDeptId(Long.parseLong(deptId)); trainingRegistration.setIdCardNo(trainingRegistrationExcel.getIdCardNo()); //已报名 trainingRegistration.setCancel(1); //默认为未考试状态 trainingRegistration.setIsExam(1); //未提交考试审核 trainingRegistration.setAuditStatus(4); trainingRegistration.setTrainingTime(new Date()); //将 user 存入 redis redisTemplate.opsForValue().set(uuid, JSON.toJSONString(trainingRegistration)); //trainingRegistration 临时设置uuid 到 AcademicUrl字段 trainingRegistration.setAcademicUrl(uuid); //加入集合 trainingRegistrationList.add(trainingRegistration); } Result result = new Result(); //培训批量插入 if (trainingRegistrationList.size()>0) { //生成随机数 String uuid = UUID.randomUUID().toString(); //数据推送 Map map = new HashMap<>(1); map.put(uuid, trainingRegistrationList); // myAsyncService.FTPObjectTrianList(map); int count = 0; //调用ftp获取返回数据 while (true){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //调用ftp获取返回数据 result = Monitor.getFtpDataByUuidList(uuid); //如果返回true,就退处 if (result.getCode() == 200) { break; }else { count++; if (count == 30) { break; } } } } // if (null!=result){ // //获取 result // List data1 = result.getData(); // if (data1.size()>0){ // for (Result result1 : data1) { // // 取出 Msg ,此 msg 存的对应的 uuid // String uuid = result1.getMsg(); // // 从redis 中获取对应的用户信息 // User user = handlerUserInfo(uuid); // if (result1.getCode()==200){ // user.setId(result1.getUserId()); // this.save(user); // } // if (result1.getCode()==201){ // user.setId(result1.getUserId()); // user.setCreateTime(null); // this.updateById(user); // } // if (result1.getCode()==202){ // status.set(false); // //已在其他单位存在 // errorList.add(user.getCardid()); // } // if (result1.getCode()==203){ // securityInvalidStatus.set(false); // //保安证编号不匹配 // securityInvalidList.add(user.getCardid()); // } // } // } // } //如果所有数据导入有一个异常 StringBuilder errorBuilder = new StringBuilder(); if (!ageStatus.get()){ String errorAccount = StringUtils.join(ageErrorList, "\\\n"); errorBuilder.append("保安员:[" + errorAccount + "]报名失败!年龄不符,报名年龄为[18-60]周岁!"); } if (!cardStatus.get()){ String errorAccount = StringUtils.join(cardErrorList, "\\\n"); errorBuilder.append("用户:[" + errorAccount + "]导入失败!身份证号码不正确,请核对!"); } //抛出异常 if (errorBuilder.length()>0){ throw new ServiceException(errorBuilder.toString()); } } } /** * 生成准考证号码 * @param examPaper 考试报名信息对象 */ private String getCandidateNo(ExamPaper examPaper) { //获取考试信息 if (null!=examPaper.getStartTime()){ String format = new SimpleDateFormat("yyyy-MM-dd").format(examPaper.getStartTime()); String year = format.substring(2,4); String quarter = null; String months = null; int month = Integer.parseInt(format.substring(5,7)); int day = Integer.parseInt(format.substring(8,10)); String days = null; if (month>0 && month<=3){ quarter = "C"; } if (month>3 && month<=6){ quarter = "X"; } if (month>6 && month<=9){ quarter = "Q"; } if (month>9 && month<=12){ quarter = "D"; } if (month<=9){ months = "0" + month; }else { months = String.valueOf(month); } if (day<=9){ days = "0" + day; }else { days = ""+day; } String type = null; if (examPaper.getExamType()==1){ type = "z"; } if (examPaper.getExamType()==2){ type = "m"; } //获取考试名称前缀,去除数字,字母 // String examName // = examPaper.getExamName().replaceAll("\\s*", "").replaceAll("[^(\\u4e00-\\u9fa5)]", "").substring(0,1); //前缀 = 年的最后两位 + 月份(两位) + 考试名称(中文拼音)首字母(去除数字,字母) + 考试类型 + 季度拼音首字母大写(春季就是 C) // String result = year // + months // + toFirstChar(examName).toUpperCase() // + examPaper.getExamType() // + quarter; //前缀 = 年的最后两位 + 月份(两位) + 日 (两位) + 考试类型 正式考试 z 模拟考试 m String pre = year + months + days + type; //查询是当前前缀已生成准考证号码最大的一位 int count = examPaperService.getCandidateNoCount(pre); String result = null; //格式化 DecimalFormat decimalFormat = new DecimalFormat("0000"); count++; result = pre + (decimalFormat.format(count)); //返回 return result; } return null; } /** * 报名 */ private void saveTrainingRegistration(TrainingRegistration trainingRegistration,User user1){ String formatStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); Long id = trainingRegistration.getId(); String s = "insert into sys_training_registration(id,training_unit_id,training_time,cancel,user_id,is_exam,audit_status) " + "values(" + "'" + id + "'" + "," + "'" + trainingRegistration.getTrainingUnitId() +"'" + "," + "'" + formatStr +"'" + "," + "'" + trainingRegistration.getCancel() + "'" + "," + "'" + trainingRegistration.getUserId() + "'" + "," + "'" + trainingRegistration.getIsExam() + "'" + "," +"'" + trainingRegistration.getAuditStatus() + "'" + ");" + "update blade_user set is_train = " + user1.getIsTrain() + " " +"where id = " + "'" + user1.getId() + "'"; //FtpUtil.sqlFileUpload(s); myAsyncService.FTP(s); } /** * 查询准考证前缀相同的数量 * @param result * @return */ @Override public int getCandidateNoCount(String result) { return baseMapper.getCandidateNoCount(result); } /** * 查询培训报名信息 * @param trainingRegistration 培训报名对象信息 * @return */ @Override public Integer getTrainingRegistrationInfo(TrainingRegistration trainingRegistration) { return baseMapper.getTrainingRegistrationInfo(trainingRegistration); } /** * 查询已报名培训公司未关联考试的人员 * @return */ @Override public List getTrainIds(TrainingRegistrationVo trainingRegistrationVo) { trainingRegistrationVo.setSerialStart(trainingRegistrationVo.getSerialStart() -1); trainingRegistrationVo.setSerialEnd(trainingRegistrationVo.getSerialEnd() -trainingRegistrationVo.getSerialStart()); return baseMapper.getTrainIds(trainingRegistrationVo); } /** * 自动处理之前报了名,申请了考试又没有去考试的,做缺考标记,并将报名状态修改为已取消报名 */ @Override public void examApplyStatus() { //封装条件 TrainingRegistration trainingRegistration = new TrainingRegistration(); trainingRegistration.setCancel(1); trainingRegistration.setAuditStatus(1); trainingRegistration.setIsExam(1); //查询考试申请审核通过,已报名,未考试的人员 List trainingRegistrationList = baseMapper.selectTrainingRegistrationList(trainingRegistration); if (trainingRegistrationList.size()>0) { trainingRegistrationList.forEach(trainingRegistration1 -> { //判断时间 //查询考试信息 ExamPaper paper = examPaperService.getById(trainingRegistration1.getTrainExamId()); if (null!=paper) { //比对考试结束时间 Date now = new Date(); Date exanEndTime = paper.getEndTime(); //考试截止时间小于当前时间,说明已过考试时间 if (exanEndTime.before(now)) { //修改报名状态 trainingRegistration1.setCancel(1); //缺考标记 trainingRegistration1.setIsExam(4); this.updateById(trainingRegistration1); //修改保安报名状态 User user = userService.getById(trainingRegistration1.getUserId()); if (null != user) { //考试结束 user.setIsTrain(3); userService.updateById(user); //生成缺考记录 AbsentRecords absentRecords = new AbsentRecords(); absentRecords.setUserId(user.getId()); absentRecords.setApplyId(trainingRegistration1.getId()); absentRecords.setExamId(Long.parseLong(trainingRegistration1.getTrainExamId())); absentRecords.setCandidateNo(trainingRegistration1.getCandidateNo()); absentRecords.setCreateTime(new Date()); //新增 absentRecordsService.save(absentRecords); //新增成绩,成绩为0 ExamScore examScore = new ExamScore(); examScore.setCandidateNo(trainingRegistration1.getCandidateNo()); examScore.setTheoryGrade(0); examScore.setAllGrade(0); examScore.setQualified(3); examScore.setUserId(user.getId().toString()); examScore.setApplyId(trainingRegistration1.getId()); examScore.setExamId(trainingRegistration1.getTrainExamId()); //新增 examScoreService.save(examScore); //内网同步 String s = "update sys_training_registration set cancel = " + trainingRegistration1.getCancel() + ",is_exam = " + "'" + trainingRegistration1.getIsExam() + "'" + " " + "where id = " + "'" + trainingRegistration1.getId() + "';" + "update blade_user set is_train = " + user.getIsTrain() + " " + "where id = " + "'" + user.getId() + "';" + "insert into sys_absent_records(id,user_id,create_time,exam_id,apply_id,candidate_no) " + "values(" + "'" + absentRecords.getId() + "'" + "," + "'" + absentRecords.getUserId() + "'" + "," + "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(absentRecords.getCreateTime()) + "'" + "," + "'" + absentRecords.getExamId() + "'" + "," + "'" + absentRecords.getApplyId() + "'" + "," + "'" + absentRecords.getCandidateNo() + "'" + ");" + "insert into exam_score(id,candidate_no,theory_grade,all_grade,qualified,user_id,apply_id,exam_id) " + "values(" + "'" + examScore.getId() + "'" + "," + "'" + examScore.getCandidateNo() + "'" + "," + "'" + examScore.getTheoryGrade() + "'" + "," + "'" + examScore.getAllGrade() + "'" + "," + "'" + examScore.getQualified() + "'" + "," + "'" + examScore.getUserId() + "'" + "," + "'" + examScore.getApplyId() + "'" + "," + "'" + examScore.getExamId() + "'" + ")"; myAsyncService.FTP(s); } } } }); } } /** * 定时任务处理考试中的 */ @Override public void examLoading() { //封装条件 TrainingRegistration trainingRegistration = new TrainingRegistration(); trainingRegistration.setCancel(1); trainingRegistration.setAuditStatus(1); trainingRegistration.setIsExam(3); //查询考试申请审核通过,已报名,未考试的人员 List trainingRegistrationList = baseMapper.selectTrainingRegistrationList(trainingRegistration); if (trainingRegistrationList.size()>0){ //遍历 trainingRegistrationList.forEach(trainingRegistration1 -> { //修改考试状态,已结束 trainingRegistration1.setIsExam(2); //更新 this.updateById(trainingRegistration1); //查询考试成绩记录 ExamScore examScore = new ExamScore(); examScore.setApplyId(trainingRegistration1.getId()); List list = examScoreService.list(Condition.getQueryWrapper(examScore)); if (list.size()>0) { list.forEach(examScore1 -> { //查询是否有考试记录 ExamAnswerRecord examAnswerRecord = new ExamAnswerRecord(); examAnswerRecord.setScoreId(examScore1.getId()); List examAnswerRecordList = examAnswerRecordService.list(Condition.getQueryWrapper(examAnswerRecord)); if (examAnswerRecordList.size()>0){ //计算成绩 int sum = examAnswerRecordList.stream().mapToInt(ExamAnswerRecord::getAnswerScore).sum(); examScore1.setTheoryGrade(sum); if (sum>=60){ //暂未录入实操成绩 examScore1.setQualified(2); }else { examScore1.setQualified(1); } }else { //理论成绩设置为0 examScore1.setTheoryGrade(0); //不合格 examScore1.setQualified(1); } //更新成绩数据 // examScoreService.updateById(examScore1); //数据同步 String s = "update sys_training_registration set is_exam = " + trainingRegistration1.getIsExam() + " " + "where id = " + "'" + trainingRegistration1.getId() + "';" + "update exam_score set theory_grade = " + examScore1.getTheoryGrade() + ",qualified = " + "'" + examScore1.getQualified() + "'" + " " + "where id = " + "'" + examScore1.getId() + "'"; myAsyncService.FTP(s); }); }else { //数据同步 String s = "update sys_training_registration set is_exam = " + trainingRegistration1.getIsExam() + " " + "where id = " + "'" + trainingRegistration1.getId() + "'"; myAsyncService.FTP(s); } }); } } /** * 查看报名集合信息 * @return */ @Override public List getList(TrainingRegistrationVo trainingRegistration) { return baseMapper.getList(trainingRegistration); } }