diff --git a/backend/ruoyi-modules/ruoyi-workflow/pom.xml b/backend/ruoyi-modules/ruoyi-workflow/pom.xml
index d195fafa..16d05991 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/pom.xml
+++ b/backend/ruoyi-modules/ruoyi-workflow/pom.xml
@@ -1,7 +1,6 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
org.dromara
ruoyi-modules
@@ -78,6 +77,7 @@
org.dromara.warm
warm-flow-plugin-ui-sb-web
+
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/XgStudentCancelLeaveController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentCancelLeaveController.java
similarity index 95%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/XgStudentCancelLeaveController.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentCancelLeaveController.java
index ae27f485..7b9c05c3 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/XgStudentCancelLeaveController.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentCancelLeaveController.java
@@ -1,4 +1,4 @@
-package org.dromara.workflow.controller;
+package org.dromara.xg.controller;
import java.util.List;
@@ -17,9 +17,9 @@ import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
-import org.dromara.workflow.domain.vo.XgStudentCancelLeaveVo;
-import org.dromara.workflow.domain.bo.XgStudentCancelLeaveBo;
-import org.dromara.workflow.service.IXgStudentCancelLeaveService;
+import org.dromara.xg.domain.vo.XgStudentCancelLeaveVo;
+import org.dromara.xg.domain.bo.XgStudentCancelLeaveBo;
+import org.dromara.xg.service.IXgStudentCancelLeaveService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/XgStudentLeaveController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentLeaveController.java
similarity index 95%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/XgStudentLeaveController.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentLeaveController.java
index 2a772b6b..e2d446f2 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/XgStudentLeaveController.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentLeaveController.java
@@ -1,4 +1,4 @@
-package org.dromara.workflow.controller;
+package org.dromara.xg.controller;
import java.util.List;
@@ -17,9 +17,9 @@ import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
-import org.dromara.workflow.domain.vo.XgStudentLeaveVo;
-import org.dromara.workflow.domain.bo.XgStudentLeaveBo;
-import org.dromara.workflow.service.IXgStudentLeaveService;
+import org.dromara.xg.domain.vo.XgStudentLeaveVo;
+import org.dromara.xg.domain.bo.XgStudentLeaveBo;
+import org.dromara.xg.service.IXgStudentLeaveService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/XgStudentCancelLeave.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgStudentCancelLeave.java
similarity index 98%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/XgStudentCancelLeave.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgStudentCancelLeave.java
index ba9595ef..e2a54cf4 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/XgStudentCancelLeave.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgStudentCancelLeave.java
@@ -1,4 +1,4 @@
-package org.dromara.workflow.domain;
+package org.dromara.xg.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/XgStudentLeave.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgStudentLeave.java
similarity index 98%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/XgStudentLeave.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgStudentLeave.java
index 098df66c..97a58111 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/XgStudentLeave.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgStudentLeave.java
@@ -1,4 +1,4 @@
-package org.dromara.workflow.domain;
+package org.dromara.xg.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/XgStudentCancelLeaveBo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgStudentCancelLeaveBo.java
similarity index 98%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/XgStudentCancelLeaveBo.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgStudentCancelLeaveBo.java
index 42eb0f3c..4621628b 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/XgStudentCancelLeaveBo.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgStudentCancelLeaveBo.java
@@ -1,6 +1,6 @@
-package org.dromara.workflow.domain.bo;
+package org.dromara.xg.domain.bo;
-import org.dromara.workflow.domain.XgStudentCancelLeave;
+import org.dromara.xg.domain.XgStudentCancelLeave;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/XgStudentLeaveBo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgStudentLeaveBo.java
similarity index 98%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/XgStudentLeaveBo.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgStudentLeaveBo.java
index a355427a..a301f476 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/XgStudentLeaveBo.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgStudentLeaveBo.java
@@ -1,6 +1,6 @@
-package org.dromara.workflow.domain.bo;
+package org.dromara.xg.domain.bo;
-import org.dromara.workflow.domain.XgStudentLeave;
+import org.dromara.xg.domain.XgStudentLeave;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/XgStudentCancelLeaveVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgStudentCancelLeaveVo.java
similarity index 98%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/XgStudentCancelLeaveVo.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgStudentCancelLeaveVo.java
index 264975dd..adab1776 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/XgStudentCancelLeaveVo.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgStudentCancelLeaveVo.java
@@ -1,8 +1,8 @@
-package org.dromara.workflow.domain.vo;
+package org.dromara.xg.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
-import org.dromara.workflow.domain.XgStudentCancelLeave;
+import org.dromara.xg.domain.XgStudentCancelLeave;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/XgStudentLeaveVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgStudentLeaveVo.java
similarity index 98%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/XgStudentLeaveVo.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgStudentLeaveVo.java
index edf703ee..eb1fde66 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/XgStudentLeaveVo.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgStudentLeaveVo.java
@@ -1,8 +1,8 @@
-package org.dromara.workflow.domain.vo;
+package org.dromara.xg.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
-import org.dromara.workflow.domain.XgStudentLeave;
+import org.dromara.xg.domain.XgStudentLeave;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/XgStudentCancelLeaveMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentCancelLeaveMapper.java
similarity index 62%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/XgStudentCancelLeaveMapper.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentCancelLeaveMapper.java
index caab78f9..c471ff6b 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/XgStudentCancelLeaveMapper.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentCancelLeaveMapper.java
@@ -1,7 +1,7 @@
-package org.dromara.workflow.mapper;
+package org.dromara.xg.mapper;
-import org.dromara.workflow.domain.XgStudentCancelLeave;
-import org.dromara.workflow.domain.vo.XgStudentCancelLeaveVo;
+import org.dromara.xg.domain.XgStudentCancelLeave;
+import org.dromara.xg.domain.vo.XgStudentCancelLeaveVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/XgStudentLeaveMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentLeaveMapper.java
similarity index 67%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/XgStudentLeaveMapper.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentLeaveMapper.java
index e22919d7..951faf3f 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/XgStudentLeaveMapper.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentLeaveMapper.java
@@ -1,7 +1,7 @@
-package org.dromara.workflow.mapper;
+package org.dromara.xg.mapper;
-import org.dromara.workflow.domain.XgStudentLeave;
-import org.dromara.workflow.domain.vo.XgStudentLeaveVo;
+import org.dromara.xg.domain.XgStudentLeave;
+import org.dromara.xg.domain.vo.XgStudentLeaveVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IXgStudentCancelLeaveService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentCancelLeaveService.java
similarity index 92%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IXgStudentCancelLeaveService.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentCancelLeaveService.java
index 53e9a1da..1c3c23d5 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IXgStudentCancelLeaveService.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentCancelLeaveService.java
@@ -1,7 +1,7 @@
-package org.dromara.workflow.service;
+package org.dromara.xg.service;
-import org.dromara.workflow.domain.vo.XgStudentCancelLeaveVo;
-import org.dromara.workflow.domain.bo.XgStudentCancelLeaveBo;
+import org.dromara.xg.domain.vo.XgStudentCancelLeaveVo;
+import org.dromara.xg.domain.bo.XgStudentCancelLeaveBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IXgStudentLeaveService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentLeaveService.java
similarity index 93%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IXgStudentLeaveService.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentLeaveService.java
index 1878caa6..125b19e2 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IXgStudentLeaveService.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentLeaveService.java
@@ -1,7 +1,7 @@
-package org.dromara.workflow.service;
+package org.dromara.xg.service;
-import org.dromara.workflow.domain.vo.XgStudentLeaveVo;
-import org.dromara.workflow.domain.bo.XgStudentLeaveBo;
+import org.dromara.xg.domain.vo.XgStudentLeaveVo;
+import org.dromara.xg.domain.bo.XgStudentLeaveBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/XgStudentCancelLeaveServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentCancelLeaveServiceImpl.java
similarity index 95%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/XgStudentCancelLeaveServiceImpl.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentCancelLeaveServiceImpl.java
index 48ae1d71..b9e907da 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/XgStudentCancelLeaveServiceImpl.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentCancelLeaveServiceImpl.java
@@ -1,4 +1,4 @@
-package org.dromara.workflow.service.impl;
+package org.dromara.xg.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
@@ -10,13 +10,13 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
-import org.dromara.workflow.domain.bo.XgStudentCancelLeaveBo;
-import org.dromara.workflow.domain.vo.XgStudentCancelLeaveVo;
-import org.dromara.workflow.domain.XgStudentCancelLeave;
-import org.dromara.workflow.mapper.XgStudentCancelLeaveMapper;
-import org.dromara.workflow.service.IXgStudentCancelLeaveService;
-import org.dromara.workflow.service.IXgStudentLeaveService;
-import org.dromara.workflow.domain.bo.XgStudentLeaveBo;
+import org.dromara.xg.domain.bo.XgStudentCancelLeaveBo;
+import org.dromara.xg.domain.vo.XgStudentCancelLeaveVo;
+import org.dromara.xg.domain.XgStudentCancelLeave;
+import org.dromara.xg.mapper.XgStudentCancelLeaveMapper;
+import org.dromara.xg.service.IXgStudentCancelLeaveService;
+import org.dromara.xg.service.IXgStudentLeaveService;
+import org.dromara.xg.domain.bo.XgStudentLeaveBo;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/XgStudentLeaveServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentLeaveServiceImpl.java
similarity index 55%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/XgStudentLeaveServiceImpl.java
rename to backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentLeaveServiceImpl.java
index 571b449a..93f6cb80 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/XgStudentLeaveServiceImpl.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentLeaveServiceImpl.java
@@ -1,4 +1,4 @@
-package org.dromara.workflow.service.impl;
+package org.dromara.xg.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
@@ -10,20 +10,20 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
-import org.dromara.workflow.domain.bo.XgStudentLeaveBo;
-import org.dromara.workflow.domain.vo.XgStudentLeaveVo;
-import org.dromara.workflow.domain.XgStudentLeave;
-import org.dromara.workflow.mapper.XgStudentLeaveMapper;
-import org.dromara.workflow.service.IXgStudentLeaveService;
+import org.dromara.xg.domain.bo.XgStudentLeaveBo;
+import org.dromara.xg.domain.vo.XgStudentLeaveVo;
+import org.dromara.xg.domain.XgStudentLeave;
+import org.dromara.xg.mapper.XgStudentLeaveMapper;
+import org.dromara.xg.service.IXgStudentLeaveService;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.domain.TestLeave;
-import org.dromara.workflow.domain.XgStudentCancelLeave;
+import org.dromara.xg.domain.XgStudentCancelLeave;
import org.dromara.workflow.domain.bo.TestLeaveBo;
import org.dromara.workflow.domain.vo.TestLeaveVo;
import org.dromara.workflow.mapper.TestLeaveMapper;
-import org.dromara.workflow.mapper.XgStudentCancelLeaveMapper;
+import org.dromara.xg.mapper.XgStudentCancelLeaveMapper;
import org.dromara.workflow.service.ITestLeaveService;
-import org.dromara.workflow.service.IXgStudentCancelLeaveService;
+import org.dromara.xg.service.IXgStudentCancelLeaveService;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -41,10 +41,23 @@ import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.system.mapper.SysDeptMapper;
+import org.dromara.system.domain.SysDept;
+import org.dromara.xg.mapper.XgStudentManagerMapper;
+import org.dromara.xg.mapper.XgStudentManagerSourceMapper;
+import org.dromara.xg.mapper.XgClassMsgMapper;
+import org.dromara.xg.domain.XgStudentManager;
+import org.dromara.xg.domain.XgStudentManagerSource;
+import org.dromara.xg.domain.XgClassMsg;
import java.util.List;
import java.util.Map;
import java.util.Collection;
+import java.util.ArrayList;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.stream.Collectors;
/**
* 学生请假 - 记录学生的请假申请、审批和销假信息Service业务层处理
@@ -61,6 +74,11 @@ public class XgStudentLeaveServiceImpl implements IXgStudentLeaveService {
private final XgStudentLeaveMapper baseMapper;
private final WorkflowService workflowService;
private final XgStudentCancelLeaveMapper xgStudentCancelLeaveMapper;
+ // 添加权限过滤需要的依赖
+ private final SysDeptMapper sysDeptMapper;
+ private final XgStudentManagerMapper xgStudentManagerMapper;
+ private final XgStudentManagerSourceMapper xgStudentManagerSourceMapper;
+ private final XgClassMsgMapper xgClassMsgMapper;
/**
* 查询学生请假 - 记录学生的请假申请、审批和销假信息
@@ -82,7 +100,13 @@ public class XgStudentLeaveServiceImpl implements IXgStudentLeaveService {
*/
@Override
public TableDataInfo queryPageList(XgStudentLeaveBo bo, PageQuery pageQuery) {
- LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ // 增加班级数据权限的过滤功能
+ // 第一步:调用权限过滤方法,获取过滤后的班级IDs(传入101作为根组织ID)
+ List filteredDeptIds = filterDeptIdsByPermission(101L);
+ log.info("权限过滤后的班级ID列表: {}", filteredDeptIds);
+
+ // 第二步:使用带权限过滤的查询条件构建器
+ LambdaQueryWrapper lqw = buildQueryWrapperWithPermission(bo, filteredDeptIds);
Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@@ -99,6 +123,218 @@ public class XgStudentLeaveServiceImpl implements IXgStudentLeaveService {
return baseMapper.selectVoList(lqw);
}
+ /**
+ * 权限过滤方法
+ * 根据当前用户的权限范围过滤部门ID列表
+ *
+ * @param deptId 入参的部门ID
+ * @return 过滤后的部门ID列表
+ */
+ private List filterDeptIdsByPermission(Long deptId) {
+ // 获取当前登录用户ID
+ Long currentUserId = LoginHelper.getUserId();
+ log.info("当前登录用户ID: {}", currentUserId);
+
+ // 第一步:判断当前用户是否为全校管理员
+ boolean isSchoolManager = checkIsSchoolManager(currentUserId);
+ if (isSchoolManager) {
+ log.info("用户 {} 是全校管理员,不进行权限过滤", currentUserId);
+ // 全校管理员不进行过滤,返回包含入参deptId及其子组织的列表
+ return getDeptIdsWithChildren(deptId);
+ }
+
+ // 第二步:获取用户的总权限集合
+ Set userAuthDeptIds = getUserAuthDeptIds(currentUserId);
+ log.info("用户 {} 的权限范围: {}", currentUserId, userAuthDeptIds);
+
+ // 第三步:判断入参deptId是否在用户权限范围内
+ if (deptId != null && userAuthDeptIds.contains(deptId)) {
+ log.info("入参deptId {} 在用户权限范围内,不进行过滤", deptId);
+ // 在权限范围内,返回包含入参deptId及其子组织的列表
+ return getDeptIdsWithChildren(deptId);
+ } else {
+ log.info("入参deptId {} 不在用户权限范围内,进行权限过滤", deptId);
+ // 不在权限范围内,过滤deptIds,只保留在权限范围内的
+ List filteredDeptIds = new ArrayList<>();
+ if (deptId != null) {
+ // 如果入参deptId不为空,检查其子组织是否在权限范围内
+ List deptIdsWithChildren = getDeptIdsWithChildren(deptId);
+ for (Long deptIdWithChild : deptIdsWithChildren) {
+ if (userAuthDeptIds.contains(deptIdWithChild)) {
+ filteredDeptIds.add(deptIdWithChild);
+ }
+ }
+ } else {
+ // 如果入参deptId为空,直接使用用户权限范围内的所有部门
+ filteredDeptIds.addAll(userAuthDeptIds);
+ }
+
+ // 对过滤后的deptIds,查找所有子组织包括他们自己
+ Set finalDeptIds = new HashSet<>();
+ for (Long filteredDeptId : filteredDeptIds) {
+ List deptIdsWithChildren = getDeptIdsWithChildren(filteredDeptId);
+ finalDeptIds.addAll(deptIdsWithChildren);
+ }
+
+ return new ArrayList<>(finalDeptIds);
+ }
+ }
+
+ /**
+ * 检查用户是否为全校管理员
+ *
+ * @param userId 用户ID
+ * @return 是否为全校管理员
+ */
+ private boolean checkIsSchoolManager(Long userId) {
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(XgStudentManager::getUserId, userId)
+ .eq(XgStudentManager::getDeleted, "0")
+ .eq(XgStudentManager::getStatus, "0")
+ .eq(XgStudentManager::getManagerType, "1");
+
+ return xgStudentManagerMapper.selectCount(lqw) > 0;
+ }
+
+ /**
+ * 获取用户的总权限集合
+ *
+ * @param userId 用户ID
+ * @return 用户权限范围内的部门ID集合
+ */
+ private Set getUserAuthDeptIds(Long userId) {
+ Set authDeptIds = new HashSet<>();
+
+ // 第三步:通过xg_student_manager和xg_student_manager_source关联,获取用户的权限范围
+ LambdaQueryWrapper managerWrapper = Wrappers.lambdaQuery();
+ managerWrapper.eq(XgStudentManager::getUserId, userId)
+ .eq(XgStudentManager::getDeleted, "0")
+ .eq(XgStudentManager::getStatus, "0");
+
+ List managers = xgStudentManagerMapper.selectList(managerWrapper);
+
+ for (XgStudentManager manager : managers) {
+ LambdaQueryWrapper sourceWrapper = Wrappers.lambdaQuery();
+ sourceWrapper.eq(XgStudentManagerSource::getManagerId, manager.getId())
+ .eq(XgStudentManagerSource::getDeleted, "0")
+ .eq(XgStudentManagerSource::getStatus, "0");
+
+ List sources = xgStudentManagerSourceMapper.selectList(sourceWrapper);
+ for (XgStudentManagerSource source : sources) {
+ if (source.getAuthSource() != null) {
+ authDeptIds.add(source.getAuthSource());
+ }
+ }
+ }
+
+ // 第四步:通过xg_class_msg表,class_teacher_id=当前登录人id,deleted='0',class_status='1',获取id
+ LambdaQueryWrapper classWrapper = Wrappers.lambdaQuery();
+ classWrapper.eq(XgClassMsg::getClassTeacherId, userId)
+ .eq(XgClassMsg::getDeleted, 0L)
+ .eq(XgClassMsg::getClassStatus, "1");
+
+ List classes = xgClassMsgMapper.selectList(classWrapper);
+ for (XgClassMsg classMsg : classes) {
+ if (classMsg.getId() != null) {
+ authDeptIds.add(classMsg.getId());
+ }
+ }
+
+ return authDeptIds;
+ }
+
+ /**
+ * 获取部门ID及其所有子组织的ID列表
+ *
+ * @param deptId 部门ID
+ * @return 包含部门ID及其子组织的ID列表
+ */
+ private List getDeptIdsWithChildren(Long deptId) {
+ List deptIds = new ArrayList<>();
+ if (deptId != null) {
+ deptIds.add(deptId); // 包含自己
+
+ // 查找所有子组织
+ List childDepts = sysDeptMapper.selectListByParentId(deptId);
+ if (!childDepts.isEmpty()) {
+ List childDeptIds = childDepts.stream()
+ .map(SysDept::getDeptId)
+ .collect(Collectors.toList());
+ deptIds.addAll(childDeptIds);
+ }
+ }
+ return deptIds;
+ }
+
+ /**
+ * 构建带权限过滤的查询条件包装器
+ */
+ private LambdaQueryWrapper buildQueryWrapperWithPermission(XgStudentLeaveBo bo,
+ List filteredDeptIds) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.orderByDesc(XgStudentLeave::getCreateTime);
+
+ // 获取当前登录用户ID
+ Long currentUserId = LoginHelper.getUserId();
+
+ // 添加权限过滤条件:(班级ID必须在权限范围内) OR (是自己创建的请假单)
+ lqw.and(wrapper -> {
+ if (filteredDeptIds != null && !filteredDeptIds.isEmpty()) {
+ wrapper.in(XgStudentLeave::getClassId, filteredDeptIds);
+ } else {
+ // 如果用户没有任何权限,使用一个不存在的ID
+ wrapper.eq(XgStudentLeave::getClassId, -1L);
+ }
+ // OR 用户可以查看自己创建的请假单
+ wrapper.or().eq(XgStudentLeave::getStudentId, currentUserId);
+ });
+
+ // 原有的查询条件
+ lqw.eq(bo.getDeleted() != null, XgStudentLeave::getDeleted, bo.getDeleted());
+ lqw.eq(bo.getStudentId() != null, XgStudentLeave::getStudentId, bo.getStudentId());
+ lqw.like(StringUtils.isNotBlank(bo.getStudentName()), XgStudentLeave::getStudentName, bo.getStudentName());
+ lqw.eq(StringUtils.isNotBlank(bo.getStudentNo()), XgStudentLeave::getStudentNo, bo.getStudentNo());
+ lqw.eq(bo.getClassId() != null, XgStudentLeave::getClassId, bo.getClassId());
+ lqw.like(StringUtils.isNotBlank(bo.getClassName()), XgStudentLeave::getClassName, bo.getClassName());
+ lqw.eq(bo.getMajorId() != null, XgStudentLeave::getMajorId, bo.getMajorId());
+ lqw.like(StringUtils.isNotBlank(bo.getMajorName()), XgStudentLeave::getMajorName, bo.getMajorName());
+ lqw.eq(bo.getCollegeId() != null, XgStudentLeave::getCollegeId, bo.getCollegeId());
+ lqw.like(StringUtils.isNotBlank(bo.getCollegeName()), XgStudentLeave::getCollegeName, bo.getCollegeName());
+ lqw.eq(StringUtils.isNotBlank(bo.getLeaveTypeCode()), XgStudentLeave::getLeaveTypeCode, bo.getLeaveTypeCode());
+ lqw.like(StringUtils.isNotBlank(bo.getLeaveTypeName()), XgStudentLeave::getLeaveTypeName,
+ bo.getLeaveTypeName());
+ lqw.ge(bo.getStartTime() != null, XgStudentLeave::getStartTime, bo.getStartTime());
+ lqw.le(bo.getEndTime() != null, XgStudentLeave::getEndTime, bo.getEndTime());
+ lqw.eq(bo.getLeaveDuration() != null, XgStudentLeave::getLeaveDuration, bo.getLeaveDuration());
+ lqw.eq(StringUtils.isNotBlank(bo.getIsLeaveSchool()), XgStudentLeave::getIsLeaveSchool, bo.getIsLeaveSchool());
+ lqw.eq(StringUtils.isNotBlank(bo.getNeedCancel()), XgStudentLeave::getNeedCancel, bo.getNeedCancel());
+ lqw.eq(StringUtils.isNotBlank(bo.getEmergencyContact()), XgStudentLeave::getEmergencyContact,
+ bo.getEmergencyContact());
+ lqw.eq(StringUtils.isNotBlank(bo.getEmergencyPhone()), XgStudentLeave::getEmergencyPhone,
+ bo.getEmergencyPhone());
+ lqw.eq(StringUtils.isNotBlank(bo.getLeaveReason()), XgStudentLeave::getLeaveReason, bo.getLeaveReason());
+ lqw.eq(StringUtils.isNotBlank(bo.getLeaveLocation()), XgStudentLeave::getLeaveLocation, bo.getLeaveLocation());
+ lqw.eq(StringUtils.isNotBlank(bo.getAttachmentOssIds()), XgStudentLeave::getAttachmentOssIds,
+ bo.getAttachmentOssIds());
+ lqw.eq(StringUtils.isNotBlank(bo.getApprovalStatus()), XgStudentLeave::getApprovalStatus,
+ bo.getApprovalStatus());
+ lqw.eq(StringUtils.isNotBlank(bo.getApprovalOpinion()), XgStudentLeave::getApprovalOpinion,
+ bo.getApprovalOpinion());
+ lqw.eq(bo.getApprovalTime() != null, XgStudentLeave::getApprovalTime, bo.getApprovalTime());
+ lqw.eq(bo.getApprovalBy() != null, XgStudentLeave::getApprovalBy, bo.getApprovalBy());
+ lqw.like(StringUtils.isNotBlank(bo.getApprovalByName()), XgStudentLeave::getApprovalByName,
+ bo.getApprovalByName());
+ lqw.eq(StringUtils.isNotBlank(bo.getCancelStatus()), XgStudentLeave::getCancelStatus, bo.getCancelStatus());
+ lqw.eq(bo.getCancelTime() != null, XgStudentLeave::getCancelTime, bo.getCancelTime());
+ lqw.eq(StringUtils.isNotBlank(bo.getCancelLocation()), XgStudentLeave::getCancelLocation,
+ bo.getCancelLocation());
+ lqw.eq(StringUtils.isNotBlank(bo.getCancelPhotoOssIds()), XgStudentLeave::getCancelPhotoOssIds,
+ bo.getCancelPhotoOssIds());
+ lqw.eq(StringUtils.isNotBlank(bo.getCancelRemark()), XgStudentLeave::getCancelRemark, bo.getCancelRemark());
+ return lqw;
+ }
+
private LambdaQueryWrapper buildQueryWrapper(XgStudentLeaveBo bo) {
Map params = bo.getParams();
LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/studentLeave/XgStudentLeaveMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentCancelLeave/XgStudentCancelLeaveMapper.xml
similarity index 72%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/studentLeave/XgStudentLeaveMapper.xml
rename to backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentCancelLeave/XgStudentCancelLeaveMapper.xml
index b9ca4c58..1fc4dd11 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/studentLeave/XgStudentLeaveMapper.xml
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentCancelLeave/XgStudentCancelLeaveMapper.xml
@@ -2,6 +2,6 @@
-
+
diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/studentCancelLeave/XgStudentCancelLeaveMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentLeave/XgStudentLeaveMapper.xml
similarity index 67%
rename from backend/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/studentCancelLeave/XgStudentCancelLeaveMapper.xml
rename to backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentLeave/XgStudentLeaveMapper.xml
index a488de9e..66df5095 100644
--- a/backend/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/studentCancelLeave/XgStudentCancelLeaveMapper.xml
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentLeave/XgStudentLeaveMapper.xml
@@ -2,6 +2,6 @@
-
+
diff --git a/backend/add_create_dept.sql b/backend/sql/add_create_dept.sql
similarity index 100%
rename from backend/add_create_dept.sql
rename to backend/sql/add_create_dept.sql
diff --git a/backend/add_create_dept_field.sql b/backend/sql/add_create_dept_field.sql
similarity index 100%
rename from backend/add_create_dept_field.sql
rename to backend/sql/add_create_dept_field.sql
diff --git a/backend/debug_compatibility_type.sql b/backend/sql/debug_compatibility_type.sql
similarity index 100%
rename from backend/debug_compatibility_type.sql
rename to backend/sql/debug_compatibility_type.sql
diff --git a/backend/fix_compatibility_create_dept.sql b/backend/sql/fix_compatibility_create_dept.sql
similarity index 100%
rename from backend/fix_compatibility_create_dept.sql
rename to backend/sql/fix_compatibility_create_dept.sql
diff --git a/backend/fix_jcbt_scholarship_application_create_dept.sql b/backend/sql/fix_jcbt_scholarship_application_create_dept.sql
similarity index 100%
rename from backend/fix_jcbt_scholarship_application_create_dept.sql
rename to backend/sql/fix_jcbt_scholarship_application_create_dept.sql