feat:[REQ-3488] 优化协同关系,如果仅personId有值,则先根据personId查询

This commit is contained in:
liuyang 2025-01-20 10:51:11 +08:00
parent cb75d33e5a
commit dfe9327c88
2 changed files with 52 additions and 3 deletions

View File

@ -61,6 +61,7 @@ public class CooperateShipQueryRepositoryImpl implements CooperateShipQueryRepos
} }
wrapper.eq("is_delete", 0); wrapper.eq("is_delete", 0);
wrapper.last(" limit 10000");
return cooperateShipDao.list(wrapper) return cooperateShipDao.list(wrapper)
.stream().map(e -> BeanUtil.toBean(e, SaasCooperateShip.class)).collect(Collectors.toList()); .stream().map(e -> BeanUtil.toBean(e, SaasCooperateShip.class)).collect(Collectors.toList());

View File

@ -17,6 +17,7 @@ import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipQueryRep
import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipUpsertRepository; import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipUpsertRepository;
import cn.axzo.orgmanax.infra.dao.node.entity.OrganizationalNode; import cn.axzo.orgmanax.infra.dao.node.entity.OrganizationalNode;
import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository;
import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository;
import cn.axzo.orgmanax.infra.dao.unit.repository.UnitQueryRepository; import cn.axzo.orgmanax.infra.dao.unit.repository.UnitQueryRepository;
import cn.axzo.orgmanax.server.cooperateship.event.inner.CooperateShipEventType; import cn.axzo.orgmanax.server.cooperateship.event.inner.CooperateShipEventType;
import cn.axzo.orgmanax.dto.cooperateship.event.CoopeateShipUpsertedPayload; import cn.axzo.orgmanax.dto.cooperateship.event.CoopeateShipUpsertedPayload;
@ -25,7 +26,9 @@ import cn.axzo.orgmanax.server.cooperateship.foundation.dto.CooperateShipCreator
import cn.axzo.orgmanax.server.cooperateship.service.CooperateShipService; import cn.axzo.orgmanax.server.cooperateship.service.CooperateShipService;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
@ -35,6 +38,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.*; import java.util.*;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@Slf4j @Slf4j
@Service @Service
@ -43,6 +48,7 @@ public class CooperateShipServiceImpl implements CooperateShipService {
private final CooperateShipQueryRepository cooperateShipQueryRepository; private final CooperateShipQueryRepository cooperateShipQueryRepository;
private final NodeQueryRepository nodeQueryRepository; private final NodeQueryRepository nodeQueryRepository;
private final NodeUserQueryRepository nodeUserQueryRepository;
private final UnitQueryRepository unitQueryRepository; private final UnitQueryRepository unitQueryRepository;
private final WorkspaceGateway workspaceGateway; private final WorkspaceGateway workspaceGateway;
private final CooperateShipFoundationService cooperateShipFoundationService; private final CooperateShipFoundationService cooperateShipFoundationService;
@ -87,12 +93,25 @@ public class CooperateShipServiceImpl implements CooperateShipService {
// 全局变量定义是否查询当前节点及以下节点的人员 // 全局变量定义是否查询当前节点及以下节点的人员
boolean isFilterCurrentAndBelowByPerson = !isFilterCurrentNodeByPerson && ObjectUtil.isNotNull(req.getFilterByPersonId()) boolean isFilterCurrentAndBelowByPerson = !isFilterCurrentNodeByPerson && ObjectUtil.isNotNull(req.getFilterByPersonId())
&& Objects.equals(req.getFilterMethod(), ListOrgCooperateShipReq.FILTER_PERSON_TYPE_CURRENT_AND_BELOW_NODE); && Objects.equals(req.getFilterMethod(), ListOrgCooperateShipReq.FILTER_PERSON_TYPE_CURRENT_AND_BELOW_NODE);
List<Long> defaultNodeIds = new ArrayList<>();
if (Objects.nonNull(req.getFilterByPersonId()) && !isFilterCurrentNodeByPerson && !isFilterCurrentAndBelowByPerson) { if (Objects.nonNull(req.getFilterByPersonId()) && !isFilterCurrentNodeByPerson && !isFilterCurrentAndBelowByPerson) {
Axssert.check(false, BizResultCode.INVALID_PARAM, "filterMethod的参数不正确"); Axssert.check(false, BizResultCode.INVALID_PARAM, "filterMethod的参数不正确");
} }
// todo 这里需要优化,先查nodeUser防止数据库击穿 // 关键查询字段必须有值
checkAllNullValue(req::getIds, req::getOuIds, req::getWorkspaceIds, req::getFilterByPersonId, req::getOrganizationNodeIds, req::getOuIds);
// 如果personId有值, 则先将nodeUser查询来, 作为筛选条件
if (isFilterCurrentNodeByPerson) {
List<NodeUserQueryRepository.NodeUserResp> nodeUsers = nodeUserQueryRepository.list(NodeUserQueryRepository.ListReq.builder()
.personId(req.getFilterByPersonId())
.includeDeleted(req.getFilterIncludeExitPerson())
.build());
if (CollUtil.isNotEmpty(nodeUsers)) {
defaultNodeIds.addAll(nodeUsers.stream().map(NodeUserQueryRepository.NodeUserResp::getOrganizationalNodeId).filter(Objects::nonNull).collect(Collectors.toList()));
}
}
// 构建查询条件 // 构建查询条件
CooperateShipQueryRepository.ListReq listReq = CooperateShipQueryRepository.ListReq.builder() CooperateShipQueryRepository.ListReq listReq = CooperateShipQueryRepository.ListReq.builder()
@ -102,10 +121,11 @@ public class CooperateShipServiceImpl implements CooperateShipService {
.ouIds(CollUtil.removeNull(req.getOuIds())) .ouIds(CollUtil.removeNull(req.getOuIds()))
.includeCooperateTypes(CollUtil.removeNull(req.getIncludeCooperateTypes())) .includeCooperateTypes(CollUtil.removeNull(req.getIncludeCooperateTypes()))
.excludeCooperateTypes(CollUtil.removeNull(req.getExcludeCooperateTypes())) .excludeCooperateTypes(CollUtil.removeNull(req.getExcludeCooperateTypes()))
.organizationNodeIds(CollUtil.removeNull(req.getOrganizationNodeIds())) .organizationNodeIds(CollUtil.removeNull(CollUtil.union(defaultNodeIds, req.getOrganizationNodeIds())))
.partnerShips(CollUtil.removeNull(req.getPartnerShips())) .partnerShips(CollUtil.removeNull(req.getPartnerShips()))
.statuses(CollUtil.removeNull(req.getStatuses())) .statuses(CollUtil.removeNull(req.getStatuses()))
.build(); .build();
// 根据入参查询数据 // 根据入参查询数据
List<SaasCooperateShip> currentNodeList = cooperateShipQueryRepository.list(listReq); List<SaasCooperateShip> currentNodeList = cooperateShipQueryRepository.list(listReq);
log.info("【协同关系基础数据查询】 入参 {},结果:{}", JSONUtil.toJsonStr(listReq), JSONUtil.toJsonStr(currentNodeList)); log.info("【协同关系基础数据查询】 入参 {},结果:{}", JSONUtil.toJsonStr(listReq), JSONUtil.toJsonStr(currentNodeList));
@ -175,4 +195,32 @@ public class CooperateShipServiceImpl implements CooperateShipService {
resultNodeList.sort(Comparator.comparing(SaasCooperateShip::getPath)); resultNodeList.sort(Comparator.comparing(SaasCooperateShip::getPath));
return BeanUtil.copyToList(CollUtil.distinct(resultNodeList, SaasCooperateShip::getId, true), OrgCooperateShipDTO.class); return BeanUtil.copyToList(CollUtil.distinct(resultNodeList, SaasCooperateShip::getId, true), OrgCooperateShipDTO.class);
} }
/**
* 校验空值
* @param suppliers
*/
private void checkAllNullValue(Supplier<Object>... suppliers) {
boolean isAllNull = true;
for (Supplier<Object> supplier : suppliers) {
Object value = supplier.get();
if (value != null) {
if (value instanceof Collection) {
if (CollUtil.isNotEmpty((Collection<?>) value)) {
isAllNull = false;
}
}
if (value instanceof Long) {
Long longValue = Convert.toLong(value, 0L);
if (longValue > 0) {
isAllNull = false;
}
}
}
}
Axssert.check(!isAllNull, BizResultCode.INVALID_PARAM, "filterByPersonId,ids,workspaceIds,organizationNodeIds,ouIds至少要有一个不为空");
}
} }