package org.springblade.modules.training.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.FTP.FtpUtil; import org.springblade.modules.apply.entity.Apply; import org.springblade.modules.apply.excel.ApplyImporter; import org.springblade.modules.apply.excel.ApplyInfoExcel; import org.springblade.modules.apply.vo.ApplyVO; import org.springblade.modules.exam.entity.ExamPaper; import org.springblade.modules.exam.entity.ExamScore; import org.springblade.modules.exam.excel.ExamScoreExcel; import org.springblade.modules.exam.service.ExamPaperService; import org.springblade.modules.system.entity.User; import org.springblade.modules.system.service.IUserService; import org.springblade.modules.training.entity.TrainExam; import org.springblade.modules.training.entity.TrainingRegistration; import org.springblade.modules.training.excel.TrainingRegistrationExcel; import org.springblade.modules.training.excel.TrainingRegistrationImporter; import org.springblade.modules.training.service.TrainExamService; import org.springblade.modules.training.service.TrainingRegistrationService; import org.springblade.modules.training.vo.TrainingRegistrationVo; 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-12 * @desc 报名培训管理控制层 */ @RestController @AllArgsConstructor @RequestMapping("/trainingRegistration") public class TrainingRegistrationController { private final TrainingRegistrationService trainingRegistrationService; private final IUserService userService; private final ExamPaperService examPaperService; /** * 自定义分页 * @param query page,size * @param trainingRegistration 报名培训信息对象 */ @GetMapping("/page") public R> page(TrainingRegistrationVo trainingRegistration, Query query) { IPage pages = trainingRegistrationService.selectTrainingRegistrationPage(Condition.getPage(query), trainingRegistration); return R.data(pages); } /** * 新增 * @param trainingRegistration 报名培训信息对象 */ @PostMapping("/save") @ApiOperation(value = "新增", notes = "传入trainingRegistration") public R save(@RequestBody TrainingRegistration trainingRegistration){ //查询人员是否已报名 User user = userService.getById(trainingRegistration.getUserId()); if (null==user.getIsTrain()){ //已报名 trainingRegistration.setCancel(1); //默认为未考试状态 trainingRegistration.setIsExam(1); //未提交考试审核 trainingRegistration.setAuditStatus(4); trainingRegistration.setTrainingTime(new Date()); //报名 trainingRegistrationService.save(trainingRegistration); //修改保安报名状态 User user1 = new User(); user1.setId(Long.parseLong(trainingRegistration.getUserId())); user1.setIsTrain(1); userService.updateById(user1); //内网数据同步 saveTrainingRegistration(trainingRegistration,user1); return R.data(200,"报名成功"); }else { if (1==user.getIsTrain()){ return R.data(201,"已报名,不能重复报名"); } if (1!=user.getIsTrain()){ //已报名 trainingRegistration.setCancel(1); //默认为未考试状态 trainingRegistration.setIsExam(1); //未提交考试审核 trainingRegistration.setAuditStatus(4); trainingRegistration.setTrainingTime(new Date()); //报名 trainingRegistrationService.save(trainingRegistration); //修改保安报名状态 User user1 = new User(); user1.setId(Long.parseLong(trainingRegistration.getUserId())); user1.setIsTrain(1); userService.updateById(user1); //内网数据同步 saveTrainingRegistration(trainingRegistration,user1); return R.data(200,"报名成功"); } } return R.data(202,"报名失败"); } /** * 报名 */ 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); } /** * 取消报名 * @param trainingRegistration 考试报名信息对象 */ @PostMapping("/cancelTrain") public R cancelApply(@RequestBody TrainingRegistration trainingRegistration){ //查询人员是否已报名 User user = userService.getById(trainingRegistration.getUserId()); if(null==user.getIsTrain()){ trainingRegistration.setCancel(2); boolean status = trainingRegistrationService.updateById(trainingRegistration); //修改保安报名状态 user.setIsTrain(2); userService.updateById(user); //数据同步 cancelTrainingRegistrationSync(trainingRegistration,user); if (status){ return R.data(200,"取消报名成功"); } }else { if(user.getIsTrain()==1){ trainingRegistration.setCancel(2); boolean status = trainingRegistrationService.updateById(trainingRegistration); //修改保安报名状态 user.setIsTrain(2); userService.updateById(user); //数据同步 cancelTrainingRegistrationSync(trainingRegistration,user); if (status){ return R.data(200,"取消报名成功"); } }else { return R.data(201,"尚未报名"); } } return R.data(202,"取消报名失败"); } /** * 审核通过 * @param trainingRegistration 考试报名信息对象 */ @PostMapping("/auditSucess") public R auditSucess(@RequestBody TrainingRegistration trainingRegistration){ //查询人员信息 User user = userService.getById(trainingRegistration.getUserId()); boolean status = false; if (null!=user){ //修改为已报名状态 user.setIsTrain(1); userService.updateById(user); trainingRegistration.setAuditStatus(1); trainingRegistration.setCancel(1); status = trainingRegistrationService.updateById(trainingRegistration); //数据同步 cancelTrainingRegistrationSync(trainingRegistration,user); } return R.data(status); } /** * 取消报名,并设置为审核不通过 * @param trainingRegistration 考试报名信息对象 */ @PostMapping("/cancelTrainAudit") public R cancelApplyAudit(@RequestBody TrainingRegistration trainingRegistration){ //查询人员是否已报名 User user = userService.getById(trainingRegistration.getUserId()); if(null==user.getIsTrain()){ trainingRegistration.setCancel(2); trainingRegistration.setAuditStatus(2); boolean status = trainingRegistrationService.updateById(trainingRegistration); //修改保安报名状态 user.setIsTrain(2); userService.updateById(user); //数据同步 cancelTrainingRegistrationSync(trainingRegistration,user); if (status){ return R.data(200,"取消报名成功"); } }else { if(user.getIsTrain()==1){ trainingRegistration.setCancel(2); trainingRegistration.setAuditStatus(2); boolean status = trainingRegistrationService.updateById(trainingRegistration); //修改保安报名状态 user.setIsTrain(2); userService.updateById(user); //数据同步 cancelTrainingRegistrationSync(trainingRegistration,user); if (status){ return R.data(200,"取消报名成功"); } }else { return R.data(201,"尚未报名"); } } return R.data(202,"取消报名失败"); } /** * 取消报名同步 */ private void cancelTrainingRegistrationSync(TrainingRegistration trainingRegistration,User user){ String s = "update sys_training_registration set cancel = " + trainingRegistration.getCancel() + ",audit_status = " + "'" + trainingRegistration.getAuditStatus() + "'" + " " +"where id = " + "'" + trainingRegistration.getId() + "';" + "update blade_user set is_train = " + user.getIsTrain() + " " +"where id = " + "'" + user.getId() + "'"; FtpUtil.sqlFileUpload(s); } /** * 批量报名 * @param trainingRegistration 考试报名信息对象 */ @PostMapping("/batchTrain") public R batchApply(@RequestBody TrainingRegistrationVo trainingRegistration){ List list = Arrays.asList(trainingRegistration.getUserIds().split(",")); list.forEach(userId ->{ User user = userService.getById(userId); //未报名的新增,已报名的不做处理 if (null==user.getIsTrain()) { TrainingRegistration trainingRegistration1 = new TrainingRegistration(); trainingRegistration1.setCancel(1); //默认为未考试状态 trainingRegistration1.setIsExam(1); //未提交考试审核 trainingRegistration.setAuditStatus(4); trainingRegistration1.setTrainingTime(new Date()); trainingRegistration1.setUserId(userId); trainingRegistration1.setTrainingUnitId(trainingRegistration.getTrainingUnitId()); trainingRegistrationService.save(trainingRegistration1); //修改保安报名状态 user.setIsTrain(1); userService.updateById(user); //数据同步 saveTrainingRegistration(trainingRegistration1,user); }else { if (user.getIsTrain()!=1) { TrainingRegistration trainingRegistration1 = new TrainingRegistration(); trainingRegistration1.setCancel(1); //默认为未考试状态 trainingRegistration1.setIsExam(1); //未提交考试审核 trainingRegistration.setAuditStatus(4); trainingRegistration1.setTrainingTime(new Date()); trainingRegistration1.setUserId(userId); trainingRegistration1.setTrainingUnitId(trainingRegistration.getTrainingUnitId()); trainingRegistrationService.save(trainingRegistration1); //修改保安报名状态 user.setIsTrain(1); userService.updateById(user); //数据同步 saveTrainingRegistration(trainingRegistration1,user); } } }); return R.data(200,"报名成功"); } /** * 修改 * @param trainingRegistration 报名培训信息对象 */ @PostMapping("/update") public R update(@RequestBody TrainingRegistration trainingRegistration){ return R.status(trainingRegistrationService.updateById(trainingRegistration)); } /** * 新增或修改 * @param trainingRegistration 报名培训信息对象 */ @PostMapping("/submit") public R submit(@RequestBody TrainingRegistration trainingRegistration){ return R.data(trainingRegistrationService.saveOrUpdate(trainingRegistration)); } /** * 删除 * @param ids 报名培训信息ids 数组 */ @PostMapping("/remove") public R remove(@ApiParam(value = "主键集合") @RequestParam String ids) { return R.status(trainingRegistrationService.removeByIds(Func.toLongList(ids))); } /** * 详情 * @param trainingRegistration 报名培训信息对象 */ @GetMapping("/detail") @ApiOperation(value = "详情", notes = "传入trainingRegistration") public R detail(TrainingRegistration trainingRegistration) { TrainingRegistrationVo detail = trainingRegistrationService.selectTrainingRegistrationInfo(trainingRegistration); return R.data(detail); } // /** // * 导出报名数数据 // * @param response // * @param trainingRegistration 培训报名对象 // */ // @GetMapping("export-apply") // @ApiOperation(value = "导出报名清册") // public void exportApply(HttpServletResponse response,TrainingRegistrationVo trainingRegistration) { // List list = trainingRegistrationService.getTrainingRegistrationExcelList(trainingRegistration); // ExcelUtil.export(response, "培训报名清册数据"+ DateUtil.time(), "培训报名清册数据表", list, TrainingRegistrationExcel.class); // } /** * 导入报名考试数据 */ @PostMapping("import-trainingRegistration") @ApiOperation(value = "导入培训报名数据", notes = "传入excel") public R importUser(MultipartFile file, Integer isCovered,Long examId) { TrainingRegistrationImporter trainingRegistrationImporter = new TrainingRegistrationImporter(trainingRegistrationService, false,examId); ExcelUtil.save(file, trainingRegistrationImporter, TrainingRegistrationExcel.class); return R.success("操作成功"); } /** * 导出模板 */ @GetMapping("export-template") @ApiOperation(value = "导出模板") public void exportUser(HttpServletResponse response) { List list = new ArrayList<>(); ExcelUtil.export(response, "培训报名数据模板", "培训报名数据表", list, TrainingRegistrationExcel.class); } /** * 生成准考证号码 * @param trainingRegistration 考试报名信息对象 */ private String getCandidateNo(TrainingRegistration trainingRegistration) { //获取考试信息 ExamPaper examPaper = examPaperService.getById(trainingRegistration.getTrainExamId()); 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 = trainingRegistrationService.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 trainingRegistrationVo 考试开始时 */ @PostMapping("/batchExam") public R batchExam(@RequestBody TrainingRegistrationVo trainingRegistrationVo){ if (trainingRegistrationVo.getNumber()==0){ return R.data("报名人数不能小于1人"); }else { //查询已报名的人员前 number 个 //查询已报名未关联试卷的人员,同步报名列表 List applyIds = trainingRegistrationService.getTrainIds(trainingRegistrationVo); if (applyIds.size()>0){ //生成考试 ExamPaper examPaper = new ExamPaper(); examPaper.setExamType(2); examPaper.setStartTime(trainingRegistrationVo.getStartTime()); examPaper.setEndTime(trainingRegistrationVo.getEndTime()); Calendar instance = Calendar.getInstance(); instance.setTime(trainingRegistrationVo.getStartTime()); 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); //待审核 examPaper.setAuditStatus(3); //生成考试 examPaperService.save(examPaper); Long sid = examPaper.getId(); String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(examPaper.getStartTime()); String endTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(examPaper.getEndTime()); String s = "insert into ksxt_exam(id,exam_name,exam_type,start_time,end_time,audit_status) " + "values(" + "'" + sid + "'" + "," + "'" + examPaper.getExamName() + "'" + "," + "'" + examPaper.getExamType() +"'" + "," + "'" + format +"'" + "," + "'" + endTimeFormat +"'" + "," +"'" + examPaper.getAuditStatus() + "'" + ")"; FtpUtil.sqlFileUpload(s); //修改报名信息 applyIds.forEach(trainingRegistration ->{ if(null==trainingRegistration.getTrainExamId() && trainingRegistration.getTrainExamId()=="") { trainingRegistration.setTrainExamId(examPaper.getId().toString()); //提交考试审核 trainingRegistration.setAuditStatus(3); trainingRegistrationService.updateById(trainingRegistration); String s1 = "update sys_training_registration set train_exam_id = " + "'" + trainingRegistration.getTrainExamId() + "'" + ",audit_status = " + "'" + trainingRegistration.getAuditStatus() + "'" + " " + "where id = " + "'" + trainingRegistration.getId() + "'"; FtpUtil.sqlFileUpload(s1); } }); } } return null; } }