1. 优化角色部门权限分配时的部门加载效果
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -23,7 +23,7 @@
|
|||||||
<module>zt-module-template</module>
|
<module>zt-module-template</module>
|
||||||
<!-- <module>zt-module-iot</module>-->
|
<!-- <module>zt-module-iot</module>-->
|
||||||
<!-- <module>zt-module-databus</module>-->
|
<!-- <module>zt-module-databus</module>-->
|
||||||
<module>zt-module-rule</module>
|
<!-- <module>zt-module-rule</module>-->
|
||||||
<!-- <module>zt-module-html2pdf</module>-->
|
<!-- <module>zt-module-html2pdf</module>-->
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ public class DeptController {
|
|||||||
|
|
||||||
|
|
||||||
@GetMapping("/top-level-list")
|
@GetMapping("/top-level-list")
|
||||||
@Operation(summary = "获取顶级部门列表", description = "用于懒加载,只返回没有父部门的顶级部门")
|
@Operation(summary = "获取当前用户可访问的顶级部门列表", description = "用于懒加载,返回当前用户所属部门的最顶层祖先部门,如果用户没有关联任何部门则返回空列表")
|
||||||
@PreAuthorize("@ss.hasPermission('system:dept:query')")
|
@PreAuthorize("@ss.hasPermission('system:dept:query')")
|
||||||
public CommonResult<List<DeptRespVO>> getTopLevelDeptList() {
|
public CommonResult<List<DeptRespVO>> getTopLevelDeptList() {
|
||||||
List<DeptDO> list = deptService.getTopLevelDeptList();
|
List<DeptDO> list = deptService.getTopLevelDeptList();
|
||||||
|
|||||||
@@ -129,10 +129,11 @@ public interface DeptService {
|
|||||||
Set<CompanyDeptInfo> getCompanyDeptInfoListByUserId(Long userId);
|
Set<CompanyDeptInfo> getCompanyDeptInfoListByUserId(Long userId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取顶级部门列表
|
* 获取当前用户可访问的顶级部门列表
|
||||||
* 用于懒加载,只返回没有父部门的顶级部门
|
* 用于懒加载,返回当前用户所属部门的最顶层祖先部门
|
||||||
|
* 如果用户没有关联任何部门则返回空列表
|
||||||
*
|
*
|
||||||
* @return 顶级部门列表
|
* @return 当前用户可访问的顶级部门列表
|
||||||
*/
|
*/
|
||||||
List<DeptDO> getTopLevelDeptList();
|
List<DeptDO> getTopLevelDeptList();
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.zt.plat.module.system.service.dept;
|
|||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
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.enums.CommonStatusEnum;
|
||||||
import com.zt.plat.framework.common.pojo.CompanyDeptInfo;
|
import com.zt.plat.framework.common.pojo.CompanyDeptInfo;
|
||||||
import com.zt.plat.framework.common.util.object.BeanUtils;
|
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.mysql.userdept.UserDeptMapper;
|
||||||
import com.zt.plat.module.system.dal.redis.RedisKeyConstants;
|
import com.zt.plat.module.system.dal.redis.RedisKeyConstants;
|
||||||
import com.zt.plat.module.system.enums.dept.DeptSourceEnum;
|
import com.zt.plat.module.system.enums.dept.DeptSourceEnum;
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.cache.annotation.CacheEvict;
|
import org.springframework.cache.annotation.CacheEvict;
|
||||||
@@ -392,8 +392,60 @@ public class DeptServiceImpl implements DeptService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<DeptDO> getTopLevelDeptList() {
|
public List<DeptDO> getTopLevelDeptList() {
|
||||||
// 获取顶级部门:没有父部门的部门(parentId为null或0)
|
// 获取当前用户所属的部门列表
|
||||||
return deptMapper.selectList(DeptDO.PARENT_ID_ROOT, CommonStatusEnum.ENABLE.getStatus());
|
Set<Long> deptIds = userDeptMapper.selectValidListByUserIds(singleton(getLoginUserId()))
|
||||||
|
.stream()
|
||||||
|
.map(UserDeptDO::getDeptId)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
|
if (CollUtil.isEmpty(deptIds)) {
|
||||||
|
// 如果用户没有关联任何部门,返回空列表
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取用户所属部门的最顶层祖先部门
|
||||||
|
Set<Long> 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
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user