feat:[REQ-3282] 填充协同关系查询接口

This commit is contained in:
liuyang 2024-12-26 16:22:47 +08:00
parent 4f36fcb0a3
commit fa15a4c4e7
4 changed files with 83 additions and 20 deletions

View File

@ -83,6 +83,11 @@ public class ListOrgCooperateShipReq {
*/
private Integer filterMethod;
/**
* 根据岗位排除进行过滤
*/
private List<String> filterByJobCodeExclusion;
/**
* 过滤人员状态集合
*/

View File

@ -11,9 +11,18 @@ public interface CooperateShipFoundationService {
/**
* 通过person进行过滤
* @param filterPersonId
* @param list
* @param nodeIds
* @param includeExitPerson
*/
void filterByPerson(Long filterPersonId, List<SaasCooperateShip> list, Boolean includeExitPerson);
void filterNodeIdsByPerson(Long filterPersonId, List<Long> nodeIds, Boolean includeExitPerson, List<String> excludeJobCodes);
/**
* 通过person进行过滤
* @param filterPersonId
* @param nodeIds
* @param includeExitPerson
*/
void filterNodeIdsByPerson(Long filterPersonId, List<Long> nodeIds, Boolean includeExitPerson);
/**
* 提取祖级的数据
@ -44,4 +53,5 @@ public interface CooperateShipFoundationService {
* @return
*/
<T> Set<T> extract(List<SaasCooperateShip> currentNodeList, Function<SaasCooperateShip, T> function);
}

View File

@ -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<SaasCooperateShip> list, Boolean includeExitPerson) {
public void filterNodeIdsByPerson(Long filterPersonId, List<Long> nodeIds, Boolean includeExitPerson, List<String> excludeJobCodes) {
if (filterPersonId == null) {
return;
}
Set<Long> organizationalNodeIds = list.stream().map(SaasCooperateShip::getOrganizationalNodeId).collect(Collectors.toSet());
Set<Long> personInNodeIds = nodeUserQueryRepository.list(NodeUserQueryRepository.ListReq.builder()
.personId(filterPersonId)
.organizationalNodeIds(organizationalNodeIds)
.includeDeleted(includeExitPerson)
.build())
List<NodeUserQueryRepository.NodeUserResp> nodeUsers = nodeUserQueryRepository.list(NodeUserQueryRepository.ListReq.builder()
.personId(filterPersonId)
.organizationalNodeIds(nodeIds)
.includeDeleted(includeExitPerson)
.build());
Set<Long> personInNodeIds = nodeUsers
.stream().map(OrganizationalNodeUser::getTopNodeId).collect(Collectors.toSet());
list.removeIf(t -> !personInNodeIds.contains(t.getOrganizationalNodeId()));
List<Long> userJobIds = CollUtil.map(nodeUsers, OrganizationalNodeUser::getOrganizationalJobId, true);
nodeIds.removeIf(t -> !personInNodeIds.contains(t));
if (CollUtil.isEmpty(nodeIds)) {
return;
}
// 是否根据岗位标签进行过滤排除
if (CollUtil.isNotEmpty(excludeJobCodes)) {
List<OrgJobQueryRepository.JobResp> jobList = jobQueryRepository.list(OrgJobQueryRepository.ListReq
.builder().ids(userJobIds)
.build());
if (CollUtil.isEmpty(jobList)) {
return;
}
Map<Long, OrgJobQueryRepository.JobResp> jobMap = CollStreamUtil.toMap(jobList, OrgJob::getId, Function.identity());
List<Long> 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<Long> nodeIds, Boolean includeExitPerson) {
filterNodeIdsByPerson(filterPersonId, nodeIds, includeExitPerson, Collections.emptyList());
}
@Override
public Set<Long> extractAncestorIds(List<SaasCooperateShip> list) {
return list.stream()

View File

@ -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<Long> 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<Long> ancestorIds = cooperateShipFoundationService.extractAncestorIds(currentNodeList);
@ -175,30 +183,33 @@ public class CooperateShipServiceImpl implements CooperateShipService {
}
// 是否查询子节点
if (BooleanUtil.isTrue(req.getIncludeDescendants())) {
Set<String> paths = cooperateShipFoundationService.extractPaths(currentNodeList, ",");
Set<String> paths = cooperateShipFoundationService.extractPaths(currentNodeList, ",");
List<SaasCooperateShip> 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<Long> 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<Long> ids = cooperateShipFoundationService.extract(currentNodeList, SaasCooperateShip::getId);
List<SaasCooperateShip> descendantShipNodes = cooperateShipQueryRepository.list(
List<SaasCooperateShip> 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<Long> 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进行正序