Merge remote-tracking branch 'refs/remotes/origin/feature/REQ-3488' into feature/REQ-3488-zhh
This commit is contained in:
commit
733748849e
@ -7,6 +7,7 @@ import lombok.NoArgsConstructor;
|
|||||||
import lombok.experimental.SuperBuilder;
|
import lombok.experimental.SuperBuilder;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@ -72,16 +73,26 @@ public class ListOrgCooperateShipReq {
|
|||||||
private Set<Integer> statuses = Collections.emptySet();
|
private Set<Integer> statuses = Collections.emptySet();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 需要过滤的personId
|
* 根据人员进行节点过滤
|
||||||
* personId
|
|
||||||
*/
|
*/
|
||||||
private Long filterPersonId;
|
private Long filterByPersonId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 当personId有值时,为必填项
|
* 当filterByPersonId有值时,为必填项
|
||||||
* 1只过滤当前节点数据 2过滤当前节点及以下数据
|
* 值说明:1只过滤当前节点数据 2过滤当前节点及以下数据
|
||||||
*/
|
*/
|
||||||
private Integer filterPersonType;
|
private Integer filterMethod;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据岗位排除进行过滤
|
||||||
|
*/
|
||||||
|
private List<String> filterByJobCodeExclusion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 过滤人员状态集合
|
||||||
|
*/
|
||||||
|
@Builder.Default
|
||||||
|
private Boolean filterIncludeExitPerson = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否包含祖先节点
|
* 是否包含祖先节点
|
||||||
|
|||||||
@ -11,9 +11,18 @@ public interface CooperateShipFoundationService {
|
|||||||
/**
|
/**
|
||||||
* 通过person进行过滤
|
* 通过person进行过滤
|
||||||
* @param filterPersonId
|
* @param filterPersonId
|
||||||
* @param list
|
* @param nodeIds
|
||||||
|
* @param includeExitPerson
|
||||||
*/
|
*/
|
||||||
void filterByPerson(Long filterPersonId, List<SaasCooperateShip> list);
|
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
|
* @return
|
||||||
*/
|
*/
|
||||||
<T> Set<T> extract(List<SaasCooperateShip> currentNodeList, Function<SaasCooperateShip, T> function);
|
<T> Set<T> extract(List<SaasCooperateShip> currentNodeList, Function<SaasCooperateShip, T> function);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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.cooperateship.entity.SaasCooperateShip;
|
||||||
import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser;
|
import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser;
|
||||||
import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository;
|
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.cooperateship.foundation.CooperateShipFoundationService;
|
||||||
import cn.axzo.orgmanax.server.nodeuser.service.NodeUserService;
|
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 cn.hutool.core.util.StrUtil;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -21,23 +30,52 @@ import org.springframework.stereotype.Service;
|
|||||||
public class CooperateShipFoundationServiceImpl implements CooperateShipFoundationService {
|
public class CooperateShipFoundationServiceImpl implements CooperateShipFoundationService {
|
||||||
|
|
||||||
private final NodeUserQueryRepository nodeUserQueryRepository;
|
private final NodeUserQueryRepository nodeUserQueryRepository;
|
||||||
|
private final OrgJobQueryRepository jobQueryRepository;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void filterByPerson(Long filterPersonId, List<SaasCooperateShip> list) {
|
public void filterNodeIdsByPerson(Long filterPersonId, List<Long> nodeIds, Boolean includeExitPerson, List<String> excludeJobCodes) {
|
||||||
|
|
||||||
if (filterPersonId == null) {
|
if (filterPersonId == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Set<Long> organizationalNodeIds = list.stream().map(SaasCooperateShip::getOrganizationalNodeId).collect(Collectors.toSet());
|
List<NodeUserQueryRepository.NodeUserResp> nodeUsers = nodeUserQueryRepository.list(NodeUserQueryRepository.ListReq.builder()
|
||||||
Set<Long> personInNodeIds = nodeUserQueryRepository.list(NodeUserQueryRepository.ListReq.builder()
|
.personId(filterPersonId)
|
||||||
.personId(filterPersonId)
|
.organizationalNodeIds(nodeIds)
|
||||||
.organizationalNodeIds(organizationalNodeIds)
|
.includeDeleted(includeExitPerson)
|
||||||
.build())
|
.build());
|
||||||
|
Set<Long> personInNodeIds = nodeUsers
|
||||||
.stream().map(OrganizationalNodeUser::getTopNodeId).collect(Collectors.toSet());
|
.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
|
@Override
|
||||||
public Set<Long> extractAncestorIds(List<SaasCooperateShip> list) {
|
public Set<Long> extractAncestorIds(List<SaasCooperateShip> list) {
|
||||||
return list.stream()
|
return list.stream()
|
||||||
|
|||||||
@ -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.event.inner.payload.CoopeateShipUpsertedPayload;
|
||||||
import cn.axzo.orgmanax.server.cooperateship.foundation.CooperateShipFoundationService;
|
import cn.axzo.orgmanax.server.cooperateship.foundation.CooperateShipFoundationService;
|
||||||
import cn.axzo.orgmanax.server.cooperateship.service.CooperateShipService;
|
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.bean.BeanUtil;
|
||||||
|
import cn.hutool.core.collection.CollStreamUtil;
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.BooleanUtil;
|
import cn.hutool.core.util.BooleanUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
@ -56,6 +58,7 @@ public class CooperateShipServiceImpl implements CooperateShipService {
|
|||||||
private final WorkspaceGateway workspaceGateway;
|
private final WorkspaceGateway workspaceGateway;
|
||||||
private final EventProducer eventProducer;
|
private final EventProducer eventProducer;
|
||||||
private final CooperateShipFoundationService cooperateShipFoundationService;
|
private final CooperateShipFoundationService cooperateShipFoundationService;
|
||||||
|
private final OrgJobFoundationService orgJobFoundationService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SaasCooperateShip create(CreateReq req) {
|
public SaasCooperateShip create(CreateReq req) {
|
||||||
@ -125,11 +128,11 @@ public class CooperateShipServiceImpl implements CooperateShipService {
|
|||||||
public List<OrgCooperateShipDTO> list(ListOrgCooperateShipReq req) {
|
public List<OrgCooperateShipDTO> list(ListOrgCooperateShipReq req) {
|
||||||
|
|
||||||
// 全局变量定义:是否查询当前节点的人员
|
// 全局变量定义:是否查询当前节点的人员
|
||||||
boolean isFilterCurrentNodeByPerson = ObjectUtil.isNotNull(req.getFilterPersonId()) &&
|
boolean isFilterCurrentNodeByPerson = ObjectUtil.isNotNull(req.getFilterByPersonId()) &&
|
||||||
Objects.equals(req.getFilterPersonType(), ListOrgCooperateShipReq.FILTER_PERSON_TYPE_CURRENT_NODE);
|
Objects.equals(req.getFilterMethod(), ListOrgCooperateShipReq.FILTER_PERSON_TYPE_CURRENT_NODE);
|
||||||
// 全局变量定义:是否查询当前节点及以下节点的人员
|
// 全局变量定义:是否查询当前节点及以下节点的人员
|
||||||
boolean isFilterCurrentAndBelowByPerson = !isFilterCurrentNodeByPerson && ObjectUtil.isNotNull(req.getFilterPersonId())
|
boolean isFilterCurrentAndBelowByPerson = !isFilterCurrentNodeByPerson && ObjectUtil.isNotNull(req.getFilterByPersonId())
|
||||||
&& Objects.equals(req.getFilterPersonType(), ListOrgCooperateShipReq.FILTER_PERSON_TYPE_CURRENT_AND_BELOW_NODE);
|
&& Objects.equals(req.getFilterMethod(), ListOrgCooperateShipReq.FILTER_PERSON_TYPE_CURRENT_AND_BELOW_NODE);
|
||||||
|
|
||||||
// 根据入参查询数据
|
// 根据入参查询数据
|
||||||
List<SaasCooperateShip> currentNodeList = cooperateShipQueryRepository.list(
|
List<SaasCooperateShip> currentNodeList = cooperateShipQueryRepository.list(
|
||||||
@ -148,9 +151,15 @@ public class CooperateShipServiceImpl implements CooperateShipService {
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 协同关系id集合
|
||||||
|
List<Long> cooperateShipNodeIds = CollUtil.map(currentNodeList, SaasCooperateShip::getOrganizationalNodeId, true);
|
||||||
|
|
||||||
// 根据person过滤当前节点
|
// 根据person过滤当前节点
|
||||||
if (isFilterCurrentNodeByPerson) {
|
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)) {
|
if (CollUtil.isEmpty(currentNodeList)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
@ -166,38 +175,41 @@ public class CooperateShipServiceImpl implements CooperateShipService {
|
|||||||
resultNodeList.addAll(ancestorShipNodes);
|
resultNodeList.addAll(ancestorShipNodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 是否查询父级节点
|
// 是否查询父级节点
|
||||||
if (BooleanUtil.isTrue(req.getIncludeAncestors())) {
|
if (BooleanUtil.isTrue(req.getIncludeAncestors())) {
|
||||||
Set<Long> ancestorIds = cooperateShipFoundationService.extractAncestorIds(currentNodeList);
|
Set<Long> ancestorIds = cooperateShipFoundationService.extractAncestorIds(currentNodeList);
|
||||||
List<SaasCooperateShip> ancestorShipNodes = cooperateShipQueryRepository.list(CooperateShipQueryRepository.ListReq.builder().ids(ancestorIds).build());
|
List<SaasCooperateShip> ancestorShipNodes = cooperateShipQueryRepository.list(CooperateShipQueryRepository.ListReq.builder().ids(ancestorIds).statuses(req.getStatuses()).build());
|
||||||
resultNodeList.addAll(ancestorShipNodes);
|
resultNodeList.addAll(ancestorShipNodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 是否查询子节点
|
// 是否查询子节点
|
||||||
if (BooleanUtil.isTrue(req.getIncludeDescendants())) {
|
if (BooleanUtil.isTrue(req.getIncludeDescendants())) {
|
||||||
Set<String> paths = cooperateShipFoundationService.extractPaths(currentNodeList, ",");
|
Set<String> paths = cooperateShipFoundationService.extractPaths(currentNodeList, ",");
|
||||||
List<SaasCooperateShip> descendantShipNodes = cooperateShipQueryRepository.list(
|
List<SaasCooperateShip> descendantShipNodes = cooperateShipQueryRepository.list(
|
||||||
CooperateShipQueryRepository.ListReq.builder()
|
CooperateShipQueryRepository.ListReq.builder()
|
||||||
|
.statuses(req.getStatuses())
|
||||||
.pathsRight(paths).build());
|
.pathsRight(paths).build());
|
||||||
resultNodeList.addAll(descendantShipNodes);
|
|
||||||
// 是否查询当前节点及以下节点的人员
|
|
||||||
if (isFilterCurrentAndBelowByPerson) {
|
if (isFilterCurrentAndBelowByPerson) {
|
||||||
cooperateShipFoundationService.filterByPerson(req.getFilterPersonId(), resultNodeList);
|
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())) {
|
if (BooleanUtil.isTrue(req.getIncludeChildren())) {
|
||||||
Set<Long> ids = cooperateShipFoundationService.extract(currentNodeList, SaasCooperateShip::getId);
|
Set<Long> ids = cooperateShipFoundationService.extract(currentNodeList, SaasCooperateShip::getId);
|
||||||
List<SaasCooperateShip> descendantShipNodes = cooperateShipQueryRepository.list(
|
List<SaasCooperateShip> childrenShipNodes = cooperateShipQueryRepository.list(
|
||||||
CooperateShipQueryRepository.ListReq.builder()
|
CooperateShipQueryRepository.ListReq.builder()
|
||||||
|
.statuses(req.getStatuses())
|
||||||
.parentIds(ids).build());
|
.parentIds(ids).build());
|
||||||
resultNodeList.addAll(descendantShipNodes);
|
|
||||||
// 是否查询当前节点及以下节点的人员
|
// 是否查询当前节点及以下节点的人员
|
||||||
if (isFilterCurrentAndBelowByPerson) {
|
if (isFilterCurrentAndBelowByPerson) {
|
||||||
cooperateShipFoundationService.filterByPerson(req.getFilterPersonId(), resultNodeList);
|
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进行正序
|
// resultNodeList 根据path进行正序
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user