diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipQueryRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipQueryRepositoryImpl.java index 843a903..1757a1f 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipQueryRepositoryImpl.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipQueryRepositoryImpl.java @@ -61,6 +61,7 @@ public class CooperateShipQueryRepositoryImpl implements CooperateShipQueryRepos } wrapper.eq("is_delete", 0); + wrapper.last(" limit 10000"); return cooperateShipDao.list(wrapper) .stream().map(e -> BeanUtil.toBean(e, SaasCooperateShip.class)).collect(Collectors.toList()); 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 a044c7a..07c5b59 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 @@ -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.node.entity.OrganizationalNode; 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.server.cooperateship.event.inner.CooperateShipEventType; 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.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; import com.google.common.collect.ImmutableSet; @@ -35,6 +38,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.function.Supplier; +import java.util.stream.Collectors; @Slf4j @Service @@ -43,6 +48,7 @@ public class CooperateShipServiceImpl implements CooperateShipService { private final CooperateShipQueryRepository cooperateShipQueryRepository; private final NodeQueryRepository nodeQueryRepository; + private final NodeUserQueryRepository nodeUserQueryRepository; private final UnitQueryRepository unitQueryRepository; private final WorkspaceGateway workspaceGateway; private final CooperateShipFoundationService cooperateShipFoundationService; @@ -87,12 +93,25 @@ public class CooperateShipServiceImpl implements CooperateShipService { // 全局变量定义:是否查询当前节点及以下节点的人员 boolean isFilterCurrentAndBelowByPerson = !isFilterCurrentNodeByPerson && ObjectUtil.isNotNull(req.getFilterByPersonId()) && Objects.equals(req.getFilterMethod(), ListOrgCooperateShipReq.FILTER_PERSON_TYPE_CURRENT_AND_BELOW_NODE); - + List defaultNodeIds = new ArrayList<>(); if (Objects.nonNull(req.getFilterByPersonId()) && !isFilterCurrentNodeByPerson && !isFilterCurrentAndBelowByPerson) { 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 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() @@ -102,10 +121,11 @@ public class CooperateShipServiceImpl implements CooperateShipService { .ouIds(CollUtil.removeNull(req.getOuIds())) .includeCooperateTypes(CollUtil.removeNull(req.getIncludeCooperateTypes())) .excludeCooperateTypes(CollUtil.removeNull(req.getExcludeCooperateTypes())) - .organizationNodeIds(CollUtil.removeNull(req.getOrganizationNodeIds())) + .organizationNodeIds(CollUtil.removeNull(CollUtil.union(defaultNodeIds, req.getOrganizationNodeIds()))) .partnerShips(CollUtil.removeNull(req.getPartnerShips())) .statuses(CollUtil.removeNull(req.getStatuses())) .build(); + // 根据入参查询数据 List currentNodeList = cooperateShipQueryRepository.list(listReq); log.info("【协同关系基础数据查询】 入参 {},结果:{}", JSONUtil.toJsonStr(listReq), JSONUtil.toJsonStr(currentNodeList)); @@ -175,4 +195,32 @@ public class CooperateShipServiceImpl implements CooperateShipService { resultNodeList.sort(Comparator.comparing(SaasCooperateShip::getPath)); return BeanUtil.copyToList(CollUtil.distinct(resultNodeList, SaasCooperateShip::getId, true), OrgCooperateShipDTO.class); } + + /** + * 校验空值 + * @param suppliers + */ + private void checkAllNullValue(Supplier... suppliers) { + boolean isAllNull = true; + for (Supplier 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至少要有一个不为空"); + } + }