diff --git a/api-test/backend/src/main/java/io/metersphere/listener/ApiAppStartListener.java b/api-test/backend/src/main/java/io/metersphere/listener/ApiAppStartListener.java index 2d9123a011..7a1c1874d2 100644 --- a/api-test/backend/src/main/java/io/metersphere/listener/ApiAppStartListener.java +++ b/api-test/backend/src/main/java/io/metersphere/listener/ApiAppStartListener.java @@ -3,15 +3,13 @@ package io.metersphere.listener; import com.mchange.lang.IntegerUtils; import io.metersphere.api.exec.queue.ExecThreadPoolExecutor; import io.metersphere.api.jmeter.JMeterService; -import io.metersphere.service.ApiExecutionQueueService; -import io.metersphere.service.MockConfigService; -import io.metersphere.service.PluginService; import io.metersphere.commons.constants.ScheduleGroup; import io.metersphere.commons.utils.CommonBeanFactory; import io.metersphere.commons.utils.LogUtil; import io.metersphere.dto.BaseSystemConfigDTO; -import io.metersphere.service.BaseScheduleService; -import io.metersphere.service.SystemParameterService; +import io.metersphere.service.*; +import io.metersphere.service.definition.ApiModuleService; +import io.metersphere.service.scenario.ApiScenarioModuleService; import org.apache.commons.lang3.StringUtils; import org.python.core.Options; import org.python.util.PythonInterpreter; @@ -36,6 +34,10 @@ public class ApiAppStartListener implements ApplicationRunner { private PluginService pluginService; @Resource private ApiExecutionQueueService apiExecutionQueueService; + @Resource + private ApiModuleService apiModuleService; + @Resource + private ApiScenarioModuleService apiScenarioModuleService; @Value("${jmeter.home}") private String jmeterHome; @@ -59,6 +61,12 @@ public class ApiAppStartListener implements ApplicationRunner { LogUtil.info("处理重启导致未执行完成的报告"); apiExecutionQueueService.exceptionHandling(); + LogUtil.info("初始化默认项目接口模块"); + apiModuleService.initDefaultNode(); + + LogUtil.info("初始化默认项目场景模块"); + apiScenarioModuleService.initDefaultModule(); + BaseSystemConfigDTO dto = systemParameterService.getBaseInfo(); LogUtil.info("设置并发队列核心数", dto.getConcurrency()); if (StringUtils.isNotEmpty(dto.getConcurrency())) { diff --git a/api-test/backend/src/main/java/io/metersphere/service/definition/ApiModuleService.java b/api-test/backend/src/main/java/io/metersphere/service/definition/ApiModuleService.java index 268f31dcef..cecf69b2cf 100644 --- a/api-test/backend/src/main/java/io/metersphere/service/definition/ApiModuleService.java +++ b/api-test/backend/src/main/java/io/metersphere/service/definition/ApiModuleService.java @@ -6,11 +6,13 @@ import io.metersphere.api.parse.api.ApiDefinitionImport; import io.metersphere.base.domain.*; import io.metersphere.base.mapper.ApiDefinitionMapper; import io.metersphere.base.mapper.ApiModuleMapper; +import io.metersphere.base.mapper.ProjectMapper; import io.metersphere.base.mapper.ext.ExtApiDefinitionMapper; import io.metersphere.base.mapper.ext.ExtApiModuleMapper; import io.metersphere.base.mapper.ext.ExtApiTestCaseMapper; import io.metersphere.commons.constants.ProjectModuleDefaultNodeEnum; import io.metersphere.commons.constants.PropertyConstant; +import io.metersphere.commons.constants.RequestTypeConstants; import io.metersphere.commons.constants.TestCaseConstants; import io.metersphere.commons.enums.ApiTestDataStatus; import io.metersphere.commons.exception.MSException; @@ -31,7 +33,6 @@ import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.jetbrains.annotations.NotNull; import org.mybatis.spring.SqlSessionUtils; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -54,6 +55,8 @@ public class ApiModuleService extends NodeTreeService { private ApiDefinitionService apiDefinitionService; @Resource private ExtApiTestCaseMapper extApiTestCaseMapper; + @Resource + private ProjectMapper projectMapper; @Resource SqlSessionFactory sqlSessionFactory; @@ -141,8 +144,6 @@ public class ApiModuleService extends NodeTreeService { } public List getNodeTreeByProjectId(String projectId, String protocol, String versionId) { - // 判断当前项目下是否有默认模块,没有添加默认模块 - this.getDefaultNode(projectId, protocol); ApiDefinitionRequest request = new ApiDefinitionRequest(); List apiModules = getApiModulesByProjectAndPro(projectId, protocol); request.setProjectId(projectId); @@ -189,8 +190,6 @@ public class ApiModuleService extends NodeTreeService { } public List getNodeTreeByCondition(String projectId, String protocol, String versionId, ApiDefinitionRequest request) { - // 判断当前项目下是否有默认模块,没有添加默认模块 - this.getDefaultNode(projectId, protocol); List apiModules = getApiModulesByProjectAndPro(projectId, protocol); request.setProjectId(projectId); request.setProtocol(protocol); @@ -570,19 +569,29 @@ public class ApiModuleService extends NodeTreeService { return apiModuleMapper.countByExample(example); } + public void initDefaultNode() { + ProjectExample projectExample = new ProjectExample(); + projectExample.createCriteria().andNameEqualTo("默认项目"); + List projects = projectMapper.selectByExample(projectExample); + if (CollectionUtils.isNotEmpty(projects)) { + String[] protocols = {RequestTypeConstants.HTTP, RequestTypeConstants.DUBBO, RequestTypeConstants.SQL, RequestTypeConstants.TCP}; + for (String protocol : protocols) { + saveDefault(projects.get(0).getId(), protocol); + } + } + } + public ApiModule getDefaultNode(String projectId, String protocol) { ApiModuleExample example = new ApiModuleExample(); example.createCriteria().andProjectIdEqualTo(projectId).andProtocolEqualTo(protocol).andNameEqualTo(ProjectModuleDefaultNodeEnum.API_MODULE_DEFAULT_NODE.getNodeName()).andParentIdIsNull(); List list = apiModuleMapper.selectByExample(example); - if (CollectionUtils.isEmpty(list)) { - return saveDefault(projectId, protocol); - } else { + if (CollectionUtils.isNotEmpty(list)) { return list.get(0); } + return null; } - @Async - public synchronized ApiModule saveDefault(String projectId, String protocol) { + public ApiModule saveDefault(String projectId, String protocol) { ApiModuleExample example = new ApiModuleExample(); example.createCriteria().andProjectIdEqualTo(projectId).andProtocolEqualTo(protocol).andNameEqualTo(ProjectModuleDefaultNodeEnum.API_MODULE_DEFAULT_NODE.getNodeName()).andParentIdIsNull(); List list = apiModuleMapper.selectByExample(example); diff --git a/api-test/backend/src/main/java/io/metersphere/service/scenario/ApiScenarioModuleService.java b/api-test/backend/src/main/java/io/metersphere/service/scenario/ApiScenarioModuleService.java index e14f733843..fe04b69c89 100644 --- a/api-test/backend/src/main/java/io/metersphere/service/scenario/ApiScenarioModuleService.java +++ b/api-test/backend/src/main/java/io/metersphere/service/scenario/ApiScenarioModuleService.java @@ -3,12 +3,10 @@ package io.metersphere.service.scenario; import io.metersphere.api.dto.ApiTestImportRequest; import io.metersphere.api.dto.automation.*; -import io.metersphere.base.domain.ApiScenario; -import io.metersphere.base.domain.ApiScenarioModule; -import io.metersphere.base.domain.ApiScenarioModuleExample; -import io.metersphere.base.domain.ApiScenarioWithBLOBs; +import io.metersphere.base.domain.*; import io.metersphere.base.mapper.ApiScenarioMapper; import io.metersphere.base.mapper.ApiScenarioModuleMapper; +import io.metersphere.base.mapper.ProjectMapper; import io.metersphere.base.mapper.ext.ExtApiScenarioMapper; import io.metersphere.base.mapper.ext.ExtApiScenarioModuleMapper; import io.metersphere.commons.constants.ProjectModuleDefaultNodeEnum; @@ -30,10 +28,9 @@ import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionUtils; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; +import org.apache.commons.collections.CollectionUtils; import javax.annotation.Resource; import java.util.*; @@ -55,14 +52,14 @@ public class ApiScenarioModuleService extends NodeTreeService getNodeTreeByProjectId(String projectId) { - // 判断当前项目下是否有默认模块,没有添加默认模块 - this.getDefaultNode(projectId); List nodes = extApiScenarioModuleMapper.getNodeTreeByProjectId(projectId); ApiScenarioRequest request = new ApiScenarioRequest(); request.setProjectId(projectId); @@ -103,8 +100,6 @@ public class ApiScenarioModuleService extends NodeTreeService getNodeTreeByProjectId(String projectId, ApiScenarioRequest request) { - // 判断当前项目下是否有默认模块,没有添加默认模块 - this.getDefaultNode(projectId); List nodes = extApiScenarioModuleMapper.getNodeTreeByProjectId(projectId); request.setProjectId(projectId); List list = new ArrayList<>(); @@ -174,7 +169,7 @@ public class ApiScenarioModuleService extends NodeTreeService moduleDTOList, Map> scenarioMap) { - if (org.apache.commons.collections.CollectionUtils.isNotEmpty(moduleDTOList) && MapUtils.isNotEmpty(scenarioMap)) { + if (CollectionUtils.isNotEmpty(moduleDTOList) && MapUtils.isNotEmpty(scenarioMap)) { moduleDTOList.forEach(node -> { List moduleIds = new ArrayList<>(); moduleIds = this.nodeList(moduleDTOList, node.getId(), moduleIds); @@ -191,7 +186,7 @@ public class ApiScenarioModuleService extends NodeTreeService selectTreeStructModuleById(Collection ids) { - if (org.apache.commons.collections.CollectionUtils.isEmpty(ids)) { + if (CollectionUtils.isEmpty(ids)) { return new ArrayList<>(0); } else { List parentIdList = new ArrayList<>(); @@ -246,7 +241,7 @@ public class ApiScenarioModuleService extends NodeTreeService list = getPos(projectId, level, parentId, "pos desc"); - if (!CollectionUtils.isEmpty(list) && list.get(0) != null && list.get(0).getPos() != null) { + if (CollectionUtils.isNotEmpty(list) && list.get(0) != null && list.get(0).getPos() != null) { return list.get(0).getPos() + DEFAULT_POS; } else { return DEFAULT_POS; @@ -463,7 +458,7 @@ public class ApiScenarioModuleService extends NodeTreeService nodes = apiScenarioModuleMapper.selectByExample(example); - if (org.apache.commons.collections.CollectionUtils.isNotEmpty(nodes)) { + if (CollectionUtils.isNotEmpty(nodes)) { List names = nodes.stream().map(ApiScenarioModule::getName).collect(Collectors.toList()); OperatingLogDetails details = new OperatingLogDetails(JSON.toJSONString(ids), nodes.get(0).getProjectId(), String.join(",", names), nodes.get(0).getCreateUser(), new LinkedList<>()); return JSON.toJSONString(details); @@ -489,7 +484,7 @@ public class ApiScenarioModuleService extends NodeTreeService list = apiScenarioModuleMapper.selectByExample(example); - if (org.apache.commons.collections.CollectionUtils.isNotEmpty(list)) { + if (CollectionUtils.isNotEmpty(list)) { module = list.get(0); } } @@ -509,34 +504,40 @@ public class ApiScenarioModuleService extends NodeTreeService list = apiScenarioModuleMapper.selectByExample(example); - if (CollectionUtils.isEmpty(list)) { - return saveDefault(projectId); - } else { + if (!CollectionUtils.isEmpty(list)) { return list.get(0); } + return null; } - @Async - public synchronized ApiScenarioModule saveDefault(String projectId) { - ApiScenarioModuleExample example = new ApiScenarioModuleExample(); - example.createCriteria().andProjectIdEqualTo(projectId).andNameEqualTo(ProjectModuleDefaultNodeEnum.API_SCENARIO_DEFAULT_NODE.getNodeName()).andParentIdIsNull(); - List list = apiScenarioModuleMapper.selectByExample(example); - if (CollectionUtils.isEmpty(list)) { - ApiScenarioModule module = new ApiScenarioModule(); - module.setId(UUID.randomUUID().toString()); - module.setName(ProjectModuleDefaultNodeEnum.API_SCENARIO_DEFAULT_NODE.getNodeName()); - module.setPos(1.0); - module.setLevel(1); - module.setCreateTime(System.currentTimeMillis()); - module.setUpdateTime(System.currentTimeMillis()); - module.setProjectId(projectId); - module.setCreateUser(SessionUtils.getUserId()); - apiScenarioModuleMapper.insert(module); - return module; - } else { - return list.get(0); + public void initDefaultModule() { + ProjectExample projectExample = new ProjectExample(); + projectExample.createCriteria().andNameEqualTo("默认项目"); + List projects = projectMapper.selectByExample(projectExample); + if (!CollectionUtils.isEmpty(projects)) { + ApiScenarioModuleExample example = new ApiScenarioModuleExample(); + example.createCriteria() + .andProjectIdEqualTo(projects.get(0).getId()) + .andNameEqualTo(ProjectModuleDefaultNodeEnum.API_SCENARIO_DEFAULT_NODE.getNodeName()) + .andParentIdIsNull(); + List list = apiScenarioModuleMapper.selectByExample(example); + if (CollectionUtils.isEmpty(list)) { + ApiScenarioModule module = new ApiScenarioModule(); + module.setId(UUID.randomUUID().toString()); + module.setName(ProjectModuleDefaultNodeEnum.API_SCENARIO_DEFAULT_NODE.getNodeName()); + module.setPos(1.0); + module.setLevel(1); + module.setCreateTime(System.currentTimeMillis()); + module.setUpdateTime(System.currentTimeMillis()); + module.setProjectId(projects.get(0).getId()); + module.setCreateUser(SessionUtils.getUserId()); + apiScenarioModuleMapper.insert(module); + } } }