From 3da7df020d8447295f30dc7dbb46a9465c6acdce Mon Sep 17 00:00:00 2001 From: liuyang Date: Mon, 23 Dec 2024 13:45:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:[REQ-3282]=20=E7=BC=96=E5=86=99=E5=8D=8F?= =?UTF-8?q?=E5=90=8C=E5=85=B3=E7=B3=BB=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../req/ListOrgCooperateShipReq.java | 51 +++++----- .../CooperateShipQueryRepository.java | 96 +++++++++++++++++-- .../CooperateShipQueryRepositoryImpl.java | 18 +++- .../CooperateShipFoundationService.java | 15 +++ .../CooperateShipFoundationServiceImpl.java | 11 +++ .../impl/CooperateShipServiceImpl.java | 90 ++++++++++++----- 6 files changed, 222 insertions(+), 59 deletions(-) diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/req/ListOrgCooperateShipReq.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/req/ListOrgCooperateShipReq.java index e7e0205..3e97c2e 100644 --- a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/req/ListOrgCooperateShipReq.java +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/req/ListOrgCooperateShipReq.java @@ -15,58 +15,54 @@ import java.util.Set; @Data @Builder public class ListOrgCooperateShipReq { + + public static final int FILTER_PERSON_TYPE_CURRENT_NODE = 1; + public static final int FILTER_PERSON_TYPE_CURRENT_AND_BELOW_NODE = 2; + /** * 协同关系集合 */ - @CriteriaField(field = "id", operator = Operator.IN) @Builder.Default private Set ids = Collections.emptySet(); /** * 工作台id */ - @CriteriaField(field = "workspaceId", operator = Operator.IN) @Builder.Default private Set workspaceIds = Collections.emptySet(); /** * 工作台类型 */ - @CriteriaField(field = "workspaceType", operator = Operator.IN) @Builder.Default private Set workspaceTypes = Collections.emptySet(); /** * 单位id集合(如果是班组则插入队伍id) */ - @CriteriaField(field = "organizationalUnitId", operator = Operator.IN) @Builder.Default private Set ouIds = Collections.emptySet(); /** * 指定的协同关系类型 */ - @CriteriaField(field = "cooperateType", operator = Operator.IN) @Builder.Default private Set includeCooperateTypes = Collections.emptySet(); /** * 待排除的协同关系类型 */ - @CriteriaField(field = "cooperateType", operator = Operator.NOT_IN) @Builder.Default private Set excludeCooperateTypes = Collections.emptySet(); /** * 节点id */ - @CriteriaField(field = "organizationalNodeId", operator = Operator.IN) @Builder.Default private Set organizationNodeIds = Collections.emptySet(); /** * 合作关系 1.合作 2.直属 */ - @CriteriaField(field = "partnerShip", operator = Operator.IN) @Builder.Default private Set partnerShips = Collections.emptySet(); @@ -74,62 +70,69 @@ public class ListOrgCooperateShipReq { /** * 在场状态集合 */ - @CriteriaField(field = "status", operator = Operator.IN) @Builder.Default private Set statuses = Collections.emptySet(); - @CriteriaField(field = "path", operator = Operator.SW) + /** + * 查询策略,使用取模方式自由组合进行数据查询 + * 参数说明:1当前节点 2父节点 4祖父节点 8子节点 16孙节点 + * 案例:查询当前节点及子孙节点,则传3, 当前节点及祖父节点则传5,当前节点 + */ @Builder.Default - private Set pathRight = Collections.emptySet(); + private Integer selectStrategy = 1; /** * 需要过滤的personId * personId */ - @CriteriaField(ignore = true) - private Long filterPersonId ; + private Long filterByPersonId ; /** * 当personId有值时,为必填项 * 1只过滤当前节点数据 2过滤当前节点及以下数据 */ - @CriteriaField(ignore = true) private Integer filterPersonType; /** * 是否过滤工人 */ - @CriteriaField(ignore = true) @Builder.Default private Boolean isFilterWorker = false; - /** * 人员过滤是否包含已退场 */ - @CriteriaField(ignore = true) @Builder.Default private Boolean includeExitPerson = false; /** - * 是否查询祖先节点 + * 是否包含祖先节点 */ - @CriteriaField(ignore = true) @Builder.Default - private Boolean isSelectAncestors = false; + private Boolean includeAncestors = false; /** - * 是否查询子孙节点 + * 是否包含子孙节点 */ - @CriteriaField(ignore = true) @Builder.Default - private Boolean isSelectDescendants = false; + private Boolean includeDescendants = false; + + /** + * 是否包含父节点 + */ + @Builder.Default + private Boolean includeParent = false; + + /** + * 是否包含子节点 + */ + @Builder.Default + private Boolean includeChildren = false; /** * 条件:当需要查询上下级数据时启用 * 是否只查一级 */ - @CriteriaField(ignore = true) @Builder.Default private Boolean isSelectLevelOne = false; 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 2f9afb9..1fc3558 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 @@ -1,21 +1,22 @@ package cn.axzo.orgmanax.infra.dao.cooperateship.repository; +import cn.axzo.foundation.dao.support.wrapper.CriteriaField; +import cn.axzo.foundation.dao.support.wrapper.Operator; import cn.axzo.orgmanax.api.cooperateship.req.ListOrgCooperateShipReq; import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; import cn.hutool.core.bean.BeanUtil; import com.google.common.base.Preconditions; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; +import lombok.*; import lombok.experimental.SuperBuilder; +import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.Set; public interface CooperateShipQueryRepository { - List list(ListOrgCooperateShipReq req); + List list(ListReq req); default SaasCooperateShip one(OneReq req) { return oneOpt(req).orElse(null); @@ -23,7 +24,7 @@ public interface CooperateShipQueryRepository { default Optional oneOpt(OneReq req) { req.check(); - ListOrgCooperateShipReq listReq = BeanUtil.toBean(req, ListOrgCooperateShipReq.class); + ListReq listReq = BeanUtil.toBean(req, ListReq.class); return list(listReq).stream().findFirst(); } @@ -50,4 +51,87 @@ public interface CooperateShipQueryRepository { private String todo; } + @NoArgsConstructor + @AllArgsConstructor + @Data + @Builder + class ListReq { + /** + * 协同关系集合 + */ + @CriteriaField(field = "id", operator = Operator.IN) + @Builder.Default + private Set ids = Collections.emptySet(); + + /** + * 工作台id + */ + @CriteriaField(field = "workspaceId", operator = Operator.IN) + @Builder.Default + private Set workspaceIds = Collections.emptySet(); + + /** + * 工作台类型 + */ + @CriteriaField(field = "workspaceType", operator = Operator.IN) + @Builder.Default + private Set workspaceTypes = Collections.emptySet(); + + /** + * 单位id集合(如果是班组则插入队伍id) + */ + @CriteriaField(field = "organizationalUnitId", operator = Operator.IN) + @Builder.Default + private Set ouIds = Collections.emptySet(); + + /** + * 指定的协同关系类型 + */ + @CriteriaField(field = "cooperateType", operator = Operator.IN) + @Builder.Default + private Set includeCooperateTypes = Collections.emptySet(); + /** + * 待排除的协同关系类型 + */ + @CriteriaField(field = "cooperateType", operator = Operator.NOT_IN) + @Builder.Default + private Set excludeCooperateTypes = Collections.emptySet(); + + /** + * 节点id + */ + @CriteriaField(field = "organizationalNodeId", operator = Operator.IN) + @Builder.Default + private Set organizationNodeIds = Collections.emptySet(); + + /** + * 合作关系 1.合作 2.直属 + */ + @CriteriaField(field = "partnerShip", operator = Operator.IN) + @Builder.Default + private Set partnerShips = Collections.emptySet(); + + /** + * 在场状态集合 + */ + @CriteriaField(field = "status", operator = Operator.IN) + @Builder.Default + private Set statuses = Collections.emptySet(); + + /** + * path右值 + */ + @CriteriaField(field = "path", operator = Operator.IN) + @Builder.Default + private Set pathsRight = Collections.emptySet(); + + /** + * path右值 + */ + @CriteriaField(field = "parentId", operator = Operator.IN) + @Builder.Default + private Set parentIds = Collections.emptySet(); + + } + } 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 99caa5d..70b6244 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 @@ -8,6 +8,8 @@ import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipQueryRepository; import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -27,26 +29,36 @@ public class CooperateShipQueryRepositoryImpl implements CooperateShipQueryRepos private final NodeUserQueryRepository nodeUserQueryRepository; @Override - public List list(ListOrgCooperateShipReq req) { + public List list(CooperateShipQueryRepository.ListReq req) { QueryWrapper wrapper = QueryWrapperHelper.fromBean(req, SaasCooperateShip.class); if (wrapper.isEmptyOfWhere()) { // log.warn("CooperateShipResp empty of where query. return empty list. req = {}", req); return Collections.emptyList(); } + + // 查询子集 + if (CollUtil.isNotEmpty(req.getPathsRight())) { + // 遍历pathsRight转换成wrapper + wrapper.and(w -> { + for (String pathRight : req.getPathsRight()) { + w.or().likeRight("path", pathRight); + } + }); + } return cooperateShipDao.list(wrapper) .stream().map(e -> BeanUtil.toBean(e, SaasCooperateShip.class)).collect(Collectors.toList()); } private List filterByPersonIds(List results, ListOrgCooperateShipReq req) { - if (req.getFilterPersonId() == null) { + if (req.getFilterByPersonId() == null) { // filter by personIds return results; } Set organizationalNodeIds = results.stream().map(SaasCooperateShip::getOrganizationalNodeId).collect(Collectors.toSet()); Set personInNodeIds = nodeUserQueryRepository.list(ListNodeUserReq.builder() - .personId(req.getFilterPersonId()) + .personId(req.getFilterByPersonId()) .organizationalNodeIds(organizationalNodeIds) .build()) .stream().map(NodeUserQueryRepository.NodeUserResp::getTopNodeId).collect(Collectors.toSet()); diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/CooperateShipFoundationService.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/CooperateShipFoundationService.java index 4a640db..a2c2f16 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/CooperateShipFoundationService.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/CooperateShipFoundationService.java @@ -20,4 +20,19 @@ public interface CooperateShipFoundationService { * @return */ Set extractAncestorIds(List list); + + /** + * 提取path数据 + * @param list 当前节点 + * @param suffix 后缀 + * @return + */ + Set extractPaths(List list, String suffix); + + /** + * 提取父级id + * @param currentNodeList + * @return + */ + Set extractParentIds(List currentNodeList); } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/impl/CooperateShipFoundationServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/impl/CooperateShipFoundationServiceImpl.java index 525d851..61ca5d7 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/impl/CooperateShipFoundationServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/impl/CooperateShipFoundationServiceImpl.java @@ -4,6 +4,7 @@ import cn.axzo.orgmanax.api.nodeuser.req.ListNodeUserReq; import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; import cn.axzo.orgmanax.server.cooperateship.foundation.CooperateShipFoundationService; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -41,4 +42,14 @@ public class CooperateShipFoundationServiceImpl implements CooperateShipFoundati .collect(Collectors.toSet()); } + @Override + public Set extractPaths(List list, String suffix) { + return list.stream().map(t -> StrUtil.isNotBlank(suffix) ? StrUtil.concat(true, t.getPath(), suffix) : t.getPath()).collect(Collectors.toSet()); + } + + @Override + public Set extractParentIds(List list) { + return list.stream().filter(t -> t.getParentId() != 0).map(SaasCooperateShip::getParentId).collect(Collectors.toSet()); + } + } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java index 94d7329..33d872d 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java @@ -126,44 +126,82 @@ public class CooperateShipServiceImpl implements CooperateShipService { @Override public List list(ListOrgCooperateShipReq req) { - // 是否查询当前节点的人员 - boolean isFilterCurrentNodeByPerson = ObjectUtil.isNotNull(req.getFilterPersonId()) && Objects.equals(req.getFilterPersonType(), 1); - // 是否查询当前节点及以下节点的人员 - boolean isFilterCurrentAndBelowByPerson = !isFilterCurrentNodeByPerson && ObjectUtil.isNotNull(req.getFilterPersonId()) && Objects.equals(req.getFilterPersonType(), 2); + // 全局变量定义:是否查询当前节点的人员 + boolean isFilterCurrentNodeByPerson = ObjectUtil.isNotNull(req.getFilterByPersonId()) && + Objects.equals(req.getFilterPersonType(), ListOrgCooperateShipReq.FILTER_PERSON_TYPE_CURRENT_NODE); + // 全局变量定义:是否查询当前节点及以下节点的人员 + boolean isFilterCurrentAndBelowByPerson = !isFilterCurrentNodeByPerson && ObjectUtil.isNotNull(req.getFilterByPersonId()) + && Objects.equals(req.getFilterPersonType(), ListOrgCooperateShipReq.FILTER_PERSON_TYPE_CURRENT_AND_BELOW_NODE); - // 1. 根据入参查询数据 - List list = cooperateShipQueryRepository.list(req); - if (CollUtil.isEmpty(list)) { + // 根据入参查询数据 + List currentNodeList = cooperateShipQueryRepository.list( + CooperateShipQueryRepository.ListReq.builder() + .ids(req.getIds()) + .workspaceIds(req.getWorkspaceIds()) + .workspaceTypes(req.getWorkspaceTypes()) + .ouIds(req.getOuIds()) + .includeCooperateTypes(req.getIncludeCooperateTypes()) + .excludeCooperateTypes(req.getExcludeCooperateTypes()) + .organizationNodeIds(req.getOrganizationNodeIds()) + .partnerShips(req.getPartnerShips()) + .statuses(req.getStatuses()) + .build()); + if (CollUtil.isEmpty(currentNodeList)) { return Collections.emptyList(); } // 根据person过滤当前节点 if (isFilterCurrentNodeByPerson) { - cooperateShipFoundationService.filterByPerson(req.getFilterPersonId(), list); + cooperateShipFoundationService.filterByPerson(req.getFilterByPersonId(), currentNodeList); + if (CollUtil.isEmpty(currentNodeList)) { + return Collections.emptyList(); + } } - // 是否查询祖先 - if (BooleanUtil.isTrue(req.getIsSelectAncestors())) { - Set ancestorIds = cooperateShipFoundationService.extractAncestorIds(list); - List ancestorShipNodes = cooperateShipQueryRepository.list(ListOrgCooperateShipReq.builder().ids(ancestorIds).build()); - list.addAll(ancestorShipNodes); + // 构建结果节点集合 + List resultNodeList = new ArrayList<>(currentNodeList); + + // 是否查询祖先节点 + if (BooleanUtil.isTrue(req.getIncludeParent())) { + Set parentIds = cooperateShipFoundationService.extractParentIds(currentNodeList); + List ancestorShipNodes = cooperateShipQueryRepository.list(CooperateShipQueryRepository.ListReq.builder().ids(parentIds).build()); + resultNodeList.addAll(ancestorShipNodes); } - // 是否查询子孙 - if (BooleanUtil.isTrue(req.getIsSelectDescendants())) { - List descendantShipNodes = cooperateShipQueryRepository.list(ListOrgCooperateShipReq.builder().build()); -// list.addAll(descendantShipNodes); + // 是否查询父级节点 + if (BooleanUtil.isTrue(req.getIncludeAncestors())) { + Set ancestorIds = cooperateShipFoundationService.extractAncestorIds(currentNodeList); + List ancestorShipNodes = cooperateShipQueryRepository.list(CooperateShipQueryRepository.ListReq.builder().ids(ancestorIds).build()); + resultNodeList.addAll(ancestorShipNodes); + } + + // 是否查询子节点 + if (BooleanUtil.isTrue(req.getIncludeChildren())) { + Set paths = cooperateShipFoundationService.extractPaths(currentNodeList, ","); + List descendantShipNodes = cooperateShipQueryRepository.list( + CooperateShipQueryRepository.ListReq.builder() + .pathsRight(paths).build()); + resultNodeList.addAll(descendantShipNodes); + // 是否查询当前节点及以下节点的人员 + if (isFilterCurrentAndBelowByPerson) { + cooperateShipFoundationService.filterByPerson(req.getFilterByPersonId(), resultNodeList); + } + } + + // 是否查询子孙节点 + if (BooleanUtil.isTrue(req.getIncludeDescendants())) { + Set parentIds = cooperateShipFoundationService.extractParentIds(currentNodeList); + List descendantShipNodes = cooperateShipQueryRepository.list( + CooperateShipQueryRepository.ListReq.builder() + .parentIds(parentIds).build()); + resultNodeList.addAll(descendantShipNodes); + // 是否查询当前节点及以下节点的人员 + if (isFilterCurrentAndBelowByPerson) { + cooperateShipFoundationService.filterByPerson(req.getFilterByPersonId(), resultNodeList); + } } - - - // 根据person过滤当前节点及以下节点 - if (isFilterCurrentAndBelowByPerson) { - cooperateShipFoundationService.filterByPerson(req.getFilterPersonId(), list); - } - - - return BeanUtil.copyToList(list, OrgCooperateShipDTO.class); + return BeanUtil.copyToList(resultNodeList, OrgCooperateShipDTO.class); } }