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..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 @@ -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,26 @@ 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; + + /** + * 根据岗位排除进行过滤 + */ + private List filterByJobCodeExclusion; + + /** + * 过滤人员状态集合 + */ + @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..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); + 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 49e4228..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,23 +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) { - + 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) - .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 71764c1..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) { @@ -125,11 +128,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( @@ -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.getFilterPersonId(), currentNodeList); + // 根据personId过滤节点 + cooperateShipFoundationService.filterNodeIdsByPerson(req.getFilterByPersonId(), cooperateShipNodeIds, req.getFilterIncludeExitPerson()); + // 删除不存在的节点 + CollUtil.removeWithAddIf(currentNodeList, t ->!cooperateShipNodeIds.contains(t.getOrganizationalNodeId())); if (CollUtil.isEmpty(currentNodeList)) { return Collections.emptyList(); } @@ -166,38 +175,41 @@ public class CooperateShipServiceImpl implements CooperateShipService { resultNodeList.addAll(ancestorShipNodes); } - // 是否查询父级节点 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, ","); + 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); + 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.getFilterPersonId(), resultNodeList); + 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进行正序