diff --git a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java index c038586623..a9dcdbf524 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java @@ -504,20 +504,9 @@ public class ApiAutomationService { } public void delete(String id) { - ApiScenarioWithBLOBs scenario = apiScenarioMapper.selectByPrimaryKey(id); - if (scenario == null) { - return; - } - ApiScenarioExample example = new ApiScenarioExample(); - example.createCriteria().andRefIdEqualTo(scenario.getRefId()); - List apiScenarios = apiScenarioMapper.selectByExample(example); - apiScenarios.forEach(s -> { - //及连删除外键表 - this.preDelete(s.getId()); - testPlanScenarioCaseService.deleteByScenarioId(s.getId()); - apiScenarioMapper.deleteByPrimaryKey(s.getId()); - scheduleService.deleteByResourceId(s.getId(), ScheduleGroup.API_SCENARIO_TEST.name()); - }); + List ids = new ArrayList<>(); + ids.add(id); + this.deleteBatch(ids); } private void deleteFollows(String id) { @@ -526,7 +515,7 @@ public class ApiAutomationService { apiScenarioFollowMapper.deleteByExample(example); } - public void preDelete(String scenarioId) { + public void preDelete(String scenarioId,String scenarioDefinition) { //删除引用 apiScenarioReferenceIdService.deleteByScenarioId(scenarioId); @@ -537,21 +526,10 @@ public class ApiAutomationService { scheduleService.deleteByResourceId(scenarioId, ScheduleGroup.API_SCENARIO_TEST.name()); TestPlanApiScenarioExample example = new TestPlanApiScenarioExample(); example.createCriteria().andApiScenarioIdEqualTo(scenarioId); - List testPlanApiScenarioList = testPlanApiScenarioMapper.selectByExample(example); - - List idList = new ArrayList<>(testPlanApiScenarioList.size()); - for (TestPlanApiScenario api : testPlanApiScenarioList) { - idList.add(api.getId()); - } - example = new TestPlanApiScenarioExample(); - - if (!idList.isEmpty()) { - example.createCriteria().andIdIn(idList); - testPlanApiScenarioMapper.deleteByExample(example); - } + testPlanApiScenarioMapper.deleteByExample(example); // 删除引用关系 relationshipEdgeService.delete(scenarioId); - deleteBodyFileByScenarioId(scenarioId); + deleteBodyFile(scenarioDefinition); deleteFollows(scenarioId); } @@ -578,19 +556,25 @@ public class ApiAutomationService { ApiScenarioReportExample scenarioReportExample = new ApiScenarioReportExample(); scenarioReportExample.createCriteria().andScenarioIdIn(scenarioIds); List list = apiScenarioReportMapper.selectByExample(scenarioReportExample); - if (CollectionUtils.isNotEmpty(list)) { - List ids = list.stream().map(ApiScenarioReport::getId).collect(Collectors.toList()); - APIReportBatchRequest reportRequest = new APIReportBatchRequest(); - reportRequest.setIds(ids); - apiReportService.deleteAPIReportBatch(reportRequest); + if (CollectionUtils.isEmpty(list)) { + return; } + List ids = list.stream().map(ApiScenarioReport::getId).collect(Collectors.toList()); + APIReportBatchRequest reportRequest = new APIReportBatchRequest(); + reportRequest.setIds(ids); + apiReportService.deleteAPIReportBatch(reportRequest); } public void deleteBatch(List ids) { - ApiScenarioExample example = new ApiScenarioExample(); - example.createCriteria().andIdIn(ids); - List apiScenarios = apiScenarioMapper.selectByExample(example); - apiScenarios.forEach(apiScenario -> this.delete(apiScenario.getId())); + if (CollectionUtils.isEmpty(ids)) { + return; + } + List apiScenarioWithBLOBs = extApiScenarioMapper.listWithRefIds(ids); + List scenarioIds = apiScenarioWithBLOBs.stream().map(ApiScenarioWithBLOBs::getId).collect(Collectors.toList()); + Map scenarioIdDefinitionMap = apiScenarioWithBLOBs.stream().collect(Collectors.toMap(ApiScenarioWithBLOBs::getId, scenario -> scenario.getScenarioDefinition() == null ? " " : scenario.getScenarioDefinition())); + preDelAndResource(scenarioIdDefinitionMap); + testPlanScenarioCaseService.bathDeleteByScenarioIds(scenarioIds); + deleteScenarioByIds(scenarioIds); } public void removeToGc(List apiIds) { @@ -1554,20 +1538,27 @@ public class ApiAutomationService { ServiceUtils.getSelectAllIds(request, request.getCondition(), (query) -> extApiScenarioMapper.selectIdsByQuery(query)); List ids = request.getIds(); - if (CollectionUtils.isEmpty(ids)) { - return; - } - ids.forEach(id -> { - ApiScenarioWithBLOBs scenario = apiScenarioMapper.selectByPrimaryKey(id); - if (scenario == null) { - return; + this.deleteBatch(ids); + } + + private void deleteScenarioByIds(List scenarioIds) { + ApiScenarioExample apiScenarioExample = new ApiScenarioExample(); + apiScenarioExample.createCriteria().andIdIn(scenarioIds); + apiScenarioMapper.deleteByExample(apiScenarioExample); + } + + private void preDelAndResource(Map scenarioIdDefinitionMap) { + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + Thread.currentThread().setName("PRE_DELETE:" + System.currentTimeMillis()); + scenarioIdDefinitionMap.forEach((scenarioId,scenarioDefinition)->{ + preDelete(scenarioId,scenarioDefinition); + scheduleService.deleteByResourceId(scenarioId, ScheduleGroup.API_SCENARIO_TEST.name()); + }); } - ApiScenarioExample example = new ApiScenarioExample(); - example.createCriteria().andRefIdEqualTo(scenario.getRefId()); - List apiScenarios = apiScenarioMapper.selectByExample(example); - List apiIds = apiScenarios.stream().map(ApiScenario::getId).collect(Collectors.toList()); - this.deleteBatch(apiIds); }); + thread.start(); } /** @@ -2022,10 +2013,4 @@ public class ApiAutomationService { } } } - - public static void main(String args[]) { - String s = "{\"id\":\"a0b24269-96af-4e38-9527-abb8de9e298a\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"tags\":\"[]\",\"userId\":\"zhaoyong\",\"apiScenarioModuleId\":\"91b7822c-265f-4304-8256-92b7f862dbc5\",\"modulePath\":\"/MeterSphere-test\",\"name\":\"创建测试\",\"level\":\"P0\",\"status\":\"Underway\",\"principal\":\"zhaoyong\",\"stepTotal\":2,\"schedule\":null,\"createTime\":1649660714601,\"updateTime\":1649663715536,\"passRate\":\"0%\",\"lastResult\":\"Fail\",\"reportId\":\"aae35c28\",\"num\":100115,\"originalState\":null,\"customNum\":\"100115\",\"createUser\":null,\"version\":10,\"deleteTime\":null,\"deleteUserId\":null,\"executeTimes\":null,\"order\":null,\"environmentType\":\"JSON\",\"environmentGroupId\":null,\"versionId\":\"5b78930e-6880-11ec-a810-0242ac1e0a05\",\"refId\":\"a0b24269-96af-4e38-9527-abb8de9e298a\",\"latest\":null,\"scenarioDefinition\":{\"id\":\"a0b24269-96af-4e38-9527-abb8de9e298a\",\"enableCookieShare\":false,\"name\":\"创建测试\",\"type\":\"scenario\",\"clazzName\":\"io.metersphere.api.dto.definition.request.MsScenario\",\"variables\":[],\"headers\":[],\"referenced\":\"Created\",\"environmentMap\":{\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\":\"bdb7c2cb-76ba-4761-bdc1-dc136c492124\"},\"hashTree\":[{\"resourceId\":\"11335d47-ed41-2934-ecf8-150232d8d71d\",\"num\":\"\",\"refType\":\"CASE\",\"type\":\"HTTPSamplerProxy\",\"body\":{\"valid\":true,\"jsonSchema\":{\"hidden\":true,\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"title\":\"The Root Schema\",\"type\":\"object\",\"properties\":{\"password\":{\"hidden\":true,\"mock\":{\"mock\":\"Calong@2015\"},\"title\":\"The password Schema\",\"type\":\"string\",\"$id\":\"#/properties/password\"},\"username\":{\"hidden\":true,\"mock\":{\"mock\":\"admin\"},\"title\":\"The username Schema\",\"type\":\"string\",\"$id\":\"#/properties/username\"}},\"$id\":\"http://example.com/root.json\"},\"xml\":false,\"binary\":[],\"json\":true,\"kvs\":[],\"raw\":\"{\\n \\\"username\\\": \\\"admin\\\",\\n \\\"password\\\": \\\"Calong@2015\\\"\\n}\",\"kV\":false,\"oldKV\":false,\"type\":\"JSON\"},\"path\":\"/signin\",\"protocol\":\"HTTP\",\"enable\":true,\"followRedirects\":true,\"useEnvironment\":\"ec29256c-9523-48ff-b257-755f5daccb60\",\"connectTimeout\":\"60000\",\"hashTree\":[{\"resourceId\":\"4454ea7f-5c0e-4e1b-b66a-7fb925fc5b4c\",\"mockEnvironment\":false,\"active\":true,\"index\":1,\"type\":\"Extract\",\"regex\":[{\"valid\":true,\"expression\":\"Set-Cookie: (.*?); Path=/; HttpOnly;\",\"variable\":\"Cookie\",\"useHeaders\":\"true\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${Cookie}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.*?)\\\"\",\"variable\":\"id\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.+?)\\\"\",\"variable\":\"id2\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id2}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(\\\\d+)\\\"\",\"variable\":\"id3\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id3}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.\\\\d+)\\\"\",\"variable\":\"id4\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id4}\"}],\"xpath\":[],\"enable\":true,\"json\":[{\"valid\":true,\"expression\":\"$.data.csrfToken\",\"variable\":\"csrfToken\",\"multipleMatching\":false,\"type\":\"JSONPath\",\"value\":\"\"}],\"hashTree\":[],\"id\":\"bec13d6d-3dc0-3f20-ff73-d4fb0b8dcc99\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.extract.MsExtract\",\"parentIndex\":\"1_1\",\"checkBox\":false,\"isLeaf\":true},{\"jsr223\":[],\"resourceId\":\"5f22b989-279b-4417-b896-c3cbcdfd7448\",\"mockEnvironment\":false,\"document\":{\"data\":{\"xml\":[],\"json\":[],\"xmlFollowAPI\":\"false\",\"jsonFollowAPI\":\"false\"},\"enable\":true,\"type\":\"JSON\"},\"xpath2\":[],\"active\":false,\"index\":2,\"jsonPath\":[],\"type\":\"Assertions\",\"duration\":{\"valid\":false,\"enable\":true,\"type\":\"Duration\",\"value\":0},\"regex\":[],\"enable\":true,\"hashTree\":[],\"id\":\"e233298c-845b-5a48-8968-06266ebe775e\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.assertions.MsAssertions\",\"parentIndex\":\"1_2\",\"checkBox\":false,\"isLeaf\":true}],\"id\":\"4975f880-cb88-539d-38c6-01f134011946\",\"responseTimeout\":\"60000\",\"headers\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Content-Type\",\"urlEncode\":false,\"value\":\"application/json\",\"required\":true}],\"rest\":[],\"mockEnvironment\":false,\"method\":\"POST\",\"active\":false,\"index\":1,\"url\":\"\",\"customizeReq\":false,\"referenced\":\"Copy\",\"domain\":\"https://www.jd.com\",\"name\":\"登录ms\",\"isRefEnvironment\":true,\"arguments\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy\",\"doMultipartPost\":false,\"parentIndex\":1,\"requestResult\":[{\"responseResult\":{}}],\"checkBox\":false,\"isBatchProcess\":false,\"isLeaf\":true},{\"resourceId\":\"459089ec-eb03-c66b-1e81-9d6b5905a54f\",\"num\":\"\",\"refType\":\"CASE\",\"type\":\"HTTPSamplerProxy\",\"body\":{\"valid\":true,\"jsonSchema\":{\"$id\":\"http://example.com/root.json\",\"title\":\"The Root Schema\",\"hidden\":true,\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"type\":\"object\",\"properties\":{\"@type\":{\"$id\":\"#/properties/@type\",\"title\":\"The @type Schema\",\"hidden\":true,\"mock\":{\"mock\":\"aaa\"},\"type\":\"string\"}}},\"xml\":false,\"binary\":[],\"json\":true,\"kvs\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"request\",\"type\":\"text\",\"contentType\":\"application/json;boundary=----WebKitFormBoundarybikQMdDG93ZCVD4V\",\"urlEncode\":false,\"value\":\"{\\\"name\\\":\\\"测试1\\\",\\\"module\\\":\\\"f9ee3850-e0a4-4529-99f8-24c6cb9a5e57\\\",\\\"nodePath\\\":\\\"/未规划用例\\\",\\\"maintainer\\\":\\\"zyy\\\",\\\"priority\\\":\\\"P0\\\",\\\"type\\\":\\\"functional\\\",\\\"method\\\":\\\"\\\",\\\"prerequisite\\\":\\\"\\\",\\\"testId\\\":\\\"[]\\\",\\\"otherTestName\\\":\\\"\\\",\\\"steps\\\":\\\"[{\\\\\\\"num\\\\\\\":1,\\\\\\\"desc\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"result\\\\\\\":\\\\\\\"\\\\\\\"}]\\\",\\\"stepDesc\\\":\\\"\\\",\\\"stepResult\\\":\\\"\\\",\\\"selected\\\":[],\\\"remark\\\":\\\"\\\",\\\"tags\\\":\\\"[]\\\",\\\"demandId\\\":\\\"\\\",\\\"demandName\\\":\\\"\\\",\\\"status\\\":\\\"Prepare\\\",\\\"reviewStatus\\\":\\\"Prepare\\\",\\\"stepDescription\\\":\\\"\\\",\\\"expectedResult\\\":\\\"\\\",\\\"stepModel\\\":null,\\\"customNum\\\":\\\"\\\",\\\"followPeople\\\":\\\"\\\",\\\"follows\\\":[],\\\"customFields\\\":\\\"[{\\\\\\\"id\\\\\\\":\\\\\\\"ea902d54-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"责任人\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"zyy\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"member\\\\\\\",\\\\\\\"customData\\\\\\\":null},{\\\\\\\"id\\\\\\\":\\\\\\\"ea91b4b1-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"用例等级\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"P0\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"select\\\\\\\",\\\\\\\"customData\\\\\\\":null},{\\\\\\\"id\\\\\\\":\\\\\\\"ea991a6c-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"用例状态\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"Prepare\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"select\\\\\\\",\\\\\\\"customData\\\\\\\":null}]\\\",\\\"nodeId\\\":\\\"f9ee3850-e0a4-4529-99f8-24c6cb9a5e57\\\",\\\"projectId\\\":\\\"a79ac4e6-c3b7-4d82-8f11-b1c9be05c396\\\",\\\"casePublic\\\":false,\\\"updatedFileList\\\":[]}\",\"required\":false},{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"raw\":\"{\\n \\\"@type\\\": \\\"aaa\\\"\\n}\",\"kV\":false,\"oldKV\":false,\"type\":\"JSON\"},\"path\":\"/test/case/add\",\"protocol\":\"HTTP\",\"enable\":true,\"followRedirects\":true,\"useEnvironment\":\"ec29256c-9523-48ff-b257-755f5daccb60\",\"connectTimeout\":\"60000\",\"hashTree\":[{\"jsr223\":[],\"resourceId\":\"f318347e-2a8f-4bbe-9753-506156d44656\",\"mockEnvironment\":false,\"document\":{\"data\":{\"xml\":[],\"json\":[],\"xmlFollowAPI\":\"false\",\"jsonFollowAPI\":\"false\"},\"enable\":true,\"type\":\"JSON\"},\"xpath2\":[],\"active\":false,\"index\":1,\"jsonPath\":[],\"type\":\"Assertions\",\"duration\":{\"valid\":false,\"enable\":true,\"type\":\"Duration\",\"value\":0},\"regex\":[],\"enable\":true,\"hashTree\":[],\"id\":\"aaa65613-b39c-dc42-852d-17e47366c6cb\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.assertions.MsAssertions\",\"parentIndex\":\"2_1\",\"checkBox\":false,\"isLeaf\":true}],\"id\":\"ab259fed-5328-71f7-8079-e05783a82499\",\"responseTimeout\":\"60000\",\"headers\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Content-Type\",\"urlEncode\":false,\"value\":\"application/json\",\"required\":true},{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"CSRF-TOKEN\",\"urlEncode\":false,\"value\":\"${csrfToken}\",\"required\":true},{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Cookie\",\"urlEncode\":false,\"value\":\"${Cookie}\",\"required\":true},{\"valid\":false,\"file\":false,\"enable\":true,\"urlEncode\":false,\"required\":true}],\"rest\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"mockEnvironment\":false,\"method\":\"POST\",\"active\":true,\"index\":2,\"url\":\"\",\"customizeReq\":false,\"referenced\":\"Copy\",\"domain\":\"https://www.jd.com\",\"name\":\"创建功能用例\",\"isRefEnvironment\":true,\"arguments\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy\",\"doMultipartPost\":false,\"parentIndex\":2,\"requestResult\":[{\"responseResult\":{}}],\"checkBox\":false,\"isBatchProcess\":false,\"isLeaf\":true,\"preSize\":0,\"postSize\":0,\"ruleSize\":0}],\"onSampleError\":true,\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\"},\"description\":null,\"useUrl\":null,\"environmentJson\":\"{\\\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\\\":\\\"bdb7c2cb-76ba-4761-bdc1-dc136c492124\\\"}\",\"projectName\":\"默认项目\",\"userName\":\"zz\",\"creatorName\":\"zz\",\"principalName\":\"zz\",\"tagNames\":null,\"deleteUser\":null,\"versionName\":\"v1.0.0\",\"versionEnable\":null,\"projectIds\":null,\"caseId\":null,\"environment\":null,\"env\":\"{\\\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\\\":\\\"bdb7c2cb-76ba-4761-bdc1-dc136c492124\\\"}\",\"environmentMap\":{\"默认项目\":\"JD\"},\"creator\":\"zhaoyong\",\"showBatchTip\":true,\"variables\":[],\"headers\":[],\"scenarioDefinitionOrg\":{\"apiScenarioModuleId\":\"91b7822c-265f-4304-8256-92b7f862dbc5\",\"name\":\"创建测试\",\"status\":\"Underway\",\"principal\":\"zhaoyong\",\"level\":\"P0\",\"tags\":[],\"description\":null,\"scenarioDefinition\":[{\"resourceId\":\"11335d47-ed41-2934-ecf8-150232d8d71d\",\"num\":\"\",\"refType\":\"CASE\",\"type\":\"HTTPSamplerProxy\",\"body\":{\"valid\":true,\"jsonSchema\":{\"hidden\":true,\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"title\":\"The Root Schema\",\"type\":\"object\",\"properties\":{\"password\":{\"hidden\":true,\"mock\":{\"mock\":\"Calong@2015\"},\"title\":\"The password Schema\",\"type\":\"string\",\"$id\":\"#/properties/password\"},\"username\":{\"hidden\":true,\"mock\":{\"mock\":\"admin\"},\"title\":\"The username Schema\",\"type\":\"string\",\"$id\":\"#/properties/username\"}},\"$id\":\"http://example.com/root.json\"},\"xml\":false,\"binary\":[],\"json\":true,\"kvs\":[],\"raw\":\"{\\n \\\"username\\\": \\\"admin\\\",\\n \\\"password\\\": \\\"Calong@2015\\\"\\n}\",\"kV\":false,\"oldKV\":false,\"type\":\"JSON\"},\"path\":\"/signin\",\"protocol\":\"HTTP\",\"enable\":true,\"followRedirects\":true,\"useEnvironment\":\"ec29256c-9523-48ff-b257-755f5daccb60\",\"connectTimeout\":\"60000\",\"hashTree\":[{\"resourceId\":\"4454ea7f-5c0e-4e1b-b66a-7fb925fc5b4c\",\"mockEnvironment\":false,\"active\":true,\"index\":1,\"type\":\"Extract\",\"regex\":[{\"valid\":true,\"expression\":\"Set-Cookie: (.*?); Path=/; HttpOnly;\",\"variable\":\"Cookie\",\"useHeaders\":\"true\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${Cookie}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.*?)\\\"\",\"variable\":\"id\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.+?)\\\"\",\"variable\":\"id2\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id2}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(\\\\d+)\\\"\",\"variable\":\"id3\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id3}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.\\\\d+)\\\"\",\"variable\":\"id4\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id4}\"}],\"xpath\":[],\"enable\":true,\"json\":[{\"valid\":true,\"expression\":\"$.data.csrfToken\",\"variable\":\"csrfToken\",\"multipleMatching\":false,\"type\":\"JSONPath\",\"value\":\"\"}],\"hashTree\":[],\"id\":\"bec13d6d-3dc0-3f20-ff73-d4fb0b8dcc99\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.extract.MsExtract\",\"parentIndex\":\"1_1\"},{\"jsr223\":[],\"resourceId\":\"5f22b989-279b-4417-b896-c3cbcdfd7448\",\"mockEnvironment\":false,\"document\":{\"data\":{\"xml\":[],\"json\":[],\"xmlFollowAPI\":\"false\",\"jsonFollowAPI\":\"false\"},\"enable\":true,\"type\":\"JSON\"},\"xpath2\":[],\"active\":false,\"index\":2,\"jsonPath\":[],\"type\":\"Assertions\",\"duration\":{\"valid\":false,\"enable\":true,\"type\":\"Duration\",\"value\":0},\"regex\":[],\"enable\":true,\"hashTree\":[],\"id\":\"e233298c-845b-5a48-8968-06266ebe775e\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.assertions.MsAssertions\",\"parentIndex\":\"1_2\"}],\"id\":\"4975f880-cb88-539d-38c6-01f134011946\",\"responseTimeout\":\"60000\",\"headers\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Content-Type\",\"urlEncode\":false,\"value\":\"application/json\",\"required\":true}],\"rest\":[],\"mockEnvironment\":false,\"method\":\"POST\",\"active\":false,\"index\":1,\"url\":\"\",\"customizeReq\":false,\"referenced\":\"Copy\",\"domain\":\"https://www.jd.com\",\"name\":\"登录ms\",\"isRefEnvironment\":true,\"arguments\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy\",\"doMultipartPost\":false,\"parentIndex\":1},{\"resourceId\":\"459089ec-eb03-c66b-1e81-9d6b5905a54f\",\"num\":\"\",\"refType\":\"CASE\",\"type\":\"HTTPSamplerProxy\",\"body\":{\"valid\":true,\"jsonSchema\":{\"hidden\":true,\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"title\":\"The Root Schema\",\"type\":\"object\",\"properties\":{\"\\\\@type\":{\"hidden\":true,\"mock\":{\"mock\":\"aaa\"},\"title\":\"The \\\\@type Schema\",\"type\":\"string\",\"$id\":\"#/properties/\\\\@type\"}},\"$id\":\"http://example.com/root.json\"},\"xml\":false,\"binary\":[],\"json\":true,\"kvs\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"request\",\"type\":\"text\",\"contentType\":\"application/json;boundary=----WebKitFormBoundarybikQMdDG93ZCVD4V\",\"urlEncode\":false,\"value\":\"{\\\"name\\\":\\\"测试1\\\",\\\"module\\\":\\\"f9ee3850-e0a4-4529-99f8-24c6cb9a5e57\\\",\\\"nodePath\\\":\\\"/未规划用例\\\",\\\"maintainer\\\":\\\"zyy\\\",\\\"priority\\\":\\\"P0\\\",\\\"type\\\":\\\"functional\\\",\\\"method\\\":\\\"\\\",\\\"prerequisite\\\":\\\"\\\",\\\"testId\\\":\\\"[]\\\",\\\"otherTestName\\\":\\\"\\\",\\\"steps\\\":\\\"[{\\\\\\\"num\\\\\\\":1,\\\\\\\"desc\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"result\\\\\\\":\\\\\\\"\\\\\\\"}]\\\",\\\"stepDesc\\\":\\\"\\\",\\\"stepResult\\\":\\\"\\\",\\\"selected\\\":[],\\\"remark\\\":\\\"\\\",\\\"tags\\\":\\\"[]\\\",\\\"demandId\\\":\\\"\\\",\\\"demandName\\\":\\\"\\\",\\\"status\\\":\\\"Prepare\\\",\\\"reviewStatus\\\":\\\"Prepare\\\",\\\"stepDescription\\\":\\\"\\\",\\\"expectedResult\\\":\\\"\\\",\\\"stepModel\\\":null,\\\"customNum\\\":\\\"\\\",\\\"followPeople\\\":\\\"\\\",\\\"follows\\\":[],\\\"customFields\\\":\\\"[{\\\\\\\"id\\\\\\\":\\\\\\\"ea902d54-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"责任人\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"zyy\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"member\\\\\\\",\\\\\\\"customData\\\\\\\":null},{\\\\\\\"id\\\\\\\":\\\\\\\"ea91b4b1-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"用例等级\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"P0\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"select\\\\\\\",\\\\\\\"customData\\\\\\\":null},{\\\\\\\"id\\\\\\\":\\\\\\\"ea991a6c-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"用例状态\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"Prepare\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"select\\\\\\\",\\\\\\\"customData\\\\\\\":null}]\\\",\\\"nodeId\\\":\\\"f9ee3850-e0a4-4529-99f8-24c6cb9a5e57\\\",\\\"projectId\\\":\\\"a79ac4e6-c3b7-4d82-8f11-b1c9be05c396\\\",\\\"casePublic\\\":false,\\\"updatedFileList\\\":[]}\",\"required\":false},{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"raw\":\"{\\n \\\"\\\\\\\\@type\\\": \\\"aaa\\\"\\n}\",\"kV\":false,\"oldKV\":false,\"type\":\"JSON\"},\"path\":\"/test/case/add\",\"protocol\":\"HTTP\",\"enable\":true,\"followRedirects\":true,\"useEnvironment\":\"ec29256c-9523-48ff-b257-755f5daccb60\",\"connectTimeout\":\"60000\",\"hashTree\":[{\"jsr223\":[],\"resourceId\":\"f318347e-2a8f-4bbe-9753-506156d44656\",\"mockEnvironment\":false,\"document\":{\"data\":{\"xml\":[],\"json\":[],\"xmlFollowAPI\":\"false\",\"jsonFollowAPI\":\"false\"},\"enable\":true,\"type\":\"JSON\"},\"xpath2\":[],\"active\":false,\"index\":1,\"jsonPath\":[],\"type\":\"Assertions\",\"duration\":{\"valid\":false,\"enable\":true,\"type\":\"Duration\",\"value\":0},\"regex\":[],\"enable\":true,\"hashTree\":[],\"id\":\"aaa65613-b39c-dc42-852d-17e47366c6cb\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.assertions.MsAssertions\",\"parentIndex\":\"2_1\"}],\"id\":\"ab259fed-5328-71f7-8079-e05783a82499\",\"responseTimeout\":\"60000\",\"headers\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Content-Type\",\"urlEncode\":false,\"value\":\"application/json\",\"required\":true},{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"CSRF-TOKEN\",\"urlEncode\":false,\"value\":\"${csrfToken}\",\"required\":true},{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Cookie\",\"urlEncode\":false,\"value\":\"${Cookie}\",\"required\":true},{\"valid\":false,\"file\":false,\"enable\":true,\"urlEncode\":false,\"required\":true}],\"rest\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"mockEnvironment\":false,\"method\":\"POST\",\"active\":true,\"index\":2,\"url\":\"\",\"customizeReq\":false,\"referenced\":\"Copy\",\"domain\":\"https://www.jd.com\",\"name\":\"创建功能用例\",\"isRefEnvironment\":true,\"arguments\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy\",\"doMultipartPost\":false,\"parentIndex\":2}]},\"follows\":[],\"hashTree\":[{\"resourceId\":\"11335d47-ed41-2934-ecf8-150232d8d71d\",\"num\":\"\",\"refType\":\"CASE\",\"type\":\"HTTPSamplerProxy\",\"body\":{\"valid\":true,\"jsonSchema\":{\"hidden\":true,\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"title\":\"The Root Schema\",\"type\":\"object\",\"properties\":{\"password\":{\"hidden\":true,\"mock\":{\"mock\":\"Calong@2015\"},\"title\":\"The password Schema\",\"type\":\"string\",\"$id\":\"#/properties/password\"},\"username\":{\"hidden\":true,\"mock\":{\"mock\":\"admin\"},\"title\":\"The username Schema\",\"type\":\"string\",\"$id\":\"#/properties/username\"}},\"$id\":\"http://example.com/root.json\"},\"xml\":false,\"binary\":[],\"json\":true,\"kvs\":[],\"raw\":\"{\\n \\\"username\\\": \\\"admin\\\",\\n \\\"password\\\": \\\"Calong@2015\\\"\\n}\",\"kV\":false,\"oldKV\":false,\"type\":\"JSON\"},\"path\":\"/signin\",\"protocol\":\"HTTP\",\"enable\":true,\"followRedirects\":true,\"useEnvironment\":\"ec29256c-9523-48ff-b257-755f5daccb60\",\"connectTimeout\":\"60000\",\"hashTree\":[{\"resourceId\":\"4454ea7f-5c0e-4e1b-b66a-7fb925fc5b4c\",\"mockEnvironment\":false,\"active\":true,\"index\":1,\"type\":\"Extract\",\"regex\":[{\"valid\":true,\"expression\":\"Set-Cookie: (.*?); Path=/; HttpOnly;\",\"variable\":\"Cookie\",\"useHeaders\":\"true\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${Cookie}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.*?)\\\"\",\"variable\":\"id\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.+?)\\\"\",\"variable\":\"id2\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id2}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(\\\\d+)\\\"\",\"variable\":\"id3\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id3}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.\\\\d+)\\\"\",\"variable\":\"id4\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id4}\"}],\"xpath\":[],\"enable\":true,\"json\":[{\"valid\":true,\"expression\":\"$.data.csrfToken\",\"variable\":\"csrfToken\",\"multipleMatching\":false,\"type\":\"JSONPath\",\"value\":\"\"}],\"hashTree\":[],\"id\":\"bec13d6d-3dc0-3f20-ff73-d4fb0b8dcc99\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.extract.MsExtract\",\"parentIndex\":\"1_1\",\"checkBox\":false,\"isLeaf\":true},{\"jsr223\":[],\"resourceId\":\"5f22b989-279b-4417-b896-c3cbcdfd7448\",\"mockEnvironment\":false,\"document\":{\"data\":{\"xml\":[],\"json\":[],\"xmlFollowAPI\":\"false\",\"jsonFollowAPI\":\"false\"},\"enable\":true,\"type\":\"JSON\"},\"xpath2\":[],\"active\":false,\"index\":2,\"jsonPath\":[],\"type\":\"Assertions\",\"duration\":{\"valid\":false,\"enable\":true,\"type\":\"Duration\",\"value\":0},\"regex\":[],\"enable\":true,\"hashTree\":[],\"id\":\"e233298c-845b-5a48-8968-06266ebe775e\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.assertions.MsAssertions\",\"parentIndex\":\"1_2\",\"checkBox\":false,\"isLeaf\":true}],\"id\":\"4975f880-cb88-539d-38c6-01f134011946\",\"responseTimeout\":\"60000\",\"headers\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Content-Type\",\"urlEncode\":false,\"value\":\"application/json\",\"required\":true}],\"rest\":[],\"mockEnvironment\":false,\"method\":\"POST\",\"active\":false,\"index\":1,\"url\":\"\",\"customizeReq\":false,\"referenced\":\"Copy\",\"domain\":\"https://www.jd.com\",\"name\":\"登录ms\",\"isRefEnvironment\":true,\"arguments\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy\",\"doMultipartPost\":false,\"parentIndex\":1,\"requestResult\":[{\"responseResult\":{}}],\"checkBox\":false,\"isBatchProcess\":false,\"isLeaf\":true},{\"resourceId\":\"459089ec-eb03-c66b-1e81-9d6b5905a54f\",\"num\":\"\",\"refType\":\"CASE\",\"type\":\"HTTPSamplerProxy\",\"body\":{\"valid\":true,\"jsonSchema\":{\"$id\":\"http://example.com/root.json\",\"title\":\"The Root Schema\",\"hidden\":true,\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"type\":\"object\",\"properties\":{\"@type\":{\"$id\":\"#/properties/@type\",\"title\":\"The @type Schema\",\"hidden\":true,\"mock\":{\"mock\":\"aaa\"},\"type\":\"string\"}}},\"xml\":false,\"binary\":[],\"json\":true,\"kvs\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"request\",\"type\":\"text\",\"contentType\":\"application/json;boundary=----WebKitFormBoundarybikQMdDG93ZCVD4V\",\"urlEncode\":false,\"value\":\"{\\\"name\\\":\\\"测试1\\\",\\\"module\\\":\\\"f9ee3850-e0a4-4529-99f8-24c6cb9a5e57\\\",\\\"nodePath\\\":\\\"/未规划用例\\\",\\\"maintainer\\\":\\\"zyy\\\",\\\"priority\\\":\\\"P0\\\",\\\"type\\\":\\\"functional\\\",\\\"method\\\":\\\"\\\",\\\"prerequisite\\\":\\\"\\\",\\\"testId\\\":\\\"[]\\\",\\\"otherTestName\\\":\\\"\\\",\\\"steps\\\":\\\"[{\\\\\\\"num\\\\\\\":1,\\\\\\\"desc\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"result\\\\\\\":\\\\\\\"\\\\\\\"}]\\\",\\\"stepDesc\\\":\\\"\\\",\\\"stepResult\\\":\\\"\\\",\\\"selected\\\":[],\\\"remark\\\":\\\"\\\",\\\"tags\\\":\\\"[]\\\",\\\"demandId\\\":\\\"\\\",\\\"demandName\\\":\\\"\\\",\\\"status\\\":\\\"Prepare\\\",\\\"reviewStatus\\\":\\\"Prepare\\\",\\\"stepDescription\\\":\\\"\\\",\\\"expectedResult\\\":\\\"\\\",\\\"stepModel\\\":null,\\\"customNum\\\":\\\"\\\",\\\"followPeople\\\":\\\"\\\",\\\"follows\\\":[],\\\"customFields\\\":\\\"[{\\\\\\\"id\\\\\\\":\\\\\\\"ea902d54-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"责任人\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"zyy\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"member\\\\\\\",\\\\\\\"customData\\\\\\\":null},{\\\\\\\"id\\\\\\\":\\\\\\\"ea91b4b1-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"用例等级\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"P0\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"select\\\\\\\",\\\\\\\"customData\\\\\\\":null},{\\\\\\\"id\\\\\\\":\\\\\\\"ea991a6c-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"用例状态\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"Prepare\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"select\\\\\\\",\\\\\\\"customData\\\\\\\":null}]\\\",\\\"nodeId\\\":\\\"f9ee3850-e0a4-4529-99f8-24c6cb9a5e57\\\",\\\"projectId\\\":\\\"a79ac4e6-c3b7-4d82-8f11-b1c9be05c396\\\",\\\"casePublic\\\":false,\\\"updatedFileList\\\":[]}\",\"required\":false},{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"raw\":\"{\\n \\\"@type\\\": \\\"aaa\\\"\\n}\",\"kV\":false,\"oldKV\":false,\"type\":\"JSON\"},\"path\":\"/test/case/add\",\"protocol\":\"HTTP\",\"enable\":true,\"followRedirects\":true,\"useEnvironment\":\"ec29256c-9523-48ff-b257-755f5daccb60\",\"connectTimeout\":\"60000\",\"hashTree\":[{\"jsr223\":[],\"resourceId\":\"f318347e-2a8f-4bbe-9753-506156d44656\",\"mockEnvironment\":false,\"document\":{\"data\":{\"xml\":[],\"json\":[],\"xmlFollowAPI\":\"false\",\"jsonFollowAPI\":\"false\"},\"enable\":true,\"type\":\"JSON\"},\"xpath2\":[],\"active\":false,\"index\":1,\"jsonPath\":[],\"type\":\"Assertions\",\"duration\":{\"valid\":false,\"enable\":true,\"type\":\"Duration\",\"value\":0},\"regex\":[],\"enable\":true,\"hashTree\":[],\"id\":\"aaa65613-b39c-dc42-852d-17e47366c6cb\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.assertions.MsAssertions\",\"parentIndex\":\"2_1\",\"checkBox\":false,\"isLeaf\":true}],\"id\":\"ab259fed-5328-71f7-8079-e05783a82499\",\"responseTimeout\":\"60000\",\"headers\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Content-Type\",\"urlEncode\":false,\"value\":\"application/json\",\"required\":true},{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"CSRF-TOKEN\",\"urlEncode\":false,\"value\":\"${csrfToken}\",\"required\":true},{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Cookie\",\"urlEncode\":false,\"value\":\"${Cookie}\",\"required\":true},{\"valid\":false,\"file\":false,\"enable\":true,\"urlEncode\":false,\"required\":true}],\"rest\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"mockEnvironment\":false,\"method\":\"POST\",\"active\":true,\"index\":2,\"url\":\"\",\"customizeReq\":false,\"referenced\":\"Copy\",\"domain\":\"https://www.jd.com\",\"name\":\"创建功能用例\",\"isRefEnvironment\":true,\"arguments\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy\",\"doMultipartPost\":false,\"parentIndex\":2,\"requestResult\":[{\"responseResult\":{}}],\"checkBox\":false,\"isBatchProcess\":false,\"isLeaf\":true,\"preSize\":0,\"postSize\":0,\"ruleSize\":0}]}"; - JSONObject element = JSON.parseObject(s, Feature.DisableSpecialKeyDetect); - System.out.println(element); - } } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReferenceIdService.java b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReferenceIdService.java index f23af7607c..31767c2b52 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReferenceIdService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReferenceIdService.java @@ -52,6 +52,12 @@ public class ApiScenarioReferenceIdService { apiScenarioReferenceIdMapper.deleteByExample(example); } + public void deleteByScenarioIds(List scenarioIds) { + ApiScenarioReferenceIdExample example = new ApiScenarioReferenceIdExample(); + example.createCriteria().andApiScenarioIdIn(scenarioIds); + apiScenarioReferenceIdMapper.deleteByExample(example); + } + public void saveApiAndScenarioRelation(ApiScenarioWithBLOBs scenario) { if (scenario.getId() == null) { return; diff --git a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java index 2db3412cde..c0db884daf 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java @@ -631,16 +631,7 @@ public class ApiScenarioReportService { ids.removeAll(reportRequest.getUnSelectIds()); } } - ApiScenarioReportExample example = new ApiScenarioReportExample(); - example.createCriteria().andIdIn(reportRequest.getIds()); - List reportList = apiScenarioReportMapper.selectByExample(example); - // 取出可能是集成报告的ID 放入删除 - reportList.forEach(item -> { - List reportIds = getReportIds(item.getScenarioId()); - if (CollectionUtils.isNotEmpty(reportIds)) { - reportRequest.getIds().addAll(reportIds); - } - }); + List myList = reportRequest.getIds().stream().distinct().collect(Collectors.toList()); reportRequest.setIds(myList); //为预防数量太多,调用删除方法时引起SQL过长的Bug,此处采取分批执行的方式。 diff --git a/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioMapper.java index 8b2dbf1903..9dfde2639a 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioMapper.java @@ -11,7 +11,7 @@ public interface ApiScenarioMapper { int deleteByExample(ApiScenarioExample example); - int deleteByPrimaryKey(String id); + int deleteByPrimaryKey(String id); int insert(ApiScenarioWithBLOBs record); diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.java index d4c2534fc7..0e8d3c09c5 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.java @@ -53,6 +53,8 @@ public interface ExtApiScenarioMapper { List listWithIds(@Param("ids") List ids); + List listWithRefIds(@Param("ids") List ids); + List> listModuleByCollection(@Param("request") ApiScenarioRequest request); String selectNameById(String id); diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.xml index 0808d4e589..24e7c31e55 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.xml @@ -705,4 +705,12 @@ WHERE version_id = #{versionId} AND project_id = #{projectId} ) AND project_id = #{projectId} + diff --git a/backend/src/main/resources/db/migration/V115__1.20__release.sql b/backend/src/main/resources/db/migration/V115__1.20__release.sql index 98770afdd4..d35114966d 100644 --- a/backend/src/main/resources/db/migration/V115__1.20__release.sql +++ b/backend/src/main/resources/db/migration/V115__1.20__release.sql @@ -256,3 +256,54 @@ CREATE PROCEDURE schema_change_api_one() BEGIN END// DELIMITER ; CALL schema_change_api_one(); + + +DROP PROCEDURE IF EXISTS schema_change_plan; +DELIMITER // +CREATE PROCEDURE schema_change_plan() BEGIN + DECLARE CurrentDatabase VARCHAR(100); + SELECT DATABASE() INTO CurrentDatabase; + IF NOT EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema=CurrentDatabase AND table_name = 'test_plan_api_scenario' AND index_name = 'api_scenario_id_index') THEN + ALTER TABLE `test_plan_api_scenario` ADD INDEX api_scenario_id_index ( `api_scenario_id` ); + END IF; +END// +DELIMITER ; +CALL schema_change_plan(); + + +DROP PROCEDURE IF EXISTS schema_change_scenario_one; +DELIMITER // +CREATE PROCEDURE schema_change_scenario_one() BEGIN + DECLARE CurrentDatabase VARCHAR(100); + SELECT DATABASE() INTO CurrentDatabase; + IF NOT EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema=CurrentDatabase AND table_name = 'api_scenario_report' AND index_name = 'scenario_id_index') THEN + ALTER TABLE `api_scenario_report` ADD INDEX scenario_id_index ( `scenario_id` ); + END IF; +END// +DELIMITER ; +CALL schema_change_scenario_one(); + + +DROP PROCEDURE IF EXISTS schema_change_rela_one; +DELIMITER // +CREATE PROCEDURE schema_change_rela_one() BEGIN + DECLARE CurrentDatabase VARCHAR(100); + SELECT DATABASE() INTO CurrentDatabase; + IF NOT EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema=CurrentDatabase AND table_name = 'relationship_edge' AND index_name = 'source_id_index') THEN + ALTER TABLE `relationship_edge` ADD INDEX source_id_index ( `source_id` ); + END IF; +END// +DELIMITER ; +CALL schema_change_rela_one(); + +DROP PROCEDURE IF EXISTS schema_change_rela_two; +DELIMITER // +CREATE PROCEDURE schema_change_rela_two() BEGIN + DECLARE CurrentDatabase VARCHAR(100); + SELECT DATABASE() INTO CurrentDatabase; + IF NOT EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema=CurrentDatabase AND table_name = 'relationship_edge' AND index_name = 'target_id_index') THEN + ALTER TABLE `relationship_edge` ADD INDEX target_id_index ( `target_id` ); + END IF; +END// +DELIMITER ; +CALL schema_change_rela_two(); \ No newline at end of file