feat(工作台): 补充待办测试计划列表接口功能

--task=1016866 --user=宋昌昌 我的工作台-我创建&关注&待办-后端 https://www.tapd.cn/55049933/s/1607311
This commit is contained in:
song-cc-rock 2024-11-08 18:58:36 +08:00 committed by Craftsman
parent 5906472833
commit 5e8362e0c8
5 changed files with 74 additions and 1 deletions

View File

@ -8,6 +8,9 @@ import io.metersphere.bug.service.BugService;
import io.metersphere.functional.dto.CaseReviewDTO; import io.metersphere.functional.dto.CaseReviewDTO;
import io.metersphere.functional.request.CaseReviewPageRequest; import io.metersphere.functional.request.CaseReviewPageRequest;
import io.metersphere.functional.service.CaseReviewService; import io.metersphere.functional.service.CaseReviewService;
import io.metersphere.plan.dto.request.TestPlanTableRequest;
import io.metersphere.plan.dto.response.TestPlanResponse;
import io.metersphere.plan.service.TestPlanManagementService;
import io.metersphere.system.security.CheckOwner; import io.metersphere.system.security.CheckOwner;
import io.metersphere.system.utils.PageUtils; import io.metersphere.system.utils.PageUtils;
import io.metersphere.system.utils.Pager; import io.metersphere.system.utils.Pager;
@ -37,6 +40,17 @@ public class ToDoController {
private CaseReviewService caseReviewService; private CaseReviewService caseReviewService;
@Resource @Resource
private BugService bugService; private BugService bugService;
@Resource
private TestPlanManagementService testPlanManagementService;
@PostMapping("/plan/page")
@Operation(summary = "我的待办-测试计划-列表分页查询")
@CheckOwner(resourceId = "#request.getProjectId()", resourceType = "project")
public Pager<List<TestPlanResponse>> planPage(@Validated @RequestBody TestPlanTableRequest request) {
request.setMyTodo(true);
request.setMyTodoUserId(SessionUtils.getUserId());
return testPlanManagementService.page(request);
}
@PostMapping("/review/page") @PostMapping("/review/page")
@Operation(summary = "我的待办-用例评审-列表分页查询") @Operation(summary = "我的待办-用例评审-列表分页查询")

View File

@ -2,6 +2,7 @@ package io.metersphere.dashboard.controller;
import io.metersphere.bug.dto.request.BugPageRequest; import io.metersphere.bug.dto.request.BugPageRequest;
import io.metersphere.functional.request.CaseReviewPageRequest; import io.metersphere.functional.request.CaseReviewPageRequest;
import io.metersphere.plan.dto.request.TestPlanTableRequest;
import io.metersphere.system.base.BaseTest; import io.metersphere.system.base.BaseTest;
import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Order;
@ -17,6 +18,7 @@ import java.util.Map;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ToDoControllerTests extends BaseTest { public class ToDoControllerTests extends BaseTest {
private static final String PLAN_PAGE = "/plan/page";
private static final String REVIEW_PAGE = "/review/page"; private static final String REVIEW_PAGE = "/review/page";
private static final String BUG_PAGE = "/bug/page"; private static final String BUG_PAGE = "/bug/page";
@ -25,6 +27,19 @@ public class ToDoControllerTests extends BaseTest {
return "/dashboard/todo"; return "/dashboard/todo";
} }
@Test
@Order(0)
void plan() throws Exception{
TestPlanTableRequest request = new TestPlanTableRequest();
request.setProjectId(DEFAULT_PROJECT_ID);
request.setCurrent(1);
request.setPageSize(10);
request.setType("ALL");
this.requestPostWithOk(PLAN_PAGE, request);
request.setSort(Map.of("id", "desc"));
this.requestPostWithOk(PLAN_PAGE, request);
}
@Test @Test
@Order(1) @Order(1)
void review() throws Exception{ void review() throws Exception{

View File

@ -30,6 +30,15 @@ public class TestPlanTableRequest extends BasePageRequest {
private List<String> innerIds; private List<String> innerIds;
private List<String> combineInnerIds; private List<String> combineInnerIds;
@Schema(description = "是否我的待办, 默认查询全部")
private boolean myTodo = false;
@Schema(description = "我的待办用户ID, 组合使用: myTodo=true, myTodoUserId=xxx")
private String myTodoUserId;
@Schema(description = "已办的测试计划ID集合 (用作待办排除)")
private List<String> doneExcludeIds;
public String getSortString() { public String getSortString() {
if (StringUtils.isEmpty(super.getSortString())) { if (StringUtils.isEmpty(super.getSortString())) {
return "t.update_time desc"; return "t.update_time desc";

View File

@ -91,7 +91,20 @@
</select> </select>
<sql id="queryByTableRequest"> <sql id="queryByTableRequest">
<include refid="baseConditionQuery"/> <if test="request.myTodo">
<!-- 待办: 查询创建人为我的所有的计划 -->
and t.type = 'TEST_PLAN'
and t.create_user = #{request.myTodoUserId}
<if test="request.doneExcludeIds != null and request.doneExcludeIds.size() > 0">
and t.id not in
<foreach collection="request.doneExcludeIds" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</if>
</if>
<if test="!request.myTodo">
<include refid="baseConditionQuery"/>
</if>
<if test="request.keyword != null and request.keyword != ''"> <if test="request.keyword != null and request.keyword != ''">
and ( and (

View File

@ -9,6 +9,7 @@ import io.metersphere.plan.dto.TestPlanGroupCountDTO;
import io.metersphere.plan.dto.TestPlanResourceExecResultDTO; import io.metersphere.plan.dto.TestPlanResourceExecResultDTO;
import io.metersphere.plan.dto.request.TestPlanTableRequest; import io.metersphere.plan.dto.request.TestPlanTableRequest;
import io.metersphere.plan.dto.response.TestPlanResponse; import io.metersphere.plan.dto.response.TestPlanResponse;
import io.metersphere.plan.dto.response.TestPlanStatisticsResponse;
import io.metersphere.plan.mapper.ExtTestPlanFunctionalCaseMapper; import io.metersphere.plan.mapper.ExtTestPlanFunctionalCaseMapper;
import io.metersphere.plan.mapper.ExtTestPlanMapper; import io.metersphere.plan.mapper.ExtTestPlanMapper;
import io.metersphere.plan.mapper.ExtTestPlanModuleMapper; import io.metersphere.plan.mapper.ExtTestPlanModuleMapper;
@ -73,6 +74,9 @@ public class TestPlanManagementService {
* 测试计划列表查询 * 测试计划列表查询
*/ */
public Pager<List<TestPlanResponse>> page(TestPlanTableRequest request) { public Pager<List<TestPlanResponse>> page(TestPlanTableRequest request) {
if (request.isMyTodo()) {
request.setDoneExcludeIds(this.getDoneIds(request.getProjectId()));
}
this.initDefaultFilter(request); this.initDefaultFilter(request);
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize(), Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize(),
MapUtils.isEmpty(request.getSort()) ? "t.pos desc, t.id desc" : request.getSortString("id", "t")); MapUtils.isEmpty(request.getSort()) ? "t.pos desc, t.id desc" : request.getSortString("id", "t"));
@ -311,4 +315,22 @@ public class TestPlanManagementService {
} }
return false; return false;
} }
/**
* 获取已完成且阈值达标的计划ID集合 (作为排除条件)
*
* @param projectId 项目ID
* @return 已办计划ID集合
*/
private List<String> getDoneIds(String projectId) {
List<String> completePlanOrGroupIds = selectTestPlanIdByProjectIdAndStatus(projectId, List.of((TestPlanConstants.TEST_PLAN_SHOW_STATUS_COMPLETED)));
if (CollectionUtils.isEmpty(completePlanOrGroupIds)) {
return null;
}
List<TestPlanStatisticsResponse> completePlanOrGroupWithStatistics = testPlanStatisticsService.calculateRate(completePlanOrGroupIds);
return completePlanOrGroupWithStatistics.stream()
.filter(plan -> plan.getPassRate() >= plan.getPassThreshold())
.map(TestPlanStatisticsResponse::getId).collect(Collectors.toList());
}
} }