diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/controller/definition/ApiReportController.java b/backend/services/api-test/src/main/java/io/metersphere/api/controller/definition/ApiReportController.java index 8845e88fa3..32c55daf54 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/controller/definition/ApiReportController.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/controller/definition/ApiReportController.java @@ -137,7 +137,8 @@ public class ApiReportController { @GetMapping("/task-report/{id}") @Operation(summary = "系统-任务中心-接口用例执行任务详情-查看") - @RequiresPermissions(PermissionConstants.SYSTEM_CASE_TASK_CENTER_READ) + @RequiresPermissions(value = {PermissionConstants.SYSTEM_CASE_TASK_CENTER_READ, + PermissionConstants.ORGANIZATION_CASE_TASK_CENTER_READ, PermissionConstants.PROJECT_CASE_TASK_CENTER_READ}, logical = Logical.OR) public List viewCaseItemReport(@PathVariable String id) { return apiReportService.viewCaseTaskItemReport(id); } diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/controller/scenario/ApiScenarioReportController.java b/backend/services/api-test/src/main/java/io/metersphere/api/controller/scenario/ApiScenarioReportController.java index 44cfc55321..ca77372eda 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/controller/scenario/ApiScenarioReportController.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/controller/scenario/ApiScenarioReportController.java @@ -3,7 +3,6 @@ package io.metersphere.api.controller.scenario; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import io.metersphere.api.dto.definition.ApiReportBatchRequest; -import io.metersphere.api.dto.definition.ApiReportDetailDTO; import io.metersphere.api.dto.definition.ApiReportPageRequest; import io.metersphere.api.dto.report.ApiScenarioReportListDTO; import io.metersphere.api.dto.scenario.ApiScenarioReportDTO; @@ -138,14 +137,16 @@ public class ApiScenarioReportController { @GetMapping("/task-step/{id}") @Operation(summary = "系统-任务中心-场景用例执行任务详情-查看(任务步骤)") - @RequiresPermissions(PermissionConstants.SYSTEM_CASE_TASK_CENTER_READ) + @RequiresPermissions(value = {PermissionConstants.SYSTEM_CASE_TASK_CENTER_READ, + PermissionConstants.ORGANIZATION_CASE_TASK_CENTER_READ, PermissionConstants.PROJECT_CASE_TASK_CENTER_READ}, logical = Logical.OR) public ApiScenarioReportDTO viewScenarioItemReport(@PathVariable String id) { return apiScenarioReportService.viewScenarioItemReport(id); } @GetMapping("/task-report/{reportId}/{stepId}") @Operation(summary = "系统-任务中心-场景用例执行任务详情-查看(步骤结果)") - @RequiresPermissions(PermissionConstants.SYSTEM_CASE_TASK_CENTER_READ) + @RequiresPermissions(value = {PermissionConstants.SYSTEM_CASE_TASK_CENTER_READ, + PermissionConstants.ORGANIZATION_CASE_TASK_CENTER_READ, PermissionConstants.PROJECT_CASE_TASK_CENTER_READ}, logical = Logical.OR) public List getScenarioReportDetail(@PathVariable String reportId, @PathVariable String stepId) { return apiScenarioReportService.getDetail(reportId, stepId); diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiReportService.java b/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiReportService.java index b650ac01a4..0d9cfdc9c5 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiReportService.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiReportService.java @@ -16,8 +16,10 @@ import io.metersphere.sdk.util.BeanUtils; import io.metersphere.sdk.util.SubListUtils; import io.metersphere.sdk.util.Translator; import io.metersphere.system.domain.ExecTask; +import io.metersphere.system.domain.ExecTaskItem; import io.metersphere.system.domain.TestResourcePool; import io.metersphere.system.domain.User; +import io.metersphere.system.mapper.ExecTaskItemMapper; import io.metersphere.system.mapper.ExtExecTaskMapper; import io.metersphere.system.mapper.TestResourcePoolMapper; import io.metersphere.system.mapper.UserMapper; @@ -73,6 +75,8 @@ public class ApiReportService { private ApiReportStepMapper apiReportStepMapper; @Resource private ExtExecTaskMapper extExecTaskMapper; + @Resource + private ExecTaskItemMapper execTaskItemMapper; @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) public void insertApiReport(ApiReport report) { @@ -323,9 +327,10 @@ public class ApiReportService { List taskList = extExecTaskMapper.selectTypeByItemId(id); if (CollectionUtils.isNotEmpty(taskList)) { - if (taskList.getFirst().getIntegrated()) { - //集合报告 TODO - return new ArrayList<>(); + ExecTask task = taskList.getFirst(); + if (task.getIntegrated()) { + //集合报告 + return getIntegratedItemDetail(id, task.getId()); } else { //非集合报告 return reportDetail(id); @@ -334,6 +339,15 @@ public class ApiReportService { return new ArrayList<>(); } + private List getIntegratedItemDetail(String taskItemId, String taskId) { + ExecTaskItem taskItem = execTaskItemMapper.selectByPrimaryKey(taskItemId); + ApiReportRelateTaskExample example = new ApiReportRelateTaskExample(); + example.createCriteria().andTaskResourceIdEqualTo(taskId); + List apiReportRelateTasks = apiReportRelateTaskMapper.selectByExample(example); + String reportId = apiReportRelateTasks.getFirst().getReportId(); + return getDetail(reportId, taskItem.getResourceId()); + } + private List reportDetail(String id) { List list = new ArrayList<>(); ApiReportRelateTaskExample example = new ApiReportRelateTaskExample(); diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/service/scenario/ApiScenarioReportService.java b/backend/services/api-test/src/main/java/io/metersphere/api/service/scenario/ApiScenarioReportService.java index fe192def58..a609450145 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/service/scenario/ApiScenarioReportService.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/service/scenario/ApiScenarioReportService.java @@ -3,7 +3,6 @@ package io.metersphere.api.service.scenario; import io.metersphere.api.constants.ApiScenarioStepType; import io.metersphere.api.domain.*; import io.metersphere.api.dto.definition.ApiReportBatchRequest; -import io.metersphere.api.dto.definition.ApiReportDetailDTO; import io.metersphere.api.dto.definition.ApiReportPageRequest; import io.metersphere.api.dto.report.ApiScenarioReportListDTO; import io.metersphere.api.dto.scenario.ApiScenarioReportDTO; @@ -20,8 +19,10 @@ import io.metersphere.sdk.util.BeanUtils; import io.metersphere.sdk.util.SubListUtils; import io.metersphere.sdk.util.Translator; import io.metersphere.system.domain.ExecTask; +import io.metersphere.system.domain.ExecTaskItem; import io.metersphere.system.domain.TestResourcePool; import io.metersphere.system.domain.User; +import io.metersphere.system.mapper.ExecTaskItemMapper; import io.metersphere.system.mapper.ExtExecTaskMapper; import io.metersphere.system.mapper.TestResourcePoolMapper; import io.metersphere.system.mapper.UserMapper; @@ -78,6 +79,8 @@ public class ApiScenarioReportService { private static final int BATCH_SIZE = 1000; @Resource private ExtExecTaskMapper extExecTaskMapper; + @Resource + private ExecTaskItemMapper execTaskItemMapper; @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) public void insertApiScenarioReport(ApiScenarioReport report, ApiReportRelateTask taskRelation) { @@ -451,8 +454,8 @@ public class ApiScenarioReportService { if (CollectionUtils.isNotEmpty(taskList)) { if (taskList.getFirst().getIntegrated()) { - //场景集合报告 TODO - return new ApiScenarioReportDTO(); + //场景集合报告 + return getScenarioReportDetail(id, taskList.getFirst().getId()); } else { //场景非集合报告 return scenarioReportDetail(id); @@ -461,6 +464,15 @@ public class ApiScenarioReportService { return new ApiScenarioReportDTO(); } + private ApiScenarioReportDTO getScenarioReportDetail(String taskId, String taskItemId) { + ExecTaskItem taskItem = execTaskItemMapper.selectByPrimaryKey(taskItemId); + ApiScenarioReportDTO apiScenarioReportDTO = scenarioReportDetail(taskId); + List list = apiScenarioReportDTO.getChildren().stream() + .filter(step -> StringUtils.equals(step.getStepId(), taskItem.getResourceId())).toList(); + apiScenarioReportDTO.setChildren(list); + return apiScenarioReportDTO; + } + private ApiScenarioReportDTO scenarioReportDetail(String id) { ApiReportRelateTaskExample example = new ApiReportRelateTaskExample(); example.createCriteria().andTaskResourceIdEqualTo(id); diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtExecTaskMapper.xml b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtExecTaskMapper.xml index 8b1d26e034..d1316429f9 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtExecTaskMapper.xml +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtExecTaskMapper.xml @@ -121,6 +121,6 @@ \ No newline at end of file diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/service/BaseTaskHubService.java b/backend/services/system-setting/src/main/java/io/metersphere/system/service/BaseTaskHubService.java index f73fcde49b..2355e4c27e 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/service/BaseTaskHubService.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/service/BaseTaskHubService.java @@ -46,6 +46,7 @@ import io.metersphere.system.utils.Pager; import io.metersphere.system.utils.TaskRunnerClient; import jakarta.annotation.Resource; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; @@ -153,18 +154,15 @@ public class BaseTaskHubService { List projectIds = list.stream().map(TaskHubDTO::getProjectId).distinct().toList(); List organizationIds = list.stream().map(TaskHubDTO::getOrganizationId).distinct().toList(); List userIds = list.stream().map(TaskHubDTO::getCreateUser).distinct().toList(); - List taskIds = list.stream().map(TaskHubDTO::getId).distinct().toList(); Map projectMaps = getProjectMaps(projectIds); Map organizationMaps = getOrganizationMaps(organizationIds); Map userMaps = getUserMaps(userIds); - Map taskReportMap = getTaskReportMap(taskIds); list.forEach(item -> { item.setProjectName(projectMaps.getOrDefault(item.getProjectId(), StringUtils.EMPTY)); item.setOrganizationName(organizationMaps.getOrDefault(item.getOrganizationId(), StringUtils.EMPTY)); item.setCreateUserName(userMaps.getOrDefault(item.getCreateUser(), StringUtils.EMPTY)); - item.setReportId(taskReportMap.getOrDefault(item.getId(), StringUtils.EMPTY)); }); - + setTaskReportId(list); } private Map getUserMaps(List userIds) { @@ -189,16 +187,40 @@ public class BaseTaskHubService { } /** - * 获取任务的报告集合 - * - * @param taskIds 任务ID集合 - * @return 报告集合 + * 设置任务的报告ID + * @param tasks 任务集合 */ - private Map getTaskReportMap(List taskIds) { + private void setTaskReportId(List tasks) { + List reportTasks = tasks.stream().filter(task -> !StringUtils.equals(task.getTaskType(), ExecTaskType.API_SCENARIO_BATCH.name()) && + !StringUtils.equals(task.getTaskType(), ExecTaskType.API_CASE_BATCH.name())).toList(); + List integratedTaskIds = reportTasks.stream().filter(task -> + StringUtils.equalsAny(task.getTaskType(), ExecTaskType.TEST_PLAN.name(), ExecTaskType.TEST_PLAN_GROUP.name()) || task.getIntegrated()).map(ExecTask::getId).toList(); + List noIntegratedTasks = reportTasks.stream().map(ExecTask::getId).filter(id -> !integratedTaskIds.contains(id)).toList(); + List taskItems = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(noIntegratedTasks)) { + ExecTaskItemExample itemExample = new ExecTaskItemExample(); + itemExample.createCriteria().andTaskIdIn(noIntegratedTasks); + taskItems = execTaskItemMapper.selectByExample(itemExample); + } + Map taskItemMap = taskItems.stream().collect(Collectors.toMap(ExecTaskItem::getTaskId, ExecTaskItem::getId)); + List noIntegratedTaskItemIds = taskItems.stream().map(ExecTaskItem::getId).toList(); + List resourceIds = ListUtils.union(integratedTaskIds, noIntegratedTaskItemIds); + if (CollectionUtils.isEmpty(resourceIds)) { + return; + } ApiReportRelateTaskExample example = new ApiReportRelateTaskExample(); - example.createCriteria().andTaskResourceIdIn(taskIds); + example.createCriteria().andTaskResourceIdIn(resourceIds); List reportRelateTasks = apiReportRelateTaskMapper.selectByExample(example); - return reportRelateTasks.stream().collect(Collectors.toMap(ApiReportRelateTask::getTaskResourceId, ApiReportRelateTask::getReportId)); + Map reportMap = reportRelateTasks.stream().collect(Collectors.toMap(ApiReportRelateTask::getTaskResourceId, ApiReportRelateTask::getReportId)); + reportTasks.forEach(task -> { + if (integratedTaskIds.contains(task.getId())) { + task.setReportId(reportMap.get(task.getId())); + } else { + if (taskItemMap.containsKey(task.getId())) { + task.setReportId(reportMap.get(taskItemMap.get(task.getId()))); + } + } + }); }