From f774f7313fcc6f796d272bb7b7c7b391c5acda15 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 4 Jul 2025 18:03:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E9=83=A8=E9=97=A8=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/SysDeptController.java | 22 +------ .../pjcloud/admin/service/SysDeptService.java | 3 +- .../service/impl/SysDeptServiceImpl.java | 63 ++++++++++++++++--- 3 files changed, 59 insertions(+), 29 deletions(-) diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysDeptController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysDeptController.java index d1ed5752b..23a118d8e 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysDeptController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysDeptController.java @@ -92,28 +92,10 @@ public class SysDeptController { */ @GetMapping(value = "/tree") public R getTree(String deptName, Long parentId) { - Long deptId = null; - try { - PjcloudUser user = SecurityUtils.getUser(); - deptId = user.getDeptId(); - } catch (Exception e) { - log.error("获取当前用户ID异常", e); - } - if (ObjectUtil.isEmpty(parentId)) { - parentId = deptId; - } - return R.ok(sysDeptService.selectTree(deptName, parentId, DataScope.of())); + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(sysDeptService.selectTree(deptName, parentId, user)); } - /** - * 返回树形菜单集合 - */ - @GetMapping(value = "/tree-select") - public R getTreeSelect(String deptName, Long parentId) { - return R.ok(sysDeptService.selectTree(deptName, parentId, null)); - } - - /** * 查询所有,无权限过滤 * simpleTree diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysDeptService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysDeptService.java index a241f15e0..c64710b36 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysDeptService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysDeptService.java @@ -27,6 +27,7 @@ import com.bsd.pjcloud.admin.api.vo.DeptExcelVO; import com.bsd.pjcloud.admin.api.vo.OrgTreeVO; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.security.service.PjcloudUser; import jakarta.validation.Valid; import org.springframework.validation.BindingResult; @@ -49,7 +50,7 @@ public interface SysDeptService extends IService { * @param deptName 部门名称 * @return 树 */ - List> selectTree(String deptName, Long parentId, DataScope dataScope); + List> selectTree(String deptName, Long parentId, PjcloudUser user); List> selectSimpleTree(String deptName, Long parentId); diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java index b6ec66f74..89eeaa548 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java @@ -42,6 +42,8 @@ import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.excel.vo.ErrorMessage; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; import lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; @@ -132,11 +134,10 @@ public class SysDeptServiceImpl extends ServiceImpl impl * @return 树 部门名称 */ @Override - public List> selectTree(String deptName, Long parentId, DataScope dataScope) { - List deptAllList = new ArrayList<>(); + public List> selectTree(String deptName, Long parentId, PjcloudUser user) { // 查询全部部门 LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName); - deptAllList = deptMapper.selectListByScope(queryWrapper, dataScope); + List deptAllList = deptMapper.selectList(queryWrapper); // 查询数据权限内部门 List deptOwnIdList = deptMapper .selectListByScope( @@ -159,6 +160,7 @@ public class SysDeptServiceImpl extends ServiceImpl impl // 有权限不返回标识 Map extra = new HashMap<>(8); extra.put("isLock", !deptOwnIdList.contains(dept.getDeptId())); + extra.put("visible", false); extra.put("createTime", dept.getCreateTime()); treeNode.setExtra(extra); return treeNode; @@ -174,13 +176,58 @@ public class SysDeptServiceImpl extends ServiceImpl impl return tree; }).collect(Collectors.toList()); } - if (ObjectUtil.isNotEmpty(parentId)) { - SysDept parentDept = getById(parentId); - if (ObjectUtil.isNotEmpty(parentDept) && ObjectUtil.isNotEmpty(parentDept.getParentId())) { - parentId = parentDept.getParentId(); + List> tree = TreeUtil.build(collect, parentId == null ? 0 : parentId); + if (ObjectUtil.isNotEmpty(tree)) { + if (ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getDeptId())) { + for (Tree rootNode : tree) { + markDeptAndRelatedVisible(rootNode, user.getDeptId()); + } } } - return TreeUtil.build(collect, parentId == null ? 0 : parentId); + return tree; + } + + /** + * 如果都是在targetDeptId这树上的visible都为true + */ + private void markDeptAndRelatedVisible(Tree node, Long targetDeptId) { + boolean shouldMarkVisible = isTargetOrAncestor(node, targetDeptId) || hasChildMatching(node, targetDeptId); + if (shouldMarkVisible) { + node.put("visible", true); + } + if (node.getChildren() != null) { + for (Tree child : node.getChildren()) { + markDeptAndRelatedVisible(child, targetDeptId); + } + } + } + + + /** + * 判断当前节点是否是目标节点,或者其父节点链上包含目标节点 + */ + private boolean isTargetOrAncestor(Tree node, Long targetDeptId) { + if (node.getId().equals(targetDeptId)) { + return true; + } + Tree parent = node.getParent(); + while (parent != null) { + if (parent.getId().equals(targetDeptId)) { + return true; + } + parent = parent.getParent(); + } + return false; + } + + /** + * 检查该节点及其子节点中是否存在目标节点 + */ + private boolean hasChildMatching(Tree node, Long targetDeptId) { + if (node.getChildren() == null) { + return false; + } + return node.getChildren().stream().anyMatch(child -> child.getId().equals(targetDeptId) || hasChildMatching(child, targetDeptId)); } @Override