From 1b9ffef757ba5a31ee43eae21005660d950d92c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=81=92=E6=88=90?= <962704835@qq.com> Date: Fri, 20 Mar 2026 15:20:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=A5=E4=BC=8D=E4=BF=9D=E7=95=99=E5=AD=A6?= =?UTF-8?q?=E7=B1=8D-=E6=89=B9=E9=87=8F=E6=8F=92=E5=85=A5=EF=BC=88?= =?UTF-8?q?=E8=BE=85=E5=AF=BC=E5=91=98=E6=89=B9=E9=87=8F=E7=94=B3=E8=AF=B7?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RtEnlistmentReserveController.java | 28 +++++ .../mapper/RtEnlistmentReserveMapper.java | 14 +++ .../service/IRtEnlistmentReserveService.java | 7 ++ .../impl/RtEnlistmentReserveServiceImpl.java | 104 +++++++++++++++++- .../routine/RtEnlistmentReserveMapper.xml | 72 ++++++++++++ 5 files changed, 220 insertions(+), 5 deletions(-) diff --git a/srs-admin/src/main/java/com/srs/web/controller/routine/RtEnlistmentReserveController.java b/srs-admin/src/main/java/com/srs/web/controller/routine/RtEnlistmentReserveController.java index 780b47b..4b74a37 100644 --- a/srs-admin/src/main/java/com/srs/web/controller/routine/RtEnlistmentReserveController.java +++ b/srs-admin/src/main/java/com/srs/web/controller/routine/RtEnlistmentReserveController.java @@ -156,6 +156,34 @@ public class RtEnlistmentReserveController extends BaseController { return success(rtEnlistmentReserveService.insertRtEnlistmentReserve(rtEnlistmentReserve)); } + /** + * 批量插入应征入伍预约信息 + * @param list 预约信息列表 + * @return 插入结果 + */ + @PreAuthorize("@ss.hasPermi('routine:enlistmentReserve:add')") + @Log(title = "应征入伍保留学籍申请", businessType = BusinessType.INSERT) + @PostMapping("/batchInsert") + @ApiOperation("新增应征入伍保留学籍申请") + public AjaxResult batchInsert(@RequestBody List list) { + try { + // 调用批量插入方法 + int insertCount = rtEnlistmentReserveService.batchInsertRtEnlistmentReserve(list); + // 若依框架成功返回(带数据) + return AjaxResult.success("批量插入成功,共插入" + insertCount + "条数据", insertCount); + } catch (IllegalArgumentException e) { + // 入参无效异常(如姓名/学号为空) + return AjaxResult.error(e.getMessage()); + } catch (RuntimeException e) { + // 重复数据异常 + return AjaxResult.error(e.getMessage()); + } catch (Exception e) { + // 其他未知异常(若依框架建议记录日志) + logger.error("批量插入应征入伍预约信息失败", e); // 继承BaseController自带logger + return AjaxResult.error("批量插入失败:" + e.getMessage()); + } + } + /** * 修改应征入伍保留学籍申请 */ diff --git a/srs-routine/src/main/java/com/srs/routine/mapper/RtEnlistmentReserveMapper.java b/srs-routine/src/main/java/com/srs/routine/mapper/RtEnlistmentReserveMapper.java index bc8e630..69f437f 100644 --- a/srs-routine/src/main/java/com/srs/routine/mapper/RtEnlistmentReserveMapper.java +++ b/srs-routine/src/main/java/com/srs/routine/mapper/RtEnlistmentReserveMapper.java @@ -63,6 +63,20 @@ public interface RtEnlistmentReserveMapper extends BaseMapper list); + + /** + * 查询数据库中已存在的学生(姓名+学号拼接) + * @param list 待插入的学生列表 + * @return 已存在的学生标识(格式:姓名_学号) + */ + List selectExistStudents(List list); + /** * Mapper接口方法:统计指定年份的保留学籍记录数 * @param year 年份(如2026) diff --git a/srs-routine/src/main/java/com/srs/routine/service/IRtEnlistmentReserveService.java b/srs-routine/src/main/java/com/srs/routine/service/IRtEnlistmentReserveService.java index 2424e9f..cbbbe03 100644 --- a/srs-routine/src/main/java/com/srs/routine/service/IRtEnlistmentReserveService.java +++ b/srs-routine/src/main/java/com/srs/routine/service/IRtEnlistmentReserveService.java @@ -45,6 +45,13 @@ public interface IRtEnlistmentReserveService extends IService list); + /** * 修改应征入伍保留学籍申请 * diff --git a/srs-routine/src/main/java/com/srs/routine/service/impl/RtEnlistmentReserveServiceImpl.java b/srs-routine/src/main/java/com/srs/routine/service/impl/RtEnlistmentReserveServiceImpl.java index b88c8ee..8b62d94 100644 --- a/srs-routine/src/main/java/com/srs/routine/service/impl/RtEnlistmentReserveServiceImpl.java +++ b/srs-routine/src/main/java/com/srs/routine/service/impl/RtEnlistmentReserveServiceImpl.java @@ -1,11 +1,10 @@ package com.srs.routine.service.impl; import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.srs.common.core.domain.AjaxResult; import com.srs.common.core.domain.entity.SysUser; import com.srs.common.doman.dto.ProcessResultDto; @@ -177,6 +176,101 @@ public class RtEnlistmentReserveServiceImpl extends ServiceImpl list) { + // 1. 校验入参是否为空 + if (CollectionUtils.isEmpty(list)) { + return 0; + } + + // 2. 过滤掉姓名或学号为空的数据(避免拼接异常) + List validList = list.stream() + .filter(item -> item.getStudentName() != null && !item.getStudentName().isEmpty() + && item.getStudentNo() != null && !item.getStudentNo().isEmpty()) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(validList)) { + throw new IllegalArgumentException("待插入数据中无有效学生信息(姓名/学号为空)"); + } + + // 3. 查询数据库中已存在的学生(姓名_学号) + List existStudentKeys = rtEnlistmentReserveMapper.selectExistStudents(validList); + Set existStudentKeySet = new HashSet<>(existStudentKeys); + + // 4. 拆分重复数据和待插入数据 + List duplicateList = validList.stream() + .filter(item -> existStudentKeySet.contains(item.getStudentName() + "_" + item.getStudentNo())) + .collect(Collectors.toList()); + + List insertList = validList.stream() + .filter(item -> !existStudentKeySet.contains(item.getStudentName() + "_" + item.getStudentNo())) + .collect(Collectors.toList()); + + // 5. 存在重复数据则抛出异常提示 + if (!CollectionUtils.isEmpty(duplicateList)) { + String duplicateMsg = duplicateList.stream() + .map(item -> "学生姓名:" + item.getStudentName() + ",学号:" + item.getStudentNo()) + .collect(Collectors.joining(";")); + throw new RuntimeException("存在重复数据,不执行申请:" + duplicateMsg); + } + + // 6. 无重复数据时,为每条待插入数据生成唯一的reserveNo(核心新增逻辑) + if (!CollectionUtils.isEmpty(insertList)) { + // ========== 生成保留学籍编号(适配批量场景) ========== + // 6.1 获取当前系统年份(用于编号和序号重置判断) + SimpleDateFormat yearSdf = new SimpleDateFormat("yyyy"); + String currentYear = yearSdf.format(new Date()); // 如2026 + + // 6.2 查询「当前年份」的记录总数(按年份分组统计,实现每年序号重置) + // 统计rt_enlistment_reserve表中,reserve_no以"BLXJ("+currentYear+")"开头的记录数 + int yearTotal = rtEnlistmentReserveMapper.countByYear(currentYear); + + // ========== 保留学籍开始和结束日期生成核心逻辑 ========== + Calendar calendar = Calendar.getInstance(); + int currentMonth = calendar.get(Calendar.MONTH) + 1; // 月份从0开始,+1转为实际月份(1-12) + + // 6.3 为批量数据逐个生成递增的reserveNo + for (int i = 0; i < insertList.size(); i++) { + RtEnlistmentReserve item = insertList.get(i); + // 计算当前条目的序号(年份总数 + 1 + 循环索引,保证批量递增) + int seq = yearTotal + 1 + i; + // 补零为4位(0001、0002...9999) + String seqStr = String.format("%04d", seq); + // 拼接最终编号:BLXJ(年份)序号 + String reserveNo = "BLXJ(" + currentYear + ")" + seqStr; + // 设置到当前实体对象中 + item.setReserveNo(reserveNo); + + // ========== 保留学籍开始和结束日期生成核心逻辑 ========== + // --- 生成reserveStartDate(按学期判断) --- + // 重置Calendar为当前年份的起始 + calendar.clear(); + calendar.set(Calendar.YEAR, Integer.parseInt(currentYear)); + // 判断学期:春季(1-6月)→3月1日,秋季(7-12月)→9月1日 + if (currentMonth >= 1 && currentMonth <= 6) { + calendar.set(Calendar.MONTH, Calendar.MARCH); // 3月(Calendar中3月是2,这里直接用常量更清晰) + } else { + calendar.set(Calendar.MONTH, Calendar.SEPTEMBER); // 9月 + } + calendar.set(Calendar.DAY_OF_MONTH, 1); // 1日 + Date reserveStartDate = calendar.getTime(); + item.setReserveStartDate(reserveStartDate); + + // --- 生成reserveEndDate(startDate加2年) --- + Calendar endCalendar = (Calendar) calendar.clone(); // 克隆避免影响原日期 + endCalendar.add(Calendar.YEAR, 2); // 加2年 + Date reserveEndDate = endCalendar.getTime(); + item.setReserveEndDate(reserveEndDate); + } + } + + // 7. 执行批量插入 + if (CollectionUtils.isEmpty(insertList)) { + return 0; + } + return rtEnlistmentReserveMapper.batchInsertRtEnlistmentReserve(insertList); + } + /** * 修改应征入伍保留学籍申请 * @@ -250,7 +344,7 @@ public class RtEnlistmentReserveServiceImpl extends ServiceImpl + + + insert into rt_enlistment_reserve @@ -272,6 +282,68 @@ + + + insert into rt_enlistment_reserve + + + apply_no, + student_id, + teacher_name, + student_name, + gender, + nation, + grade, + student_no, + class_name, + major, + family_address, + parent_phone, + apply_reason, + apply_status, + process_instance_id, + reserve_no, + reserve_start_date, + reserve_end_date, + approval_no, + create_time, + update_time, + affix_id, + deploy_id, + dept_name, + + + values + + + #{item.applyNo}, + #{item.studentId}, + #{item.teacherName}, + #{item.studentName}, + #{item.gender}, + #{item.nation}, + #{item.grade}, + #{item.studentNo}, + #{item.className}, + #{item.major}, + #{item.familyAddress}, + #{item.parentPhone}, + #{item.applyReason}, + #{item.applyStatus}, + #{item.processInstanceId}, + #{item.reserveNo}, + #{item.reserveStartDate}, + #{item.reserveEndDate}, + #{item.approvalNo}, + #{item.createTime}, + #{item.updateTime}, + #{item.affixId}, + #{item.deployId}, + #{item.deptName}, + + + + update rt_enlistment_reserve