From e0617333b3d7aa339a82577f5b3ac4b89f6797f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B2=91=E6=BA=AA?= <1015733727@qq.com> Date: Tue, 7 Jul 2026 23:54:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=83=A8=E9=97=A8=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/web/OrgDepartmentController.java | 7 +++ .../app/executor/OrgDepartmentExecutor.java | 59 ++++++++++++++++++- .../client/api/OrgDepartmentApi.java | 4 ++ .../safetyeval/client/co/OrgDepartmentCO.java | 5 ++ .../domain/gateway/OrgDepartmentGateway.java | 4 ++ .../service/OrgDepartmentDomainService.java | 6 ++ .../gatewayimpl/OrgDepartmentGatewayImpl.java | 28 ++++++--- 7 files changed, 103 insertions(+), 10 deletions(-) diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgDepartmentController.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgDepartmentController.java index a50d9b9..3df95e2 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgDepartmentController.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgDepartmentController.java @@ -17,6 +17,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.util.List; /** * 部门适配层(Controller) @@ -61,4 +62,10 @@ public class OrgDepartmentController { public PageResponse page(@Validated OrgDepartmentPageQuery query) { return orgDepartmentApi.page(query); } + + @ApiOperation("部门树列表") + @GetMapping("/tree") + public SingleResponse> tree(@Validated OrgDepartmentPageQuery query) { + return orgDepartmentApi.tree(query); + } } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgDepartmentExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgDepartmentExecutor.java index 291e165..df33981 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgDepartmentExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgDepartmentExecutor.java @@ -17,6 +17,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + /** * 部门执行器(App层) * @@ -77,7 +83,6 @@ public class OrgDepartmentExecutor implements OrgDepartmentApi { domainQuery.setPageSize(query.getSize()); domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId()); domainQuery.setOrgId(ThreadLocalUserInfoAdapter.getOrgId()); - domainQuery.setParentId(query.getParentId()); domainQuery.setDeptName(query.getDeptName()); PageResult pageResult = orgDepartmentDomainService.page(domainQuery); @@ -89,6 +94,58 @@ public class OrgDepartmentExecutor implements OrgDepartmentApi { pageResult.getTotal()); } + @Override + public SingleResponse> tree(OrgDepartmentPageQuery query) { + OrgDepartmentQuery domainQuery = new OrgDepartmentQuery(); + domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId()); + domainQuery.setOrgId(query.getOrgId() == null ? ThreadLocalUserInfoAdapter.get() : query.getOrgId()); + domainQuery.setDeptName(query.getDeptName()); + + List matched = orgDepartmentDomainService.list(domainQuery); + Map nodeMap = new LinkedHashMap<>(); + for (OrgDepartmentEntity entity : matched) { + collectWithAncestors(entity, nodeMap); + } + return SingleResponse.success(buildTree(nodeMap.values())); + } + + private void collectWithAncestors(OrgDepartmentEntity entity, Map nodeMap) { + OrgDepartmentEntity current = entity; + while (current != null && current.getId() != null) { + if (nodeMap.containsKey(current.getId())) { + return; + } + nodeMap.put(current.getId(), current); + Long parentId = current.getParentId(); + if (parentId == null || parentId == 0L) { + return; + } + current = orgDepartmentDomainService.get(parentId); + } + } + + private List buildTree(Collection entities) { + Map idToCo = new LinkedHashMap<>(); + for (OrgDepartmentEntity entity : entities) { + idToCo.put(String.valueOf(entity.getId()), toCO(entity)); + } + + List roots = new ArrayList<>(); + for (OrgDepartmentCO co : idToCo.values()) { + String parentId = co.getParentId(); + if (parentId == null || "0".equals(parentId) || !idToCo.containsKey(parentId)) { + roots.add(co); + continue; + } + OrgDepartmentCO parent = idToCo.get(parentId); + if (parent.getChildren() == null) { + parent.setChildren(new ArrayList<>()); + } + parent.getChildren().add(co); + } + return roots; + } + private OrgDepartmentCO toCO(OrgDepartmentEntity entity) { if (entity == null) { return null; diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/OrgDepartmentApi.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/OrgDepartmentApi.java index 49ddb19..a80e491 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/OrgDepartmentApi.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/OrgDepartmentApi.java @@ -7,6 +7,8 @@ import org.qinan.safetyeval.client.dto.OrgDepartmentAddCmd; import org.qinan.safetyeval.client.dto.OrgDepartmentModifyCmd; import org.qinan.safetyeval.client.dto.OrgDepartmentPageQuery; +import java.util.List; + /** * 部门接口定义(Client层) * @@ -23,4 +25,6 @@ public interface OrgDepartmentApi { SingleResponse delete(Long id); PageResponse page(OrgDepartmentPageQuery query); + + SingleResponse> tree(OrgDepartmentPageQuery query); } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgDepartmentCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgDepartmentCO.java index 79ed5b9..3eca824 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgDepartmentCO.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/OrgDepartmentCO.java @@ -3,6 +3,8 @@ package org.qinan.safetyeval.client.co; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * 部门CO(Client Object) * @@ -34,4 +36,7 @@ public class OrgDepartmentCO { @ApiModelProperty(value = "租户ID") private String tenantId; + + @ApiModelProperty(value = "子部门") + private List children; } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgDepartmentGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgDepartmentGateway.java index df178ec..c59f59a 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgDepartmentGateway.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgDepartmentGateway.java @@ -4,6 +4,8 @@ import org.qinan.safetyeval.domain.entity.OrgDepartmentEntity; import org.qinan.safetyeval.domain.query.OrgDepartmentQuery; import org.qinan.safetyeval.domain.query.PageResult; +import java.util.List; + /** * 部门Gateway接口(Domain层定义) * @@ -20,4 +22,6 @@ public interface OrgDepartmentGateway { void delete(Long id); PageResult page(OrgDepartmentQuery query); + + List list(OrgDepartmentQuery query); } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgDepartmentDomainService.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgDepartmentDomainService.java index ef5b060..b4a396b 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgDepartmentDomainService.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgDepartmentDomainService.java @@ -7,6 +7,8 @@ import org.qinan.safetyeval.domain.gateway.OrgDepartmentGateway; import org.qinan.safetyeval.domain.query.OrgDepartmentQuery; import org.qinan.safetyeval.domain.query.PageResult; +import java.util.List; + import javax.annotation.Resource; import org.springframework.stereotype.Service; @@ -48,4 +50,8 @@ public class OrgDepartmentDomainService { public PageResult page(OrgDepartmentQuery query) { return orgDepartmentGateway.page(query); } + + public List list(OrgDepartmentQuery query) { + return orgDepartmentGateway.list(query); + } } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgDepartmentGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgDepartmentGatewayImpl.java index b49bb89..6dad5f5 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgDepartmentGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgDepartmentGatewayImpl.java @@ -63,6 +63,24 @@ public class OrgDepartmentGatewayImpl implements OrgDepartmentGateway { @Override public PageResult page(OrgDepartmentQuery query) { + Page page = new Page<>(query.getPageNum(), query.getPageSize()); + IPage result = orgDepartmentMapper.selectPage(page, buildQueryWrapper(query)); + + List entities = result.getRecords().stream() + .map(this::toEntity) + .collect(Collectors.toList()); + + return PageResult.of(entities, result.getTotal(), result.getCurrent(), result.getSize()); + } + + @Override + public List list(OrgDepartmentQuery query) { + return orgDepartmentMapper.selectList(buildQueryWrapper(query)).stream() + .map(this::toEntity) + .collect(Collectors.toList()); + } + + private LambdaQueryWrapper buildQueryWrapper(OrgDepartmentQuery query) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(OrgDepartmentDO::getDeleteEnum, "false"); if (query.getOrgId() != null) { @@ -74,15 +92,7 @@ public class OrgDepartmentGatewayImpl implements OrgDepartmentGateway { if (StringUtils.hasText(query.getDeptName())) { wrapper.like(OrgDepartmentDO::getDeptName, query.getDeptName()); } - - Page page = new Page<>(query.getPageNum(), query.getPageSize()); - IPage result = orgDepartmentMapper.selectPage(page, wrapper); - - List entities = result.getRecords().stream() - .map(this::toEntity) - .collect(Collectors.toList()); - - return PageResult.of(entities, result.getTotal(), result.getCurrent(), result.getSize()); + return wrapper; } private OrgDepartmentDO toDO(OrgDepartmentEntity entity) {