diff --git a/backend/src/main/java/io/metersphere/api/dto/automation/ExecuteType.java b/backend/src/main/java/io/metersphere/api/dto/automation/ExecuteType.java index 3bf85b3416..f72e53dca1 100644 --- a/backend/src/main/java/io/metersphere/api/dto/automation/ExecuteType.java +++ b/backend/src/main/java/io/metersphere/api/dto/automation/ExecuteType.java @@ -1,5 +1,5 @@ package io.metersphere.api.dto.automation; public enum ExecuteType { - Saved, Completed, Debug, Marge, Deleted + Saved, Completed, Debug, Marge } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java index ce2fea1d0e..c3f66aba4d 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java @@ -31,7 +31,7 @@ import io.metersphere.service.SystemParameterService; import io.metersphere.service.UserService; import io.metersphere.track.dto.PlanReportCaseDTO; import io.metersphere.utils.LoggerUtil; -import io.metersphere.xpack.ui.service.UiScenarioReportStructureService; +import io.metersphere.xmind.utils.FileUtil; import org.apache.commons.beanutils.BeanMap; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; @@ -44,6 +44,7 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.io.File; import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; import java.util.*; @@ -91,8 +92,6 @@ public class ApiScenarioReportService { private UiReportServiceProxy uiReportServiceProxy; @Resource private ExtApiScenarioReportResultMapper extApiScenarioReportResultMapper; - @Resource - private UiScenarioReportStructureService uiScenarioReportStructureService; public void saveResult(ResultDTO dto) { // 报告详情内容 @@ -638,7 +637,7 @@ public class ApiScenarioReportService { // 为 UI 类型报告,需要删除报告产生的截图 List ids = new ArrayList<>(); ids.add(request.getId()); - uiScenarioReportStructureService.cleanUpReport(ids); + this.cleanUpUiReportImg(ids); } // 补充逻辑,如果是集成报告则把零时报告全部删除 @@ -761,7 +760,7 @@ public class ApiScenarioReportService { if(!BooleanUtils.isNotTrue(reportRequest.getIsUi())){ // 为 UI 类型报告,需要删除报告产生的截图 - uiScenarioReportStructureService.cleanUpReport(ids); + this.cleanUpUiReportImg(ids); } //处理最后剩余的数据 @@ -1006,4 +1005,14 @@ public class ApiScenarioReportService { public RequestResult selectReportContent(String stepId) { return apiScenarioReportStructureService.selectReportContent(stepId); } + + public void cleanUpUiReportImg(List ids){ + if(ids != null && CollectionUtils.isNotEmpty(ids)){ + for(String id : ids){ + if(FileUtil.deleteDir(new File(FileUtils.UI_IMAGE_DIR + "/" + id))){ + LogUtil.info("删除 UI 报告截图成功,报告 ID 为 :" + id); + } + } + } + } } diff --git a/backend/src/main/java/io/metersphere/job/sechedule/CleanUpReportJob.java b/backend/src/main/java/io/metersphere/job/sechedule/CleanUpReportJob.java index 3a336766e2..58206c8a6d 100644 --- a/backend/src/main/java/io/metersphere/job/sechedule/CleanUpReportJob.java +++ b/backend/src/main/java/io/metersphere/job/sechedule/CleanUpReportJob.java @@ -56,7 +56,7 @@ public class CleanUpReportJob extends MsScheduleJob { this.doCleanUp(projectService::cleanUpLoadReport, config.getCleanLoadReportExpr()); } // 定时删除 UI 调试模式生成的截图 - uiScenarioReportStructureService.cleanUpReport(null); + projectService.cleanUpUiReportImg(); } catch (Exception e) { LogUtil.error("clean up report error."); LogUtil.error(e.getMessage(), e); diff --git a/backend/src/main/java/io/metersphere/service/ProjectService.java b/backend/src/main/java/io/metersphere/service/ProjectService.java index 2e70fc3c08..cea038135a 100644 --- a/backend/src/main/java/io/metersphere/service/ProjectService.java +++ b/backend/src/main/java/io/metersphere/service/ProjectService.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.core.JsonProcessingException; import io.metersphere.api.dto.DeleteAPITestRequest; import io.metersphere.api.dto.QueryAPITestRequest; +import io.metersphere.api.dto.automation.ExecuteType; import io.metersphere.api.service.*; import io.metersphere.api.tcp.TCPPool; import io.metersphere.base.domain.*; @@ -37,6 +38,7 @@ import io.metersphere.track.service.TestCaseService; import io.metersphere.track.service.TestPlanProjectService; import io.metersphere.track.service.TestPlanReportService; import io.metersphere.track.service.TestPlanService; +import io.metersphere.xmind.utils.FileUtil; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; @@ -47,6 +49,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.File; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @@ -114,6 +117,14 @@ public class ProjectService { ExtModuleNodeMapper extModuleNodeMapper; @Resource ApiModuleMapper apiModuleMapper; + @Resource + private ApiScenarioReportMapper apiScenarioReportMapper; + @Resource + private ApiScenarioReportDetailMapper apiScenarioReportDetailMapper; + @Resource + private ApiScenarioReportStructureMapper apiScenarioReportStructureMapper; + @Resource + private ApiScenarioReportResultMapper apiScenarioReportResultMapper; public Project addProject(AddProjectRequest project) { if (StringUtils.isBlank(project.getName())) { @@ -1016,6 +1027,35 @@ public class ProjectService { performanceReportService.cleanUpReport(time, projectId); } + // 删除 UI 报告产生的截图 + public void cleanUpUiReportImg(){ + // 属于定时任务删除调试报告情况 + // 获取昨天的当前时间 + Date backupTime = org.apache.commons.lang3.time.DateUtils.addDays(new Date(), -1); + // 清理类型为 UI 报告类型,且时间为昨天之前的 UI 调试类型报告截图 + ApiScenarioReportExample example = new ApiScenarioReportExample(); + example.createCriteria().andCreateTimeLessThan(backupTime.getTime()).andReportTypeEqualTo(ReportTypeConstants.UI_INDEPENDENT.name()) + .andExecuteTypeEqualTo(ExecuteType.Debug.name()); + List apiScenarioReports = apiScenarioReportMapper.selectByExample(example); + // 删除调试报告的截图 + for(ApiScenarioReport apiScenarioReport : apiScenarioReports){ + if(FileUtil.deleteDir(new File(FileUtils.UI_IMAGE_DIR + "/" + apiScenarioReport.getId()))){ + LogUtil.info("删除 UI 调试报告截图成功,报告 ID 为 :" + apiScenarioReport.getId()); + + // 删除调试报告 + ApiScenarioReportResultExample resultExample = new ApiScenarioReportResultExample(); + resultExample.createCriteria().andReportIdEqualTo(apiScenarioReport.getId()); + ApiScenarioReportStructureExample structureExample = new ApiScenarioReportStructureExample(); + structureExample.createCriteria().andReportIdEqualTo(apiScenarioReport.getId()); + + apiScenarioReportDetailMapper.deleteByPrimaryKey(apiScenarioReport.getId()); + apiScenarioReportResultMapper.deleteByExample(resultExample); + apiScenarioReportStructureMapper.deleteByExample(structureExample); + apiScenarioReportMapper.deleteByPrimaryKey(apiScenarioReport.getId()); + } + } + } + public void checkProjectIsRepeatable(String projectId) { Project project = this.getProjectById(projectId); if (project == null) {