feat(用例评审): 评审结果的气泡数据

This commit is contained in:
guoyuqi 2024-01-24 09:21:17 +08:00 committed by 刘瑞斌
parent 09b4b6756a
commit 9de485fe9e
4 changed files with 68 additions and 14 deletions

View File

@ -10,6 +10,7 @@ import io.metersphere.functional.service.CaseReviewFunctionalCaseService;
import io.metersphere.functional.service.CaseReviewLogService; import io.metersphere.functional.service.CaseReviewLogService;
import io.metersphere.sdk.constants.PermissionConstants; import io.metersphere.sdk.constants.PermissionConstants;
import io.metersphere.system.dto.sdk.BaseTreeNode; import io.metersphere.system.dto.sdk.BaseTreeNode;
import io.metersphere.system.dto.sdk.OptionDTO;
import io.metersphere.system.log.annotation.Log; import io.metersphere.system.log.annotation.Log;
import io.metersphere.system.log.constants.OperationLogType; import io.metersphere.system.log.constants.OperationLogType;
import io.metersphere.system.security.CheckOwner; import io.metersphere.system.security.CheckOwner;
@ -17,6 +18,7 @@ import io.metersphere.system.utils.PageUtils;
import io.metersphere.system.utils.Pager; import io.metersphere.system.utils.Pager;
import io.metersphere.system.utils.SessionUtils; import io.metersphere.system.utils.SessionUtils;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
@ -112,4 +114,15 @@ public class CaseReviewFunctionalCaseController {
caseReviewFunctionalCaseService.batchEditReviewUser(request, SessionUtils.getUserId()); caseReviewFunctionalCaseService.batchEditReviewUser(request, SessionUtils.getUserId());
} }
@GetMapping("/reviewer/status/{reviewId}/{caseId}")
@Operation(summary = "用例管理-用例评审-评审列表-评审详情-评审结果的气泡数据")
@RequiresPermissions(PermissionConstants.CASE_REVIEW_READ)
@CheckOwner(resourceId = "#projectId", resourceType = "project")
public List<OptionDTO> getUserStatus(@Schema(description = "评审id", requiredMode = Schema.RequiredMode.REQUIRED)
@PathVariable("reviewId") String reviewId, @Schema(description = "用例id", requiredMode = Schema.RequiredMode.REQUIRED)
@PathVariable("caseId") String caseId) {
return caseReviewFunctionalCaseService.getUserStatus(reviewId, caseId);
}
} }

View File

@ -6,6 +6,7 @@ import io.metersphere.functional.constants.CaseFileSourceType;
import io.metersphere.functional.constants.CaseReviewPassRule; import io.metersphere.functional.constants.CaseReviewPassRule;
import io.metersphere.functional.constants.FunctionalCaseReviewStatus; import io.metersphere.functional.constants.FunctionalCaseReviewStatus;
import io.metersphere.functional.domain.*; import io.metersphere.functional.domain.*;
import io.metersphere.functional.dto.CaseReviewHistoryDTO;
import io.metersphere.functional.dto.ReviewFunctionalCaseDTO; import io.metersphere.functional.dto.ReviewFunctionalCaseDTO;
import io.metersphere.functional.dto.ReviewsDTO; import io.metersphere.functional.dto.ReviewsDTO;
import io.metersphere.functional.mapper.*; import io.metersphere.functional.mapper.*;
@ -22,6 +23,7 @@ import io.metersphere.sdk.exception.MSException;
import io.metersphere.sdk.util.LogUtils; import io.metersphere.sdk.util.LogUtils;
import io.metersphere.sdk.util.Translator; import io.metersphere.sdk.util.Translator;
import io.metersphere.system.dto.sdk.BaseTreeNode; import io.metersphere.system.dto.sdk.BaseTreeNode;
import io.metersphere.system.dto.sdk.OptionDTO;
import io.metersphere.system.notice.constants.NoticeConstants; import io.metersphere.system.notice.constants.NoticeConstants;
import io.metersphere.system.uid.IDGenerator; import io.metersphere.system.uid.IDGenerator;
import io.metersphere.system.utils.ServiceUtils; import io.metersphere.system.utils.ServiceUtils;
@ -80,6 +82,8 @@ public class CaseReviewFunctionalCaseService {
private FunctionalCaseAttachmentService functionalCaseAttachmentService; private FunctionalCaseAttachmentService functionalCaseAttachmentService;
@Resource @Resource
private FunctionalCaseModuleService functionalCaseModuleService; private FunctionalCaseModuleService functionalCaseModuleService;
@Resource
private ExtCaseReviewHistoryMapper extCaseReviewHistoryMapper;
@ -575,4 +579,16 @@ public class CaseReviewFunctionalCaseService {
return functionalCaseModuleService.buildTreeAndCountResource(fileModuleList, moduleCountDTOList, true, Translator.get("default.module")); return functionalCaseModuleService.buildTreeAndCountResource(fileModuleList, moduleCountDTOList, true, Translator.get("default.module"));
} }
public List<OptionDTO> getUserStatus(String reviewId, String caseId) {
List<CaseReviewHistoryDTO> list = extCaseReviewHistoryMapper.list(caseId, reviewId);
Map<String, List<CaseReviewHistoryDTO>> collect = list.stream().sorted(Comparator.comparingLong(CaseReviewHistoryDTO::getCreateTime).reversed()).collect(Collectors.groupingBy(CaseReviewHistoryDTO::getCreateUser, Collectors.toList()));
List<OptionDTO>optionDTOS = new ArrayList<>();
collect.forEach((k,v)->{
OptionDTO optionDTO = new OptionDTO();
optionDTO.setId(v.get(0).getUserName());
optionDTO.setName(v.get(0).getStatus());
optionDTOS.add(optionDTO);
});
return optionDTOS;
}
} }

View File

@ -6,7 +6,6 @@ import io.metersphere.functional.domain.CaseReviewFunctionalCase;
import io.metersphere.functional.domain.CaseReviewFunctionalCaseExample; import io.metersphere.functional.domain.CaseReviewFunctionalCaseExample;
import io.metersphere.functional.dto.ReviewFunctionalCaseDTO; import io.metersphere.functional.dto.ReviewFunctionalCaseDTO;
import io.metersphere.functional.mapper.CaseReviewFunctionalCaseMapper; import io.metersphere.functional.mapper.CaseReviewFunctionalCaseMapper;
import io.metersphere.functional.mapper.CaseReviewFunctionalCaseUserMapper;
import io.metersphere.functional.request.*; import io.metersphere.functional.request.*;
import io.metersphere.sdk.constants.ModuleConstants; import io.metersphere.sdk.constants.ModuleConstants;
import io.metersphere.sdk.constants.SessionConstants; import io.metersphere.sdk.constants.SessionConstants;
@ -15,8 +14,10 @@ import io.metersphere.system.base.BaseTest;
import io.metersphere.system.controller.handler.ResultHolder; import io.metersphere.system.controller.handler.ResultHolder;
import io.metersphere.system.dto.sdk.BaseCondition; import io.metersphere.system.dto.sdk.BaseCondition;
import io.metersphere.system.dto.sdk.BaseTreeNode; import io.metersphere.system.dto.sdk.BaseTreeNode;
import io.metersphere.system.dto.sdk.OptionDTO;
import io.metersphere.system.utils.Pager; import io.metersphere.system.utils.Pager;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.*;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
@ -55,11 +56,12 @@ public class CaseReviewFunctionalCaseControllerTests extends BaseTest {
public static final String REVIEW_FUNCTIONAL_CASE_MODULE_COUNT= "/case/review/detail/module/count"; public static final String REVIEW_FUNCTIONAL_CASE_MODULE_COUNT= "/case/review/detail/module/count";
public static final String REVIEW_FUNCTIONAL_CASE_REVIEWER_STATUS= "/case/review/detail/reviewer/status/";
@Resource @Resource
private CaseReviewFunctionalCaseMapper caseReviewFunctionalCaseMapper; private CaseReviewFunctionalCaseMapper caseReviewFunctionalCaseMapper;
@Resource
private CaseReviewFunctionalCaseUserMapper caseReviewFunctionalCaseUserMapper;
@Test @Test
@Order(1) @Order(1)
@ -145,7 +147,7 @@ public class CaseReviewFunctionalCaseControllerTests extends BaseTest {
//检查有没有默认节点 //检查有没有默认节点
boolean hasNode = false; boolean hasNode = false;
for (BaseTreeNode baseTreeNode : treeNodes) { for (BaseTreeNode baseTreeNode : treeNodes) {
if (org.testcontainers.shaded.org.apache.commons.lang3.StringUtils.equals(baseTreeNode.getId(), ModuleConstants.DEFAULT_NODE_ID)) { if (StringUtils.equals(baseTreeNode.getId(), ModuleConstants.DEFAULT_NODE_ID)) {
hasNode = true; hasNode = true;
} }
Assertions.assertNotNull(baseTreeNode.getParentId()); Assertions.assertNotNull(baseTreeNode.getParentId());
@ -235,13 +237,6 @@ public class CaseReviewFunctionalCaseControllerTests extends BaseTest {
@Test @Test
@Order(8) @Order(8)
public void testBatchReview() throws Exception { public void testBatchReview() throws Exception {
/*List<CaseReviewFunctionalCase> caseReviewList = getCaseReviewFunctionalCase("wx_review_id_1");
List<CaseReviewFunctionalCase> list = caseReviewList.stream().filter(t -> StringUtils.equalsIgnoreCase(t.getCreateUser(), "admin")).toList();
CaseReviewFunctionalCaseUser caseReviewFunctionalCaseUser = new CaseReviewFunctionalCaseUser();
caseReviewFunctionalCaseUser.setReviewId("wx_review_id_1");
caseReviewFunctionalCaseUser.setCaseId(list.get(0).getCaseId());
caseReviewFunctionalCaseUser.setUserId("admin");
caseReviewFunctionalCaseUserMapper.insertSelective(caseReviewFunctionalCaseUser);*/
BatchReviewFunctionalCaseRequest request = new BatchReviewFunctionalCaseRequest(); BatchReviewFunctionalCaseRequest request = new BatchReviewFunctionalCaseRequest();
request.setReviewId("wx_review_id_1"); request.setReviewId("wx_review_id_1");
@ -362,6 +357,28 @@ public class CaseReviewFunctionalCaseControllerTests extends BaseTest {
this.requestPostWithOkAndReturn(BATCH_EDIT_REVIEWERS, request); this.requestPostWithOkAndReturn(BATCH_EDIT_REVIEWERS, request);
} }
@Test
@Order(11)
public void getUserStatus() throws Exception {
List<OptionDTO> optionDTOS = getOptionDTOS("wx_review_id_1","gyq_case_id_5");
Assertions.assertTrue(CollectionUtils.isNotEmpty(optionDTOS));
optionDTOS = getOptionDTOS("wx_review_id_1_NONE","gyq_case_id_5");
Assertions.assertTrue(CollectionUtils.isEmpty(optionDTOS));
}
private List<OptionDTO> getOptionDTOS(String reviewId, String caseId) throws Exception {
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get(REVIEW_FUNCTIONAL_CASE_REVIEWER_STATUS+"/"+reviewId+"/"+caseId).header(SessionConstants.HEADER_TOKEN, sessionId)
.header(SessionConstants.CSRF_TOKEN, csrfToken)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON)).andReturn();
String returnData = result.getResponse().getContentAsString(StandardCharsets.UTF_8);
ResultHolder resultHolder = JSON.parseObject(returnData, ResultHolder.class);
List<OptionDTO> optionDTOS = JSON.parseArray(JSON.toJSONString(resultHolder.getData()), OptionDTO.class);
return optionDTOS;
}
private List<BaseTreeNode> getCaseReviewModuleTreeNode(String projectId, String reviewId) throws Exception { private List<BaseTreeNode> getCaseReviewModuleTreeNode(String projectId, String reviewId) throws Exception {
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get(URL_MODULE_TREE+"/"+projectId+"/"+reviewId).header(SessionConstants.HEADER_TOKEN, sessionId) MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get(URL_MODULE_TREE+"/"+projectId+"/"+reviewId).header(SessionConstants.HEADER_TOKEN, sessionId)
.header(SessionConstants.CSRF_TOKEN, csrfToken) .header(SessionConstants.CSRF_TOKEN, csrfToken)

View File

@ -59,11 +59,12 @@ VALUES ('wx_test_1', 'wx_review_id_1', 'wx_case_id_1', 'PASS', 1698058347559,'ad
INSERT INTO case_review_functional_case_user(case_id, review_id, user_id) INSERT INTO case_review_functional_case_user(case_id, review_id, user_id)
VALUES ('wx_case_id_1', 'wx_review_id_1', 'admin'), VALUES ('wx_case_id_1', 'wx_review_id_1', 'admin'),
('wx_case_id_1', 'wx_review_id_1', 'gyq'), ('wx_case_id_1', 'wx_review_id_1', 'gyq_case_review'),
('wx_test_1', 'wx_review_id_1', 'admin'), ('wx_test_1', 'wx_review_id_1', 'admin'),
('gyq_review_case_id_3', 'wx_review_id_1', 'admin'), ('gyq_review_case_id_3', 'wx_review_id_1', 'admin'),
('gyq_case_id_4', 'wx_review_id_1', 'admin'), ('gyq_case_id_4', 'wx_review_id_1', 'admin'),
('gyq_case_id_5', 'wx_review_id_1', 'gyq'), ('gyq_case_id_5', 'wx_review_id_1', 'gyq_case_review'),
('gyq_case_id_5', 'wx_review_id_1', 'GGG'),
('wx_case_id_3', 'wx_review_id_3', 'admin'), ('wx_case_id_3', 'wx_review_id_3', 'admin'),
('wx_case_id_4', 'wx_review_id_4', 'admin'), ('wx_case_id_4', 'wx_review_id_4', 'admin'),
('wx_case_id_1', 'wx_review_id_4', '123'), ('wx_case_id_1', 'wx_review_id_4', '123'),
@ -78,11 +79,18 @@ INSERT INTO case_review_module(id, project_id, name, parent_id, pos, create_time
INSERT INTO functional_case_module(id, project_id, name, parent_id, pos, create_time, update_time, create_user, update_user) VALUES ('TEST_MODULE_ID', 'wx_test_project', '测试所属模块', 'NONE', 0, 1669174143999, 1669174143999, 'admin', 'admin'); INSERT INTO functional_case_module(id, project_id, name, parent_id, pos, create_time, update_time, create_user, update_user) VALUES ('TEST_MODULE_ID', 'wx_test_project', '测试所属模块', 'NONE', 0, 1669174143999, 1669174143999, 'admin', 'admin');
INSERT INTO user(id, name, email, password, create_time, update_time, language, last_organization_id, phone, source,
last_project_id, create_user, update_user, deleted)
VALUES ('gyq_case_review', 'gyq_case_review', 'gyq_case_review_case@fit2cloud.com', MD5('metersphere'),UNIX_TIMESTAMP() * 1000,UNIX_TIMESTAMP() * 1000, NULL, NUll, '', 'LOCAL', NULL, 'admin', 'admin', false),
('GGG', 'GGG', 'GGG_case_review_case@metersphere.io', MD5('metersphere'), UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, NULL, NUll, '', 'LOCAL', NULL, 'admin', 'admin', false);
INSERT INTO case_review_history(id, review_id, case_id, content, status, deleted, notifier, create_user, create_time) INSERT INTO case_review_history(id, review_id, case_id, content, status, deleted, notifier, create_user, create_time)
VALUES ('wx_history', 'wx_review_id_3', 'wx_case_id_1', NULL, 'PASS', b'0', NULL, 'admin', 1669174143999), VALUES ('wx_history', 'wx_review_id_3', 'wx_case_id_1', NULL, 'PASS', b'0', NULL, 'admin', 1669174143999),
('wx_histor_1', 'wx_review_id_3', 'wx_case_id_1', NULL, 'PASS', b'0', NULL, 'admin', 1669174143999), ('wx_histor_1', 'wx_review_id_3', 'wx_case_id_1', NULL, 'PASS', b'0', NULL, 'admin', 1669174143999),
('wx_history_2', 'wx_review_id_3', 'wx_case_id_3', NULL, 'PASS', b'0', NULL, 'admin', 1669174143999), ('wx_history_2', 'wx_review_id_3', 'wx_case_id_3', NULL, 'PASS', b'0', NULL, 'admin', 1669174143999),
('wx_history_3', 'wx_review_id_4', 'wx_case_id_4', NULL, 'PASS', b'0', NULL, 'A', 1669174143999), ('wx_history_3', 'wx_review_id_4', 'wx_case_id_4', NULL, 'PASS', b'0', NULL, 'A', 1669174143999),
('wx_history_4', 'wx_review_id_4', 'wx_case_id_1', NULL, 'PASS', b'0', NULL, 'admin', 1669174143999), ('wx_history_4', 'wx_review_id_4', 'wx_case_id_1', NULL, 'PASS', b'0', NULL, 'admin', 1669174143999),
('wx_history_5', 'wx_review_id_4', 'wx_case_id_2', NULL, 'UN_PASS', b'0', NULL, 'admin', 1669174143999); ('wx_history_5', 'wx_review_id_4', 'wx_case_id_2', NULL, 'UN_PASS', b'0', NULL, 'admin', 1669174143999),
('wx_history_6', 'wx_review_id_1', 'gyq_case_id_5', NULL, 'PASS', b'0', NULL, 'gyq_case_review', 1669174143999),
('wx_history_7', 'wx_review_id_1', 'gyq_case_id_5', NULL, 'UN_PASS', b'0', NULL, 'GGG', 1669174143999);