package org.springblade.modules.apply.controller; import com.alibaba.fastjson.JSON; 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.FTP.OutJson; 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.entity.ExamScore; 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.IUserService; 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.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; import static org.springblade.common.constant.FtpConstant.*; /** * @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; private final ExamScoreService examScoreService; /** * 自定义分页 * @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){ //查询人员是否已报名 User user = userService.getById(apply.getUserId()); if (null==user.getIsApply()){ //默认通过 apply.setApplyStatus(2); //默认为未考试状态 apply.setIsExam(1); apply.setApplyTime(new Date()); //报名 applyService.save(apply); //修改保安报名状态 User user1 = new User(); user1.setId(apply.getUserId()); user1.setIsApply(1); userService.updateById(user1); //内网数据同步 saveApply(apply,user1); return R.data(200,"报名成功"); }else { if (1==user.getIsApply()){ return R.data(201,"已报名,不能重复报名"); } if (1!=user.getIsApply()){ //默认通过 apply.setApplyStatus(2); //默认为未考试状态 apply.setIsExam(1); apply.setApplyTime(new Date()); applyService.save(apply); //修改保安报名状态 User user1 = new User(); user1.setId(apply.getUserId()); user1.setIsApply(1); userService.updateById(user1); //内网数据同步 saveApply(apply,user1); return R.data(200,"报名成功"); } } return R.data(202,"报名失败"); } /** * 报名 */ private void saveApply(Apply apply,User user1){ String formatStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); Long id = apply.getId(); String s = "insert into sys_apply(id,user_id,apply_time,apply_status,is_exam) " + "values(" + "'" + id + "'" + "," + "'" + apply.getUserId() + "'" + "," + "'" + formatStr + "'" + "," + "'" + apply.getApplyStatus() + "'" + "," +"'" + apply.getIsExam() + "'" + ");" + "update blade_user set is_apply = " + user1.getIsApply() + " " +"where id = " + "'" + user1.getId() + "'"; FtpUtil.sqlFileUpload(s); } /** * 修改 * @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){ return R.data(applyService.saveOrUpdate(apply)); } /** * 导入报名考试数据 */ @PostMapping("import-apply") @ApiOperation(value = "导入报名考试数据", notes = "传入excel") public R importUser(MultipartFile file, Integer isCovered) { ApplyImporter applyImporter = new ApplyImporter(applyService, false,null); ExcelUtil.save(file, applyImporter, ApplyExcel.class); return R.success("操作成功"); } /** * 导入报名考试数据(已生成考试) */ @PostMapping("import-applys") @ApiOperation(value = "导入报名考试数据", notes = "传入excel") public R importUser(MultipartFile file, Integer isCovered,Long examId) { ApplyImporter applyImporter = new ApplyImporter(applyService, false,examId); ExcelUtil.save(file, applyImporter, ApplyExcel.class); return R.success("操作成功"); } /** * 导出模板 */ @GetMapping("export-template") @ApiOperation(value = "导出模板") public void exportUser(HttpServletResponse response) { List list = new ArrayList<>(); ExcelUtil.export(response, "考试报名数据模板", "考试报名数据表", list, ApplyExcel.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) { return R.status(applyService.removeByIds(Func.toLongList(ids))); } /** * 查询用户详情 * @param user */ @GetMapping("/userDetail") @ApiOperation(value = "详情", notes = "传入apply") public R details(User user) { //用户详情 User user1 = userService.getById(user.getId()); //返回 return R.data(user1); } /** * 详情 * @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); //取消报名同步 cancelApplySync(apply,user); if (status){ return R.data(200,"取消报名成功"); } }else { if(user.getIsApply()==1){ apply.setApplyStatus(4); boolean status = applyService.updateById(apply); //修改保安报名状态 user.setIsApply(2); userService.updateById(user); //取消报名同步 cancelApplySync(apply,user); if (status){ return R.data(200,"取消报名成功"); } }else { return R.data(201,"尚未报名"); } } return R.data(202,"取消报名失败"); } /** * 取消报名同步 */ private void cancelApplySync(Apply apply,User user){ String s = "update sys_apply set apply_status = " + apply.getApplyStatus() + " " +"where id = " + "'" + apply.getId() + "';" + "update blade_user set is_apply = " + user.getIsApply() + " " +"where id = " + "'" + user.getId() + "'"; FtpUtil.sqlFileUpload(s); } /** * 公司报名列表取消报名,无applyId * @param apply 考试报名信息对象 */ @PostMapping("/cancelApplyNotApplyId") public R cancelApplyNotApplyId(@RequestBody Apply apply){ //查询人员是否已报名 User user = userService.getById(apply.getUserId()); //查询报名信息,取最新的一条(即当前userId,)applyId最大的一条记录 Apply apply1 = applyService.getMaxApplyIdByUserIdInfo(apply.getUserId()); if(null==user.getIsApply()){ apply1.setApplyStatus(4); boolean status = applyService.updateById(apply1); //修改保安报名状态 user.setIsApply(2); userService.updateById(user); //取消报名同步 cancelApplySync(apply1,user); if (status){ return R.data(200,"取消报名成功"); } }else { if (user.getIsApply()!=1) { return R.data(201,"尚未报名"); } if(user.getIsApply()==1){ apply1.setApplyStatus(4); boolean status = applyService.updateById(apply1); //修改保安报名状态 user.setIsApply(2); userService.updateById(user); //取消报名同步 cancelApplySync(apply1,user); if (status){ return R.data(200,"取消报名成功"); } } } return R.data(202,"取消报名失败"); } /** * 批量报名 * @param ids userIds 人员 */ @PostMapping("/batchApply") public R batchApply(@RequestParam String ids,@RequestParam String deptId){ if (!ids.equals("")) { List list = Arrays.asList(ids.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); //内网数据同步 saveApply(apply1,user); } else { if (user.getIsApply() != 1) { 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); //内网数据同步 saveApply(apply1,user); } } }); }else { //查询所有未报名的人员 List users = userService.getNotApplyIdList(deptId); if (users.size()>0){ users.forEach(user ->{ //未报名的新增,已报名的不做处理 if (null == user.getIsApply()) { Apply apply1 = new Apply(); apply1.setApplyStatus(2); //默认为未考试状态 apply1.setIsExam(1); apply1.setApplyTime(new Date()); apply1.setUserId(user.getId()); applyService.save(apply1); //修改保安报名状态 user.setIsApply(1); userService.updateById(user); //内网数据同步 saveApply(apply1,user); } else { if (user.getIsApply() != 1) { Apply apply1 = new Apply(); apply1.setApplyStatus(2); //默认为未考试状态 apply1.setIsExam(1); apply1.setApplyTime(new Date()); apply1.setUserId(user.getId()); applyService.save(apply1); //修改保安报名状态 user.setIsApply(1); userService.updateById(user); //内网数据同步 saveApply(apply1,user); } } }); } } return R.data(200,"报名成功"); } /** * 生成考试,报名 * @param applyVO 报名info */ @PostMapping("/batchExam") public R batchExam(@RequestBody ApplyVO applyVO){ //查询已报名未关联试卷的人员 List applyIds = applyService.getApplyIds(applyVO); if (applyIds.size()>0){ //生成考试 ExamPaper examPaper = new ExamPaper(); examPaper.setExamType(1); examPaper.setStartTime(applyVO.getStartTime()); examPaper.setEndTime(applyVO.getEndTime()); Calendar instance = Calendar.getInstance(); instance.setTime(applyVO.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); //生成考试 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.getStartTime()); String s = "insert into ksxt_exam(id,exam_name,exam_type,start_time,end_time) " + "values(" + "'" + sid + "'" + "," + "'" + examPaper.getExamName() + "'" + "," + "'" + examPaper.getExamType() +"'" + "," + "'" + format +"'" + "," +"'" + endTimeFormat + "'" + ")"; FtpUtil.sqlFileUpload(s); //修改报名信息 applyIds.forEach(apply ->{ //如果查出来的是已存在考试信息数据,则跳过 if (null==apply.getExamId()){ apply.setExamId(examPaper.getId()); apply.setCandidateNo(getCandidateNo(apply)); applyService.updateById(apply); String s1 = "update sys_apply set exam_id = " + apply.getExamId() + ",candidate_no = " + "'" + apply.getCandidateNo() + "'" + " " +"where id = " + "'" + apply.getId() + "'"; FtpUtil.sqlFileUpload(s1); } }); } return null; } /** * 查询报名清册信息 * @param apply 报名信息 * @return */ @GetMapping("/getApplyDetailList") public Map getApplyDetailList(ApplyVO apply){ return applyService.getApplyDetailList(apply); } /** * 查询保安员个人报名信息 * @param apply 报名信息,包含userId * @return */ @GetMapping("/getSecurityApplyDetail") public ApplyVO getSecurityApplyDetail(ApplyVO apply){ return applyService.getSecurityApplyDetail(apply); } /** * 修改考试状态 * @param apply 报名信息,包含userId,applyid * @return */ @PostMapping("/updateApplyStatus") public ExamScore updateApplyStatus(@RequestBody ApplyVO apply){ applyService.updateApplyStatus(apply); //新增考试成绩,没有成绩数据,待提交答题后更新数据 ExamScore examScore = new ExamScore(); examScore.setExamId(apply.getExamId().toString()); examScore.setUserId(apply.getUserId().toString()); examScore.setApplyId(apply.getId()); examScore.setExamTime(new Date()); //新增考试成绩 examScoreService.save(examScore); //内网同步 Long sid = examScore.getId(); String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(examScore.getExamTime()); // String s = "insert into exam_score(id,exam_time,user_id,exam_id,apply_id) " + // "values(" + "'" + sid + "'" + "," + "'" + // format + "'" + "," + "'" + // examScore.getUserId() +"'" + "," +"'" + // examScore.getExamId() +"'" + "," +"'" + // examScore.getApplyId() + "'" + ")"; // FtpUtil.sqlFileUpload(s); return examScore; } /** * test * @return */ @GetMapping("/test") public Object test(){ String s1 = "insert into exam_score(id,exam_id,apply_id) values(223,88,315)"; String s2 = "111222333"; String s3 = "select * from ksxt_exam"; FtpUtil.sqlFileUpload(s1); FtpUtil.sqlFileUpload(s2); // FtpUtil.sqlFileUpload(s3); String json1 = JSON.toJSONString(s3); String response1 = String.valueOf((new Date()).getTime()); OutJson.createJsonFile(json1, localPath, "f"+response1); FileInputStream in1 = null; try { in1 = new FileInputStream(new File(localPath + "f"+response1+".json")); } catch (FileNotFoundException e) { e.printStackTrace(); } FtpUtil.uploadFile(ftpHost_dev, ftpPort, ftpUserName, ftpPassword, ftpPath, "/", "f"+response1+".json", in1); return "成功"; } }