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.modules.apply.entity.Apply; import org.springblade.modules.apply.excel.ApplyExcel; 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.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.UUID; /** * 考试报名服务实现类 * @author zhongrj */ @Service @AllArgsConstructor public class ApplyServiceImpl extends ServiceImpl implements ApplyService { private final ExamPaperService examPaperService; /** * 自定义分页数据 * @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); } @Override @Transactional(rollbackFor = Exception.class) public void importApply(List data, Boolean isCovered) { data.forEach(applyExcel -> { Apply apply = new Apply(); //设置数据 apply.setExamId(applyExcel.getExamId()); apply.setUserId(applyExcel.getUserId()); apply.setApplyTime(new Date()); apply.setApplyStatus(2); //去生成准考证号码 apply.setCandidateNo(getCandidateNo(apply)); //去生成考试编号 apply.setApplyCode(getApplyCode(apply)); //插入数据 this.save(apply); //内网新增 try { arg.test01(arg.url+"/apply/save",apply); } catch (Exception e) { e.printStackTrace(); } }); } /** * 生成准考证号码 * @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; 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; //查询是当前前缀已生成的数量 int count = 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) { 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; } }