package org.springblade.modules.apply.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; import org.springblade.common.utils.arg; import org.springblade.core.mp.support.Condition; import org.springblade.core.tool.api.R; import org.springblade.modules.apply.entity.Apply; import org.springblade.modules.apply.excel.ApplyExcel; import org.springblade.modules.apply.excel.ApplyInfoExcel; import org.springblade.modules.apply.mapper.ApplyMapper; import org.springblade.modules.apply.service.ApplyService; import org.springblade.modules.apply.vo.ApplyPaPerVO; import org.springblade.modules.apply.vo.ApplyVO; import org.springblade.modules.exam.entity.ExamPaper; import org.springblade.modules.exam.service.ExamPaperService; import org.springblade.modules.system.entity.User; import org.springblade.modules.system.service.IUserService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; /** * 考试报名服务实现类 * @author zhongrj */ @Service @AllArgsConstructor public class ApplyServiceImpl extends ServiceImpl implements ApplyService { private final ExamPaperService examPaperService; private final IUserService userService; /** * 自定义分页数据 * @param page 分页条件 * @param apply 考试报名对象 * @return */ @Override public IPage selectApplyPage(IPage page, ApplyVO apply) { return page.setRecords(baseMapper.selectApplyPage(page, apply)); } /** * 详情 * @param apply 考试报名信息对象 */ @Override public ApplyVO selectApplyInfo(Apply apply) { return baseMapper.selectApplyInfo(apply); } /** * 获取准考证前缀相同的数量 * @param result 前缀 * @return */ @Override public int getCandidateNoCount(String result) { return baseMapper.getCandidateNoCount(result); } /** * 获取公司集体报名的人数 * @param applyCode * @return */ @Override public Integer getApplyNum(String applyCode) { return baseMapper.getApplyNum(applyCode); } /** * 导入报名信息 * @param data * @param isCovered */ @Override @Transactional(rollbackFor = Exception.class) public void importApply(List data, Boolean isCovered) { data.forEach(applyExcel -> { //查询用户信息 User user = new User(); user.setCardid(applyExcel.getIdCardNo()); User user1 = userService.getOne(Condition.getQueryWrapper(user)); if (null!=user1){ //未报名的新增,已报名的不做处理 if (null==user1.getIsApply()) { Apply apply1 = new Apply(); apply1.setApplyStatus(2); //默认为未考试状态 apply1.setIsExam(1); apply1.setApplyTime(new Date()); apply1.setUserId(user1.getId()); this.save(apply1); //修改保安报名状态 user1.setIsApply(1); userService.updateById(user1); }else { if (user1.getIsApply()==2) { Apply apply1 = new Apply(); apply1.setApplyStatus(2); //默认为未考试状态 apply1.setIsExam(1); apply1.setApplyTime(new Date()); apply1.setUserId(user1.getId()); this.save(apply1); //修改保安报名状态 user1.setIsApply(1); userService.updateById(user1); } } } }); } /** * 生成准考证号码 * @param apply 考试报名信息对象 */ private String getCandidateNo(Apply apply) { //获取考试信息 ExamPaper examPaper = examPaperService.getById(apply.getExamId()); 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; } 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 result = year + months + days + type; //查询是当前前缀已生成的数量 int count = this.getCandidateNoCount(result); if (count==0){ return result + "0000"; } //格式化 DecimalFormat decimalFormat = new DecimalFormat("0000"); //返回 return result + (decimalFormat.format(count++)); } return null; } /** * 生成准考证号码 * @param apply 考试报名信息对象 */ private String getApplyCode(Apply apply) { //获取考试信息 ExamPaper examPaper = examPaperService.getById(apply.getExamId()); 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; String days = null; int month = Integer.parseInt(format.substring(5,7)); int day = Integer.parseInt(format.substring(8,10)); 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; } if (day<=9){ days = "0" + day; } //获取考试名称前缀,去除数字,字母 String examName = examPaper.getExamName().replaceAll("\\s*", "").replaceAll("[^(\\u4e00-\\u9fa5)]", "").substring(0,1); //前缀 = 年的最后两位 + 月份(两位) + 考试名称(中文拼音)首字母(去除数字,字母) + 考试类型 + 季度拼音首字母大写(春季就是 C) String result = year + months + toFirstChar(examName).toUpperCase() + examPaper.getExamType() + quarter; //生成随机数 UUID uuid = UUID.randomUUID(); //返回 return result + uuid.toString().replaceAll("\\-",""); } return null; } /** * 获取字符串拼音的第一个字母 * @param chinese * @return */ private String toFirstChar(String chinese){ String pinyinStr = ""; char[] newChar = chinese.toCharArray(); //转为单个字符 HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); for (int i = 0; i < newChar.length; i++) { if (newChar[i] > 128) { try { pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0].charAt(0); } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } }else{ pinyinStr += newChar[i]; } } return pinyinStr; } /** * 获取准考证信息 * @param apply * @return */ @Override public ApplyPaPerVO getApplyInfo(Apply apply) { //正式考试 if (apply.getApplyExamType()==1){ ApplyPaPerVO applyPaPerVO = baseMapper.getApplyInfo(apply); String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(applyPaPerVO.getStartTime()).split(" ")[0]; String startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(applyPaPerVO.getStartTime()).split(" ")[1]; String endTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(applyPaPerVO.getEndTime()).split(" ")[1]; applyPaPerVO.setStringTime(time+" "+startTime.substring(0,startTime.length()-3) +"-"+ endTime.substring(0,endTime.length()-3)); return applyPaPerVO; } //模拟考试 if (apply.getApplyExamType()==2){ ApplyPaPerVO applyPaPerVO = baseMapper.getTrainApplyInfo(apply); String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(applyPaPerVO.getStartTime()).split(" ")[0]; String startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(applyPaPerVO.getStartTime()).split(" ")[1]; String endTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(applyPaPerVO.getEndTime()).split(" ")[1]; applyPaPerVO.setStringTime(time+" "+startTime.substring(0,startTime.length()-3) +"-"+ endTime.substring(0,endTime.length()-3)); return applyPaPerVO; } return null; } /** * 导出报名数数据 * @param apply 报名对象 * @return */ @Override public List getApplyExcelList(Apply apply) { return baseMapper.getApplyExcelList(apply); } /** * 查询人员是否已报名 * @param apply * @return */ @Override public Integer getIsApply(Apply apply) { return baseMapper.getIsApply(apply); } /** * 查询人员是否已报名 * @param apply * @return */ @Override public List getSecurityApplyInfo(Apply apply) { return baseMapper.getSecurityApplyInfo(apply); } /** * 查询报名人员未关联考试的ids集合 * @return */ @Override public List getApplyIds() { return baseMapper.getApplyIds(); } /** * 查询报名清册信息 * @param apply 报名信息 * @return */ @Override public Map getApplyDetailList(ApplyVO apply) { //创建 map 对象 Map map = new HashMap<>(3); //查询考试信息 ExamPaper paper = examPaperService.getById(apply.getExamId()); map.put("examName",paper.getExamName()); //查询已报名的总人数 int num = baseMapper.getApplyDeatailNum(paper.getId()); map.put("num",num); //查询已报名的的人信息集合 List applyVOList = baseMapper.getApplyDetailList(paper.getId()); map.put("applyList",applyVOList); //返回数据 return map; } }