From e8e939cd878a256a54181115e9327c730c1c024f Mon Sep 17 00:00:00 2001 From: liuyang Date: Mon, 23 Dec 2024 16:23:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:[REQ-3282]=20=E7=BC=96=E5=86=99=E7=BB=84?= =?UTF-8?q?=E7=BB=87=E8=8A=82=E7=82=B9=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orgmanax/api/node/req/ListNodeReq.java | 40 +++++++++------ .../CooperateShipQueryRepository.java | 26 ++++++++++ .../CooperateShipQueryRepositoryImpl.java | 15 ++++++ .../impl/NodeQueryRepositoryImpl.java | 2 +- .../repository/OrgJobQueryRepository.java | 36 ++++++++++++- .../impl/OrgJobQueryRepositoryImpl.java | 3 ++ .../node/service/impl/NodeServiceImpl.java | 50 +++++++++++++++++++ .../foundation/NodeUserFoundationService.java | 10 ++++ .../impl/NodeUserFoundationServiceImpl.java | 11 ++++ 9 files changed, 175 insertions(+), 18 deletions(-) diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/req/ListNodeReq.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/req/ListNodeReq.java index 64c3469..ebbef12 100644 --- a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/req/ListNodeReq.java +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/req/ListNodeReq.java @@ -12,16 +12,6 @@ import java.util.Set; @Data @SuperBuilder public class ListNodeReq extends PageReqV2 { - /** - * 页数 - */ - private Integer page; - - /** - * 条数 - */ - private Integer pageSize; - /** * ids */ @@ -57,14 +47,29 @@ public class ListNodeReq extends PageReqV2 { private Set topNodeIds; /** - * 是否查询祖先节点 + * 是否包含祖先节点 */ - private Boolean isSelectAncestors; + @Builder.Default + private Boolean includeAncestors = false; /** - * 是否查询子孙节点 + * 是否包含子孙节点 */ - private Boolean isSelectDescendant; + @Builder.Default + private Boolean includeDescendants = false; + + /** + * 是否包含父节点 + */ + @Builder.Default + private Boolean includeParent = false; + + /** + * 是否包含子节点 + */ + @Builder.Default + private Boolean includeChildren = false; + /** * 是否查询节点用户 @@ -74,7 +79,7 @@ public class ListNodeReq extends PageReqV2 { /** * 是否查询删除的 */ - private Boolean isSelectDelete; + private Boolean includeDelete; /** * 数据权限缓存数据key @@ -92,6 +97,11 @@ public class ListNodeReq extends PageReqV2 { */ private Set workspaceOuPairs; + /** + * 项目id集合 + */ + private Set workspaceIds; + /** * 需要返回管理员信息 */ diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/CooperateShipQueryRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/CooperateShipQueryRepository.java index 81ffaf6..cfc1e05 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/CooperateShipQueryRepository.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/CooperateShipQueryRepository.java @@ -132,6 +132,32 @@ public interface CooperateShipQueryRepository { @Builder.Default private Set parentIds = Collections.emptySet(); + /** + * path右值 + */ + @CriteriaField(field = "isDelete", operator = Operator.EQ) + @Builder.Default + private Long isDelete = 0L; + + /** + * 项目单位关系聚合查询 + */ + private List workspaceOuPairs; + + } + + @Data + class WorkspaceOuPair { + + /** + * 项目ID + */ + private Long workspaceId; + + /** + * 单位ID + */ + private Long ouId; } } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipQueryRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipQueryRepositoryImpl.java index 0536fad..89e8075 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipQueryRepositoryImpl.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipQueryRepositoryImpl.java @@ -16,6 +16,7 @@ import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -39,6 +40,20 @@ public class CooperateShipQueryRepositoryImpl implements CooperateShipQueryRepos } }); } + + if (CollUtil.isNotEmpty(req.getWorkspaceOuPairs())) { + wrapper.and(j -> { + for (WorkspaceOuPair workspaceOuPair : req.getWorkspaceOuPairs()) { + j.or(k -> { + k.eq(Objects.nonNull(workspaceOuPair.getOuId()), "organizational_unit_id", workspaceOuPair.getOuId()); + k.eq(Objects.nonNull(workspaceOuPair.getWorkspaceId()), "workspace_id", workspaceOuPair.getWorkspaceId()); + }); + } + }); + } + + + if (wrapper.isEmptyOfWhere()) { log.warn("CooperateShipResp empty of where query. return empty list. req = {}", req); return Collections.emptyList(); diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeQueryRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeQueryRepositoryImpl.java index 98fcd8a..c5382a3 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeQueryRepositoryImpl.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeQueryRepositoryImpl.java @@ -51,7 +51,7 @@ public class NodeQueryRepositoryImpl implements NodeQueryRepository { } private void assembleParentNode(ListNodeReq req, List records) { - if (!BooleanUtil.isTrue(req.getIsSelectAncestors())) { + if (!BooleanUtil.isTrue(req.getIncludeAncestors())) { return; } Map nodesById = records.stream().collect(Collectors.toMap(NodeResp::getId, Function.identity())); diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/OrgJobQueryRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/OrgJobQueryRepository.java index e9eb82e..e21381c 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/OrgJobQueryRepository.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/OrgJobQueryRepository.java @@ -1,19 +1,45 @@ package cn.axzo.orgmanax.infra.dao.orgjob.repository; import cn.axzo.foundation.dao.support.wrapper.CriteriaField; +import cn.axzo.foundation.dao.support.wrapper.Operator; import cn.axzo.foundation.page.PageReqV2; import cn.axzo.foundation.page.PageResp; import cn.axzo.orgmanax.infra.dao.orgjob.entity.OrgJob; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; + public interface OrgJobQueryRepository { + /** + * 分页查询 + * @param req + * @return + */ PageResp page(ListReq req); + /** + * 列表查询 + * @param req + * @return + */ + default List list(ListReq req) { + PageResp page = page(req); + if (page == null) { + return Collections.emptyList(); + } + return CollUtil.emptyIfNull(page.getData()); + } + @EqualsAndHashCode(callSuper = true) @NoArgsConstructor @@ -22,8 +48,14 @@ public interface OrgJobQueryRepository { @SuperBuilder class ListReq extends PageReqV2 { - @CriteriaField - private String name; + /** + * 岗位id + */ + @CriteriaField(field = "id", operator = Operator.IN) + private Collection ids; + + @CriteriaField(field = "code", operator = Operator.IN) + private Collection codes; } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/impl/OrgJobQueryRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/impl/OrgJobQueryRepositoryImpl.java index 77ba507..47e1187 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/impl/OrgJobQueryRepositoryImpl.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/impl/OrgJobQueryRepositoryImpl.java @@ -28,6 +28,9 @@ public class OrgJobQueryRepositoryImpl implements OrgJobQueryRepository { public PageResp page(ListReq req) { IPage page = PageConverter.toMybatis(req, OrgJob.class); QueryWrapper wrapper = QueryWrapperHelper.fromBean(req, OrgJob.class); + if (wrapper.isEmptyOfWhere()) { + return PageResp.builder().build(); + } IPage results = orgJobDao.page(page, wrapper) .convert(e -> BeanUtil.toBean(e, OrgJob.class)); PageResp resp = PageConverter.toResp(results); diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java index 85ba0c0..d177add 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java @@ -5,17 +5,29 @@ import cn.axzo.foundation.page.PageResp; import cn.axzo.orgmanax.api.node.req.ListNodeReq; import cn.axzo.orgmanax.api.node.req.ProcessNodeReq; import cn.axzo.orgmanax.api.node.resp.OrgNodeDTO; +import cn.axzo.orgmanax.api.nodeuser.req.ListNodeUserReq; import cn.axzo.orgmanax.common.config.BizResultCode; +import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipQueryRepository; import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; +import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; +import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; +import cn.axzo.orgmanax.infra.dao.orgjob.entity.OrgJob; +import cn.axzo.orgmanax.infra.dao.orgjob.repository.OrgJobQueryRepository; import cn.axzo.orgmanax.server.node.service.NodeService; import cn.axzo.orgmanax.server.node.service.processor.NodeProcessor; +import cn.axzo.orgmanax.server.nodeuser.foundation.NodeUserFoundationService; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; @Slf4j @@ -25,6 +37,10 @@ public class NodeServiceImpl implements NodeService { private final NodeQueryRepository nodeQueryRepository; private final ApplicationContext applicationContext; + private final NodeUserQueryRepository nodeUserQueryRepository; + private final OrgJobQueryRepository orgJobQueryRepository; + private final NodeUserFoundationService nodeUserFoundationService; + private final CooperateShipQueryRepository cooperateShipQueryRepository; @Override public NodeProcessor.ProcessResult process(ProcessNodeReq req) { @@ -50,6 +66,40 @@ public class NodeServiceImpl implements NodeService { @Override public PageResp page(ListNodeReq req) { + + List nodeUsers; + + // 获取部门用户信息, 若获取不到直接返回 + if (Objects.nonNull(req.getPersonId())) { + nodeUsers = nodeUserQueryRepository.list(ListNodeUserReq + .builder().build()); + if (CollUtil.isEmpty(nodeUsers)) { + return PageResp.builder() + .current(req.getPage()) + .size(req.getPageSize()) + .total(0) + .build(); + } + + // 获取岗位信息 + if (CollUtil.isNotEmpty(req.getJobCodes())) { + List orgJobs = orgJobQueryRepository.list(OrgJobQueryRepository.ListReq.builder() + .ids(CollUtil.map(nodeUsers, OrganizationalNodeUser::getOrganizationalJobId, true)) + .codes(req.getJobCodes()) + .build()); + nodeUserFoundationService.filterByJobs(nodeUsers, orgJobs); + } + } + + // 项目ID + if (CollUtil.isNotEmpty(req.getWorkspaceIds())) { + cooperateShipQueryRepository.list(CooperateShipQueryRepository.ListReq.builder() + .workspaceIds(req.getWorkspaceIds()) + .workspaceOuPairs(BeanUtil.copyToList(req.getWorkspaceIds(), CooperateShipQueryRepository.WorkspaceOuPair.class)) + .build()); + } + + PageResp page = nodeQueryRepository.page(req); List records = page.getData().stream().map(e -> BeanUtil.toBean(e, OrgNodeDTO.class)).collect(Collectors.toList()); // assemble data if needed diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/NodeUserFoundationService.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/NodeUserFoundationService.java index aad36ce..2ba3c52 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/NodeUserFoundationService.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/NodeUserFoundationService.java @@ -1,10 +1,14 @@ package cn.axzo.orgmanax.server.nodeuser.foundation; import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; +import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; +import cn.axzo.orgmanax.infra.dao.orgjob.entity.OrgJob; import cn.axzo.orgmanax.server.nodeuser.foundation.req.NodeUserCreate; import cn.axzo.orgmanax.server.nodeuser.foundation.req.NodeUserUpdate; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + public interface NodeUserFoundationService { /** * 创建部门 @@ -24,4 +28,10 @@ public interface NodeUserFoundationService { @Transactional(rollbackFor = Throwable.class) OrganizationalNodeUser update(NodeUserUpdate req); + /** + * 根据岗位进行过滤 + * @param nodeUsers + * @param orgJobs + */ + void filterByJobs(List nodeUsers, List orgJobs); } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java index 16e6371..8f562e3 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java @@ -14,18 +14,23 @@ import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserUpsertRepository; +import cn.axzo.orgmanax.infra.dao.orgjob.entity.OrgJob; import cn.axzo.orgmanax.server.node.event.inner.NodeEventType; import cn.axzo.orgmanax.server.nodeuser.event.inner.payload.NodeUserUpsertedPayload; import cn.axzo.orgmanax.server.nodeuser.foundation.NodeUserFoundationService; import cn.axzo.orgmanax.server.nodeuser.foundation.req.NodeUserCreate; import cn.axzo.orgmanax.server.nodeuser.foundation.req.NodeUserUpdate; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.BooleanUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * @author tanjie@axzo.cn @@ -129,6 +134,12 @@ public class NodeUserFoundationServiceImpl implements NodeUserFoundationService return nodeUserUpsertRepository.update(updateReq); } + @Override + public void filterByJobs(List nodeUsers, List orgJobs) { + List jobIds = CollUtil.map(orgJobs, OrgJob::getId, true); + nodeUsers.removeIf(e -> !jobIds.contains(e.getOrganizationalJobId())); + } + private Long resolveWorkspaceId(NodeQueryRepository.NodeResp node) { if (Objects.equals(node.getNodeType(), OrganizationalNode.TypeEnum.TEAM.getValue())) { return 0L;