From 0bf906779e3156d68c4faf1c2e69b3cc645b440b Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Mon, 15 Mar 2021 17:23:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=E6=9D=83=E9=99=90?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/sys/SysDeptController.java | 6 +++ .../controller/sys/response/DeptTreeNode.java | 27 ++++++++++++ .../io/dataease/service/sys/DeptService.java | 29 +++++++++++++ frontend/src/api/system/dept.js | 9 +++- frontend/src/views/system/dept/index.vue | 10 +++-- frontend/src/views/system/menu/index.vue | 14 ++++--- frontend/src/views/system/user/index.vue | 41 +++++++++++++++---- 7 files changed, 118 insertions(+), 18 deletions(-) create mode 100644 backend/src/main/java/io/dataease/controller/sys/response/DeptTreeNode.java diff --git a/backend/src/main/java/io/dataease/controller/sys/SysDeptController.java b/backend/src/main/java/io/dataease/controller/sys/SysDeptController.java index 0f922996ef..1576da9a98 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SysDeptController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SysDeptController.java @@ -8,6 +8,7 @@ import io.dataease.controller.sys.request.DeptCreateRequest; import io.dataease.controller.sys.request.DeptDeleteRequest; import io.dataease.controller.sys.request.DeptStatusRequest; import io.dataease.controller.sys.response.DeptNodeResponse; +import io.dataease.controller.sys.response.DeptTreeNode; import io.dataease.service.sys.DeptService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -82,4 +83,9 @@ public class SysDeptController extends ResultHolder { deptService.updateStatus(request); } + @PostMapping("/nodesByDeptId/{deptId}") + public List nodesByDeptId(@PathVariable("deptId") Long deptId){ + return deptService.searchTree(deptId); + } + } diff --git a/backend/src/main/java/io/dataease/controller/sys/response/DeptTreeNode.java b/backend/src/main/java/io/dataease/controller/sys/response/DeptTreeNode.java new file mode 100644 index 0000000000..10fcc4ebf6 --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/sys/response/DeptTreeNode.java @@ -0,0 +1,27 @@ +package io.dataease.controller.sys.response; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class DeptTreeNode implements Serializable { + + private Long id; + + private String label; + + private Boolean hasChildren; + + private List children; + + public List toList(){ + List lists = new ArrayList<>(); + lists.add(this); + return lists; + } +} diff --git a/backend/src/main/java/io/dataease/service/sys/DeptService.java b/backend/src/main/java/io/dataease/service/sys/DeptService.java index 290d3468af..d33adcd36e 100644 --- a/backend/src/main/java/io/dataease/service/sys/DeptService.java +++ b/backend/src/main/java/io/dataease/service/sys/DeptService.java @@ -8,10 +8,12 @@ import io.dataease.base.mapper.ext.query.GridExample; import io.dataease.commons.utils.BeanUtils; import io.dataease.commons.utils.CommonBeanFactory; import io.dataease.controller.sys.base.BaseGridRequest; +import io.dataease.controller.sys.base.ConditionEntity; import io.dataease.controller.sys.request.DeptCreateRequest; import io.dataease.controller.sys.request.DeptDeleteRequest; import io.dataease.controller.sys.request.DeptStatusRequest; import io.dataease.controller.sys.request.SimpleTreeNode; +import io.dataease.controller.sys.response.DeptTreeNode; import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -139,6 +141,33 @@ public class DeptService { return sysDepts; } + public List searchTree(Long deptId){ + List roots = nodesByPid(0L); + if (deptId == DEPT_ROOT_PID) return roots.stream().map(this::format).collect(Collectors.toList()); + SysDept sysDept = sysDeptMapper.selectByPrimaryKey(deptId); + if (roots.stream().anyMatch(node -> node.getDeptId() == deptId)) return roots.stream().map(this::format).collect(Collectors.toList()); + SysDept current = sysDept; + DeptTreeNode currentNode = format(sysDept); + while (current.getPid() != DEPT_ROOT_PID){ + SysDept parent = sysDeptMapper.selectByPrimaryKey(current.getPid()); //pid上有索引 所以效率不会太差 + DeptTreeNode parentNode = format(parent); + parentNode.setChildren(currentNode.toList()); + current = parent; + currentNode = parentNode; + } + + DeptTreeNode targetRootNode = currentNode; + return roots.stream().map(node -> node.getDeptId() == targetRootNode.getId() ? targetRootNode : format(node)).collect(Collectors.toList()); + } + + private DeptTreeNode format(SysDept sysDept){ + DeptTreeNode deptTreeNode = new DeptTreeNode(); + deptTreeNode.setId(sysDept.getDeptId()); + deptTreeNode.setLabel(sysDept.getName()); + deptTreeNode.setHasChildren(sysDept.getSubCount() > 0); + return deptTreeNode; + } + private DeptService proxy(){ return CommonBeanFactory.getBean(DeptService.class); } diff --git a/frontend/src/api/system/dept.js b/frontend/src/api/system/dept.js index e322d2f08d..a371ee9998 100644 --- a/frontend/src/api/system/dept.js +++ b/frontend/src/api/system/dept.js @@ -41,4 +41,11 @@ export function editDept(data) { }) } -export default { addDept, delDept, editDept, getDeptTree, loadTable } +export function treeByDeptId(deptId) { + return request({ + url: '/api/dept/nodesByDeptId/' + deptId, + method: 'post' + }) +} + +export default { addDept, delDept, editDept, getDeptTree, loadTable, treeByDeptId } diff --git a/frontend/src/views/system/dept/index.vue b/frontend/src/views/system/dept/index.vue index e9aaeb5f17..fd65bcdbdb 100644 --- a/frontend/src/views/system/dept/index.vue +++ b/frontend/src/views/system/dept/index.vue @@ -24,7 +24,7 @@ @search="search" > -