From eb2ea435902322516a8a1ed0a59f0d5aefd94982 Mon Sep 17 00:00:00 2001 From: lvzk <897706680@qq.com> Date: Mon, 7 Apr 2025 12:29:40 +0800 Subject: [PATCH 1/4] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E6=B8=85=E5=8D=95=E5=8F=91=E5=99=A8=E5=BA=94=E7=94=A8=E5=B7=A1?= =?UTF-8?q?=E6=A3=80=E4=BD=9C=E4=B8=9A=EF=BC=8C=E8=87=AA=E5=8A=A8=E5=8C=96?= =?UTF-8?q?=E9=9C=80=E9=80=82=E9=85=8D=E5=8A=A8=E6=80=81=E8=A7=86=E5=9B=BE?= =?UTF-8?q?=20#[1394049406173184]=E5=BA=94=E7=94=A8=E6=B8=85=E5=8D=95?= =?UTF-8?q?=E5=8F=91=E5=99=A8=E5=BA=94=E7=94=A8=E5=B7=A1=E6=A3=80=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=EF=BC=8C=E8=87=AA=E5=8A=A8=E5=8C=96=E9=9C=80=E9=80=82?= =?UTF-8?q?=E9=85=8D=E5=8A=A8=E6=80=81=E8=A7=86=E5=9B=BE=20http://192.168.?= =?UTF-8?q?0.96:8090/demo/rdm.html#/story-detail/939050947543040/939050947?= =?UTF-8?q?543042/1394049406173184?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../job/node/UpdateNodesByFilterHandler.java | 192 ++++++++ .../job/node/UpdateNodesByInputHandler.java | 118 +++++ .../job/node/UpdateNodesByParamsHandler.java | 122 +++++ .../UpdateNodesByPrePhaseOutputHandler.java | 153 ++++++ .../job/node/UpdateNodesSelectHandler.java | 106 +++++ .../autoexec/service/AutoexecJobService.java | 27 ++ .../service/AutoexecJobServiceImpl.java | 434 +----------------- 7 files changed, 729 insertions(+), 423 deletions(-) create mode 100644 src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByFilterHandler.java create mode 100644 src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByInputHandler.java create mode 100644 src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByParamsHandler.java create mode 100644 src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByPrePhaseOutputHandler.java create mode 100644 src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesSelectHandler.java diff --git a/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByFilterHandler.java b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByFilterHandler.java new file mode 100644 index 00000000..d8c9f547 --- /dev/null +++ b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByFilterHandler.java @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package neatlogic.module.autoexec.job.node; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.autoexec.constvalue.AutoexecJobPhaseNodeFrom; +import neatlogic.framework.autoexec.constvalue.CombopNodeSpecify; +import neatlogic.framework.autoexec.dto.combop.AutoexecCombopConfigVo; +import neatlogic.framework.autoexec.dto.combop.AutoexecCombopExecuteNodeConfigVo; +import neatlogic.framework.autoexec.dto.job.AutoexecJobVo; +import neatlogic.framework.autoexec.job.node.IUpdateNodes; +import neatlogic.framework.cmdb.crossover.ICiCrossoverMapper; +import neatlogic.framework.cmdb.crossover.IResourceCrossoverMapper; +import neatlogic.framework.cmdb.dto.ci.CiVo; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceSearchVo; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceVo; +import neatlogic.framework.crossover.CrossoverServiceFactory; +import neatlogic.module.autoexec.dao.mapper.AutoexecResourceMapper; +import neatlogic.module.autoexec.service.AutoexecJobService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +@Service +public class UpdateNodesByFilterHandler implements IUpdateNodes { + @Resource + AutoexecJobService autoexecJobService; + @Resource + private AutoexecResourceMapper autoexecResourceMapper; + private static final Logger logger = LoggerFactory.getLogger(UpdateNodesByFilterHandler.class); + @Override + public boolean update(AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, AutoexecJobVo jobVo, String userName, Long protocolId) { + boolean isHasNode = false; + if (executeNodeConfigVo == null) { + return false; + } + if (MapUtils.isNotEmpty(executeNodeConfigVo.getFilter())) { + logger.debug("##updateNodeResourceByFilter:-------------------------------------------------------------------------------start"); + //long updateNodeResourceByFilter = System.currentTimeMillis(); + isHasNode = updateNodeResourceByFilter(executeNodeConfigVo, jobVo, userName, protocolId); + //System.out.println((System.currentTimeMillis() - updateNodeResourceByFilter) + " ##updateNodeResourceByFilter:-------------------------------------------------------------------------------"); + logger.debug("##updateNodeResourceByFilter:-------------------------------------------------------------------------------end"); + + } + return isHasNode; + } + + /** + * filter + * 根据过滤器 更新节点 + * + * @param executeNodeConfigVo 执行节点配置 + * @param jobVo 作业 + * @param userName 执行用户 + * @param protocolId 协议id + */ + public boolean updateNodeResourceByFilter(AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, AutoexecJobVo jobVo, String userName, Long protocolId) { + JSONObject filterJson = executeNodeConfigVo.getFilter(); + boolean isHasNode = false; + if (MapUtils.isNotEmpty(filterJson)) { + //如果作业层面的节点则补充前置filter + if (Objects.equals(jobVo.getNodeFrom(), AutoexecJobPhaseNodeFrom.JOB.getValue())) { + AutoexecCombopConfigVo config = jobVo.getConfig(); + JSONObject preFilter = null; + if (config != null && config.getExecuteConfig() != null && config.getExecuteConfig().getCombopNodeConfig() != null && MapUtils.isNotEmpty(config.getExecuteConfig().getCombopNodeConfig().getFilter())) { + if (Objects.equals(config.getExecuteConfig().getWhenToSpecify(), CombopNodeSpecify.RUNTIME.getValue())) { + preFilter = config.getExecuteConfig().getCombopNodeConfig().getFilter(); + //以preFilter为主 + for (Map.Entry entry : preFilter.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + if (value == null || (value instanceof JSONArray && CollectionUtils.isEmpty((JSONArray) value))) { + continue; + } + if (filterJson.containsKey(key)) { + filterJson.put(key, value); + } + } + } + } + } + ResourceSearchVo searchVo = autoexecJobService.getResourceSearchVoWithCmdbGroupType(jobVo, filterJson); + searchVo.setMaxPageSize(50000); + searchVo.setPageSize(50000); + IResourceCrossoverMapper resourceCrossoverMapper = CrossoverServiceFactory.getApi(IResourceCrossoverMapper.class); + List idList; + StringBuilder sqlSb = new StringBuilder(); + if (searchVo.isCustomCondition()) { + searchVo.buildConditionWhereSql(sqlSb, searchVo); + idList = resourceCrossoverMapper.getResourceIdListByDynamicCondition(searchVo, sqlSb.toString()); + } else { + idList = resourceCrossoverMapper.getResourceIdList(searchVo); + } + int count = idList.size(); + if (count > 0) { + int index = 0; + List idPageList = new ArrayList<>(); + for (int i = 0; i < count; i++) { + if (index < 1000) { + idPageList.add(idList.get(i)); + index++; + continue; + } + i--; + logger.debug("##getResourceListByIdList:-------------------------------------------------------------------------------start"); + //long bbb = System.currentTimeMillis(); + List resourceList = resourceCrossoverMapper.getResourceListByIdList(idPageList); + //System.out.println((System.currentTimeMillis() - bbb) + " ##bbb:-------------------------------------------------------------------------------"); + logger.debug("##getResourceListByIdList:-------------------------------------------------------------------------------end"); + if (CollectionUtils.isNotEmpty(resourceList)) { + logger.debug("##updateJobPhaseNode:-------------------------------------------------------------------------------start"); + //long updateJobPhaseNode = System.currentTimeMillis(); + autoexecJobService.updateJobPhaseNode(jobVo, resourceList, userName, protocolId); + // System.out.println((System.currentTimeMillis() - updateJobPhaseNode) + " ##updateJobPhaseNode:-------------------------------------------------------------------------------"); + logger.debug("##updateJobPhaseNode:-------------------------------------------------------------------------------end"); + } + index = 0; + idPageList.clear(); + } + //补充最后一次循环数据 + if (CollectionUtils.isNotEmpty(idPageList)) { + logger.debug("##getResourceListByIdList last:-------------------------------------------------------------------------------start"); + //long bbb = System.currentTimeMillis(); + List resourceList = resourceCrossoverMapper.getResourceListByIdList(idPageList); + //System.out.println((System.currentTimeMillis() - bbb) + " ##bbb:-------------------------------------------------------------------------------"); + logger.debug("##getResourceListByIdList last:-------------------------------------------------------------------------------end"); + if (CollectionUtils.isNotEmpty(resourceList)) { + logger.debug("##updateJobPhaseNode last:-------------------------------------------------------------------------------start"); + //long updateJobPhaseNode = System.currentTimeMillis(); + autoexecJobService.updateJobPhaseNode(jobVo, resourceList, userName, protocolId); + //System.out.println((System.currentTimeMillis() - updateJobPhaseNode) + " ##updateJobPhaseNode:-------------------------------------------------------------------------------"); + logger.debug("##updateJobPhaseNode last:-------------------------------------------------------------------------------end"); + } + idPageList.clear(); + } + isHasNode = true; + } + //针对巡检补充os 资产 + if (Objects.equals(jobVo.getSource(), neatlogic.framework.inspect.constvalue.JobSource.INSPECT_APP.getValue())) { + ICiCrossoverMapper ciCrossoverMapper = CrossoverServiceFactory.getApi(ICiCrossoverMapper.class); + CiVo civo = ciCrossoverMapper.getCiById(jobVo.getInvokeId()); + if (civo.getParentCiName() != null && civo.getParentCiName().toUpperCase(Locale.ROOT).contains("OS")) { + //从scence_os_softwareservice_env_appmodule_appsystem 获取os + searchVo.setTypeId(jobVo.getInvokeId()); + searchVo.setAppSystemId(searchVo.getAppSystemIdList().get(0)); + if (CollectionUtils.isNotEmpty(searchVo.getEnvIdList())) { + searchVo.setEnvId(searchVo.getEnvIdList().get(0)); + } + int rowNum = autoexecResourceMapper.getOsResourceCountByAppSystemIdAndAppModuleIdListAndEnvIdAndTypeId(searchVo); + if (rowNum > 0) { + searchVo.setRowNum(rowNum); + for (int currentPage = 1; currentPage <= searchVo.getPageCount(); currentPage++) { + searchVo.setCurrentPage(currentPage); + List idOsList = autoexecResourceMapper.getOsResourceIdListByAppSystemIdAndAppModuleIdAndEnvIdAndTypeId(searchVo); + if (CollectionUtils.isNotEmpty(idOsList)) { + List resourceList = resourceCrossoverMapper.getResourceByIdList(idOsList); + if (CollectionUtils.isNotEmpty(resourceList)) { + autoexecJobService.updateJobPhaseNode(jobVo, resourceList, userName, protocolId); + isHasNode = true; + } + } + } + } + } + } + } + return isHasNode; + } + + +} diff --git a/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByInputHandler.java b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByInputHandler.java new file mode 100644 index 00000000..a7f860da --- /dev/null +++ b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByInputHandler.java @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package neatlogic.module.autoexec.job.node; + +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.autoexec.constvalue.AutoexecJobPhaseNodeFrom; +import neatlogic.framework.autoexec.constvalue.CombopNodeSpecify; +import neatlogic.framework.autoexec.dto.combop.AutoexecCombopConfigVo; +import neatlogic.framework.autoexec.dto.combop.AutoexecCombopExecuteNodeConfigVo; +import neatlogic.framework.autoexec.dto.job.AutoexecJobVo; +import neatlogic.framework.autoexec.dto.node.AutoexecNodeVo; +import neatlogic.framework.autoexec.job.node.IUpdateNodes; +import neatlogic.framework.cmdb.crossover.IResourceCrossoverMapper; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceSearchVo; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceVo; +import neatlogic.framework.common.util.PageUtil; +import neatlogic.framework.crossover.CrossoverServiceFactory; +import neatlogic.module.autoexec.service.AutoexecJobService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +@Service +public class UpdateNodesByInputHandler implements IUpdateNodes { + @Resource + AutoexecJobService autoexecJobService; + @Override + public boolean update(AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, AutoexecJobVo jobVo, String userName, Long protocolId) { + boolean isHasNode = false; + if (executeNodeConfigVo == null) { + return false; + } + + if (CollectionUtils.isNotEmpty(executeNodeConfigVo.getInputNodeList())) { + isHasNode = updateNodeResourceByInput(executeNodeConfigVo, jobVo, userName, protocolId); + } + return isHasNode; + } + + /** + * inputNodeList、selectNodeList + * 根据输入和选择节点 更新作业节点 + * + * @param executeNodeConfigVo 执行节点配置 + * @param jobVo 作业 + * @param userName 执行用户 + * @param protocolId 协议id + */ + private boolean updateNodeResourceByInput(AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, AutoexecJobVo jobVo, String userName, Long protocolId) { + List nodeVoList = executeNodeConfigVo.getInputNodeList(); + boolean isHasNode = false; + List ipPortNameList = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(nodeVoList)) { + nodeVoList.forEach(o -> ipPortNameList.add(new ResourceVo(o.getIp(), o.getPort(), o.getName()))); + JSONObject preFilter = null; + if (Objects.equals(jobVo.getNodeFrom(), AutoexecJobPhaseNodeFrom.JOB.getValue())) { + //如果作业层面的节点则补充前置filter + AutoexecCombopConfigVo config = jobVo.getConfig(); + if (config != null && config.getExecuteConfig() != null + && config.getExecuteConfig().getCombopNodeConfig() != null + && MapUtils.isNotEmpty(config.getExecuteConfig().getCombopNodeConfig().getFilter()) + && (Objects.equals(config.getExecuteConfig().getWhenToSpecify(), CombopNodeSpecify.RUNTIME.getValue()))) { + preFilter = config.getExecuteConfig().getCombopNodeConfig().getFilter(); + } + } + ResourceSearchVo searchVo = autoexecJobService.getResourceSearchVoWithCmdbGroupType(jobVo, preFilter); + IResourceCrossoverMapper resourceCrossoverMapper = CrossoverServiceFactory.getApi(IResourceCrossoverMapper.class); + List resourceSearchList = new ArrayList<>(); + Set resourceIdSet = new HashSet<>(); + ipPortNameList.forEach(o -> resourceSearchList.add(new ResourceSearchVo(o))); + if (CollectionUtils.isNotEmpty(resourceSearchList)) { + for (ResourceSearchVo resourceSearchVo : resourceSearchList) { + Long id = resourceCrossoverMapper.getResourceIdByIpAndPortAndName(resourceSearchVo); + if (id != null) { + resourceIdSet.add(id); + } + } + } + if (CollectionUtils.isNotEmpty(resourceIdSet)) { + searchVo.setIdList(new ArrayList<>(resourceIdSet)); + int count = resourceCrossoverMapper.getResourceCount(searchVo); + if (count > 0) { + int pageCount = PageUtil.getPageCount(count, searchVo.getPageSize()); + for (int i = 1; i <= pageCount; i++) { + searchVo.setCurrentPage(i); + List idList = resourceCrossoverMapper.getResourceIdList(searchVo); + if (CollectionUtils.isNotEmpty(idList)) { + List resourceList = resourceCrossoverMapper.getResourceListByIdList(idList); + if (CollectionUtils.isNotEmpty(resourceList)) { + autoexecJobService.updateJobPhaseNode(jobVo, resourceList, userName, protocolId); + isHasNode = true; + } + } + } + } + } + } + return isHasNode; + } +} diff --git a/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByParamsHandler.java b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByParamsHandler.java new file mode 100644 index 00000000..e19a98fd --- /dev/null +++ b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByParamsHandler.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package neatlogic.module.autoexec.job.node; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.autoexec.dto.AutoexecParamVo; +import neatlogic.framework.autoexec.dto.combop.AutoexecCombopExecuteNodeConfigVo; +import neatlogic.framework.autoexec.dto.job.AutoexecJobVo; +import neatlogic.framework.autoexec.job.node.IUpdateNodes; +import neatlogic.framework.cmdb.crossover.IResourceCrossoverMapper; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceSearchVo; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceVo; +import neatlogic.framework.crossover.CrossoverServiceFactory; +import neatlogic.module.autoexec.service.AutoexecJobService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +public class UpdateNodesByParamsHandler implements IUpdateNodes { + @Resource + AutoexecJobService autoexecJobService; + + @Override + public boolean update(AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, AutoexecJobVo jobVo, String userName, Long protocolId) { + boolean isHasNode = false; + if (executeNodeConfigVo == null) { + return false; + } + + if (CollectionUtils.isNotEmpty(executeNodeConfigVo.getInputNodeList())) { + isHasNode = updateNodeResourceByParam(jobVo, executeNodeConfigVo, userName, protocolId); + } + return isHasNode; + } + + /** + * param + * 根据运行参数中定义的节点参数 更新作业节点 + * + * @param executeNodeConfigVo 执行节点配置 + * @param jobVo 作业 + * @param userName 执行用户 + * @param protocolId 协议id + */ + private boolean updateNodeResourceByParam(AutoexecJobVo jobVo, AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, String userName, Long protocolId) { + List paramList = executeNodeConfigVo.getParamList(); + if (CollectionUtils.isNotEmpty(paramList)) { + List runTimeParamList = jobVo.getRunTimeParamList(); + Set resourceIdSet = new HashSet<>(); + List resourceSearchList = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(runTimeParamList)) { + List paramObjList = runTimeParamList.stream().filter(p -> paramList.contains(p.getKey())).collect(Collectors.toList()); + paramObjList.forEach(p -> { + if (p.getValue() instanceof JSONArray) { + JSONArray valueArray = (JSONArray) p.getValue(); + for (int i = 0; i < valueArray.size(); i++) { + JSONObject valueObj = valueArray.getJSONObject(i); + Long id = valueObj.getLong("id"); + if (id != null) { + resourceIdSet.add(id); + } else { + String ip = valueObj.getString("ip"); + if (StringUtils.isNotBlank(ip)) { + Integer port = valueObj.getInteger("port"); + String name = valueObj.getString("name"); + ResourceSearchVo resourceSearchVo = new ResourceSearchVo(); + resourceSearchVo.setIp(ip); + if (port != null) { + resourceSearchVo.setPort(port.toString()); + } + resourceSearchVo.setName(name); + resourceSearchList.add(resourceSearchVo); + } + } + } + } + }); + IResourceCrossoverMapper resourceCrossoverMapper = CrossoverServiceFactory.getApi(IResourceCrossoverMapper.class); + if (CollectionUtils.isNotEmpty(resourceSearchList)) { + for (ResourceSearchVo resourceSearchVo : resourceSearchList) { + Long id = resourceCrossoverMapper.getResourceIdByIpAndPortAndName(resourceSearchVo); + if (id != null) { + resourceIdSet.add(id); + } + } + } + if (CollectionUtils.isNotEmpty(resourceIdSet)) { + List resourceVoList = resourceCrossoverMapper.getResourceByIdList(new ArrayList<>(resourceIdSet)); + if (CollectionUtils.isNotEmpty(resourceVoList)) { + autoexecJobService.updateJobPhaseNode(jobVo, resourceVoList, userName, protocolId); + return true; + } + } + } + } + return false; + } +} diff --git a/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByPrePhaseOutputHandler.java b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByPrePhaseOutputHandler.java new file mode 100644 index 00000000..82fc00e3 --- /dev/null +++ b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByPrePhaseOutputHandler.java @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package neatlogic.module.autoexec.job.node; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.autoexec.constvalue.ExecMode; +import neatlogic.framework.autoexec.dao.mapper.AutoexecJobMapper; +import neatlogic.framework.autoexec.dto.combop.AutoexecCombopExecuteNodeConfigVo; +import neatlogic.framework.autoexec.dto.job.AutoexecJobPhaseNodeVo; +import neatlogic.framework.autoexec.dto.job.AutoexecJobPhaseOperationVo; +import neatlogic.framework.autoexec.dto.job.AutoexecJobVo; +import neatlogic.framework.autoexec.dto.node.AutoexecNodeVo; +import neatlogic.framework.autoexec.exception.AutoexecJobNodePreParamValueNotInvalidException; +import neatlogic.framework.autoexec.exception.AutoexecJobPhaseOperationNotFoundException; +import neatlogic.framework.autoexec.exception.AutoexecJobUpdateNodeByPreOutPutListException; +import neatlogic.framework.autoexec.job.node.IUpdateNodes; +import neatlogic.framework.cmdb.crossover.IResourceCrossoverMapper; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceSearchVo; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceVo; +import neatlogic.framework.crossover.CrossoverServiceFactory; +import neatlogic.module.autoexec.service.AutoexecJobService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.bson.Document; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +@Service +public class UpdateNodesByPrePhaseOutputHandler implements IUpdateNodes { + @Resource + AutoexecJobService autoexecJobService; + @Resource + AutoexecJobMapper autoexecJobMapper; + @Resource + private MongoTemplate mongoTemplate; + + @Override + public boolean update(AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, AutoexecJobVo jobVo, String userName, Long protocolId) { + boolean isHasNode = false; + if (executeNodeConfigVo == null) { + return false; + } + + if (CollectionUtils.isNotEmpty(executeNodeConfigVo.getInputNodeList())) { + isHasNode = updateNodeResourceByPrePhaseOutput(jobVo, executeNodeConfigVo, userName, protocolId); + } + return isHasNode; + } + + /** + * param + * 根据上游阶段出参 更新作业节点 + * + * @param executeNodeConfigVo 执行节点配置 + * @param jobVo 作业 + * @param userName 执行用户 + * @param protocolId 协议id + */ + private boolean updateNodeResourceByPrePhaseOutput(AutoexecJobVo jobVo, AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, String userName, Long protocolId) { + List preOutputList = executeNodeConfigVo.getPreOutputList(); + if (CollectionUtils.isEmpty(preOutputList) && preOutputList.size() != 3) { + throw new AutoexecJobUpdateNodeByPreOutPutListException(jobVo); + } + String phaseUuid = preOutputList.get(0); + String operationUuid = preOutputList.get(1); + String paramKey = preOutputList.get(2); + AutoexecJobPhaseOperationVo operationVo = autoexecJobMapper.getJobPhaseOperationByJobIdAndPhaseUuidAndUuid(jobVo.getId(), phaseUuid, operationUuid); + if (operationVo == null) { + throw new AutoexecJobPhaseOperationNotFoundException(operationUuid); + } + + //从mongodb获取output 对应应用的param 值 作为执行节点 + AtomicReference nodeArrayAtomic = new AtomicReference<>(); + Document doc = new Document(); + Document fieldDocument = new Document(); + if (Arrays.asList(ExecMode.TARGET.getValue(), ExecMode.RUNNER_TARGET.getValue()).contains(jobVo.getPreOutputPhase().getExecMode())) { + List nodeList = autoexecJobMapper.getJobPhaseNodeListByJobIdAndPhaseId(jobVo.getId(), jobVo.getPreOutputPhase().getId()); + doc.put("resourceId", nodeList.get(0).getResourceId()); + } else { + doc.put("resourceId", 0L); + } + doc.put("jobId", jobVo.getId().toString()); + fieldDocument.put("data", true); + mongoTemplate.getDb().getCollection("_node_output").find(doc).projection(fieldDocument).forEach(o -> { + JSONObject operation = JSON.parseObject(o.toJson()); + if (operation.containsKey("data")) { + JSONObject dataJson = operation.getJSONObject("data"); + JSONObject outputJson = dataJson.getJSONObject(operationVo.getName() + "_" + operationVo.getId()); + if (MapUtils.isNotEmpty(outputJson)) { + Object nodes = outputJson.get(paramKey); + if (nodes != null) { + if (nodes instanceof JSONArray) { + nodeArrayAtomic.set((JSONArray) nodes); + } else if (nodes instanceof String) { + try { + nodeArrayAtomic.set(JSON.parseArray(nodes.toString())); + } catch (Exception ex) { + throw new AutoexecJobNodePreParamValueNotInvalidException(jobVo.getId(), jobVo.getCurrentPhase().getName()); + } + } else { + throw new AutoexecJobNodePreParamValueNotInvalidException(jobVo.getId(), jobVo.getCurrentPhase().getName()); + } + } + } + } + }); + JSONArray nodeArray = nodeArrayAtomic.get(); + if (CollectionUtils.isEmpty(nodeArray)) { + throw new AutoexecJobNodePreParamValueNotInvalidException(jobVo.getId(), jobVo.getCurrentPhase().getName()); + } + + //更新执行节点 + List nodeVoList = nodeArray.toJavaList(AutoexecNodeVo.class); + List ipPortNameList = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(nodeVoList)) { + nodeVoList.forEach(o -> ipPortNameList.add(new ResourceVo(o.getIp(), o.getPort(), o.getName()))); + IResourceCrossoverMapper resourceCrossoverMapper = CrossoverServiceFactory.getApi(IResourceCrossoverMapper.class); + ResourceSearchVo searchVo = autoexecJobService.getResourceSearchVoWithCmdbGroupType(jobVo); + List resourceVoList = resourceCrossoverMapper.getResourceListByResourceVoList(ipPortNameList, searchVo); + if (CollectionUtils.isNotEmpty(resourceVoList)) { + autoexecJobService.updateJobPhaseNode(jobVo, resourceVoList, userName, protocolId); + //重置节点状态 + //List jobNodeVoList = autoexecJobMapper.getJobPhaseNodeListWithRunnerByJobPhaseIdAndExceptStatusList(jobVo.getCurrentPhase().getId(), Collections.singletonList(JobNodeStatus.IGNORED.getValue())); + //resetJobNodeStatus(jobVo, jobNodeVoList); + return true; + } + } + return false; + } +} diff --git a/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesSelectHandler.java b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesSelectHandler.java new file mode 100644 index 00000000..e46e129f --- /dev/null +++ b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesSelectHandler.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package neatlogic.module.autoexec.job.node; + +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.autoexec.constvalue.AutoexecJobPhaseNodeFrom; +import neatlogic.framework.autoexec.constvalue.CombopNodeSpecify; +import neatlogic.framework.autoexec.dto.combop.AutoexecCombopConfigVo; +import neatlogic.framework.autoexec.dto.combop.AutoexecCombopExecuteNodeConfigVo; +import neatlogic.framework.autoexec.dto.job.AutoexecJobVo; +import neatlogic.framework.autoexec.dto.node.AutoexecNodeVo; +import neatlogic.framework.autoexec.job.node.IUpdateNodes; +import neatlogic.framework.cmdb.crossover.IResourceCrossoverMapper; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceSearchVo; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceVo; +import neatlogic.framework.common.util.PageUtil; +import neatlogic.framework.crossover.CrossoverServiceFactory; +import neatlogic.module.autoexec.service.AutoexecJobService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Objects; + +import static java.util.stream.Collectors.toList; + +@Service +public class UpdateNodesSelectHandler implements IUpdateNodes { + @Resource + AutoexecJobService autoexecJobService; + + @Override + public boolean update(AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, AutoexecJobVo jobVo, String userName, Long protocolId) { + boolean isHasNode = false; + if (executeNodeConfigVo == null) { + return false; + } + + if (CollectionUtils.isNotEmpty(executeNodeConfigVo.getSelectNodeList())) { + isHasNode = updateNodeResourceBySelect(jobVo, executeNodeConfigVo, userName, protocolId); + } + return isHasNode; + } + + /** + * selectNodeList + * 根据输入和选择节点 更新作业节点 + * + * @param executeNodeConfigVo 执行节点配置 + * @param jobVo 作业 + * @param userName 执行用户 + * @param protocolId 协议id + */ + private boolean updateNodeResourceBySelect(AutoexecJobVo jobVo, AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, String userName, Long protocolId) { + List nodeVoList = executeNodeConfigVo.getSelectNodeList(); + boolean isHasNode = false; + if (CollectionUtils.isNotEmpty(nodeVoList)) { + IResourceCrossoverMapper resourceCrossoverMapper = CrossoverServiceFactory.getApi(IResourceCrossoverMapper.class); + JSONObject preFilter = null; + if (Objects.equals(jobVo.getNodeFrom(), AutoexecJobPhaseNodeFrom.JOB.getValue())) { + //如果作业层面的节点则补充前置filter + AutoexecCombopConfigVo config = jobVo.getConfig(); + if (config != null && config.getExecuteConfig() != null && config.getExecuteConfig().getCombopNodeConfig() != null && MapUtils.isNotEmpty(config.getExecuteConfig().getCombopNodeConfig().getFilter())) { + if (Objects.equals(config.getExecuteConfig().getWhenToSpecify(), CombopNodeSpecify.RUNTIME.getValue())) { + preFilter = config.getExecuteConfig().getCombopNodeConfig().getFilter(); + } + } + } + ResourceSearchVo searchVo = autoexecJobService.getResourceSearchVoWithCmdbGroupType(jobVo, preFilter); + searchVo.setIdList(nodeVoList.stream().map(AutoexecNodeVo::getId).collect(toList())); + int count = resourceCrossoverMapper.getResourceCount(searchVo); + if (count > 0) { + int pageCount = PageUtil.getPageCount(count, searchVo.getPageSize()); + for (int i = 1; i <= pageCount; i++) { + searchVo.setCurrentPage(i); + List idList = resourceCrossoverMapper.getResourceIdList(searchVo); + if (CollectionUtils.isNotEmpty(idList)) { + List resourceList = resourceCrossoverMapper.getResourceListByIdList(idList); + if (CollectionUtils.isNotEmpty(resourceList)) { + autoexecJobService.updateJobPhaseNode(jobVo, resourceList, userName, protocolId); + isHasNode = true; + } + } + } + } + } + return isHasNode; + } +} diff --git a/src/main/java/neatlogic/module/autoexec/service/AutoexecJobService.java b/src/main/java/neatlogic/module/autoexec/service/AutoexecJobService.java index 8cb6cf47..cf5a615a 100644 --- a/src/main/java/neatlogic/module/autoexec/service/AutoexecJobService.java +++ b/src/main/java/neatlogic/module/autoexec/service/AutoexecJobService.java @@ -24,6 +24,8 @@ import neatlogic.framework.autoexec.dto.combop.ParamMappingVo; import neatlogic.framework.autoexec.dto.job.AutoexecJobPhaseNodeVo; import neatlogic.framework.autoexec.dto.job.AutoexecJobPhaseVo; import neatlogic.framework.autoexec.dto.job.AutoexecJobVo; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceSearchVo; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceVo; import neatlogic.framework.dto.runner.RunnerMapVo; import java.util.List; @@ -252,4 +254,29 @@ public interface AutoexecJobService { */ String getFinalParamValue(ParamMappingVo executeUser, List runTimeParamList); + /** + * 获取resourceSearch,补充opType操作类型 + * + * @param jobVo 作业 + */ + ResourceSearchVo getResourceSearchVoWithCmdbGroupType(AutoexecJobVo jobVo); + + /** + * 获取resourceSearch,补充opType操作类型 + * + * @param jobVo 作业 + * @param filterJson 过滤参数 + */ + ResourceSearchVo getResourceSearchVoWithCmdbGroupType(AutoexecJobVo jobVo, JSONObject filterJson); + + + /** + * 获取目标节点并入库 + * @param jobVo 作业 + * @param resourceVoList 资产列表 + * @param userName 执行用户 + * @param protocolId 协议id + */ + void updateJobPhaseNode(AutoexecJobVo jobVo, List resourceVoList, String userName, Long protocolId); + } diff --git a/src/main/java/neatlogic/module/autoexec/service/AutoexecJobServiceImpl.java b/src/main/java/neatlogic/module/autoexec/service/AutoexecJobServiceImpl.java index 05bc9765..e157aa91 100644 --- a/src/main/java/neatlogic/module/autoexec/service/AutoexecJobServiceImpl.java +++ b/src/main/java/neatlogic/module/autoexec/service/AutoexecJobServiceImpl.java @@ -31,24 +31,20 @@ import neatlogic.framework.autoexec.dto.AutoexecParamVo; import neatlogic.framework.autoexec.dto.AutoexecToolVo; import neatlogic.framework.autoexec.dto.combop.*; import neatlogic.framework.autoexec.dto.job.*; -import neatlogic.framework.autoexec.dto.node.AutoexecNodeVo; import neatlogic.framework.autoexec.dto.script.AutoexecScriptVersionVo; import neatlogic.framework.autoexec.dto.script.AutoexecScriptVo; import neatlogic.framework.autoexec.exception.*; import neatlogic.framework.autoexec.job.action.core.AutoexecJobActionHandlerFactory; import neatlogic.framework.autoexec.job.action.core.IAutoexecJobActionHandler; +import neatlogic.framework.autoexec.job.node.UpdateNodesFactory; import neatlogic.framework.autoexec.job.source.type.AutoexecJobSourceTypeHandlerFactory; import neatlogic.framework.autoexec.job.source.type.IAutoexecJobSourceTypeHandler; import neatlogic.framework.autoexec.source.AutoexecJobSourceFactory; import neatlogic.framework.autoexec.source.IAutoexecJobSource; import neatlogic.framework.autoexec.util.AutoexecUtil; -import neatlogic.framework.cmdb.crossover.ICiCrossoverMapper; import neatlogic.framework.cmdb.crossover.IResourceCenterResourceCrossoverService; -import neatlogic.framework.cmdb.crossover.IResourceCrossoverMapper; -import neatlogic.framework.cmdb.dto.ci.CiVo; import neatlogic.framework.cmdb.dto.resourcecenter.ResourceSearchVo; import neatlogic.framework.cmdb.dto.resourcecenter.ResourceVo; -import neatlogic.framework.common.util.PageUtil; import neatlogic.framework.config.ConfigManager; import neatlogic.framework.crossover.CrossoverServiceFactory; import neatlogic.framework.dao.mapper.UserMapper; @@ -63,21 +59,17 @@ import neatlogic.framework.util.HttpRequestUtil; import neatlogic.framework.util.RestUtil; import neatlogic.framework.util.SnowflakeUtil; import neatlogic.module.autoexec.dao.mapper.AutoexecCombopVersionMapper; -import neatlogic.module.autoexec.dao.mapper.AutoexecResourceMapper; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; -import org.bson.Document; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; -import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import static java.util.stream.Collectors.*; @@ -88,7 +80,7 @@ import static neatlogic.framework.common.util.CommonUtil.distinctByKey; **/ @Service public class AutoexecJobServiceImpl implements AutoexecJobService, IAutoexecJobCrossoverService { - private final static Logger logger = LoggerFactory.getLogger(AutoexecJobServiceImpl.class); + private final Logger logger = LoggerFactory.getLogger(AutoexecJobServiceImpl.class); @Resource AutoexecJobMapper autoexecJobMapper; @Resource @@ -106,15 +98,9 @@ public class AutoexecJobServiceImpl implements AutoexecJobService, IAutoexecJobC @Resource RunnerMapper runnerMapper; - @Resource - private MongoTemplate mongoTemplate; - @Resource private UserMapper userMapper; - @Resource - private AutoexecResourceMapper autoexecResourceMapper; - /** * 根据作业参数获取最终参数值 * @@ -869,38 +855,11 @@ public class AutoexecJobServiceImpl implements AutoexecJobService, IAutoexecJobC if (combopExecuteConfigVo == null) { return false; } - boolean isHasNode = false; Date nowTime = new Date(System.currentTimeMillis()); jobVo.getCurrentPhase().setLcd(nowTime); AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo = combopExecuteConfigVo.getExecuteNodeConfig(); - if (executeNodeConfigVo == null) { - return false; - } - if (MapUtils.isNotEmpty(executeNodeConfigVo.getFilter())) { - logger.debug("##updateNodeResourceByFilter:-------------------------------------------------------------------------------start"); - //long updateNodeResourceByFilter = System.currentTimeMillis(); - isHasNode = updateNodeResourceByFilter(executeNodeConfigVo, jobVo, userName, protocolId); - //System.out.println((System.currentTimeMillis() - updateNodeResourceByFilter) + " ##updateNodeResourceByFilter:-------------------------------------------------------------------------------"); - logger.debug("##updateNodeResourceByFilter:-------------------------------------------------------------------------------end"); - - } - - if (CollectionUtils.isNotEmpty(executeNodeConfigVo.getInputNodeList())) { - isHasNode = updateNodeResourceByInput(executeNodeConfigVo, jobVo, userName, protocolId); - } - - if (CollectionUtils.isNotEmpty(executeNodeConfigVo.getSelectNodeList())) { - isHasNode = updateNodeResourceBySelect(executeNodeConfigVo, jobVo, userName, protocolId); - } - - if (CollectionUtils.isNotEmpty(executeNodeConfigVo.getParamList())) { - isHasNode = updateNodeResourceByParam(jobVo, executeNodeConfigVo, userName, protocolId); - } - - if (CollectionUtils.isNotEmpty(executeNodeConfigVo.getPreOutputList())) { - isHasNode = updateNodeResourceByPrePhaseOutput(jobVo, executeNodeConfigVo, userName, protocolId); - } + boolean isHasNode = UpdateNodesFactory.updateNodes(executeNodeConfigVo, jobVo, userName, protocolId); logger.debug("##AfterUpdateNodes:-------------------------------------------------------------------------------start"); //long ccc = System.currentTimeMillis(); AutoexecJobPhaseVo jobPhaseVo = jobVo.getCurrentPhase(); @@ -976,267 +935,13 @@ public class AutoexecJobServiceImpl implements AutoexecJobService, IAutoexecJobC } } - /** - * param - * 根据运行参数中定义的节点参数 更新作业节点 - * - * @param executeNodeConfigVo 执行节点配置 - * @param jobVo 作业 - * @param userName 执行用户 - * @param protocolId 协议id - */ - private boolean updateNodeResourceByParam(AutoexecJobVo jobVo, AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, String userName, Long protocolId) { - List paramList = executeNodeConfigVo.getParamList(); - if (CollectionUtils.isNotEmpty(paramList)) { - List runTimeParamList = jobVo.getRunTimeParamList(); - Set resourceIdSet = new HashSet<>(); - List resourceSearchList = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(runTimeParamList)) { - List paramObjList = runTimeParamList.stream().filter(p -> paramList.contains(p.getKey())).collect(Collectors.toList()); - paramObjList.forEach(p -> { - if (p.getValue() instanceof JSONArray) { - JSONArray valueArray = (JSONArray) p.getValue(); - for (int i = 0; i < valueArray.size(); i++) { - JSONObject valueObj = valueArray.getJSONObject(i); - Long id = valueObj.getLong("id"); - if (id != null) { - resourceIdSet.add(id); - } else { - String ip = valueObj.getString("ip"); - if (StringUtils.isNotBlank(ip)) { - Integer port = valueObj.getInteger("port"); - String name = valueObj.getString("name"); - ResourceSearchVo resourceSearchVo = new ResourceSearchVo(); - resourceSearchVo.setIp(ip); - if (port != null) { - resourceSearchVo.setPort(port.toString()); - } - resourceSearchVo.setName(name); - resourceSearchList.add(resourceSearchVo); - } - } - } - } - }); - IResourceCrossoverMapper resourceCrossoverMapper = CrossoverServiceFactory.getApi(IResourceCrossoverMapper.class); - if (CollectionUtils.isNotEmpty(resourceSearchList)) { - for (ResourceSearchVo resourceSearchVo : resourceSearchList) { - Long id = resourceCrossoverMapper.getResourceIdByIpAndPortAndName(resourceSearchVo); - if (id != null) { - resourceIdSet.add(id); - } - } - } - if (CollectionUtils.isNotEmpty(resourceIdSet)) { - List resourceVoList = resourceCrossoverMapper.getResourceByIdList(new ArrayList<>(resourceIdSet)); - if (CollectionUtils.isNotEmpty(resourceVoList)) { - updateJobPhaseNode(jobVo, resourceVoList, userName, protocolId); - return true; - } - } - } - } - return false; - } - - /** - * param - * 根据上游阶段出参 更新作业节点 - * - * @param executeNodeConfigVo 执行节点配置 - * @param jobVo 作业 - * @param userName 执行用户 - * @param protocolId 协议id - */ - private boolean updateNodeResourceByPrePhaseOutput(AutoexecJobVo jobVo, AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, String userName, Long protocolId) { - List preOutputList = executeNodeConfigVo.getPreOutputList(); - if (CollectionUtils.isEmpty(preOutputList) && preOutputList.size() != 3) { - throw new AutoexecJobUpdateNodeByPreOutPutListException(jobVo); - } - String phaseUuid = preOutputList.get(0); - String operationUuid = preOutputList.get(1); - String paramKey = preOutputList.get(2); - AutoexecJobPhaseOperationVo operationVo = autoexecJobMapper.getJobPhaseOperationByJobIdAndPhaseUuidAndUuid(jobVo.getId(), phaseUuid, operationUuid); - if (operationVo == null) { - throw new AutoexecJobPhaseOperationNotFoundException(operationUuid); - } - - //从mongodb获取output 对应应用的param 值 作为执行节点 - AtomicReference nodeArrayAtomic = new AtomicReference<>(); - Document doc = new Document(); - Document fieldDocument = new Document(); - if (Arrays.asList(ExecMode.TARGET.getValue(), ExecMode.RUNNER_TARGET.getValue()).contains(jobVo.getPreOutputPhase().getExecMode())) { - List nodeList = autoexecJobMapper.getJobPhaseNodeListByJobIdAndPhaseId(jobVo.getId(), jobVo.getPreOutputPhase().getId()); - doc.put("resourceId", nodeList.get(0).getResourceId()); - } else { - doc.put("resourceId", 0L); - } - doc.put("jobId", jobVo.getId().toString()); - fieldDocument.put("data", true); - mongoTemplate.getDb().getCollection("_node_output").find(doc).projection(fieldDocument).forEach(o -> { - JSONObject operation = JSONObject.parseObject(o.toJson()); - if (operation.containsKey("data")) { - JSONObject dataJson = operation.getJSONObject("data"); - JSONObject outputJson = dataJson.getJSONObject(operationVo.getName() + "_" + operationVo.getId()); - if (MapUtils.isNotEmpty(outputJson)) { - Object nodes = outputJson.get(paramKey); - if (nodes != null) { - if (nodes instanceof JSONArray) { - nodeArrayAtomic.set((JSONArray) nodes); - } else if (nodes instanceof String) { - try { - nodeArrayAtomic.set(JSONArray.parseArray(nodes.toString())); - } catch (Exception ex) { - throw new AutoexecJobNodePreParamValueNotInvalidException(jobVo.getId(), jobVo.getCurrentPhase().getName()); - } - } else { - throw new AutoexecJobNodePreParamValueNotInvalidException(jobVo.getId(), jobVo.getCurrentPhase().getName()); - } - } - } - } - }); - JSONArray nodeArray = nodeArrayAtomic.get(); - if (CollectionUtils.isEmpty(nodeArray)) { - throw new AutoexecJobNodePreParamValueNotInvalidException(jobVo.getId(), jobVo.getCurrentPhase().getName()); - } - - //更新执行节点 - List nodeVoList = nodeArray.toJavaList(AutoexecNodeVo.class); - List ipPortNameList = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(nodeVoList)) { - nodeVoList.forEach(o -> { - ipPortNameList.add(new ResourceVo(o.getIp(), o.getPort(), o.getName())); - }); - IResourceCrossoverMapper resourceCrossoverMapper = CrossoverServiceFactory.getApi(IResourceCrossoverMapper.class); - ResourceSearchVo searchVo = getResourceSearchVoWithCmdbGroupType(jobVo); - List resourceVoList = resourceCrossoverMapper.getResourceListByResourceVoList(ipPortNameList, searchVo); - if (CollectionUtils.isNotEmpty(resourceVoList)) { - updateJobPhaseNode(jobVo, resourceVoList, userName, protocolId); - //重置节点状态 - //List jobNodeVoList = autoexecJobMapper.getJobPhaseNodeListWithRunnerByJobPhaseIdAndExceptStatusList(jobVo.getCurrentPhase().getId(), Collections.singletonList(JobNodeStatus.IGNORED.getValue())); - //resetJobNodeStatus(jobVo, jobNodeVoList); - return true; - } - } - return false; - } - - /** - * inputNodeList、selectNodeList - * 根据输入和选择节点 更新作业节点 - * - * @param executeNodeConfigVo 执行节点配置 - * @param jobVo 作业 - * @param userName 执行用户 - * @param protocolId 协议id - */ - private boolean updateNodeResourceByInput(AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, AutoexecJobVo jobVo, String userName, Long protocolId) { - List nodeVoList = executeNodeConfigVo.getInputNodeList(); - boolean isHasNode = false; - List ipPortNameList = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(nodeVoList)) { - nodeVoList.forEach(o -> { - ipPortNameList.add(new ResourceVo(o.getIp(), o.getPort(), o.getName())); - }); - JSONObject preFilter = null; - if (Objects.equals(jobVo.getNodeFrom(), AutoexecJobPhaseNodeFrom.JOB.getValue())) { - //如果作业层面的节点则补充前置filter - AutoexecCombopConfigVo config = jobVo.getConfig(); - if (config != null && config.getExecuteConfig() != null && config.getExecuteConfig().getCombopNodeConfig() != null && MapUtils.isNotEmpty(config.getExecuteConfig().getCombopNodeConfig().getFilter())) { - if (Objects.equals(config.getExecuteConfig().getWhenToSpecify(), CombopNodeSpecify.RUNTIME.getValue())) { - preFilter = config.getExecuteConfig().getCombopNodeConfig().getFilter(); - } - } - } - ResourceSearchVo searchVo = getResourceSearchVoWithCmdbGroupType(jobVo, preFilter); - IResourceCrossoverMapper resourceCrossoverMapper = CrossoverServiceFactory.getApi(IResourceCrossoverMapper.class); - List resourceSearchList = new ArrayList<>(); - Set resourceIdSet = new HashSet<>(); - ipPortNameList.forEach(o -> { - resourceSearchList.add(new ResourceSearchVo(o)); - }); - if (CollectionUtils.isNotEmpty(resourceSearchList)) { - for (ResourceSearchVo resourceSearchVo : resourceSearchList) { - Long id = resourceCrossoverMapper.getResourceIdByIpAndPortAndName(resourceSearchVo); - if (id != null) { - resourceIdSet.add(id); - } - } - } - if (CollectionUtils.isNotEmpty(resourceIdSet)) { - searchVo.setIdList(new ArrayList<>(resourceIdSet)); - int count = resourceCrossoverMapper.getResourceCount(searchVo); - if (count > 0) { - int pageCount = PageUtil.getPageCount(count, searchVo.getPageSize()); - for (int i = 1; i <= pageCount; i++) { - searchVo.setCurrentPage(i); - List idList = resourceCrossoverMapper.getResourceIdList(searchVo); - if (CollectionUtils.isNotEmpty(idList)) { - List resourceList = resourceCrossoverMapper.getResourceListByIdList(idList); - if (CollectionUtils.isNotEmpty(resourceList)) { - updateJobPhaseNode(jobVo, resourceList, userName, protocolId); - isHasNode = true; - } - } - } - } - } - } - return isHasNode; - } - - /** - * selectNodeList - * 根据输入和选择节点 更新作业节点 - * - * @param executeNodeConfigVo 执行节点配置 - * @param jobVo 作业 - * @param userName 执行用户 - * @param protocolId 协议id - */ - private boolean updateNodeResourceBySelect(AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, AutoexecJobVo jobVo, String userName, Long protocolId) { - List nodeVoList = executeNodeConfigVo.getSelectNodeList(); - boolean isHasNode = false; - if (CollectionUtils.isNotEmpty(nodeVoList)) { - IResourceCrossoverMapper resourceCrossoverMapper = CrossoverServiceFactory.getApi(IResourceCrossoverMapper.class); - JSONObject preFilter = null; - if (Objects.equals(jobVo.getNodeFrom(), AutoexecJobPhaseNodeFrom.JOB.getValue())) { - //如果作业层面的节点则补充前置filter - AutoexecCombopConfigVo config = jobVo.getConfig(); - if (config != null && config.getExecuteConfig() != null && config.getExecuteConfig().getCombopNodeConfig() != null && MapUtils.isNotEmpty(config.getExecuteConfig().getCombopNodeConfig().getFilter())) { - if (Objects.equals(config.getExecuteConfig().getWhenToSpecify(), CombopNodeSpecify.RUNTIME.getValue())) { - preFilter = config.getExecuteConfig().getCombopNodeConfig().getFilter(); - } - } - } - ResourceSearchVo searchVo = getResourceSearchVoWithCmdbGroupType(jobVo, preFilter); - searchVo.setIdList(nodeVoList.stream().map(AutoexecNodeVo::getId).collect(toList())); - int count = resourceCrossoverMapper.getResourceCount(searchVo); - if (count > 0) { - int pageCount = PageUtil.getPageCount(count, searchVo.getPageSize()); - for (int i = 1; i <= pageCount; i++) { - searchVo.setCurrentPage(i); - List idList = resourceCrossoverMapper.getResourceIdList(searchVo); - if (CollectionUtils.isNotEmpty(idList)) { - List resourceList = resourceCrossoverMapper.getResourceListByIdList(idList); - if (CollectionUtils.isNotEmpty(resourceList)) { - updateJobPhaseNode(jobVo, resourceList, userName, protocolId); - isHasNode = true; - } - } - } - } - } - return isHasNode; - } - /** * 获取resourceSearch,补充opType操作类型 * * @param jobVo 作业 */ - private ResourceSearchVo getResourceSearchVoWithCmdbGroupType(AutoexecJobVo jobVo) { + @Override + public ResourceSearchVo getResourceSearchVoWithCmdbGroupType(AutoexecJobVo jobVo) { return getResourceSearchVoWithCmdbGroupType(jobVo, null); } @@ -1245,7 +950,9 @@ public class AutoexecJobServiceImpl implements AutoexecJobService, IAutoexecJobC * * @param jobVo 作业 */ - private ResourceSearchVo getResourceSearchVoWithCmdbGroupType(AutoexecJobVo jobVo, JSONObject filterJson) { + + @Override + public ResourceSearchVo getResourceSearchVoWithCmdbGroupType(AutoexecJobVo jobVo, JSONObject filterJson) { if (MapUtils.isEmpty(filterJson)) { filterJson = new JSONObject(); } @@ -1262,127 +969,7 @@ public class AutoexecJobServiceImpl implements AutoexecJobService, IAutoexecJobC return searchVo; } - /** - * filter - * 根据过滤器 更新节点 - * - * @param executeNodeConfigVo 执行节点配置 - * @param jobVo 作业 - * @param userName 执行用户 - * @param protocolId 协议id - */ - private boolean updateNodeResourceByFilter(AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, AutoexecJobVo jobVo, String userName, Long protocolId) { - JSONObject filterJson = executeNodeConfigVo.getFilter(); - boolean isHasNode = false; - if (MapUtils.isNotEmpty(filterJson)) { - //如果作业层面的节点则补充前置filter - if (Objects.equals(jobVo.getNodeFrom(), AutoexecJobPhaseNodeFrom.JOB.getValue())) { - AutoexecCombopConfigVo config = jobVo.getConfig(); - JSONObject preFilter = null; - if (config != null && config.getExecuteConfig() != null && config.getExecuteConfig().getCombopNodeConfig() != null && MapUtils.isNotEmpty(config.getExecuteConfig().getCombopNodeConfig().getFilter())) { - if (Objects.equals(config.getExecuteConfig().getWhenToSpecify(), CombopNodeSpecify.RUNTIME.getValue())) { - preFilter = config.getExecuteConfig().getCombopNodeConfig().getFilter(); - //以preFilter为主 - for (Map.Entry entry : preFilter.entrySet()) { - String key = entry.getKey(); - Object value = entry.getValue(); - if (value == null || (value instanceof JSONArray && CollectionUtils.isEmpty((JSONArray) value))) { - continue; - } - if (filterJson.containsKey(key)) { - filterJson.put(key, value); - } - } - } - } - } - ResourceSearchVo searchVo = getResourceSearchVoWithCmdbGroupType(jobVo, filterJson); - searchVo.setMaxPageSize(50000); - searchVo.setPageSize(50000); - IResourceCrossoverMapper resourceCrossoverMapper = CrossoverServiceFactory.getApi(IResourceCrossoverMapper.class); - List idList; - StringBuilder sqlSb = new StringBuilder(); - if (searchVo.isCustomCondition()) { - searchVo.buildConditionWhereSql(sqlSb, searchVo); - idList = resourceCrossoverMapper.getResourceIdListByDynamicCondition(searchVo, sqlSb.toString()); - } else { - idList = resourceCrossoverMapper.getResourceIdList(searchVo); - } - int count = idList.size(); - if (count > 0) { - int index = 0; - List idPageList = new ArrayList<>(); - for (int i = 0; i < count; i++) { - if (index < 1000) { - idPageList.add(idList.get(i)); - index++; - continue; - } - i--; - logger.debug("##getResourceListByIdList:-------------------------------------------------------------------------------start"); - //long bbb = System.currentTimeMillis(); - List resourceList = resourceCrossoverMapper.getResourceListByIdList(idPageList); - //System.out.println((System.currentTimeMillis() - bbb) + " ##bbb:-------------------------------------------------------------------------------"); - logger.debug("##getResourceListByIdList:-------------------------------------------------------------------------------end"); - if (CollectionUtils.isNotEmpty(resourceList)) { - logger.debug("##updateJobPhaseNode:-------------------------------------------------------------------------------start"); - //long updateJobPhaseNode = System.currentTimeMillis(); - updateJobPhaseNode(jobVo, resourceList, userName, protocolId); - // System.out.println((System.currentTimeMillis() - updateJobPhaseNode) + " ##updateJobPhaseNode:-------------------------------------------------------------------------------"); - logger.debug("##updateJobPhaseNode:-------------------------------------------------------------------------------end"); - } - index = 0; - idPageList.clear(); - } - //补充最后一次循环数据 - if (CollectionUtils.isNotEmpty(idPageList)) { - logger.debug("##getResourceListByIdList last:-------------------------------------------------------------------------------start"); - //long bbb = System.currentTimeMillis(); - List resourceList = resourceCrossoverMapper.getResourceListByIdList(idPageList); - //System.out.println((System.currentTimeMillis() - bbb) + " ##bbb:-------------------------------------------------------------------------------"); - logger.debug("##getResourceListByIdList last:-------------------------------------------------------------------------------end"); - if (CollectionUtils.isNotEmpty(resourceList)) { - logger.debug("##updateJobPhaseNode last:-------------------------------------------------------------------------------start"); - //long updateJobPhaseNode = System.currentTimeMillis(); - updateJobPhaseNode(jobVo, resourceList, userName, protocolId); - //System.out.println((System.currentTimeMillis() - updateJobPhaseNode) + " ##updateJobPhaseNode:-------------------------------------------------------------------------------"); - logger.debug("##updateJobPhaseNode last:-------------------------------------------------------------------------------end"); - } - idPageList.clear(); - } - isHasNode = true; - } - //针对巡检补充os 资产 - if (Objects.equals(jobVo.getSource(), neatlogic.framework.inspect.constvalue.JobSource.INSPECT_APP.getValue())) { - ICiCrossoverMapper ciCrossoverMapper = CrossoverServiceFactory.getApi(ICiCrossoverMapper.class); - CiVo civo = ciCrossoverMapper.getCiById(jobVo.getInvokeId()); - if (civo.getParentCiName() != null && civo.getParentCiName().toUpperCase(Locale.ROOT).contains("OS")) { - //从scence_os_softwareservice_env_appmodule_appsystem 获取os - searchVo.setTypeId(jobVo.getInvokeId()); - searchVo.setAppSystemId(searchVo.getAppSystemIdList().get(0)); - if(CollectionUtils.isNotEmpty(searchVo.getEnvIdList())) { - searchVo.setEnvId(searchVo.getEnvIdList().get(0)); - } - int rowNum = autoexecResourceMapper.getOsResourceCountByAppSystemIdAndAppModuleIdListAndEnvIdAndTypeId(searchVo); - if (rowNum > 0) { - searchVo.setRowNum(rowNum); - for (int currentPage = 1; currentPage <= searchVo.getPageCount(); currentPage++) { - searchVo.setCurrentPage(currentPage); - List idOsList = autoexecResourceMapper.getOsResourceIdListByAppSystemIdAndAppModuleIdAndEnvIdAndTypeId(searchVo); - if (CollectionUtils.isNotEmpty(idOsList)) { - List resourceList = resourceCrossoverMapper.getResourceByIdList(idOsList); - if (CollectionUtils.isNotEmpty(resourceList)) { - updateJobPhaseNode(jobVo, resourceList, userName, protocolId); - isHasNode = true; - } - } - } - } - } - } - } - return isHasNode; - } + /** * 跟新作业阶段阶段 @@ -1392,7 +979,8 @@ public class AutoexecJobServiceImpl implements AutoexecJobService, IAutoexecJobC * @param userName 账号 * @param protocolId 协议id */ - private void updateJobPhaseNode(AutoexecJobVo jobVo, List resourceVoList, String userName, Long protocolId) { + @Override + public void updateJobPhaseNode(AutoexecJobVo jobVo, List resourceVoList, String userName, Long protocolId) { AutoexecJobPhaseVo jobPhaseVo = jobVo.getCurrentPhase(); List nodeList = new ArrayList<>(); //List nodeRunnerList = new ArrayList<>(); -- Gitee From e623f4a43a577c9af09962e97578ef528cae84ef Mon Sep 17 00:00:00 2001 From: lvzk <897706680@qq.com> Date: Mon, 7 Apr 2025 14:17:08 +0800 Subject: [PATCH 2/4] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E6=B8=85=E5=8D=95=E5=8F=91=E5=99=A8=E5=BA=94=E7=94=A8=E5=B7=A1?= =?UTF-8?q?=E6=A3=80=E4=BD=9C=E4=B8=9A=EF=BC=8C=E8=87=AA=E5=8A=A8=E5=8C=96?= =?UTF-8?q?=E9=9C=80=E9=80=82=E9=85=8D=E5=8A=A8=E6=80=81=E8=A7=86=E5=9B=BE?= =?UTF-8?q?=20#[1394049406173184]=E5=BA=94=E7=94=A8=E6=B8=85=E5=8D=95?= =?UTF-8?q?=E5=8F=91=E5=99=A8=E5=BA=94=E7=94=A8=E5=B7=A1=E6=A3=80=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=EF=BC=8C=E8=87=AA=E5=8A=A8=E5=8C=96=E9=9C=80=E9=80=82?= =?UTF-8?q?=E9=85=8D=E5=8A=A8=E6=80=81=E8=A7=86=E5=9B=BE=20http://192.168.?= =?UTF-8?q?0.96:8090/demo/rdm.html#/story-detail/939050947543040/939050947?= =?UTF-8?q?543042/1394049406173184?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../job/node/UpdateNodesByFilterHandler.java | 35 +++---------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByFilterHandler.java b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByFilterHandler.java index d8c9f547..f6633094 100644 --- a/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByFilterHandler.java +++ b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByFilterHandler.java @@ -25,9 +25,7 @@ import neatlogic.framework.autoexec.dto.combop.AutoexecCombopConfigVo; import neatlogic.framework.autoexec.dto.combop.AutoexecCombopExecuteNodeConfigVo; import neatlogic.framework.autoexec.dto.job.AutoexecJobVo; import neatlogic.framework.autoexec.job.node.IUpdateNodes; -import neatlogic.framework.cmdb.crossover.ICiCrossoverMapper; import neatlogic.framework.cmdb.crossover.IResourceCrossoverMapper; -import neatlogic.framework.cmdb.dto.ci.CiVo; import neatlogic.framework.cmdb.dto.resourcecenter.ResourceSearchVo; import neatlogic.framework.cmdb.dto.resourcecenter.ResourceVo; import neatlogic.framework.crossover.CrossoverServiceFactory; @@ -40,7 +38,10 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; @Service public class UpdateNodesByFilterHandler implements IUpdateNodes { @@ -156,34 +157,6 @@ public class UpdateNodesByFilterHandler implements IUpdateNodes { } isHasNode = true; } - //针对巡检补充os 资产 - if (Objects.equals(jobVo.getSource(), neatlogic.framework.inspect.constvalue.JobSource.INSPECT_APP.getValue())) { - ICiCrossoverMapper ciCrossoverMapper = CrossoverServiceFactory.getApi(ICiCrossoverMapper.class); - CiVo civo = ciCrossoverMapper.getCiById(jobVo.getInvokeId()); - if (civo.getParentCiName() != null && civo.getParentCiName().toUpperCase(Locale.ROOT).contains("OS")) { - //从scence_os_softwareservice_env_appmodule_appsystem 获取os - searchVo.setTypeId(jobVo.getInvokeId()); - searchVo.setAppSystemId(searchVo.getAppSystemIdList().get(0)); - if (CollectionUtils.isNotEmpty(searchVo.getEnvIdList())) { - searchVo.setEnvId(searchVo.getEnvIdList().get(0)); - } - int rowNum = autoexecResourceMapper.getOsResourceCountByAppSystemIdAndAppModuleIdListAndEnvIdAndTypeId(searchVo); - if (rowNum > 0) { - searchVo.setRowNum(rowNum); - for (int currentPage = 1; currentPage <= searchVo.getPageCount(); currentPage++) { - searchVo.setCurrentPage(currentPage); - List idOsList = autoexecResourceMapper.getOsResourceIdListByAppSystemIdAndAppModuleIdAndEnvIdAndTypeId(searchVo); - if (CollectionUtils.isNotEmpty(idOsList)) { - List resourceList = resourceCrossoverMapper.getResourceByIdList(idOsList); - if (CollectionUtils.isNotEmpty(resourceList)) { - autoexecJobService.updateJobPhaseNode(jobVo, resourceList, userName, protocolId); - isHasNode = true; - } - } - } - } - } - } } return isHasNode; } -- Gitee From 58c7335fb00a02e27a4f4d1e966c205179194911 Mon Sep 17 00:00:00 2001 From: "1437892690@qq.com" <1437892690@qq.com> Date: Mon, 7 Apr 2025 19:02:46 +0800 Subject: [PATCH 3/4] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E6=B8=85=E5=8D=95=E5=8F=91=E5=99=A8=E5=BA=94=E7=94=A8=E5=B7=A1?= =?UTF-8?q?=E6=A3=80=E4=BD=9C=E4=B8=9A=EF=BC=8C=E8=87=AA=E5=8A=A8=E5=8C=96?= =?UTF-8?q?=E9=9C=80=E9=80=82=E9=85=8D=E5=8A=A8=E6=80=81=E8=A7=86=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1394049406173184]应用清单发器应用巡检作业,自动化需适配动态视图 http://192.168.0.96:8090/demo/rdm.html#/story-detail/939050947543040/939050947543042/1394049406173184 --- .../UpdateNodesByInspectFilterHandler.java | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByInspectFilterHandler.java diff --git a/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByInspectFilterHandler.java b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByInspectFilterHandler.java new file mode 100644 index 00000000..ebc3d8c2 --- /dev/null +++ b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByInspectFilterHandler.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package neatlogic.module.autoexec.job.node; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.autoexec.dto.combop.AutoexecCombopExecuteNodeConfigVo; +import neatlogic.framework.autoexec.dto.job.AutoexecJobVo; +import neatlogic.framework.autoexec.job.node.IUpdateNodes; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceSearchVo; +import neatlogic.framework.cmdb.dto.resourcecenter.ResourceVo; +import neatlogic.framework.cmdb.dto.resourcecenter.config.ResourceEntityVo; +import neatlogic.framework.cmdb.resourcecenter.datasource.core.IResourceCenterDataSource; +import neatlogic.framework.cmdb.resourcecenter.datasource.core.ResourceCenterDataSourceFactory; +import neatlogic.module.autoexec.service.AutoexecJobService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +@Component +public class UpdateNodesByInspectFilterHandler implements IUpdateNodes { + + @Resource + AutoexecJobService autoexecJobService; + + @Override + public boolean update(AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, AutoexecJobVo jobVo, String userName, Long protocolId) { + boolean isHasNode = false; + if (executeNodeConfigVo == null) { + return false; + } + JSONObject inspectFilter = executeNodeConfigVo.getInspectFilter(); + if (MapUtils.isNotEmpty(inspectFilter)) { + Long appSystemId = inspectFilter.getLong("appSystemId"); + Long appModuleId = inspectFilter.getLong("appModuleId"); + Long envId = inspectFilter.getLong("envId"); + Long typeId = inspectFilter.getLong("typeId"); + JSONArray inspectStatusList = inspectFilter.getJSONArray("inspectStatusList"); + ResourceSearchVo searchVo = new ResourceSearchVo(); + searchVo.setAppSystemId(appSystemId); + searchVo.setAppModuleId(appModuleId); + searchVo.setEnvId(envId); + searchVo.setTypeId(typeId); + searchVo.setInspectStatusList(inspectStatusList.toJavaList(String.class)); + IResourceCenterDataSource resourceCenterDataSource = ResourceCenterDataSourceFactory.getResourceCenterDataSource(); + List appViewList = resourceCenterDataSource.getAppViewList(); + if (CollectionUtils.isNotEmpty(appViewList)) { + for (ResourceEntityVo resourceEntityVo : appViewList) { + searchVo.setViewName(resourceEntityVo.getName()); + searchVo.setCurrentPage(1); + searchVo.setPageSize(100); + List resourceList = resourceCenterDataSource.getAppResourceList(searchVo, true); + if (CollectionUtils.isNotEmpty(resourceList)) { + autoexecJobService.updateJobPhaseNode(jobVo, resourceList, userName, protocolId); + isHasNode = true; + for (int currentPage = 2; currentPage <= searchVo.getPageCount(); currentPage++) { + searchVo.setCurrentPage(currentPage); + resourceList = resourceCenterDataSource.getAppResourceList(searchVo, true); + if (CollectionUtils.isNotEmpty(resourceList)) { + autoexecJobService.updateJobPhaseNode(jobVo, resourceList, userName, protocolId); + } + } + } + } + } + } + return isHasNode; + } + +} -- Gitee From d9edb85300e3612ff1132e446f83d9260cec0a5f Mon Sep 17 00:00:00 2001 From: "1437892690@qq.com" <1437892690@qq.com> Date: Mon, 7 Apr 2025 23:35:14 +0800 Subject: [PATCH 4/4] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E6=B8=85=E5=8D=95=E5=8F=91=E5=99=A8=E5=BA=94=E7=94=A8=E5=B7=A1?= =?UTF-8?q?=E6=A3=80=E4=BD=9C=E4=B8=9A=EF=BC=8C=E8=87=AA=E5=8A=A8=E5=8C=96?= =?UTF-8?q?=E9=9C=80=E9=80=82=E9=85=8D=E5=8A=A8=E6=80=81=E8=A7=86=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1394049406173184]应用清单发器应用巡检作业,自动化需适配动态视图 http://192.168.0.96:8090/demo/rdm.html#/story-detail/939050947543040/939050947543042/1394049406173184 --- .../UpdateNodesByInspectFilterHandler.java | 88 ------------------- 1 file changed, 88 deletions(-) delete mode 100644 src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByInspectFilterHandler.java diff --git a/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByInspectFilterHandler.java b/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByInspectFilterHandler.java deleted file mode 100644 index ebc3d8c2..00000000 --- a/src/main/java/neatlogic/module/autoexec/job/node/UpdateNodesByInspectFilterHandler.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package neatlogic.module.autoexec.job.node; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import neatlogic.framework.autoexec.dto.combop.AutoexecCombopExecuteNodeConfigVo; -import neatlogic.framework.autoexec.dto.job.AutoexecJobVo; -import neatlogic.framework.autoexec.job.node.IUpdateNodes; -import neatlogic.framework.cmdb.dto.resourcecenter.ResourceSearchVo; -import neatlogic.framework.cmdb.dto.resourcecenter.ResourceVo; -import neatlogic.framework.cmdb.dto.resourcecenter.config.ResourceEntityVo; -import neatlogic.framework.cmdb.resourcecenter.datasource.core.IResourceCenterDataSource; -import neatlogic.framework.cmdb.resourcecenter.datasource.core.ResourceCenterDataSourceFactory; -import neatlogic.module.autoexec.service.AutoexecJobService; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.MapUtils; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class UpdateNodesByInspectFilterHandler implements IUpdateNodes { - - @Resource - AutoexecJobService autoexecJobService; - - @Override - public boolean update(AutoexecCombopExecuteNodeConfigVo executeNodeConfigVo, AutoexecJobVo jobVo, String userName, Long protocolId) { - boolean isHasNode = false; - if (executeNodeConfigVo == null) { - return false; - } - JSONObject inspectFilter = executeNodeConfigVo.getInspectFilter(); - if (MapUtils.isNotEmpty(inspectFilter)) { - Long appSystemId = inspectFilter.getLong("appSystemId"); - Long appModuleId = inspectFilter.getLong("appModuleId"); - Long envId = inspectFilter.getLong("envId"); - Long typeId = inspectFilter.getLong("typeId"); - JSONArray inspectStatusList = inspectFilter.getJSONArray("inspectStatusList"); - ResourceSearchVo searchVo = new ResourceSearchVo(); - searchVo.setAppSystemId(appSystemId); - searchVo.setAppModuleId(appModuleId); - searchVo.setEnvId(envId); - searchVo.setTypeId(typeId); - searchVo.setInspectStatusList(inspectStatusList.toJavaList(String.class)); - IResourceCenterDataSource resourceCenterDataSource = ResourceCenterDataSourceFactory.getResourceCenterDataSource(); - List appViewList = resourceCenterDataSource.getAppViewList(); - if (CollectionUtils.isNotEmpty(appViewList)) { - for (ResourceEntityVo resourceEntityVo : appViewList) { - searchVo.setViewName(resourceEntityVo.getName()); - searchVo.setCurrentPage(1); - searchVo.setPageSize(100); - List resourceList = resourceCenterDataSource.getAppResourceList(searchVo, true); - if (CollectionUtils.isNotEmpty(resourceList)) { - autoexecJobService.updateJobPhaseNode(jobVo, resourceList, userName, protocolId); - isHasNode = true; - for (int currentPage = 2; currentPage <= searchVo.getPageCount(); currentPage++) { - searchVo.setCurrentPage(currentPage); - resourceList = resourceCenterDataSource.getAppResourceList(searchVo, true); - if (CollectionUtils.isNotEmpty(resourceList)) { - autoexecJobService.updateJobPhaseNode(jobVo, resourceList, userName, protocolId); - } - } - } - } - } - } - return isHasNode; - } - -} -- Gitee