From 13ff8addf2b7bf3e3d0e0b5ba11bb4c999c102a5 Mon Sep 17 00:00:00 2001 From: WangXu10 Date: Tue, 11 Jun 2024 19:39:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=B5=8B=E8=AF=95=E8=AE=A1=E5=88=92):=20?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E5=85=B3=E8=81=94=E6=8E=A5=E5=8F=A3&?= =?UTF-8?q?=E9=83=A8=E5=88=86=E9=97=AE=E9=A2=98=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/mapper/ExtApiTestCaseMapper.xml | 6 --- .../controller/TestPlanApiCaseController.java | 4 ++ .../TestPlanApiScenarioController.java | 29 ++++++++---- .../response/TestPlanApiCasePageResponse.java | 3 ++ .../plan/mapper/ExtTestPlanApiCaseMapper.xml | 7 +-- .../mapper/ExtTestPlanApiScenarioMapper.java | 3 ++ .../mapper/ExtTestPlanApiScenarioMapper.xml | 45 +++++++++++++++++++ .../plan/service/TestPlanApiCaseService.java | 7 ++- .../service/TestPlanApiScenarioService.java | 40 +++++++++++++++++ .../TestPlanApiScenarioControllerTests.java | 20 +++++++-- .../dml/init_test_plan_api_scenario.sql | 10 +++-- 11 files changed, 145 insertions(+), 29 deletions(-) diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/mapper/ExtApiTestCaseMapper.xml b/backend/services/api-test/src/main/java/io/metersphere/api/mapper/ExtApiTestCaseMapper.xml index 47ca19ab86..0c2a6e73bf 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/mapper/ExtApiTestCaseMapper.xml +++ b/backend/services/api-test/src/main/java/io/metersphere/api/mapper/ExtApiTestCaseMapper.xml @@ -514,12 +514,6 @@ #{value} - - and atc.case_status in - - #{value} - - and atc.last_report_status in diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/controller/TestPlanApiCaseController.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/controller/TestPlanApiCaseController.java index d0fb4339ad..67582f5c5a 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/controller/TestPlanApiCaseController.java +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/controller/TestPlanApiCaseController.java @@ -27,6 +27,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.validation.annotation.Validated; @@ -105,6 +106,9 @@ public class TestPlanApiCaseController { @RequiresPermissions(PermissionConstants.TEST_PLAN_READ_ASSOCIATION) @CheckOwner(resourceId = "#request.getTestPlanId()", resourceType = "test_plan") public TestPlanAssociationResponse batchDisassociate(@Validated @RequestBody TestPlanApiCaseBatchRequest request) { + if (CollectionUtils.isEmpty(request.getProtocols())) { + return new TestPlanAssociationResponse(); + } TestPlanAssociationResponse response = testPlanApiCaseService.disassociate(request, new LogInsertModule(SessionUtils.getUserId(), "/test-plan/api/case/batch/disassociate", HttpMethodConstants.POST.name())); testPlanService.refreshTestPlanStatus(request.getTestPlanId()); return response; diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/controller/TestPlanApiScenarioController.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/controller/TestPlanApiScenarioController.java index 62a28ca1bd..94fcc571dd 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/controller/TestPlanApiScenarioController.java +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/controller/TestPlanApiScenarioController.java @@ -2,18 +2,16 @@ package io.metersphere.plan.controller; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; -import io.metersphere.plan.dto.request.TestPlanApiCaseTreeRequest; -import io.metersphere.plan.dto.request.TestPlanApiScenarioModuleRequest; -import io.metersphere.plan.dto.request.TestPlanApiScenarioRequest; -import io.metersphere.plan.dto.request.TestPlanApiScenarioTreeRequest; +import io.metersphere.plan.dto.request.*; import io.metersphere.plan.dto.response.TestPlanApiScenarioPageResponse; -import io.metersphere.plan.dto.request.TestPlanApiCaseBatchRunRequest; -import io.metersphere.plan.dto.request.TestPlanApiScenarioBatchRunRequest; -import io.metersphere.plan.service.TestPlanApiCaseBatchRunService; +import io.metersphere.plan.dto.response.TestPlanAssociationResponse; import io.metersphere.plan.service.TestPlanApiScenarioBatchRunService; import io.metersphere.plan.service.TestPlanApiScenarioService; +import io.metersphere.plan.service.TestPlanService; +import io.metersphere.sdk.constants.HttpMethodConstants; import io.metersphere.sdk.constants.PermissionConstants; import io.metersphere.sdk.dto.api.task.TaskRequestDTO; +import io.metersphere.system.dto.LogInsertModule; import io.metersphere.system.dto.sdk.BaseTreeNode; import io.metersphere.system.security.CheckOwner; import io.metersphere.system.utils.PageUtils; @@ -39,6 +37,8 @@ public class TestPlanApiScenarioController { private TestPlanApiScenarioService testPlanApiScenarioService; @Resource private TestPlanApiScenarioBatchRunService testPlanApiScenarioBatchRunService; + @Resource + private TestPlanService testPlanService; @PostMapping("/page") @Operation(summary = "测试计划-已关联场景用例列表分页查询") @@ -59,7 +59,7 @@ public class TestPlanApiScenarioController { } @PostMapping("/tree") - @Operation(summary = "测试计划-已关联接口用例列表模块树") + @Operation(summary = "测试计划-已关联场景用例列表模块树") @RequiresPermissions(PermissionConstants.TEST_PLAN_READ) @CheckOwner(resourceId = "#request.getTestPlanId()", resourceType = "test_plan") public List getTree(@Validated @RequestBody TestPlanApiScenarioTreeRequest request) { @@ -81,4 +81,17 @@ public class TestPlanApiScenarioController { public void batchRun(@Validated @RequestBody TestPlanApiScenarioBatchRunRequest request) { testPlanApiScenarioBatchRunService.asyncBatchRun(request, SessionUtils.getUserId()); } + + @PostMapping("/disassociate") + @Operation(summary = "测试计划-计划详情-场景用例列表-取消关联用例") + @RequiresPermissions(PermissionConstants.TEST_PLAN_READ_ASSOCIATION) + @CheckOwner(resourceId = "#request.getTestPlanId()", resourceType = "test_plan") + public TestPlanAssociationResponse disassociate(@Validated @RequestBody TestPlanDisassociationRequest request) { + BasePlanCaseBatchRequest batchRequest = new BasePlanCaseBatchRequest(); + batchRequest.setTestPlanId(request.getTestPlanId()); + batchRequest.setSelectIds(List.of(request.getId())); + TestPlanAssociationResponse response = testPlanApiScenarioService.disassociate(batchRequest, new LogInsertModule(SessionUtils.getUserId(), "/test-plan/api/scenario/disassociate", HttpMethodConstants.POST.name())); + testPlanService.refreshTestPlanStatus(request.getTestPlanId()); + return response; + } } diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/response/TestPlanApiCasePageResponse.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/response/TestPlanApiCasePageResponse.java index ab0710a41f..cf33d64564 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/response/TestPlanApiCasePageResponse.java +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/response/TestPlanApiCasePageResponse.java @@ -68,4 +68,7 @@ public class TestPlanApiCasePageResponse implements Serializable { @Schema(description = "报告id") private String lastExecReportId; + + @Schema(description = "状态") + private String status; } diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanApiCaseMapper.xml b/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanApiCaseMapper.xml index 0f784ee459..bec3633dc4 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanApiCaseMapper.xml +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanApiCaseMapper.xml @@ -419,7 +419,8 @@ t.last_exec_result, t.execute_user, t.last_exec_time, - t.last_exec_report_id + t.last_exec_report_id, + atc.status FROM api_test_case atc INNER JOIN api_definition a ON atc.api_definition_id = a.id @@ -489,8 +490,8 @@ #{value} - - and atc.case_status in + + and t.last_exec_result in #{value} diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanApiScenarioMapper.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanApiScenarioMapper.java index 8bf175b37a..a50602b32a 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanApiScenarioMapper.java +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanApiScenarioMapper.java @@ -6,6 +6,7 @@ import io.metersphere.plan.domain.TestPlanApiScenario; import io.metersphere.plan.dto.ApiScenarioModuleDTO; import io.metersphere.plan.dto.ResourceSelectParam; import io.metersphere.plan.dto.TestPlanCaseRunResultCount; +import io.metersphere.plan.dto.request.BasePlanCaseBatchRequest; import io.metersphere.plan.dto.request.TestPlanApiScenarioModuleRequest; import io.metersphere.plan.dto.request.TestPlanApiScenarioRequest; import io.metersphere.plan.dto.response.TestPlanApiScenarioPageResponse; @@ -57,4 +58,6 @@ public interface ExtTestPlanApiScenarioMapper { List getPlanApiScenarioByIds(@Param("planIds") List planIds); List getScenarioExecuteInfoByIds(@Param("ids") List ids); + + List getIds(@Param("request") BasePlanCaseBatchRequest request, @Param("deleted") boolean deleted); } diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanApiScenarioMapper.xml b/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanApiScenarioMapper.xml index 7503055d69..cda214e8f9 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanApiScenarioMapper.xml +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanApiScenarioMapper.xml @@ -395,4 +395,49 @@ #{id} + + + + + + + and ( + api_scenario.num like concat('%', #{request.condition.keyword},'%') + or api_scenario.name like concat('%', #{request.condition.keyword},'%') + or api_scenario.tags like concat('%', #{request.condition.keyword},'%') + ) + + + and api_scenario.id = #{request.scenarioId} + + + and api_scenario.module_id in + + #{nodeId} + + + + and t.test_plan_collection_id = #{request.collectionId} + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanApiCaseService.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanApiCaseService.java index 662b6d2b84..f0174a8e39 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanApiCaseService.java +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanApiCaseService.java @@ -233,6 +233,7 @@ public class TestPlanApiCaseService extends TestPlanResourceService implements G apiCaseList.forEach(item -> { item.setProjectName(projectMap.get(item.getProjectId())); item.setCreateUserName(userMap.get(item.getCreateUser())); + item.setExecuteUserName(userMap.get(item.getExecuteUser())); TestPlanCollectionEnvDTO collectEnv = secondEnvMap.get(item.getTestPlanCollectionId()); if (StringUtils.equalsIgnoreCase(collectEnv.getEnvironmentId(), ModuleConstants.ROOT_NODE_PARENT_ID)) { //计划集 == 默认环境 处理默认环境 @@ -434,9 +435,6 @@ public class TestPlanApiCaseService extends TestPlanResourceService implements G * @return */ public TestPlanAssociationResponse disassociate(TestPlanApiCaseBatchRequest request, LogInsertModule logInsertModule) { - if (CollectionUtils.isEmpty(request.getProtocols())) { - return new TestPlanAssociationResponse(); - } List selectIds = doSelectIds(request); return super.disassociate( TestPlanResourceConstants.RESOURCE_API_CASE, @@ -509,8 +507,9 @@ public class TestPlanApiCaseService extends TestPlanResourceService implements G private void handleApiData(List apiCaseList, String userId, List testPlanApiCaseList, String planId) { if (CollectionUtils.isNotEmpty(apiCaseList)) { List ids = apiCaseList.stream().flatMap(item -> item.getIds().stream()).toList(); + //todo 优化,重复关联问题? ApiTestCaseExample example = new ApiTestCaseExample(); - example.createCriteria().andApiDefinitionIdIn(ids); + example.createCriteria().andApiDefinitionIdIn(ids).andDeletedEqualTo(false); List apiTestCaseList = apiTestCaseMapper.selectByExample(example); apiCaseList.forEach(apiCase -> { List apiCaseIds = apiCase.getIds(); diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanApiScenarioService.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanApiScenarioService.java index af90b71613..e2646e1d20 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanApiScenarioService.java +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanApiScenarioService.java @@ -17,6 +17,7 @@ import io.metersphere.plan.domain.*; import io.metersphere.plan.dto.*; import io.metersphere.plan.dto.request.*; import io.metersphere.plan.dto.response.TestPlanApiScenarioPageResponse; +import io.metersphere.plan.dto.response.TestPlanAssociationResponse; import io.metersphere.plan.dto.response.TestPlanOperationResponse; import io.metersphere.plan.mapper.*; import io.metersphere.project.domain.Project; @@ -47,6 +48,7 @@ import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; import java.util.ArrayList; import java.util.HashMap; @@ -295,6 +297,7 @@ public class TestPlanApiScenarioService extends TestPlanResourceService implemen apiScenarioList.forEach(item -> { item.setProjectName(projectMap.get(item.getProjectId())); item.setCreateUserName(userMap.get(item.getCreateUser())); + item.setExecuteUserName(userMap.get(item.getExecuteUser())); TestPlanCollectionEnvDTO collectEnv = secondEnvMap.get(item.getTestPlanCollectionId()); if (StringUtils.equalsIgnoreCase(collectEnv.getEnvironmentId(), ModuleConstants.ROOT_NODE_PARENT_ID)) { //计划集 == 默认环境 处理默认环境 @@ -479,4 +482,41 @@ public class TestPlanApiScenarioService extends TestPlanResourceService implemen }); return returnList; } + + + /** + * 取消关联 + * + * @param request + * @param logInsertModule + * @return + */ + public TestPlanAssociationResponse disassociate(BasePlanCaseBatchRequest request, LogInsertModule logInsertModule) { + List selectIds = doSelectIds(request); + return super.disassociate( + TestPlanResourceConstants.RESOURCE_API_SCENARIO, + request, + logInsertModule, + selectIds, + this::deleteTestPlanResource); + } + + + public void deleteTestPlanResource(@Validated TestPlanResourceAssociationParam associationParam) { + TestPlanApiScenarioExample testPlanApiScenarioExample = new TestPlanApiScenarioExample(); + testPlanApiScenarioExample.createCriteria().andIdIn(associationParam.getResourceIdList()); + testPlanApiScenarioMapper.deleteByExample(testPlanApiScenarioExample); + } + + public List doSelectIds(BasePlanCaseBatchRequest request) { + if (request.isSelectAll()) { + List ids = extTestPlanApiScenarioMapper.getIds(request, false); + if (CollectionUtils.isNotEmpty(request.getExcludeIds())) { + ids.removeAll(request.getExcludeIds()); + } + return ids; + } else { + return request.getSelectIds(); + } + } } diff --git a/backend/services/test-plan/src/test/java/io/metersphere/plan/controller/TestPlanApiScenarioControllerTests.java b/backend/services/test-plan/src/test/java/io/metersphere/plan/controller/TestPlanApiScenarioControllerTests.java index 75d41b369f..982a8dc7aa 100644 --- a/backend/services/test-plan/src/test/java/io/metersphere/plan/controller/TestPlanApiScenarioControllerTests.java +++ b/backend/services/test-plan/src/test/java/io/metersphere/plan/controller/TestPlanApiScenarioControllerTests.java @@ -14,10 +14,7 @@ import io.metersphere.api.dto.scenario.*; import io.metersphere.api.service.scenario.ApiScenarioService; import io.metersphere.api.utils.ApiDataUtils; import io.metersphere.plan.domain.TestPlanApiScenario; -import io.metersphere.plan.dto.request.TestPlanApiScenarioBatchRunRequest; -import io.metersphere.plan.dto.request.TestPlanApiScenarioModuleRequest; -import io.metersphere.plan.dto.request.TestPlanApiScenarioRequest; -import io.metersphere.plan.dto.request.TestPlanApiScenarioTreeRequest; +import io.metersphere.plan.dto.request.*; import io.metersphere.plan.mapper.TestPlanApiScenarioMapper; import io.metersphere.plan.service.TestPlanApiScenarioService; import io.metersphere.project.api.assertion.MsResponseCodeAssertion; @@ -57,6 +54,7 @@ public class TestPlanApiScenarioControllerTests extends BaseTest { public static final String API_SCENARIO_TREE_COUNT = "module/count"; public static final String API_SCENARIO_TREE = "tree"; public static final String BATCH_RUN = "batch/run"; + public static final String API_SCENARIO_DISASSOCIATE = "disassociate"; @Resource private TestPlanApiScenarioService testPlanApiScenarioService; @@ -274,4 +272,18 @@ public class TestPlanApiScenarioControllerTests extends BaseTest { ResultHolder resultHolder1 = JSON.parseObject(returnData1, ResultHolder.class); Assertions.assertNotNull(resultHolder1); } + + @Test + @Order(6) + public void testApiScenarioDisassociate() throws Exception { + TestPlanDisassociationRequest request = new TestPlanDisassociationRequest(); + request.setTestPlanId("wxxx_plan_2"); + request.setId("wxxx_plan_scenario_3"); + + MvcResult mvcResult = this.requestPostWithOkAndReturn(API_SCENARIO_DISASSOCIATE, request); + String returnData = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8); + ResultHolder resultHolder = JSON.parseObject(returnData, ResultHolder.class); + Assertions.assertNotNull(resultHolder); + + } } diff --git a/backend/services/test-plan/src/test/resources/dml/init_test_plan_api_scenario.sql b/backend/services/test-plan/src/test/resources/dml/init_test_plan_api_scenario.sql index 6570bd7f16..3f28b7658c 100644 --- a/backend/services/test-plan/src/test/resources/dml/init_test_plan_api_scenario.sql +++ b/backend/services/test-plan/src/test/resources/dml/init_test_plan_api_scenario.sql @@ -1,7 +1,7 @@ INSERT INTO `test_plan`(`id`, `num`, `project_id`, `group_id`, `module_id`, `name`, `status`, `type`, `tags`, `create_time`, `create_user`, `update_time`, `update_user`, `planned_start_time`, `planned_end_time`, `actual_start_time`, `actual_end_time`, `description`) VALUES - ('wxxx_plan_1', 5000, 'wxx_1234', 'NONE', '1', 'qwe', 'PREPARED', 'TEST_PLAN', NULL, 1714980158000, 'WX', 1714980158000, 'WX', 1714980158000, 1714980158000, 1714980158000, 1714980158000, '11'), - ('wxxx_plan_2', 10000, 'wxx_1234', 'NONE', '1', 'eeew', 'PREPARED', 'TEST_PLAN', NULL, 1714980158000, 'WX', 1714980158000, 'WX', 1714980158000, 1714980158000, 1714980158000, 1714980158000, '11'); + ('wxxx_plan_1', 5000, 'wxx_project_1234', 'NONE', '1', 'qwe', 'PREPARED', 'TEST_PLAN', NULL, 1714980158000, 'WX', 1714980158000, 'WX', 1714980158000, 1714980158000, 1714980158000, 1714980158000, '11'), + ('wxxx_plan_2', 10000, 'wxx_project_1234', 'NONE', '1', 'eeew', 'PREPARED', 'TEST_PLAN', NULL, 1714980158000, 'WX', 1714980158000, 'WX', 1714980158000, 1714980158000, 1714980158000, 1714980158000, '11'); INSERT INTO `test_plan_config`(`test_plan_id`, `automatic_status_update`, `repeat_case`, `pass_threshold`, @@ -18,12 +18,14 @@ VALUES INSERT INTO `test_plan_api_scenario`(`id`, `test_plan_id`, `api_scenario_id`, `environment_id`, `execute_user`, `last_exec_result`, `last_exec_report_id`, `create_time`, `create_user`, `pos`, `test_plan_collection_id`, `grouped`, `last_exec_time`) VALUES ('wxxx_plan_scenario_1', 'wxxx_plan_1', 'wxxx_api_scenario_1', '1', 'admin', '', NULL, 1716370415311, 'admin', 64, 'wxxx_collection_2', b'0', 1716370415311), - ('wxxx_plan_scenario_2', 'wxxx_plan_1', 'wxxx_api_scenario_2', '123', 'admin', '', NULL, 1716370415311, 'admin', 64, 'wxxx_collection_3', b'0', 1716370415311); + ('wxxx_plan_scenario_2', 'wxxx_plan_1', 'wxxx_api_scenario_2', '123', 'admin', '', NULL, 1716370415311, 'admin', 64, 'wxxx_collection_3', b'0', 1716370415311), + ('wxxx_plan_scenario_3', 'wxxx_plan_2', 'wxxx_api_scenario_3', '1', 'admin', '', NULL, 1716370415311, 'admin', 64, 'wxxx_collection_2', b'0', 1716370415311); INSERT INTO `api_scenario`(`id`, `name`, `priority`, `status`, `step_total`, `request_pass_rate`, `last_report_status`, `last_report_id`, `num`, `deleted`, `pos`, `version_id`, `ref_id`, `latest`, `project_id`, `module_id`, `description`, `tags`, `grouped`, `environment_id`, `create_user`, `create_time`, `delete_time`, `delete_user`, `update_user`, `update_time`) VALUES ('wxxx_api_scenario_1', 'axx', 'P0', 'UNDERWAY', 3, '0.46', 'ERROR', '971160841641984', 100027, b'0', 5568, '718273150722066', '1023696881426432', b'1', 'wxx_project_1234', 'root', '', '[]', b'0', 'wx_env_123', '714940256100352', 1717489987182, NULL, NULL, '714940256100352', 1717557159805), - ('wxxx_api_scenario_2', 'xww', 'P0', 'UNDERWAY', 3, '0.46', 'ERROR', '971160841641984', 100027, b'0', 5568, '718273150722066', '1023696881426432', b'1', 'wxx_project_1234', 'wx_scenario_module_123', '', '[]', b'0', 'wx_env_123', '714940256100352', 1717489987182, NULL, NULL, '714940256100352', 1717557159805); + ('wxxx_api_scenario_2', 'xww', 'P0', 'UNDERWAY', 3, '0.46', 'ERROR', '971160841641984', 100027, b'0', 5568, '718273150722066', '1023696881426432', b'1', 'wxx_project_1234', 'wx_scenario_module_123', '', '[]', b'0', 'wx_env_123', '714940256100352', 1717489987182, NULL, NULL, '714940256100352', 1717557159805), + ('wxxx_api_scenario_3', 'dsa', 'P0', 'UNDERWAY', 3, '0.46', 'ERROR', '971160841641984', 100027, b'0', 5568, '718273150722066', '1023696881426432', b'1', 'wxx_project_1234', 'wx_scenario_module_123', '', '[]', b'0', 'wx_env_123', '714940256100352', 1717489987182, NULL, NULL, '714940256100352', 1717557159805);