diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/request/FunctionalCaseChangeRequest.java b/backend/services/case-management/src/main/java/io/metersphere/functional/request/FunctionalCaseChangeRequest.java index 2f39b1afe2..eedf5a75a3 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/request/FunctionalCaseChangeRequest.java +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/request/FunctionalCaseChangeRequest.java @@ -37,6 +37,10 @@ public class FunctionalCaseChangeRequest implements Serializable { @NotBlank(message = "{functional_case.module_id.not_blank}") private String moduleId; + @Schema(description = "用例等级", requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "{functional_case.name.not_blank}") + private int priority = 0; + @Schema(description = "移动方式(节点移动或新增时需要)", requiredMode = Schema.RequiredMode.REQUIRED) private String moveMode; diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/service/FunctionalCaseMinderService.java b/backend/services/case-management/src/main/java/io/metersphere/functional/service/FunctionalCaseMinderService.java index 3c640edeed..487ee5b6e8 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/service/FunctionalCaseMinderService.java +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/service/FunctionalCaseMinderService.java @@ -130,7 +130,6 @@ public class FunctionalCaseMinderService { private static final String FUNCTIONAL_CASE = "functional_case"; private static final String FUNCTIONAL_CASE_MODULE = "functional_case_module"; private static final String CHECK_OWNER_CASE = "check_owner_case"; - /** * 功能用例-脑图用例列表查询 * @@ -276,6 +275,8 @@ public class FunctionalCaseMinderService { FunctionalMinderTreeNodeDTO rootData = new FunctionalMinderTreeNodeDTO(); rootData.setText(text); rootData.setPos(pos); + //最子节点默认收起 + rootData.setExpandState("collapse"); rootData.setResource(List.of(resource)); functionalMinderTreeDTO.setChildren(new ArrayList<>()); functionalMinderTreeDTO.setData(rootData); @@ -620,7 +621,12 @@ public class FunctionalCaseMinderService { FunctionalCase functionalCase = addCase(request, userId, functionalCaseChangeRequest, caseMapper, sourceIdAndInsertModuleIdMap); String caseId = functionalCase.getId(); sourceIdAndInsertCaseIdMap.put(functionalCaseChangeRequest.getId(), caseId); - + //保存用例等级 + FunctionalCaseCustomField customField = new FunctionalCaseCustomField(); + customField.setCaseId(caseId); + customField.setFieldId(defaultCustomFieldValueMap.get("priorityFieldId").toString()); + customField.setValue("P"+functionalCaseChangeRequest.getPriority()); + caseCustomFieldMapper.insertSelective(customField); //附属表 FunctionalCaseBlob functionalCaseBlob = addCaseBlob(functionalCaseChangeRequest, caseId, caseBlobMapper); //保存自定义字段 @@ -658,6 +664,12 @@ public class FunctionalCaseMinderService { FunctionalCaseBlob functionalCaseBlob = updateBlob(functionalCaseChangeRequest, caseId, caseBlobMapper); //更新自定义字段 List functionalCaseCustomFields = updateCustomFields(functionalCaseChangeRequest, oldCaseCustomFieldMap, caseId, caseCustomFieldMapper); + //更新用例等级 + FunctionalCaseCustomField customField = new FunctionalCaseCustomField(); + customField.setCaseId(caseId); + customField.setFieldId(defaultCustomFieldValueMap.get("priorityFieldId").toString()); + customField.setValue("P"+functionalCaseChangeRequest.getPriority()); + caseCustomFieldMapper.updateByPrimaryKeySelective(customField); //日志 FunctionalCaseHistoryLogDTO historyLogDTO = new FunctionalCaseHistoryLogDTO(functionalCase, functionalCaseBlob, oldCaseCustomFieldMap.get(caseId), new ArrayList<>(), new ArrayList<>()); FunctionalCaseHistoryLogDTO old = new FunctionalCaseHistoryLogDTO(oldCaseMap.get(caseId), oldBlobMap.get(caseId), new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); @@ -692,16 +704,16 @@ public class FunctionalCaseMinderService { TemplateDTO defaultTemplateDTO = projectTemplateService.getDefaultTemplateDTO(request.getProjectId(), TemplateScene.FUNCTIONAL.toString()); List customFields = defaultTemplateDTO.getCustomFields(); Map defaultValueMap = new HashMap<>(); + String priorityFieldId = null; for (TemplateCustomFieldDTO field : customFields) { - if (StringUtils.equalsIgnoreCase(field.getFieldName(), "functional_priority")) { - if (field.getDefaultValue() == null) { - field.setDefaultValue("P0"); - } + if (StringUtils.equalsIgnoreCase(field.getFieldName(), Translator.get("custom_field.functional_priority"))) { + priorityFieldId = field.getFieldId(); } - if (field.getDefaultValue() != null) { + if (field.getDefaultValue() != null && !StringUtils.equalsIgnoreCase(field.getFieldName(), Translator.get("custom_field.functional_priority"))) { defaultValueMap.put(field.getFieldId(), field.getDefaultValue()); } } + defaultValueMap.put("priorityFieldId", priorityFieldId); return defaultValueMap; } diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/service/FunctionalCaseService.java b/backend/services/case-management/src/main/java/io/metersphere/functional/service/FunctionalCaseService.java index 95248dcec7..7dda7fe630 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/service/FunctionalCaseService.java +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/service/FunctionalCaseService.java @@ -449,7 +449,7 @@ public class FunctionalCaseService { long testPlanExecuteComment = testPlanCaseExecuteHistoryMapper.countByExample(testPlanCaseExecuteHistoryExample); OptionDTO executeOption = new OptionDTO(); executeOption.setId("executiveComment"); - executeOption.setName(String.valueOf(reviewComment)); + executeOption.setName(String.valueOf(testPlanExecuteComment)); commentList.add(2,executeOption); functionalCaseDetailDTO.setCommentList(commentList); long commentCount = caseComment + reviewComment + testPlanExecuteComment; diff --git a/backend/services/case-management/src/test/java/io/metersphere/functional/controller/FunctionalCaseMinderControllerTest.java b/backend/services/case-management/src/test/java/io/metersphere/functional/controller/FunctionalCaseMinderControllerTest.java index e7d095dc75..4b46d04274 100644 --- a/backend/services/case-management/src/test/java/io/metersphere/functional/controller/FunctionalCaseMinderControllerTest.java +++ b/backend/services/case-management/src/test/java/io/metersphere/functional/controller/FunctionalCaseMinderControllerTest.java @@ -165,6 +165,7 @@ public class FunctionalCaseMinderControllerTest extends BaseTest { caseChangeRequest.setName("新增用例"); caseChangeRequest.setModuleId("TEST_MINDER_MODULE_ID_GYQ2"); caseChangeRequest.setMoveMode("AFTER"); + caseChangeRequest.setPriority(2); caseChangeRequest.setTargetId("TEST_FUNCTIONAL_MINDER_CASE_ID_3"); caseChangeRequest.setTemplateId("100001"); caseChangeRequest.setType("ADD"); @@ -172,8 +173,8 @@ public class FunctionalCaseMinderControllerTest extends BaseTest { caseChangeRequest.setCaseEditType("TEXT"); List customFields = new ArrayList<>(); CaseCustomFieldDTO customFieldDTO = new CaseCustomFieldDTO(); - customFieldDTO.setFieldId("custom_field_minder_gyq_id_3"); - customFieldDTO.setValue("P0"); + customFieldDTO.setFieldId("custom_field_minder_gyq_id_4"); + customFieldDTO.setValue("a"); customFields.add(customFieldDTO); caseChangeRequest.setCustomFields(customFields); caseChangeRequests.add(caseChangeRequest); @@ -182,6 +183,7 @@ public class FunctionalCaseMinderControllerTest extends BaseTest { caseChangeRequest.setName("TEST_MINDER_MODULE_ID_GYQ_更新"); caseChangeRequest.setModuleId("TEST_MINDER_MODULE_ID_GYQ"); caseChangeRequest.setTemplateId("100001"); + caseChangeRequest.setPriority(2); caseChangeRequest.setMoveMode("BEFORE"); caseChangeRequest.setTargetId("TEST_FUNCTIONAL_MINDER_CASE_ID_2"); caseChangeRequest.setType("UPDATE"); @@ -189,8 +191,8 @@ public class FunctionalCaseMinderControllerTest extends BaseTest { caseChangeRequest.setCaseEditType("TEXT"); customFields = new ArrayList<>(); customFieldDTO = new CaseCustomFieldDTO(); - customFieldDTO.setFieldId("custom_field_minder_gyq_id_3"); - customFieldDTO.setValue("P3"); + customFieldDTO.setFieldId("custom_field_minder_gyq_id_4"); + customFieldDTO.setValue("b"); customFields.add(customFieldDTO); caseChangeRequest.setCustomFields(customFields); caseChangeRequests.add(caseChangeRequest); diff --git a/backend/services/case-management/src/test/resources/dml/init_file_minder_test.sql b/backend/services/case-management/src/test/resources/dml/init_file_minder_test.sql index 35ad811ce2..bd51b93686 100644 --- a/backend/services/case-management/src/test/resources/dml/init_file_minder_test.sql +++ b/backend/services/case-management/src/test/resources/dml/init_file_minder_test.sql @@ -30,6 +30,8 @@ INSERT INTO functional_case_custom_field(case_id, field_id, value) VALUES ('TEST INSERT INTO functional_case_custom_field(case_id, field_id, value) VALUES ('TEST_FUNCTIONAL_MINDER_CASE_ID_2', 'custom_field_minder_gyq_id_3', 'P3'); INSERT INTO functional_case_custom_field(case_id, field_id, value) VALUES ('TEST_FUNCTIONAL_MINDER_CASE_ID_5', 'custom_field_minder_gyq_id_3', 'P3'); INSERT INTO functional_case_custom_field(case_id, field_id, value) VALUES ('TEST_FUNCTIONAL_MINDER_CASE_ID_6', 'custom_field_minder_gyq_id_3', 'P2'); +INSERT INTO functional_case_custom_field(case_id, field_id, value) VALUES ('TEST_FUNCTIONAL_MINDER_CASE_ID_6', 'custom_field_minder_gyq_id_4', 'a'); + @@ -56,7 +58,8 @@ INSERT INTO test_plan_functional_case(id, test_plan_id, functional_case_id, crea INSERT INTO custom_field (id, name, scene, type, remark, internal, scope_type, create_time, update_time, create_user, scope_id) VALUES ('custom_field_minder_gyq_id_2', 'functional_priority', 'FUNCTIONAL', 'SELECT', '', true, 'ORGANIZATION', UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, 'admin', '100001'), - ('custom_field_minder_gyq_id_3', 'functional_priority', 'FUNCTIONAL', 'SELECT', '', true, 'PROJECT', UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, 'admin', 'project-case-minder-test'); + ('custom_field_minder_gyq_id_3', 'functional_priority', 'FUNCTIONAL', 'SELECT', '', true, 'PROJECT', UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, 'admin', 'project-case-minder-test'), + ('custom_field_minder_gyq_id_4', 'fff', 'FUNCTIONAL', 'SELECT', '', true, 'PROJECT', UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, 'admin', 'project-case-minder-test'); @@ -99,3 +102,4 @@ VALUES ('additional1', 'project-case-minder-test', 'additional1', 'TEST_MINDER_M INSERT INTO template(id,name,remark,internal,update_time,create_time,create_user,scope_type,scope_id,enable_third_part, scene, ref_id) VALUES ('100001', 'functional_default', '', 1, UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, 'admin', 'PROJECT', 'project-case-minder-test', 0, 'FUNCTIONAL', '100001'); +INSERT INTO template_custom_field(id, field_id, template_id, required, pos, api_field_id, default_value) VALUES ('template_custom_field_minder_gyq_id', 'custom_field_minder_gyq_id_3', '100001', b'1', 0, NULL, NULL); \ No newline at end of file diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/TestPlanCollectionMinderEditDTO.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/TestPlanCollectionMinderEditDTO.java index 91a3f8c40e..7bbde13d4b 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/TestPlanCollectionMinderEditDTO.java +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/TestPlanCollectionMinderEditDTO.java @@ -73,6 +73,10 @@ public class TestPlanCollectionMinderEditDTO implements Serializable { @NotNull(message = "{test_plan_collection.stop_on_fail.not_blank}") private Boolean stopOnFail; + @Schema(description = "叶子等级", requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "{test_plan_collection.num.not_blank}") + private Integer level; + @Schema(description = "关联关系的数据") private ListassociateDTOS; diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanCollectionMinderService.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanCollectionMinderService.java index b220f6e13a..d3dc3d7ce4 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanCollectionMinderService.java +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanCollectionMinderService.java @@ -107,7 +107,7 @@ public class TestPlanCollectionMinderService { } else { typeTreeNodeDTO.setPriority(2); } - if (StringUtils.equalsIgnoreCase(CaseType.FUNCTIONAL_CASE.getKey(),testPlanCollection.getType())) { + if (StringUtils.equalsIgnoreCase(CaseType.FUNCTIONAL_CASE.getKey(), testPlanCollection.getType())) { typeTreeNodeDTO.setPriority(null); } return typeTreeNodeDTO; @@ -188,7 +188,7 @@ public class TestPlanCollectionMinderService { buildChild(countTreeNodeDTO, count + Translator.get("test_plan.mind.strip"), "test_plan.mind.case_count", countTreeDTO, endList); TestPlanCollectionMinderTreeDTO envTreeDTO = new TestPlanCollectionMinderTreeDTO(); TestPlanCollectionMinderTreeNodeDTO envTreeNodeDTO = new TestPlanCollectionMinderTreeNodeDTO(); - buildChild(envTreeNodeDTO, StringUtils.equalsIgnoreCase(planCollection.getEnvironmentId(),ModuleConstants.ROOT_NODE_PARENT_ID) ? Translator.get("api_report_default_env") : planCollection.getEnvName(), "test_plan.mind.environment", envTreeDTO, endList); + buildChild(envTreeNodeDTO, StringUtils.equalsIgnoreCase(planCollection.getEnvironmentId(), ModuleConstants.ROOT_NODE_PARENT_ID) ? Translator.get("api_report_default_env") : planCollection.getEnvName(), "test_plan.mind.environment", envTreeDTO, endList); TestPlanCollectionMinderTreeDTO poolTreeDTO = new TestPlanCollectionMinderTreeDTO(); TestPlanCollectionMinderTreeNodeDTO poolTreeNodeDTO = new TestPlanCollectionMinderTreeNodeDTO(); buildChild(poolTreeNodeDTO, planCollection.getPoolName(), "test_plan.mind.test_resource_pool", poolTreeDTO, endList); @@ -215,7 +215,7 @@ public class TestPlanCollectionMinderService { buildChild(countTreeNodeDTO, count + Translator.get("test_plan.mind.strip"), "test_plan.mind.case_count", countTreeDTO, endList); TestPlanCollectionMinderTreeDTO envTreeDTO = new TestPlanCollectionMinderTreeDTO(); TestPlanCollectionMinderTreeNodeDTO envTreeNodeDTO = new TestPlanCollectionMinderTreeNodeDTO(); - buildChild(envTreeNodeDTO, StringUtils.equalsIgnoreCase(planCollection.getEnvironmentId(),ModuleConstants.ROOT_NODE_PARENT_ID) ? Translator.get("api_report_default_env") : planCollection.getEnvName() , "test_plan.mind.environment", envTreeDTO, endList); + buildChild(envTreeNodeDTO, StringUtils.equalsIgnoreCase(planCollection.getEnvironmentId(), ModuleConstants.ROOT_NODE_PARENT_ID) ? Translator.get("api_report_default_env") : planCollection.getEnvName(), "test_plan.mind.environment", envTreeDTO, endList); TestPlanCollectionMinderTreeDTO poolTreeDTO = new TestPlanCollectionMinderTreeDTO(); TestPlanCollectionMinderTreeNodeDTO poolTreeNodeDTO = new TestPlanCollectionMinderTreeNodeDTO(); buildChild(poolTreeNodeDTO, planCollection.getPoolName(), "test_plan.mind.test_resource_pool", poolTreeDTO, endList); @@ -272,7 +272,7 @@ public class TestPlanCollectionMinderService { } private static void checkNameRepeat(Map> updateTypeNameMap, Map> addTypeNameMap) { - updateTypeNameMap.forEach((k, v)->{ + updateTypeNameMap.forEach((k, v) -> { List nameList = addTypeNameMap.get(k); if (CollectionUtils.isNotEmpty(nameList)) { List repeatList = v.stream().filter(nameList::contains).collect(Collectors.toList()); @@ -284,8 +284,8 @@ public class TestPlanCollectionMinderService { } private Map> dealUpdateList(TestPlanCollectionMinderEditRequest request, String userId, Map> associateMap, Map> parentMap, TestPlanCollectionMapper collectionMapper) { - List updateList = request.getEditList().stream().filter(t -> StringUtils.isNotBlank(t.getId())).toList(); - Map>typeNamesMap = new HashMap<>(); + List updateList = request.getEditList().stream().filter(t -> StringUtils.isNotBlank(t.getId()) && t.getLevel() == 2).toList(); + Map> typeNamesMap = new HashMap<>(); if (CollectionUtils.isNotEmpty(updateList)) { //处理删除 deleteCollection(updateList, request.getPlanId()); @@ -311,8 +311,8 @@ public class TestPlanCollectionMinderService { } private Map> dealAddList(TestPlanCollectionMinderEditRequest request, String userId, Map> associateMap, Map> parentMap, TestPlanCollectionMapper collectionMapper) { - Map>typeNamesMap = new HashMap<>(); - List addList = request.getEditList().stream().filter(t -> StringUtils.isBlank(t.getId())).toList(); + Map> typeNamesMap = new HashMap<>(); + List addList = request.getEditList().stream().filter(t -> StringUtils.isBlank(t.getId()) && t.getLevel() == 2).toList(); if (CollectionUtils.isNotEmpty(addList)) { for (TestPlanCollectionMinderEditDTO testPlanCollectionMinderEditDTO : addList) { TestPlanCollection testPlanCollection = addCollection(request, userId, testPlanCollectionMinderEditDTO, parentMap, collectionMapper); @@ -346,14 +346,6 @@ public class TestPlanCollectionMinderService { return testPlanCollections.stream().collect(Collectors.groupingBy(TestPlanCollection::getType)); } - @NotNull - private Map> getChildrenMap(TestPlanCollectionMinderEditRequest request) { - TestPlanCollectionExample testPlanCollectionExample = new TestPlanCollectionExample(); - testPlanCollectionExample.createCriteria().andTestPlanIdEqualTo(request.getPlanId()).andParentIdNotEqualTo(ModuleConstants.ROOT_NODE_PARENT_ID); - List testPlanCollections = testPlanCollectionMapper.selectByExample(testPlanCollectionExample); - return testPlanCollections.stream().collect(Collectors.groupingBy(TestPlanCollection::getType)); - } - @NotNull private static TestPlanCollection updateCollection(TestPlanCollectionMinderEditRequest request, String userId, TestPlanCollectionMinderEditDTO testPlanCollectionMinderEditDTO, Map> parentMap, TestPlanCollectionMapper collectionMapper) { TestPlanCollection testPlanCollection = new TestPlanCollection(); diff --git a/backend/services/test-plan/src/test/java/io/metersphere/plan/controller/TestPlanCollectionMinderControllerTests.java b/backend/services/test-plan/src/test/java/io/metersphere/plan/controller/TestPlanCollectionMinderControllerTests.java index a3865c754b..3848394489 100644 --- a/backend/services/test-plan/src/test/java/io/metersphere/plan/controller/TestPlanCollectionMinderControllerTests.java +++ b/backend/services/test-plan/src/test/java/io/metersphere/plan/controller/TestPlanCollectionMinderControllerTests.java @@ -69,6 +69,7 @@ public class TestPlanCollectionMinderControllerTests extends BaseTest { testPlanCollectionMinderEditDTO.setType("API"); testPlanCollectionMinderEditDTO.setExtended(false); testPlanCollectionMinderEditDTO.setGrouped(false); + testPlanCollectionMinderEditDTO.setLevel(2); testPlanCollectionMinderEditDTO.setEnvironmentId("gyq_123"); testPlanCollectionMinderEditDTO.setTestResourcePoolId("gyq_123_pool"); testPlanCollectionMinderEditDTO.setRetryOnFail(true); @@ -94,6 +95,7 @@ public class TestPlanCollectionMinderControllerTests extends BaseTest { testPlanCollectionMinderEditDTO.setId(null); testPlanCollectionMinderEditDTO.setText("新建名称"); testPlanCollectionMinderEditDTO.setNum(500L); + testPlanCollectionMinderEditDTO.setLevel(2); testPlanCollectionMinderEditDTO.setExecuteMethod("PARALLEL"); testPlanCollectionMinderEditDTO.setType("API"); testPlanCollectionMinderEditDTO.setExtended(false); @@ -133,6 +135,7 @@ public class TestPlanCollectionMinderControllerTests extends BaseTest { testPlanCollectionMinderEditDTO.setNum(500L); testPlanCollectionMinderEditDTO.setExecuteMethod("PARALLEL"); testPlanCollectionMinderEditDTO.setType("API"); + testPlanCollectionMinderEditDTO.setLevel(2); testPlanCollectionMinderEditDTO.setExtended(false); testPlanCollectionMinderEditDTO.setGrouped(false); testPlanCollectionMinderEditDTO.setEnvironmentId("gyq_123");