From a76fd32d71db85bb615b23a9bcc55bd7794fc02e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cwuzhen=E2=80=9D?= Date: Wed, 16 Sep 2026 09:10:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(leave):=20=E4=B8=80=E5=B9=B4=E7=BA=A7?= =?UTF-8?q?=E8=AF=B7=E5=81=87=E4=BA=8C=E7=BA=A7=E5=AD=A6=E9=99=A2=E4=B8=8E?= =?UTF-8?q?=E5=88=86=E7=AE=A1=E9=A2=86=E5=AF=BC=E6=94=B9=E8=B5=B0=E4=BA=BA?= =?UTF-8?q?=E6=96=87=E5=AD=A6=E9=99=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按入学年与每年9月1日切届判定一年级;代理学院 dept_id 通过 sys_config 配置,提交时覆写选人,流程定义与销假不变。 Co-authored-by: Cursor --- .../xg/controller/XgStudentMsgController.java | 4 +- .../dromara/xg/mapper/XgStudentMsgMapper.java | 8 ++ .../service/impl/XgStudentMsgServiceImpl.java | 135 ++++++++++++------ .../mapper/studentMsg/XgStudentMsgMapper.xml | 10 ++ ..._20260916_leave_freshman_proxy_college.sql | 123 ++++++++++++++++ 5 files changed, 232 insertions(+), 48 deletions(-) create mode 100644 backend/script/sql/update/update_20260916_leave_freshman_proxy_college.sql diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentMsgController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentMsgController.java index 5d9ee589..a93b0d12 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentMsgController.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentMsgController.java @@ -829,7 +829,7 @@ public class XgStudentMsgController extends BaseController { log.info("根据学生ID获取学院请假审批人列表 - 学生ID: {}", studentId); List approverUserIds = xgStudentMsgService.getCollegeLeaveApproversByStudentId(studentId); if (approverUserIds.isEmpty()) { - return R.fail("未找到该学生所在学院的请假审批人"); + return R.fail("未找到学院请假审批人(一年级查人文学院角色 xsqj-ejxyspr),请联系管理员配置"); } return R.ok(approverUserIds); } @@ -846,7 +846,7 @@ public class XgStudentMsgController extends BaseController { log.info("根据学生ID获取二级学院分管领导ID列表 - 学生ID: {}", studentId); List leaderIds = xgStudentMsgService.getCollegeLeadersByStudentId(studentId); if (leaderIds.isEmpty()) { - return R.fail("未找到该学生所在学院的分管领导"); + return R.fail("未找到学院分管领导(一年级查人文学院 xg_college_leader),请联系管理员配置"); } return R.ok(leaderIds); } diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgMapper.java index b5737a8b..2ce3da84 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgMapper.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgMapper.java @@ -68,6 +68,14 @@ public interface XgStudentMsgMapper extends BaseMapperPlus + * 一年级(按入学年、每年9月1日切届)走 sys_config 配置的代理学院(人文学院); + * 二年级及以上走学生本学院。入学年缺失时禁止提交。 * * @param studentId 学生ID * @return 请假审批人用户ID列表 @@ -1095,34 +1111,16 @@ public class XgStudentMsgServiceImpl implements IXgStudentMsgService { @Override public List getCollegeLeaveApproversByStudentId(Long studentId) { log.info("根据学生ID获取学院请假审批人列表 - 学生ID: {}", studentId); - - // 1. 根据学生ID查询学院ID - String collegeIdStr = baseMapper.selectCollegeIdByStudentId(studentId); - Long collegeId = null; - if (StringUtils.isNotBlank(collegeIdStr)) { - try { - collegeId = Long.valueOf(collegeIdStr); - } catch (NumberFormatException e) { - log.warn("学院ID格式错误,无法转换为Long类型 - 学生ID: {}, collegeIdStr: {}", studentId, collegeIdStr); - return new ArrayList<>(); - } - } - if (collegeId == null) { - log.warn("未找到学生对应的学院信息 - 学生ID: {}", studentId); - return new ArrayList<>(); - } - - log.info("学生所在学院ID: {}", collegeId); - - // 2. 根据学院ID和角色Key查询具备请假审批角色的用户列表 - List approverUserIds = baseMapper.selectUserIdsByCollegeIdAndRoleKey(collegeId, "xsqj-ejxyspr"); - - log.info("找到的请假审批人数量: {}", approverUserIds.size()); + Long collegeId = resolveLeaveCollegeId(studentId); + List approverUserIds = baseMapper.selectUserIdsByCollegeIdAndRoleKey(collegeId, LEAVE_COLLEGE_APPROVER_ROLE_KEY); + log.info("找到的请假审批人数量: {}, collegeId: {}", approverUserIds.size(), collegeId); return approverUserIds; } /** * 根据学生ID获取二级学院分管领导ID列表 + *

+ * 一年级走人文学院(配置代理学院),二年级及以上走本学院;入学年缺失禁止提交。 * * @param studentId 学生ID * @return 分管领导ID列表 @@ -1130,32 +1128,77 @@ public class XgStudentMsgServiceImpl implements IXgStudentMsgService { @Override public List getCollegeLeadersByStudentId(Long studentId) { log.info("根据学生ID获取二级学院分管领导ID列表 - 学生ID: {}", studentId); - - // 1. 根据学生ID查询学院ID - String collegeIdStr = baseMapper.selectCollegeIdByStudentId(studentId); - Long collegeId = null; - if (StringUtils.isNotBlank(collegeIdStr)) { - try { - collegeId = Long.valueOf(collegeIdStr); - } catch (NumberFormatException e) { - log.warn("学院ID格式错误,无法转换为Long类型 - 学生ID: {}, collegeIdStr: {}", studentId, collegeIdStr); - return new ArrayList<>(); - } - } - if (collegeId == null) { - log.warn("未找到学生对应的学院信息 - 学生ID: {}", studentId); - return new ArrayList<>(); - } - - log.info("学生所在学院ID: {}", collegeId); - - // 2. 根据学院ID查询二级学院分管领导ID列表 + Long collegeId = resolveLeaveCollegeId(studentId); List leaderIds = baseMapper.selectCollegeLeaderIdsByCollegeId(collegeId); - - log.info("找到的二级学院分管领导数量: {}", leaderIds.size()); + log.info("找到的二级学院分管领导数量: {}, collegeId: {}", leaderIds.size(), collegeId); return leaderIds; } + /** + * 解析请假流程使用的学院ID:一年级 → 代理学院;非一年级 → 学生本学院。 + */ + private Long resolveLeaveCollegeId(Long studentId) { + Long enrollmentYear = baseMapper.selectEnrollmentYearByStudentId(studentId); + if (enrollmentYear == null) { + throw new ServiceException("学生入学年信息不完整,无法提交请假,请联系管理员维护班级或学生的入学年份"); + } + + String collegeIdStr = baseMapper.selectCollegeIdByStudentId(studentId); + Long ownCollegeId = parseCollegeId(collegeIdStr, studentId); + if (ownCollegeId == null) { + throw new ServiceException("未找到该学生所在学院信息,无法提交请假"); + } + + if (!isFreshmanByEnrollmentYear(enrollmentYear)) { + log.info("非一年级请假,使用学生本学院 - studentId: {}, enrollmentYear: {}, collegeId: {}", + studentId, enrollmentYear, ownCollegeId); + return ownCollegeId; + } + + Long proxyCollegeId = resolveFreshmanProxyCollegeId(); + log.info("一年级请假,使用代理学院 - studentId: {}, enrollmentYear: {}, proxyCollegeId: {}, ownCollegeId: {}", + studentId, enrollmentYear, proxyCollegeId, ownCollegeId); + return proxyCollegeId; + } + + /** + * 按入学年判断是否一年级。学年切换日:每年 9 月 1 日(Asia/Shanghai)。 + */ + private boolean isFreshmanByEnrollmentYear(Long enrollmentYear) { + LocalDate today = LocalDate.now(SHANGHAI_ZONE); + int currentCohortYear = today.getMonthValue() >= 9 ? today.getYear() : today.getYear() - 1; + return enrollmentYear.intValue() == currentCohortYear; + } + + /** + * 从系统参数读取一年级请假代理学院 dept_id。 + */ + private Long resolveFreshmanProxyCollegeId() { + String configValue = configService.getConfigValue(FRESHMAN_PROXY_COLLEGE_CONFIG_KEY); + if (StringUtils.isBlank(configValue)) { + throw new ServiceException("一年级请假代理学院未配置,请在系统参数中配置 " + + FRESHMAN_PROXY_COLLEGE_CONFIG_KEY); + } + try { + return Long.valueOf(configValue.trim()); + } catch (NumberFormatException e) { + throw new ServiceException("一年级请假代理学院配置无效(应为部门ID数字),请检查参数 " + + FRESHMAN_PROXY_COLLEGE_CONFIG_KEY); + } + } + + private Long parseCollegeId(String collegeIdStr, Long studentId) { + if (StringUtils.isBlank(collegeIdStr)) { + return null; + } + try { + return Long.valueOf(collegeIdStr); + } catch (NumberFormatException e) { + log.warn("学院ID格式错误 - 学生ID: {}, collegeIdStr: {}", studentId, collegeIdStr); + return null; + } + } + /** * 批量申请床位 * diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsg/XgStudentMsgMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsg/XgStudentMsgMapper.xml index cfe62f95..e5ed6db7 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsg/XgStudentMsgMapper.xml +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsg/XgStudentMsgMapper.xml @@ -155,6 +155,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND deleted = 0 + + +