diff --git a/backend/src/main/java/io/metersphere/api/cache/TestPlanExecuteInfo.java b/backend/src/main/java/io/metersphere/api/cache/TestPlanExecuteInfo.java new file mode 100644 index 0000000000..32707e34b2 --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/cache/TestPlanExecuteInfo.java @@ -0,0 +1,180 @@ +package io.metersphere.api.cache; + + +import io.metersphere.api.dto.automation.APIScenarioReportResult; +import io.metersphere.base.domain.ApiDefinitionExecResult; +import io.metersphere.commons.constants.TestPlanApiExecuteStatus; +import io.metersphere.commons.constants.TestPlanResourceType; +import lombok.Getter; +import lombok.Setter; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author song.tianyang + * @Date 2021/8/21 5:15 下午 + */ +@Getter +@Setter +public class TestPlanExecuteInfo { + private String reportId; + private Map apiCaseExecInfo = new HashMap<>(); + private Map apiScenarioCaseExecInfo = new HashMap<>(); + private Map loadCaseExecInfo = new HashMap<>(); + + private Map apiCaseExecuteReportMap = new HashMap<>(); + private Map apiScenarioReportReportMap = new HashMap<>(); + private Map loadCaseReportIdMap = new HashMap<>(); + + private boolean reportDataInDataBase; + + int lastUnFinishedNumCount = 0; + long lastFinishedNumCountTime = 0; + + private boolean isApiCaseAllExecuted; + private boolean isScenarioAllExecuted; + private boolean isLoadCaseAllExecuted; + + public synchronized void updateExecuteInfo(Map apiCaseExecInfo, Map apiScenarioCaseExecInfo, Map loadCaseExecInfo) { + if (MapUtils.isNotEmpty(apiCaseExecInfo)) { + this.apiCaseExecInfo.putAll(apiCaseExecInfo); + } + + if (MapUtils.isNotEmpty(apiScenarioCaseExecInfo)) { + this.apiScenarioCaseExecInfo.putAll(apiScenarioCaseExecInfo); + } + + if (MapUtils.isNotEmpty(loadCaseExecInfo)) { + this.loadCaseExecInfo.putAll(loadCaseExecInfo); + } + } + + public synchronized void updateExecuteResult(Map apiCaseExecResultInfo, Map apiScenarioCaseExecResultInfo, Map loadCaseExecResultInfo) { + if (MapUtils.isNotEmpty(apiCaseExecResultInfo)) { + this.apiCaseExecuteReportMap.putAll(apiCaseExecResultInfo); + } + + if (MapUtils.isNotEmpty(apiScenarioCaseExecResultInfo)) { + this.apiScenarioReportReportMap.putAll(apiScenarioCaseExecResultInfo); + } + + if (MapUtils.isNotEmpty(loadCaseExecResultInfo)) { + this.loadCaseReportIdMap.putAll(loadCaseExecResultInfo); + } + } + + public synchronized int countUnFinishedNum() { + int unFinishedCount = 0; + + this.isApiCaseAllExecuted = true; + this.isScenarioAllExecuted = true; + this.isLoadCaseAllExecuted = true; + + for (String result : apiCaseExecInfo.values()) { + if (StringUtils.equalsIgnoreCase(result, TestPlanApiExecuteStatus.RUNNING.name())) { + unFinishedCount++; + if (this.isApiCaseAllExecuted) { + this.isApiCaseAllExecuted = false; + } + } + } + for (String result : apiScenarioCaseExecInfo.values()) { + if (StringUtils.equalsIgnoreCase(result, TestPlanApiExecuteStatus.RUNNING.name())) { + unFinishedCount++; + if (this.isScenarioAllExecuted) { + isScenarioAllExecuted = false; + } + } + } + for (String result : loadCaseExecInfo.values()) { + if (StringUtils.equalsIgnoreCase(result, TestPlanApiExecuteStatus.RUNNING.name())) { + unFinishedCount++; + if (this.isLoadCaseAllExecuted) { + isLoadCaseAllExecuted = false; + } + } + } + if (lastUnFinishedNumCount != unFinishedCount) { + lastUnFinishedNumCount = unFinishedCount; + lastFinishedNumCountTime = System.currentTimeMillis(); + } + return unFinishedCount; + } + + public Map> getExecutedResult() { + Map> resourceTypeMap = new HashMap<>(); + + for (Map.Entry entry : apiCaseExecInfo.entrySet()) { + String resourceId = entry.getKey(); + String executeResult = entry.getValue(); + String resourceType = TestPlanResourceType.API_CASE.name(); + + if (resourceTypeMap.containsKey(resourceType)) { + resourceTypeMap.get(resourceType).put(resourceId, executeResult); + } else { + Map map = new HashMap<>(); + map.put(resourceId, executeResult); + resourceTypeMap.put(resourceType, map); + } + } + + for (Map.Entry entry : apiScenarioCaseExecInfo.entrySet()) { + String resourceId = entry.getKey(); + String executeResult = entry.getValue(); + String resourceType = TestPlanResourceType.SCENARIO_CASE.name(); + + if (resourceTypeMap.containsKey(resourceType)) { + resourceTypeMap.get(resourceType).put(resourceId, executeResult); + } else { + Map map = new HashMap<>(); + map.put(resourceId, executeResult); + resourceTypeMap.put(resourceType, map); + } + } + + for (Map.Entry entry : loadCaseExecInfo.entrySet()) { + String resourceId = entry.getKey(); + String executeResult = entry.getValue(); + String resourceType = TestPlanResourceType.PERFORMANCE_CASE.name(); + + if (resourceTypeMap.containsKey(resourceType)) { + resourceTypeMap.get(resourceType).put(resourceId, executeResult); + } else { + Map map = new HashMap<>(); + map.put(resourceId, executeResult); + resourceTypeMap.put(resourceType, map); + } + } + + return resourceTypeMap; + } + + public void finishAllTask() { + for (Map.Entry entry : apiCaseExecInfo.entrySet()) { + String resourceId = entry.getKey(); + String executeResult = entry.getValue(); + if (StringUtils.equalsIgnoreCase(executeResult, TestPlanApiExecuteStatus.RUNNING.name())) { + apiCaseExecInfo.put(resourceId, TestPlanApiExecuteStatus.FAILD.name()); + } + } + for (Map.Entry entry : apiScenarioCaseExecInfo.entrySet()) { + String resourceId = entry.getKey(); + String executeResult = entry.getValue(); + if (StringUtils.equalsIgnoreCase(executeResult, TestPlanApiExecuteStatus.RUNNING.name())) { + apiScenarioCaseExecInfo.put(resourceId, TestPlanApiExecuteStatus.FAILD.name()); + } + } + for (Map.Entry entry : loadCaseExecInfo.entrySet()) { + String resourceId = entry.getKey(); + String executeResult = entry.getValue(); + if (StringUtils.equalsIgnoreCase(executeResult, TestPlanApiExecuteStatus.RUNNING.name())) { + loadCaseExecInfo.put(resourceId, TestPlanApiExecuteStatus.FAILD.name()); + } + } + + this.countUnFinishedNum(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/api/cache/TestPlanReportExecuteCatch.java b/backend/src/main/java/io/metersphere/api/cache/TestPlanReportExecuteCatch.java new file mode 100644 index 0000000000..eaf9ba7fdd --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/cache/TestPlanReportExecuteCatch.java @@ -0,0 +1,78 @@ +package io.metersphere.api.cache; + +import io.metersphere.api.dto.automation.APIScenarioReportResult; +import io.metersphere.base.domain.ApiDefinitionExecResult; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author song.tianyang + * @Date 2021/8/20 3:29 下午 + */ +public class TestPlanReportExecuteCatch { + private static Map testPlanReportMap = new HashMap<>(); + + private TestPlanReportExecuteCatch() { + } + + public synchronized static void addApiTestPlanExecuteInfo(String reportId, + Map apiCaseExecInfo, Map apiScenarioCaseExecInfo, Map loadCaseExecInfo) { + if(testPlanReportMap == null){ + testPlanReportMap = new HashMap<>(); + } + if(apiCaseExecInfo == null){ + apiCaseExecInfo = new HashMap<>(); + } + if(apiScenarioCaseExecInfo == null){ + apiScenarioCaseExecInfo = new HashMap<>(); + } + if(loadCaseExecInfo == null){ + loadCaseExecInfo = new HashMap<>(); + } + + TestPlanExecuteInfo executeInfo = new TestPlanExecuteInfo(); + executeInfo.setReportId(reportId); + executeInfo.setApiCaseExecInfo(apiCaseExecInfo); + executeInfo.setApiScenarioCaseExecInfo(apiScenarioCaseExecInfo); + executeInfo.setLoadCaseExecInfo(loadCaseExecInfo); + testPlanReportMap.put(reportId,executeInfo); + } + + public synchronized static void updateApiTestPlanExecuteInfo(String reportId, + Map apiCaseExecInfo, Map apiScenarioCaseExecInfo, Map loadCaseExecInfo) { + if(testPlanReportMap != null && testPlanReportMap.containsKey(reportId)){ + testPlanReportMap.get(reportId).updateExecuteInfo(apiCaseExecInfo,apiScenarioCaseExecInfo,loadCaseExecInfo); + } + } + + public synchronized static void updateTestPlanExecuteResultInfo(String reportId, + Map apiCaseExecResultInfo, Map apiScenarioCaseExecResultInfo, Map loadCaseExecResultInfo) { + if(testPlanReportMap != null && testPlanReportMap.containsKey(reportId)){ + testPlanReportMap.get(reportId).updateExecuteResult(apiCaseExecResultInfo,apiScenarioCaseExecResultInfo,loadCaseExecResultInfo); + } + } + + + public static TestPlanExecuteInfo getTestPlanExecuteInfo(String reportId){ + return testPlanReportMap.get(reportId); + } + + public static synchronized void setReportDataCheckResult(String reportId, boolean result) { + if(testPlanReportMap.containsKey(reportId)){ + testPlanReportMap.get(reportId).setReportDataInDataBase(result); + } + } + + public static synchronized void remove(String reportId){ + if(testPlanReportMap.containsKey(reportId)){ + testPlanReportMap.remove(reportId); + } + } + + public static void finishAllTask(String planReportId) { + if(testPlanReportMap.containsKey(planReportId)){ + testPlanReportMap.get(planReportId).finishAllTask(); + } + } +} diff --git a/backend/src/main/java/io/metersphere/api/controller/APIScenarioReportController.java b/backend/src/main/java/io/metersphere/api/controller/APIScenarioReportController.java index ef9dd352a8..17e5bae0c7 100644 --- a/backend/src/main/java/io/metersphere/api/controller/APIScenarioReportController.java +++ b/backend/src/main/java/io/metersphere/api/controller/APIScenarioReportController.java @@ -10,10 +10,12 @@ import io.metersphere.api.dto.automation.ExecuteType; import io.metersphere.api.jmeter.TestResult; import io.metersphere.api.service.ApiScenarioReportService; import io.metersphere.api.service.MsResultService; +import io.metersphere.commons.constants.NoticeConstants; import io.metersphere.commons.constants.OperLogConstants; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; import io.metersphere.log.annotation.MsAuditLog; +import io.metersphere.notice.annotation.SendNotice; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -47,6 +49,8 @@ public class APIScenarioReportController { @PostMapping("/delete") @MsAuditLog(module = "api_automation_report", type = OperLogConstants.DELETE, beforeEvent = "#msClass.getLogDetails(#request.id)", msClass = ApiScenarioReportService.class) + @SendNotice(taskType = NoticeConstants.TaskType.API_REPORT_TASK, event = NoticeConstants.Event.DELETE, target = "#targetClass.get(#request.id)", targetClass = ApiScenarioReportService.class, + mailTemplate = "api/ReportDelete", subject = "接口报告通知") public void delete(@RequestBody DeleteAPIReportRequest request) { apiReportService.delete(request); } diff --git a/backend/src/main/java/io/metersphere/api/controller/APITestController.java b/backend/src/main/java/io/metersphere/api/controller/APITestController.java index 1123352bca..9cdd015ef2 100644 --- a/backend/src/main/java/io/metersphere/api/controller/APITestController.java +++ b/backend/src/main/java/io/metersphere/api/controller/APITestController.java @@ -1,6 +1,5 @@ package io.metersphere.api.controller; -import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import io.metersphere.api.dto.*; @@ -11,11 +10,13 @@ import io.metersphere.api.dto.datacount.response.ApiDataCountDTO; import io.metersphere.api.dto.datacount.response.ExecutedCaseInfoDTO; import io.metersphere.api.dto.datacount.response.TaskInfoResult; import io.metersphere.api.dto.definition.RunDefinitionRequest; -import io.metersphere.api.dto.definition.request.ParameterConfig; -import io.metersphere.api.dto.scenario.environment.EnvironmentConfig; import io.metersphere.api.dto.scenario.request.dubbo.RegistryCenter; import io.metersphere.api.service.*; -import io.metersphere.base.domain.*; +import io.metersphere.base.domain.ApiDefinition; +import io.metersphere.base.domain.ApiScenarioWithBLOBs; +import io.metersphere.base.domain.ApiTest; +import io.metersphere.base.domain.Schedule; +import io.metersphere.commons.constants.NoticeConstants; import io.metersphere.commons.utils.CronUtils; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; @@ -24,15 +25,19 @@ import io.metersphere.controller.request.BaseQueryRequest; import io.metersphere.controller.request.QueryScheduleRequest; import io.metersphere.controller.request.ScheduleRequest; import io.metersphere.dto.ScheduleDao; +import io.metersphere.notice.annotation.SendNotice; import io.metersphere.service.CheckPermissionService; import io.metersphere.service.ScheduleService; -import org.apache.jorphan.collections.HashTree; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.text.DecimalFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; import static io.metersphere.commons.utils.JsonPathUtils.getListJson; @@ -41,6 +46,7 @@ import static io.metersphere.commons.utils.JsonPathUtils.getListJson; @RequestMapping(value = "/api") public class APITestController { @Resource + @Lazy private APITestService apiTestService; @Resource private ApiDefinitionService apiDefinitionService; @@ -250,7 +256,7 @@ public class APITestController { apiCountResult.setThisWeekAddedCount(dateCountByCreateInThisWeek); long executedInThisWeekCountNumber = apiScenarioReportService.countByProjectIdAndCreateInThisWeek(projectId); apiCountResult.setThisWeekExecutedCount(executedInThisWeekCountNumber); - long executedCountNumber = apiScenarioReportService.countByProjectID(projectId); + long executedCountNumber = apiAutomationService.countExecuteTimesByProjectID(projectId); apiCountResult.setExecutedCount(executedCountNumber); //未执行、未通过、已通过 @@ -359,10 +365,12 @@ public class APITestController { } @PostMapping(value = "/schedule/updateEnableByPrimyKey") - public void updateScheduleEnableByPrimyKey(@RequestBody ScheduleInfoRequest request) { + @SendNotice(taskType = NoticeConstants.TaskType.API_HOME_TASK, event = NoticeConstants.Event.CLOSE_SCHEDULE, mailTemplate = "api/ScheduleClose", subject = "接口测试通知") + public Schedule updateScheduleEnableByPrimyKey(@RequestBody ScheduleInfoRequest request) { Schedule schedule = scheduleService.getSchedule(request.getTaskID()); schedule.setEnable(request.isEnable()); apiAutomationService.updateSchedule(schedule); + return schedule; } @PostMapping(value = "/historicalDataUpgrade") diff --git a/backend/src/main/java/io/metersphere/api/controller/ApiAutomationController.java b/backend/src/main/java/io/metersphere/api/controller/ApiAutomationController.java index 2e490f69b2..5b0c4e3311 100644 --- a/backend/src/main/java/io/metersphere/api/controller/ApiAutomationController.java +++ b/backend/src/main/java/io/metersphere/api/controller/ApiAutomationController.java @@ -11,14 +11,12 @@ import io.metersphere.api.service.ApiAutomationService; import io.metersphere.base.domain.ApiScenario; import io.metersphere.base.domain.ApiScenarioWithBLOBs; import io.metersphere.base.domain.Schedule; -import io.metersphere.commons.constants.ApiRunMode; -import io.metersphere.commons.constants.OperLogConstants; -import io.metersphere.commons.constants.PermissionConstants; -import io.metersphere.commons.constants.TriggerMode; +import io.metersphere.commons.constants.*; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; import io.metersphere.controller.request.ScheduleRequest; import io.metersphere.log.annotation.MsAuditLog; +import io.metersphere.notice.annotation.SendNotice; import io.metersphere.track.request.testcase.ApiCaseRelevanceRequest; import io.metersphere.track.request.testplan.FileOperationRequest; import org.apache.commons.lang3.StringUtils; @@ -89,6 +87,7 @@ public class ApiAutomationController { @PostMapping(value = "/create") @MsAuditLog(module = "api_automation", type = OperLogConstants.CREATE, title = "#request.name", content = "#msClass.getLogDetails(#request.id)", msClass = ApiAutomationService.class) @RequiresPermissions(PermissionConstants.PROJECT_API_SCENARIO_READ_CREATE) + @SendNotice(taskType = NoticeConstants.TaskType.API_AUTOMATION_TASK, event = NoticeConstants.Event.CREATE, mailTemplate = "api/AutomationCreate", subject = "接口自动化通知") public ApiScenario create(@RequestPart("request") SaveApiScenarioRequest request, @RequestPart(value = "bodyFiles", required = false) List bodyFiles, @RequestPart(value = "scenarioFiles", required = false) List scenarioFiles) { return apiAutomationService.create(request, bodyFiles, scenarioFiles); @@ -97,9 +96,10 @@ public class ApiAutomationController { @PostMapping(value = "/update") @MsAuditLog(module = "api_automation", type = OperLogConstants.UPDATE, beforeEvent = "#msClass.getLogDetails(#request.id)", title = "#request.name", content = "#msClass.getLogDetails(#request.id)", msClass = ApiAutomationService.class) @RequiresPermissions(PermissionConstants.PROJECT_API_SCENARIO_READ_EDIT) - public void update(@RequestPart("request") SaveApiScenarioRequest request, @RequestPart(value = "bodyFiles", required = false) List bodyFiles, - @RequestPart(value = "scenarioFiles", required = false) List scenarioFiles) { - apiAutomationService.update(request, bodyFiles, scenarioFiles); + @SendNotice(taskType = NoticeConstants.TaskType.API_AUTOMATION_TASK, event = NoticeConstants.Event.UPDATE, mailTemplate = "api/AutomationUpdate", subject = "接口自动化通知") + public ApiScenario update(@RequestPart("request") SaveApiScenarioRequest request, @RequestPart(value = "bodyFiles", required = false) List bodyFiles, + @RequestPart(value = "scenarioFiles", required = false) List scenarioFiles) { + return apiAutomationService.update(request, bodyFiles, scenarioFiles); } @GetMapping("/delete/{id}") @@ -123,12 +123,16 @@ public class ApiAutomationController { @PostMapping("/removeToGc") @MsAuditLog(module = "api_automation", type = OperLogConstants.GC, beforeEvent = "#msClass.getLogDetails(#ids)", msClass = ApiAutomationService.class) + @SendNotice(taskType = NoticeConstants.TaskType.API_AUTOMATION_TASK, target = "#targetClass.getApiScenarios(#ids)", targetClass = ApiAutomationService.class, + event = NoticeConstants.Event.DELETE, mailTemplate = "api/AutomationDelete", subject = "接口自动化通知") public void removeToGc(@RequestBody List ids) { apiAutomationService.removeToGc(ids); } @PostMapping("/removeToGcByBatch") @MsAuditLog(module = "api_automation", type = OperLogConstants.BATCH_GC, beforeEvent = "#msClass.getLogDetails(#request.ids)", msClass = ApiAutomationService.class) + @SendNotice(taskType = NoticeConstants.TaskType.API_AUTOMATION_TASK, target = "#targetClass.getApiScenarios(#request.ids)", targetClass = ApiAutomationService.class, + event = NoticeConstants.Event.DELETE, mailTemplate = "api/AutomationDelete", subject = "接口自动化通知") public void removeToGcByBatch(@RequestBody ApiScenarioBatchRequest request) { apiAutomationService.removeToGcByBatch(request); } @@ -267,8 +271,9 @@ public class ApiAutomationController { } @PostMapping("/batchCopy") - public void batchCopy(@RequestBody ApiScenarioBatchRequest request) { - apiAutomationService.batchCopy(request); + public BatchOperaResponse batchCopy(@RequestBody ApiScenarioBatchRequest request) { + BatchOperaResponse response = apiAutomationService.batchCopy(request); + return response; } diff --git a/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java b/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java index 16c7e5cc7b..128bc61840 100644 --- a/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java +++ b/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java @@ -18,6 +18,7 @@ import io.metersphere.base.domain.ApiDefinition; import io.metersphere.base.domain.ApiDefinitionWithBLOBs; import io.metersphere.base.domain.ApiTestEnvironmentWithBLOBs; import io.metersphere.base.domain.Schedule; +import io.metersphere.commons.constants.NoticeConstants; import io.metersphere.commons.constants.OperLogConstants; import io.metersphere.commons.constants.PermissionConstants; import io.metersphere.commons.json.JSONSchemaGenerator; @@ -25,6 +26,7 @@ import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; import io.metersphere.controller.request.ScheduleRequest; import io.metersphere.log.annotation.MsAuditLog; +import io.metersphere.notice.annotation.SendNotice; import io.metersphere.service.CheckPermissionService; import io.metersphere.service.ScheduleService; import io.metersphere.track.request.testcase.ApiCaseRelevanceRequest; @@ -89,6 +91,7 @@ public class ApiDefinitionController { @PostMapping(value = "/create", consumes = {"multipart/form-data"}) @RequiresPermissions(PermissionConstants.PROJECT_API_DEFINITION_READ_CREATE_API) @MsAuditLog(module = "api_definition", type = OperLogConstants.CREATE, title = "#request.name", content = "#msClass.getLogDetails(#request.id)", msClass = ApiDefinitionService.class) + @SendNotice(taskType = NoticeConstants.TaskType.API_DEFINITION_TASK, event = NoticeConstants.Event.CREATE, mailTemplate = "api/DefinitionCreate", subject = "接口定义通知") public ApiDefinitionWithBLOBs create(@RequestPart("request") SaveApiDefinitionRequest request, @RequestPart(value = "files", required = false) List bodyFiles) { checkPermissionService.checkProjectOwner(request.getProjectId()); return apiDefinitionService.create(request, bodyFiles); @@ -97,6 +100,7 @@ public class ApiDefinitionController { @PostMapping(value = "/update", consumes = {"multipart/form-data"}) @RequiresPermissions(PermissionConstants.PROJECT_API_DEFINITION_READ_EDIT_API) @MsAuditLog(module = "api_definition", type = OperLogConstants.UPDATE, beforeEvent = "#msClass.getLogDetails(#request.id)", title = "#request.name", content = "#msClass.getLogDetails(#request.id)", msClass = ApiDefinitionService.class) + @SendNotice(taskType = NoticeConstants.TaskType.API_DEFINITION_TASK, event = NoticeConstants.Event.UPDATE, mailTemplate = "api/DefinitionUpdate", subject = "接口定义通知") public ApiDefinitionWithBLOBs update(@RequestPart("request") SaveApiDefinitionRequest request, @RequestPart(value = "files", required = false) List bodyFiles) { checkPermissionService.checkProjectOwner(request.getProjectId()); return apiDefinitionService.update(request, bodyFiles); @@ -134,6 +138,8 @@ public class ApiDefinitionController { @PostMapping("/removeToGc") @RequiresPermissions(PermissionConstants.PROJECT_API_DEFINITION_READ_DELETE_API) @MsAuditLog(module = "api_definition", type = OperLogConstants.GC, beforeEvent = "#msClass.getLogDetails(#ids)", msClass = ApiDefinitionService.class) + @SendNotice(taskType = NoticeConstants.TaskType.API_DEFINITION_TASK, target = "#targetClass.getBLOBs(#ids)", targetClass = ApiDefinitionService.class, + event = NoticeConstants.Event.DELETE, mailTemplate = "api/DefinitionDelete", subject = "接口定义通知") public void removeToGc(@RequestBody List ids) { apiDefinitionService.removeToGc(ids); } @@ -189,6 +195,11 @@ public class ApiDefinitionController { return apiDefinitionService.getDbResult(testId, type); } + @GetMapping("/report/plan/getReport/{testId}/{type}") + public APIReportResult getTestPlanApiCaseReport(@PathVariable String testId, @PathVariable String type) { + return apiDefinitionService.getTestPlanApiCaseReport(testId, type); + } + @PostMapping(value = "/import", consumes = {"multipart/form-data"}) @RequiresPermissions(PermissionConstants.PROJECT_API_DEFINITION_READ_IMPORT_API) @MsAuditLog(module = "api_definition", type = OperLogConstants.IMPORT, sourceId = "#request.id", title = "#request.name", project = "#request.projectId") @@ -281,12 +292,7 @@ public class ApiDefinitionController { @GetMapping("/getMockEnvironment/{projectId}/{protocal}") public ApiTestEnvironmentWithBLOBs getMockEnvironment(@PathVariable String projectId, @PathVariable String protocal, HttpServletRequest request) { - String requestUrl = request.getRequestURL().toString(); - String baseUrl = ""; - if (requestUrl.contains("/api/definition")) { - baseUrl = requestUrl.split("/api/definition")[0]; - } - return apiTestEnvironmentService.getMockEnvironmentByProjectId(projectId, protocal, baseUrl); + return apiTestEnvironmentService.getMockEnvironmentByProjectId(projectId); } } diff --git a/backend/src/main/java/io/metersphere/api/controller/ApiTestCaseController.java b/backend/src/main/java/io/metersphere/api/controller/ApiTestCaseController.java index 88a2f50c9f..65582e6fab 100644 --- a/backend/src/main/java/io/metersphere/api/controller/ApiTestCaseController.java +++ b/backend/src/main/java/io/metersphere/api/controller/ApiTestCaseController.java @@ -8,10 +8,12 @@ import io.metersphere.api.dto.definition.*; import io.metersphere.api.service.ApiTestCaseService; import io.metersphere.base.domain.ApiTestCase; import io.metersphere.base.domain.ApiTestCaseWithBLOBs; +import io.metersphere.commons.constants.NoticeConstants; import io.metersphere.commons.constants.OperLogConstants; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; import io.metersphere.log.annotation.MsAuditLog; +import io.metersphere.notice.annotation.SendNotice; import io.metersphere.track.request.testcase.ApiCaseRelevanceRequest; import io.metersphere.track.service.TestPlanApiCaseService; import org.springframework.web.bind.annotation.*; @@ -81,12 +83,14 @@ public class ApiTestCaseController { @PostMapping(value = "/create", consumes = {"multipart/form-data"}) @MsAuditLog(module = "api_definition", type = OperLogConstants.CREATE, title = "#request.name", content = "#msClass.getLogDetails(#request)", msClass = ApiTestCaseService.class) + @SendNotice(taskType = NoticeConstants.TaskType.API_DEFINITION_TASK, event = NoticeConstants.Event.CASE_CREATE, mailTemplate = "api/CaseCreate", subject = "接口用例通知") public ApiTestCase create(@RequestPart("request") SaveApiTestCaseRequest request, @RequestPart(value = "files", required = false) List bodyFiles) { return apiTestCaseService.create(request, bodyFiles); } @PostMapping(value = "/update", consumes = {"multipart/form-data"}) @MsAuditLog(module = "api_definition", type = OperLogConstants.UPDATE, beforeEvent = "#msClass.getLogDetails(#request)", title = "#request.name", content = "#msClass.getLogDetails(#request)", msClass = ApiTestCaseService.class) + @SendNotice(taskType = NoticeConstants.TaskType.API_DEFINITION_TASK, event = NoticeConstants.Event.CASE_UPDATE, mailTemplate = "api/CaseUpdate", subject = "接口用例通知") public ApiTestCase update(@RequestPart("request") SaveApiTestCaseRequest request, @RequestPart(value = "files", required = false) List bodyFiles) { return apiTestCaseService.update(request, bodyFiles); } @@ -99,9 +103,12 @@ public class ApiTestCaseController { @GetMapping("/deleteToGc/{id}") @MsAuditLog(module = "api_definition", type = OperLogConstants.DELETE, beforeEvent = "#msClass.getLogDetails(#id)", msClass = ApiTestCaseService.class) + @SendNotice(taskType = NoticeConstants.TaskType.API_DEFINITION_TASK, event = NoticeConstants.Event.CASE_DELETE,target = "#targetClass.get(#id)", targetClass = ApiTestCaseService.class, + mailTemplate = "api/CaseDelete", subject = "接口用例通知") public void deleteToGc(@PathVariable String id) { apiTestCaseService.deleteToGc(id); } + @PostMapping("/removeToGc") @MsAuditLog(module = "api_definition", type = OperLogConstants.GC, beforeEvent = "#msClass.getLogDetails(#ids)", msClass = ApiTestCaseService.class) public void removeToGc(@RequestBody List ids) { @@ -123,6 +130,7 @@ public class ApiTestCaseController { public void editApiBathByParam(@RequestBody ApiTestBatchRequest request) { apiTestCaseService.editApiBathByParam(request); } + @PostMapping("/reduction") @MsAuditLog(module = "api_definition", type = OperLogConstants.RESTORE, beforeEvent = "#msClass.getLogDetails(#request.ids)", content = "#msClass.getLogDetails(#request.ids)", msClass = ApiTestCaseService.class) public List reduction(@RequestBody ApiTestBatchRequest request) { @@ -147,6 +155,7 @@ public class ApiTestCaseController { public void deleteToGcByParam(@RequestBody ApiTestBatchRequest request) { apiTestCaseService.deleteToGcByParam(request); } + @PostMapping("/checkDeleteDatas") public DeleteCheckResult checkDeleteDatas(@RequestBody ApiTestBatchRequest request) { return apiTestCaseService.checkDeleteDatas(request); diff --git a/backend/src/main/java/io/metersphere/api/controller/ApiTestEnvironmentController.java b/backend/src/main/java/io/metersphere/api/controller/ApiTestEnvironmentController.java index 72ae0700dc..7acf0f4084 100644 --- a/backend/src/main/java/io/metersphere/api/controller/ApiTestEnvironmentController.java +++ b/backend/src/main/java/io/metersphere/api/controller/ApiTestEnvironmentController.java @@ -86,4 +86,8 @@ public class ApiTestEnvironmentController { apiTestEnvironmentService.delete(id); } + @GetMapping("/getTcpMockInfo/{projectId}") + public String getMockInfo(@PathVariable(value = "projectId") String projectId) { + return apiTestEnvironmentService.getMockInfo(projectId); + } } diff --git a/backend/src/main/java/io/metersphere/api/controller/MockApiController.java b/backend/src/main/java/io/metersphere/api/controller/MockApiController.java index de11fa5b2a..453a42b928 100644 --- a/backend/src/main/java/io/metersphere/api/controller/MockApiController.java +++ b/backend/src/main/java/io/metersphere/api/controller/MockApiController.java @@ -2,6 +2,7 @@ package io.metersphere.api.controller; import io.metersphere.api.service.ApiDefinitionService; import io.metersphere.api.service.MockConfigService; +import io.metersphere.api.tcp.TCPPool; import io.metersphere.base.domain.Project; import io.metersphere.controller.handler.annotation.NoResultHolder; import io.metersphere.service.ProjectService; @@ -79,4 +80,9 @@ public class MockApiController { Project project = projectService.findBySystemId(projectSystemId); mockConfigService.checkReturnWithMockExpectByUrlParam("HEAD", project, request, response); } + + @GetMapping("/getTcpMockPortStatus/") + public String genTcpMockPort(){ + return TCPPool.getTcpStatus(); + } } diff --git a/backend/src/main/java/io/metersphere/api/controller/ApiDocumentController.java b/backend/src/main/java/io/metersphere/api/controller/ShareInfoController.java similarity index 60% rename from backend/src/main/java/io/metersphere/api/controller/ApiDocumentController.java rename to backend/src/main/java/io/metersphere/api/controller/ShareInfoController.java index def8c197c9..142cc42741 100644 --- a/backend/src/main/java/io/metersphere/api/controller/ApiDocumentController.java +++ b/backend/src/main/java/io/metersphere/api/controller/ShareInfoController.java @@ -1,14 +1,13 @@ package io.metersphere.api.controller; -import io.metersphere.api.dto.document.ApiDocumentInfoDTO; -import io.metersphere.api.dto.document.ApiDocumentRequest; -import io.metersphere.api.dto.document.ApiDocumentShareDTO; -import io.metersphere.api.dto.document.ApiDocumentShareRequest; -import io.metersphere.api.service.APITestService; +import io.metersphere.api.dto.share.ApiDocumentInfoDTO; +import io.metersphere.api.dto.share.ApiDocumentRequest; +import io.metersphere.api.dto.share.ApiDocumentShareRequest; +import io.metersphere.api.dto.share.ShareInfoDTO; import io.metersphere.api.service.ApiDefinitionService; -import io.metersphere.api.service.ApiDocumentService; +import io.metersphere.api.service.ShareInfoService; import io.metersphere.base.domain.ApiDefinitionWithBLOBs; -import io.metersphere.base.domain.ApiDocumentShare; +import io.metersphere.base.domain.ShareInfo; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -23,21 +22,24 @@ import java.util.stream.Collectors; * @Description */ @RestController -@RequestMapping(value = "/api/document") -public class ApiDocumentController { +@RequestMapping(value = "/share/info") +public class ShareInfoController { @Resource - ApiDocumentService apiDocumentService; + ShareInfoService shareInfoService; @Resource ApiDefinitionService apiDefinitionService; - @Resource - APITestService apiTestService; @PostMapping("/selectApiSimpleInfo") public List list(@RequestBody ApiDocumentRequest request) { - List returnList = apiDocumentService.findApiDocumentSimpleInfoByRequest(request); + List returnList = shareInfoService.findApiDocumentSimpleInfoByRequest(request); return returnList; } + @GetMapping("/get/{id}") + public ShareInfo get(@PathVariable String id) { + return shareInfoService.get(id); + } + @PostMapping("/selectApiInfoByParam") public List selectApiInfoByParam(@RequestBody ApiDocumentRequest request) { List returnList = new ArrayList<>(); @@ -52,7 +54,7 @@ public class ApiDocumentController { model.setId(id); model.setName(id); } - ApiDocumentInfoDTO returnDTO = apiDocumentService.conversionModelToDTO(model); + ApiDocumentInfoDTO returnDTO = shareInfoService.conversionModelToDTO(model); returnList.add(returnDTO); } } @@ -64,7 +66,7 @@ public class ApiDocumentController { ApiDefinitionWithBLOBs apiModel = apiDefinitionService.getBLOBs(id); ApiDocumentInfoDTO returnDTO = new ApiDocumentInfoDTO(); try{ - returnDTO = apiDocumentService.conversionModelToDTO(apiModel); + returnDTO = shareInfoService.conversionModelToDTO(apiModel); }catch (Exception e){ e.printStackTrace(); } @@ -73,9 +75,16 @@ public class ApiDocumentController { } @PostMapping("/generateApiDocumentShareInfo") - public ApiDocumentShareDTO generateApiDocumentShareInfo(@RequestBody ApiDocumentShareRequest request) { - ApiDocumentShare apiShare = apiDocumentService.generateApiDocumentShare(request); - ApiDocumentShareDTO returnDTO = apiDocumentService.conversionApiDocumentShareToDTO(apiShare); + public ShareInfoDTO generateApiDocumentShareInfo(@RequestBody ApiDocumentShareRequest request) { + ShareInfo apiShare = shareInfoService.generateApiDocumentShareInfo(request); + ShareInfoDTO returnDTO = shareInfoService.conversionShareInfoToDTO(apiShare); + return returnDTO; + } + + @PostMapping("/generateShareInfo") + public ShareInfoDTO generateShareInfo(@RequestBody ShareInfo request) { + ShareInfo apiShare = shareInfoService.generateShareInfo(request); + ShareInfoDTO returnDTO = shareInfoService.conversionShareInfoToDTO(apiShare); return returnDTO; } } diff --git a/backend/src/main/java/io/metersphere/api/dto/BatchOperaResponse.java b/backend/src/main/java/io/metersphere/api/dto/BatchOperaResponse.java new file mode 100644 index 0000000000..c53d3ae618 --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/dto/BatchOperaResponse.java @@ -0,0 +1,10 @@ +package io.metersphere.api.dto; + +/** + * @author song.tianyang + * @Date 2021/8/23 4:17 下午 + */ +public class BatchOperaResponse { + public boolean result = false; + public String errorMsg; +} diff --git a/backend/src/main/java/io/metersphere/api/dto/automation/ApiScenarioDTO.java b/backend/src/main/java/io/metersphere/api/dto/automation/ApiScenarioDTO.java index 1e372b8953..117302645b 100644 --- a/backend/src/main/java/io/metersphere/api/dto/automation/ApiScenarioDTO.java +++ b/backend/src/main/java/io/metersphere/api/dto/automation/ApiScenarioDTO.java @@ -16,7 +16,6 @@ public class ApiScenarioDTO extends ApiScenarioWithBLOBs { private String principalName; private List tagNames; private String deleteUser; - private Long deleteTime; /** * 场景跨项目ID @@ -24,4 +23,5 @@ public class ApiScenarioDTO extends ApiScenarioWithBLOBs { private List projectIds; private String caseId; + private String environment; } diff --git a/backend/src/main/java/io/metersphere/api/dto/automation/EsbDataStruct.java b/backend/src/main/java/io/metersphere/api/dto/automation/EsbDataStruct.java index 295cd9fdd0..b9aab28d66 100644 --- a/backend/src/main/java/io/metersphere/api/dto/automation/EsbDataStruct.java +++ b/backend/src/main/java/io/metersphere/api/dto/automation/EsbDataStruct.java @@ -2,6 +2,7 @@ package io.metersphere.api.dto.automation; import lombok.Getter; import lombok.Setter; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.dom4j.Document; import org.dom4j.Element; @@ -177,4 +178,22 @@ public class EsbDataStruct { } return element; } + + public List getNameDeep() { + List returnList = new ArrayList<>(); + if(StringUtils.isNotEmpty(this.name)){ + returnList.add(this.name); + } + if(CollectionUtils.isNotEmpty(this.children)){ + for (EsbDataStruct child :this.children) { + List itemNameList = child.getNameDeep(); + for (String itemName :itemNameList) { + if(!returnList.contains(itemName)){ + returnList.add(itemName); + } + } + } + } + return returnList; + } } diff --git a/backend/src/main/java/io/metersphere/api/dto/automation/RunModeConfig.java b/backend/src/main/java/io/metersphere/api/dto/automation/RunModeConfig.java index 7dbb8525d6..fb8b9b2515 100644 --- a/backend/src/main/java/io/metersphere/api/dto/automation/RunModeConfig.java +++ b/backend/src/main/java/io/metersphere/api/dto/automation/RunModeConfig.java @@ -2,6 +2,8 @@ package io.metersphere.api.dto.automation; import lombok.Data; +import java.util.Map; + @Data public class RunModeConfig { private String mode; @@ -10,4 +12,9 @@ public class RunModeConfig { private String reportId; private boolean onSampleError; private String resourcePoolId; + + /** + * 运行环境 + */ + private Map envMap; } diff --git a/backend/src/main/java/io/metersphere/api/dto/automation/TcpTreeTableDataStruct.java b/backend/src/main/java/io/metersphere/api/dto/automation/TcpTreeTableDataStruct.java index ba20dfb0e8..7d4ddf1db9 100644 --- a/backend/src/main/java/io/metersphere/api/dto/automation/TcpTreeTableDataStruct.java +++ b/backend/src/main/java/io/metersphere/api/dto/automation/TcpTreeTableDataStruct.java @@ -2,6 +2,7 @@ package io.metersphere.api.dto.automation; import lombok.Getter; import lombok.Setter; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.dom4j.Document; import org.dom4j.Element; @@ -11,7 +12,7 @@ import java.util.List; import java.util.UUID; /** - * //ESB数据格式 + * 树形表格数据格式 * * @author song.tianyang * @Date 2021/3/15 4:37 下午 @@ -181,4 +182,22 @@ public class TcpTreeTableDataStruct { } return element; } + + public List getNameDeep() { + List returnList = new ArrayList<>(); + if(StringUtils.isNotEmpty(this.name)){ + returnList.add(this.name); + } + if(CollectionUtils.isNotEmpty(this.children)){ + for (TcpTreeTableDataStruct child :this.children) { + List itemNameList = child.getNameDeep(); + for (String itemName :itemNameList) { + if(!returnList.contains(itemName)){ + returnList.add(itemName); + } + } + } + } + return returnList; + } } diff --git a/backend/src/main/java/io/metersphere/api/dto/automation/TestPlanFailureApiDTO.java b/backend/src/main/java/io/metersphere/api/dto/automation/TestPlanFailureApiDTO.java new file mode 100644 index 0000000000..097f829e2b --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/dto/automation/TestPlanFailureApiDTO.java @@ -0,0 +1,16 @@ +package io.metersphere.api.dto.automation; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.metersphere.api.dto.definition.TestPlanApiCaseDTO; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@JsonInclude(JsonInclude.Include.NON_NULL) +public class TestPlanFailureApiDTO extends TestPlanApiCaseDTO { + + private String projectName; + + private String response; +} diff --git a/backend/src/main/java/io/metersphere/api/dto/automation/TestPlanFailureScenarioDTO.java b/backend/src/main/java/io/metersphere/api/dto/automation/TestPlanFailureScenarioDTO.java new file mode 100644 index 0000000000..f1c7fa6d6c --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/dto/automation/TestPlanFailureScenarioDTO.java @@ -0,0 +1,12 @@ +package io.metersphere.api.dto.automation; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@JsonInclude(JsonInclude.Include.NON_NULL) +public class TestPlanFailureScenarioDTO extends ApiScenarioDTO { + private APIScenarioReportResult response; +} diff --git a/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsJmeterParser.java b/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsJmeterParser.java index f5a4c92edd..549060a126 100644 --- a/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsJmeterParser.java +++ b/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsJmeterParser.java @@ -333,6 +333,7 @@ public class MsJmeterParser extends ApiImportAbstractParser { msTCPSampler.setRequest(tcpSampler.getRequestData()); msTCPSampler.setUsername(tcpSampler.getProperty(ConfigTestElement.USERNAME).getStringValue()); msTCPSampler.setPassword(tcpSampler.getProperty(ConfigTestElement.PASSWORD).getStringValue()); + msTCPSampler.setClassname(tcpSampler.getClassname()); } private void convertDubboSample(MsDubboSampler elementNode, DubboSample sampler) { diff --git a/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsScenarioParser.java b/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsScenarioParser.java index 2f82272546..9f16baa44c 100644 --- a/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsScenarioParser.java +++ b/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsScenarioParser.java @@ -65,6 +65,20 @@ public class MsScenarioParser extends MsAbstractParser { return scenarioWithBLOBs; } + private void formatHashTree(JSONArray hashTree) { + if (CollectionUtils.isNotEmpty(hashTree)) { + for (int i = 0; i < hashTree.size(); i++) { + JSONObject object = (JSONObject) hashTree.get(i); + object.put("index", i + 1); + object.put("resourceId", UUID.randomUUID().toString()); + hashTree.set(i, object); + if (CollectionUtils.isNotEmpty(object.getJSONArray("hashTree"))) { + formatHashTree(object.getJSONArray("hashTree")); + } + } + } + } + private ScenarioImport parseMsFormat(String testStr, ApiTestImportRequest importRequest) { ScenarioImport scenarioImport = JSON.parseObject(testStr, ScenarioImport.class); List data = scenarioImport.getData(); @@ -88,6 +102,7 @@ public class MsScenarioParser extends MsAbstractParser { JSONObject scenarioDefinition = JSONObject.parseObject(scenarioDefinitionStr); if (scenarioDefinition != null) { JSONArray hashTree = scenarioDefinition.getJSONArray("hashTree"); + formatHashTree(hashTree); setCopy(hashTree); JSONObject environmentMap = scenarioDefinition.getJSONObject("environmentMap"); if (environmentMap != null) { diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/ApiTestBatchRequest.java b/backend/src/main/java/io/metersphere/api/dto/definition/ApiTestBatchRequest.java index 5267403544..a85a6e4d95 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/ApiTestBatchRequest.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/ApiTestBatchRequest.java @@ -14,6 +14,7 @@ public class ApiTestBatchRequest extends ApiTestCaseWithBLOBs { private List ids; private List orders; private String projectId; + private Map combine; /** * isSelectAllDate:选择的数据是否是全部数据(全部数据是不受分页影响的数据) diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/SaveApiDefinitionRequest.java b/backend/src/main/java/io/metersphere/api/dto/definition/SaveApiDefinitionRequest.java index 2f5e08b623..484d2fbc42 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/SaveApiDefinitionRequest.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/SaveApiDefinitionRequest.java @@ -42,6 +42,8 @@ public class SaveApiDefinitionRequest { private String userId; + private String followPeople; + private Schedule schedule; private String triggerMode; diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/TestPlanApiCaseDTO.java b/backend/src/main/java/io/metersphere/api/dto/definition/TestPlanApiCaseDTO.java index b0964474f4..12d0f0c7e8 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/TestPlanApiCaseDTO.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/TestPlanApiCaseDTO.java @@ -13,4 +13,5 @@ public class TestPlanApiCaseDTO extends ApiTestCaseDTO { private String creatorName; private String principalName; private String updateName; + private String environmentName; } diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java index bb23ba172b..bde7a7dcde 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java @@ -165,7 +165,8 @@ public class MsScenario extends MsTestElement { this.addCounter(tree, variables); this.addRandom(tree, variables); if (CollectionUtils.isNotEmpty(this.headers)) { - setHeader(tree, this.headers); + //setHeader(tree, this.headers); + config.setHeaders(this.headers); } if (CollectionUtils.isNotEmpty(hashTree)) { for (MsTestElement el : hashTree) { diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/ParameterConfig.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/ParameterConfig.java index 6ee7992ab3..67625356c5 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/ParameterConfig.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/ParameterConfig.java @@ -1,6 +1,7 @@ package io.metersphere.api.dto.definition.request; import io.metersphere.api.dto.definition.request.variable.ScenarioVariable; +import io.metersphere.api.dto.scenario.KeyValue; import io.metersphere.api.dto.scenario.environment.EnvironmentConfig; import io.metersphere.api.dto.ssl.MsKeyStore; import io.metersphere.jmeter.utils.ScriptEngineUtils; @@ -26,6 +27,12 @@ public class ParameterConfig { * 公共场景参数 */ private List variables; + + /** + * 公共场景参数 + */ + private List headers; + /** * 公共Cookie */ @@ -55,7 +62,7 @@ public class ParameterConfig { } static public Arguments valueSupposeMock(Arguments arguments) { - for(int i = 0; i < arguments.getArguments().size(); ++i) { + for (int i = 0; i < arguments.getArguments().size(); ++i) { String argValue = arguments.getArgument(i).getValue(); arguments.getArgument(i).setValue(ScriptEngineUtils.buildFunctionCallString(argValue)); } diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/assertions/MsAssertions.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/assertions/MsAssertions.java index 33c0144798..0ffc39dae5 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/assertions/MsAssertions.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/assertions/MsAssertions.java @@ -67,11 +67,11 @@ public class MsAssertions extends MsTestElement { private ResponseAssertion responseAssertion(MsAssertionRegex assertionRegex) { ResponseAssertion assertion = new ResponseAssertion(); assertion.setEnabled(this.isEnable()); - assertion.setName(assertionRegex.getDescription()); - if(StringUtils.isEmpty(assertionRegex.getDescription())){ - assertion.setName("AssertionRegex"); + if (StringUtils.isNotEmpty(assertionRegex.getDescription())) { + assertion.setName(this.getName() + "==" + assertionRegex.getDescription()); + } else { + assertion.setName(this.getName() + "==" + "AssertionRegex"); } - assertion.setName(StringUtils.isNotEmpty(assertionRegex.getDescription()) ? assertionRegex.getDescription() : this.getName()); assertion.setProperty(TestElement.TEST_CLASS, ResponseAssertion.class.getName()); assertion.setProperty(TestElement.GUI_CLASS, SaveService.aliasToClass("AssertionGui")); assertion.setAssumeSuccess(assertionRegex.isAssumeSuccess()); @@ -96,11 +96,11 @@ public class MsAssertions extends MsTestElement { private JSONPathAssertion jsonPathAssertion(MsAssertionJsonPath assertionJsonPath) { JSONPathAssertion assertion = new JSONPathAssertion(); assertion.setEnabled(this.isEnable()); - assertion.setName(StringUtils.isNotEmpty(assertionJsonPath.getDescription()) ? assertionJsonPath.getDescription() : this.getName()); - if(StringUtils.isEmpty(assertion.getName())){ - assertion.setName("JSONPathAssertion"); + if (StringUtils.isNotEmpty(assertionJsonPath.getDescription())) { + assertion.setName(this.getName() + "==" + assertionJsonPath.getDescription()); + } else { + assertion.setName(this.getName() + "==" + "JSONPathAssertion"); } - /* assertion.setName(StringUtils.isNotEmpty(this.getName()) ? this.getName() : "JSONPathAssertion");*/ assertion.setProperty(TestElement.TEST_CLASS, JSONPathAssertion.class.getName()); assertion.setProperty(TestElement.GUI_CLASS, SaveService.aliasToClass("JSONPathAssertionGui")); assertion.setJsonPath(assertionJsonPath.getExpression()); @@ -120,11 +120,11 @@ public class MsAssertions extends MsTestElement { private XPath2Assertion xPath2Assertion(MsAssertionXPath2 assertionXPath2) { XPath2Assertion assertion = new XPath2Assertion(); assertion.setEnabled(this.isEnable()); - assertion.setName(StringUtils.isNotEmpty(assertionXPath2.getExpression()) ? assertionXPath2.getExpression() : this.getName()); - if(StringUtils.isEmpty(assertion.getName())){ - assertion.setName("XPath2Assertion"); + if (StringUtils.isNotEmpty(assertionXPath2.getExpression())) { + assertion.setName(this.getName() + "==" + assertionXPath2.getExpression()); + } else { + assertion.setName(this.getName() + "==" + "XPath2Assertion"); } - /*assertion.setName(StringUtils.isNotEmpty(this.getName()) ? this.getName() : "XPath2Assertion");*/ assertion.setProperty(TestElement.TEST_CLASS, XPath2Assertion.class.getName()); assertion.setProperty(TestElement.GUI_CLASS, SaveService.aliasToClass("XPath2AssertionGui")); assertion.setXPathString(assertionXPath2.getExpression()); @@ -135,8 +135,10 @@ public class MsAssertions extends MsTestElement { private DurationAssertion durationAssertion(MsAssertionDuration assertionDuration) { DurationAssertion assertion = new DurationAssertion(); assertion.setEnabled(this.isEnable()); - assertion.setName("Response In Time: " + assertionDuration.getValue()); - /* assertion.setName(StringUtils.isNotEmpty(this.getName()) ? this.getName() : "Response In Time: " + assertionDuration.getValue());*/ + assertion.setName("" + "==" + "Response In Time: " + assertionDuration.getValue()); + if (StringUtils.isNotEmpty(this.getName())) { + assertion.setName(this.getName() + "==" + "Response In Time: " + assertionDuration.getValue()); + } assertion.setProperty(TestElement.TEST_CLASS, DurationAssertion.class.getName()); assertion.setProperty(TestElement.GUI_CLASS, SaveService.aliasToClass("DurationAssertionGui")); assertion.setAllowedDuration(assertionDuration.getValue()); @@ -146,11 +148,11 @@ public class MsAssertions extends MsTestElement { private JSR223Assertion jsr223Assertion(MsAssertionJSR223 assertionJSR223) { JSR223Assertion assertion = new JSR223Assertion(); assertion.setEnabled(this.isEnable()); - assertion.setName(StringUtils.isNotEmpty(assertionJSR223.getDesc()) ? assertionJSR223.getDesc() : this.getName()); - if(StringUtils.isEmpty(assertion.getName())){ - assertion.setName("JSR223Assertion"); + if (StringUtils.isNotEmpty(assertionJSR223.getDesc())) { + assertion.setName(this.getName() + "==" + assertionJSR223.getDesc()); + } else { + assertion.setName(this.getName() + "==" + "JSR223Assertion"); } - /*assertion.setName(StringUtils.isNotEmpty(this.getName()) ? this.getName() : "JSR223Assertion");*/ assertion.setProperty(TestElement.TEST_CLASS, JSR223Assertion.class.getName()); assertion.setProperty(TestElement.GUI_CLASS, SaveService.aliasToClass("TestBeanGUI")); assertion.setProperty("cacheKey", "true"); diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/dns/MsDNSCacheManager.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/dns/MsDNSCacheManager.java index 00fb73cec0..88db977993 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/dns/MsDNSCacheManager.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/dns/MsDNSCacheManager.java @@ -38,7 +38,9 @@ public class MsDNSCacheManager extends MsTestElement { public static void addEnvironmentVariables(HashTree samplerHashTree, String name, EnvironmentConfig config) { name += "Environment Variables"; - samplerHashTree.add(arguments(name, config.getCommonConfig().getVariables())); + if (CollectionUtils.isNotEmpty(config.getCommonConfig().getVariables())) { + samplerHashTree.add(arguments(name, config.getCommonConfig().getVariables())); + } } public static void addEnvironmentDNS(HashTree samplerHashTree, String name, EnvironmentConfig config, HttpConfig httpConfig) { @@ -54,7 +56,9 @@ public class MsDNSCacheManager extends MsTestElement { } } }); - samplerHashTree.add(dnsCacheManager(name + " DNSCacheManager", hosts)); + if (CollectionUtils.isNotEmpty(hosts)) { + samplerHashTree.add(dnsCacheManager(name + " DNSCacheManager", hosts)); + } } } @@ -78,6 +82,7 @@ public class MsDNSCacheManager extends MsTestElement { dnsCacheManager.setProperty(TestElement.GUI_CLASS, SaveService.aliasToClass("DNSCachePanel")); dnsCacheManager.setCustomResolver(true); hosts.forEach(host -> dnsCacheManager.addHost(host.getDomain(), host.getIp())); + hosts.forEach(host -> dnsCacheManager.addServer(host.getIp())); return dnsCacheManager; } diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/post/MsJDBCPostProcessor.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/post/MsJDBCPostProcessor.java index c9e826b7ec..aefa2fb72e 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/post/MsJDBCPostProcessor.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/post/MsJDBCPostProcessor.java @@ -198,7 +198,7 @@ public class MsJDBCPostProcessor extends MsTestElement { } } catch (Exception ex) { ex.printStackTrace(); - LogUtil.error(ex.getMessage()); + LogUtil.error(ex); } } diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/pre/MsJDBCPreProcessor.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/pre/MsJDBCPreProcessor.java index f1387e0b93..ee7790f465 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/pre/MsJDBCPreProcessor.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/pre/MsJDBCPreProcessor.java @@ -198,7 +198,7 @@ public class MsJDBCPreProcessor extends MsTestElement { } } catch (Exception ex) { ex.printStackTrace(); - LogUtil.error(ex.getMessage()); + LogUtil.error(ex); } } diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsDubboSampler.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsDubboSampler.java index 5e4af37744..a11a81f1f6 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsDubboSampler.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsDubboSampler.java @@ -126,7 +126,7 @@ public class MsDubboSampler extends MsTestElement { } } catch (Exception ex) { ex.printStackTrace(); - LogUtil.error(ex.getMessage()); + LogUtil.error(ex); } } diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java index 649d5d755d..4f7226b702 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java @@ -14,6 +14,7 @@ import io.metersphere.api.dto.scenario.Body; import io.metersphere.api.dto.scenario.HttpConfig; import io.metersphere.api.dto.scenario.HttpConfigCondition; import io.metersphere.api.dto.scenario.KeyValue; +import io.metersphere.api.dto.scenario.environment.CommonConfig; import io.metersphere.api.dto.scenario.environment.EnvironmentConfig; import io.metersphere.api.dto.ssl.KeyStoreConfig; import io.metersphere.api.dto.ssl.KeyStoreFile; @@ -56,6 +57,7 @@ import java.net.URLEncoder; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; @Data @@ -152,7 +154,7 @@ public class MsHTTPSamplerProxy extends MsTestElement { } } catch (Exception ex) { ex.printStackTrace(); - LogUtil.error(ex.getMessage()); + LogUtil.error(ex); } } @@ -190,8 +192,6 @@ public class MsHTTPSamplerProxy extends MsTestElement { sampler.setMethod(this.getMethod()); sampler.setContentEncoding("UTF-8"); - sampler.setConnectTimeout(this.getConnectTimeout() == null ? "6000" : this.getConnectTimeout()); - sampler.setResponseTimeout(this.getResponseTimeout() == null ? "6000" : this.getResponseTimeout()); sampler.setFollowRedirects(this.isFollowRedirects()); sampler.setUseKeepAlive(true); sampler.setDoMultipart(this.isDoMultipartPost()); @@ -203,8 +203,13 @@ public class MsHTTPSamplerProxy extends MsTestElement { compatible(config); + this.initConnectAndResponseTimeout(config); + sampler.setConnectTimeout(this.getConnectTimeout() == null ? "60000" : this.getConnectTimeout()); + sampler.setResponseTimeout(this.getResponseTimeout() == null ? "60000" : this.getResponseTimeout()); + HttpConfig httpConfig = getHttpConfig(config); + setSamplerPath(config, httpConfig, sampler); // 请求体 @@ -233,7 +238,10 @@ public class MsHTTPSamplerProxy extends MsTestElement { setHeader(httpSamplerTree, httpConfig.getHeaders()); } } - + // 场景头 + if (config != null && CollectionUtils.isNotEmpty(config.getHeaders())) { + setHeader(httpSamplerTree, config.getHeaders()); + } // 环境通用请求头 Arguments arguments = getConfigArguments(config); if (arguments != null) { @@ -254,10 +262,10 @@ public class MsHTTPSamplerProxy extends MsTestElement { if (CollectionUtils.isNotEmpty(hashTree)) { for (MsTestElement el : hashTree) { - if(el.getEnvironmentId() == null){ - if(this.getEnvironmentId() == null){ + if (el.getEnvironmentId() == null) { + if (this.getEnvironmentId() == null) { el.setEnvironmentId(useEnvironment); - }else{ + } else { el.setEnvironmentId(this.getEnvironmentId()); } } @@ -267,6 +275,28 @@ public class MsHTTPSamplerProxy extends MsTestElement { } + private void initConnectAndResponseTimeout(ParameterConfig config) { + if (config.isEffective(this.getProjectId())) { + String useEvnId = config.getConfig().get(this.getProjectId()).getApiEnvironmentid(); + if (StringUtils.isNotEmpty(useEvnId) && !StringUtils.equals(useEvnId, this.getEnvironmentId())) { + this.setEnvironmentId(useEvnId); + } + CommonConfig commonConfig = config.getConfig().get(this.getProjectId()).getCommonConfig(); + if(commonConfig != null){ + if(this.getConnectTimeout() == null || StringUtils.equals(this.getConnectTimeout(),"60000")){ + if(commonConfig.getRequestTimeout() != 0){ + this.setConnectTimeout(String.valueOf(commonConfig.getRequestTimeout())); + } + } + if(this.getResponseTimeout() == null || StringUtils.equals(this.getResponseTimeout(),"60000")){ + if(commonConfig.getResponseTimeout() != 0){ + this.setResponseTimeout(String.valueOf(commonConfig.getResponseTimeout())); + } + } + } + } + } + private EnvironmentConfig getEnvironmentConfig(ParameterConfig config) { return config.getConfig().get(this.getProjectId()); } @@ -604,16 +634,25 @@ public class MsHTTPSamplerProxy extends MsTestElement { } public void setHeader(HashTree tree, List headers) { + // 合并header HeaderManager headerManager = new HeaderManager(); headerManager.setEnabled(true); headerManager.setName(StringUtils.isNotEmpty(this.getName()) ? this.getName() + "HeaderManager" : "HeaderManager"); headerManager.setProperty(TestElement.TEST_CLASS, HeaderManager.class.getName()); headerManager.setProperty(TestElement.GUI_CLASS, SaveService.aliasToClass("HeaderPanel")); + boolean isAdd = true; + for (Object key : tree.keySet()) { + if (key instanceof HeaderManager) { + headerManager = (HeaderManager) key; + isAdd = false; + } + } // header 也支持 mock 参数 - headers.stream().filter(KeyValue::isValid).filter(KeyValue::isEnable).forEach(keyValue -> - headerManager.add(new Header(keyValue.getName(), ScriptEngineUtils.buildFunctionCallString(keyValue.getValue()))) - ); - if (headerManager.getHeaders().size() > 0) { + List keyValues = headers.stream().filter(KeyValue::isValid).filter(KeyValue::isEnable).collect(Collectors.toList()); + for (KeyValue keyValue : keyValues) { + headerManager.add(new Header(keyValue.getName(), ScriptEngineUtils.buildFunctionCallString(keyValue.getValue()))); + } + if (headerManager.getHeaders().size() > 0 && isAdd) { tree.add(headerManager); } } diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsJDBCSampler.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsJDBCSampler.java index 8d0e92b768..b53e758b1b 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsJDBCSampler.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsJDBCSampler.java @@ -194,7 +194,7 @@ public class MsJDBCSampler extends MsTestElement { } } catch (Exception ex) { ex.printStackTrace(); - LogUtil.error(ex.getMessage()); + LogUtil.error(ex); } } diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsTCPSampler.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsTCPSampler.java index acad5389a6..b997823d25 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsTCPSampler.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsTCPSampler.java @@ -176,7 +176,7 @@ public class MsTCPSampler extends MsTestElement { } } catch (Exception ex) { ex.printStackTrace(); - LogUtil.error(ex.getMessage()); + LogUtil.error(ex); } } diff --git a/backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentShareType.java b/backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentShareType.java deleted file mode 100644 index 91982b5830..0000000000 --- a/backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentShareType.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.metersphere.api.dto.document; - -public enum ApiDocumentShareType { - Single,Batch -} diff --git a/backend/src/main/java/io/metersphere/api/dto/scenario/environment/CommonConfig.java b/backend/src/main/java/io/metersphere/api/dto/scenario/environment/CommonConfig.java index 6670bcfccc..9e8a748d2a 100644 --- a/backend/src/main/java/io/metersphere/api/dto/scenario/environment/CommonConfig.java +++ b/backend/src/main/java/io/metersphere/api/dto/scenario/environment/CommonConfig.java @@ -10,4 +10,6 @@ public class CommonConfig { private List variables; private boolean enableHost; private List hosts; + private int requestTimeout; + private int responseTimeout; } diff --git a/backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentInfoDTO.java b/backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentInfoDTO.java similarity index 95% rename from backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentInfoDTO.java rename to backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentInfoDTO.java index 2499c086e0..d93d3f3a34 100644 --- a/backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentInfoDTO.java +++ b/backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentInfoDTO.java @@ -1,4 +1,4 @@ -package io.metersphere.api.dto.document; +package io.metersphere.api.dto.share; import lombok.Getter; import lombok.Setter; diff --git a/backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentRequest.java b/backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentRequest.java similarity index 91% rename from backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentRequest.java rename to backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentRequest.java index 7b9e6459f6..62c29423fe 100644 --- a/backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentRequest.java +++ b/backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentRequest.java @@ -1,4 +1,4 @@ -package io.metersphere.api.dto.document; +package io.metersphere.api.dto.share; import lombok.Getter; import lombok.Setter; diff --git a/backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentShareRequest.java b/backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentShareRequest.java similarity index 59% rename from backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentShareRequest.java rename to backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentShareRequest.java index 7b4d206155..4016a73331 100644 --- a/backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentShareRequest.java +++ b/backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentShareRequest.java @@ -1,5 +1,6 @@ -package io.metersphere.api.dto.document; +package io.metersphere.api.dto.share; +import io.metersphere.base.domain.ShareInfo; import lombok.Getter; import lombok.Setter; @@ -12,7 +13,6 @@ import java.util.List; */ @Getter @Setter -public class ApiDocumentShareRequest { - private String shareType; +public class ApiDocumentShareRequest extends ShareInfo { private List shareApiIdList; } diff --git a/backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentSimpleInfoDTO.java b/backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentSimpleInfoDTO.java similarity index 86% rename from backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentSimpleInfoDTO.java rename to backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentSimpleInfoDTO.java index b575665546..45fff879d5 100644 --- a/backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentSimpleInfoDTO.java +++ b/backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentSimpleInfoDTO.java @@ -1,4 +1,4 @@ -package io.metersphere.api.dto.document; +package io.metersphere.api.dto.share; import lombok.Getter; import lombok.Setter; diff --git a/backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentShareDTO.java b/backend/src/main/java/io/metersphere/api/dto/share/ShareInfoDTO.java similarity index 72% rename from backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentShareDTO.java rename to backend/src/main/java/io/metersphere/api/dto/share/ShareInfoDTO.java index 39b4681ab3..f4b24e39d9 100644 --- a/backend/src/main/java/io/metersphere/api/dto/document/ApiDocumentShareDTO.java +++ b/backend/src/main/java/io/metersphere/api/dto/share/ShareInfoDTO.java @@ -1,4 +1,4 @@ -package io.metersphere.api.dto.document; +package io.metersphere.api.dto.share; import lombok.Getter; import lombok.Setter; @@ -10,7 +10,7 @@ import lombok.Setter; */ @Getter @Setter -public class ApiDocumentShareDTO { +public class ShareInfoDTO { private String id; private String shareUrl; } diff --git a/backend/src/main/java/io/metersphere/api/dto/share/ShareInfoType.java b/backend/src/main/java/io/metersphere/api/dto/share/ShareInfoType.java new file mode 100644 index 0000000000..8447a5a439 --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/dto/share/ShareInfoType.java @@ -0,0 +1,5 @@ +package io.metersphere.api.dto.share; + +public enum ShareInfoType { + Single,Batch +} diff --git a/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java b/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java index 1a2b3e3ce8..837953783f 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java @@ -1,20 +1,15 @@ package io.metersphere.api.jmeter; - -import io.metersphere.api.dto.RunningParamKeys; -import io.metersphere.api.service.ApiEnvironmentRunningParamService; -import io.metersphere.api.service.MsResultService; -import io.metersphere.api.service.TestResultService; import io.metersphere.commons.constants.ApiRunMode; import io.metersphere.commons.utils.CommonBeanFactory; -import io.metersphere.commons.utils.LogUtil; import org.apache.commons.lang3.StringUtils; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.visualizers.backend.AbstractBackendListenerClient; import org.apache.jmeter.visualizers.backend.BackendListenerContext; import java.io.Serializable; -import java.util.*; +import java.util.ArrayList; +import java.util.List; /** * JMeter BackendListener扩展, jmx脚本中使用 @@ -23,20 +18,10 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl public final static String TEST_ID = "ms.test.id"; - private final static String THREAD_SPLIT = " "; - - private final static String ID_SPLIT = "-"; + public String runMode = ApiRunMode.RUN.name(); private final List queue = new ArrayList<>(); - private TestResultService testResultService; - - private ApiEnvironmentRunningParamService apiEnvironmentRunningParamService; - - private MsResultService resultService; - - public String runMode = ApiRunMode.RUN.name(); - // 测试ID private String testId; @@ -45,19 +30,6 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl @Override public void setupTest(BackendListenerContext context) throws Exception { setParam(context); - testResultService = CommonBeanFactory.getBean(TestResultService.class); - if (testResultService == null) { - LogUtil.error("testResultService is required"); - } - resultService = CommonBeanFactory.getBean(MsResultService.class); - if (resultService == null) { - LogUtil.error("MsResultService is required"); - } - - apiEnvironmentRunningParamService = CommonBeanFactory.getBean(ApiEnvironmentRunningParamService.class); - if (apiEnvironmentRunningParamService == null) { - LogUtil.error("apiEnvironmentRunningParamService is required"); - } super.setupTest(context); } @@ -68,39 +40,19 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl @Override public void teardownTest(BackendListenerContext context) throws Exception { - TestResult testResult = new TestResult(); - testResult.setTestId(testId); - MessageCache.runningEngine.remove(testId); - testResult.setTotal(0); - // 一个脚本里可能包含多个场景(ThreadGroup),所以要区分开,key: 场景Id - final Map scenarios = new LinkedHashMap<>(); - queue.forEach(result -> { - // 线程名称: <场景名> <场景Index>-<请求Index>, 例如:Scenario 2-1 - if (StringUtils.equals(result.getSampleLabel(), RunningParamKeys.RUNNING_DEBUG_SAMPLER_NAME)) { - String evnStr = result.getResponseDataAsString(); - apiEnvironmentRunningParamService.parseEvn(evnStr); - } else { - resultService.formatTestResult(testResult, scenarios, result); - } - }); - queue.clear(); + APIBackendListenerHandler apiBackendListenerHandler = + CommonBeanFactory.getBean(APIBackendListenerHandler.class); + apiBackendListenerHandler.handleTeardownTest(queue, this.runMode, this.testId, this.debugReportId); super.teardownTest(context); - testResult.getScenarios().addAll(scenarios.values()); - testResult.getScenarios().sort(Comparator.comparing(ScenarioResult::getId)); - testResult.setConsole(resultService.getJmeterLogger(testId, true)); - testResultService.saveResult(testResult, this.runMode, this.debugReportId, this.testId); - // 清除已经中断的过程数据 - if (!MessageCache.reportCache.containsKey(testId) && resultService.processCache.containsKey(testId)) { - resultService.processCache.remove(testId); - } } private void setParam(BackendListenerContext context) { - this.testId = context.getParameter(TEST_ID); + this.testId = context.getParameter(APIBackendListenerClient.TEST_ID); this.runMode = context.getParameter("runMode"); this.debugReportId = context.getParameter("debugReportId"); if (StringUtils.isBlank(this.runMode)) { this.runMode = ApiRunMode.RUN.name(); } } + } diff --git a/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerHandler.java b/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerHandler.java new file mode 100644 index 0000000000..4b14129810 --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerHandler.java @@ -0,0 +1,60 @@ +package io.metersphere.api.jmeter; + + +import io.metersphere.api.dto.RunningParamKeys; +import io.metersphere.api.service.ApiEnvironmentRunningParamService; +import io.metersphere.api.service.MsResultService; +import io.metersphere.api.service.TestResultService; +import org.apache.commons.lang3.StringUtils; +import org.apache.jmeter.samplers.SampleResult; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 获取结果和数据库操作分离 + * 减少占用的数据库连接 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class APIBackendListenerHandler { + + @Resource + private TestResultService testResultService; + @Resource + private ApiEnvironmentRunningParamService apiEnvironmentRunningParamService; + @Resource + private MsResultService resultService; + + public void handleTeardownTest(List queue, String runMode, String testId, String debugReportId) throws Exception { + TestResult testResult = new TestResult(); + testResult.setTestId(testId); + MessageCache.runningEngine.remove(testId); + testResult.setTotal(0); + // 一个脚本里可能包含多个场景(ThreadGroup),所以要区分开,key: 场景Id + final Map scenarios = new LinkedHashMap<>(); + queue.forEach(result -> { + // 线程名称: <场景名> <场景Index>-<请求Index>, 例如:Scenario 2-1 + if (StringUtils.equals(result.getSampleLabel(), RunningParamKeys.RUNNING_DEBUG_SAMPLER_NAME)) { + String evnStr = result.getResponseDataAsString(); + apiEnvironmentRunningParamService.parseEvn(evnStr); + } else { + resultService.formatTestResult(testResult, scenarios, result); + } + }); + queue.clear(); + testResult.getScenarios().addAll(scenarios.values()); + testResult.getScenarios().sort(Comparator.comparing(ScenarioResult::getId)); + testResult.setConsole(resultService.getJmeterLogger(testId, true)); + testResultService.saveResult(testResult, runMode, debugReportId, testId); + // 清除已经中断的过程数据 + if (!MessageCache.reportCache.containsKey(testId) && resultService.getProcessCache().containsKey(testId)) { + resultService.getProcessCache().remove(testId); + } + } +} diff --git a/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java b/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java index a9af76345a..acf3f163b4 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java @@ -30,6 +30,7 @@ import org.apache.jorphan.collections.HashTree; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; import javax.annotation.PostConstruct; @@ -39,6 +40,7 @@ import java.io.InputStream; import java.lang.reflect.Field; @Service +@Transactional(rollbackFor = Exception.class) public class JMeterService { private static final String BASE_URL = "http://%s:%d"; @Resource diff --git a/backend/src/main/java/io/metersphere/api/jmeter/JmeterLoggerAppender.java b/backend/src/main/java/io/metersphere/api/jmeter/JmeterLoggerAppender.java index a963e2b67a..af1b52411f 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/JmeterLoggerAppender.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/JmeterLoggerAppender.java @@ -1,6 +1,7 @@ package io.metersphere.api.jmeter; import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.classic.spi.StackTraceElementProxy; import ch.qos.logback.core.UnsynchronizedAppenderBase; import io.metersphere.commons.utils.DateUtils; import io.metersphere.commons.utils.LogUtil; @@ -23,6 +24,16 @@ public class JmeterLoggerAppender extends UnsynchronizedAppenderBase reportCache = new ConcurrentHashMap<>(); - public static ConcurrentHashMap runningEngine = new ConcurrentHashMap<>(); + public static ConcurrentHashMap runningEngine = new ConcurrentHashMap<>(); } diff --git a/backend/src/main/java/io/metersphere/api/jmeter/MsKafkaListener.java b/backend/src/main/java/io/metersphere/api/jmeter/MsKafkaListener.java index 96cbcf7b3b..ebdfe3e4f9 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/MsKafkaListener.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/MsKafkaListener.java @@ -10,10 +10,12 @@ import org.apache.commons.lang3.StringUtils; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; @Service +@Transactional(rollbackFor = Exception.class) public class MsKafkaListener { public static final String TOPICS = "ms-api-exec-topic"; public static final String CONSUME_ID = "ms-api-exec-consume"; @@ -47,7 +49,7 @@ public class MsKafkaListener { } } catch (Exception e) { e.printStackTrace(); - LogUtil.error(e.getMessage()); + LogUtil.error(e); } return null; } diff --git a/backend/src/main/java/io/metersphere/api/jmeter/MsResultCollector.java b/backend/src/main/java/io/metersphere/api/jmeter/MsResultCollector.java index 37fb2e39be..0ce3730a74 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/MsResultCollector.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/MsResultCollector.java @@ -136,7 +136,6 @@ public class MsResultCollector extends AbstractListenerElement implements Sample @Override public void sampleStarted(SampleEvent e) { - System.out.println("start ===="); try { MsgDto dto = new MsgDto(); dto.setContent(e.getThreadGroup()); diff --git a/backend/src/main/java/io/metersphere/api/jmeter/ResourcePoolCalculation.java b/backend/src/main/java/io/metersphere/api/jmeter/ResourcePoolCalculation.java index 650e5cff8f..ee10a96d79 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/ResourcePoolCalculation.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/ResourcePoolCalculation.java @@ -12,6 +12,7 @@ import io.metersphere.commons.exception.MSException; import io.metersphere.dto.NodeDTO; import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @@ -19,6 +20,7 @@ import java.util.List; import java.util.stream.Collectors; @Service +@Transactional(rollbackFor = Exception.class) public class ResourcePoolCalculation { @Resource TestResourcePoolMapper testResourcePoolMapper; diff --git a/backend/src/main/java/io/metersphere/api/jmeter/ResponseAssertionResult.java b/backend/src/main/java/io/metersphere/api/jmeter/ResponseAssertionResult.java index d32c2d8b14..59e5a94c0c 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/ResponseAssertionResult.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/ResponseAssertionResult.java @@ -7,6 +7,8 @@ public class ResponseAssertionResult { private String name; + private String content; + private String message; private boolean pass; diff --git a/backend/src/main/java/io/metersphere/api/parse/PostmanAbstractParserParser.java b/backend/src/main/java/io/metersphere/api/parse/PostmanAbstractParserParser.java index 36a7b5dd22..bde77056ee 100644 --- a/backend/src/main/java/io/metersphere/api/parse/PostmanAbstractParserParser.java +++ b/backend/src/main/java/io/metersphere/api/parse/PostmanAbstractParserParser.java @@ -30,7 +30,7 @@ public abstract class PostmanAbstractParserParser extends ApiImportAbstractPa } requestDesc.getAuth(); // todo 认证方式等待优化 PostmanUrl url = requestDesc.getUrl(); - MsHTTPSamplerProxy request = buildRequest(requestItem.getName(), url.getRaw(), requestDesc.getMethod()); + MsHTTPSamplerProxy request = buildRequest(requestItem.getName(), url == null ? "" : url.getRaw(), requestDesc.getMethod()); if (StringUtils.isNotBlank(request.getPath())) { String path = request.getPath().split("\\?")[0]; path = parseVariable(path); @@ -39,7 +39,7 @@ public abstract class PostmanAbstractParserParser extends ApiImportAbstractPa request.setPath("/"); } parseBody(request.getBody(), requestDesc); - request.setArguments(parseKeyValue(url.getQuery())); + request.setArguments(parseKeyValue(url == null ? new ArrayList<>() : url.getQuery())); request.setHeaders(parseKeyValue(requestDesc.getHeader())); addBodyHeader(request); addPreScript(request, requestItem.getEvent()); 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 935af61649..bb9e5ad15b 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java @@ -33,6 +33,7 @@ import io.metersphere.commons.constants.*; import io.metersphere.commons.exception.MSException; import io.metersphere.commons.utils.*; import io.metersphere.controller.request.ScheduleRequest; +import io.metersphere.dto.ApiReportCountDTO; import io.metersphere.dto.BaseSystemConfigDTO; import io.metersphere.i18n.Translator; import io.metersphere.job.sechedule.ApiScenarioTestJob; @@ -342,7 +343,7 @@ public class ApiAutomationService { } } - public void update(SaveApiScenarioRequest request, List bodyFiles, List scenarioFiles) { + public ApiScenario update(SaveApiScenarioRequest request, List bodyFiles, List scenarioFiles) { checkNameExist(request); checkScenarioNum(request); @@ -367,6 +368,7 @@ public class ApiAutomationService { apiScenarioReferenceIdService.saveByApiScenario(scenario); extScheduleMapper.updateNameByResourceID(request.getId(), request.getName());// 修改场景name,同步到修改首页定时任务 uploadFiles(request, bodyFiles, scenarioFiles); + return scenario; } /** @@ -806,7 +808,7 @@ public class ApiAutomationService { } return bos.toByteArray(); } catch (Exception ex) { - LogUtil.error(ex.getMessage()); + LogUtil.error(ex); } return null; } @@ -869,7 +871,7 @@ public class ApiAutomationService { } } catch (Exception e) { e.printStackTrace(); - LogUtil.error(e.getMessage()); + LogUtil.error(e); } } @@ -1384,7 +1386,7 @@ public class ApiAutomationService { HashTree hashTree = generateHashTree(apiScenarios, request, reportIds); jMeterService.runLocal(reportIds.size() == 1 ? reportIds.get(0) : JSON.toJSONString(reportIds), hashTree, request.getReportId(), runMode); } catch (Exception e) { - LogUtil.error(e.getMessage()); + LogUtil.error(e); MSException.throwException(e.getMessage()); } return request.getId(); @@ -2362,11 +2364,12 @@ public class ApiAutomationService { } } - public void batchCopy(ApiScenarioBatchRequest batchRequest) { + public BatchOperaResponse batchCopy(ApiScenarioBatchRequest batchRequest) { ServiceUtils.getSelectAllIds(batchRequest, batchRequest.getCondition(), (query) -> extApiScenarioMapper.selectIdsByQuery((ApiScenarioRequest) query)); List apiScenarioList = extApiScenarioMapper.selectIds(batchRequest.getIds()); + StringBuffer stringBuffer = new StringBuffer(); for (ApiScenarioWithBLOBs apiModel : apiScenarioList) { long time = System.currentTimeMillis(); ApiScenarioWithBLOBs newModel = apiModel; @@ -2380,6 +2383,7 @@ public class ApiAutomationService { example.createCriteria().andNameEqualTo(newModel.getName()). andProjectIdEqualTo(newModel.getProjectId()).andStatusNotEqualTo("Trash").andIdNotEqualTo(newModel.getId()); if (apiScenarioMapper.countByExample(example) > 0) { + stringBuffer.append(newModel.getName()+";"); continue; } else { boolean insertFlag = true; @@ -2410,6 +2414,15 @@ public class ApiAutomationService { } } } + + BatchOperaResponse result = new BatchOperaResponse(); + if(stringBuffer.length() == 0){ + result.result = true; + }else { + result.result = false; + result.errorMsg = stringBuffer.substring(0,stringBuffer.length()-1); + } + return result; } public DeleteCheckResult checkBeforeDelete(ApiScenarioBatchRequest request) { @@ -2462,4 +2475,44 @@ public class ApiAutomationService { result.setCheckMsg(checkMsgList); return result; } + + public List getScenarioCaseByIds(List ids) { + if (CollectionUtils.isNotEmpty(ids)) { + ApiScenarioExample example = new ApiScenarioExample(); + example.createCriteria().andIdIn(ids); + return apiScenarioMapper.selectByExample(example); + } + return new ArrayList<>(); + } + + public void initExecuteTimes() { + List apiScenarioIds = extApiScenarioMapper.selectIdsByExecuteTimeIsNull(); + Map scenarioIdMap = new HashMap<>(); + List reportCount = apiScenarioReportService.countByApiScenarioId(); + for (ApiReportCountDTO dto : reportCount) { + scenarioIdMap.put(dto.getId(),dto.getCountNum()); + } + for (String id:apiScenarioIds) { + int count = 0; + if(scenarioIdMap.containsKey(id)){ + Long countNum = scenarioIdMap.get(id); + if(countNum != null){ + count = countNum.intValue(); + } + } + ApiScenarioWithBLOBs apiScenario = new ApiScenarioWithBLOBs(); + apiScenario.setId(id); + apiScenario.setExecuteTimes(count); + apiScenarioMapper.updateByPrimaryKeySelective(apiScenario); + } + } + + public long countExecuteTimesByProjectID(String projectId) { + Long result = extApiScenarioMapper.countExecuteTimesByProjectID(projectId); + if(result == null){ + return 0; + }else { + return result.longValue(); + } + } } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionEnvService.java b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionEnvService.java index f94538b407..fee7f5d37d 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionEnvService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionEnvService.java @@ -21,8 +21,13 @@ public class ApiDefinitionEnvService { env.setId(UUID.randomUUID().toString()); env.setCreateTime(System.currentTimeMillis()); env.setUpdateTime(System.currentTimeMillis()); - if (this.get(env.getUserId()) == null) { + ApiDefinitionEnv apiDefinitionEnv = this.get(env.getUserId()); + if (apiDefinitionEnv == null) { apiDefinitionEnvMapper.insert(env); + } else { + apiDefinitionEnv.setEnvId(env.getEnvId()); + apiDefinitionEnv.setUpdateTime(System.currentTimeMillis()); + apiDefinitionEnvMapper.updateByPrimaryKey(apiDefinitionEnv); } } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionExecResultService.java b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionExecResultService.java index f7f9eb35f8..0b84543d1f 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionExecResultService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionExecResultService.java @@ -2,6 +2,7 @@ package io.metersphere.api.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import io.metersphere.api.cache.TestPlanReportExecuteCatch; import io.metersphere.api.dto.datacount.ExecutedCaseInfoResult; import io.metersphere.api.jmeter.TestResult; import io.metersphere.base.domain.*; @@ -11,15 +12,16 @@ import io.metersphere.base.mapper.ApiTestCaseMapper; import io.metersphere.base.mapper.TestCaseReviewApiCaseMapper; import io.metersphere.base.mapper.ext.ExtApiDefinitionExecResultMapper; import io.metersphere.commons.constants.*; -import io.metersphere.commons.utils.CommonBeanFactory; import io.metersphere.commons.utils.DateUtils; import io.metersphere.commons.utils.SessionUtils; +import io.metersphere.notice.sender.NoticeModel; +import io.metersphere.notice.service.NoticeSendService; import io.metersphere.track.dto.TestPlanDTO; import io.metersphere.track.request.testcase.QueryTestPlanRequest; import io.metersphere.track.service.TestCaseReviewApiCaseService; import io.metersphere.track.service.TestPlanApiCaseService; -import io.metersphere.track.service.TestPlanReportService; import io.metersphere.track.service.TestPlanService; +import org.apache.commons.beanutils.BeanMap; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.ExecutorType; @@ -56,6 +58,8 @@ public class ApiDefinitionExecResultService { @Resource SqlSessionFactory sqlSessionFactory; + @Resource + private NoticeSendService noticeSendService; public ApiDefinitionExecResult getInfo(String id) { return apiDefinitionExecResultMapper.selectByPrimaryKey(id); @@ -92,7 +96,7 @@ public class ApiDefinitionExecResultService { saved = false; } String status = item.isSuccess() ? "success" : "error"; - saveResult.setName(getName(type, item.getName(), status, saveResult.getCreateTime())); + saveResult.setName(getName(type, item.getName(), status, saveResult.getCreateTime(), saveResult.getId())); saveResult.setStatus(status); saveResult.setCreateTime(item.getStartTime()); saveResult.setResourceId(item.getName()); @@ -106,13 +110,7 @@ public class ApiDefinitionExecResultService { prevResult.setContent(null); definitionExecResultMapper.updateByPrimaryKeyWithBLOBs(prevResult); } - // 更新用例最后执行结果 - ApiTestCase apiTestCase = apiTestCaseMapper.selectByPrimaryKey(saveResult.getResourceId()); - if (apiTestCase != null) { - apiTestCase.setLastResultId(saveResult.getId()); - apiTestCase.setStatus(status); - apiTestCaseMapper.updateByPrimaryKey(apiTestCase); - } + if (StringUtils.isNotEmpty(saveResult.getTriggerMode()) && saveResult.getTriggerMode().equals("CASE")) { saveResult.setTriggerMode(TriggerMode.MANUAL.name()); } @@ -121,6 +119,8 @@ public class ApiDefinitionExecResultService { } else { definitionExecResultMapper.updateByPrimaryKeyWithBLOBs(saveResult); } + // 发送通知 + sendNotice(saveResult); }); } }); @@ -128,7 +128,45 @@ public class ApiDefinitionExecResultService { } } - private String getName(String type, String id, String status, Long time) { + private void sendNotice(ApiDefinitionExecResult result) { + String resourceId = result.getResourceId(); + ApiTestCaseWithBLOBs apiTestCaseWithBLOBs = apiTestCaseMapper.selectByPrimaryKey(resourceId); + // 接口定义直接执行不发通知 + if (apiTestCaseWithBLOBs == null) { + return; + } + + BeanMap beanMap = new BeanMap(apiTestCaseWithBLOBs); + + String event; + String status; + if (StringUtils.equals(result.getStatus(), "success")) { + event = NoticeConstants.Event.EXECUTE_SUCCESSFUL; + status = "成功"; + } else { + event = NoticeConstants.Event.EXECUTE_FAILED; + status = "失败"; + } + + Map paramMap = new HashMap<>(beanMap); + paramMap.put("operator", SessionUtils.getUserId()); + paramMap.put("status", result.getStatus()); + String context = "${operator}执行接口用例" + status + ": ${name}"; + NoticeModel noticeModel = NoticeModel.builder() + .operator(SessionUtils.getUserId()) + .context(context) + .subject("接口用例通知") + .successMailTemplate("api/CaseResult") + .failedMailTemplate("api/CaseResult") + .paramMap(paramMap) + .event(event) + .build(); + + String taskType = NoticeConstants.TaskType.API_DEFINITION_TASK; + noticeSendService.send(taskType, noticeModel); + } + + private String getName(String type, String id, String status, Long time, String resourceId) { if (id.indexOf(DelimiterConstants.SEPARATOR.toString()) != -1) { return id.substring(0, id.indexOf(DelimiterConstants.SEPARATOR.toString())); } @@ -138,11 +176,17 @@ public class ApiDefinitionExecResultService { if (testPlanApiCase != null) { testPlanApiCaseService.setExecResult(id, status, time); caseWithBLOBs = apiTestCaseMapper.selectByPrimaryKey(testPlanApiCase.getApiCaseId()); + testPlanApiCase.setStatus(status); + testPlanApiCase.setUpdateTime(System.currentTimeMillis()); + testPlanApiCaseService.updateByPrimaryKeySelective(testPlanApiCase); } TestCaseReviewApiCase testCaseReviewApiCase = testCaseReviewApiCaseMapper.selectByPrimaryKey(id); if (testCaseReviewApiCase != null) { testCaseReviewApiCaseService.setExecResult(id, status, time); caseWithBLOBs = apiTestCaseMapper.selectByPrimaryKey(testCaseReviewApiCase.getApiCaseId()); + testCaseReviewApiCase.setStatus(status); + testCaseReviewApiCase.setUpdateTime(System.currentTimeMillis()); + testCaseReviewApiCaseService.updateByPrimaryKeySelective(testCaseReviewApiCase); } if (caseWithBLOBs != null) { return caseWithBLOBs.getName(); @@ -154,6 +198,10 @@ public class ApiDefinitionExecResultService { } else { ApiTestCaseWithBLOBs caseWithBLOBs = apiTestCaseMapper.selectByPrimaryKey(id); if (caseWithBLOBs != null) { + // 更新用例最后执行结果 + caseWithBLOBs.setLastResultId(resourceId); + caseWithBLOBs.setStatus(status); + apiTestCaseMapper.updateByPrimaryKey(caseWithBLOBs); return caseWithBLOBs.getName(); } } @@ -168,7 +216,7 @@ public class ApiDefinitionExecResultService { * @param result * @param type */ - public void saveApiResultByScheduleTask(TestResult result, String testPlanReportId, String type, String trigeMode) { + public void saveApiResultByScheduleTask(TestResult result, String testPlanReportId, String type) { testPlanLog.info("TestPlanReportId[" + testPlanReportId + "] APICASE OVER."); String saveResultType = type; if (StringUtils.equalsAny(saveResultType, ApiRunMode.SCHEDULE_API_PLAN.name(), ApiRunMode.JENKINS_API_PLAN.name())) { @@ -177,6 +225,7 @@ public class ApiDefinitionExecResultService { String finalSaveResultType = saveResultType; Map apiIdResultMap = new HashMap<>(); + Map caseReportMap = new HashMap<>(); if (CollectionUtils.isNotEmpty(result.getScenarios())) { result.getScenarios().forEach(scenarioResult -> { @@ -186,27 +235,33 @@ public class ApiDefinitionExecResultService { ApiDefinitionExecResult saveResult = new ApiDefinitionExecResult(); saveResult.setId(UUID.randomUUID().toString()); saveResult.setCreateTime(System.currentTimeMillis()); -// saveResult.setName(item.getName()); - saveResult.setName(getName(type, item.getName(), status, saveResult.getCreateTime())); + saveResult.setName(getName(type, item.getName(), status, saveResult.getCreateTime(),saveResult.getId())); ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = apiDefinitionMapper.selectByPrimaryKey(item.getName()); + String caseId = null; if (apiDefinitionWithBLOBs != null) { saveResult.setName(apiDefinitionWithBLOBs.getName()); - apiIdResultMap.put(apiDefinitionWithBLOBs.getId(), item.isSuccess() ? TestPlanApiExecuteStatus.SUCCESS.name() : TestPlanApiExecuteStatus.FAILD.name()); + caseId = apiDefinitionWithBLOBs.getId(); } else { ApiTestCaseWithBLOBs caseWithBLOBs = apiTestCaseMapper.selectByPrimaryKey(item.getName()); if (caseWithBLOBs != null) { + caseId = caseWithBLOBs.getId(); saveResult.setName(caseWithBLOBs.getName()); - apiIdResultMap.put(caseWithBLOBs.getId(), item.isSuccess() ? TestPlanApiExecuteStatus.SUCCESS.name() : TestPlanApiExecuteStatus.FAILD.name()); } else { caseWithBLOBs = testPlanApiCaseService.getApiTestCaseById(item.getName()); if (caseWithBLOBs != null) { saveResult.setName(caseWithBLOBs.getName()); - apiIdResultMap.put(caseWithBLOBs.getId(), item.isSuccess() ? TestPlanApiExecuteStatus.SUCCESS.name() : TestPlanApiExecuteStatus.FAILD.name()); + caseId = caseWithBLOBs.getId(); } } } + if(StringUtils.isNotEmpty(caseId)){ + apiIdResultMap.put(caseId, item.isSuccess() ? TestPlanApiExecuteStatus.SUCCESS.name() : TestPlanApiExecuteStatus.FAILD.name()); + } + if (StringUtils.equals(type, ApiRunMode.JENKINS_API_PLAN.name())) { saveResult.setTriggerMode(TriggerMode.API.name()); + } else if (StringUtils.equals(type, ApiRunMode.MANUAL_PLAN.name())) { + saveResult.setTriggerMode(TriggerMode.MANUAL.name()); } else { saveResult.setTriggerMode(TriggerMode.SCHEDULE.name()); } @@ -227,7 +282,7 @@ public class ApiDefinitionExecResultService { apiCase.setStatus(status); apiCase.setUpdateTime(System.currentTimeMillis()); testPlanApiCaseService.updateByPrimaryKeySelective(apiCase); - } else if (StringUtils.equals(type, ApiRunMode.JENKINS_SCENARIO_PLAN.name())) { + } else if (StringUtils.equals(type, ApiRunMode.JENKINS_API_PLAN.name())) { TestPlanApiCase apiCase = testPlanApiCaseService.getById(item.getName()); userID = Objects.requireNonNull(SessionUtils.getUser()).getId(); apiCase.setStatus(status); @@ -246,13 +301,14 @@ public class ApiDefinitionExecResultService { apiDefinitionExecResultMapper.updateByPrimaryKeyWithBLOBs(prevResult); } apiDefinitionExecResultMapper.insert(saveResult); + caseReportMap.put(caseId,saveResult); }); } }); } testPlanLog.info("TestPlanReportId[" + testPlanReportId + "] APICASE OVER. API CASE STATUS:" + JSONObject.toJSONString(apiIdResultMap)); - TestPlanReportService testPlanReportService = CommonBeanFactory.getBean(TestPlanReportService.class); - testPlanReportService.updateExecuteApis(testPlanReportId, apiIdResultMap, null, null); + TestPlanReportExecuteCatch.updateApiTestPlanExecuteInfo(testPlanReportId, apiIdResultMap, null, null); + TestPlanReportExecuteCatch.updateTestPlanExecuteResultInfo(testPlanReportId,caseReportMap,null,null); } public void deleteByResourceId(String resourceId) { diff --git a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java index b9b9295c66..8f5d4b4d11 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java @@ -368,6 +368,7 @@ public class ApiDefinitionService { test.setResponse(JSONObject.toJSONString(request.getResponse())); test.setEnvironmentId(request.getEnvironmentId()); test.setUserId(request.getUserId()); + test.setFollowPeople(request.getFollowPeople()); if (StringUtils.isNotEmpty(request.getTags()) && !StringUtils.equals(request.getTags(), "[]")) { test.setTags(request.getTags()); } else { @@ -404,6 +405,7 @@ public class ApiDefinitionService { test.setStatus(APITestStatus.Underway.name()); test.setModulePath(request.getModulePath()); test.setModuleId(request.getModuleId()); + test.setFollowPeople(request.getFollowPeople()); if (StringUtils.isEmpty(request.getModuleId()) || "default-module".equals(request.getModuleId())) { ApiModuleExample example = new ApiModuleExample(); example.createCriteria().andProjectIdEqualTo(test.getProjectId()).andProtocolEqualTo(test.getProtocol()).andNameEqualTo("默认模块"); @@ -545,31 +547,18 @@ public class ApiDefinitionService { return request; } - private void importMsCase(ApiDefinitionImport apiImport, SqlSession sqlSession, ApiTestCaseMapper apiTestCaseMapper) { + private void importMsCase(ApiDefinitionImport apiImport, SqlSession sqlSession, ApiTestCaseMapper apiTestCaseMapper, + ApiTestImportRequest request) { List cases = apiImport.getCases(); - SaveApiTestCaseRequest checkRequest = new SaveApiTestCaseRequest(); if (CollectionUtils.isNotEmpty(cases)) { int batchCount = 0; - int nextNum = 0; for (int i = 0; i < cases.size(); i++) { ApiTestCaseWithBLOBs item = cases.get(i); ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = apiDefinitionMapper.selectByPrimaryKey(item.getApiDefinitionId()); if (apiDefinitionWithBLOBs == null) { continue; } - nextNum = apiTestCaseService.getNextNum(item.getApiDefinitionId()); - checkRequest.setName(item.getName()); - checkRequest.setApiDefinitionId(item.getApiDefinitionId()); - if (!apiTestCaseService.hasSameCase(checkRequest)) { - item.setId(UUID.randomUUID().toString()); - item.setCreateTime(System.currentTimeMillis()); - item.setUpdateTime(System.currentTimeMillis()); - item.setCreateUserId(SessionUtils.getUserId()); - item.setUpdateUserId(SessionUtils.getUserId()); - item.setProjectId(SessionUtils.getCurrentProjectId()); - item.setNum(nextNum); - apiTestCaseMapper.insert(item); - } + insertOrUpdateImportCase(item, request); } if (batchCount % 300 == 0) { sqlSession.flushStatements(); @@ -587,30 +576,45 @@ public class ApiDefinitionService { if (StringUtils.equalsAnyIgnoreCase(apiTestImportRequest.getPlatform(), ApiImportPlatform.Plugin.name(), ApiImportPlatform.Postman.name())) { ApiTestCaseWithBLOBs apiTestCase = new ApiTestCaseWithBLOBs(); BeanUtils.copyBean(apiTestCase, apiDefinition); - apiTestCase.setId(UUID.randomUUID().toString()); apiTestCase.setApiDefinitionId(apiDefinition.getId()); - apiTestCase.setCreateTime(System.currentTimeMillis()); - apiTestCase.setUpdateTime(System.currentTimeMillis()); - apiTestCase.setCreateUserId(SessionUtils.getUserId()); - apiTestCase.setUpdateUserId(SessionUtils.getUserId()); - apiTestCase.setNum(getNextNum(apiTestCase.getApiDefinitionId())); apiTestCase.setPriority("P0"); if (apiTestCase.getName().length() > 255) { apiTestCase.setName(apiTestCase.getName().substring(0, 255)); } - /* if (!isInsert) { - apiTestCase.setName(apiTestCase.getName() + "_" + apiTestCase.getId().substring(0, 5)); - }*/ - ApiTestCaseExample example = new ApiTestCaseExample(); - example.createCriteria().andApiDefinitionIdEqualTo(apiDefinition.getId()); - apiTestCaseMapper.deleteByExample(example); - apiTestCaseMapper.insert(apiTestCase); + insertOrUpdateImportCase(apiTestCase, apiTestImportRequest); } } catch (Exception e) { LogUtil.error("导入创建用例异常", e); } } + private void insertOrUpdateImportCase(ApiTestCaseWithBLOBs apiTestCase, ApiTestImportRequest apiTestImportRequest) { + SaveApiTestCaseRequest checkRequest = new SaveApiTestCaseRequest(); + checkRequest.setName(apiTestCase.getName()); + checkRequest.setApiDefinitionId(apiTestCase.getApiDefinitionId()); + ApiTestCase sameCase = apiTestCaseService.getSameCase(checkRequest); + apiTestCase.setUpdateUserId(SessionUtils.getUserId()); + if (sameCase == null) { + apiTestCase.setId(UUID.randomUUID().toString()); + apiTestCase.setNum(getNextNum(apiTestCase.getApiDefinitionId())); + apiTestCase.setCreateTime(System.currentTimeMillis()); + apiTestCase.setUpdateTime(System.currentTimeMillis()); + apiTestCase.setCreateUserId(SessionUtils.getUserId()); + apiTestCase.setProjectId(SessionUtils.getCurrentProjectId()); + apiTestCaseMapper.insert(apiTestCase); + } else if (StringUtils.equals("fullCoverage", apiTestImportRequest.getModeId())) { + apiTestCase.setId(sameCase.getId()); + apiTestCase.setUpdateTime(System.currentTimeMillis()); + apiTestCase.setCreateTime(null); + apiTestCase.setPriority(sameCase.getPriority()); + apiTestCase.setCreateUserId(sameCase.getCreateUserId()); + apiTestCase.setNum(sameCase.getNum()); + apiTestCase.setProjectId(sameCase.getProjectId()); + apiTestCase.setVersion((sameCase.getVersion() == null ? 0 : sameCase.getVersion()) + 1); + apiTestCaseMapper.updateByPrimaryKeySelective(apiTestCase); + } + } + private void deleteFileByTestId(String apiId) { ApiTestFileExample apiTestFileExample = new ApiTestFileExample(); apiTestFileExample.createCriteria().andTestIdEqualTo(apiId); @@ -731,12 +735,17 @@ public class ApiDefinitionService { return buildAPIReportResult(result); } + public APIReportResult getByResultId(String reportId) { + ApiDefinitionExecResult result = apiDefinitionExecResultMapper.selectByPrimaryKey(reportId); + return buildAPIReportResult(result); + } + public APIReportResult getReportById(String testId) { ApiDefinitionExecResult result = apiDefinitionExecResultMapper.selectByPrimaryKey(testId); return buildAPIReportResult(result); } - private APIReportResult buildAPIReportResult(ApiDefinitionExecResult result) { + public APIReportResult buildAPIReportResult(ApiDefinitionExecResult result) { if (result == null) { return null; } @@ -786,6 +795,7 @@ public class ApiDefinitionService { Map paramMap = new HashMap<>(); paramMap.put("url", request.getSwaggerUrl()); NoticeModel noticeModel = NoticeModel.builder() + .operator(SessionUtils.getUserId()) .context(context) .testId(scheduleId) .subject(Translator.get("swagger_url_scheduled_import_notification")) @@ -810,6 +820,7 @@ public class ApiDefinitionService { Map paramMap = new HashMap<>(); paramMap.put("url", request.getSwaggerUrl()); NoticeModel noticeModel = NoticeModel.builder() + .operator(SessionUtils.getUserId()) .context(context) .testId(scheduleId) .subject(Translator.get("swagger_url_scheduled_import_notification")) @@ -875,7 +886,7 @@ public class ApiDefinitionService { } if (!CollectionUtils.isEmpty(apiImport.getCases())) { - importMsCase(apiImport, sqlSession, apiTestCaseMapper); + importMsCase(apiImport, sqlSession, apiTestCaseMapper, request); } } @@ -1342,4 +1353,9 @@ public class ApiDefinitionService { }); this.removeToGc(apiIdList); } + + public APIReportResult getTestPlanApiCaseReport(String testId, String type) { + ApiDefinitionExecResult result = extApiDefinitionExecResultMapper.selectPlanApiMaxResultByTestIdAndType(testId, type); + return buildAPIReportResult(result); + } } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiJmeterFileService.java b/backend/src/main/java/io/metersphere/api/service/ApiJmeterFileService.java index c6197fdb8b..f8e2f5294f 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiJmeterFileService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiJmeterFileService.java @@ -20,6 +20,7 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.jorphan.collections.HashTree; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.ByteArrayOutputStream; @@ -30,6 +31,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @Service +@Transactional(rollbackFor = Exception.class) public class ApiJmeterFileService { @Resource 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 6a5714d1ba..157a0ae86a 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java @@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import io.metersphere.api.cache.TestPlanReportExecuteCatch; import io.metersphere.api.dto.APIReportBatchRequest; import io.metersphere.api.dto.DeleteAPIReportRequest; import io.metersphere.api.dto.QueryAPIReportRequest; @@ -22,19 +23,21 @@ import io.metersphere.base.mapper.ApiScenarioMapper; import io.metersphere.base.mapper.ApiScenarioReportDetailMapper; import io.metersphere.base.mapper.ApiScenarioReportMapper; import io.metersphere.base.mapper.TestPlanApiScenarioMapper; +import io.metersphere.base.mapper.ext.ExtApiScenarioReportDetailMapper; import io.metersphere.base.mapper.ext.ExtApiScenarioReportMapper; -import io.metersphere.commons.constants.ApiRunMode; -import io.metersphere.commons.constants.ReportTriggerMode; -import io.metersphere.commons.constants.TestPlanApiExecuteStatus; -import io.metersphere.commons.constants.TriggerMode; +import io.metersphere.commons.constants.*; import io.metersphere.commons.exception.MSException; import io.metersphere.commons.utils.*; +import io.metersphere.dto.ApiReportCountDTO; import io.metersphere.i18n.Translator; import io.metersphere.log.utils.ReflexObjectUtil; import io.metersphere.log.vo.DetailColumn; import io.metersphere.log.vo.OperatingLogDetails; import io.metersphere.log.vo.api.ModuleReference; +import io.metersphere.notice.sender.NoticeModel; +import io.metersphere.notice.service.NoticeSendService; import io.metersphere.track.service.TestPlanReportService; +import org.apache.commons.beanutils.BeanMap; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.ExecutorType; @@ -61,12 +64,17 @@ public class ApiScenarioReportService { private ApiScenarioReportMapper apiScenarioReportMapper; @Resource private ApiScenarioReportDetailMapper apiScenarioReportDetailMapper; + @Resource + private ExtApiScenarioReportDetailMapper extApiScenarioReportDetailMapper; + @Resource private ApiScenarioMapper apiScenarioMapper; @Resource private TestPlanApiScenarioMapper testPlanApiScenarioMapper; @Resource SqlSessionFactory sqlSessionFactory; + @Resource + private NoticeSendService noticeSendService; public ApiScenarioReport complete(TestResult result, String runMode) { // 更新场景 @@ -142,7 +150,7 @@ public class ApiScenarioReportService { if (report != null) { report.setId(report.getId()); report.setName(report.getScenarioName() + "-" + DateUtils.getTimeStr(System.currentTimeMillis())); - report.setCreateTime(startTime); + report.setEndTime(System.currentTimeMillis()); report.setUpdateTime(startTime); String status = test.getError() == 0 ? "Success" : "Error"; report.setStatus(status); @@ -164,7 +172,7 @@ public class ApiScenarioReportService { report.setScenarioId(test.getScenarioId()); report.setTriggerMode(test.getTriggerMode()); report.setDescription(test.getDescription()); - report.setCreateTime(System.currentTimeMillis()); + report.setEndTime(System.currentTimeMillis()); report.setUpdateTime(System.currentTimeMillis()); report.setStatus(test.getStatus()); report.setUserId(test.getUserId()); @@ -234,6 +242,7 @@ public class ApiScenarioReportService { if (StringUtils.isNotEmpty(report.getTriggerMode()) && report.getTriggerMode().equals("CASE")) { report.setTriggerMode(TriggerMode.MANUAL.name()); } + report.setEndTime(System.currentTimeMillis()); apiScenarioReportMapper.updateByPrimaryKeySelective(report); if (scenarioResult.getError() > 0) { testPlanApiScenario.setLastResult(ScenarioStatus.Fail.name()); @@ -243,9 +252,31 @@ public class ApiScenarioReportService { String passRate = new DecimalFormat("0%").format((float) scenarioResult.getSuccess() / (scenarioResult.getSuccess() + scenarioResult.getError())); testPlanApiScenario.setPassRate(passRate); testPlanApiScenario.setReportId(report.getId()); - testPlanApiScenario.setUpdateTime(report.getCreateTime()); report.setTestPlanScenarioId(testPlanApiScenario.getId()); + report.setEndTime(System.currentTimeMillis()); + testPlanApiScenario.setUpdateTime(report.getCreateTime()); testPlanApiScenarioMapper.updateByPrimaryKeySelective(testPlanApiScenario); + + // 更新场景状态 + ApiScenario scenario = apiScenarioMapper.selectByPrimaryKey(testPlanApiScenario.getApiScenarioId()); + if (scenario != null) { + if (scenarioResult.getError() > 0) { + scenario.setLastResult("Fail"); + } else { + scenario.setLastResult("Success"); + } + scenario.setPassRate(passRate); + scenario.setReportId(report.getId()); + int executeTimes = 0; + if (scenario.getExecuteTimes() != null) { + executeTimes = scenario.getExecuteTimes().intValue(); + } + scenario.setExecuteTimes(executeTimes + 1); + + apiScenarioMapper.updateByPrimaryKey(scenario); + // 发送通知 + sendNotice(scenario); + } } returnReport = report; reportIds.add(report.getId()); @@ -265,6 +296,7 @@ public class ApiScenarioReportService { List reportIds = new ArrayList<>(); List scenarioIdList = new ArrayList<>(); Map scenarioAndErrorMap = new HashMap<>(); + Map caseReportMap = new HashMap<>(); for (ScenarioResult scenarioResult : scenarioResultList) { // 存储场景报告 @@ -299,8 +331,10 @@ public class ApiScenarioReportService { TestPlanApiScenario testPlanApiScenario = testPlanApiScenarioMapper.selectByPrimaryKey(planScenarioId); report.setScenarioId(testPlanApiScenario.getApiScenarioId()); report.setTestPlanScenarioId(planScenarioId); + report.setEndTime(System.currentTimeMillis()); apiScenarioReportMapper.updateByPrimaryKeySelective(report); + if (scenarioResult.getError() > 0) { scenarioAndErrorMap.put(testPlanApiScenario.getApiScenarioId(), TestPlanApiExecuteStatus.FAILD.name()); testPlanApiScenario.setLastResult(ScenarioStatus.Fail.name()); @@ -308,6 +342,7 @@ public class ApiScenarioReportService { scenarioAndErrorMap.put(testPlanApiScenario.getApiScenarioId(), TestPlanApiExecuteStatus.SUCCESS.name()); testPlanApiScenario.setLastResult(ScenarioStatus.Success.name()); } + String passRate = new DecimalFormat("0%").format((float) scenarioResult.getSuccess() / (scenarioResult.getSuccess() + scenarioResult.getError())); testPlanApiScenario.setPassRate(passRate); // 报告详情内容 @@ -322,20 +357,46 @@ public class ApiScenarioReportService { apiScenarioReportDetailMapper.insert(detail); testPlanApiScenario.setReportId(report.getId()); + report.setEndTime(System.currentTimeMillis()); testPlanApiScenario.setUpdateTime(System.currentTimeMillis()); testPlanApiScenarioMapper.updateByPrimaryKeySelective(testPlanApiScenario); scenarioIdList.add(testPlanApiScenario.getApiScenarioId()); scenarioNames.append(report.getName()).append(","); + // 更新场景状态 + ApiScenario scenario = apiScenarioMapper.selectByPrimaryKey(testPlanApiScenario.getApiScenarioId()); + if (scenario != null) { + if (scenarioResult.getError() > 0) { + scenario.setLastResult("Fail"); + } else { + scenario.setLastResult("Success"); + } + scenario.setPassRate(passRate); + scenario.setReportId(report.getId()); + int executeTimes = 0; + if (scenario.getExecuteTimes() != null) { + executeTimes = scenario.getExecuteTimes().intValue(); + } + scenario.setExecuteTimes(executeTimes + 1); + + apiScenarioMapper.updateByPrimaryKey(scenario); + // 发送通知 + sendNotice(scenario); + } + lastReport = report; + + APIScenarioReportResult reportResult = this.get(report.getId()); + caseReportMap.put(testPlanApiScenario.getApiScenarioId(),reportResult); reportIds.add(report.getId()); } TestPlanReportService testPlanReportService = CommonBeanFactory.getBean(TestPlanReportService.class); testPlanLog.info("TestPlanReportId" + JSONArray.toJSONString(testPlanReportIdList) + " EXECUTE OVER. SCENARIO STATUS : " + JSONObject.toJSONString(scenarioAndErrorMap)); - for (String planId : testPlanReportIdList) { - testPlanReportService.updateExecuteApis(planId, null, scenarioAndErrorMap, null); + for (String reportId : testPlanReportIdList) { + TestPlanReportExecuteCatch.updateApiTestPlanExecuteInfo(reportId,null,scenarioAndErrorMap,null); + TestPlanReportExecuteCatch.updateTestPlanExecuteResultInfo(reportId,null,caseReportMap,null); } return lastReport; @@ -363,6 +424,7 @@ public class ApiScenarioReportService { if (CollectionUtils.isNotEmpty(reportList)) { reportList.forEach(report -> { report.setUpdateTime(System.currentTimeMillis()); + report.setEndTime(System.currentTimeMillis()); String status = "Error"; report.setStatus(status); scenarioReportMapper.updateByPrimaryKeySelective(report); @@ -385,9 +447,12 @@ public class ApiScenarioReportService { if (CollectionUtils.isNotEmpty(reportIds)) { TestResult testResult = new TestResult(); testResult.setTestId(UUID.randomUUID().toString()); - ApiScenarioReportDetailExample example = new ApiScenarioReportDetailExample(); - example.createCriteria().andReportIdIn(reportIds); - List details = apiScenarioReportDetailMapper.selectByExampleWithBLOBs(example); + + StringBuilder idStr = new StringBuilder(); + reportIds.forEach(item -> { + idStr.append("\"").append(item).append("\"").append(","); + }); + List details = extApiScenarioReportDetailMapper.selectByIds(idStr.toString().substring(0, idStr.toString().length() - 1), "\"" + StringUtils.join(reportIds, ",") + "\""); ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 记录单场景通过率 @@ -413,7 +478,7 @@ public class ApiScenarioReportService { String passRate = new DecimalFormat("0%").format((float) scenarioResult.getSuccess() / (scenarioResult.getSuccess() + scenarioResult.getError())); passRateMap.put(detail.getReportId(), passRate); } catch (Exception e) { - LogUtil.error(e.getMessage()); + LogUtil.error(e); } } @@ -424,6 +489,7 @@ public class ApiScenarioReportService { if (StringUtils.isNotEmpty(report.getTriggerMode()) && report.getTriggerMode().equals("CASE")) { report.setTriggerMode(TriggerMode.MANUAL.name()); } + report.setEndTime(System.currentTimeMillis()); apiScenarioReportMapper.updateByPrimaryKey(report); ApiScenarioReportDetail detail = new ApiScenarioReportDetail(); @@ -516,7 +582,15 @@ public class ApiScenarioReportService { String passRate = new DecimalFormat("0%").format((float) item.getSuccess() / (item.getSuccess() + item.getError())); scenario.setPassRate(passRate); scenario.setReportId(report.getId()); + int executeTimes = 0; + if (scenario.getExecuteTimes() != null) { + executeTimes = scenario.getExecuteTimes().intValue(); + } + scenario.setExecuteTimes(executeTimes + 1); + apiScenarioMapper.updateByPrimaryKey(scenario); + // 发送通知 + sendNotice(scenario); } lastReport = report; } @@ -533,6 +607,39 @@ public class ApiScenarioReportService { return lastReport; } + + private void sendNotice(ApiScenario result) { + + BeanMap beanMap = new BeanMap(result); + + String event; + String status; + if (StringUtils.equals(result.getLastResult(), "Success")) { + event = NoticeConstants.Event.EXECUTE_SUCCESSFUL; + status = "成功"; + } else { + event = NoticeConstants.Event.EXECUTE_FAILED; + status = "失败"; + } + + Map paramMap = new HashMap<>(beanMap); + paramMap.put("operator", SessionUtils.getUserId()); + paramMap.put("status", result.getLastResult()); + String context = "${operator}执行接口自动化" + status + ": ${name}"; + NoticeModel noticeModel = NoticeModel.builder() + .operator(SessionUtils.getUserId()) + .context(context) + .subject("接口自动化通知") + .successMailTemplate("api/ScenarioResult") + .failedMailTemplate("api/ScenarioResult") + .paramMap(paramMap) + .event(event) + .build(); + + String taskType = NoticeConstants.TaskType.API_AUTOMATION_TASK; + noticeSendService.send(taskType, noticeModel); + } + public String update(APIScenarioReportResult test) { ApiScenarioReport report = updateReport(test); ApiScenarioReportDetail detail = apiScenarioReportDetailMapper.selectByPrimaryKey(test.getId()); @@ -709,4 +816,8 @@ public class ApiScenarioReportService { } return null; } + + public List countByApiScenarioId() { + return extApiScenarioReportMapper.countByApiScenarioId(); + } } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java b/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java index 88bd497479..769ee8cfde 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java @@ -193,8 +193,7 @@ public class ApiTestCaseService { } public ApiTestCase create(SaveApiTestCaseRequest request, List bodyFiles) { - ApiTestCase test = createTest(request); - FileUtils.createBodyFiles(request.getId(), bodyFiles); + ApiTestCase test = createTest(request, bodyFiles); return test; } @@ -265,16 +264,24 @@ public class ApiTestCaseService { } public Boolean hasSameCase(SaveApiTestCaseRequest request) { + if (getSameCase(request) != null) { + return true; + } + return false; + } + + public ApiTestCase getSameCase(SaveApiTestCaseRequest request) { ApiTestCaseExample example = new ApiTestCaseExample(); ApiTestCaseExample.Criteria criteria = example.createCriteria(); criteria.andNameEqualTo(request.getName()).andApiDefinitionIdEqualTo(request.getApiDefinitionId()); if (StringUtils.isNotBlank(request.getId())) { criteria.andIdNotEqualTo(request.getId()); } - if (apiTestCaseMapper.countByExample(example) > 0) { - return true; + List apiTestCases = apiTestCaseMapper.selectByExample(example); + if (CollectionUtils.isNotEmpty(apiTestCases)) { + return apiTestCases.get(0); } - return false; + return null; } private ApiTestCase updateTest(SaveApiTestCaseRequest request) { @@ -295,25 +302,29 @@ public class ApiTestCaseService { test.setUpdateTime(System.currentTimeMillis()); test.setDescription(request.getDescription()); test.setVersion(request.getVersion() == null ? 0 : request.getVersion() + 1); + test.setFollowPeople(request.getFollowPeople()); if (StringUtils.equals("[]", request.getTags())) { test.setTags(""); } else { test.setTags(request.getTags()); } apiTestCaseMapper.updateByPrimaryKeySelective(test); - return test; + return apiTestCaseMapper.selectByPrimaryKey(request.getId()); } - private ApiTestCase createTest(SaveApiTestCaseRequest request) { + private ApiTestCase createTest(SaveApiTestCaseRequest request, List bodyFiles) { checkNameExist(request); + FileUtils.createBodyFiles(request.getId(), bodyFiles); if (StringUtils.isNotEmpty(request.getEsbDataStruct()) || StringUtils.isNotEmpty(request.getBackEsbDataStruct())) { request = esbApiParamService.handleEsbRequest(request); } + FileUtils.copyBdyFile(request.getApiDefinitionId(), request.getId()); final ApiTestCaseWithBLOBs test = new ApiTestCaseWithBLOBs(); test.setId(request.getId()); test.setName(request.getName()); + test.setStatus(""); test.setApiDefinitionId(request.getApiDefinitionId()); test.setCreateUserId(Objects.requireNonNull(SessionUtils.getUser()).getId()); test.setUpdateUserId(Objects.requireNonNull(SessionUtils.getUser()).getId()); @@ -324,13 +335,18 @@ public class ApiTestCaseService { test.setUpdateTime(System.currentTimeMillis()); test.setDescription(request.getDescription()); test.setNum(getNextNum(request.getApiDefinitionId())); + test.setFollowPeople(request.getFollowPeople()); if (StringUtils.equals("[]", request.getTags())) { test.setTags(""); } else { test.setTags(request.getTags()); } - FileUtils.copyBdyFile(request.getApiDefinitionId(), request.getId()); - apiTestCaseMapper.insert(test); + ApiTestCaseWithBLOBs apiTestCaseWithBLOBs = apiTestCaseMapper.selectByPrimaryKey(test.getId()); + if (apiTestCaseWithBLOBs != null) { + apiTestCaseMapper.updateByPrimaryKey(apiTestCaseWithBLOBs); + } else { + apiTestCaseMapper.insert(test); + } return test; } @@ -512,7 +528,7 @@ public class ApiTestCaseService { public void deleteBatchByParam(ApiTestBatchRequest request) { List ids = request.getIds(); if (request.isSelectAll()) { - ids = this.getAllApiCaseIdsByFontedSelect(request.getFilters(), request.getModuleIds(), request.getName(), request.getProjectId(), request.getProtocol(), request.getUnSelectIds(), request.getStatus(), null); + ids = this.getAllApiCaseIdsByFontedSelect(request.getFilters(), request.getModuleIds(), request.getName(), request.getProjectId(), request.getProtocol(), request.getUnSelectIds(), request.getStatus(), null, request.getCombine()); } this.deleteBatch(ids); } @@ -520,7 +536,7 @@ public class ApiTestCaseService { public void editApiBathByParam(ApiTestBatchRequest request) { List ids = request.getIds(); if (request.isSelectAll()) { - ids = this.getAllApiCaseIdsByFontedSelect(request.getFilters(), request.getModuleIds(), request.getName(), request.getProjectId(), request.getProtocol(), request.getUnSelectIds(), request.getStatus(), null); + ids = this.getAllApiCaseIdsByFontedSelect(request.getFilters(), request.getModuleIds(), request.getName(), request.getProjectId(), request.getProtocol(), request.getUnSelectIds(), request.getStatus(), null, request.getCombine()); } ApiTestCaseExample apiDefinitionExample = new ApiTestCaseExample(); apiDefinitionExample.createCriteria().andIdIn(ids); @@ -575,7 +591,7 @@ public class ApiTestCaseService { } } catch (Exception e) { e.printStackTrace(); - LogUtil.error(e.getMessage()); + LogUtil.error(e); } String requestStr = JSON.toJSONString(req); apiTestCase.setRequest(requestStr); @@ -585,7 +601,7 @@ public class ApiTestCaseService { } } - private List getAllApiCaseIdsByFontedSelect(Map> filters, List moduleIds, String name, String projectId, String protocol, List unSelectIds, String status, String apiId) { + private List getAllApiCaseIdsByFontedSelect(Map> filters, List moduleIds, String name, String projectId, String protocol, List unSelectIds, String status, String apiId, Map combine) { ApiTestCaseRequest selectRequest = new ApiTestCaseRequest(); selectRequest.setFilters(filters); selectRequest.setModuleIds(moduleIds); @@ -595,6 +611,9 @@ public class ApiTestCaseService { selectRequest.setStatus(status); selectRequest.setWorkspaceId(SessionUtils.getCurrentWorkspaceId()); selectRequest.setApiDefinitionId(apiId); + if (combine != null) { + selectRequest.setCombine(combine); + } List list = extApiTestCaseMapper.listSimple(selectRequest); List allIds = list.stream().map(ApiTestCaseDTO::getId).collect(Collectors.toList()); List ids = allIds.stream().filter(id -> !unSelectIds.contains(id)).collect(Collectors.toList()); @@ -688,7 +707,7 @@ public class ApiTestCaseService { // 调用执行方法 jMeterService.runLocal(id, jmeterHashTree, debugReportId, runMode); } catch (Exception ex) { - LogUtil.error(ex.getMessage()); + LogUtil.error(ex); } } return id; @@ -846,7 +865,7 @@ public class ApiTestCaseService { public void deleteToGcByParam(ApiTestBatchRequest request) { List ids = request.getIds(); if (request.isSelectAll()) { - ids = this.getAllApiCaseIdsByFontedSelect(request.getFilters(), request.getModuleIds(), request.getName(), request.getProjectId(), request.getProtocol(), request.getUnSelectIds(), request.getStatus(), request.getApiDefinitionId()); + ids = this.getAllApiCaseIdsByFontedSelect(request.getFilters(), request.getModuleIds(), request.getName(), request.getProjectId(), request.getProtocol(), request.getUnSelectIds(), request.getStatus(), request.getApiDefinitionId(), request.getCombine()); } this.deleteToGc(ids); } @@ -854,7 +873,7 @@ public class ApiTestCaseService { public List reduction(ApiTestBatchRequest request) { List ids = request.getIds(); if (request.isSelectAll()) { - ids = this.getAllApiCaseIdsByFontedSelect(request.getFilters(), request.getModuleIds(), request.getName(), request.getProjectId(), request.getProtocol(), request.getUnSelectIds(), request.getStatus(), null); + ids = this.getAllApiCaseIdsByFontedSelect(request.getFilters(), request.getModuleIds(), request.getName(), request.getProjectId(), request.getProtocol(), request.getUnSelectIds(), request.getStatus(), null, request.getCombine()); } List cannotReductionAPiName = new ArrayList<>(); @@ -870,7 +889,6 @@ public class ApiTestCaseService { cannotReductionApiCaseList.stream().map(ApiTestCaseDTO::getId).collect(Collectors.toList()); List deleteIds = ids.stream().filter(id -> !cannotReductionCaseId.contains(id)).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(deleteIds)) { - extApiTestCaseMapper.checkOriginalStatusByIds(deleteIds); extApiTestCaseMapper.reduction(deleteIds); } } @@ -888,7 +906,7 @@ public class ApiTestCaseService { public DeleteCheckResult checkDeleteDatas(ApiTestBatchRequest request) { List deleteIds = request.getIds(); if (request.isSelectAll()) { - deleteIds = this.getAllApiCaseIdsByFontedSelect(request.getFilters(), request.getModuleIds(), request.getName(), request.getProjectId(), request.getProtocol(), request.getUnSelectIds(), request.getStatus(), request.getApiDefinitionId()); + deleteIds = this.getAllApiCaseIdsByFontedSelect(request.getFilters(), request.getModuleIds(), request.getName(), request.getProjectId(), request.getProtocol(), request.getUnSelectIds(), request.getStatus(), request.getApiDefinitionId(), request.getCombine()); } DeleteCheckResult result = new DeleteCheckResult(); List checkMsgList = new ArrayList<>(); @@ -987,4 +1005,12 @@ public class ApiTestCaseService { return jmxInfoDTO; } + public List getApiCaseByIds(List apiCaseIds) { + if (CollectionUtils.isNotEmpty(apiCaseIds)) { + ApiTestCaseExample example = new ApiTestCaseExample(); + example.createCriteria().andIdIn(apiCaseIds); + return apiTestCaseMapper.selectByExample(example); + } + return new ArrayList<>(); + } } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiTestEnvironmentService.java b/backend/src/main/java/io/metersphere/api/service/ApiTestEnvironmentService.java index 14b0ba4bfb..af09431f0a 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiTestEnvironmentService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiTestEnvironmentService.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import io.metersphere.api.dto.ApiTestEnvironmentDTO; import io.metersphere.api.dto.mockconfig.MockConfigStaticData; +import io.metersphere.api.tcp.TCPPool; import io.metersphere.base.domain.ApiTestEnvironmentExample; import io.metersphere.base.domain.ApiTestEnvironmentWithBLOBs; import io.metersphere.base.domain.Project; @@ -138,10 +139,12 @@ public class ApiTestEnvironmentService { * @param projectId * @return */ - public synchronized ApiTestEnvironmentWithBLOBs getMockEnvironmentByProjectId(String projectId, String protocal, String baseUrl) { - //创建的时候检查当前站点 + public synchronized ApiTestEnvironmentWithBLOBs getMockEnvironmentByProjectId(String projectId) { + SystemParameterService systemParameterService = CommonBeanFactory.getBean(SystemParameterService.class); BaseSystemConfigDTO baseSystemConfigDTO = systemParameterService.getBaseInfo(); + String baseUrl = baseSystemConfigDTO.getUrl(); + String protocal = "http"; if (baseSystemConfigDTO != null && StringUtils.isNotEmpty(baseSystemConfigDTO.getUrl())) { baseUrl = baseSystemConfigDTO.getUrl(); if (baseUrl.startsWith("http:")) { @@ -170,6 +173,8 @@ public class ApiTestEnvironmentService { private ApiTestEnvironmentWithBLOBs checkMockEvnIsRightful(ApiTestEnvironmentWithBLOBs returnModel, String protocal, String projectId,String projectNumber, String name, String url) { boolean needUpdate = false; + ProjectService projectService = CommonBeanFactory.getBean(ProjectService.class); + Project project = projectService.getProjectById(projectId); if (returnModel.getConfig() != null) { try { JSONObject configObj = JSONObject.parseObject(returnModel.getConfig()); @@ -207,6 +212,26 @@ public class ApiTestEnvironmentService { } } } + + if(project.getMockTcpPort() != null && project.getMockTcpPort().intValue() != 0){ + if(configObj.containsKey("tcpConfig")){ + if(configObj.containsKey("port")){ + if(configObj.getInteger("port").intValue() != project.getMockTcpPort().intValue()){ + needUpdate = true; + } + }else { + needUpdate = true; + } + + if(configObj.containsKey("server")){ + if(!StringUtils.equals(configObj.getString("server"),url)){ + needUpdate = true; + } + }else { + needUpdate = true; + } + } + } } catch (Exception e) { needUpdate = true; e.printStackTrace(); @@ -214,21 +239,35 @@ public class ApiTestEnvironmentService { } if (needUpdate) { String id = returnModel.getId(); - returnModel = this.genHttpApiTestEnvironmentByUrl(projectId,projectNumber, protocal, name, url); + returnModel = this.genHttpApiTestEnvironmentByUrl(project,projectNumber, protocal, name, url); returnModel.setId(id); apiTestEnvironmentMapper.updateByPrimaryKeyWithBLOBs(returnModel); } return returnModel; } - private ApiTestEnvironmentWithBLOBs genHttpApiTestEnvironmentByUrl(String projectId,String projectNumber, String protocal, String name, String url) { + private ApiTestEnvironmentWithBLOBs genHttpApiTestEnvironmentByUrl(String projectId,String projectNumber, String protocal, String name, String baseUrl) { + ProjectService projectService = CommonBeanFactory.getBean(ProjectService.class); + Project project = projectService.getProjectById(projectId); + if(project != null){ + return this.genHttpApiTestEnvironmentByUrl(project,projectNumber, protocal, name, baseUrl); + } + return null; + } + + private ApiTestEnvironmentWithBLOBs genHttpApiTestEnvironmentByUrl(Project project,String projectNumber, String protocal, String name, String baseUrl) { String socket = ""; + String url = baseUrl; if (url.startsWith("http://")) { url = url.substring(7); } else if (url.startsWith("https://")) { url = url.substring(8); } socket = url; + String tcpSocket = socket; + if(StringUtils.isNotEmpty(tcpSocket) && tcpSocket.contains(":")){ + tcpSocket = socket.split(":")[0]; + } String portStr = ""; String ipStr = url; @@ -301,6 +340,12 @@ public class ApiTestEnvironmentService { tcpConfigObj.put("reUseConnection", false); tcpConfigObj.put("nodelay", false); tcpConfigObj.put("closeConnection", false); + if(project != null){ + if(project.getMockTcpPort() != null && project.getMockTcpPort().intValue() != 0){ + tcpConfigObj.put("server", tcpSocket); + tcpConfigObj.put("port", project.getMockTcpPort().intValue()); + } + } JSONObject object = new JSONObject(); object.put("commonConfig", commonConfigObj); @@ -309,7 +354,7 @@ public class ApiTestEnvironmentService { object.put("tcpConfig", tcpConfigObj); ApiTestEnvironmentWithBLOBs blobs = new ApiTestEnvironmentWithBLOBs(); - blobs.setProjectId(projectId); + blobs.setProjectId(project.getId()); blobs.setName(name); blobs.setConfig(object.toString()); @@ -353,4 +398,36 @@ public class ApiTestEnvironmentService { } return null; } + + public String getMockInfo(String projectId) { + String returnStr = ""; + ApiTestEnvironmentWithBLOBs mockEnv = this.getMockEnvironmentByProjectId(projectId); + if (mockEnv != null && mockEnv.getConfig() != null) { + try { + JSONObject configObj = JSONObject.parseObject(mockEnv.getConfig()); + + if(configObj.containsKey("tcpConfig")){ + JSONObject tcpConfigObj = configObj.getJSONObject("tcpConfig"); + int tcpPort = 0; + if(tcpConfigObj.containsKey("port")){ + tcpPort = tcpConfigObj.getInteger("port").intValue(); + if(tcpPort == 0 || !TCPPool.isTcpOpen(tcpPort)){ + return returnStr; + } + }else { + return returnStr; + } + if(tcpConfigObj.containsKey("server")){ + String server = tcpConfigObj.getString("server"); + returnStr = server +":"+ tcpPort; + }else { + return returnStr; + } + } + }catch (Exception e){ + e.printStackTrace(); + } + } + return returnStr; + } } diff --git a/backend/src/main/java/io/metersphere/api/service/CommandService.java b/backend/src/main/java/io/metersphere/api/service/CommandService.java index 581c92b65c..c63c86bf6f 100644 --- a/backend/src/main/java/io/metersphere/api/service/CommandService.java +++ b/backend/src/main/java/io/metersphere/api/service/CommandService.java @@ -11,6 +11,7 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.jorphan.exec.SystemCommand; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.BufferedReader; @@ -19,6 +20,7 @@ import java.io.InputStreamReader; import java.util.*; @Service +@Transactional(rollbackFor = Exception.class) public class CommandService { public List get(String password, MultipartFile file) { @@ -56,7 +58,7 @@ public class CommandService { FileUtils.deleteFile(path); return dtoList; } catch (Exception e) { - LogUtil.error(e.getMessage()); + LogUtil.error(e); MSException.throwException(e.getMessage()); } return null; @@ -146,14 +148,14 @@ public class CommandService { MSException.throwException("合并条目:【" + entry.getOriginalAsName() + " 】失败"); } } catch (Exception e) { - LogUtil.error(e.getMessage()); + LogUtil.error(e); } }); } }); } } catch (Exception e) { - LogUtil.error(e.getMessage()); + LogUtil.error(e); MSException.throwException(e.getMessage()); } } @@ -175,7 +177,7 @@ public class CommandService { } return true; } catch (Exception e) { - LogUtil.error(e.getMessage()); + LogUtil.error(e); MSException.throwException(e.getMessage()); return false; } diff --git a/backend/src/main/java/io/metersphere/api/service/MockConfigService.java b/backend/src/main/java/io/metersphere/api/service/MockConfigService.java index 13ab227b63..f3f3104045 100644 --- a/backend/src/main/java/io/metersphere/api/service/MockConfigService.java +++ b/backend/src/main/java/io/metersphere/api/service/MockConfigService.java @@ -4,6 +4,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONValidator; +import io.metersphere.api.dto.automation.EsbDataStruct; +import io.metersphere.api.dto.automation.TcpTreeTableDataStruct; +import io.metersphere.api.dto.automation.parse.TcpTreeTableDataParser; import io.metersphere.api.dto.mockconfig.MockConfigRequest; import io.metersphere.api.dto.mockconfig.MockExpectConfigRequest; import io.metersphere.api.dto.mockconfig.response.JsonSchemaReturnObj; @@ -12,22 +15,28 @@ import io.metersphere.api.dto.mockconfig.response.MockExpectConfigResponse; import io.metersphere.base.domain.*; import io.metersphere.base.mapper.MockConfigMapper; import io.metersphere.base.mapper.MockExpectConfigMapper; +import io.metersphere.base.mapper.ProjectMapper; +import io.metersphere.base.mapper.ext.ExtMockExpectConfigMapper; import io.metersphere.commons.exception.MSException; -import io.metersphere.commons.utils.JsonPathUtils; +import io.metersphere.commons.utils.*; import io.metersphere.jmeter.utils.ScriptEngineUtils; -import io.metersphere.commons.utils.SessionUtils; import io.metersphere.i18n.Translator; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.json.XML; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.xml.sax.InputSource; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; import java.io.*; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; @Service @@ -39,7 +48,11 @@ public class MockConfigService { @Resource private MockExpectConfigMapper mockExpectConfigMapper; @Resource + private ExtMockExpectConfigMapper extMockExpectConfigMapper; + @Resource private ApiDefinitionService apiDefinitionService; + @Resource + private ProjectMapper projectMapper; public MockConfigResponse findByApiIdList(List apiIdList) { if (apiIdList.isEmpty()) { @@ -96,12 +109,14 @@ public class MockConfigService { MockConfig config = new MockConfig(); config.setProjectId(request.getProjectId()); - config.setApiId(request.getApiId()); config.setId(UUID.randomUUID().toString()); config.setCreateUserId(SessionUtils.getUserId()); config.setCreateTime(createTimeStmp); config.setUpdateTime(createTimeStmp); - mockConfigMapper.insert(config); + if(request.getApiId() != null){ + config.setApiId(request.getApiId()); + mockConfigMapper.insert(config); + } returnRsp = new MockConfigResponse(config, new ArrayList<>()); } else { MockConfig config = configList.get(0); @@ -182,7 +197,7 @@ public class MockConfigService { JSONObject requestObj = model.getRequest(); boolean isJsonParam = requestObj.getBoolean("jsonParam"); if (isJsonParam) { - if(StringUtils.isEmpty(requestObj.getString("jsonData"))){ + if (StringUtils.isEmpty(requestObj.getString("jsonData"))) { return model; } } else { @@ -219,13 +234,13 @@ public class MockConfigService { if (isJsonParam) { String jsonParams = requestObj.getString("jsonData"); JSONValidator jsonValidator = JSONValidator.from(jsonParams); - if(StringUtils.equalsIgnoreCase("Array",jsonValidator.getType().name())){ + if (StringUtils.equalsIgnoreCase("Array", jsonValidator.getType().name())) { JSONArray mockExpectArr = JSONArray.parseArray(jsonParams); - for(int expectIndex = 0;expectIndex < mockExpectArr.size(); expectIndex ++){ + for (int expectIndex = 0; expectIndex < mockExpectArr.size(); expectIndex++) { JSONObject itemObj = mockExpectArr.getJSONObject(expectIndex); mockExpectJson = itemObj; } - }else if(StringUtils.equalsIgnoreCase("Object",jsonValidator.getType().name())){ + } else if (StringUtils.equalsIgnoreCase("Object", jsonValidator.getType().name())) { JSONObject mockExpectJsonItem = JSONObject.parseObject(jsonParams); mockExpectJson = mockExpectJsonItem; } @@ -247,7 +262,7 @@ public class MockConfigService { } } - boolean mathing = JsonPathUtils.checkJsonObjCompliance(reqJsonObj, mockExpectJson); + boolean mathing = JsonStructUtils.checkJsonObjCompliance(reqJsonObj, mockExpectJson); if (mathing) { returnModel = model; break; @@ -271,7 +286,7 @@ public class MockConfigService { boolean isJsonParam = requestObj.getBoolean("jsonParam"); if (isJsonParam) { - if(StringUtils.isEmpty(requestObj.getString("jsonData"))){ + if (StringUtils.isEmpty(requestObj.getString("jsonData"))) { return model; } } else { @@ -308,18 +323,18 @@ public class MockConfigService { if (isJsonParam) { String jsonParams = requestObj.getString("jsonData"); JSONValidator jsonValidator = JSONValidator.from(jsonParams); - if(StringUtils.equalsIgnoreCase("Array",jsonValidator.getType().name())){ + if (StringUtils.equalsIgnoreCase("Array", jsonValidator.getType().name())) { JSONArray mockExpectArr = JSONArray.parseArray(jsonParams); - for(int expectIndex = 0;expectIndex < mockExpectArr.size(); expectIndex ++){ + for (int expectIndex = 0; expectIndex < mockExpectArr.size(); expectIndex++) { JSONObject itemObj = mockExpectArr.getJSONObject(expectIndex); - mathing = JsonPathUtils.checkJsonArrayCompliance(reqJsonArray, itemObj); - if(!mathing){ + mathing = JsonStructUtils.checkJsonArrayCompliance(reqJsonArray, itemObj); + if (!mathing) { break; } } - }else if(StringUtils.equalsIgnoreCase("Object",jsonValidator.getType().name())){ + } else if (StringUtils.equalsIgnoreCase("Object", jsonValidator.getType().name())) { JSONObject mockExpectJson = JSONObject.parseObject(jsonParams); - mathing = JsonPathUtils.checkJsonArrayCompliance(reqJsonArray, mockExpectJson); + mathing = JsonStructUtils.checkJsonArrayCompliance(reqJsonArray, mockExpectJson); } } else { @@ -339,7 +354,7 @@ public class MockConfigService { mockExpectJson.put(name, value); } } - mathing = JsonPathUtils.checkJsonArrayCompliance(reqJsonArray, mockExpectJson); + mathing = JsonStructUtils.checkJsonArrayCompliance(reqJsonArray, mockExpectJson); } if (mathing) { returnModel = model; @@ -393,9 +408,9 @@ public class MockConfigService { public String updateHttpServletResponse(List apis, HttpServletResponse response) { String returnStr = ""; try { - if(CollectionUtils.isEmpty(apis)){ + if (CollectionUtils.isEmpty(apis)) { response.setStatus(404); - }else { + } else { for (ApiDefinitionWithBLOBs api : apis) { int status = 404; if (api.getResponse() != null) { @@ -509,7 +524,7 @@ public class MockConfigService { } } } - if(StringUtils.isNotEmpty(returnStr) && status == 404){ + if (StringUtils.isNotEmpty(returnStr) && status == 404) { status = 200; } response.setStatus(status); @@ -524,8 +539,8 @@ public class MockConfigService { private JSONObject parseJsonSchema(JSONObject bodyReturnObj) { JSONObject returnObj = new JSONObject(); - if(bodyReturnObj == null){ - return returnObj; + if (bodyReturnObj == null) { + return returnObj; } Set keySet = bodyReturnObj.keySet(); @@ -556,7 +571,7 @@ public class MockConfigService { } } } - }else { + } else { String values = obj.getMockValue(); if (StringUtils.isEmpty(values)) { values = ""; @@ -612,9 +627,9 @@ public class MockConfigService { try { String param = this.getRequestPostStr(request); JSONValidator jsonValidator = JSONValidator.from(param); - if(StringUtils.equalsIgnoreCase("Array",jsonValidator.getType().name())){ + if (StringUtils.equalsIgnoreCase("Array", jsonValidator.getType().name())) { returnJson = JSONArray.parseArray(param); - }else if(StringUtils.equalsIgnoreCase("Object",jsonValidator.getType().name())){ + } else if (StringUtils.equalsIgnoreCase("Object", jsonValidator.getType().name())) { returnJson = JSONObject.parseObject(param); } } catch (Exception e) { @@ -732,39 +747,51 @@ public class MockConfigService { } } -// List sendParams = new ArrayList<>(); -// for (String param : pathArr) { -// if (param.startsWith("{") && param.endsWith("}")) { -// param = param.substring(1, param.length() - 1); -// sendParams.add(param); -// } -// } -// try { -// JSONObject requestJson = JSONObject.parseObject(api.getRequest()); -// if (requestJson.containsKey("rest")) { -// JSONArray jsonArray = requestJson.getJSONArray("rest"); -// for (int i = 0; i < jsonArray.size(); i++) { -// JSONObject object = jsonArray.getJSONObject(i); -// if (object.containsKey("name") && object.containsKey("enable") && object.getBoolean("enable")) { -// String name = object.getString("name"); -// if (sendParams.contains(name)) { -// String value = ""; -// if (object.containsKey("value")) { -// value = object.getString("value"); -// } -// returnJson.put(name, value); -// } -// } -// } -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } } return returnJson; } public List> getApiParamsByApiDefinitionBLOBs(ApiDefinitionWithBLOBs apiModel) { + if (apiModel == null) { + return new ArrayList<>(); + } else if (StringUtils.equalsIgnoreCase("tcp", apiModel.getMethod())) { + return this.getTCPApiParams(apiModel); + } else { + return this.getHTTPApiParams(apiModel); + } + } + + private List> getTCPApiParams(ApiDefinitionWithBLOBs apiModel) { + List> list = new ArrayList<>(); + List paramNameList = new ArrayList<>(); + if (apiModel != null) { + if (apiModel.getRequest() != null) { + JSONObject requestObj = this.genJSONObject(apiModel.getRequest()); + if (requestObj != null && requestObj.containsKey("reportType")) { + String reportType = requestObj.getString("reportType"); + if (StringUtils.equalsIgnoreCase(reportType, "xml") && requestObj.containsKey("xmlDataStruct")) { + paramNameList = this.parseByTcpTreeDataStruct(requestObj.getString("xmlDataStruct")); + } else if (StringUtils.equalsIgnoreCase(reportType, "json") && requestObj.containsKey("jsonDataStruct")) { + paramNameList = this.parseByJsonDataStruct(requestObj.getString("jsonDataStruct")); + } else if (requestObj.containsKey("protocol")) { + String protocol = requestObj.getString("protocol"); + if (StringUtils.equalsIgnoreCase("ESB", protocol) && requestObj.containsKey("esbDataStruct")) { + paramNameList = this.parseByESBDataStruct(requestObj.getString("esbDataStruct")); + } + } + } + } + } + + for (String param : paramNameList) { + Map map = new HashMap<>(); + map.put("value", param); + list.add(map); + } + return list; + } + + private List> getHTTPApiParams(ApiDefinitionWithBLOBs apiModel) { List> list = new ArrayList<>(); List paramNameList = new ArrayList<>(); if (apiModel != null) { @@ -893,15 +920,15 @@ public class MockConfigService { if (mockConfigData != null && mockConfigData.getMockExpectConfigList() != null) { JSON paramJson = this.getPostParamMap(request); - if(paramJson instanceof JSONObject){ - JSONObject paramMap = (JSONObject)paramJson; + if (paramJson instanceof JSONObject) { + JSONObject paramMap = (JSONObject) paramJson; MockExpectConfigResponse finalExpectConfig = this.findExpectConfig(mockConfigData.getMockExpectConfigList(), paramMap); if (finalExpectConfig != null) { isMatch = true; returnStr = this.updateHttpServletResponse(finalExpectConfig, response); } - }else if(paramJson instanceof JSONArray){ - JSONArray paramArray = (JSONArray)paramJson; + } else if (paramJson instanceof JSONArray) { + JSONArray paramArray = (JSONArray) paramJson; MockExpectConfigResponse finalExpectConfig = this.findExpectConfig(mockConfigData.getMockExpectConfigList(), paramArray); if (finalExpectConfig != null) { isMatch = true; @@ -922,7 +949,7 @@ public class MockConfigService { String returnStr = ""; boolean isMatch = false; List aualifiedApiList = new ArrayList<>(); - if(project != null){ + if (project != null) { String urlSuffix = this.getUrlSuffix(project.getSystemId(), request); aualifiedApiList = apiDefinitionService.preparedUrl(project.getId(), method, null, urlSuffix); @@ -1001,4 +1028,163 @@ public class MockConfigService { } return new String(buffer, charEncoding); } + + private List parseByJsonDataStruct(String dataString) { + List returnList = new ArrayList<>(); + try { + JSONValidator validator = JSONValidator.from(dataString); + Map keyValueMap = new HashMap<>(); + if (StringUtils.equalsIgnoreCase(validator.getType().name(), "Object")) { + JsonStructUtils.deepParseKeyByJsonObject(JSONObject.parseObject(dataString), returnList); + } else if (StringUtils.equalsIgnoreCase(validator.getType().name(), "Array")) { + JsonStructUtils.deepParseKeyByJsonArray(JSONArray.parseArray(dataString), returnList); + } + } catch (Exception e) { + LogUtil.error(e.getMessage()); + } + return returnList; + } + + private List parseByTcpTreeDataStruct(String dataString) { + List list = JSONArray.parseArray(dataString, TcpTreeTableDataStruct.class); + List returnList = new ArrayList<>(); + for (TcpTreeTableDataStruct dataStruct : list) { + List nameList = dataStruct.getNameDeep(); + for (String name : nameList) { + if (!returnList.contains(nameList)) { + returnList.add(name); + } + } + } + return returnList; + } + + private List parseByESBDataStruct(String dataString) { + List list = JSONArray.parseArray(dataString, EsbDataStruct.class); + List returnList = new ArrayList<>(); + for (EsbDataStruct dataStruct : list) { + List nameList = dataStruct.getNameDeep(); + for (String name : nameList) { + if (!returnList.contains(nameList)) { + returnList.add(name); + } + } + } + return returnList; + } + + public MockExpectConfigWithBLOBs matchTcpMockExpect(String message, int port) { + ProjectExample projectExample = new ProjectExample(); + projectExample.createCriteria().andMockTcpPortEqualTo(port).andIsMockTcpOpenEqualTo(true); + List projectList = projectMapper.selectByExample(projectExample); + + boolean isJsonMessage = this.checkMessageIsJson(message); + boolean isXMLMessage = this.checkMessageIsXml(message); + + List structResult = new ArrayList<>(); + List rawResult = new ArrayList<>(); + + for (Project project : projectList) { + String projectId = project.getId(); + List mockExpectConfigList = extMockExpectConfigMapper.selectByProjectIdAndStatusIsOpen(projectId); + for (MockExpectConfigWithBLOBs expectConfig : mockExpectConfigList) { + String requestStr = expectConfig.getRequest(); + String responseStr = expectConfig.getResponse(); + if (StringUtils.isEmpty(responseStr)) { + continue; + } + + try { + JSONObject requestJson = JSONObject.parseObject(requestStr); + if (requestJson.containsKey("reportType")) { + boolean isMatch = false; + boolean isRaw = false; + String reportType = requestJson.getString("reportType"); + + if (isJsonMessage && StringUtils.equalsIgnoreCase(reportType, "json")) { + if (requestJson.containsKey("jsonDataStruct")) { + isMatch = JsonStructUtils.checkJsonCompliance(message, requestJson.getString("jsonDataStruct")); + } + } else if (isXMLMessage && StringUtils.equalsIgnoreCase(reportType, "xml")) { + if (requestJson.containsKey("xmlDataStruct")) { + JSONObject sourceObj = XMLUtils.XmlToJson(message); + String xmlStr = ""; + try { + List tcpDataList = JSONArray.parseArray(requestJson.getString("xmlDataStruct"),TcpTreeTableDataStruct.class); + xmlStr = TcpTreeTableDataParser.treeTableData2Xml(tcpDataList); + }catch (Exception e){ + + } + JSONObject matchObj = XMLUtils.XmlToJson(xmlStr); + isMatch = JsonStructUtils.checkJsonObjCompliance(sourceObj, matchObj); + } + } else if (StringUtils.equalsIgnoreCase(reportType, "raw")) { + if (requestJson.containsKey("rawDataStruct")) { + String rawDataStruct = requestJson.getString("rawDataStruct"); + if (StringUtils.contains(message, rawDataStruct)) { + isMatch = true; + isRaw = true; + } else { + Pattern pattern = Pattern.compile(rawDataStruct); + Matcher matcher = pattern.matcher(message); + if (matcher.find()) { + isMatch = true; + isRaw = true; + } + } + } + } + + if (isMatch) { + JSONObject responseObj = JSONObject.parseObject(responseStr); + if (responseObj.containsKey("body")) { + if (isRaw) { + rawResult.add(expectConfig); + } else { + structResult.add(expectConfig); + } + } + } + } + + } catch (Exception e) { + } + } + } + //优先返回结构匹配的数据 + if(!structResult.isEmpty()){ + return structResult.get(0); + }else { + if(!rawResult.isEmpty()){ + return rawResult.get(0); + }else { + return null; + } + } + } + + private boolean checkMessageIsXml(String message) { + boolean isXml = false; + try { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder(); + builder.parse(new InputSource(new ByteArrayInputStream(message.getBytes("utf-8")))); + isXml = true; + } catch (Exception e) { + } + return isXml; + } + + private boolean checkMessageIsJson(String message) { + boolean isJson = false; + try { + JSONValidator validator = JSONValidator.from(message); + String type = validator.getType().name(); + if (!StringUtils.equalsIgnoreCase("value", type)) { + isJson = true; + } + } catch (Exception e) { + } + return isJson; + } } diff --git a/backend/src/main/java/io/metersphere/api/service/MsResultService.java b/backend/src/main/java/io/metersphere/api/service/MsResultService.java index 9772a64784..e5ee054cc0 100644 --- a/backend/src/main/java/io/metersphere/api/service/MsResultService.java +++ b/backend/src/main/java/io/metersphere/api/service/MsResultService.java @@ -12,6 +12,7 @@ import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.threads.JMeterVariables; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import sun.security.util.Cache; import java.util.*; @@ -19,10 +20,15 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @Service +@Transactional(rollbackFor = Exception.class) public class MsResultService { // 零时存放实时结果 private Cache cache = Cache.newHardMemoryCache(0, 3600 * 2); - public ConcurrentHashMap> processCache = new ConcurrentHashMap<>(); + private ConcurrentHashMap> processCache = new ConcurrentHashMap<>(); + + public ConcurrentHashMap> getProcessCache() { + return processCache; + } private final static String THREAD_SPLIT = " "; @@ -213,7 +219,9 @@ public class MsResultService { } //xpath 提取错误会添加断言错误 if (StringUtils.isBlank(responseAssertionResult.getMessage()) || - (StringUtils.isNotBlank(responseAssertionResult.getName()) && !responseAssertionResult.getName().endsWith("XPath2Extractor"))) { + (StringUtils.isNotBlank(responseAssertionResult.getName()) && !responseAssertionResult.getName().endsWith("XPath2Extractor")) + || (StringUtils.isNotBlank(responseAssertionResult.getContent()) && !responseAssertionResult.getContent().endsWith("XPath2Extractor")) + ) { responseResult.getAssertions().add(responseAssertionResult); } } @@ -246,6 +254,15 @@ public class MsResultService { private ResponseAssertionResult getResponseAssertionResult(AssertionResult assertionResult) { ResponseAssertionResult responseAssertionResult = new ResponseAssertionResult(); responseAssertionResult.setName(assertionResult.getName()); + if (StringUtils.isNotEmpty(assertionResult.getName()) && assertionResult.getName().indexOf("==") != -1) { + String array[] = assertionResult.getName().split("=="); + responseAssertionResult.setName(array[0]); + StringBuffer content = new StringBuffer(); + for (int i = 1; i < array.length; i++) { + content.append(array[i]); + } + responseAssertionResult.setContent(content.toString()); + } responseAssertionResult.setPass(!assertionResult.isFailure() && !assertionResult.isError()); if (!responseAssertionResult.isPass()) { responseAssertionResult.setMessage(assertionResult.getFailureMessage()); diff --git a/backend/src/main/java/io/metersphere/api/service/ApiDocumentService.java b/backend/src/main/java/io/metersphere/api/service/ShareInfoService.java similarity index 82% rename from backend/src/main/java/io/metersphere/api/service/ApiDocumentService.java rename to backend/src/main/java/io/metersphere/api/service/ShareInfoService.java index 34367d938b..e88028d464 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiDocumentService.java +++ b/backend/src/main/java/io/metersphere/api/service/ShareInfoService.java @@ -2,15 +2,18 @@ package io.metersphere.api.service; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import io.metersphere.api.dto.document.*; +import io.metersphere.api.dto.share.*; import io.metersphere.base.domain.ApiDefinitionWithBLOBs; -import io.metersphere.base.domain.ApiDocumentShare; -import io.metersphere.base.mapper.ApiDocumentShareMapper; -import io.metersphere.base.mapper.ext.ExtApiDocumentMapper; -import io.metersphere.base.mapper.ext.ExtApiDocumentShareMapper; +import io.metersphere.base.domain.ShareInfo; +import io.metersphere.base.domain.TestPlanApiCase; +import io.metersphere.base.domain.TestPlanApiScenario; +import io.metersphere.base.mapper.ShareInfoMapper; +import io.metersphere.base.mapper.ext.ExtShareInfoMapper; +import io.metersphere.commons.exception.MSException; +import io.metersphere.commons.utils.BeanUtils; import io.metersphere.commons.utils.SessionUtils; -import io.metersphere.dto.BaseSystemConfigDTO; -import io.metersphere.service.SystemParameterService; +import io.metersphere.track.service.TestPlanApiCaseService; +import io.metersphere.track.service.TestPlanScenarioCaseService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,37 +28,41 @@ import java.util.*; */ @Service @Transactional(rollbackFor = Exception.class) -public class ApiDocumentService { +public class ShareInfoService { @Resource - ExtApiDocumentMapper extApiDocumentMapper; + ExtShareInfoMapper extShareInfoMapper; @Resource - ApiDocumentShareMapper apiDocumentShareMapper; + ShareInfoMapper shareInfoMapper; @Resource - ExtApiDocumentShareMapper extApiDocumentShareMapper; + TestPlanApiCaseService testPlanApiCaseService; @Resource - SystemParameterService systemParameterService; + TestPlanScenarioCaseService testPlanScenarioCaseService; public List findApiDocumentSimpleInfoByRequest(ApiDocumentRequest request) { if (this.isParamLegitimacy(request)) { if (request.getProjectId() == null) { - List shareIdList = this.selectShareIdByApiDocumentShareId(request.getShareId()); + List shareIdList = this.selectShareIdByShareInfoId(request.getShareId()); request.setApiIdList(shareIdList); - return extApiDocumentMapper.findApiDocumentSimpleInfoByRequest(request); + if(shareIdList.isEmpty()){ + return new ArrayList<>(); + }else { + return extShareInfoMapper.findApiDocumentSimpleInfoByRequest(request); + } } else { - return extApiDocumentMapper.findApiDocumentSimpleInfoByRequest(request); + return extShareInfoMapper.findApiDocumentSimpleInfoByRequest(request); } } else { return new ArrayList<>(); } } - private List selectShareIdByApiDocumentShareId(String shareId) { + private List selectShareIdByShareInfoId(String shareId) { List shareApiIdList = new ArrayList<>(); - ApiDocumentShare share = apiDocumentShareMapper.selectByPrimaryKey(shareId); + ShareInfo share = shareInfoMapper.selectByPrimaryKey(shareId); if (share != null) { try { - JSONArray jsonArray = JSONArray.parseArray(share.getShareApiId()); + JSONArray jsonArray = JSONArray.parseArray(share.getCustomData()); for (int i = 0; i < jsonArray.size(); i++) { String apiId = jsonArray.getString(i); shareApiIdList.add(apiId); @@ -381,40 +388,42 @@ public class ApiDocumentService { * 搜索的到就返回那条数据,搜索不到就新增一条信息 * * @param request 入参 - * @return ApiDocumentShare数据对象 + * @return ShareInfo数据对象 */ - public ApiDocumentShare generateApiDocumentShare(ApiDocumentShareRequest request) { - ApiDocumentShare apiDocumentShare = null; + public ShareInfo generateApiDocumentShareInfo(ApiDocumentShareRequest request) { if (request.getShareApiIdList() != null && !request.getShareApiIdList().isEmpty() - && StringUtils.equalsAny(request.getShareType(), ApiDocumentShareType.Single.name(), ApiDocumentShareType.Batch.name())) { + && StringUtils.equalsAny(request.getShareType(), ShareInfoType.Single.name(), ShareInfoType.Batch.name())) { //将ID进行排序 - List apiDocumentShareList = this.findByShareTypeAndShareApiIdWithBLOBs(request.getShareType(), request.getShareApiIdList()); - if (apiDocumentShareList.isEmpty()) { - String shareApiIdJsonArrayString = this.genShareIdJsonString(request.getShareApiIdList()); - long createTime = System.currentTimeMillis(); - - apiDocumentShare = new ApiDocumentShare(); - apiDocumentShare.setId(UUID.randomUUID().toString()); - apiDocumentShare.setShareApiId(shareApiIdJsonArrayString); - apiDocumentShare.setCreateUserId(SessionUtils.getUserId()); - apiDocumentShare.setCreateTime(createTime); - apiDocumentShare.setUpdateTime(createTime); - apiDocumentShare.setShareType(request.getShareType()); - apiDocumentShareMapper.insert(apiDocumentShare); - } else { - return apiDocumentShareList.get(0); - } + ShareInfo shareInfoRequest = new ShareInfo(); + BeanUtils.copyBean(shareInfoRequest, request); + shareInfoRequest.setCustomData(genShareIdJsonString(request.getShareApiIdList())); + return generateShareInfo(shareInfoRequest); } - - if (apiDocumentShare == null) { - apiDocumentShare = new ApiDocumentShare(); - } - return apiDocumentShare; + return new ShareInfo(); } - private List findByShareTypeAndShareApiIdWithBLOBs(String shareType, List shareApiIdList) { + public ShareInfo generateShareInfo(ShareInfo request) { + ShareInfo shareInfo = null; + List shareInfos = extShareInfoMapper.selectByShareTypeAndShareApiIdWithBLOBs(request.getShareType(), request.getCustomData()); + if (shareInfos.isEmpty()) { + long createTime = System.currentTimeMillis(); + shareInfo = new ShareInfo(); + shareInfo.setId(UUID.randomUUID().toString()); + shareInfo.setCustomData(request.getCustomData()); + shareInfo.setCreateUserId(SessionUtils.getUserId()); + shareInfo.setCreateTime(createTime); + shareInfo.setUpdateTime(createTime); + shareInfo.setShareType(request.getShareType()); + shareInfoMapper.insert(shareInfo); + return shareInfo; + } else { + return shareInfos.get(0); + } + } + + private List findByShareTypeAndShareApiIdWithBLOBs(String shareType, List shareApiIdList) { String shareApiIdString = this.genShareIdJsonString(shareApiIdList); - return extApiDocumentShareMapper.selectByShareTypeAndShareApiIdWithBLOBs(shareType, shareApiIdString); + return extShareInfoMapper.selectByShareTypeAndShareApiIdWithBLOBs(shareType, shareApiIdString); } /** @@ -428,14 +437,46 @@ public class ApiDocumentService { return JSONArray.toJSONString(treeSet); } - public ApiDocumentShareDTO conversionApiDocumentShareToDTO(ApiDocumentShare apiShare) { - ApiDocumentShareDTO returnDTO = new ApiDocumentShareDTO(); - if (!StringUtils.isEmpty(apiShare.getShareApiId())) { - BaseSystemConfigDTO baseSystemConfigDTO = systemParameterService.getBaseInfo(); + public ShareInfoDTO conversionShareInfoToDTO(ShareInfo apiShare) { + ShareInfoDTO returnDTO = new ShareInfoDTO(); + if (!StringUtils.isEmpty(apiShare.getCustomData())) { String url = "?" + apiShare.getId(); returnDTO.setId(apiShare.getId()); returnDTO.setShareUrl(url); } return returnDTO; } + + public ShareInfo get(String id) { + return shareInfoMapper.selectByPrimaryKey(id); + } + + public void validate(String shareId, String customData) { + ShareInfo shareInfo = shareInfoMapper.selectByPrimaryKey(shareId); + if (shareInfo == null) { + MSException.throwException("shareInfo not exist!"); + } else { + if (!StringUtils.equals(customData, shareInfo.getCustomData())) { + MSException.throwException("validate failure!"); + } + } + } + + public void apiReportValidate(String shareId, String testId) { + ShareInfo shareInfo = shareInfoMapper.selectByPrimaryKey(shareId); + String planId = shareInfo.getCustomData(); + TestPlanApiCase testPlanApiCase = testPlanApiCaseService.getById(testId); + if (!StringUtils.equals(planId, testPlanApiCase.getTestPlanId())) { + MSException.throwException("validate failure!"); + } + } + + public void scenarioReportValidate(String shareId, String reportId) { + ShareInfo shareInfo = shareInfoMapper.selectByPrimaryKey(shareId); + String planId = shareInfo.getCustomData(); + TestPlanApiScenario testPlanApiScenario = testPlanScenarioCaseService.selectByReportId(reportId); + if (!StringUtils.equals(planId, testPlanApiScenario.getTestPlanId())) { + MSException.throwException("validate failure!"); + } + } } diff --git a/backend/src/main/java/io/metersphere/api/service/TestResultService.java b/backend/src/main/java/io/metersphere/api/service/TestResultService.java index 9e8e0b7a46..3a1de372cb 100644 --- a/backend/src/main/java/io/metersphere/api/service/TestResultService.java +++ b/backend/src/main/java/io/metersphere/api/service/TestResultService.java @@ -8,6 +8,7 @@ import io.metersphere.commons.constants.*; import io.metersphere.commons.utils.CommonBeanFactory; import io.metersphere.commons.utils.DateUtils; import io.metersphere.commons.utils.LogUtil; +import io.metersphere.commons.utils.SessionUtils; import io.metersphere.dto.BaseSystemConfigDTO; import io.metersphere.i18n.Translator; import io.metersphere.notice.sender.NoticeModel; @@ -21,6 +22,7 @@ import io.metersphere.track.service.TestPlanTestCaseService; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; @@ -28,6 +30,7 @@ import java.util.List; import java.util.Map; @Service +@Transactional(rollbackFor = Exception.class) public class TestResultService { @Resource @@ -86,12 +89,10 @@ public class TestResultService { reportTask.setExecutionTime(DateUtils.getTimeString(apiTestCaseWithBLOBs.getCreateTime())); reportTask.setExecutionEnvironment(name); //测试计划用例,定时,jenkins - } else if (StringUtils.equalsAny(runMode, ApiRunMode.API_PLAN.name(), ApiRunMode.SCHEDULE_API_PLAN.name(), ApiRunMode.JENKINS_API_PLAN.name())) { + } else if (StringUtils.equalsAny(runMode, ApiRunMode.API_PLAN.name(), ApiRunMode.SCHEDULE_API_PLAN.name(), ApiRunMode.JENKINS_API_PLAN.name(), ApiRunMode.MANUAL_PLAN.name())) { //测试计划定时任务-接口执行逻辑的话,需要同步测试计划的报告数据 - if (StringUtils.equals(runMode, ApiRunMode.SCHEDULE_API_PLAN.name())) { - apiDefinitionExecResultService.saveApiResultByScheduleTask(testResult, debugReportId, ApiRunMode.SCHEDULE_API_PLAN.name(), ReportTriggerMode.SCHEDULE.name()); - } else if (StringUtils.equals(runMode, ApiRunMode.JENKINS_API_PLAN.name())) { - apiDefinitionExecResultService.saveApiResultByScheduleTask(testResult, debugReportId, ApiRunMode.JENKINS_API_PLAN.name(), ReportTriggerMode.API.name()); + if (StringUtils.equalsAny(runMode, ApiRunMode.SCHEDULE_API_PLAN.name(), ApiRunMode.JENKINS_API_PLAN.name(), ApiRunMode.MANUAL_PLAN.name())) { + apiDefinitionExecResultService.saveApiResultByScheduleTask(testResult, debugReportId, runMode); } else { apiDefinitionExecResultService.saveApiResult(testResult, ApiRunMode.API_PLAN.name(), TriggerMode.MANUAL.name()); } @@ -242,6 +243,7 @@ public class TestResultService { paramMap.put("executionEnvironment", report.getExecutionEnvironment()); paramMap.put("principal", report.getPrincipal()); NoticeModel noticeModel = NoticeModel.builder() + .operator(SessionUtils.getUserId()) .successContext(successContext) .successMailTemplate("ApiSuccessfulNotification") .failedContext(failedContext) diff --git a/backend/src/main/java/io/metersphere/api/service/task/ParallelScenarioExecTask.java b/backend/src/main/java/io/metersphere/api/service/task/ParallelScenarioExecTask.java index 1f7d1834aa..ecb34a1618 100644 --- a/backend/src/main/java/io/metersphere/api/service/task/ParallelScenarioExecTask.java +++ b/backend/src/main/java/io/metersphere/api/service/task/ParallelScenarioExecTask.java @@ -33,7 +33,7 @@ public class ParallelScenarioExecTask implements Callable { } return null; } catch (Exception ex) { - LogUtil.error(ex.getMessage()); + LogUtil.error(ex); MSException.throwException(ex.getMessage()); return null; } diff --git a/backend/src/main/java/io/metersphere/api/service/task/SerialScenarioExecTask.java b/backend/src/main/java/io/metersphere/api/service/task/SerialScenarioExecTask.java index ab6ccb688d..d97f9a8547 100644 --- a/backend/src/main/java/io/metersphere/api/service/task/SerialScenarioExecTask.java +++ b/backend/src/main/java/io/metersphere/api/service/task/SerialScenarioExecTask.java @@ -54,9 +54,9 @@ public class SerialScenarioExecTask implements Callable { } return (T) report; } catch (Exception ex) { - LogUtil.error(ex.getMessage()); + LogUtil.error(ex); MSException.throwException(ex.getMessage()); return null; } } -} \ No newline at end of file +} diff --git a/backend/src/main/java/io/metersphere/api/tcp/TCPPool.java b/backend/src/main/java/io/metersphere/api/tcp/TCPPool.java new file mode 100644 index 0000000000..03882869e9 --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/tcp/TCPPool.java @@ -0,0 +1,89 @@ +package io.metersphere.api.tcp; + +import io.metersphere.api.tcp.server.TCPServer; +import io.metersphere.commons.exception.MSException; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author song.tianyang + * @Date 2021/8/10 3:04 下午 + */ +public class TCPPool { + + private static HashMap serverSockedMap = new HashMap<>(); + + private TCPPool(){} + + public static String createTcp(int port){ + String returnString = ""; + if(port > 0){ + TCPServer tcpServer = null; + if(serverSockedMap.containsKey(port)){ + tcpServer = serverSockedMap.get(port); + }else { + tcpServer = new TCPServer(port); + serverSockedMap.put(port,tcpServer); + } + try { + if(!tcpServer.isSocketOpen()){ + Thread t = new Thread(tcpServer); + t.start(); + } + returnString = "OK"; + }catch (Exception e){ + returnString = e.getMessage(); + e.printStackTrace(); + MSException.throwException(e.getMessage()); + } + } + + return returnString; + } + + public static boolean isTcpOpen(int port){ + TCPServer server = serverSockedMap.get(port); + if(server != null ){ + return server.isSocketOpen(); + } + return false; + } + + public static String getTcpStatus() { + if(serverSockedMap.isEmpty()){ + return "null"; + }else { + StringBuffer stringBuffer = new StringBuffer(); + for (Map.Entry entry:serverSockedMap.entrySet()) { + int port = entry.getKey(); + TCPServer tcpServer = entry.getValue(); + if(tcpServer == null){ + stringBuffer.append("Port is "+port + ";"); + stringBuffer.append("Server is null;"); + }else { + stringBuffer.append("Port is "+port + ";"); + stringBuffer.append("Server is open: "+ tcpServer.isSocketOpen()+";"); + } + } + return stringBuffer.toString(); + } + } + + public static String closeTcp(int portNum) { + TCPServer server = serverSockedMap.get(portNum); + if(server == null){ + return "Tcp Is not create!"; + }else { + String returnMsg = null; + try { + server.closeSocket(); + returnMsg = "OK"; + }catch (Exception e){ + returnMsg = e.getMessage(); + e.printStackTrace(); + } + return returnMsg; + } + } +} diff --git a/backend/src/main/java/io/metersphere/api/tcp/server/TCPServer.java b/backend/src/main/java/io/metersphere/api/tcp/server/TCPServer.java new file mode 100644 index 0000000000..e77d48e5c8 --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/tcp/server/TCPServer.java @@ -0,0 +1,60 @@ +package io.metersphere.api.tcp.server; + +import java.net.ServerSocket; +import java.net.Socket; + +/** + * @author song.tianyang + * @Date 2021/8/11 10:35 上午 + */ +public class TCPServer implements Runnable { + private int port; + private ServerSocket serverSocket; + + private TCPServicer servicer; + + public TCPServer(int port){ + this.port = port; + } + + public void openSocket() throws Exception { + this.serverSocket = new ServerSocket(this.port); + int connectIndex = 0; + + while (true) { + if (!this.serverSocket.isClosed()) { + Socket socket = this.serverSocket.accept(); + servicer = new TCPServicer(socket,port); + servicer.run(); + } + if (this.serverSocket.isClosed()) { + break; + } + } + } + + public boolean isSocketOpen(){ + if (this.serverSocket != null && !this.serverSocket.isClosed()) { + return true; + }else { + return false; + } + } + + public void closeSocket() throws Exception { + if (this.serverSocket != null && !this.serverSocket.isClosed()) { + if(servicer != null){ + servicer.close(); + } + this.serverSocket.close(); + } + } + + @Override + public void run() { + try { + this.openSocket(); + } catch (Exception e) { + } + } +} diff --git a/backend/src/main/java/io/metersphere/api/tcp/server/TCPServicer.java b/backend/src/main/java/io/metersphere/api/tcp/server/TCPServicer.java new file mode 100644 index 0000000000..6997893212 --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/tcp/server/TCPServicer.java @@ -0,0 +1,82 @@ +package io.metersphere.api.tcp.server; + +import com.alibaba.fastjson.JSONObject; +import io.metersphere.api.service.MockConfigService; +import io.metersphere.base.domain.MockExpectConfigWithBLOBs; +import io.metersphere.commons.utils.CommonBeanFactory; + +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; + +public class TCPServicer { + private Socket s; + private InputStream is; + private OutputStream os; + private int port; + public TCPServicer(Socket s, int port) { + this.s = s; + this.port = port; + } + + public void run() { + byte[] b = new byte[1024]; + String returnMsg = ""; + String message = ""; + try { + is = s.getInputStream(); + os = s.getOutputStream(); + int len = is.read(b); + message = new String(b,0,len); + +// } catch (Exception e) { +// e.printStackTrace(); +// } + returnMsg = this.getReturnMsg(message); + +// try { + os.write(returnMsg.getBytes()); + } catch (Exception e) { + e.printStackTrace(); + }finally { + this.close(); + } + + //关闭资源 +// this.close(); + } + + private String getReturnMsg(String message) { + MockConfigService mockConfigService = CommonBeanFactory.getBean(MockConfigService.class); + MockExpectConfigWithBLOBs matchdMockExpect = mockConfigService.matchTcpMockExpect(message,this.port); + String response = matchdMockExpect.getResponse(); + JSONObject responseObj = JSONObject.parseObject(response); + try { + int delayed = responseObj.getInteger("delayed"); + Thread.sleep(delayed); + } catch (InterruptedException e) { + e.printStackTrace(); + } + String returnMsg = responseObj.getString("body"); + + return returnMsg; + } + + public void close() { + //关闭资源 + try{ + is.close(); + }catch (Exception e){}finally { + try{ + os.close(); + }catch (Exception e){}finally { + try{ + s.close(); + }catch (Exception e){}finally { + + } + } + } + } + +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiDefinition.java b/backend/src/main/java/io/metersphere/base/domain/ApiDefinition.java index ce1f776ef8..b96ace4e1c 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiDefinition.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiDefinition.java @@ -51,5 +51,7 @@ public class ApiDefinition implements Serializable { private String deleteUserId; + private String followPeople; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiDefinitionExample.java b/backend/src/main/java/io/metersphere/base/domain/ApiDefinitionExample.java index 4abce30c0e..a3e12e187a 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiDefinitionExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiDefinitionExample.java @@ -1673,6 +1673,76 @@ public class ApiDefinitionExample { addCriterion("delete_user_id not between", value1, value2, "deleteUserId"); return (Criteria) this; } + + public Criteria andFollowPeopleIsNull() { + addCriterion("follow_people is null"); + return (Criteria) this; + } + + public Criteria andFollowPeopleIsNotNull() { + addCriterion("follow_people is not null"); + return (Criteria) this; + } + + public Criteria andFollowPeopleEqualTo(String value) { + addCriterion("follow_people =", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleNotEqualTo(String value) { + addCriterion("follow_people <>", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleGreaterThan(String value) { + addCriterion("follow_people >", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleGreaterThanOrEqualTo(String value) { + addCriterion("follow_people >=", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleLessThan(String value) { + addCriterion("follow_people <", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleLessThanOrEqualTo(String value) { + addCriterion("follow_people <=", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleLike(String value) { + addCriterion("follow_people like", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleNotLike(String value) { + addCriterion("follow_people not like", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleIn(List values) { + addCriterion("follow_people in", values, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleNotIn(List values) { + addCriterion("follow_people not in", values, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleBetween(String value1, String value2) { + addCriterion("follow_people between", value1, value2, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleNotBetween(String value1, String value2) { + addCriterion("follow_people not between", value1, value2, "followPeople"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiScenario.java b/backend/src/main/java/io/metersphere/base/domain/ApiScenario.java index 17626c585f..4792eac9d2 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiScenario.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiScenario.java @@ -55,5 +55,7 @@ public class ApiScenario implements Serializable { private String deleteUserId; + private Integer executeTimes; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiScenarioExample.java b/backend/src/main/java/io/metersphere/base/domain/ApiScenarioExample.java index 3b6d1c61a9..a47f821fea 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiScenarioExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiScenarioExample.java @@ -1793,6 +1793,66 @@ public class ApiScenarioExample { addCriterion("delete_user_id not between", value1, value2, "deleteUserId"); return (Criteria) this; } + + public Criteria andExecuteTimesIsNull() { + addCriterion("execute_times is null"); + return (Criteria) this; + } + + public Criteria andExecuteTimesIsNotNull() { + addCriterion("execute_times is not null"); + return (Criteria) this; + } + + public Criteria andExecuteTimesEqualTo(Integer value) { + addCriterion("execute_times =", value, "executeTimes"); + return (Criteria) this; + } + + public Criteria andExecuteTimesNotEqualTo(Integer value) { + addCriterion("execute_times <>", value, "executeTimes"); + return (Criteria) this; + } + + public Criteria andExecuteTimesGreaterThan(Integer value) { + addCriterion("execute_times >", value, "executeTimes"); + return (Criteria) this; + } + + public Criteria andExecuteTimesGreaterThanOrEqualTo(Integer value) { + addCriterion("execute_times >=", value, "executeTimes"); + return (Criteria) this; + } + + public Criteria andExecuteTimesLessThan(Integer value) { + addCriterion("execute_times <", value, "executeTimes"); + return (Criteria) this; + } + + public Criteria andExecuteTimesLessThanOrEqualTo(Integer value) { + addCriterion("execute_times <=", value, "executeTimes"); + return (Criteria) this; + } + + public Criteria andExecuteTimesIn(List values) { + addCriterion("execute_times in", values, "executeTimes"); + return (Criteria) this; + } + + public Criteria andExecuteTimesNotIn(List values) { + addCriterion("execute_times not in", values, "executeTimes"); + return (Criteria) this; + } + + public Criteria andExecuteTimesBetween(Integer value1, Integer value2) { + addCriterion("execute_times between", value1, value2, "executeTimes"); + return (Criteria) this; + } + + public Criteria andExecuteTimesNotBetween(Integer value1, Integer value2) { + addCriterion("execute_times not between", value1, value2, "executeTimes"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReport.java b/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReport.java index 38a957c6c7..2119c627b7 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReport.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReport.java @@ -1,8 +1,9 @@ package io.metersphere.base.domain; -import java.io.Serializable; import lombok.Data; +import java.io.Serializable; + @Data public class ApiScenarioReport implements Serializable { private String id; @@ -35,5 +36,7 @@ public class ApiScenarioReport implements Serializable { private String testPlanScenarioId; + private Long endTime; + private static final long serialVersionUID = 1L; } diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReportExample.java b/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReportExample.java index 8ad0c2f032..c2c3a59059 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReportExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReportExample.java @@ -993,6 +993,66 @@ public class ApiScenarioReportExample { addCriterion("actuator not between", value1, value2, "actuator"); return (Criteria) this; } + + public Criteria andEndTimeIsNull() { + addCriterion("end_time is null"); + return (Criteria) this; + } + + public Criteria andEndTimeIsNotNull() { + addCriterion("end_time is not null"); + return (Criteria) this; + } + + public Criteria andEndTimeEqualTo(Long value) { + addCriterion("end_time =", value, "endTime"); + return (Criteria) this; + } + + public Criteria andEndTimeNotEqualTo(Long value) { + addCriterion("end_time <>", value, "endTime"); + return (Criteria) this; + } + + public Criteria andEndTimeGreaterThan(Long value) { + addCriterion("end_time >", value, "endTime"); + return (Criteria) this; + } + + public Criteria andEndTimeGreaterThanOrEqualTo(Long value) { + addCriterion("end_time >=", value, "endTime"); + return (Criteria) this; + } + + public Criteria andEndTimeLessThan(Long value) { + addCriterion("end_time <", value, "endTime"); + return (Criteria) this; + } + + public Criteria andEndTimeLessThanOrEqualTo(Long value) { + addCriterion("end_time <=", value, "endTime"); + return (Criteria) this; + } + + public Criteria andEndTimeIn(List values) { + addCriterion("end_time in", values, "endTime"); + return (Criteria) this; + } + + public Criteria andEndTimeNotIn(List values) { + addCriterion("end_time not in", values, "endTime"); + return (Criteria) this; + } + + public Criteria andEndTimeBetween(Long value1, Long value2) { + addCriterion("end_time between", value1, value2, "endTime"); + return (Criteria) this; + } + + public Criteria andEndTimeNotBetween(Long value1, Long value2) { + addCriterion("end_time not between", value1, value2, "endTime"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiTestCase.java b/backend/src/main/java/io/metersphere/base/domain/ApiTestCase.java index 89021bfc00..0cbace102a 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiTestCase.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiTestCase.java @@ -39,5 +39,7 @@ public class ApiTestCase implements Serializable { private Integer version; + private String followPeople; + private static final long serialVersionUID = 1L; -} +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiTestCaseExample.java b/backend/src/main/java/io/metersphere/base/domain/ApiTestCaseExample.java index 8e1fc0c53e..92dee67719 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiTestCaseExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiTestCaseExample.java @@ -1243,6 +1243,76 @@ public class ApiTestCaseExample { addCriterion("version not between", value1, value2, "version"); return (Criteria) this; } + + public Criteria andFollowPeopleIsNull() { + addCriterion("follow_people is null"); + return (Criteria) this; + } + + public Criteria andFollowPeopleIsNotNull() { + addCriterion("follow_people is not null"); + return (Criteria) this; + } + + public Criteria andFollowPeopleEqualTo(String value) { + addCriterion("follow_people =", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleNotEqualTo(String value) { + addCriterion("follow_people <>", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleGreaterThan(String value) { + addCriterion("follow_people >", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleGreaterThanOrEqualTo(String value) { + addCriterion("follow_people >=", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleLessThan(String value) { + addCriterion("follow_people <", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleLessThanOrEqualTo(String value) { + addCriterion("follow_people <=", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleLike(String value) { + addCriterion("follow_people like", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleNotLike(String value) { + addCriterion("follow_people not like", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleIn(List values) { + addCriterion("follow_people in", values, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleNotIn(List values) { + addCriterion("follow_people not in", values, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleBetween(String value1, String value2) { + addCriterion("follow_people between", value1, value2, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleNotBetween(String value1, String value2) { + addCriterion("follow_people not between", value1, value2, "followPeople"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { @@ -1337,4 +1407,4 @@ public class ApiTestCaseExample { this(condition, value, secondValue, null); } } -} +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/LoadTest.java b/backend/src/main/java/io/metersphere/base/domain/LoadTest.java index 800eb34db8..5bc027979d 100644 --- a/backend/src/main/java/io/metersphere/base/domain/LoadTest.java +++ b/backend/src/main/java/io/metersphere/base/domain/LoadTest.java @@ -31,5 +31,7 @@ public class LoadTest implements Serializable { private String scenarioId; + private String followPeople; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/LoadTestExample.java b/backend/src/main/java/io/metersphere/base/domain/LoadTestExample.java index f43fefe4e5..10b63d049e 100644 --- a/backend/src/main/java/io/metersphere/base/domain/LoadTestExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/LoadTestExample.java @@ -973,6 +973,76 @@ public class LoadTestExample { addCriterion("scenario_id not between", value1, value2, "scenarioId"); return (Criteria) this; } + + public Criteria andFollowPeopleIsNull() { + addCriterion("follow_people is null"); + return (Criteria) this; + } + + public Criteria andFollowPeopleIsNotNull() { + addCriterion("follow_people is not null"); + return (Criteria) this; + } + + public Criteria andFollowPeopleEqualTo(String value) { + addCriterion("follow_people =", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleNotEqualTo(String value) { + addCriterion("follow_people <>", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleGreaterThan(String value) { + addCriterion("follow_people >", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleGreaterThanOrEqualTo(String value) { + addCriterion("follow_people >=", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleLessThan(String value) { + addCriterion("follow_people <", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleLessThanOrEqualTo(String value) { + addCriterion("follow_people <=", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleLike(String value) { + addCriterion("follow_people like", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleNotLike(String value) { + addCriterion("follow_people not like", value, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleIn(List values) { + addCriterion("follow_people in", values, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleNotIn(List values) { + addCriterion("follow_people not in", values, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleBetween(String value1, String value2) { + addCriterion("follow_people between", value1, value2, "followPeople"); + return (Criteria) this; + } + + public Criteria andFollowPeopleNotBetween(String value1, String value2) { + addCriterion("follow_people not between", value1, value2, "followPeople"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/domain/Notification.java b/backend/src/main/java/io/metersphere/base/domain/Notification.java new file mode 100644 index 0000000000..72c5a2d6ed --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/domain/Notification.java @@ -0,0 +1,33 @@ +package io.metersphere.base.domain; + +import java.io.Serializable; +import lombok.Data; + +@Data +public class Notification implements Serializable { + private Long id; + + private String type; + + private String receiver; + + private String title; + + private String status; + + private Long createTime; + + private String operator; + + private String operation; + + private String resourceId; + + private String resourceType; + + private String resourceName; + + private String content; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/NotificationExample.java b/backend/src/main/java/io/metersphere/base/domain/NotificationExample.java new file mode 100644 index 0000000000..8bc0332791 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/domain/NotificationExample.java @@ -0,0 +1,950 @@ +package io.metersphere.base.domain; + +import java.util.ArrayList; +import java.util.List; + +public class NotificationExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public NotificationExample() { + oredCriteria = new ArrayList(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andTypeIsNull() { + addCriterion("`type` is null"); + return (Criteria) this; + } + + public Criteria andTypeIsNotNull() { + addCriterion("`type` is not null"); + return (Criteria) this; + } + + public Criteria andTypeEqualTo(String value) { + addCriterion("`type` =", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotEqualTo(String value) { + addCriterion("`type` <>", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeGreaterThan(String value) { + addCriterion("`type` >", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeGreaterThanOrEqualTo(String value) { + addCriterion("`type` >=", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLessThan(String value) { + addCriterion("`type` <", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLessThanOrEqualTo(String value) { + addCriterion("`type` <=", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLike(String value) { + addCriterion("`type` like", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotLike(String value) { + addCriterion("`type` not like", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeIn(List values) { + addCriterion("`type` in", values, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotIn(List values) { + addCriterion("`type` not in", values, "type"); + return (Criteria) this; + } + + public Criteria andTypeBetween(String value1, String value2) { + addCriterion("`type` between", value1, value2, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotBetween(String value1, String value2) { + addCriterion("`type` not between", value1, value2, "type"); + return (Criteria) this; + } + + public Criteria andReceiverIsNull() { + addCriterion("receiver is null"); + return (Criteria) this; + } + + public Criteria andReceiverIsNotNull() { + addCriterion("receiver is not null"); + return (Criteria) this; + } + + public Criteria andReceiverEqualTo(String value) { + addCriterion("receiver =", value, "receiver"); + return (Criteria) this; + } + + public Criteria andReceiverNotEqualTo(String value) { + addCriterion("receiver <>", value, "receiver"); + return (Criteria) this; + } + + public Criteria andReceiverGreaterThan(String value) { + addCriterion("receiver >", value, "receiver"); + return (Criteria) this; + } + + public Criteria andReceiverGreaterThanOrEqualTo(String value) { + addCriterion("receiver >=", value, "receiver"); + return (Criteria) this; + } + + public Criteria andReceiverLessThan(String value) { + addCriterion("receiver <", value, "receiver"); + return (Criteria) this; + } + + public Criteria andReceiverLessThanOrEqualTo(String value) { + addCriterion("receiver <=", value, "receiver"); + return (Criteria) this; + } + + public Criteria andReceiverLike(String value) { + addCriterion("receiver like", value, "receiver"); + return (Criteria) this; + } + + public Criteria andReceiverNotLike(String value) { + addCriterion("receiver not like", value, "receiver"); + return (Criteria) this; + } + + public Criteria andReceiverIn(List values) { + addCriterion("receiver in", values, "receiver"); + return (Criteria) this; + } + + public Criteria andReceiverNotIn(List values) { + addCriterion("receiver not in", values, "receiver"); + return (Criteria) this; + } + + public Criteria andReceiverBetween(String value1, String value2) { + addCriterion("receiver between", value1, value2, "receiver"); + return (Criteria) this; + } + + public Criteria andReceiverNotBetween(String value1, String value2) { + addCriterion("receiver not between", value1, value2, "receiver"); + return (Criteria) this; + } + + public Criteria andTitleIsNull() { + addCriterion("title is null"); + return (Criteria) this; + } + + public Criteria andTitleIsNotNull() { + addCriterion("title is not null"); + return (Criteria) this; + } + + public Criteria andTitleEqualTo(String value) { + addCriterion("title =", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleNotEqualTo(String value) { + addCriterion("title <>", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleGreaterThan(String value) { + addCriterion("title >", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleGreaterThanOrEqualTo(String value) { + addCriterion("title >=", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleLessThan(String value) { + addCriterion("title <", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleLessThanOrEqualTo(String value) { + addCriterion("title <=", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleLike(String value) { + addCriterion("title like", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleNotLike(String value) { + addCriterion("title not like", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleIn(List values) { + addCriterion("title in", values, "title"); + return (Criteria) this; + } + + public Criteria andTitleNotIn(List values) { + addCriterion("title not in", values, "title"); + return (Criteria) this; + } + + public Criteria andTitleBetween(String value1, String value2) { + addCriterion("title between", value1, value2, "title"); + return (Criteria) this; + } + + public Criteria andTitleNotBetween(String value1, String value2) { + addCriterion("title not between", value1, value2, "title"); + return (Criteria) this; + } + + public Criteria andStatusIsNull() { + addCriterion("`status` is null"); + return (Criteria) this; + } + + public Criteria andStatusIsNotNull() { + addCriterion("`status` is not null"); + return (Criteria) this; + } + + public Criteria andStatusEqualTo(String value) { + addCriterion("`status` =", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotEqualTo(String value) { + addCriterion("`status` <>", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusGreaterThan(String value) { + addCriterion("`status` >", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusGreaterThanOrEqualTo(String value) { + addCriterion("`status` >=", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLessThan(String value) { + addCriterion("`status` <", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLessThanOrEqualTo(String value) { + addCriterion("`status` <=", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLike(String value) { + addCriterion("`status` like", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotLike(String value) { + addCriterion("`status` not like", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusIn(List values) { + addCriterion("`status` in", values, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotIn(List values) { + addCriterion("`status` not in", values, "status"); + return (Criteria) this; + } + + public Criteria andStatusBetween(String value1, String value2) { + addCriterion("`status` between", value1, value2, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotBetween(String value1, String value2) { + addCriterion("`status` not between", value1, value2, "status"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Long value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Long value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Long value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Long value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Long value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Long value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Long value1, Long value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Long value1, Long value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andOperatorIsNull() { + addCriterion("`operator` is null"); + return (Criteria) this; + } + + public Criteria andOperatorIsNotNull() { + addCriterion("`operator` is not null"); + return (Criteria) this; + } + + public Criteria andOperatorEqualTo(String value) { + addCriterion("`operator` =", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotEqualTo(String value) { + addCriterion("`operator` <>", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorGreaterThan(String value) { + addCriterion("`operator` >", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorGreaterThanOrEqualTo(String value) { + addCriterion("`operator` >=", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorLessThan(String value) { + addCriterion("`operator` <", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorLessThanOrEqualTo(String value) { + addCriterion("`operator` <=", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorLike(String value) { + addCriterion("`operator` like", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotLike(String value) { + addCriterion("`operator` not like", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorIn(List values) { + addCriterion("`operator` in", values, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotIn(List values) { + addCriterion("`operator` not in", values, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorBetween(String value1, String value2) { + addCriterion("`operator` between", value1, value2, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotBetween(String value1, String value2) { + addCriterion("`operator` not between", value1, value2, "operator"); + return (Criteria) this; + } + + public Criteria andOperationIsNull() { + addCriterion("`operation` is null"); + return (Criteria) this; + } + + public Criteria andOperationIsNotNull() { + addCriterion("`operation` is not null"); + return (Criteria) this; + } + + public Criteria andOperationEqualTo(String value) { + addCriterion("`operation` =", value, "operation"); + return (Criteria) this; + } + + public Criteria andOperationNotEqualTo(String value) { + addCriterion("`operation` <>", value, "operation"); + return (Criteria) this; + } + + public Criteria andOperationGreaterThan(String value) { + addCriterion("`operation` >", value, "operation"); + return (Criteria) this; + } + + public Criteria andOperationGreaterThanOrEqualTo(String value) { + addCriterion("`operation` >=", value, "operation"); + return (Criteria) this; + } + + public Criteria andOperationLessThan(String value) { + addCriterion("`operation` <", value, "operation"); + return (Criteria) this; + } + + public Criteria andOperationLessThanOrEqualTo(String value) { + addCriterion("`operation` <=", value, "operation"); + return (Criteria) this; + } + + public Criteria andOperationLike(String value) { + addCriterion("`operation` like", value, "operation"); + return (Criteria) this; + } + + public Criteria andOperationNotLike(String value) { + addCriterion("`operation` not like", value, "operation"); + return (Criteria) this; + } + + public Criteria andOperationIn(List values) { + addCriterion("`operation` in", values, "operation"); + return (Criteria) this; + } + + public Criteria andOperationNotIn(List values) { + addCriterion("`operation` not in", values, "operation"); + return (Criteria) this; + } + + public Criteria andOperationBetween(String value1, String value2) { + addCriterion("`operation` between", value1, value2, "operation"); + return (Criteria) this; + } + + public Criteria andOperationNotBetween(String value1, String value2) { + addCriterion("`operation` not between", value1, value2, "operation"); + return (Criteria) this; + } + + public Criteria andResourceIdIsNull() { + addCriterion("resource_id is null"); + return (Criteria) this; + } + + public Criteria andResourceIdIsNotNull() { + addCriterion("resource_id is not null"); + return (Criteria) this; + } + + public Criteria andResourceIdEqualTo(String value) { + addCriterion("resource_id =", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdNotEqualTo(String value) { + addCriterion("resource_id <>", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdGreaterThan(String value) { + addCriterion("resource_id >", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdGreaterThanOrEqualTo(String value) { + addCriterion("resource_id >=", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdLessThan(String value) { + addCriterion("resource_id <", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdLessThanOrEqualTo(String value) { + addCriterion("resource_id <=", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdLike(String value) { + addCriterion("resource_id like", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdNotLike(String value) { + addCriterion("resource_id not like", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdIn(List values) { + addCriterion("resource_id in", values, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdNotIn(List values) { + addCriterion("resource_id not in", values, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdBetween(String value1, String value2) { + addCriterion("resource_id between", value1, value2, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdNotBetween(String value1, String value2) { + addCriterion("resource_id not between", value1, value2, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceTypeIsNull() { + addCriterion("resource_type is null"); + return (Criteria) this; + } + + public Criteria andResourceTypeIsNotNull() { + addCriterion("resource_type is not null"); + return (Criteria) this; + } + + public Criteria andResourceTypeEqualTo(String value) { + addCriterion("resource_type =", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeNotEqualTo(String value) { + addCriterion("resource_type <>", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeGreaterThan(String value) { + addCriterion("resource_type >", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeGreaterThanOrEqualTo(String value) { + addCriterion("resource_type >=", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeLessThan(String value) { + addCriterion("resource_type <", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeLessThanOrEqualTo(String value) { + addCriterion("resource_type <=", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeLike(String value) { + addCriterion("resource_type like", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeNotLike(String value) { + addCriterion("resource_type not like", value, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeIn(List values) { + addCriterion("resource_type in", values, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeNotIn(List values) { + addCriterion("resource_type not in", values, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeBetween(String value1, String value2) { + addCriterion("resource_type between", value1, value2, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceTypeNotBetween(String value1, String value2) { + addCriterion("resource_type not between", value1, value2, "resourceType"); + return (Criteria) this; + } + + public Criteria andResourceNameIsNull() { + addCriterion("resource_name is null"); + return (Criteria) this; + } + + public Criteria andResourceNameIsNotNull() { + addCriterion("resource_name is not null"); + return (Criteria) this; + } + + public Criteria andResourceNameEqualTo(String value) { + addCriterion("resource_name =", value, "resourceName"); + return (Criteria) this; + } + + public Criteria andResourceNameNotEqualTo(String value) { + addCriterion("resource_name <>", value, "resourceName"); + return (Criteria) this; + } + + public Criteria andResourceNameGreaterThan(String value) { + addCriterion("resource_name >", value, "resourceName"); + return (Criteria) this; + } + + public Criteria andResourceNameGreaterThanOrEqualTo(String value) { + addCriterion("resource_name >=", value, "resourceName"); + return (Criteria) this; + } + + public Criteria andResourceNameLessThan(String value) { + addCriterion("resource_name <", value, "resourceName"); + return (Criteria) this; + } + + public Criteria andResourceNameLessThanOrEqualTo(String value) { + addCriterion("resource_name <=", value, "resourceName"); + return (Criteria) this; + } + + public Criteria andResourceNameLike(String value) { + addCriterion("resource_name like", value, "resourceName"); + return (Criteria) this; + } + + public Criteria andResourceNameNotLike(String value) { + addCriterion("resource_name not like", value, "resourceName"); + return (Criteria) this; + } + + public Criteria andResourceNameIn(List values) { + addCriterion("resource_name in", values, "resourceName"); + return (Criteria) this; + } + + public Criteria andResourceNameNotIn(List values) { + addCriterion("resource_name not in", values, "resourceName"); + return (Criteria) this; + } + + public Criteria andResourceNameBetween(String value1, String value2) { + addCriterion("resource_name between", value1, value2, "resourceName"); + return (Criteria) this; + } + + public Criteria andResourceNameNotBetween(String value1, String value2) { + addCriterion("resource_name not between", value1, value2, "resourceName"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/Project.java b/backend/src/main/java/io/metersphere/base/domain/Project.java index 2e1470180b..d434edb2b5 100644 --- a/backend/src/main/java/io/metersphere/base/domain/Project.java +++ b/backend/src/main/java/io/metersphere/base/domain/Project.java @@ -39,5 +39,9 @@ public class Project implements Serializable { private String systemId; + private Integer mockTcpPort; + + private Boolean isMockTcpOpen; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/ProjectExample.java b/backend/src/main/java/io/metersphere/base/domain/ProjectExample.java index abf3cc1b01..33b5c69343 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ProjectExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/ProjectExample.java @@ -1243,6 +1243,126 @@ public class ProjectExample { addCriterion("system_id not between", value1, value2, "systemId"); return (Criteria) this; } + + public Criteria andMockTcpPortIsNull() { + addCriterion("mock_tcp_port is null"); + return (Criteria) this; + } + + public Criteria andMockTcpPortIsNotNull() { + addCriterion("mock_tcp_port is not null"); + return (Criteria) this; + } + + public Criteria andMockTcpPortEqualTo(Integer value) { + addCriterion("mock_tcp_port =", value, "mockTcpPort"); + return (Criteria) this; + } + + public Criteria andMockTcpPortNotEqualTo(Integer value) { + addCriterion("mock_tcp_port <>", value, "mockTcpPort"); + return (Criteria) this; + } + + public Criteria andMockTcpPortGreaterThan(Integer value) { + addCriterion("mock_tcp_port >", value, "mockTcpPort"); + return (Criteria) this; + } + + public Criteria andMockTcpPortGreaterThanOrEqualTo(Integer value) { + addCriterion("mock_tcp_port >=", value, "mockTcpPort"); + return (Criteria) this; + } + + public Criteria andMockTcpPortLessThan(Integer value) { + addCriterion("mock_tcp_port <", value, "mockTcpPort"); + return (Criteria) this; + } + + public Criteria andMockTcpPortLessThanOrEqualTo(Integer value) { + addCriterion("mock_tcp_port <=", value, "mockTcpPort"); + return (Criteria) this; + } + + public Criteria andMockTcpPortIn(List values) { + addCriterion("mock_tcp_port in", values, "mockTcpPort"); + return (Criteria) this; + } + + public Criteria andMockTcpPortNotIn(List values) { + addCriterion("mock_tcp_port not in", values, "mockTcpPort"); + return (Criteria) this; + } + + public Criteria andMockTcpPortBetween(Integer value1, Integer value2) { + addCriterion("mock_tcp_port between", value1, value2, "mockTcpPort"); + return (Criteria) this; + } + + public Criteria andMockTcpPortNotBetween(Integer value1, Integer value2) { + addCriterion("mock_tcp_port not between", value1, value2, "mockTcpPort"); + return (Criteria) this; + } + + public Criteria andIsMockTcpOpenIsNull() { + addCriterion("is_mock_tcp_open is null"); + return (Criteria) this; + } + + public Criteria andIsMockTcpOpenIsNotNull() { + addCriterion("is_mock_tcp_open is not null"); + return (Criteria) this; + } + + public Criteria andIsMockTcpOpenEqualTo(Boolean value) { + addCriterion("is_mock_tcp_open =", value, "isMockTcpOpen"); + return (Criteria) this; + } + + public Criteria andIsMockTcpOpenNotEqualTo(Boolean value) { + addCriterion("is_mock_tcp_open <>", value, "isMockTcpOpen"); + return (Criteria) this; + } + + public Criteria andIsMockTcpOpenGreaterThan(Boolean value) { + addCriterion("is_mock_tcp_open >", value, "isMockTcpOpen"); + return (Criteria) this; + } + + public Criteria andIsMockTcpOpenGreaterThanOrEqualTo(Boolean value) { + addCriterion("is_mock_tcp_open >=", value, "isMockTcpOpen"); + return (Criteria) this; + } + + public Criteria andIsMockTcpOpenLessThan(Boolean value) { + addCriterion("is_mock_tcp_open <", value, "isMockTcpOpen"); + return (Criteria) this; + } + + public Criteria andIsMockTcpOpenLessThanOrEqualTo(Boolean value) { + addCriterion("is_mock_tcp_open <=", value, "isMockTcpOpen"); + return (Criteria) this; + } + + public Criteria andIsMockTcpOpenIn(List values) { + addCriterion("is_mock_tcp_open in", values, "isMockTcpOpen"); + return (Criteria) this; + } + + public Criteria andIsMockTcpOpenNotIn(List values) { + addCriterion("is_mock_tcp_open not in", values, "isMockTcpOpen"); + return (Criteria) this; + } + + public Criteria andIsMockTcpOpenBetween(Boolean value1, Boolean value2) { + addCriterion("is_mock_tcp_open between", value1, value2, "isMockTcpOpen"); + return (Criteria) this; + } + + public Criteria andIsMockTcpOpenNotBetween(Boolean value1, Boolean value2) { + addCriterion("is_mock_tcp_open not between", value1, value2, "isMockTcpOpen"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiDocumentShare.java b/backend/src/main/java/io/metersphere/base/domain/ShareInfo.java similarity index 77% rename from backend/src/main/java/io/metersphere/base/domain/ApiDocumentShare.java rename to backend/src/main/java/io/metersphere/base/domain/ShareInfo.java index 74c3cea630..0b5cfa0ce0 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiDocumentShare.java +++ b/backend/src/main/java/io/metersphere/base/domain/ShareInfo.java @@ -4,7 +4,7 @@ import java.io.Serializable; import lombok.Data; @Data -public class ApiDocumentShare implements Serializable { +public class ShareInfo implements Serializable { private String id; private Long createTime; @@ -15,7 +15,7 @@ public class ApiDocumentShare implements Serializable { private String shareType; - private String shareApiId; + private String customData; private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiDocumentShareExample.java b/backend/src/main/java/io/metersphere/base/domain/ShareInfoExample.java similarity index 99% rename from backend/src/main/java/io/metersphere/base/domain/ApiDocumentShareExample.java rename to backend/src/main/java/io/metersphere/base/domain/ShareInfoExample.java index 7743cfd01f..d4eee0c277 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiDocumentShareExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/ShareInfoExample.java @@ -3,14 +3,14 @@ package io.metersphere.base.domain; import java.util.ArrayList; import java.util.List; -public class ApiDocumentShareExample { +public class ShareInfoExample { protected String orderByClause; protected boolean distinct; protected List oredCriteria; - public ApiDocumentShareExample() { + public ShareInfoExample() { oredCriteria = new ArrayList(); } diff --git a/backend/src/main/java/io/metersphere/base/domain/TestPlan.java b/backend/src/main/java/io/metersphere/base/domain/TestPlan.java index 566e1350a9..b4583a57a0 100644 --- a/backend/src/main/java/io/metersphere/base/domain/TestPlan.java +++ b/backend/src/main/java/io/metersphere/base/domain/TestPlan.java @@ -45,7 +45,5 @@ public class TestPlan implements Serializable { private Boolean automaticStatusUpdate; - private String tags; - private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/TestPlanReport.java b/backend/src/main/java/io/metersphere/base/domain/TestPlanReport.java index 53312b0f2d..afc6ed0945 100644 --- a/backend/src/main/java/io/metersphere/base/domain/TestPlanReport.java +++ b/backend/src/main/java/io/metersphere/base/domain/TestPlanReport.java @@ -35,5 +35,7 @@ public class TestPlanReport implements Serializable { private String components; + private Boolean isNew; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/TestPlanReportContent.java b/backend/src/main/java/io/metersphere/base/domain/TestPlanReportContent.java new file mode 100644 index 0000000000..4e1b56d8a9 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/domain/TestPlanReportContent.java @@ -0,0 +1,25 @@ +package io.metersphere.base.domain; + +import java.io.Serializable; +import lombok.Data; + +@Data +public class TestPlanReportContent implements Serializable { + private String id; + + private String testPlanReportId; + + private Long startTime; + + private Long caseCount; + + private Long endTime; + + private Double executeRate; + + private Double passRate; + + private Boolean isThirdPartIssue; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/TestPlanReportResourceExample.java b/backend/src/main/java/io/metersphere/base/domain/TestPlanReportContentExample.java similarity index 52% rename from backend/src/main/java/io/metersphere/base/domain/TestPlanReportResourceExample.java rename to backend/src/main/java/io/metersphere/base/domain/TestPlanReportContentExample.java index 93e2afd28d..166969fadf 100644 --- a/backend/src/main/java/io/metersphere/base/domain/TestPlanReportResourceExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/TestPlanReportContentExample.java @@ -3,14 +3,14 @@ package io.metersphere.base.domain; import java.util.ArrayList; import java.util.List; -public class TestPlanReportResourceExample { +public class TestPlanReportContentExample { protected String orderByClause; protected boolean distinct; protected List oredCriteria; - public TestPlanReportResourceExample() { + public TestPlanReportContentExample() { oredCriteria = new ArrayList(); } @@ -244,213 +244,363 @@ public class TestPlanReportResourceExample { return (Criteria) this; } - public Criteria andResourceIdIsNull() { - addCriterion("resource_id is null"); + public Criteria andStartTimeIsNull() { + addCriterion("start_time is null"); return (Criteria) this; } - public Criteria andResourceIdIsNotNull() { - addCriterion("resource_id is not null"); + public Criteria andStartTimeIsNotNull() { + addCriterion("start_time is not null"); return (Criteria) this; } - public Criteria andResourceIdEqualTo(String value) { - addCriterion("resource_id =", value, "resourceId"); + public Criteria andStartTimeEqualTo(Long value) { + addCriterion("start_time =", value, "startTime"); return (Criteria) this; } - public Criteria andResourceIdNotEqualTo(String value) { - addCriterion("resource_id <>", value, "resourceId"); + public Criteria andStartTimeNotEqualTo(Long value) { + addCriterion("start_time <>", value, "startTime"); return (Criteria) this; } - public Criteria andResourceIdGreaterThan(String value) { - addCriterion("resource_id >", value, "resourceId"); + public Criteria andStartTimeGreaterThan(Long value) { + addCriterion("start_time >", value, "startTime"); return (Criteria) this; } - public Criteria andResourceIdGreaterThanOrEqualTo(String value) { - addCriterion("resource_id >=", value, "resourceId"); + public Criteria andStartTimeGreaterThanOrEqualTo(Long value) { + addCriterion("start_time >=", value, "startTime"); return (Criteria) this; } - public Criteria andResourceIdLessThan(String value) { - addCriterion("resource_id <", value, "resourceId"); + public Criteria andStartTimeLessThan(Long value) { + addCriterion("start_time <", value, "startTime"); return (Criteria) this; } - public Criteria andResourceIdLessThanOrEqualTo(String value) { - addCriterion("resource_id <=", value, "resourceId"); + public Criteria andStartTimeLessThanOrEqualTo(Long value) { + addCriterion("start_time <=", value, "startTime"); return (Criteria) this; } - public Criteria andResourceIdLike(String value) { - addCriterion("resource_id like", value, "resourceId"); + public Criteria andStartTimeIn(List values) { + addCriterion("start_time in", values, "startTime"); return (Criteria) this; } - public Criteria andResourceIdNotLike(String value) { - addCriterion("resource_id not like", value, "resourceId"); + public Criteria andStartTimeNotIn(List values) { + addCriterion("start_time not in", values, "startTime"); return (Criteria) this; } - public Criteria andResourceIdIn(List values) { - addCriterion("resource_id in", values, "resourceId"); + public Criteria andStartTimeBetween(Long value1, Long value2) { + addCriterion("start_time between", value1, value2, "startTime"); return (Criteria) this; } - public Criteria andResourceIdNotIn(List values) { - addCriterion("resource_id not in", values, "resourceId"); + public Criteria andStartTimeNotBetween(Long value1, Long value2) { + addCriterion("start_time not between", value1, value2, "startTime"); return (Criteria) this; } - public Criteria andResourceIdBetween(String value1, String value2) { - addCriterion("resource_id between", value1, value2, "resourceId"); + public Criteria andCaseCountIsNull() { + addCriterion("case_count is null"); return (Criteria) this; } - public Criteria andResourceIdNotBetween(String value1, String value2) { - addCriterion("resource_id not between", value1, value2, "resourceId"); + public Criteria andCaseCountIsNotNull() { + addCriterion("case_count is not null"); return (Criteria) this; } - public Criteria andResourceTypeIsNull() { - addCriterion("resource_type is null"); + public Criteria andCaseCountEqualTo(Long value) { + addCriterion("case_count =", value, "caseCount"); return (Criteria) this; } - public Criteria andResourceTypeIsNotNull() { - addCriterion("resource_type is not null"); + public Criteria andCaseCountNotEqualTo(Long value) { + addCriterion("case_count <>", value, "caseCount"); return (Criteria) this; } - public Criteria andResourceTypeEqualTo(String value) { - addCriterion("resource_type =", value, "resourceType"); + public Criteria andCaseCountGreaterThan(Long value) { + addCriterion("case_count >", value, "caseCount"); return (Criteria) this; } - public Criteria andResourceTypeNotEqualTo(String value) { - addCriterion("resource_type <>", value, "resourceType"); + public Criteria andCaseCountGreaterThanOrEqualTo(Long value) { + addCriterion("case_count >=", value, "caseCount"); return (Criteria) this; } - public Criteria andResourceTypeGreaterThan(String value) { - addCriterion("resource_type >", value, "resourceType"); + public Criteria andCaseCountLessThan(Long value) { + addCriterion("case_count <", value, "caseCount"); return (Criteria) this; } - public Criteria andResourceTypeGreaterThanOrEqualTo(String value) { - addCriterion("resource_type >=", value, "resourceType"); + public Criteria andCaseCountLessThanOrEqualTo(Long value) { + addCriterion("case_count <=", value, "caseCount"); return (Criteria) this; } - public Criteria andResourceTypeLessThan(String value) { - addCriterion("resource_type <", value, "resourceType"); + public Criteria andCaseCountIn(List values) { + addCriterion("case_count in", values, "caseCount"); return (Criteria) this; } - public Criteria andResourceTypeLessThanOrEqualTo(String value) { - addCriterion("resource_type <=", value, "resourceType"); + public Criteria andCaseCountNotIn(List values) { + addCriterion("case_count not in", values, "caseCount"); return (Criteria) this; } - public Criteria andResourceTypeLike(String value) { - addCriterion("resource_type like", value, "resourceType"); + public Criteria andCaseCountBetween(Long value1, Long value2) { + addCriterion("case_count between", value1, value2, "caseCount"); return (Criteria) this; } - public Criteria andResourceTypeNotLike(String value) { - addCriterion("resource_type not like", value, "resourceType"); + public Criteria andCaseCountNotBetween(Long value1, Long value2) { + addCriterion("case_count not between", value1, value2, "caseCount"); return (Criteria) this; } - public Criteria andResourceTypeIn(List values) { - addCriterion("resource_type in", values, "resourceType"); + public Criteria andEndTimeIsNull() { + addCriterion("end_time is null"); return (Criteria) this; } - public Criteria andResourceTypeNotIn(List values) { - addCriterion("resource_type not in", values, "resourceType"); + public Criteria andEndTimeIsNotNull() { + addCriterion("end_time is not null"); return (Criteria) this; } - public Criteria andResourceTypeBetween(String value1, String value2) { - addCriterion("resource_type between", value1, value2, "resourceType"); + public Criteria andEndTimeEqualTo(Long value) { + addCriterion("end_time =", value, "endTime"); return (Criteria) this; } - public Criteria andResourceTypeNotBetween(String value1, String value2) { - addCriterion("resource_type not between", value1, value2, "resourceType"); + public Criteria andEndTimeNotEqualTo(Long value) { + addCriterion("end_time <>", value, "endTime"); return (Criteria) this; } - public Criteria andExecuteResultIsNull() { - addCriterion("execute_result is null"); + public Criteria andEndTimeGreaterThan(Long value) { + addCriterion("end_time >", value, "endTime"); return (Criteria) this; } - public Criteria andExecuteResultIsNotNull() { - addCriterion("execute_result is not null"); + public Criteria andEndTimeGreaterThanOrEqualTo(Long value) { + addCriterion("end_time >=", value, "endTime"); return (Criteria) this; } - public Criteria andExecuteResultEqualTo(String value) { - addCriterion("execute_result =", value, "executeResult"); + public Criteria andEndTimeLessThan(Long value) { + addCriterion("end_time <", value, "endTime"); return (Criteria) this; } - public Criteria andExecuteResultNotEqualTo(String value) { - addCriterion("execute_result <>", value, "executeResult"); + public Criteria andEndTimeLessThanOrEqualTo(Long value) { + addCriterion("end_time <=", value, "endTime"); return (Criteria) this; } - public Criteria andExecuteResultGreaterThan(String value) { - addCriterion("execute_result >", value, "executeResult"); + public Criteria andEndTimeIn(List values) { + addCriterion("end_time in", values, "endTime"); return (Criteria) this; } - public Criteria andExecuteResultGreaterThanOrEqualTo(String value) { - addCriterion("execute_result >=", value, "executeResult"); + public Criteria andEndTimeNotIn(List values) { + addCriterion("end_time not in", values, "endTime"); return (Criteria) this; } - public Criteria andExecuteResultLessThan(String value) { - addCriterion("execute_result <", value, "executeResult"); + public Criteria andEndTimeBetween(Long value1, Long value2) { + addCriterion("end_time between", value1, value2, "endTime"); return (Criteria) this; } - public Criteria andExecuteResultLessThanOrEqualTo(String value) { - addCriterion("execute_result <=", value, "executeResult"); + public Criteria andEndTimeNotBetween(Long value1, Long value2) { + addCriterion("end_time not between", value1, value2, "endTime"); return (Criteria) this; } - public Criteria andExecuteResultLike(String value) { - addCriterion("execute_result like", value, "executeResult"); + public Criteria andExecuteRateIsNull() { + addCriterion("execute_rate is null"); return (Criteria) this; } - public Criteria andExecuteResultNotLike(String value) { - addCriterion("execute_result not like", value, "executeResult"); + public Criteria andExecuteRateIsNotNull() { + addCriterion("execute_rate is not null"); return (Criteria) this; } - public Criteria andExecuteResultIn(List values) { - addCriterion("execute_result in", values, "executeResult"); + public Criteria andExecuteRateEqualTo(Double value) { + addCriterion("execute_rate =", value, "executeRate"); return (Criteria) this; } - public Criteria andExecuteResultNotIn(List values) { - addCriterion("execute_result not in", values, "executeResult"); + public Criteria andExecuteRateNotEqualTo(Double value) { + addCriterion("execute_rate <>", value, "executeRate"); return (Criteria) this; } - public Criteria andExecuteResultBetween(String value1, String value2) { - addCriterion("execute_result between", value1, value2, "executeResult"); + public Criteria andExecuteRateGreaterThan(Double value) { + addCriterion("execute_rate >", value, "executeRate"); return (Criteria) this; } - public Criteria andExecuteResultNotBetween(String value1, String value2) { - addCriterion("execute_result not between", value1, value2, "executeResult"); + public Criteria andExecuteRateGreaterThanOrEqualTo(Double value) { + addCriterion("execute_rate >=", value, "executeRate"); + return (Criteria) this; + } + + public Criteria andExecuteRateLessThan(Double value) { + addCriterion("execute_rate <", value, "executeRate"); + return (Criteria) this; + } + + public Criteria andExecuteRateLessThanOrEqualTo(Double value) { + addCriterion("execute_rate <=", value, "executeRate"); + return (Criteria) this; + } + + public Criteria andExecuteRateIn(List values) { + addCriterion("execute_rate in", values, "executeRate"); + return (Criteria) this; + } + + public Criteria andExecuteRateNotIn(List values) { + addCriterion("execute_rate not in", values, "executeRate"); + return (Criteria) this; + } + + public Criteria andExecuteRateBetween(Double value1, Double value2) { + addCriterion("execute_rate between", value1, value2, "executeRate"); + return (Criteria) this; + } + + public Criteria andExecuteRateNotBetween(Double value1, Double value2) { + addCriterion("execute_rate not between", value1, value2, "executeRate"); + return (Criteria) this; + } + + public Criteria andPassRateIsNull() { + addCriterion("pass_rate is null"); + return (Criteria) this; + } + + public Criteria andPassRateIsNotNull() { + addCriterion("pass_rate is not null"); + return (Criteria) this; + } + + public Criteria andPassRateEqualTo(Double value) { + addCriterion("pass_rate =", value, "passRate"); + return (Criteria) this; + } + + public Criteria andPassRateNotEqualTo(Double value) { + addCriterion("pass_rate <>", value, "passRate"); + return (Criteria) this; + } + + public Criteria andPassRateGreaterThan(Double value) { + addCriterion("pass_rate >", value, "passRate"); + return (Criteria) this; + } + + public Criteria andPassRateGreaterThanOrEqualTo(Double value) { + addCriterion("pass_rate >=", value, "passRate"); + return (Criteria) this; + } + + public Criteria andPassRateLessThan(Double value) { + addCriterion("pass_rate <", value, "passRate"); + return (Criteria) this; + } + + public Criteria andPassRateLessThanOrEqualTo(Double value) { + addCriterion("pass_rate <=", value, "passRate"); + return (Criteria) this; + } + + public Criteria andPassRateIn(List values) { + addCriterion("pass_rate in", values, "passRate"); + return (Criteria) this; + } + + public Criteria andPassRateNotIn(List values) { + addCriterion("pass_rate not in", values, "passRate"); + return (Criteria) this; + } + + public Criteria andPassRateBetween(Double value1, Double value2) { + addCriterion("pass_rate between", value1, value2, "passRate"); + return (Criteria) this; + } + + public Criteria andPassRateNotBetween(Double value1, Double value2) { + addCriterion("pass_rate not between", value1, value2, "passRate"); + return (Criteria) this; + } + + public Criteria andIsThirdPartIssueIsNull() { + addCriterion("is_third_part_issue is null"); + return (Criteria) this; + } + + public Criteria andIsThirdPartIssueIsNotNull() { + addCriterion("is_third_part_issue is not null"); + return (Criteria) this; + } + + public Criteria andIsThirdPartIssueEqualTo(Boolean value) { + addCriterion("is_third_part_issue =", value, "isThirdPartIssue"); + return (Criteria) this; + } + + public Criteria andIsThirdPartIssueNotEqualTo(Boolean value) { + addCriterion("is_third_part_issue <>", value, "isThirdPartIssue"); + return (Criteria) this; + } + + public Criteria andIsThirdPartIssueGreaterThan(Boolean value) { + addCriterion("is_third_part_issue >", value, "isThirdPartIssue"); + return (Criteria) this; + } + + public Criteria andIsThirdPartIssueGreaterThanOrEqualTo(Boolean value) { + addCriterion("is_third_part_issue >=", value, "isThirdPartIssue"); + return (Criteria) this; + } + + public Criteria andIsThirdPartIssueLessThan(Boolean value) { + addCriterion("is_third_part_issue <", value, "isThirdPartIssue"); + return (Criteria) this; + } + + public Criteria andIsThirdPartIssueLessThanOrEqualTo(Boolean value) { + addCriterion("is_third_part_issue <=", value, "isThirdPartIssue"); + return (Criteria) this; + } + + public Criteria andIsThirdPartIssueIn(List values) { + addCriterion("is_third_part_issue in", values, "isThirdPartIssue"); + return (Criteria) this; + } + + public Criteria andIsThirdPartIssueNotIn(List values) { + addCriterion("is_third_part_issue not in", values, "isThirdPartIssue"); + return (Criteria) this; + } + + public Criteria andIsThirdPartIssueBetween(Boolean value1, Boolean value2) { + addCriterion("is_third_part_issue between", value1, value2, "isThirdPartIssue"); + return (Criteria) this; + } + + public Criteria andIsThirdPartIssueNotBetween(Boolean value1, Boolean value2) { + addCriterion("is_third_part_issue not between", value1, value2, "isThirdPartIssue"); return (Criteria) this; } } diff --git a/backend/src/main/java/io/metersphere/base/domain/TestPlanReportContentWithBLOBs.java b/backend/src/main/java/io/metersphere/base/domain/TestPlanReportContentWithBLOBs.java new file mode 100644 index 0000000000..1851227673 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/domain/TestPlanReportContentWithBLOBs.java @@ -0,0 +1,41 @@ +package io.metersphere.base.domain; + +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TestPlanReportContentWithBLOBs extends TestPlanReportContent implements Serializable { + private String config; + + private String summary; + + private String functionResult; + + private String apiResult; + + private String loadResult; + + private String functionAllCases; + + private String functionFailureCases; + + private String issueList; + + private String apiAllCases; + + private String apiFailureCases; + + private String scenarioAllCases; + + private String scenarioFailureCases; + + private String loadAllCases; + + private String loadFailureCases; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/TestPlanReportExample.java b/backend/src/main/java/io/metersphere/base/domain/TestPlanReportExample.java index 3133598e3c..0c1db82e88 100644 --- a/backend/src/main/java/io/metersphere/base/domain/TestPlanReportExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/TestPlanReportExample.java @@ -774,52 +774,52 @@ public class TestPlanReportExample { return (Criteria) this; } - public Criteria andIsApiCaseExecutingEqualTo(Byte value) { + public Criteria andIsApiCaseExecutingEqualTo(Boolean value) { addCriterion("is_api_case_executing =", value, "isApiCaseExecuting"); return (Criteria) this; } - public Criteria andIsApiCaseExecutingNotEqualTo(Byte value) { + public Criteria andIsApiCaseExecutingNotEqualTo(Boolean value) { addCriterion("is_api_case_executing <>", value, "isApiCaseExecuting"); return (Criteria) this; } - public Criteria andIsApiCaseExecutingGreaterThan(Byte value) { + public Criteria andIsApiCaseExecutingGreaterThan(Boolean value) { addCriterion("is_api_case_executing >", value, "isApiCaseExecuting"); return (Criteria) this; } - public Criteria andIsApiCaseExecutingGreaterThanOrEqualTo(Byte value) { + public Criteria andIsApiCaseExecutingGreaterThanOrEqualTo(Boolean value) { addCriterion("is_api_case_executing >=", value, "isApiCaseExecuting"); return (Criteria) this; } - public Criteria andIsApiCaseExecutingLessThan(Byte value) { + public Criteria andIsApiCaseExecutingLessThan(Boolean value) { addCriterion("is_api_case_executing <", value, "isApiCaseExecuting"); return (Criteria) this; } - public Criteria andIsApiCaseExecutingLessThanOrEqualTo(Byte value) { + public Criteria andIsApiCaseExecutingLessThanOrEqualTo(Boolean value) { addCriterion("is_api_case_executing <=", value, "isApiCaseExecuting"); return (Criteria) this; } - public Criteria andIsApiCaseExecutingIn(List values) { + public Criteria andIsApiCaseExecutingIn(List values) { addCriterion("is_api_case_executing in", values, "isApiCaseExecuting"); return (Criteria) this; } - public Criteria andIsApiCaseExecutingNotIn(List values) { + public Criteria andIsApiCaseExecutingNotIn(List values) { addCriterion("is_api_case_executing not in", values, "isApiCaseExecuting"); return (Criteria) this; } - public Criteria andIsApiCaseExecutingBetween(Byte value1, Byte value2) { + public Criteria andIsApiCaseExecutingBetween(Boolean value1, Boolean value2) { addCriterion("is_api_case_executing between", value1, value2, "isApiCaseExecuting"); return (Criteria) this; } - public Criteria andIsApiCaseExecutingNotBetween(Byte value1, Byte value2) { + public Criteria andIsApiCaseExecutingNotBetween(Boolean value1, Boolean value2) { addCriterion("is_api_case_executing not between", value1, value2, "isApiCaseExecuting"); return (Criteria) this; } @@ -834,52 +834,52 @@ public class TestPlanReportExample { return (Criteria) this; } - public Criteria andIsScenarioExecutingEqualTo(Byte value) { + public Criteria andIsScenarioExecutingEqualTo(Boolean value) { addCriterion("is_scenario_executing =", value, "isScenarioExecuting"); return (Criteria) this; } - public Criteria andIsScenarioExecutingNotEqualTo(Byte value) { + public Criteria andIsScenarioExecutingNotEqualTo(Boolean value) { addCriterion("is_scenario_executing <>", value, "isScenarioExecuting"); return (Criteria) this; } - public Criteria andIsScenarioExecutingGreaterThan(Byte value) { + public Criteria andIsScenarioExecutingGreaterThan(Boolean value) { addCriterion("is_scenario_executing >", value, "isScenarioExecuting"); return (Criteria) this; } - public Criteria andIsScenarioExecutingGreaterThanOrEqualTo(Byte value) { + public Criteria andIsScenarioExecutingGreaterThanOrEqualTo(Boolean value) { addCriterion("is_scenario_executing >=", value, "isScenarioExecuting"); return (Criteria) this; } - public Criteria andIsScenarioExecutingLessThan(Byte value) { + public Criteria andIsScenarioExecutingLessThan(Boolean value) { addCriterion("is_scenario_executing <", value, "isScenarioExecuting"); return (Criteria) this; } - public Criteria andIsScenarioExecutingLessThanOrEqualTo(Byte value) { + public Criteria andIsScenarioExecutingLessThanOrEqualTo(Boolean value) { addCriterion("is_scenario_executing <=", value, "isScenarioExecuting"); return (Criteria) this; } - public Criteria andIsScenarioExecutingIn(List values) { + public Criteria andIsScenarioExecutingIn(List values) { addCriterion("is_scenario_executing in", values, "isScenarioExecuting"); return (Criteria) this; } - public Criteria andIsScenarioExecutingNotIn(List values) { + public Criteria andIsScenarioExecutingNotIn(List values) { addCriterion("is_scenario_executing not in", values, "isScenarioExecuting"); return (Criteria) this; } - public Criteria andIsScenarioExecutingBetween(Byte value1, Byte value2) { + public Criteria andIsScenarioExecutingBetween(Boolean value1, Boolean value2) { addCriterion("is_scenario_executing between", value1, value2, "isScenarioExecuting"); return (Criteria) this; } - public Criteria andIsScenarioExecutingNotBetween(Byte value1, Byte value2) { + public Criteria andIsScenarioExecutingNotBetween(Boolean value1, Boolean value2) { addCriterion("is_scenario_executing not between", value1, value2, "isScenarioExecuting"); return (Criteria) this; } @@ -894,52 +894,52 @@ public class TestPlanReportExample { return (Criteria) this; } - public Criteria andIsPerformanceExecutingEqualTo(Byte value) { + public Criteria andIsPerformanceExecutingEqualTo(Boolean value) { addCriterion("is_performance_executing =", value, "isPerformanceExecuting"); return (Criteria) this; } - public Criteria andIsPerformanceExecutingNotEqualTo(Byte value) { + public Criteria andIsPerformanceExecutingNotEqualTo(Boolean value) { addCriterion("is_performance_executing <>", value, "isPerformanceExecuting"); return (Criteria) this; } - public Criteria andIsPerformanceExecutingGreaterThan(Byte value) { + public Criteria andIsPerformanceExecutingGreaterThan(Boolean value) { addCriterion("is_performance_executing >", value, "isPerformanceExecuting"); return (Criteria) this; } - public Criteria andIsPerformanceExecutingGreaterThanOrEqualTo(Byte value) { + public Criteria andIsPerformanceExecutingGreaterThanOrEqualTo(Boolean value) { addCriterion("is_performance_executing >=", value, "isPerformanceExecuting"); return (Criteria) this; } - public Criteria andIsPerformanceExecutingLessThan(Byte value) { + public Criteria andIsPerformanceExecutingLessThan(Boolean value) { addCriterion("is_performance_executing <", value, "isPerformanceExecuting"); return (Criteria) this; } - public Criteria andIsPerformanceExecutingLessThanOrEqualTo(Byte value) { + public Criteria andIsPerformanceExecutingLessThanOrEqualTo(Boolean value) { addCriterion("is_performance_executing <=", value, "isPerformanceExecuting"); return (Criteria) this; } - public Criteria andIsPerformanceExecutingIn(List values) { + public Criteria andIsPerformanceExecutingIn(List values) { addCriterion("is_performance_executing in", values, "isPerformanceExecuting"); return (Criteria) this; } - public Criteria andIsPerformanceExecutingNotIn(List values) { + public Criteria andIsPerformanceExecutingNotIn(List values) { addCriterion("is_performance_executing not in", values, "isPerformanceExecuting"); return (Criteria) this; } - public Criteria andIsPerformanceExecutingBetween(Byte value1, Byte value2) { + public Criteria andIsPerformanceExecutingBetween(Boolean value1, Boolean value2) { addCriterion("is_performance_executing between", value1, value2, "isPerformanceExecuting"); return (Criteria) this; } - public Criteria andIsPerformanceExecutingNotBetween(Byte value1, Byte value2) { + public Criteria andIsPerformanceExecutingNotBetween(Boolean value1, Boolean value2) { addCriterion("is_performance_executing not between", value1, value2, "isPerformanceExecuting"); return (Criteria) this; } @@ -1083,6 +1083,66 @@ public class TestPlanReportExample { addCriterion("components not between", value1, value2, "components"); return (Criteria) this; } + + public Criteria andIsNewIsNull() { + addCriterion("is_new is null"); + return (Criteria) this; + } + + public Criteria andIsNewIsNotNull() { + addCriterion("is_new is not null"); + return (Criteria) this; + } + + public Criteria andIsNewEqualTo(Boolean value) { + addCriterion("is_new =", value, "isNew"); + return (Criteria) this; + } + + public Criteria andIsNewNotEqualTo(Boolean value) { + addCriterion("is_new <>", value, "isNew"); + return (Criteria) this; + } + + public Criteria andIsNewGreaterThan(Boolean value) { + addCriterion("is_new >", value, "isNew"); + return (Criteria) this; + } + + public Criteria andIsNewGreaterThanOrEqualTo(Boolean value) { + addCriterion("is_new >=", value, "isNew"); + return (Criteria) this; + } + + public Criteria andIsNewLessThan(Boolean value) { + addCriterion("is_new <", value, "isNew"); + return (Criteria) this; + } + + public Criteria andIsNewLessThanOrEqualTo(Boolean value) { + addCriterion("is_new <=", value, "isNew"); + return (Criteria) this; + } + + public Criteria andIsNewIn(List values) { + addCriterion("is_new in", values, "isNew"); + return (Criteria) this; + } + + public Criteria andIsNewNotIn(List values) { + addCriterion("is_new not in", values, "isNew"); + return (Criteria) this; + } + + public Criteria andIsNewBetween(Boolean value1, Boolean value2) { + addCriterion("is_new between", value1, value2, "isNew"); + return (Criteria) this; + } + + public Criteria andIsNewNotBetween(Boolean value1, Boolean value2) { + addCriterion("is_new not between", value1, value2, "isNew"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/domain/TestPlanReportResource.java b/backend/src/main/java/io/metersphere/base/domain/TestPlanReportResource.java deleted file mode 100644 index d9aced46bd..0000000000 --- a/backend/src/main/java/io/metersphere/base/domain/TestPlanReportResource.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.metersphere.base.domain; - -import java.io.Serializable; -import lombok.Data; - -@Data -public class TestPlanReportResource implements Serializable { - private String id; - - private String testPlanReportId; - - private String resourceId; - - private String resourceType; - - private String executeResult; - - private static final long serialVersionUID = 1L; -} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/TestPlanWithBLOBs.java b/backend/src/main/java/io/metersphere/base/domain/TestPlanWithBLOBs.java new file mode 100644 index 0000000000..d0126eb81d --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/domain/TestPlanWithBLOBs.java @@ -0,0 +1,19 @@ +package io.metersphere.base.domain; + +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TestPlanWithBLOBs extends TestPlan implements Serializable { + private String tags; + + private String reportSummary; + + private String reportConfig; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ApiDefinitionMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ApiDefinitionMapper.xml index 921b1488d7..e5006084b6 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ApiDefinitionMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ApiDefinitionMapper.xml @@ -25,6 +25,7 @@ + @@ -92,7 +93,8 @@ id, project_id, `name`, `method`, module_path, environment_id, schedule, `status`, module_id, user_id, create_time, update_time, protocol, `path`, num, tags, original_state, - create_user, case_total, case_status, case_passing_rate, delete_time, delete_user_id + create_user, case_total, case_status, case_passing_rate, delete_time, delete_user_id, + follow_people description, request, response @@ -153,8 +155,9 @@ protocol, `path`, num, tags, original_state, create_user, case_total, case_status, case_passing_rate, - delete_time, delete_user_id, description, - request, response) + delete_time, delete_user_id, follow_people, + description, request, response + ) values (#{id,jdbcType=VARCHAR}, #{projectId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{method,jdbcType=VARCHAR}, #{modulePath,jdbcType=VARCHAR}, #{environmentId,jdbcType=VARCHAR}, #{schedule,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{moduleId,jdbcType=VARCHAR}, @@ -162,8 +165,9 @@ #{protocol,jdbcType=VARCHAR}, #{path,jdbcType=VARCHAR}, #{num,jdbcType=INTEGER}, #{tags,jdbcType=VARCHAR}, #{originalState,jdbcType=VARCHAR}, #{createUser,jdbcType=VARCHAR}, #{caseTotal,jdbcType=VARCHAR}, #{caseStatus,jdbcType=VARCHAR}, #{casePassingRate,jdbcType=VARCHAR}, - #{deleteTime,jdbcType=BIGINT}, #{deleteUserId,jdbcType=VARCHAR}, #{description,jdbcType=LONGVARCHAR}, - #{request,jdbcType=LONGVARCHAR}, #{response,jdbcType=LONGVARCHAR}) + #{deleteTime,jdbcType=BIGINT}, #{deleteUserId,jdbcType=VARCHAR}, #{followPeople,jdbcType=VARCHAR}, + #{description,jdbcType=LONGVARCHAR}, #{request,jdbcType=LONGVARCHAR}, #{response,jdbcType=LONGVARCHAR} + ) insert into api_definition @@ -237,6 +241,9 @@ delete_user_id, + + follow_people, + description, @@ -317,6 +324,9 @@ #{deleteUserId,jdbcType=VARCHAR}, + + #{followPeople,jdbcType=VARCHAR}, + #{description,jdbcType=LONGVARCHAR}, @@ -406,6 +416,9 @@ delete_user_id = #{record.deleteUserId,jdbcType=VARCHAR}, + + follow_people = #{record.followPeople,jdbcType=VARCHAR}, + description = #{record.description,jdbcType=LONGVARCHAR}, @@ -445,6 +458,7 @@ case_passing_rate = #{record.casePassingRate,jdbcType=VARCHAR}, delete_time = #{record.deleteTime,jdbcType=BIGINT}, delete_user_id = #{record.deleteUserId,jdbcType=VARCHAR}, + follow_people = #{record.followPeople,jdbcType=VARCHAR}, description = #{record.description,jdbcType=LONGVARCHAR}, request = #{record.request,jdbcType=LONGVARCHAR}, response = #{record.response,jdbcType=LONGVARCHAR} @@ -476,7 +490,8 @@ case_status = #{record.caseStatus,jdbcType=VARCHAR}, case_passing_rate = #{record.casePassingRate,jdbcType=VARCHAR}, delete_time = #{record.deleteTime,jdbcType=BIGINT}, - delete_user_id = #{record.deleteUserId,jdbcType=VARCHAR} + delete_user_id = #{record.deleteUserId,jdbcType=VARCHAR}, + follow_people = #{record.followPeople,jdbcType=VARCHAR} @@ -550,6 +565,9 @@ delete_user_id = #{deleteUserId,jdbcType=VARCHAR}, + + follow_people = #{followPeople,jdbcType=VARCHAR}, + description = #{description,jdbcType=LONGVARCHAR}, @@ -586,6 +604,7 @@ case_passing_rate = #{casePassingRate,jdbcType=VARCHAR}, delete_time = #{deleteTime,jdbcType=BIGINT}, delete_user_id = #{deleteUserId,jdbcType=VARCHAR}, + follow_people = #{followPeople,jdbcType=VARCHAR}, description = #{description,jdbcType=LONGVARCHAR}, request = #{request,jdbcType=LONGVARCHAR}, response = #{response,jdbcType=LONGVARCHAR} @@ -614,7 +633,8 @@ case_status = #{caseStatus,jdbcType=VARCHAR}, case_passing_rate = #{casePassingRate,jdbcType=VARCHAR}, delete_time = #{deleteTime,jdbcType=BIGINT}, - delete_user_id = #{deleteUserId,jdbcType=VARCHAR} + delete_user_id = #{deleteUserId,jdbcType=VARCHAR}, + follow_people = #{followPeople,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ApiDocumentShareMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ApiDocumentShareMapper.java deleted file mode 100644 index cce13d641c..0000000000 --- a/backend/src/main/java/io/metersphere/base/mapper/ApiDocumentShareMapper.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.metersphere.base.mapper; - -import io.metersphere.base.domain.ApiDocumentShare; -import io.metersphere.base.domain.ApiDocumentShareExample; -import java.util.List; -import org.apache.ibatis.annotations.Param; - -public interface ApiDocumentShareMapper { - long countByExample(ApiDocumentShareExample example); - - int deleteByExample(ApiDocumentShareExample example); - - int deleteByPrimaryKey(String id); - - int insert(ApiDocumentShare record); - - int insertSelective(ApiDocumentShare record); - - List selectByExampleWithBLOBs(ApiDocumentShareExample example); - - List selectByExample(ApiDocumentShareExample example); - - ApiDocumentShare selectByPrimaryKey(String id); - - int updateByExampleSelective(@Param("record") ApiDocumentShare record, @Param("example") ApiDocumentShareExample example); - - int updateByExampleWithBLOBs(@Param("record") ApiDocumentShare record, @Param("example") ApiDocumentShareExample example); - - int updateByExample(@Param("record") ApiDocumentShare record, @Param("example") ApiDocumentShareExample example); - - int updateByPrimaryKeySelective(ApiDocumentShare record); - - int updateByPrimaryKeyWithBLOBs(ApiDocumentShare record); - - int updateByPrimaryKey(ApiDocumentShare record); -} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioMapper.xml index c1aa4d7231..4e4e1bed04 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioMapper.xml @@ -27,6 +27,7 @@ + @@ -95,7 +96,7 @@ id, project_id, tags, user_id, api_scenario_module_id, module_path, `name`, `level`, `status`, principal, step_total, follow_people, schedule, create_time, update_time, pass_rate, last_result, report_id, num, original_state, custom_num, create_user, - version, delete_time, delete_user_id + version, delete_time, delete_user_id, execute_times scenario_definition, description, use_url @@ -157,8 +158,8 @@ pass_rate, last_result, report_id, num, original_state, custom_num, create_user, version, delete_time, - delete_user_id, scenario_definition, description, - use_url) + delete_user_id, execute_times, scenario_definition, + description, use_url) values (#{id,jdbcType=VARCHAR}, #{projectId,jdbcType=VARCHAR}, #{tags,jdbcType=VARCHAR}, #{userId,jdbcType=VARCHAR}, #{apiScenarioModuleId,jdbcType=VARCHAR}, #{modulePath,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{level,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, @@ -167,8 +168,8 @@ #{passRate,jdbcType=VARCHAR}, #{lastResult,jdbcType=VARCHAR}, #{reportId,jdbcType=VARCHAR}, #{num,jdbcType=INTEGER}, #{originalState,jdbcType=VARCHAR}, #{customNum,jdbcType=VARCHAR}, #{createUser,jdbcType=VARCHAR}, #{version,jdbcType=INTEGER}, #{deleteTime,jdbcType=BIGINT}, - #{deleteUserId,jdbcType=VARCHAR}, #{scenarioDefinition,jdbcType=LONGVARCHAR}, #{description,jdbcType=LONGVARCHAR}, - #{useUrl,jdbcType=LONGVARCHAR}) + #{deleteUserId,jdbcType=VARCHAR}, #{executeTimes,jdbcType=INTEGER}, #{scenarioDefinition,jdbcType=LONGVARCHAR}, + #{description,jdbcType=LONGVARCHAR}, #{useUrl,jdbcType=LONGVARCHAR}) insert into api_scenario @@ -248,6 +249,9 @@ delete_user_id, + + execute_times, + scenario_definition, @@ -334,6 +338,9 @@ #{deleteUserId,jdbcType=VARCHAR}, + + #{executeTimes,jdbcType=INTEGER}, + #{scenarioDefinition,jdbcType=LONGVARCHAR}, @@ -429,6 +436,9 @@ delete_user_id = #{record.deleteUserId,jdbcType=VARCHAR}, + + execute_times = #{record.executeTimes,jdbcType=INTEGER}, + scenario_definition = #{record.scenarioDefinition,jdbcType=LONGVARCHAR}, @@ -470,6 +480,7 @@ version = #{record.version,jdbcType=INTEGER}, delete_time = #{record.deleteTime,jdbcType=BIGINT}, delete_user_id = #{record.deleteUserId,jdbcType=VARCHAR}, + execute_times = #{record.executeTimes,jdbcType=INTEGER}, scenario_definition = #{record.scenarioDefinition,jdbcType=LONGVARCHAR}, description = #{record.description,jdbcType=LONGVARCHAR}, use_url = #{record.useUrl,jdbcType=LONGVARCHAR} @@ -503,7 +514,8 @@ create_user = #{record.createUser,jdbcType=VARCHAR}, version = #{record.version,jdbcType=INTEGER}, delete_time = #{record.deleteTime,jdbcType=BIGINT}, - delete_user_id = #{record.deleteUserId,jdbcType=VARCHAR} + delete_user_id = #{record.deleteUserId,jdbcType=VARCHAR}, + execute_times = #{record.executeTimes,jdbcType=INTEGER} @@ -583,6 +595,9 @@ delete_user_id = #{deleteUserId,jdbcType=VARCHAR}, + + execute_times = #{executeTimes,jdbcType=INTEGER}, + scenario_definition = #{scenarioDefinition,jdbcType=LONGVARCHAR}, @@ -621,6 +636,7 @@ version = #{version,jdbcType=INTEGER}, delete_time = #{deleteTime,jdbcType=BIGINT}, delete_user_id = #{deleteUserId,jdbcType=VARCHAR}, + execute_times = #{executeTimes,jdbcType=INTEGER}, scenario_definition = #{scenarioDefinition,jdbcType=LONGVARCHAR}, description = #{description,jdbcType=LONGVARCHAR}, use_url = #{useUrl,jdbcType=LONGVARCHAR} @@ -651,7 +667,8 @@ create_user = #{createUser,jdbcType=VARCHAR}, version = #{version,jdbcType=INTEGER}, delete_time = #{deleteTime,jdbcType=BIGINT}, - delete_user_id = #{deleteUserId,jdbcType=VARCHAR} + delete_user_id = #{deleteUserId,jdbcType=VARCHAR}, + execute_times = #{executeTimes,jdbcType=INTEGER} where id = #{id,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioReportMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioReportMapper.xml index 251545c65c..502ff02d99 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioReportMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioReportMapper.xml @@ -15,6 +15,7 @@ + @@ -79,7 +80,7 @@ id, project_id, `name`, create_time, update_time, `status`, user_id, trigger_mode, - execute_type, scenario_name, scenario_id, create_user, actuator + execute_type, scenario_name, scenario_id, create_user, actuator, end_time description @@ -137,12 +138,14 @@ create_time, update_time, `status`, user_id, trigger_mode, execute_type, scenario_name, scenario_id, create_user, - actuator, description) + actuator, end_time, description + ) values (#{id,jdbcType=VARCHAR}, #{projectId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT}, #{status,jdbcType=VARCHAR}, #{userId,jdbcType=VARCHAR}, #{triggerMode,jdbcType=VARCHAR}, #{executeType,jdbcType=VARCHAR}, #{scenarioName,jdbcType=VARCHAR}, #{scenarioId,jdbcType=VARCHAR}, #{createUser,jdbcType=VARCHAR}, - #{actuator,jdbcType=VARCHAR}, #{description,jdbcType=LONGVARCHAR}) + #{actuator,jdbcType=VARCHAR}, #{endTime,jdbcType=BIGINT}, #{description,jdbcType=LONGVARCHAR} + ) insert into api_scenario_report @@ -186,6 +189,9 @@ actuator, + + end_time, + description, @@ -230,6 +236,9 @@ #{actuator,jdbcType=VARCHAR}, + + #{endTime,jdbcType=BIGINT}, + #{description,jdbcType=LONGVARCHAR}, @@ -283,6 +292,9 @@ actuator = #{record.actuator,jdbcType=VARCHAR}, + + end_time = #{record.endTime,jdbcType=BIGINT}, + description = #{record.description,jdbcType=LONGVARCHAR}, @@ -306,6 +318,7 @@ scenario_id = #{record.scenarioId,jdbcType=VARCHAR}, create_user = #{record.createUser,jdbcType=VARCHAR}, actuator = #{record.actuator,jdbcType=VARCHAR}, + end_time = #{record.endTime,jdbcType=BIGINT}, description = #{record.description,jdbcType=LONGVARCHAR} @@ -325,7 +338,8 @@ scenario_name = #{record.scenarioName,jdbcType=VARCHAR}, scenario_id = #{record.scenarioId,jdbcType=VARCHAR}, create_user = #{record.createUser,jdbcType=VARCHAR}, - actuator = #{record.actuator,jdbcType=VARCHAR} + actuator = #{record.actuator,jdbcType=VARCHAR}, + end_time = #{record.endTime,jdbcType=BIGINT} @@ -369,6 +383,9 @@ actuator = #{actuator,jdbcType=VARCHAR}, + + end_time = #{endTime,jdbcType=BIGINT}, + description = #{description,jdbcType=LONGVARCHAR}, @@ -389,6 +406,7 @@ scenario_id = #{scenarioId,jdbcType=VARCHAR}, create_user = #{createUser,jdbcType=VARCHAR}, actuator = #{actuator,jdbcType=VARCHAR}, + end_time = #{endTime,jdbcType=BIGINT}, description = #{description,jdbcType=LONGVARCHAR} where id = #{id,jdbcType=VARCHAR} @@ -405,7 +423,8 @@ scenario_name = #{scenarioName,jdbcType=VARCHAR}, scenario_id = #{scenarioId,jdbcType=VARCHAR}, create_user = #{createUser,jdbcType=VARCHAR}, - actuator = #{actuator,jdbcType=VARCHAR} + actuator = #{actuator,jdbcType=VARCHAR}, + end_time = #{endTime,jdbcType=BIGINT} where id = #{id,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ApiTestCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ApiTestCaseMapper.xml index e3790259e7..53252cc80a 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ApiTestCaseMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ApiTestCaseMapper.xml @@ -19,6 +19,7 @@ + @@ -83,9 +84,9 @@ - id, project_id, `name`, priority, api_definition_id, create_user_id, update_user_id, - create_time, update_time, num, tags, last_result_id, `status`, original_status, delete_time, - delete_user_id, version + id, project_id, `name`, priority, api_definition_id, create_user_id, update_user_id, + create_time, update_time, num, tags, last_result_id, `status`, original_status, delete_time, + delete_user_id, version, follow_people description, request @@ -121,7 +122,7 @@ + select + + distinct + + + , + + from notification + + + + + order by ${orderByClause} + + + + + + delete from notification + where id = #{id,jdbcType=BIGINT} + + + delete from notification + + + + + + insert into notification (id, `type`, receiver, + title, `status`, create_time, + `operator`, `operation`, resource_id, + resource_type, resource_name, content + ) + values (#{id,jdbcType=BIGINT}, #{type,jdbcType=VARCHAR}, #{receiver,jdbcType=VARCHAR}, + #{title,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{createTime,jdbcType=BIGINT}, + #{operator,jdbcType=VARCHAR}, #{operation,jdbcType=VARCHAR}, #{resourceId,jdbcType=VARCHAR}, + #{resourceType,jdbcType=VARCHAR}, #{resourceName,jdbcType=VARCHAR}, #{content,jdbcType=LONGVARCHAR} + ) + + + insert into notification + + + id, + + + `type`, + + + receiver, + + + title, + + + `status`, + + + create_time, + + + `operator`, + + + `operation`, + + + resource_id, + + + resource_type, + + + resource_name, + + + content, + + + + + #{id,jdbcType=BIGINT}, + + + #{type,jdbcType=VARCHAR}, + + + #{receiver,jdbcType=VARCHAR}, + + + #{title,jdbcType=VARCHAR}, + + + #{status,jdbcType=VARCHAR}, + + + #{createTime,jdbcType=BIGINT}, + + + #{operator,jdbcType=VARCHAR}, + + + #{operation,jdbcType=VARCHAR}, + + + #{resourceId,jdbcType=VARCHAR}, + + + #{resourceType,jdbcType=VARCHAR}, + + + #{resourceName,jdbcType=VARCHAR}, + + + #{content,jdbcType=LONGVARCHAR}, + + + + + + update notification + + + id = #{record.id,jdbcType=BIGINT}, + + + `type` = #{record.type,jdbcType=VARCHAR}, + + + receiver = #{record.receiver,jdbcType=VARCHAR}, + + + title = #{record.title,jdbcType=VARCHAR}, + + + `status` = #{record.status,jdbcType=VARCHAR}, + + + create_time = #{record.createTime,jdbcType=BIGINT}, + + + `operator` = #{record.operator,jdbcType=VARCHAR}, + + + `operation` = #{record.operation,jdbcType=VARCHAR}, + + + resource_id = #{record.resourceId,jdbcType=VARCHAR}, + + + resource_type = #{record.resourceType,jdbcType=VARCHAR}, + + + resource_name = #{record.resourceName,jdbcType=VARCHAR}, + + + content = #{record.content,jdbcType=LONGVARCHAR}, + + + + + + + + update notification + set id = #{record.id,jdbcType=BIGINT}, + `type` = #{record.type,jdbcType=VARCHAR}, + receiver = #{record.receiver,jdbcType=VARCHAR}, + title = #{record.title,jdbcType=VARCHAR}, + `status` = #{record.status,jdbcType=VARCHAR}, + create_time = #{record.createTime,jdbcType=BIGINT}, + `operator` = #{record.operator,jdbcType=VARCHAR}, + `operation` = #{record.operation,jdbcType=VARCHAR}, + resource_id = #{record.resourceId,jdbcType=VARCHAR}, + resource_type = #{record.resourceType,jdbcType=VARCHAR}, + resource_name = #{record.resourceName,jdbcType=VARCHAR}, + content = #{record.content,jdbcType=LONGVARCHAR} + + + + + + update notification + set id = #{record.id,jdbcType=BIGINT}, + `type` = #{record.type,jdbcType=VARCHAR}, + receiver = #{record.receiver,jdbcType=VARCHAR}, + title = #{record.title,jdbcType=VARCHAR}, + `status` = #{record.status,jdbcType=VARCHAR}, + create_time = #{record.createTime,jdbcType=BIGINT}, + `operator` = #{record.operator,jdbcType=VARCHAR}, + `operation` = #{record.operation,jdbcType=VARCHAR}, + resource_id = #{record.resourceId,jdbcType=VARCHAR}, + resource_type = #{record.resourceType,jdbcType=VARCHAR}, + resource_name = #{record.resourceName,jdbcType=VARCHAR} + + + + + + update notification + + + `type` = #{type,jdbcType=VARCHAR}, + + + receiver = #{receiver,jdbcType=VARCHAR}, + + + title = #{title,jdbcType=VARCHAR}, + + + `status` = #{status,jdbcType=VARCHAR}, + + + create_time = #{createTime,jdbcType=BIGINT}, + + + `operator` = #{operator,jdbcType=VARCHAR}, + + + `operation` = #{operation,jdbcType=VARCHAR}, + + + resource_id = #{resourceId,jdbcType=VARCHAR}, + + + resource_type = #{resourceType,jdbcType=VARCHAR}, + + + resource_name = #{resourceName,jdbcType=VARCHAR}, + + + content = #{content,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update notification + set `type` = #{type,jdbcType=VARCHAR}, + receiver = #{receiver,jdbcType=VARCHAR}, + title = #{title,jdbcType=VARCHAR}, + `status` = #{status,jdbcType=VARCHAR}, + create_time = #{createTime,jdbcType=BIGINT}, + `operator` = #{operator,jdbcType=VARCHAR}, + `operation` = #{operation,jdbcType=VARCHAR}, + resource_id = #{resourceId,jdbcType=VARCHAR}, + resource_type = #{resourceType,jdbcType=VARCHAR}, + resource_name = #{resourceName,jdbcType=VARCHAR}, + content = #{content,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=BIGINT} + + + update notification + set `type` = #{type,jdbcType=VARCHAR}, + receiver = #{receiver,jdbcType=VARCHAR}, + title = #{title,jdbcType=VARCHAR}, + `status` = #{status,jdbcType=VARCHAR}, + create_time = #{createTime,jdbcType=BIGINT}, + `operator` = #{operator,jdbcType=VARCHAR}, + `operation` = #{operation,jdbcType=VARCHAR}, + resource_id = #{resourceId,jdbcType=VARCHAR}, + resource_type = #{resourceType,jdbcType=VARCHAR}, + resource_name = #{resourceName,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ProjectMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ProjectMapper.xml index f99aa860a8..55baf5e074 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ProjectMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ProjectMapper.xml @@ -19,6 +19,8 @@ + + @@ -81,7 +83,7 @@ id, workspace_id, `name`, description, create_time, update_time, tapd_id, jira_key, zentao_id, azure_devops_id, `repeatable`, case_template_id, issue_template_id, custom_num, - scenario_custom_num, create_user, system_id + scenario_custom_num, create_user, system_id, mock_tcp_port, is_mock_tcp_open @@ -296,6 +312,12 @@ system_id = #{record.systemId,jdbcType=VARCHAR}, + + mock_tcp_port = #{record.mockTcpPort,jdbcType=INTEGER}, + + + is_mock_tcp_open = #{record.isMockTcpOpen,jdbcType=BIT}, + @@ -319,7 +341,9 @@ custom_num = #{record.customNum,jdbcType=BIT}, scenario_custom_num = #{record.scenarioCustomNum,jdbcType=BIT}, create_user = #{record.createUser,jdbcType=VARCHAR}, - system_id = #{record.systemId,jdbcType=VARCHAR} + system_id = #{record.systemId,jdbcType=VARCHAR}, + mock_tcp_port = #{record.mockTcpPort,jdbcType=INTEGER}, + is_mock_tcp_open = #{record.isMockTcpOpen,jdbcType=BIT} @@ -375,6 +399,12 @@ system_id = #{systemId,jdbcType=VARCHAR}, + + mock_tcp_port = #{mockTcpPort,jdbcType=INTEGER}, + + + is_mock_tcp_open = #{isMockTcpOpen,jdbcType=BIT}, + where id = #{id,jdbcType=VARCHAR} @@ -395,7 +425,9 @@ custom_num = #{customNum,jdbcType=BIT}, scenario_custom_num = #{scenarioCustomNum,jdbcType=BIT}, create_user = #{createUser,jdbcType=VARCHAR}, - system_id = #{systemId,jdbcType=VARCHAR} + system_id = #{systemId,jdbcType=VARCHAR}, + mock_tcp_port = #{mockTcpPort,jdbcType=INTEGER}, + is_mock_tcp_open = #{isMockTcpOpen,jdbcType=BIT} where id = #{id,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ShareInfoMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ShareInfoMapper.java new file mode 100644 index 0000000000..0bd9497a4d --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/ShareInfoMapper.java @@ -0,0 +1,36 @@ +package io.metersphere.base.mapper; + +import io.metersphere.base.domain.ShareInfo; +import io.metersphere.base.domain.ShareInfoExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface ShareInfoMapper { + long countByExample(ShareInfoExample example); + + int deleteByExample(ShareInfoExample example); + + int deleteByPrimaryKey(String id); + + int insert(ShareInfo record); + + int insertSelective(ShareInfo record); + + List selectByExampleWithBLOBs(ShareInfoExample example); + + List selectByExample(ShareInfoExample example); + + ShareInfo selectByPrimaryKey(String id); + + int updateByExampleSelective(@Param("record") ShareInfo record, @Param("example") ShareInfoExample example); + + int updateByExampleWithBLOBs(@Param("record") ShareInfo record, @Param("example") ShareInfoExample example); + + int updateByExample(@Param("record") ShareInfo record, @Param("example") ShareInfoExample example); + + int updateByPrimaryKeySelective(ShareInfo record); + + int updateByPrimaryKeyWithBLOBs(ShareInfo record); + + int updateByPrimaryKey(ShareInfo record); +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ApiDocumentShareMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ShareInfoMapper.xml similarity index 83% rename from backend/src/main/java/io/metersphere/base/mapper/ApiDocumentShareMapper.xml rename to backend/src/main/java/io/metersphere/base/mapper/ShareInfoMapper.xml index 1a41b92a37..a9a71d8cdc 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ApiDocumentShareMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ShareInfoMapper.xml @@ -1,15 +1,15 @@ - - + + - - + + @@ -73,9 +73,9 @@ id, create_time, create_user_id, update_time, share_type - share_api_id + custom_data - select distinct @@ -83,7 +83,7 @@ , - from api_document_share + from share_info @@ -91,13 +91,13 @@ order by ${orderByClause} - select distinct - from api_document_share + from share_info @@ -110,29 +110,29 @@ , - from api_document_share + from share_info where id = #{id,jdbcType=VARCHAR} - delete from api_document_share + delete from share_info where id = #{id,jdbcType=VARCHAR} - - delete from api_document_share + + delete from share_info - - insert into api_document_share (id, create_time, create_user_id, - update_time, share_type, share_api_id + + insert into share_info (id, create_time, create_user_id, + update_time, share_type, custom_data ) values (#{id,jdbcType=VARCHAR}, #{createTime,jdbcType=BIGINT}, #{createUserId,jdbcType=VARCHAR}, - #{updateTime,jdbcType=BIGINT}, #{shareType,jdbcType=VARCHAR}, #{shareApiId,jdbcType=LONGVARCHAR} + #{updateTime,jdbcType=BIGINT}, #{shareType,jdbcType=VARCHAR}, #{customData,jdbcType=LONGVARCHAR} ) - - insert into api_document_share + + insert into share_info id, @@ -149,8 +149,8 @@ share_type, - - share_api_id, + + custom_data, @@ -169,19 +169,19 @@ #{shareType,jdbcType=VARCHAR}, - - #{shareApiId,jdbcType=LONGVARCHAR}, + + #{customData,jdbcType=LONGVARCHAR}, - + select count(*) from share_info - update api_document_share + update share_info id = #{record.id,jdbcType=VARCHAR}, @@ -198,8 +198,8 @@ share_type = #{record.shareType,jdbcType=VARCHAR}, - - share_api_id = #{record.shareApiId,jdbcType=LONGVARCHAR}, + + custom_data = #{record.customData,jdbcType=LONGVARCHAR}, @@ -207,19 +207,19 @@ - update api_document_share + update share_info set id = #{record.id,jdbcType=VARCHAR}, create_time = #{record.createTime,jdbcType=BIGINT}, create_user_id = #{record.createUserId,jdbcType=VARCHAR}, update_time = #{record.updateTime,jdbcType=BIGINT}, share_type = #{record.shareType,jdbcType=VARCHAR}, - share_api_id = #{record.shareApiId,jdbcType=LONGVARCHAR} + custom_data = #{record.customData,jdbcType=LONGVARCHAR} - update api_document_share + update share_info set id = #{record.id,jdbcType=VARCHAR}, create_time = #{record.createTime,jdbcType=BIGINT}, create_user_id = #{record.createUserId,jdbcType=VARCHAR}, @@ -229,8 +229,8 @@ - - update api_document_share + + update share_info create_time = #{createTime,jdbcType=BIGINT}, @@ -244,23 +244,23 @@ share_type = #{shareType,jdbcType=VARCHAR}, - - share_api_id = #{shareApiId,jdbcType=LONGVARCHAR}, + + custom_data = #{customData,jdbcType=LONGVARCHAR}, where id = #{id,jdbcType=VARCHAR} - - update api_document_share + + update share_info set create_time = #{createTime,jdbcType=BIGINT}, create_user_id = #{createUserId,jdbcType=VARCHAR}, update_time = #{updateTime,jdbcType=BIGINT}, share_type = #{shareType,jdbcType=VARCHAR}, - share_api_id = #{shareApiId,jdbcType=LONGVARCHAR} + custom_data = #{customData,jdbcType=LONGVARCHAR} where id = #{id,jdbcType=VARCHAR} - - update api_document_share + + update share_info set create_time = #{createTime,jdbcType=BIGINT}, create_user_id = #{createUserId,jdbcType=VARCHAR}, update_time = #{updateTime,jdbcType=BIGINT}, diff --git a/backend/src/main/java/io/metersphere/base/mapper/TestCaseTestMapper.java b/backend/src/main/java/io/metersphere/base/mapper/TestCaseTestMapper.java index f8fcb8eee6..ed49b191ce 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/TestCaseTestMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/TestCaseTestMapper.java @@ -1,8 +1,15 @@ package io.metersphere.base.mapper; +import io.metersphere.api.dto.automation.ApiScenarioDTO; +import io.metersphere.api.dto.automation.ApiScenarioRequest; +import io.metersphere.api.dto.definition.ApiTestCaseDTO; +import io.metersphere.api.dto.definition.ApiTestCaseRequest; import io.metersphere.base.domain.TestCaseTest; import io.metersphere.base.domain.TestCaseTestExample; import java.util.List; + +import io.metersphere.dto.LoadTestDTO; +import io.metersphere.track.request.testplan.LoadCaseRequest; import org.apache.ibatis.annotations.Param; public interface TestCaseTestMapper { @@ -19,4 +26,10 @@ public interface TestCaseTestMapper { int updateByExampleSelective(@Param("record") TestCaseTest record, @Param("example") TestCaseTestExample example); int updateByExample(@Param("record") TestCaseTest record, @Param("example") TestCaseTestExample example); -} \ No newline at end of file + + List relevanceApiList(@Param("request") ApiTestCaseRequest request); + + List relevanceScenarioList(@Param("request") ApiScenarioRequest request); + + List relevanceLoadList(@Param("request") LoadCaseRequest request); +} diff --git a/backend/src/main/java/io/metersphere/base/mapper/TestCaseTestMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/TestCaseTestMapper.xml index 45bf667ec5..2b93b96e87 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/TestCaseTestMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/TestCaseTestMapper.xml @@ -90,9 +90,9 @@ - insert into test_case_test (test_case_id, test_id, test_type, + insert into test_case_test (test_case_id, test_id, test_type, create_time, update_time) - values (#{testCaseId,jdbcType=VARCHAR}, #{testId,jdbcType=VARCHAR}, #{testType,jdbcType=VARCHAR}, + values (#{testCaseId,jdbcType=VARCHAR}, #{testId,jdbcType=VARCHAR}, #{testType,jdbcType=VARCHAR}, #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT}) @@ -138,6 +138,89 @@ + + + update test_case_test @@ -172,4 +255,4 @@ - \ No newline at end of file + diff --git a/backend/src/main/java/io/metersphere/base/mapper/TestPlanMapper.java b/backend/src/main/java/io/metersphere/base/mapper/TestPlanMapper.java index 9bd76ce709..a12c101d1b 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/TestPlanMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/TestPlanMapper.java @@ -2,6 +2,7 @@ package io.metersphere.base.mapper; import io.metersphere.base.domain.TestPlan; import io.metersphere.base.domain.TestPlanExample; +import io.metersphere.base.domain.TestPlanWithBLOBs; import java.util.List; import org.apache.ibatis.annotations.Param; @@ -12,25 +13,25 @@ public interface TestPlanMapper { int deleteByPrimaryKey(String id); - int insert(TestPlan record); + int insert(TestPlanWithBLOBs record); - int insertSelective(TestPlan record); + int insertSelective(TestPlanWithBLOBs record); - List selectByExampleWithBLOBs(TestPlanExample example); + List selectByExampleWithBLOBs(TestPlanExample example); List selectByExample(TestPlanExample example); - TestPlan selectByPrimaryKey(String id); + TestPlanWithBLOBs selectByPrimaryKey(String id); - int updateByExampleSelective(@Param("record") TestPlan record, @Param("example") TestPlanExample example); + int updateByExampleSelective(@Param("record") TestPlanWithBLOBs record, @Param("example") TestPlanExample example); - int updateByExampleWithBLOBs(@Param("record") TestPlan record, @Param("example") TestPlanExample example); + int updateByExampleWithBLOBs(@Param("record") TestPlanWithBLOBs record, @Param("example") TestPlanExample example); int updateByExample(@Param("record") TestPlan record, @Param("example") TestPlanExample example); - int updateByPrimaryKeySelective(TestPlan record); + int updateByPrimaryKeySelective(TestPlanWithBLOBs record); - int updateByPrimaryKeyWithBLOBs(TestPlan record); + int updateByPrimaryKeyWithBLOBs(TestPlanWithBLOBs record); int updateByPrimaryKey(TestPlan record); } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/TestPlanMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/TestPlanMapper.xml index 357a332f24..55f7ce6105 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/TestPlanMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/TestPlanMapper.xml @@ -23,8 +23,10 @@ - + + + @@ -90,7 +92,7 @@ actual_start_time, actual_end_time, creator, project_id, execution_times, automatic_status_update - tags + tags, report_summary, report_config @@ -363,6 +377,12 @@ tags = #{record.tags,jdbcType=LONGVARCHAR}, + + report_summary = #{record.reportSummary,jdbcType=LONGVARCHAR}, + + + report_config = #{record.reportConfig,jdbcType=LONGVARCHAR}, + @@ -390,7 +410,9 @@ project_id = #{record.projectId,jdbcType=VARCHAR}, execution_times = #{record.executionTimes,jdbcType=INTEGER}, automatic_status_update = #{record.automaticStatusUpdate,jdbcType=BIT}, - tags = #{record.tags,jdbcType=LONGVARCHAR} + tags = #{record.tags,jdbcType=LONGVARCHAR}, + report_summary = #{record.reportSummary,jdbcType=LONGVARCHAR}, + report_config = #{record.reportConfig,jdbcType=LONGVARCHAR} @@ -421,7 +443,7 @@ - + update test_plan @@ -484,10 +506,16 @@ tags = #{tags,jdbcType=LONGVARCHAR}, + + report_summary = #{reportSummary,jdbcType=LONGVARCHAR}, + + + report_config = #{reportConfig,jdbcType=LONGVARCHAR}, + where id = #{id,jdbcType=VARCHAR} - + update test_plan set workspace_id = #{workspaceId,jdbcType=VARCHAR}, report_id = #{reportId,jdbcType=VARCHAR}, @@ -508,7 +536,9 @@ project_id = #{projectId,jdbcType=VARCHAR}, execution_times = #{executionTimes,jdbcType=INTEGER}, automatic_status_update = #{automaticStatusUpdate,jdbcType=BIT}, - tags = #{tags,jdbcType=LONGVARCHAR} + tags = #{tags,jdbcType=LONGVARCHAR}, + report_summary = #{reportSummary,jdbcType=LONGVARCHAR}, + report_config = #{reportConfig,jdbcType=LONGVARCHAR} where id = #{id,jdbcType=VARCHAR} diff --git a/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportContentMapper.java b/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportContentMapper.java new file mode 100644 index 0000000000..4217e2413e --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportContentMapper.java @@ -0,0 +1,37 @@ +package io.metersphere.base.mapper; + +import io.metersphere.base.domain.TestPlanReportContent; +import io.metersphere.base.domain.TestPlanReportContentExample; +import io.metersphere.base.domain.TestPlanReportContentWithBLOBs; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface TestPlanReportContentMapper { + long countByExample(TestPlanReportContentExample example); + + int deleteByExample(TestPlanReportContentExample example); + + int deleteByPrimaryKey(String id); + + int insert(TestPlanReportContentWithBLOBs record); + + int insertSelective(TestPlanReportContentWithBLOBs record); + + List selectByExampleWithBLOBs(TestPlanReportContentExample example); + + List selectByExample(TestPlanReportContentExample example); + + TestPlanReportContentWithBLOBs selectByPrimaryKey(String id); + + int updateByExampleSelective(@Param("record") TestPlanReportContentWithBLOBs record, @Param("example") TestPlanReportContentExample example); + + int updateByExampleWithBLOBs(@Param("record") TestPlanReportContentWithBLOBs record, @Param("example") TestPlanReportContentExample example); + + int updateByExample(@Param("record") TestPlanReportContent record, @Param("example") TestPlanReportContentExample example); + + int updateByPrimaryKeySelective(TestPlanReportContentWithBLOBs record); + + int updateByPrimaryKeyWithBLOBs(TestPlanReportContentWithBLOBs record); + + int updateByPrimaryKey(TestPlanReportContent record); +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportContentMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportContentMapper.xml new file mode 100644 index 0000000000..1509bedbdd --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportContentMapper.xml @@ -0,0 +1,529 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, test_plan_report_id, start_time, case_count, end_time, execute_rate, pass_rate, + is_third_part_issue + + + config, summary, function_result, api_result, load_result, function_all_cases, function_failure_cases, + issue_list, api_all_cases, api_failure_cases, scenario_all_cases, scenario_failure_cases, + load_all_Cases, load_failure_cases + + + + + + delete from test_plan_report_content + where id = #{id,jdbcType=VARCHAR} + + + delete from test_plan_report_content + + + + + + insert into test_plan_report_content (id, test_plan_report_id, start_time, + case_count, end_time, execute_rate, + pass_rate, is_third_part_issue, config, + summary, function_result, api_result, + load_result, function_all_cases, function_failure_cases, + issue_list, api_all_cases, api_failure_cases, + scenario_all_cases, scenario_failure_cases, + load_all_Cases, load_failure_cases) + values (#{id,jdbcType=VARCHAR}, #{testPlanReportId,jdbcType=VARCHAR}, #{startTime,jdbcType=BIGINT}, + #{caseCount,jdbcType=BIGINT}, #{endTime,jdbcType=BIGINT}, #{executeRate,jdbcType=DOUBLE}, + #{passRate,jdbcType=DOUBLE}, #{isThirdPartIssue,jdbcType=BIT}, #{config,jdbcType=LONGVARCHAR}, + #{summary,jdbcType=LONGVARCHAR}, #{functionResult,jdbcType=LONGVARCHAR}, #{apiResult,jdbcType=LONGVARCHAR}, + #{loadResult,jdbcType=LONGVARCHAR}, #{functionAllCases,jdbcType=LONGVARCHAR}, #{functionFailureCases,jdbcType=LONGVARCHAR}, + #{issueList,jdbcType=LONGVARCHAR}, #{apiAllCases,jdbcType=LONGVARCHAR}, #{apiFailureCases,jdbcType=LONGVARCHAR}, + #{scenarioAllCases,jdbcType=LONGVARCHAR}, #{scenarioFailureCases,jdbcType=LONGVARCHAR}, + #{loadAllCases,jdbcType=LONGVARCHAR}, #{loadFailureCases,jdbcType=LONGVARCHAR}) + + + insert into test_plan_report_content + + + id, + + + test_plan_report_id, + + + start_time, + + + case_count, + + + end_time, + + + execute_rate, + + + pass_rate, + + + is_third_part_issue, + + + config, + + + summary, + + + function_result, + + + api_result, + + + load_result, + + + function_all_cases, + + + function_failure_cases, + + + issue_list, + + + api_all_cases, + + + api_failure_cases, + + + scenario_all_cases, + + + scenario_failure_cases, + + + load_all_Cases, + + + load_failure_cases, + + + + + #{id,jdbcType=VARCHAR}, + + + #{testPlanReportId,jdbcType=VARCHAR}, + + + #{startTime,jdbcType=BIGINT}, + + + #{caseCount,jdbcType=BIGINT}, + + + #{endTime,jdbcType=BIGINT}, + + + #{executeRate,jdbcType=DOUBLE}, + + + #{passRate,jdbcType=DOUBLE}, + + + #{isThirdPartIssue,jdbcType=BIT}, + + + #{config,jdbcType=LONGVARCHAR}, + + + #{summary,jdbcType=LONGVARCHAR}, + + + #{functionResult,jdbcType=LONGVARCHAR}, + + + #{apiResult,jdbcType=LONGVARCHAR}, + + + #{loadResult,jdbcType=LONGVARCHAR}, + + + #{functionAllCases,jdbcType=LONGVARCHAR}, + + + #{functionFailureCases,jdbcType=LONGVARCHAR}, + + + #{issueList,jdbcType=LONGVARCHAR}, + + + #{apiAllCases,jdbcType=LONGVARCHAR}, + + + #{apiFailureCases,jdbcType=LONGVARCHAR}, + + + #{scenarioAllCases,jdbcType=LONGVARCHAR}, + + + #{scenarioFailureCases,jdbcType=LONGVARCHAR}, + + + #{loadAllCases,jdbcType=LONGVARCHAR}, + + + #{loadFailureCases,jdbcType=LONGVARCHAR}, + + + + + + update test_plan_report_content + + + id = #{record.id,jdbcType=VARCHAR}, + + + test_plan_report_id = #{record.testPlanReportId,jdbcType=VARCHAR}, + + + start_time = #{record.startTime,jdbcType=BIGINT}, + + + case_count = #{record.caseCount,jdbcType=BIGINT}, + + + end_time = #{record.endTime,jdbcType=BIGINT}, + + + execute_rate = #{record.executeRate,jdbcType=DOUBLE}, + + + pass_rate = #{record.passRate,jdbcType=DOUBLE}, + + + is_third_part_issue = #{record.isThirdPartIssue,jdbcType=BIT}, + + + config = #{record.config,jdbcType=LONGVARCHAR}, + + + summary = #{record.summary,jdbcType=LONGVARCHAR}, + + + function_result = #{record.functionResult,jdbcType=LONGVARCHAR}, + + + api_result = #{record.apiResult,jdbcType=LONGVARCHAR}, + + + load_result = #{record.loadResult,jdbcType=LONGVARCHAR}, + + + function_all_cases = #{record.functionAllCases,jdbcType=LONGVARCHAR}, + + + function_failure_cases = #{record.functionFailureCases,jdbcType=LONGVARCHAR}, + + + issue_list = #{record.issueList,jdbcType=LONGVARCHAR}, + + + api_all_cases = #{record.apiAllCases,jdbcType=LONGVARCHAR}, + + + api_failure_cases = #{record.apiFailureCases,jdbcType=LONGVARCHAR}, + + + scenario_all_cases = #{record.scenarioAllCases,jdbcType=LONGVARCHAR}, + + + scenario_failure_cases = #{record.scenarioFailureCases,jdbcType=LONGVARCHAR}, + + + load_all_Cases = #{record.loadAllCases,jdbcType=LONGVARCHAR}, + + + load_failure_cases = #{record.loadFailureCases,jdbcType=LONGVARCHAR}, + + + + + + + + update test_plan_report_content + set id = #{record.id,jdbcType=VARCHAR}, + test_plan_report_id = #{record.testPlanReportId,jdbcType=VARCHAR}, + start_time = #{record.startTime,jdbcType=BIGINT}, + case_count = #{record.caseCount,jdbcType=BIGINT}, + end_time = #{record.endTime,jdbcType=BIGINT}, + execute_rate = #{record.executeRate,jdbcType=DOUBLE}, + pass_rate = #{record.passRate,jdbcType=DOUBLE}, + is_third_part_issue = #{record.isThirdPartIssue,jdbcType=BIT}, + config = #{record.config,jdbcType=LONGVARCHAR}, + summary = #{record.summary,jdbcType=LONGVARCHAR}, + function_result = #{record.functionResult,jdbcType=LONGVARCHAR}, + api_result = #{record.apiResult,jdbcType=LONGVARCHAR}, + load_result = #{record.loadResult,jdbcType=LONGVARCHAR}, + function_all_cases = #{record.functionAllCases,jdbcType=LONGVARCHAR}, + function_failure_cases = #{record.functionFailureCases,jdbcType=LONGVARCHAR}, + issue_list = #{record.issueList,jdbcType=LONGVARCHAR}, + api_all_cases = #{record.apiAllCases,jdbcType=LONGVARCHAR}, + api_failure_cases = #{record.apiFailureCases,jdbcType=LONGVARCHAR}, + scenario_all_cases = #{record.scenarioAllCases,jdbcType=LONGVARCHAR}, + scenario_failure_cases = #{record.scenarioFailureCases,jdbcType=LONGVARCHAR}, + load_all_Cases = #{record.loadAllCases,jdbcType=LONGVARCHAR}, + load_failure_cases = #{record.loadFailureCases,jdbcType=LONGVARCHAR} + + + + + + update test_plan_report_content + set id = #{record.id,jdbcType=VARCHAR}, + test_plan_report_id = #{record.testPlanReportId,jdbcType=VARCHAR}, + start_time = #{record.startTime,jdbcType=BIGINT}, + case_count = #{record.caseCount,jdbcType=BIGINT}, + end_time = #{record.endTime,jdbcType=BIGINT}, + execute_rate = #{record.executeRate,jdbcType=DOUBLE}, + pass_rate = #{record.passRate,jdbcType=DOUBLE}, + is_third_part_issue = #{record.isThirdPartIssue,jdbcType=BIT} + + + + + + update test_plan_report_content + + + test_plan_report_id = #{testPlanReportId,jdbcType=VARCHAR}, + + + start_time = #{startTime,jdbcType=BIGINT}, + + + case_count = #{caseCount,jdbcType=BIGINT}, + + + end_time = #{endTime,jdbcType=BIGINT}, + + + execute_rate = #{executeRate,jdbcType=DOUBLE}, + + + pass_rate = #{passRate,jdbcType=DOUBLE}, + + + is_third_part_issue = #{isThirdPartIssue,jdbcType=BIT}, + + + config = #{config,jdbcType=LONGVARCHAR}, + + + summary = #{summary,jdbcType=LONGVARCHAR}, + + + function_result = #{functionResult,jdbcType=LONGVARCHAR}, + + + api_result = #{apiResult,jdbcType=LONGVARCHAR}, + + + load_result = #{loadResult,jdbcType=LONGVARCHAR}, + + + function_all_cases = #{functionAllCases,jdbcType=LONGVARCHAR}, + + + function_failure_cases = #{functionFailureCases,jdbcType=LONGVARCHAR}, + + + issue_list = #{issueList,jdbcType=LONGVARCHAR}, + + + api_all_cases = #{apiAllCases,jdbcType=LONGVARCHAR}, + + + api_failure_cases = #{apiFailureCases,jdbcType=LONGVARCHAR}, + + + scenario_all_cases = #{scenarioAllCases,jdbcType=LONGVARCHAR}, + + + scenario_failure_cases = #{scenarioFailureCases,jdbcType=LONGVARCHAR}, + + + load_all_Cases = #{loadAllCases,jdbcType=LONGVARCHAR}, + + + load_failure_cases = #{loadFailureCases,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=VARCHAR} + + + update test_plan_report_content + set test_plan_report_id = #{testPlanReportId,jdbcType=VARCHAR}, + start_time = #{startTime,jdbcType=BIGINT}, + case_count = #{caseCount,jdbcType=BIGINT}, + end_time = #{endTime,jdbcType=BIGINT}, + execute_rate = #{executeRate,jdbcType=DOUBLE}, + pass_rate = #{passRate,jdbcType=DOUBLE}, + is_third_part_issue = #{isThirdPartIssue,jdbcType=BIT}, + config = #{config,jdbcType=LONGVARCHAR}, + summary = #{summary,jdbcType=LONGVARCHAR}, + function_result = #{functionResult,jdbcType=LONGVARCHAR}, + api_result = #{apiResult,jdbcType=LONGVARCHAR}, + load_result = #{loadResult,jdbcType=LONGVARCHAR}, + function_all_cases = #{functionAllCases,jdbcType=LONGVARCHAR}, + function_failure_cases = #{functionFailureCases,jdbcType=LONGVARCHAR}, + issue_list = #{issueList,jdbcType=LONGVARCHAR}, + api_all_cases = #{apiAllCases,jdbcType=LONGVARCHAR}, + api_failure_cases = #{apiFailureCases,jdbcType=LONGVARCHAR}, + scenario_all_cases = #{scenarioAllCases,jdbcType=LONGVARCHAR}, + scenario_failure_cases = #{scenarioFailureCases,jdbcType=LONGVARCHAR}, + load_all_Cases = #{loadAllCases,jdbcType=LONGVARCHAR}, + load_failure_cases = #{loadFailureCases,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=VARCHAR} + + + update test_plan_report_content + set test_plan_report_id = #{testPlanReportId,jdbcType=VARCHAR}, + start_time = #{startTime,jdbcType=BIGINT}, + case_count = #{caseCount,jdbcType=BIGINT}, + end_time = #{endTime,jdbcType=BIGINT}, + execute_rate = #{executeRate,jdbcType=DOUBLE}, + pass_rate = #{passRate,jdbcType=DOUBLE}, + is_third_part_issue = #{isThirdPartIssue,jdbcType=BIT} + where id = #{id,jdbcType=VARCHAR} + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportMapper.xml index 07d1565c22..26b6624711 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportMapper.xml @@ -12,11 +12,12 @@ - - - + + + + @@ -79,7 +80,7 @@ id, test_plan_id, create_time, update_time, `name`, `status`, trigger_mode, creator, start_time, end_time, is_api_case_executing, is_scenario_executing, is_performance_executing, - principal, components + principal, components, is_new @@ -262,13 +269,13 @@ end_time = #{record.endTime,jdbcType=BIGINT}, - is_api_case_executing = #{record.isApiCaseExecuting,jdbcType=TINYINT}, + is_api_case_executing = #{record.isApiCaseExecuting,jdbcType=BIT}, - is_scenario_executing = #{record.isScenarioExecuting,jdbcType=TINYINT}, + is_scenario_executing = #{record.isScenarioExecuting,jdbcType=BIT}, - is_performance_executing = #{record.isPerformanceExecuting,jdbcType=TINYINT}, + is_performance_executing = #{record.isPerformanceExecuting,jdbcType=BIT}, principal = #{record.principal,jdbcType=VARCHAR}, @@ -276,6 +283,9 @@ components = #{record.components,jdbcType=VARCHAR}, + + is_new = #{record.isNew,jdbcType=BIT}, + @@ -293,11 +303,12 @@ creator = #{record.creator,jdbcType=VARCHAR}, start_time = #{record.startTime,jdbcType=BIGINT}, end_time = #{record.endTime,jdbcType=BIGINT}, - is_api_case_executing = #{record.isApiCaseExecuting,jdbcType=TINYINT}, - is_scenario_executing = #{record.isScenarioExecuting,jdbcType=TINYINT}, - is_performance_executing = #{record.isPerformanceExecuting,jdbcType=TINYINT}, + is_api_case_executing = #{record.isApiCaseExecuting,jdbcType=BIT}, + is_scenario_executing = #{record.isScenarioExecuting,jdbcType=BIT}, + is_performance_executing = #{record.isPerformanceExecuting,jdbcType=BIT}, principal = #{record.principal,jdbcType=VARCHAR}, - components = #{record.components,jdbcType=VARCHAR} + components = #{record.components,jdbcType=VARCHAR}, + is_new = #{record.isNew,jdbcType=BIT} @@ -333,13 +344,13 @@ end_time = #{endTime,jdbcType=BIGINT}, - is_api_case_executing = #{isApiCaseExecuting,jdbcType=TINYINT}, + is_api_case_executing = #{isApiCaseExecuting,jdbcType=BIT}, - is_scenario_executing = #{isScenarioExecuting,jdbcType=TINYINT}, + is_scenario_executing = #{isScenarioExecuting,jdbcType=BIT}, - is_performance_executing = #{isPerformanceExecuting,jdbcType=TINYINT}, + is_performance_executing = #{isPerformanceExecuting,jdbcType=BIT}, principal = #{principal,jdbcType=VARCHAR}, @@ -347,6 +358,9 @@ components = #{components,jdbcType=VARCHAR}, + + is_new = #{isNew,jdbcType=BIT}, + where id = #{id,jdbcType=VARCHAR} @@ -361,11 +375,12 @@ creator = #{creator,jdbcType=VARCHAR}, start_time = #{startTime,jdbcType=BIGINT}, end_time = #{endTime,jdbcType=BIGINT}, - is_api_case_executing = #{isApiCaseExecuting,jdbcType=TINYINT}, - is_scenario_executing = #{isScenarioExecuting,jdbcType=TINYINT}, - is_performance_executing = #{isPerformanceExecuting,jdbcType=TINYINT}, + is_api_case_executing = #{isApiCaseExecuting,jdbcType=BIT}, + is_scenario_executing = #{isScenarioExecuting,jdbcType=BIT}, + is_performance_executing = #{isPerformanceExecuting,jdbcType=BIT}, principal = #{principal,jdbcType=VARCHAR}, - components = #{components,jdbcType=VARCHAR} + components = #{components,jdbcType=VARCHAR}, + is_new = #{isNew,jdbcType=BIT} where id = #{id,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportResourceMapper.java b/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportResourceMapper.java deleted file mode 100644 index 1e9580641a..0000000000 --- a/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportResourceMapper.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.metersphere.base.mapper; - -import io.metersphere.base.domain.TestPlanReportResource; -import io.metersphere.base.domain.TestPlanReportResourceExample; -import java.util.List; -import org.apache.ibatis.annotations.Param; - -public interface TestPlanReportResourceMapper { - long countByExample(TestPlanReportResourceExample example); - - int deleteByExample(TestPlanReportResourceExample example); - - int deleteByPrimaryKey(String id); - - int insert(TestPlanReportResource record); - - int insertSelective(TestPlanReportResource record); - - List selectByExample(TestPlanReportResourceExample example); - - TestPlanReportResource selectByPrimaryKey(String id); - - int updateByExampleSelective(@Param("record") TestPlanReportResource record, @Param("example") TestPlanReportResourceExample example); - - int updateByExample(@Param("record") TestPlanReportResource record, @Param("example") TestPlanReportResourceExample example); - - int updateByPrimaryKeySelective(TestPlanReportResource record); - - int updateByPrimaryKey(TestPlanReportResource record); -} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportResourceMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportResourceMapper.xml deleted file mode 100644 index a6fb88a90b..0000000000 --- a/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportResourceMapper.xml +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - - - - - - - - - - - - - and ${criterion.condition} - - - and ${criterion.condition} #{criterion.value} - - - and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} - - - and ${criterion.condition} - - #{listItem} - - - - - - - - - - - - - - - - - - and ${criterion.condition} - - - and ${criterion.condition} #{criterion.value} - - - and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} - - - and ${criterion.condition} - - #{listItem} - - - - - - - - - - - id, test_plan_report_id, resource_id, resource_type, execute_result - - - - - delete from test_plan_report_resource - where id = #{id,jdbcType=VARCHAR} - - - delete from test_plan_report_resource - - - - - - insert into test_plan_report_resource (id, test_plan_report_id, resource_id, - resource_type, execute_result) - values (#{id,jdbcType=VARCHAR}, #{testPlanReportId,jdbcType=VARCHAR}, #{resourceId,jdbcType=VARCHAR}, - #{resourceType,jdbcType=VARCHAR}, #{executeResult,jdbcType=VARCHAR}) - - - insert into test_plan_report_resource - - - id, - - - test_plan_report_id, - - - resource_id, - - - resource_type, - - - execute_result, - - - - - #{id,jdbcType=VARCHAR}, - - - #{testPlanReportId,jdbcType=VARCHAR}, - - - #{resourceId,jdbcType=VARCHAR}, - - - #{resourceType,jdbcType=VARCHAR}, - - - #{executeResult,jdbcType=VARCHAR}, - - - - - - update test_plan_report_resource - - - id = #{record.id,jdbcType=VARCHAR}, - - - test_plan_report_id = #{record.testPlanReportId,jdbcType=VARCHAR}, - - - resource_id = #{record.resourceId,jdbcType=VARCHAR}, - - - resource_type = #{record.resourceType,jdbcType=VARCHAR}, - - - execute_result = #{record.executeResult,jdbcType=VARCHAR}, - - - - - - - - update test_plan_report_resource - set id = #{record.id,jdbcType=VARCHAR}, - test_plan_report_id = #{record.testPlanReportId,jdbcType=VARCHAR}, - resource_id = #{record.resourceId,jdbcType=VARCHAR}, - resource_type = #{record.resourceType,jdbcType=VARCHAR}, - execute_result = #{record.executeResult,jdbcType=VARCHAR} - - - - - - update test_plan_report_resource - - - test_plan_report_id = #{testPlanReportId,jdbcType=VARCHAR}, - - - resource_id = #{resourceId,jdbcType=VARCHAR}, - - - resource_type = #{resourceType,jdbcType=VARCHAR}, - - - execute_result = #{executeResult,jdbcType=VARCHAR}, - - - where id = #{id,jdbcType=VARCHAR} - - - update test_plan_report_resource - set test_plan_report_id = #{testPlanReportId,jdbcType=VARCHAR}, - resource_id = #{resourceId,jdbcType=VARCHAR}, - resource_type = #{resourceType,jdbcType=VARCHAR}, - execute_result = #{executeResult,jdbcType=VARCHAR} - where id = #{id,jdbcType=VARCHAR} - - \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionExecResultMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionExecResultMapper.java index 099da06667..38f4841e8b 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionExecResultMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionExecResultMapper.java @@ -22,4 +22,6 @@ public interface ExtApiDefinitionExecResultMapper { List findFaliureCaseInfoByProjectIDAndExecuteTimeAndLimitNumber(@Param("projectId") String projectId, @Param("startTimestamp") long startTimestamp); String selectExecResult(String resourceId); + + ApiDefinitionExecResult selectPlanApiMaxResultByTestIdAndType(String resourceId, String type); } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionExecResultMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionExecResultMapper.xml index f9dee7538c..99ee9a98bd 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionExecResultMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionExecResultMapper.xml @@ -86,4 +86,10 @@ + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.xml index a5a41e4aea..8b6bd29ed2 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.xml @@ -131,6 +131,15 @@ + + and api_definition.id + + in (SELECT reference_id FROM api_scenario_reference_id WHERE reference_id is not null ) + + + not in (SELECT reference_id FROM api_scenario_reference_id WHERE reference_id is not null ) + + and api_definition.user_id @@ -212,7 +221,7 @@ - SELECT id,share_type,share_api_id FROM api_document_share - - share_type = #{shareType} AND share_api_id = #{shareApiId} - - - \ No newline at end of file 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 e5cccdadd7..87ffee4d73 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 @@ -68,4 +68,8 @@ public interface ExtApiScenarioMapper { List selectByNoReferenceId(); void checkOriginalStatusByIds(@Param("ids")List ids); + + List selectIdsByExecuteTimeIsNull(); + + Long countExecuteTimesByProjectID(String projectId); } 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 0e0e17e414..1192cfed60 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 @@ -442,6 +442,12 @@ WHERE id = #{0} + + + + + diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportDetailMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportDetailMapper.java new file mode 100644 index 0000000000..658ca11c31 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportDetailMapper.java @@ -0,0 +1,10 @@ +package io.metersphere.base.mapper.ext; + +import io.metersphere.base.domain.ApiScenarioReportDetail; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface ExtApiScenarioReportDetailMapper { + List selectByIds(@Param("ids") String ids, @Param("oderId") String oderId); +} diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportDetailMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportDetailMapper.xml new file mode 100644 index 0000000000..acf334b037 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportDetailMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportMapper.java index 4c74a56db8..4a3cd2a159 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportMapper.java @@ -4,6 +4,7 @@ import io.metersphere.api.dto.QueryAPIReportRequest; import io.metersphere.api.dto.automation.APIScenarioReportResult; import io.metersphere.api.dto.datacount.ApiDataCountResult; import io.metersphere.base.domain.ApiScenarioReport; +import io.metersphere.dto.ApiReportCountDTO; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -26,4 +27,6 @@ public interface ExtApiScenarioReportMapper { ApiScenarioReport selectPreviousReportByScenarioId(@Param("scenarioId") String scenarioId, @Param("nowId") String nowId); List idList(@Param("request") QueryAPIReportRequest request); + + List countByApiScenarioId(); } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportMapper.xml index d88267ae86..ca1e3360dc 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReportMapper.xml @@ -99,7 +99,7 @@ + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestCaseMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestCaseMapper.java index 56d61773c4..23f3cd200f 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestCaseMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestCaseMapper.java @@ -43,7 +43,6 @@ public interface ExtApiTestCaseMapper { int deleteToGc(ApiTestCaseRequest request); int reduction(@Param("ids") List ids); - void checkOriginalStatusByIds(@Param("ids") List ids); List getCannotReductionApiCaseList(@Param("ids") List ids); diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestCaseMapper.xml index 73f3bc48d4..8ae5581585 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestCaseMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestCaseMapper.xml @@ -187,7 +187,15 @@ - + + and t1.id + + in (SELECT reference_id FROM api_scenario_reference_id WHERE reference_id is not null ) + + + not in (SELECT reference_id FROM api_scenario_reference_id WHERE reference_id is not null ) + + and t2.status @@ -239,9 +247,10 @@ t1.delete_time, deleteUser.name AS deleteUser,CONCAT(FORMAT(SUM(IF (t2.`status`='success',1,0))/COUNT(t2.id)*100,2),'%') passRate from api_test_case t1 - LEFT JOIN api_definition_exec_result t2 ON t1.last_result_id = t2.id + LEFT JOIN api_definition_exec_result t2 ON t1.id = t2.resource_id LEFT JOIN user deleteUser ON t1.delete_user_id = deleteUser.id - inner join api_definition a on t1.api_definition_id = a.id + LEFT JOIN api_definition a on t1.api_definition_id = a.id + WHERE 1=1 and a.protocol = #{request.protocol} @@ -523,6 +532,32 @@ AND t1.api_definition_id = #{request.apiDefinitionId} + + + + + + and t1.priority in + + #{value} + + + + and t1.status in + + #{value} + + + + + + and (t1.status is null or t1.status != 'Trash') + + + + + and (t1.status is null or t1.status != 'Trash') + and a.module_id in @@ -565,13 +600,4 @@ #{v} - - update api_test_case - set - original_status = 'Underway' - where (original_status IS NULL OR original_status = 'Trash') AND id in - - #{v} - - diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtGroupMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtGroupMapper.xml index c7c392e111..691b11fdaf 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtGroupMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtGroupMapper.xml @@ -5,39 +5,43 @@ - select issues.id, issues.num, ifnull(issues.title, '') as title, issues.project_id, issues.create_time, issues.update_time, ifnull(issues.description, '') as description, issues.status, issues.platform, issues.custom_fields, issues.reporter, issues.creator,issues.resource_id,issues.platform_status, @@ -42,6 +42,9 @@ from issues where project_id = #{projectId} and platform != 'Local'; + @@ -57,6 +60,10 @@ and issues.project_id = #{request.projectId} + + and issues.resource_id = #{request.resourceId} + + and test_case_issues.test_case_id = #{request.testCaseId} diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtMockExpectConfigMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtMockExpectConfigMapper.java new file mode 100644 index 0000000000..18d2a08f40 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtMockExpectConfigMapper.java @@ -0,0 +1,10 @@ +package io.metersphere.base.mapper.ext; + +import io.metersphere.base.domain.MockExpectConfigWithBLOBs; + +import java.util.List; + +public interface ExtMockExpectConfigMapper { + + List selectByProjectIdAndStatusIsOpen(String projectId); +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtMockExpectConfigMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtMockExpectConfigMapper.xml new file mode 100644 index 0000000000..84cfc506f4 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtMockExpectConfigMapper.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtNotificationMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtNotificationMapper.java new file mode 100644 index 0000000000..0148d6b153 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtNotificationMapper.java @@ -0,0 +1,21 @@ +package io.metersphere.base.mapper.ext; + + +import io.metersphere.base.domain.Notification; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface ExtNotificationMapper { + + Notification getNotification(@Param("id") Integer id, @Param("receiver") String receiver); + + List listNotification(@Param("notification") Notification notification); + + List listReadNotification(@Param("search") String search, @Param("receiver") String receiver); + + List listUnreadNotification(@Param("search") String search, @Param("receiver") String receiver); + + int countNotification(@Param("notification") Notification notification); + +} diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtNotificationMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtNotificationMapper.xml new file mode 100644 index 0000000000..c2b0952ac5 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtNotificationMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtOrganizationMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtOrganizationMapper.java index 51499bdaa8..4c55663b8d 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtOrganizationMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtOrganizationMapper.java @@ -1,6 +1,5 @@ package io.metersphere.base.mapper.ext; -import io.metersphere.base.domain.Organization; import io.metersphere.dto.OrganizationMemberDTO; import org.apache.ibatis.annotations.Param; @@ -11,4 +10,6 @@ public interface ExtOrganizationMapper { int checkSourceRole(@Param("sourceId") String sourceId,@Param("userId") String userId,@Param("groupId") String groupId); List findIdAndNameByOrganizationId(@Param("organizationId")String organizationID); + + void setDefaultMessageTask(@Param("orgId") String orgId); } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtOrganizationMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtOrganizationMapper.xml index 5be69a8c78..c200d34461 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtOrganizationMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtOrganizationMapper.xml @@ -1,22 +1,134 @@ - + + + INSERT INTO message_task (id, type, event, user_id, task_type, webhook, identification, is_set, organization_id, + test_id, create_time, template) + VALUES (UUID(), 'IN_SITE', 'DELETE', 'CREATOR', 'PERFORMANCE_TEST_TASK', '', + 'ce692111-166b-491a-ae69-f047c31de971', 0, + #{orgId}, NULL, 1629686472659, NULL), + (UUID(), 'IN_SITE', 'COMPLETE', 'CREATOR', 'REVIEW_TASK', + '', + '72836b2d-4c2f-4185-95aa-1894c6f0d1c3', 0, #{orgId}, NULL, 1629697096803, + NULL), + (UUID(), 'IN_SITE', 'CLOSE_SCHEDULE', 'CREATOR', 'TRACK_HOME_TASK', '', + 'ceb0aeb5-f194-4183-a995-3607a769c61d', + 0, #{orgId}, NULL, 1629705930753, NULL), + (UUID(), 'IN_SITE', 'DELETE', 'CREATOR', 'API_AUTOMATION_TASK', '', + 'e2865464-0da3-42bc-a041-7d21bd70d339', 0, + #{orgId}, NULL, 1629446356866, NULL), + (UUID(), 'IN_SITE', 'UPDATE', 'FOLLOW_PEOPLE', 'PERFORMANCE_TEST_TASK', '', + '79d7dcdc-68a2-47a2-9ef5-21fdf9bde65c', 0, #{orgId}, NULL, 1629446379928, + NULL), + (UUID(), 'IN_SITE', 'CLOSE_SCHEDULE', 'CREATOR', 'API_HOME_TASK', '', + 'dbe5dfcd-927f-4065-93cf-22f33d9570ac', 0, + #{orgId}, NULL, 1629446330438, NULL), + (UUID(), 'IN_SITE', 'UPDATE', 'FOLLOW_PEOPLE', 'TRACK_TEST_CASE_TASK', '', + '3a632784-c73b-4f5f-824c-bdf4fccf6f4d', 0, #{orgId}, NULL, 1629705939795, + NULL), + (UUID(), 'IN_SITE', 'CASE_UPDATE', 'FOLLOW_PEOPLE', 'API_DEFINITION_TASK', '', + 'a6a3979a-bd80-414c-a253-06f0364c434f', 0, #{orgId}, NULL, 1629446346104, + NULL), + (UUID(), 'IN_SITE', 'UPDATE', 'FOLLOW_PEOPLE', 'API_AUTOMATION_TASK', '', + '019de091-1a19-4b30-bd5e-23b83bc820fb', + 0, #{orgId}, NULL, 1629618010742, NULL), + (UUID(), 'IN_SITE', 'CASE_UPDATE', 'CREATOR', 'API_DEFINITION_TASK', '', + 'a6a3979a-bd80-414c-a253-06f0364c434f', + 0, #{orgId}, NULL, 1629446346104, NULL), + (UUID(), 'IN_SITE', 'DELETE', 'CREATOR', 'DEFECT_TASK', '', '66568b56-4f9e-4bf6-8621-7402403368b9', 0, + #{orgId}, NULL, 1629446306675, NULL), + (UUID(), 'IN_SITE', 'DELETE', 'FOLLOW_PEOPLE', 'PERFORMANCE_TEST_TASK', '', + 'ce692111-166b-491a-ae69-f047c31de971', 0, #{orgId}, NULL, 1629686472659, + NULL), + (UUID(), 'IN_SITE', 'UPDATE', 'CREATOR', 'DEFECT_TASK', '', '3a913f72-7cee-4e36-ae1d-0443c7cb5f97', 0, + #{orgId}, NULL, 1629699608062, NULL), + (UUID(), 'IN_SITE', 'UPDATE', 'FOLLOW_PEOPLE', 'API_DEFINITION_TASK', '', + '7ca324cd-7113-412b-8714-5cbe1bffa535', + 0, #{orgId}, NULL, 1629706088088, NULL), + (UUID(), 'IN_SITE', 'CASE_DELETE', 'CREATOR', 'API_DEFINITION_TASK', '', + 'aeb9d21a-855c-44d3-a715-dfb1bba8ad6c', + 0, #{orgId}, NULL, 1629446334332, NULL), + (UUID(), 'IN_SITE', 'DELETE', 'CREATOR', 'API_REPORT_TASK', '', '4d3309f3-7ab2-492e-b9c9-1127c3e005d1', + 0, + #{orgId}, NULL, 1629446364391, NULL), + (UUID(), 'IN_SITE', 'COMMENT', 'CREATOR', 'TRACK_TEST_CASE_TASK', '', + '2e8db54f-2d39-42a6-9832-43bb3384e7d5', 0, + #{orgId}, NULL, 1629446247833, NULL), + (UUID(), 'IN_SITE', 'DELETE', 'CREATOR', 'API_DEFINITION_TASK', '', + '90f2be5d-0a71-44f0-a750-f16bf39d690b', 0, + #{orgId}, NULL, 1629446338557, NULL), + (UUID(), 'IN_SITE', 'DELETE', 'CREATOR', 'PERFORMANCE_REPORT_TASK', '', + '4c1bfa4a-b02b-4e8e-bc09-b13613723a11', + 0, #{orgId}, NULL, 1629446384995, NULL), + (UUID(), 'IN_SITE', 'UPDATE', 'CREATOR', 'API_AUTOMATION_TASK', '', + '019de091-1a19-4b30-bd5e-23b83bc820fb', 0, + #{orgId}, NULL, 1629618010742, NULL), + (UUID(), 'IN_SITE', 'COMPLETE', 'CREATOR', 'TEST_PLAN_TASK', '', '86b42beb-a86f-4ff3-a73c-d25112c2f104', + 0, + #{orgId}, NULL, 1629446286106, NULL), + (UUID(), 'IN_SITE', 'UPDATE', 'CREATOR', 'PERFORMANCE_TEST_TASK', '', + '79d7dcdc-68a2-47a2-9ef5-21fdf9bde65c', 0, + #{orgId}, NULL, 1629446379928, NULL), + (UUID(), 'IN_SITE', 'UPDATE', 'CREATOR', 'TRACK_TEST_CASE_TASK', '', + '3a632784-c73b-4f5f-824c-bdf4fccf6f4d', 0, + #{orgId}, NULL, 1629705939795, NULL), + (UUID(), 'IN_SITE', 'UPDATE', 'CREATOR', 'API_DEFINITION_TASK', '', + '7ca324cd-7113-412b-8714-5cbe1bffa535', 0, + #{orgId}, NULL, 1629706088088, NULL), + (UUID(), 'IN_SITE', 'DELETE', 'CREATOR', 'TEST_PLAN_TASK', '', '04ea4fbd-a392-4f80-a61c-51d31a302cac', 0, + #{orgId}, NULL, 1629446289522, NULL), + (UUID(), 'IN_SITE', 'UPDATE', 'CREATOR', 'REVIEW_TASK', '', 'db515209-f864-46d3-a2e5-63db6d1339c3', 0, + #{orgId}, NULL, 1629446276516, NULL), + (UUID(), 'IN_SITE', 'DELETE', 'CREATOR', 'TRACK_REPORT_TASK', '', 'ea2fee85-8a44-413a-a128-16bfa01ada0d', + 0, + #{orgId}, NULL, 1629283758941, NULL), + (UUID(), 'IN_SITE', 'DELETE', 'CREATOR', 'REVIEW_TASK', '', 'f9b1f60b-6dee-48af-8217-0428b27dcbab', 0, + #{orgId}, NULL, 1629446272477, NULL), + (UUID(), 'IN_SITE', 'DELETE', 'CREATOR', 'TRACK_TEST_CASE_TASK', '', + '7c26254e-85e9-4269-be13-a2ffcfe0b9f5', 0, + #{orgId}, NULL, 1629446251939, NULL), + (UUID(), 'IN_SITE', 'DELETE', 'FOLLOW_PEOPLE', 'TRACK_TEST_CASE_TASK', '', + '7c26254e-85e9-4269-be13-a2ffcfe0b9f5', 0, #{orgId}, NULL, 1629446251939, + NULL), + (UUID(), 'IN_SITE', 'EXECUTE_SUCCESSFUL', 'CREATOR', 'API_DEFINITION_TASK', '', + '7efddbdb-2b6c-4425-96a4-0bc2aa9e2cd2', 0, #{orgId}, NULL, 1629775183917, + NULL), + (UUID(), 'IN_SITE', 'EXECUTE_FAILED', 'CREATOR', 'API_DEFINITION_TASK', '', + 'e508035c-1318-40ea-9457-0bbe9865f4ce', 0, #{orgId}, NULL, 1629775194857, + NULL), + (UUID(), 'IN_SITE', 'EXECUTE_COMPLETED', 'CREATOR', 'PERFORMANCE_TEST_TASK', '', + 'e3db90c6-fb49-4e89-bc25-1d14b5ce94d0', 0, #{orgId}, NULL, 1629790602744, + NULL), + (UUID(), 'IN_SITE', 'EXECUTE_FAILED', 'CREATOR', 'API_AUTOMATION_TASK', '', + 'c25930e8-b617-45f7-af5e-cc94adc14192', 0, #{orgId}, NULL, 1629780485724, + NULL), + (UUID(), 'IN_SITE', 'EXECUTE_SUCCESSFUL', 'CREATOR', 'API_AUTOMATION_TASK', '', + '9f91e5e5-1744-4160-bfc6-3851bfd59e05', 0, #{orgId}, NULL, 1629780475764, + NULL), + (UUID(), 'IN_SITE', 'UPDATE', 'PROCESSOR', 'DEFECT_TASK', '', + '6cad944e-db8d-4786-9ef3-7d6370940325', 0, #{orgId}, NULL, 1629791388405, + NULL), + (UUID(), 'IN_SITE', 'CREATE', 'PROCESSOR', 'DEFECT_TASK', '', + '4a890e41-e755-44fc-b734-d6a0ca25a65c', 0, #{orgId}, NULL, 1629790487682, + NULL) + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtProjectMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtProjectMapper.java index f9e27a3ca7..edcd176623 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtProjectMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtProjectMapper.java @@ -1,10 +1,14 @@ package io.metersphere.base.mapper.ext; +import io.metersphere.base.domain.Organization; +import io.metersphere.base.domain.Project; import io.metersphere.controller.request.ProjectRequest; import io.metersphere.dto.ProjectDTO; +import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Map; public interface ExtProjectMapper { @@ -21,4 +25,11 @@ public interface ExtProjectMapper { List getProjectIds(); String getMaxSystemId(); + + @MapKey("id") + Map queryNameByIds(@Param("ids") List ids); + + Organization getOrganizationByProjectId(@Param("projectId")String projectId); + + List selectTcpPorts(); } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtProjectMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtProjectMapper.xml index 1b3d800b20..3f210a4c5c 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtProjectMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtProjectMapper.xml @@ -34,7 +34,7 @@ SELECT max(system_id) FROM project - + update project @@ -143,4 +151,18 @@ where organization_id = #{orgId})) as a) + + + + diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtShareInfoMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtShareInfoMapper.java new file mode 100644 index 0000000000..5aab677fa5 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtShareInfoMapper.java @@ -0,0 +1,13 @@ +package io.metersphere.base.mapper.ext; + +import io.metersphere.api.dto.share.ApiDocumentInfoDTO; +import io.metersphere.api.dto.share.ApiDocumentRequest; +import io.metersphere.base.domain.ShareInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface ExtShareInfoMapper { + List findApiDocumentSimpleInfoByRequest(@Param("request") ApiDocumentRequest request); + List selectByShareTypeAndShareApiIdWithBLOBs(@Param("shareType") String shareType, @Param("customData") String customData); +} diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDocumentMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtShareInfoMapper.xml similarity index 77% rename from backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDocumentMapper.xml rename to backend/src/main/java/io/metersphere/base/mapper/ext/ExtShareInfoMapper.xml index 83a6fcad64..c1f3a84fda 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDocumentMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtShareInfoMapper.xml @@ -1,7 +1,7 @@ - - SELECT api.id,api.name FROM api_definition api WHERE api.protocol = 'HTTP' AND api.status = 'Trash' @@ -40,4 +40,16 @@ ORDER BY api.update_time DESC - \ No newline at end of file + + + + + diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTaskMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTaskMapper.java index 5c63aef5a4..1a6efe9cf0 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTaskMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTaskMapper.java @@ -17,4 +17,7 @@ public interface ExtTaskMapper { List getCases(@Param("id") String id); List getScenario(@Param("id") String id); + + int checkActuator (@Param("actuator") String actuator); + } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTaskMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTaskMapper.xml index 5da71e8ebc..00a3860739 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTaskMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTaskMapper.xml @@ -89,4 +89,25 @@ )tt ORDER BY tt.executionTime DESC; + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanApiCaseMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanApiCaseMapper.java index 5a61521b09..3beca8b7c0 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanApiCaseMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanApiCaseMapper.java @@ -1,11 +1,14 @@ package io.metersphere.base.mapper.ext; +import io.metersphere.api.dto.automation.TestPlanFailureApiDTO; import io.metersphere.api.dto.definition.ApiTestCaseRequest; import io.metersphere.api.dto.definition.TestPlanApiCaseDTO; import io.metersphere.base.domain.ApiTestCaseWithBLOBs; import io.metersphere.base.domain.TestPlanApiCase; +import io.metersphere.track.dto.PlanReportCaseDTO; import org.apache.ibatis.annotations.Param; +import java.util.Collection; import java.util.List; public interface ExtTestPlanApiCaseMapper { @@ -25,5 +28,13 @@ public interface ExtTestPlanApiCaseMapper { ApiTestCaseWithBLOBs getApiTestCaseById(String testPlanApiCaseId); + List selectLegalDataByTestPlanId(String planId); -} \ No newline at end of file + + List selectForPlanReport(String planId); + + List getFailureList(@Param("planId") String planId, @Param("status") String status); + + List getFailureListByIds(@Param("caseIdList") Collection caseIdList, @Param("planId") String planId, @Param("status") String status); +} + diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanApiCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanApiCaseMapper.xml index fa4ae9f0c4..429d773f17 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanApiCaseMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanApiCaseMapper.xml @@ -27,7 +27,7 @@ SELECT `status` FROM test_plan_api_case WHERE test_plan_id = #{0} + + + + diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanLoadCaseMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanLoadCaseMapper.java index 59dcf35122..dbcc25eb8e 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanLoadCaseMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanLoadCaseMapper.java @@ -1,9 +1,11 @@ package io.metersphere.base.mapper.ext; +import io.metersphere.track.dto.PlanReportCaseDTO; import io.metersphere.track.dto.TestPlanLoadCaseDTO; import io.metersphere.track.request.testplan.LoadCaseRequest; import org.apache.ibatis.annotations.Param; +import java.util.Collection; import java.util.List; public interface ExtTestPlanLoadCaseMapper { @@ -20,4 +22,9 @@ public interface ExtTestPlanLoadCaseMapper { List getStatusByTestPlanId(@Param("planId") String planId); List selectTestPlanLoadCaseId(@Param("request") LoadCaseRequest request); + + List selectForPlanReport(String planId); + + List getCases(@Param("planId") String planId, @Param("status") String status); + List getCasesByIds(@Param("ids") Collection ids, @Param("planId") String planId, @Param("status") String status); } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanLoadCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanLoadCaseMapper.xml index 6bcf502834..ac71f6c3c8 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanLoadCaseMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanLoadCaseMapper.xml @@ -175,4 +175,33 @@ + + + + + diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportMapper.java index 4ce6c330b5..4ee4fb721f 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportMapper.java @@ -12,5 +12,5 @@ import java.util.List; * @Description */ public interface ExtTestPlanReportMapper { - public List list(@Param("request")QueryTestPlanReportRequest request); + List list(@Param("request")QueryTestPlanReportRequest request); } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportMapper.xml index c1676447e5..9485d68ae8 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportMapper.xml @@ -5,7 +5,7 @@ - \ No newline at end of file + diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportResourceMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportResourceMapper.java deleted file mode 100644 index b72dc34ba9..0000000000 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportResourceMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.metersphere.base.mapper.ext; - -import io.metersphere.base.domain.TestPlanReportResource; - -import java.util.List; - -public interface ExtTestPlanReportResourceMapper { - List selectResourceIdAndResourceTypeAndExecuteResultByTestPlanReportId(String testPlanReportId); -} diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportResourceMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportResourceMapper.xml deleted file mode 100644 index cdc8861079..0000000000 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanReportResourceMapper.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.java index 0590a2026a..9b5c973742 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.java @@ -1,10 +1,13 @@ package io.metersphere.base.mapper.ext; import io.metersphere.api.dto.automation.ApiScenarioDTO; +import io.metersphere.api.dto.automation.TestPlanFailureScenarioDTO; import io.metersphere.api.dto.automation.TestPlanScenarioRequest; import io.metersphere.base.domain.TestPlanApiScenario; +import io.metersphere.track.dto.PlanReportCaseDTO; import org.apache.ibatis.annotations.Param; +import java.util.Collection; import java.util.List; public interface ExtTestPlanScenarioCaseMapper { @@ -23,4 +26,12 @@ public interface ExtTestPlanScenarioCaseMapper { List selectByIds(@Param("ids")String ids ,@Param("oderId")String oderId ); List selectLegalDataByTestPlanId(String planId); -} \ No newline at end of file + + List selectForPlanReport(String planId); + + List getFailureList(@Param("planId") String planId, @Param("status") String status); + + List getFailureListByIds(@Param("ids") Collection ids, @Param("planId") String planId, @Param("status") String status); + + List getUnderwaySteps(@Param("ids") List underwayIds); +} diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.xml index a136bb5953..d8996827d0 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanScenarioCaseMapper.xml @@ -18,7 +18,7 @@ @@ -195,5 +195,56 @@ where t.test_plan_id = #{planId} + + + + + + diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanTestCaseMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanTestCaseMapper.java index 75e826ec33..2769ec88d1 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanTestCaseMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanTestCaseMapper.java @@ -1,6 +1,7 @@ package io.metersphere.base.mapper.ext; import io.metersphere.controller.request.BaseQueryRequest; +import io.metersphere.track.dto.PlanReportCaseDTO; import io.metersphere.track.dto.TestCaseReportStatusResultDTO; import io.metersphere.track.dto.TestCaseTestDTO; import io.metersphere.track.dto.TestPlanCaseDTO; @@ -57,4 +58,8 @@ public interface ExtTestPlanTestCaseMapper { List selectIdsByQuery(@Param("request") BaseQueryRequest query); void update(@Param("count") int count, @Param("id") String id, @Param("caseId") String caseId, @Param("issues") String issues); + + List selectForPlanReport(String planId); + + List getCases(@Param("planId") String planId, @Param("status") String status); } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanTestCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanTestCaseMapper.xml index 1d0bafcc08..2459cfc972 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanTestCaseMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanTestCaseMapper.xml @@ -463,6 +463,22 @@ + + update test_plan_test_case diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtUserMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtUserMapper.xml index 11df7fcd91..f509e4861d 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtUserMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtUserMapper.xml @@ -57,7 +57,7 @@