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.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.system.service.MyAsyncService; import org.springblade.modules.training.vo.TrainingRegistrationVo; import org.springframework.beans.factory.annotation.Autowired; 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.config.FtpConfig.*; /** * @author zhongrj * @time 2021-07-17 * @desc 考试报名管理控制层 */ @RestController @AllArgsConstructor @RequestMapping("/apply") public class ApplyController { // @Autowired private final ApplyService applyService; // @Autowired private final ExamPaperService examPaperService; // @Autowired private final IUserService userService; // @Autowired private final ExamScoreService examScoreService; private final MyAsyncService myAsyncService; /** * 自定义分页 * * @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); myAsyncService.dataSync(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) { List list = Arrays.asList(ids.split(",")); list.forEach(id -> { //内网同步 String s1 = "delete from sys_apply where id = " + "'" + id + "'"; //FtpUtil.sqlFileUpload(s1); myAsyncService.dataSync(s1); }); 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); myAsyncService.dataSync(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); myAsyncService.dataSync(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); myAsyncService.dataSync(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.setCandidateNo(apply.getCandidateNo()); examScore.setExamTime(new Date()); //新增考试成绩 boolean save = examScoreService.save(examScore); if (save) { //内网同步 Long sid = examScore.getId(); String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(examScore.getExamTime()); String s = "insert into exam_score(id,candidate_no,exam_time,user_id,exam_id,apply_id) " + "values(" + "'" + sid + "'" + "," + "'" + examScore.getCandidateNo() + "'" + "," + "'" + format + "'" + "," + "'" + examScore.getUserId() + "'" + "," + "'" + examScore.getExamId() + "'" + "," + "'" + examScore.getApplyId() + "'" + ")"; //FtpUtil.sqlFileUpload(s); myAsyncService.dataSync(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, ftpPort, ftpUserName, ftpPassword, ftpPath, "/", "f" + response1 + ".json", in1); return "成功"; } }