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.last(" limit 10000");
return cooperateShipDao.list(wrapper)
.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.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<Long> 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<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()
@ -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<SaasCooperateShip> 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<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至少要有一个不为空");
}
}