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进行正序