From 4f36fcb0a376e29d6c8289f67f450461aec82c21 Mon Sep 17 00:00:00 2001 From: liuyang Date: Thu, 26 Dec 2024 11:27:20 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:[REQ-3282]=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E4=BA=8C=E6=9C=9F=E5=8D=8F=E5=90=8C=E5=85=B3=E7=B3=BB=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../req/ListOrgCooperateShipReq.java | 18 ++++++++++++------ .../CooperateShipFoundationService.java | 2 +- .../CooperateShipFoundationServiceImpl.java | 3 ++- .../impl/CooperateShipServiceImpl.java | 19 ++++++++++--------- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/req/ListOrgCooperateShipReq.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/req/ListOrgCooperateShipReq.java index 0aeb878..b290ae2 100644 --- a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/req/ListOrgCooperateShipReq.java +++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/req/ListOrgCooperateShipReq.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; import java.util.Collections; +import java.util.List; import java.util.Set; @NoArgsConstructor @@ -72,16 +73,21 @@ public class ListOrgCooperateShipReq { private Set statuses = Collections.emptySet(); /** - * 需要过滤的personId - * personId + * 根据人员进行节点过滤 */ - private Long filterPersonId; + private Long filterByPersonId; /** - * 当personId有值时,为必填项 - * 1只过滤当前节点数据 2过滤当前节点及以下数据 + * 当filterByPersonId有值时,为必填项 + * 值说明:1只过滤当前节点数据 2过滤当前节点及以下数据 */ - private Integer filterPersonType; + private Integer filterMethod; + + /** + * 过滤人员状态集合 + */ + @Builder.Default + private Boolean filterIncludeExitPerson = false; /** * 是否包含祖先节点 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 6cee3c2..7ebd6b2 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 @@ -13,7 +13,7 @@ public interface CooperateShipFoundationService { * @param filterPersonId * @param list */ - void filterByPerson(Long filterPersonId, List list); + void filterByPerson(Long filterPersonId, List list, Boolean includeExitPerson); /** * 提取祖级的数据 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 49e4228..3fa0b5c 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 @@ -23,7 +23,7 @@ public class CooperateShipFoundationServiceImpl implements CooperateShipFoundati private final NodeUserQueryRepository nodeUserQueryRepository; @Override - public void filterByPerson(Long filterPersonId, List list) { + public void filterByPerson(Long filterPersonId, List list, Boolean includeExitPerson) { if (filterPersonId == null) { return; @@ -32,6 +32,7 @@ public class CooperateShipFoundationServiceImpl implements CooperateShipFoundati Set personInNodeIds = nodeUserQueryRepository.list(NodeUserQueryRepository.ListReq.builder() .personId(filterPersonId) .organizationalNodeIds(organizationalNodeIds) + .includeDeleted(includeExitPerson) .build()) .stream().map(OrganizationalNodeUser::getTopNodeId).collect(Collectors.toSet()); list.removeIf(t -> !personInNodeIds.contains(t.getOrganizationalNodeId())); 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 71764c1..6f3de59 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 @@ -125,11 +125,11 @@ public class CooperateShipServiceImpl implements CooperateShipService { public List list(ListOrgCooperateShipReq req) { // 全局变量定义:是否查询当前节点的人员 - boolean isFilterCurrentNodeByPerson = ObjectUtil.isNotNull(req.getFilterPersonId()) && - Objects.equals(req.getFilterPersonType(), ListOrgCooperateShipReq.FILTER_PERSON_TYPE_CURRENT_NODE); + boolean isFilterCurrentNodeByPerson = ObjectUtil.isNotNull(req.getFilterByPersonId()) && + Objects.equals(req.getFilterMethod(), ListOrgCooperateShipReq.FILTER_PERSON_TYPE_CURRENT_NODE); // 全局变量定义:是否查询当前节点及以下节点的人员 - boolean isFilterCurrentAndBelowByPerson = !isFilterCurrentNodeByPerson && ObjectUtil.isNotNull(req.getFilterPersonId()) - && Objects.equals(req.getFilterPersonType(), ListOrgCooperateShipReq.FILTER_PERSON_TYPE_CURRENT_AND_BELOW_NODE); + boolean isFilterCurrentAndBelowByPerson = !isFilterCurrentNodeByPerson && ObjectUtil.isNotNull(req.getFilterByPersonId()) + && Objects.equals(req.getFilterMethod(), ListOrgCooperateShipReq.FILTER_PERSON_TYPE_CURRENT_AND_BELOW_NODE); // 根据入参查询数据 List currentNodeList = cooperateShipQueryRepository.list( @@ -150,7 +150,7 @@ public class CooperateShipServiceImpl implements CooperateShipService { // 根据person过滤当前节点 if (isFilterCurrentNodeByPerson) { - cooperateShipFoundationService.filterByPerson(req.getFilterPersonId(), currentNodeList); + cooperateShipFoundationService.filterByPerson(req.getFilterByPersonId(), currentNodeList, req.getFilterIncludeExitPerson()); if (CollUtil.isEmpty(currentNodeList)) { return Collections.emptyList(); } @@ -170,20 +170,20 @@ public class CooperateShipServiceImpl implements CooperateShipService { // 是否查询父级节点 if (BooleanUtil.isTrue(req.getIncludeAncestors())) { Set ancestorIds = cooperateShipFoundationService.extractAncestorIds(currentNodeList); - List ancestorShipNodes = cooperateShipQueryRepository.list(CooperateShipQueryRepository.ListReq.builder().ids(ancestorIds).build()); + List ancestorShipNodes = cooperateShipQueryRepository.list(CooperateShipQueryRepository.ListReq.builder().ids(ancestorIds).statuses(req.getStatuses()).build()); resultNodeList.addAll(ancestorShipNodes); } - // 是否查询子节点 if (BooleanUtil.isTrue(req.getIncludeDescendants())) { Set paths = cooperateShipFoundationService.extractPaths(currentNodeList, ","); List descendantShipNodes = cooperateShipQueryRepository.list( CooperateShipQueryRepository.ListReq.builder() + .statuses(req.getStatuses()) .pathsRight(paths).build()); resultNodeList.addAll(descendantShipNodes); // 是否查询当前节点及以下节点的人员 if (isFilterCurrentAndBelowByPerson) { - cooperateShipFoundationService.filterByPerson(req.getFilterPersonId(), resultNodeList); + cooperateShipFoundationService.filterByPerson(req.getFilterByPersonId(), resultNodeList, req.getFilterIncludeExitPerson()); } } @@ -192,11 +192,12 @@ public class CooperateShipServiceImpl implements CooperateShipService { Set ids = cooperateShipFoundationService.extract(currentNodeList, SaasCooperateShip::getId); List descendantShipNodes = cooperateShipQueryRepository.list( CooperateShipQueryRepository.ListReq.builder() + .statuses(req.getStatuses()) .parentIds(ids).build()); resultNodeList.addAll(descendantShipNodes); // 是否查询当前节点及以下节点的人员 if (isFilterCurrentAndBelowByPerson) { - cooperateShipFoundationService.filterByPerson(req.getFilterPersonId(), resultNodeList); + cooperateShipFoundationService.filterByPerson(req.getFilterByPersonId(), resultNodeList, req.getFilterIncludeExitPerson()); } } From fa15a4c4e7ebc9b3d285a109dde3cf2a02cec939 Mon Sep 17 00:00:00 2001 From: liuyang Date: Thu, 26 Dec 2024 16:22:47 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:[REQ-3282]=20=E5=A1=AB=E5=85=85?= =?UTF-8?q?=E5=8D=8F=E5=90=8C=E5=85=B3=E7=B3=BB=E6=9F=A5=E8=AF=A2=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../req/ListOrgCooperateShipReq.java | 5 ++ .../CooperateShipFoundationService.java | 14 ++++- .../CooperateShipFoundationServiceImpl.java | 55 ++++++++++++++++--- .../impl/CooperateShipServiceImpl.java | 29 +++++++--- 4 files changed, 83 insertions(+), 20 deletions(-) diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/req/ListOrgCooperateShipReq.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/req/ListOrgCooperateShipReq.java index b290ae2..ae8bfa1 100644 --- a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/req/ListOrgCooperateShipReq.java +++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/req/ListOrgCooperateShipReq.java @@ -83,6 +83,11 @@ public class ListOrgCooperateShipReq { */ private Integer filterMethod; + /** + * 根据岗位排除进行过滤 + */ + private List filterByJobCodeExclusion; + /** * 过滤人员状态集合 */ 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 7ebd6b2..b8bb949 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 @@ -11,9 +11,18 @@ public interface CooperateShipFoundationService { /** * 通过person进行过滤 * @param filterPersonId - * @param list + * @param nodeIds + * @param includeExitPerson */ - void filterByPerson(Long filterPersonId, List list, Boolean includeExitPerson); + void filterNodeIdsByPerson(Long filterPersonId, List nodeIds, Boolean includeExitPerson, List excludeJobCodes); + + /** + * 通过person进行过滤 + * @param filterPersonId + * @param nodeIds + * @param includeExitPerson + */ + void filterNodeIdsByPerson(Long filterPersonId, List nodeIds, Boolean includeExitPerson); /** * 提取祖级的数据 @@ -44,4 +53,5 @@ public interface CooperateShipFoundationService { * @return */ Set extract(List currentNodeList, Function function); + } 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 3fa0b5c..a3668ab 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 @@ -5,10 +5,19 @@ import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq; import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; 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.cooperateship.foundation.CooperateShipFoundationService; import cn.axzo.orgmanax.server.nodeuser.service.NodeUserService; +import cn.axzo.orgmanax.server.orgjob.foundation.OrgJobFoundationService; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; + +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -21,24 +30,52 @@ import org.springframework.stereotype.Service; public class CooperateShipFoundationServiceImpl implements CooperateShipFoundationService { private final NodeUserQueryRepository nodeUserQueryRepository; + private final OrgJobQueryRepository jobQueryRepository; @Override - public void filterByPerson(Long filterPersonId, List list, Boolean includeExitPerson) { - + public void filterNodeIdsByPerson(Long filterPersonId, List nodeIds, Boolean includeExitPerson, List excludeJobCodes) { if (filterPersonId == null) { return; } - Set organizationalNodeIds = list.stream().map(SaasCooperateShip::getOrganizationalNodeId).collect(Collectors.toSet()); - Set personInNodeIds = nodeUserQueryRepository.list(NodeUserQueryRepository.ListReq.builder() - .personId(filterPersonId) - .organizationalNodeIds(organizationalNodeIds) - .includeDeleted(includeExitPerson) - .build()) + List nodeUsers = nodeUserQueryRepository.list(NodeUserQueryRepository.ListReq.builder() + .personId(filterPersonId) + .organizationalNodeIds(nodeIds) + .includeDeleted(includeExitPerson) + .build()); + Set personInNodeIds = nodeUsers .stream().map(OrganizationalNodeUser::getTopNodeId).collect(Collectors.toSet()); - list.removeIf(t -> !personInNodeIds.contains(t.getOrganizationalNodeId())); + List userJobIds = CollUtil.map(nodeUsers, OrganizationalNodeUser::getOrganizationalJobId, true); + nodeIds.removeIf(t -> !personInNodeIds.contains(t)); + if (CollUtil.isEmpty(nodeIds)) { + return; + } + // 是否根据岗位标签进行过滤排除 + if (CollUtil.isNotEmpty(excludeJobCodes)) { + List jobList = jobQueryRepository.list(OrgJobQueryRepository.ListReq + .builder().ids(userJobIds) + .build()); + if (CollUtil.isEmpty(jobList)) { + return; + } + Map jobMap = CollStreamUtil.toMap(jobList, OrgJob::getId, Function.identity()); + List jobNodeIds = nodeUsers.stream().filter(t -> { + OrgJobQueryRepository.JobResp job = jobMap.get(t.getOrganizationalJobId()); + // 岗位不存在,不做排除 + if (job == null) { + return true; + } + return !excludeJobCodes.contains(job.getCode()); + }).map(OrganizationalNodeUser::getOrganizationalNodeId).collect(Collectors.toList()); + nodeIds.removeIf(t -> !jobNodeIds.contains(t)); + } } + @Override + public void filterNodeIdsByPerson(Long filterPersonId, List nodeIds, Boolean includeExitPerson) { + filterNodeIdsByPerson(filterPersonId, nodeIds, includeExitPerson, Collections.emptyList()); + } + @Override public Set extractAncestorIds(List list) { return list.stream() 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 6f3de59..8db6bba 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 @@ -22,7 +22,9 @@ import cn.axzo.orgmanax.server.cooperateship.event.inner.CooperateShipEventType; import cn.axzo.orgmanax.server.cooperateship.event.inner.payload.CoopeateShipUpsertedPayload; import cn.axzo.orgmanax.server.cooperateship.foundation.CooperateShipFoundationService; import cn.axzo.orgmanax.server.cooperateship.service.CooperateShipService; +import cn.axzo.orgmanax.server.orgjob.foundation.OrgJobFoundationService; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; @@ -56,6 +58,7 @@ public class CooperateShipServiceImpl implements CooperateShipService { private final WorkspaceGateway workspaceGateway; private final EventProducer eventProducer; private final CooperateShipFoundationService cooperateShipFoundationService; + private final OrgJobFoundationService orgJobFoundationService; @Override public SaasCooperateShip create(CreateReq req) { @@ -148,9 +151,15 @@ public class CooperateShipServiceImpl implements CooperateShipService { return Collections.emptyList(); } + // 协同关系id集合 + List cooperateShipNodeIds = CollUtil.map(currentNodeList, SaasCooperateShip::getOrganizationalNodeId, true); + // 根据person过滤当前节点 if (isFilterCurrentNodeByPerson) { - cooperateShipFoundationService.filterByPerson(req.getFilterByPersonId(), currentNodeList, req.getFilterIncludeExitPerson()); + // 根据personId过滤节点 + cooperateShipFoundationService.filterNodeIdsByPerson(req.getFilterByPersonId(), cooperateShipNodeIds, req.getFilterIncludeExitPerson()); + // 删除不存在的节点 + CollUtil.removeWithAddIf(currentNodeList, t ->!cooperateShipNodeIds.contains(t.getOrganizationalNodeId())); if (CollUtil.isEmpty(currentNodeList)) { return Collections.emptyList(); } @@ -166,7 +175,6 @@ public class CooperateShipServiceImpl implements CooperateShipService { resultNodeList.addAll(ancestorShipNodes); } - // 是否查询父级节点 if (BooleanUtil.isTrue(req.getIncludeAncestors())) { Set ancestorIds = cooperateShipFoundationService.extractAncestorIds(currentNodeList); @@ -175,30 +183,33 @@ public class CooperateShipServiceImpl implements CooperateShipService { } // 是否查询子节点 if (BooleanUtil.isTrue(req.getIncludeDescendants())) { - Set paths = cooperateShipFoundationService.extractPaths(currentNodeList, ","); + Set paths = cooperateShipFoundationService.extractPaths(currentNodeList, ","); List descendantShipNodes = cooperateShipQueryRepository.list( CooperateShipQueryRepository.ListReq.builder() .statuses(req.getStatuses()) .pathsRight(paths).build()); - resultNodeList.addAll(descendantShipNodes); - // 是否查询当前节点及以下节点的人员 if (isFilterCurrentAndBelowByPerson) { - cooperateShipFoundationService.filterByPerson(req.getFilterByPersonId(), resultNodeList, req.getFilterIncludeExitPerson()); + List nodeIds = CollUtil.map(descendantShipNodes, SaasCooperateShip::getOrganizationalNodeId, true); + cooperateShipFoundationService.filterNodeIdsByPerson(req.getFilterByPersonId(), nodeIds, req.getFilterIncludeExitPerson(), req.getFilterByJobCodeExclusion()); + descendantShipNodes.removeIf(t -> !nodeIds.contains(t.getOrganizationalNodeId())); } + CollUtil.addAll(resultNodeList, descendantShipNodes); } // 是否查询子孙节点 if (BooleanUtil.isTrue(req.getIncludeChildren())) { Set ids = cooperateShipFoundationService.extract(currentNodeList, SaasCooperateShip::getId); - List descendantShipNodes = cooperateShipQueryRepository.list( + List childrenShipNodes = cooperateShipQueryRepository.list( CooperateShipQueryRepository.ListReq.builder() .statuses(req.getStatuses()) .parentIds(ids).build()); - resultNodeList.addAll(descendantShipNodes); // 是否查询当前节点及以下节点的人员 if (isFilterCurrentAndBelowByPerson) { - cooperateShipFoundationService.filterByPerson(req.getFilterByPersonId(), resultNodeList, req.getFilterIncludeExitPerson()); + List nodeIds = CollUtil.map(childrenShipNodes, SaasCooperateShip::getOrganizationalNodeId, true); + cooperateShipFoundationService.filterNodeIdsByPerson(req.getFilterByPersonId(), nodeIds, req.getFilterIncludeExitPerson()); + childrenShipNodes.removeIf(t -> !nodeIds.contains(t.getOrganizationalNodeId())); } + resultNodeList.addAll(childrenShipNodes); } // resultNodeList 根据path进行正序