diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseService.java b/backend/services/case-management/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseService.java index a8467fedb6..3ab2e3bb0b 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseService.java +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseService.java @@ -3,19 +3,20 @@ package io.metersphere.functional.service; import io.metersphere.functional.constants.CaseEvent; import io.metersphere.functional.constants.FunctionalCaseReviewStatus; -import io.metersphere.functional.domain.CaseReviewFunctionalCase; -import io.metersphere.functional.domain.CaseReviewFunctionalCaseExample; +import io.metersphere.functional.domain.*; import io.metersphere.functional.dto.ReviewFunctionalCaseDTO; import io.metersphere.functional.dto.ReviewsDTO; -import io.metersphere.functional.mapper.CaseReviewFunctionalCaseMapper; -import io.metersphere.functional.mapper.ExtCaseReviewFunctionalCaseMapper; -import io.metersphere.functional.mapper.ExtCaseReviewFunctionalCaseUserMapper; -import io.metersphere.functional.mapper.ExtFunctionalCaseModuleMapper; +import io.metersphere.functional.mapper.*; import io.metersphere.functional.request.BaseReviewCaseBatchRequest; +import io.metersphere.functional.request.FunctionalCaseEditRequest; import io.metersphere.functional.request.ReviewFunctionalCasePageRequest; import io.metersphere.functional.utils.CaseListenerUtils; +import io.metersphere.project.domain.ProjectApplication; +import io.metersphere.project.domain.ProjectApplicationExample; import io.metersphere.project.domain.ProjectVersion; import io.metersphere.project.mapper.ExtBaseProjectVersionMapper; +import io.metersphere.project.mapper.ProjectApplicationMapper; +import io.metersphere.sdk.constants.ProjectApplicationType; import io.metersphere.system.dto.sdk.BaseTreeNode; import io.metersphere.system.uid.IDGenerator; import jakarta.annotation.Resource; @@ -24,6 +25,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; @@ -49,6 +51,12 @@ public class CaseReviewFunctionalCaseService { private CaseReviewFunctionalCaseMapper caseReviewFunctionalCaseMapper; @Resource private CaseReviewService caseReviewService; + @Resource + private ProjectApplicationMapper projectApplicationMapper; + @Resource + private CaseReviewHistoryMapper caseReviewHistoryMapper; + @Resource + private FunctionalCaseMapper functionalCaseMapper; /** * 通过评审id获取关联的用例id集合 @@ -118,9 +126,9 @@ public class CaseReviewFunctionalCaseService { List caseIds = caseReviewFunctionalCases.stream().map(CaseReviewFunctionalCase::getCaseId).toList(); List passList = caseReviewFunctionalCases.stream().filter(t -> !ids.contains(t.getId()) && StringUtils.equalsIgnoreCase(t.getStatus(), FunctionalCaseReviewStatus.PASS.toString())).toList(); Map param = new HashMap<>(); - param.put(CaseEvent.Param.CASE_IDS,caseIds); + param.put(CaseEvent.Param.CASE_IDS, caseIds); param.put(CaseEvent.Param.REVIEW_ID, reviewId); - param.put(CaseEvent.Param.PASS_COUNT,passList.size()); + param.put(CaseEvent.Param.PASS_COUNT, passList.size()); return param; } @@ -140,8 +148,8 @@ public class CaseReviewFunctionalCaseService { /** * 评审详情页面 创建用例并关联 * - * @param caseId 功能用例ID - * @param userId 当前操作人 + * @param caseId 功能用例ID + * @param userId 当前操作人 * @param reviewId 评审id */ public void addCaseReviewFunctionalCase(String caseId, String userId, String reviewId) { @@ -157,4 +165,63 @@ public class CaseReviewFunctionalCaseService { caseReviewFunctionalCaseMapper.insertSelective(reviewFunctionalCase); } + + + /** + * 用例更新 更新状态为重新评审 + * + * @param request + * @param blob + */ + public void reReviewedCase(FunctionalCaseEditRequest request, FunctionalCaseBlob blob, String name) { + ProjectApplicationExample example = new ProjectApplicationExample(); + example.createCriteria().andProjectIdEqualTo(request.getProjectId()).andTypeEqualTo(ProjectApplicationType.CASE.CASE_RE_REVIEW.name()); + List projectApplications = projectApplicationMapper.selectByExample(example); + if (CollectionUtils.isNotEmpty(projectApplications) && Boolean.valueOf(projectApplications.get(0).getTypeValue())) { + if (!StringUtils.equals(name, request.getName()) + || !StringUtils.equals(new String(blob.getSteps(), StandardCharsets.UTF_8), request.getSteps()) + || !StringUtils.equals(new String(blob.getTextDescription(), StandardCharsets.UTF_8), request.getTextDescription()) + || !StringUtils.equals(new String(blob.getExpectedResult(), StandardCharsets.UTF_8), request.getExpectedResult())) { + doHandleStatusAndHistory(request, blob, name); + } + } + + + } + + private void doHandleStatusAndHistory(FunctionalCaseEditRequest request, FunctionalCaseBlob blob, String name) { + CaseReviewFunctionalCaseExample reviewFunctionalCaseExample = new CaseReviewFunctionalCaseExample(); + reviewFunctionalCaseExample.createCriteria().andCaseIdEqualTo(blob.getId()); + List caseReviewFunctionalCases = caseReviewFunctionalCaseMapper.selectByExample(reviewFunctionalCaseExample); + if (CollectionUtils.isNotEmpty(caseReviewFunctionalCases)) { + caseReviewFunctionalCases.forEach(item -> { + updateReviewCaseAndCaseStatus(item); + insertHistory(item); + }); + } + + + } + + private void insertHistory(CaseReviewFunctionalCase item) { + CaseReviewHistory caseReviewHistory = new CaseReviewHistory(); + caseReviewHistory.setId(IDGenerator.nextStr()); + caseReviewHistory.setCaseId(item.getCaseId()); + caseReviewHistory.setReviewId(item.getReviewId()); + caseReviewHistory.setStatus(FunctionalCaseReviewStatus.RE_REVIEWED.name()); + caseReviewHistory.setCreateUser("system"); + caseReviewHistory.setCreateTime(System.currentTimeMillis()); + caseReviewHistoryMapper.insertSelective(caseReviewHistory); + } + + private void updateReviewCaseAndCaseStatus(CaseReviewFunctionalCase item) { + item.setStatus(FunctionalCaseReviewStatus.RE_REVIEWED.name()); + item.setUpdateTime(System.currentTimeMillis()); + caseReviewFunctionalCaseMapper.updateByPrimaryKeySelective(item); + + FunctionalCase functionalCase = new FunctionalCase(); + functionalCase.setId(item.getCaseId()); + functionalCase.setReviewStatus(FunctionalCaseReviewStatus.RE_REVIEWED.name()); + functionalCaseMapper.updateByPrimaryKeySelective(functionalCase); + } } \ No newline at end of file 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 c32683a55f..d5320632bc 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 @@ -273,6 +273,7 @@ public class FunctionalCaseService { */ public FunctionalCase updateFunctionalCase(FunctionalCaseEditRequest request, List files, String userId) { FunctionalCase checked = checkFunctionalCase(request.getId()); + FunctionalCaseBlob functionalCaseBlob = functionalCaseBlobMapper.selectByPrimaryKey(request.getId()); //对于用例模块的变更,同一用例的其他版本用例也需要变更 if (!StringUtils.equals(checked.getModuleId(), request.getModuleId())) { @@ -302,11 +303,18 @@ public class FunctionalCaseService { functionalCaseAttachmentService.association(request.getRelateFileMetaIds(), request.getId(), userId, UPDATE_FUNCTIONAL_CASE_FILE_LOG_URL, request.getProjectId()); } + //处理评审状态 + handleReviewStatus(request, functionalCaseBlob, checked.getName()); + return functionalCase; } + private void handleReviewStatus(FunctionalCaseEditRequest request, FunctionalCaseBlob blob, String name) { + caseReviewFunctionalCaseService.reReviewedCase(request, blob, name); + } + /** * 多版本所属模块更新处理 @@ -326,6 +334,7 @@ public class FunctionalCaseService { functionalCaseMapper.updateByPrimaryKeySelective(functionalCase); //更新附属表信息 FunctionalCaseBlob functionalCaseBlob = new FunctionalCaseBlob(); + functionalCaseBlob.setId(request.getId()); functionalCaseBlob.setSteps(StringUtils.defaultIfBlank(request.getSteps(), StringUtils.EMPTY).getBytes(StandardCharsets.UTF_8)); functionalCaseBlob.setTextDescription(StringUtils.defaultIfBlank(request.getTextDescription(), StringUtils.EMPTY).getBytes(StandardCharsets.UTF_8)); functionalCaseBlob.setExpectedResult(StringUtils.defaultIfBlank(request.getExpectedResult(), StringUtils.EMPTY).getBytes(StandardCharsets.UTF_8)); diff --git a/backend/services/case-management/src/test/java/io/metersphere/functional/controller/FunctionalCaseControllerTests.java b/backend/services/case-management/src/test/java/io/metersphere/functional/controller/FunctionalCaseControllerTests.java index ca48b48b51..00f8393d5b 100644 --- a/backend/services/case-management/src/test/java/io/metersphere/functional/controller/FunctionalCaseControllerTests.java +++ b/backend/services/case-management/src/test/java/io/metersphere/functional/controller/FunctionalCaseControllerTests.java @@ -194,6 +194,30 @@ public class FunctionalCaseControllerTests extends BaseTest { ResultHolder updateResultHolder = JSON.parseObject(updateReturnData, ResultHolder.class); Assertions.assertNotNull(updateResultHolder); + FunctionalCaseEditRequest editRequest = new FunctionalCaseEditRequest(); + editRequest.setProjectId("WX_PROJECT_ID"); + editRequest.setModuleId("TEST_MODULE_ID"); + editRequest.setId("WX_TEST_FUNCTIONAL_CASE_ID"); + editRequest.setTemplateId("default_template_id"); + editRequest.setName("测试更新评审状态"); + editRequest.setCaseEditType("STEP"); + paramMap = new LinkedMultiValueMap<>(); + paramMap.add("request", JSON.toJSONString(editRequest)); + paramMap.add("files", files); + this.requestMultipart(FUNCTIONAL_CASE_UPDATE_URL, paramMap); + + + editRequest.setSteps("123141243"); + paramMap = new LinkedMultiValueMap<>(); + paramMap.add("request", JSON.toJSONString(editRequest)); + paramMap.add("files", files); + this.requestMultipart(FUNCTIONAL_CASE_UPDATE_URL, paramMap); + + editRequest.setTextDescription("adfadsasfdf"); + paramMap = new LinkedMultiValueMap<>(); + paramMap.add("request", JSON.toJSONString(editRequest)); + paramMap.add("files", files); + this.requestMultipart(FUNCTIONAL_CASE_UPDATE_URL, paramMap); } diff --git a/backend/services/case-management/src/test/resources/dml/init_file_metadata_test.sql b/backend/services/case-management/src/test/resources/dml/init_file_metadata_test.sql index bc5a7c5771..238f5e7bd4 100644 --- a/backend/services/case-management/src/test/resources/dml/init_file_metadata_test.sql +++ b/backend/services/case-management/src/test/resources/dml/init_file_metadata_test.sql @@ -50,3 +50,18 @@ INSERT INTO functional_case_attachment(id, case_id, file_id, file_name, size, lo INSERT INTO functional_case_module(id, project_id, name, parent_id, pos, create_time, update_time, create_user, update_user) VALUES ('TEST_MODULE_ID', '100001100001', '测试所属模块', 'NONE', 0, 1669174143999, 1669174143999, 'admin', 'admin'); INSERT INTO custom_field(id, name, scene, type, remark, internal, scope_type, create_time, update_time, create_user, ref_id, enable_option_key, scope_id) VALUES ('custom_field_id_1', 'functional_priority', 'FUNCTIONAL', 'SELECT', '', b'1', 'ORGANIZATION', 1698983187000, 1698983187000, 'admin', NULL, b'0', '100001'); + + +INSERT INTO functional_case(id, num, module_id, project_id, template_id, name, review_status, tags, case_edit_type, pos, version_id, ref_id, last_execute_result, deleted, public_case, latest, create_user, update_user, delete_user, create_time, update_time, delete_time) +VALUES ('WX_TEST_FUNCTIONAL_CASE_ID', 6, 'TEST_MODULE_ID', 'WX_PROJECT_ID', '100001', '测试重新提审', 'UN_REVIEWED', NULL, 'STEP', 55000, 'v3.0.0', 'TEST_REF_ID_1', 'UN_EXECUTED', b'0', b'0', b'1', 'admin', 'admin', '', 1698058347559, 1698058347559, NULL); + +INSERT INTO functional_case_blob(id, steps, text_description, expected_result, prerequisite, description) VALUES ('WX_TEST_FUNCTIONAL_CASE_ID', 'STEP', '1111', '', '', 'TEST'); + +INSERT INTO project_application(project_id, type, type_value) VALUES ('WX_PROJECT_ID', 'CASE_RE_REVIEW', 'true'); + +INSERT INTO case_review_functional_case(id, review_id, case_id, status, create_time, update_time, create_user, pos) VALUES ('wx_case_review_id', 'wx_review_id', 'WX_TEST_FUNCTIONAL_CASE_ID', 'PASS', 1700816738199, 1700816738199, 'admin', 0); + +INSERT INTO case_review(id, num, name, module_id, project_id, status, review_pass_rule, pos, start_time, end_time, case_count, pass_rate, tags, description, create_time, create_user, update_time, update_user) +VALUES ('wx_review_id',10006,'测试重新提审', 'test_module_one', 'TEST_MODULE_ID', 'COMPLETED', 'SINGLE', 001, null, null, 1,100.00,null,null,1698058347559,'admin',1698058347559,'admin'); + + diff --git a/backend/services/project-management/src/main/java/io/metersphere/project/service/ProjectTemplateService.java b/backend/services/project-management/src/main/java/io/metersphere/project/service/ProjectTemplateService.java index d5b8e1feb4..025c439137 100644 --- a/backend/services/project-management/src/main/java/io/metersphere/project/service/ProjectTemplateService.java +++ b/backend/services/project-management/src/main/java/io/metersphere/project/service/ProjectTemplateService.java @@ -411,7 +411,7 @@ public class ProjectTemplateService extends BaseTemplateService { CustomFieldOptions optionDTO = new CustomFieldOptions(); optionDTO.setId(customField.getId()); if (customField.getInternal()) { - customField.setName(baseCustomFieldService.translateInternalField(customField.getName())); + optionDTO.setName(baseCustomFieldService.translateInternalField(customField.getName())); } else { optionDTO.setName(customField.getName()); }