zlwu преди 1 година
родител
ревизия
ab09e6a2aa
променени са 22 файла, в които са добавени 288 реда и са изтрити 52 реда
  1. 2 2
      backend/ruoyi-modules/ruoyi-workflow/pom.xml
  2. 4 4
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentCancelLeaveController.java
  3. 4 4
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentLeaveController.java
  4. 1 1
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgStudentCancelLeave.java
  5. 1 1
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgStudentLeave.java
  6. 2 2
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgStudentCancelLeaveBo.java
  7. 2 2
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgStudentLeaveBo.java
  8. 2 2
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgStudentCancelLeaveVo.java
  9. 2 2
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgStudentLeaveVo.java
  10. 3 3
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentCancelLeaveMapper.java
  11. 3 3
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentLeaveMapper.java
  12. 3 3
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentCancelLeaveService.java
  13. 3 3
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentLeaveService.java
  14. 8 8
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentCancelLeaveServiceImpl.java
  15. 246 10
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentLeaveServiceImpl.java
  16. 1 1
      backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentCancelLeave/XgStudentCancelLeaveMapper.xml
  17. 1 1
      backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentLeave/XgStudentLeaveMapper.xml
  18. 0 0
      backend/sql/add_create_dept.sql
  19. 0 0
      backend/sql/add_create_dept_field.sql
  20. 0 0
      backend/sql/debug_compatibility_type.sql
  21. 0 0
      backend/sql/fix_compatibility_create_dept.sql
  22. 0 0
      backend/sql/fix_jcbt_scholarship_application_create_dept.sql

+ 2 - 2
backend/ruoyi-modules/ruoyi-workflow/pom.xml

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0"
-         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">
+    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">
     <parent>
         <groupId>org.dromara</groupId>
         <artifactId>ruoyi-modules</artifactId>
@@ -78,6 +77,7 @@
             <groupId>org.dromara.warm</groupId>
             <artifactId>warm-flow-plugin-ui-sb-web</artifactId>
         </dependency>
+
     </dependencies>
 
 </project>

+ 4 - 4
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/XgStudentCancelLeaveController.java → 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;
 
 /**

+ 4 - 4
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/XgStudentLeaveController.java → 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;
 
 /**

+ 1 - 1
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/XgStudentCancelLeave.java → 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.*;

+ 1 - 1
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/XgStudentLeave.java → 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.*;

+ 2 - 2
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/XgStudentCancelLeaveBo.java → 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;

+ 2 - 2
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/XgStudentLeaveBo.java → 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;

+ 2 - 2
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/XgStudentCancelLeaveVo.java → 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;

+ 2 - 2
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/XgStudentLeaveVo.java → 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;

+ 3 - 3
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/XgStudentCancelLeaveMapper.java → 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;
 
 /**

+ 3 - 3
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/XgStudentLeaveMapper.java → 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;
 
 /**

+ 3 - 3
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IXgStudentCancelLeaveService.java → 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;
 

+ 3 - 3
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IXgStudentLeaveService.java → 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;
 

+ 8 - 8
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/XgStudentCancelLeaveServiceImpl.java → 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;

+ 246 - 10
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/XgStudentLeaveServiceImpl.java → 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<XgStudentLeaveVo> queryPageList(XgStudentLeaveBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<XgStudentLeave> lqw = buildQueryWrapper(bo);
+        // 增加班级数据权限的过滤功能
+        // 第一步:调用权限过滤方法,获取过滤后的班级IDs(传入101作为根组织ID)
+        List<Long> filteredDeptIds = filterDeptIdsByPermission(101L);
+        log.info("权限过滤后的班级ID列表: {}", filteredDeptIds);
+
+        // 第二步:使用带权限过滤的查询条件构建器
+        LambdaQueryWrapper<XgStudentLeave> lqw = buildQueryWrapperWithPermission(bo, filteredDeptIds);
         Page<XgStudentLeaveVo> 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<Long> 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<Long> 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<Long> filteredDeptIds = new ArrayList<>();
+            if (deptId != null) {
+                // 如果入参deptId不为空,检查其子组织是否在权限范围内
+                List<Long> deptIdsWithChildren = getDeptIdsWithChildren(deptId);
+                for (Long deptIdWithChild : deptIdsWithChildren) {
+                    if (userAuthDeptIds.contains(deptIdWithChild)) {
+                        filteredDeptIds.add(deptIdWithChild);
+                    }
+                }
+            } else {
+                // 如果入参deptId为空,直接使用用户权限范围内的所有部门
+                filteredDeptIds.addAll(userAuthDeptIds);
+            }
+
+            // 对过滤后的deptIds,查找所有子组织包括他们自己
+            Set<Long> finalDeptIds = new HashSet<>();
+            for (Long filteredDeptId : filteredDeptIds) {
+                List<Long> deptIdsWithChildren = getDeptIdsWithChildren(filteredDeptId);
+                finalDeptIds.addAll(deptIdsWithChildren);
+            }
+
+            return new ArrayList<>(finalDeptIds);
+        }
+    }
+
+    /**
+     * 检查用户是否为全校管理员
+     *
+     * @param userId 用户ID
+     * @return 是否为全校管理员
+     */
+    private boolean checkIsSchoolManager(Long userId) {
+        LambdaQueryWrapper<XgStudentManager> 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<Long> getUserAuthDeptIds(Long userId) {
+        Set<Long> authDeptIds = new HashSet<>();
+
+        // 第三步:通过xg_student_manager和xg_student_manager_source关联,获取用户的权限范围
+        LambdaQueryWrapper<XgStudentManager> managerWrapper = Wrappers.lambdaQuery();
+        managerWrapper.eq(XgStudentManager::getUserId, userId)
+                .eq(XgStudentManager::getDeleted, "0")
+                .eq(XgStudentManager::getStatus, "0");
+
+        List<XgStudentManager> managers = xgStudentManagerMapper.selectList(managerWrapper);
+
+        for (XgStudentManager manager : managers) {
+            LambdaQueryWrapper<XgStudentManagerSource> sourceWrapper = Wrappers.lambdaQuery();
+            sourceWrapper.eq(XgStudentManagerSource::getManagerId, manager.getId())
+                    .eq(XgStudentManagerSource::getDeleted, "0")
+                    .eq(XgStudentManagerSource::getStatus, "0");
+
+            List<XgStudentManagerSource> 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<XgClassMsg> classWrapper = Wrappers.lambdaQuery();
+        classWrapper.eq(XgClassMsg::getClassTeacherId, userId)
+                .eq(XgClassMsg::getDeleted, 0L)
+                .eq(XgClassMsg::getClassStatus, "1");
+
+        List<XgClassMsg> 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<Long> getDeptIdsWithChildren(Long deptId) {
+        List<Long> deptIds = new ArrayList<>();
+        if (deptId != null) {
+            deptIds.add(deptId); // 包含自己
+
+            // 查找所有子组织
+            List<SysDept> childDepts = sysDeptMapper.selectListByParentId(deptId);
+            if (!childDepts.isEmpty()) {
+                List<Long> childDeptIds = childDepts.stream()
+                        .map(SysDept::getDeptId)
+                        .collect(Collectors.toList());
+                deptIds.addAll(childDeptIds);
+            }
+        }
+        return deptIds;
+    }
+
+    /**
+     * 构建带权限过滤的查询条件包装器
+     */
+    private LambdaQueryWrapper<XgStudentLeave> buildQueryWrapperWithPermission(XgStudentLeaveBo bo,
+            List<Long> filteredDeptIds) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<XgStudentLeave> 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<XgStudentLeave> buildQueryWrapper(XgStudentLeaveBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<XgStudentLeave> lqw = Wrappers.lambdaQuery();

+ 1 - 1
backend/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/studentLeave/XgStudentLeaveMapper.xml → backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentCancelLeave/XgStudentCancelLeaveMapper.xml

@@ -2,6 +2,6 @@
 <!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="org.dromara.workflow.mapper.XgStudentLeaveMapper">
+<mapper namespace="org.dromara.xg.mapper.XgStudentCancelLeaveMapper">
 
 </mapper>

+ 1 - 1
backend/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/studentCancelLeave/XgStudentCancelLeaveMapper.xml → backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentLeave/XgStudentLeaveMapper.xml

@@ -2,6 +2,6 @@
 <!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="org.dromara.workflow.mapper.XgStudentCancelLeaveMapper">
+<mapper namespace="org.dromara.xg.mapper.XgStudentLeaveMapper">
 
 </mapper>

+ 0 - 0
backend/add_create_dept.sql → backend/sql/add_create_dept.sql


+ 0 - 0
backend/add_create_dept_field.sql → backend/sql/add_create_dept_field.sql


+ 0 - 0
backend/debug_compatibility_type.sql → backend/sql/debug_compatibility_type.sql


+ 0 - 0
backend/fix_compatibility_create_dept.sql → backend/sql/fix_compatibility_create_dept.sql


+ 0 - 0
backend/fix_jcbt_scholarship_application_create_dept.sql → backend/sql/fix_jcbt_scholarship_application_create_dept.sql