package org.springblade.modules.apply.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; 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.excel.util.ExcelUtil; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.modules.apply.entity.Apply; import org.springblade.modules.apply.excel.ApplyExcel; import org.springblade.modules.apply.excel.ApplyImporter; import org.springblade.modules.apply.excel.ApplyInfoExcel; 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.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; /** * @author zhongrj * @time 2021-07-17 * @desc 考试报名管理控制层 */ @RestController @AllArgsConstructor @RequestMapping("/apply") public class ApplyController { private final ApplyService applyService; private final ExamPaperService examPaperService; private final IUserService userService; /** * 自定义分页 * @param query page,size * @param apply 考试报名信息对象 */ @GetMapping("/page") public R> page(ApplyVO apply, Query query) { IPage pages = applyService.selectApplyPage(Condition.getPage(query), apply); return R.data(pages); } /** * 分页 */ @GetMapping("/list") public R> list(Apply apply, Query query) { IPage pages = applyService.page(Condition.getPage(query), Condition.getQueryWrapper(apply)); return R.data(pages); } /** * 新增 * @param apply 考试报名信息对象 */ @PostMapping("/save") @ApiOperation(value = "新增", notes = "传入apply") public R save(@RequestBody Apply apply) { return R.status(applyService.save(apply)); } /** * 修改 * @param apply 考试报名信息对象 */ @PostMapping("/update") public R update(@RequestBody Apply apply) { return R.status(applyService.updateById(apply)); } /** * 新增或修改 * @param apply 考试报名信息对象 */ @PostMapping("/submit") public R submit(@RequestBody Apply apply) throws Exception { if (null==apply.getId()){ //查询人员是否已报名 User user = userService.getById(apply.getUserId()); if (null==user.getIsApply()){ //默认通过 apply.setApplyStatus(2); //默认为未考试状态 apply.setIsExam(1); apply.setApplyTime(new Date()); //修改保安报名状态 User user1 = new User(); user1.setId(apply.getUserId()); user1.setIsApply(1); userService.updateById(user1); return R.data(200,"报名成功"); }else { if (1==user.getIsApply()){ return R.data(201,"已报名,不能重复报名"); } if (2==user.getIsApply()){ //默认通过 apply.setApplyStatus(2); //默认为未考试状态 apply.setIsExam(1); apply.setApplyTime(new Date()); //修改保安报名状态 User user1 = new User(); user1.setId(apply.getUserId()); user1.setIsApply(1); userService.updateById(user1); return R.data(200,"报名成功"); } } //去生成准考证号码 // apply.setCandidateNo(getCandidateNo(apply)); //去生成考试编号 // apply.setApplyCode(getApplyCode(apply)); }else { //修改保安报名状态 User user = new User(); user.setId(apply.getUserId()); user.setIsApply(2); userService.updateById(user); } apply.setApplyStatus(4); boolean status = applyService.saveOrUpdate(apply); if (status){ //内网新增 // arg.test01(arg.url+"/apply/save",apply); return R.data(200,"取消报名成功"); } // //内网修改 // if(null!=apply.getId()){ // //修改 // arg.test01(arg.url+"/apply/update",apply); // } return R.data(202,"报名失败"); } /** * 导入报名考试数据 */ @PostMapping("import-apply") @ApiOperation(value = "导入报名考试数据", notes = "传入excel") public R importUser(MultipartFile file, Integer isCovered) { ApplyImporter applyImporter = new ApplyImporter(applyService, false); ExcelUtil.save(file, applyImporter, ApplyInfoExcel.class); return R.success("操作成功"); } /** * 导出模板 */ @GetMapping("export-template") @ApiOperation(value = "导出模板") public void exportUser(HttpServletResponse response) { List list = new ArrayList<>(); ExcelUtil.export(response, "考试报名数据模板", "考试报名数据表", list, ApplyInfoExcel.class); } /** * 导出报名数数据 * @param response * @param apply 报名对象 */ @GetMapping("export-apply") @ApiOperation(value = "导出报名清册") public void exportApply(HttpServletResponse response,Apply apply) { List list = applyService.getApplyExcelList(apply); ExcelUtil.export(response, "考试报名清册数据"+ DateUtil.time(), "考试报名清册数据表", list, ApplyInfoExcel.class); } /** * 生成准考证号码 * @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 = applyService.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 ids 考试报名信息ids 数组 */ @PostMapping("/remove") public R remove(@ApiParam(value = "主键集合") @RequestParam String ids) { //arg.sendPostRemoveByIds(arg.url+"/apply/remove",ids); return R.status(applyService.removeByIds(Func.toLongList(ids))); } /** * 详情 * @param apply 考试报名信息对象 */ @GetMapping("/detail") @ApiOperation(value = "详情", notes = "传入apply") public R details(Apply apply) { //查询考试报名详情 ApplyVO detail = applyService.selectApplyInfo(apply); //返回 return R.data(detail); } /** * 获取准考证信息 * @param apply * @return */ @GetMapping("/getApplyInfo") public R getApplyInfo(Apply apply,HttpServletResponse response) { response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Allow-Credentials", "true"); //查询考试报名详情 ApplyPaPerVO detail = applyService.getApplyInfo(apply); //返回 return R.data(detail); } /** * 取消报名 * @param apply 考试报名信息对象 */ @PostMapping("/cancelApply") public R cancelApply(@RequestBody Apply apply){ //查询人员是否已报名 User user = userService.getById(apply.getUserId()); if(null==user.getIsApply()){ apply.setApplyStatus(4); boolean status = applyService.updateById(apply); //修改保安报名状态 user.setIsApply(2); userService.updateById(user); if (status){ return R.data(200,"取消报名成功"); } }else { if (user.getIsApply()==2) { return R.data(201,"尚未报名"); } if(user.getIsApply()==1){ apply.setApplyStatus(4); boolean status = applyService.updateById(apply); //修改保安报名状态 user.setIsApply(2); userService.updateById(user); if (status){ return R.data(200,"取消报名成功"); } } } return R.data(202,"取消报名失败"); } /** * 批量报名 * @param apply 考试报名信息对象 */ @PostMapping("/batchApply") public R batchApply(@RequestBody ApplyVO apply){ List list = Arrays.asList(apply.getUserIds().split(",")); list.forEach(userId ->{ User user = userService.getById(userId); //未报名的新增,已报名的不做处理 if (null==user.getIsApply()) { Apply apply1 = new Apply(); apply1.setApplyStatus(2); //默认为未考试状态 apply1.setIsExam(1); apply1.setApplyTime(new Date()); apply1.setUserId(Long.parseLong(userId)); applyService.save(apply1); //修改保安报名状态 user.setIsApply(1); userService.updateById(user); }else { if (user.getIsApply()==2) { Apply apply1 = new Apply(); apply1.setApplyStatus(2); //默认为未考试状态 apply1.setIsExam(1); apply1.setApplyTime(new Date()); apply1.setUserId(Long.parseLong(userId)); applyService.save(apply1); //修改保安报名状态 user.setIsApply(1); userService.updateById(user); } } }); return R.data(200,"报名成功"); } /** * 生成试卷,报名 * @param ids 报名ids */ @PostMapping("/batchExam") public R batchExam(@RequestParam String ids, @RequestParam String examTime, @RequestParam Date startTime, @RequestParam Date endTime){ if (!ids.equals("")){ List list = Arrays.asList(ids.split(",")); if (list.size()>0){ ExamPaper examPaper = new ExamPaper(); examPaper.setExamTime(examTime); examPaper.setExamType(1); examPaper.setStartTime(startTime); examPaper.setEndTime(endTime); Calendar instance = Calendar.getInstance(); instance.setTime(startTime); int year = instance.get(Calendar.YEAR); int month = instance.get(Calendar.MONTH)+1; int day = instance.get(Calendar.DAY_OF_MONTH); String examName = year + "年" + month+ "月"+ day +"日" +"保安员证考试"; examPaper.setExamName(examName); //生成考试 examPaperService.save(examPaper); //修改报名信息 list.forEach(id ->{ Apply apply = new Apply(); apply.setId(Long.parseLong(id)); apply.setExamId(examPaper.getId()); apply.setCandidateNo(getCandidateNo(apply)); applyService.updateById(apply); }); } }else { //查询已报名未关联试卷的人员 List applyIds = applyService.getApplyIds(); if (applyIds.size()>0){ //生成考试 ExamPaper examPaper = new ExamPaper(); examPaper.setExamTime(examTime); examPaper.setExamType(1); examPaper.setStartTime(startTime); examPaper.setEndTime(endTime); Calendar instance = Calendar.getInstance(); instance.setTime(startTime); int year = instance.get(Calendar.YEAR); int month = instance.get(Calendar.MONTH)+1; int day = instance.get(Calendar.DAY_OF_MONTH); String examName = year + "年" + month+ "月"+ day +"日" +"保安员证考试"; examPaper.setExamName(examName); //生成考试 examPaperService.save(examPaper); //修改报名信息 applyIds.forEach(id ->{ Apply apply = new Apply(); apply.setId(id); apply.setExamId(examPaper.getId()); apply.setCandidateNo(getCandidateNo(apply)); applyService.updateById(apply); }); } } return null; } }