diff --git a/pom.xml b/pom.xml
index 14378818..cd5ca81e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
zt-module-template
- zt-module-rule
+
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/dept/DeptController.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/dept/DeptController.java
index 079a3e82..acf24e46 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/dept/DeptController.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/dept/DeptController.java
@@ -111,7 +111,7 @@ public class DeptController {
@GetMapping("/top-level-list")
- @Operation(summary = "获取顶级部门列表", description = "用于懒加载,只返回没有父部门的顶级部门")
+ @Operation(summary = "获取当前用户可访问的顶级部门列表", description = "用于懒加载,返回当前用户所属部门的最顶层祖先部门,如果用户没有关联任何部门则返回空列表")
@PreAuthorize("@ss.hasPermission('system:dept:query')")
public CommonResult> getTopLevelDeptList() {
List list = deptService.getTopLevelDeptList();
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptService.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptService.java
index ef71ebb1..25924e7e 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptService.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptService.java
@@ -129,10 +129,11 @@ public interface DeptService {
Set getCompanyDeptInfoListByUserId(Long userId);
/**
- * 获取顶级部门列表
- * 用于懒加载,只返回没有父部门的顶级部门
+ * 获取当前用户可访问的顶级部门列表
+ * 用于懒加载,返回当前用户所属部门的最顶层祖先部门
+ * 如果用户没有关联任何部门则返回空列表
*
- * @return 顶级部门列表
+ * @return 当前用户可访问的顶级部门列表
*/
List getTopLevelDeptList();
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptServiceImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptServiceImpl.java
index f0a8324a..1c0d9341 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptServiceImpl.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptServiceImpl.java
@@ -3,6 +3,7 @@ package com.zt.plat.module.system.service.dept;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
+import com.google.common.annotations.VisibleForTesting;
import com.zt.plat.framework.common.enums.CommonStatusEnum;
import com.zt.plat.framework.common.pojo.CompanyDeptInfo;
import com.zt.plat.framework.common.util.object.BeanUtils;
@@ -15,7 +16,6 @@ import com.zt.plat.module.system.dal.mysql.dept.DeptMapper;
import com.zt.plat.module.system.dal.mysql.userdept.UserDeptMapper;
import com.zt.plat.module.system.dal.redis.RedisKeyConstants;
import com.zt.plat.module.system.enums.dept.DeptSourceEnum;
-import com.google.common.annotations.VisibleForTesting;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
@@ -392,8 +392,60 @@ public class DeptServiceImpl implements DeptService {
@Override
public List getTopLevelDeptList() {
- // 获取顶级部门:没有父部门的部门(parentId为null或0)
- return deptMapper.selectList(DeptDO.PARENT_ID_ROOT, CommonStatusEnum.ENABLE.getStatus());
+ // 获取当前用户所属的部门列表
+ Set deptIds = userDeptMapper.selectValidListByUserIds(singleton(getLoginUserId()))
+ .stream()
+ .map(UserDeptDO::getDeptId)
+ .collect(Collectors.toSet());
+
+ if (CollUtil.isEmpty(deptIds)) {
+ // 如果用户没有关联任何部门,返回空列表
+ return Collections.emptyList();
+ }
+
+ // 获取用户所属部门的最顶层祖先部门
+ Set topLevelDeptIds = new HashSet<>();
+ for (Long deptId : deptIds) {
+ DeptDO dept = getDept(deptId);
+ if (dept != null && CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) {
+ // 找到该部门的最顶层祖先
+ DeptDO topLevelDept = findTopLevelAncestor(dept);
+ if (topLevelDept != null) {
+ topLevelDeptIds.add(topLevelDept.getId());
+ }
+ }
+ }
+
+ // 根据顶层部门ID获取部门详情
+ return topLevelDeptIds.stream()
+ .map(this::getDept)
+ .filter(Objects::nonNull)
+ .filter(dept -> CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus()))
+ .distinct()
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * 找到部门的最顶层祖先
+ *
+ * @param dept 部门
+ * @return 最顶层祖先部门
+ */
+ private DeptDO findTopLevelAncestor(DeptDO dept) {
+ if (dept == null) {
+ return null;
+ }
+
+ DeptDO current = dept;
+ while (current.getParentId() != null && !DeptDO.PARENT_ID_ROOT.equals(current.getParentId())) {
+ DeptDO parent = getDept(current.getParentId());
+ if (parent == null || !CommonStatusEnum.ENABLE.getStatus().equals(parent.getStatus())) {
+ break;
+ }
+ current = parent;
+ }
+
+ return current;
}
@Override