diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/controller/TestPlanController.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/controller/TestPlanController.java index 402554cf58..5d9ae9d4be 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/controller/TestPlanController.java +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/controller/TestPlanController.java @@ -1,8 +1,11 @@ package io.metersphere.plan.controller; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; import io.metersphere.api.service.scenario.ApiScenarioLogService; import io.metersphere.plan.constants.TestPlanResourceConfig; import io.metersphere.plan.domain.TestPlan; +import io.metersphere.plan.dto.TestPlanExecuteHisDTO; import io.metersphere.plan.dto.request.*; import io.metersphere.plan.dto.response.TestPlanDetailResponse; import io.metersphere.plan.dto.response.TestPlanOperationResponse; @@ -19,6 +22,7 @@ import io.metersphere.system.log.constants.OperationLogType; import io.metersphere.system.notice.annotation.SendNotice; import io.metersphere.system.notice.constants.NoticeConstants; import io.metersphere.system.security.CheckOwner; +import io.metersphere.system.utils.PageUtils; import io.metersphere.system.utils.Pager; import io.metersphere.system.utils.SessionUtils; import io.swagger.v3.oas.annotations.Operation; @@ -27,6 +31,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.constraints.NotBlank; +import org.apache.commons.collections4.MapUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -251,4 +256,14 @@ public class TestPlanController { testPlanManagementService.checkModuleIsOpen(testPlanId, TestPlanResourceConfig.CHECK_TYPE_TEST_PLAN, Collections.singletonList(TestPlanResourceConfig.CONFIG_TEST_PLAN)); testPlanService.deleteScheduleConfig(testPlanId); } + + @PostMapping(value = "/his/page") + @Operation(summary = "测试计划-执行历史-列表分页查询") + @RequiresPermissions(PermissionConstants.TEST_PLAN_READ) + @CheckOwner(resourceId = "#request.getPlanId()", resourceType = "test_plan") + public Pager> pageHis(@Validated TestPlanExecuteHisPageRequest request) { + Page page = PageHelper.startPage(request.getCurrent(), request.getPageSize(), + MapUtils.isEmpty(request.getSort()) ? "tpr.create_time desc" : request.getSortString()); + return PageUtils.setPageInfo(page, testPlanService.listHis(request)); + } } diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/TestPlanExecuteHisDTO.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/TestPlanExecuteHisDTO.java new file mode 100644 index 0000000000..2994344f33 --- /dev/null +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/TestPlanExecuteHisDTO.java @@ -0,0 +1,25 @@ +package io.metersphere.plan.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class TestPlanExecuteHisDTO { + + @Schema(description = "执行结果ID") + private String id; + @Schema(description = "序号") + private String num; + @Schema(description = "执行方式") + private String triggerMode; + @Schema(description = "执行状态") + private String execStatus; + @Schema(description = "操作人") + private String createUser; + @Schema(description = "执行起始时间") + private Long startTime; + @Schema(description = "执行结束时间") + private Long endTime; + @Schema(description = "报告是否删除") + private Boolean deleted; +} diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/request/TestPlanExecuteHisPageRequest.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/request/TestPlanExecuteHisPageRequest.java new file mode 100644 index 0000000000..00e0cc9b08 --- /dev/null +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/dto/request/TestPlanExecuteHisPageRequest.java @@ -0,0 +1,12 @@ +package io.metersphere.plan.dto.request; + +import io.metersphere.system.dto.sdk.BasePageRequest; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class TestPlanExecuteHisPageRequest extends BasePageRequest { + + @Schema(description = "测试计划ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String planId; +} diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanMapper.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanMapper.java index e81ea5e221..b00e1c0a83 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanMapper.java +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanMapper.java @@ -1,8 +1,10 @@ package io.metersphere.plan.mapper; import io.metersphere.plan.domain.TestPlan; +import io.metersphere.plan.dto.TestPlanExecuteHisDTO; import io.metersphere.plan.dto.TestPlanQueryConditions; import io.metersphere.plan.dto.request.TestPlanBatchProcessRequest; +import io.metersphere.plan.dto.request.TestPlanExecuteHisPageRequest; import io.metersphere.plan.dto.request.TestPlanTableRequest; import io.metersphere.plan.dto.response.TestPlanResponse; import io.metersphere.project.dto.DropNode; @@ -52,4 +54,6 @@ public interface ExtTestPlanMapper { List selectByGroupIds(@Param("groupIds") List groupIds); List selectRightfulIdsForExecute(@Param("ids") List ids); + + List listHis(@Param("request")TestPlanExecuteHisPageRequest request); } diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanMapper.xml b/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanMapper.xml index c45a828f9f..4bb84abae9 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanMapper.xml +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/mapper/ExtTestPlanMapper.xml @@ -460,6 +460,13 @@ AND status != 'ARCHIVED' + + update test_plan @@ -479,4 +486,20 @@ and project_id = #{testPlan.projectId} + + + + + + + + + and tpr.exec_status in + + + + + + + \ No newline at end of file diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanService.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanService.java index 9ff5e9c87a..a43be83e4e 100644 --- a/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanService.java +++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/service/TestPlanService.java @@ -2,6 +2,7 @@ package io.metersphere.plan.service; import io.metersphere.plan.domain.*; import io.metersphere.plan.dto.TestPlanCollectionDTO; +import io.metersphere.plan.dto.TestPlanExecuteHisDTO; import io.metersphere.plan.dto.request.*; import io.metersphere.plan.dto.response.TestPlanDetailResponse; import io.metersphere.plan.dto.response.TestPlanOperationResponse; @@ -20,8 +21,10 @@ import io.metersphere.system.domain.User; import io.metersphere.system.dto.LogInsertModule; import io.metersphere.system.dto.request.ScheduleConfig; import io.metersphere.system.dto.request.schedule.BaseScheduleConfigRequest; +import io.metersphere.system.dto.sdk.OptionDTO; import io.metersphere.system.dto.sdk.request.PosRequest; import io.metersphere.system.log.constants.OperationLogType; +import io.metersphere.system.mapper.BaseUserMapper; import io.metersphere.system.mapper.ScheduleMapper; import io.metersphere.system.mapper.TestPlanModuleMapper; import io.metersphere.system.mapper.UserMapper; @@ -57,6 +60,8 @@ public class TestPlanService extends TestPlanBaseUtilsService { @Resource private ExtTestPlanMapper extTestPlanMapper; @Resource + private BaseUserMapper baseUserMapper; + @Resource private TestPlanGroupService testPlanGroupService; @Resource private TestPlanConfigMapper testPlanConfigMapper; @@ -826,6 +831,20 @@ public class TestPlanService extends TestPlanBaseUtilsService { scheduleService.deleteByResourceId(testPlanId, TestPlanScheduleJob.getJobKey(testPlanId), TestPlanScheduleJob.getTriggerKey(testPlanId)); } + public List listHis(TestPlanExecuteHisPageRequest request) { + List hisList = extTestPlanMapper.listHis(request); + if (CollectionUtils.isEmpty(hisList)) { + return new ArrayList<>(); + } + List userIds = hisList.stream().map(TestPlanExecuteHisDTO::getCreateUser).distinct().toList(); + List userOptions = baseUserMapper.selectUserOptionByIds(userIds); + Map userMap = userOptions.stream().collect(Collectors.toMap(OptionDTO::getId, OptionDTO::getName)); + hisList.forEach(his -> { + his.setCreateUser(userMap.getOrDefault(his.getCreateUser(), his.getCreateUser())); + }); + return hisList; + } + public List selectRightfulIds(List executeIds) { return extTestPlanMapper.selectNotArchivedIds(executeIds); }