From b7b33ad2bb8268aaed95523af3208c450db2c8eb Mon Sep 17 00:00:00 2001 From: chenjianxing Date: Mon, 25 May 2020 17:25:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=A1=B9=E7=9B=AE=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E5=B9=B6=E5=88=A0=E9=99=A4=E6=B5=8B=E8=AF=95=E8=B7=9F?= =?UTF-8?q?=E8=B8=AA=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/mapper/ext/ExtApiTestMapper.java | 2 + .../base/mapper/ext/ExtApiTestMapper.xml | 4 ++ .../base/mapper/ext/ExtLoadTestMapper.java | 2 + .../base/mapper/ext/ExtLoadTestMapper.xml | 4 ++ .../base/mapper/ext/ExtTestCaseMapper.java | 2 + .../base/mapper/ext/ExtTestCaseMapper.xml | 4 ++ .../base/mapper/ext/ExtTestPlanMapper.java | 2 + .../base/mapper/ext/ExtTestPlanMapper.xml | 4 ++ .../controller/ProjectController.java | 7 +++ .../dto/ProjectRelatedResourceDTO.java | 11 +++++ .../service/PerformanceTestService.java | 27 ++++++------ .../metersphere/service/ProjectService.java | 40 ++++++++++++++++- .../track/service/TestCaseService.java | 6 +++ .../business/components/project/MsProject.vue | 43 +++++++++++++++---- frontend/src/i18n/en-US.js | 1 + frontend/src/i18n/zh-CN.js | 3 +- frontend/src/i18n/zh-TW.js | 3 +- 17 files changed, 141 insertions(+), 24 deletions(-) create mode 100644 backend/src/main/java/io/metersphere/dto/ProjectRelatedResourceDTO.java diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestMapper.java index b3610d3e8e..a6bc7a0920 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestMapper.java @@ -8,4 +8,6 @@ import java.util.List; public interface ExtApiTestMapper { List list(@Param("request") QueryAPITestRequest request); + + Long countByProjectId(String projectId); } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestMapper.xml index c230d06235..7a50475391 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiTestMapper.xml @@ -29,5 +29,9 @@ order by api_test.update_time desc + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtLoadTestMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtLoadTestMapper.java index 8e380157c2..d1405a6b3f 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtLoadTestMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtLoadTestMapper.java @@ -8,4 +8,6 @@ import java.util.List; public interface ExtLoadTestMapper { List list(@Param("request") QueryTestPlanRequest params); + + Long countByProjectId(String projectId); } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtLoadTestMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtLoadTestMapper.xml index 98f40e9133..f3d685abef 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtLoadTestMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtLoadTestMapper.xml @@ -27,5 +27,9 @@ order by load_test.update_time desc + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java index a08cca5f97..d094467c2b 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java @@ -12,4 +12,6 @@ public interface ExtTestCaseMapper { List getTestCaseNames(@Param("request") QueryTestCaseRequest request); List list(@Param("request") QueryTestCaseRequest request); + + Long countByProjectId(String projectId); } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml index 32aa2cb719..7e00708bbf 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml @@ -53,4 +53,8 @@ + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanMapper.java index a72875174c..f1482c0ddb 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanMapper.java @@ -11,4 +11,6 @@ public interface ExtTestPlanMapper { List list(@Param("request") QueryTestPlanRequest params); List listRelate(@Param("request") QueryTestPlanRequest params); + + Long countByProjectId(String projectId); } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanMapper.xml index 9a4ee0949a..fd50b58016 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestPlanMapper.xml @@ -45,5 +45,9 @@ ) order by test_plan.update_time desc + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/controller/ProjectController.java b/backend/src/main/java/io/metersphere/controller/ProjectController.java index 85fbb1c343..8cd274d8d0 100644 --- a/backend/src/main/java/io/metersphere/controller/ProjectController.java +++ b/backend/src/main/java/io/metersphere/controller/ProjectController.java @@ -9,6 +9,7 @@ import io.metersphere.commons.utils.Pager; import io.metersphere.commons.utils.SessionUtils; import io.metersphere.controller.request.ProjectRequest; import io.metersphere.dto.ProjectDTO; +import io.metersphere.dto.ProjectRelatedResourceDTO; import io.metersphere.service.ProjectService; import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresRoles; @@ -71,4 +72,10 @@ public class ProjectController { public void updateProject(@RequestBody Project Project) { projectService.updateProject(Project); } + + @GetMapping("/related/resource/{projectId}") + @RequiresRoles(value = {RoleConstants.TEST_MANAGER, RoleConstants.TEST_USER}, logical = Logical.OR) + public ProjectRelatedResourceDTO getRelatedResource(@PathVariable String projectId) { + return projectService.getRelatedResource(projectId); + } } diff --git a/backend/src/main/java/io/metersphere/dto/ProjectRelatedResourceDTO.java b/backend/src/main/java/io/metersphere/dto/ProjectRelatedResourceDTO.java new file mode 100644 index 0000000000..2cedef1d44 --- /dev/null +++ b/backend/src/main/java/io/metersphere/dto/ProjectRelatedResourceDTO.java @@ -0,0 +1,11 @@ +package io.metersphere.dto; + +import lombok.Data; + +@Data +public class ProjectRelatedResourceDTO { + Long testCaseCount; + Long testPlanCount; + Long loadTestCount; + Long apiTestCount; +} diff --git a/backend/src/main/java/io/metersphere/performance/service/PerformanceTestService.java b/backend/src/main/java/io/metersphere/performance/service/PerformanceTestService.java index d81d4f2a91..75914f9a28 100644 --- a/backend/src/main/java/io/metersphere/performance/service/PerformanceTestService.java +++ b/backend/src/main/java/io/metersphere/performance/service/PerformanceTestService.java @@ -70,20 +70,23 @@ public class PerformanceTestService { LoadTestReportExample loadTestReportExample = new LoadTestReportExample(); loadTestReportExample.createCriteria().andTestIdEqualTo(testId); List loadTestReports = loadTestReportMapper.selectByExample(loadTestReportExample); - List reportIdList = loadTestReports.stream().map(LoadTestReport::getId).collect(Collectors.toList()); - // delete load_test_report_result - LoadTestReportResultExample loadTestReportResultExample = new LoadTestReportResultExample(); - loadTestReportResultExample.createCriteria().andReportIdIn(reportIdList); - loadTestReportResultMapper.deleteByExample(loadTestReportResultExample); + if (!loadTestReports.isEmpty()) { + List reportIdList = loadTestReports.stream().map(LoadTestReport::getId).collect(Collectors.toList()); - // delete load_test_report, delete load_test_report_detail - reportIdList.forEach(reportId -> { - LoadTestReportDetailExample example = new LoadTestReportDetailExample(); - example.createCriteria().andReportIdEqualTo(reportId); - loadTestReportDetailMapper.deleteByExample(example); - reportService.deleteReport(reportId); - }); + // delete load_test_report_result + LoadTestReportResultExample loadTestReportResultExample = new LoadTestReportResultExample(); + loadTestReportResultExample.createCriteria().andReportIdIn(reportIdList); + loadTestReportResultMapper.deleteByExample(loadTestReportResultExample); + + // delete load_test_report, delete load_test_report_detail + reportIdList.forEach(reportId -> { + LoadTestReportDetailExample example = new LoadTestReportDetailExample(); + example.createCriteria().andReportIdEqualTo(reportId); + loadTestReportDetailMapper.deleteByExample(example); + reportService.deleteReport(reportId); + }); + } // delete load_test loadTestMapper.deleteByPrimaryKey(request.getId()); diff --git a/backend/src/main/java/io/metersphere/service/ProjectService.java b/backend/src/main/java/io/metersphere/service/ProjectService.java index a6c5d8d0b2..5b6af3319f 100644 --- a/backend/src/main/java/io/metersphere/service/ProjectService.java +++ b/backend/src/main/java/io/metersphere/service/ProjectService.java @@ -6,19 +6,26 @@ import io.metersphere.base.domain.Project; import io.metersphere.base.domain.ProjectExample; import io.metersphere.base.mapper.LoadTestMapper; import io.metersphere.base.mapper.ProjectMapper; -import io.metersphere.base.mapper.ext.ExtProjectMapper; +import io.metersphere.base.mapper.ext.*; import io.metersphere.commons.exception.MSException; import io.metersphere.commons.utils.SessionUtils; import io.metersphere.controller.request.ProjectRequest; import io.metersphere.dto.ProjectDTO; +import io.metersphere.dto.ProjectRelatedResourceDTO; import io.metersphere.i18n.Translator; import io.metersphere.performance.service.PerformanceTestService; +import io.metersphere.track.dto.TestPlanDTO; +import io.metersphere.track.request.testcase.QueryTestCaseRequest; +import io.metersphere.track.request.testcase.QueryTestPlanRequest; import io.metersphere.track.request.testplan.DeleteTestPlanRequest; +import io.metersphere.track.service.TestCaseService; +import io.metersphere.track.service.TestPlanService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @@ -34,6 +41,18 @@ public class ProjectService { private PerformanceTestService performanceTestService; @Resource private LoadTestMapper loadTestMapper; + @Resource + private ExtTestCaseMapper extTestCaseMapper; + @Resource + private ExtTestPlanMapper extTestPlanMapper; + @Resource + private ExtLoadTestMapper extLoadTestMapperMapper; + @Resource + private ExtApiTestMapper extApiTestMapper; + @Resource + private TestPlanService testPlanService; + @Resource + private TestCaseService testCaseService; public Project addProject(Project project) { if (StringUtils.isBlank(project.getName())) { @@ -76,6 +95,7 @@ public class ProjectService { }); // TODO 删除项目下 测试跟踪 相关 + deleteTrackResourceByProjectId(projectId); // TODO 删除项目下 接口测试 相关 @@ -83,6 +103,15 @@ public class ProjectService { projectMapper.deleteByPrimaryKey(projectId); } + private void deleteTrackResourceByProjectId(String projectId) { + QueryTestPlanRequest request = new QueryTestPlanRequest(); + request.setProjectId(projectId); + testPlanService.listTestPlan(request).forEach(testPlan -> { + testPlanService.deleteTestPlan(testPlan.getId()); + }); + testCaseService.deleteTestCaseByProjectId(projectId); + } + public void updateProject(Project project) { project.setCreateTime(null); project.setUpdateTime(System.currentTimeMillis()); @@ -107,4 +136,13 @@ public class ProjectService { public Project getProjectById(String id) { return projectMapper.selectByPrimaryKey(id); } + + public ProjectRelatedResourceDTO getRelatedResource(String projectId) { + ProjectRelatedResourceDTO projectRelatedResource = new ProjectRelatedResourceDTO(); + projectRelatedResource.setTestCaseCount(extTestCaseMapper.countByProjectId(projectId)); + projectRelatedResource.setTestPlanCount(extTestPlanMapper.countByProjectId(projectId)); + projectRelatedResource.setLoadTestCount(extLoadTestMapperMapper.countByProjectId(projectId)); + projectRelatedResource.setApiTestCount(extApiTestMapper.countByProjectId(projectId)); + return projectRelatedResource; + } } diff --git a/backend/src/main/java/io/metersphere/track/service/TestCaseService.java b/backend/src/main/java/io/metersphere/track/service/TestCaseService.java index 93e86e38ff..ca3454bf55 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestCaseService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestCaseService.java @@ -286,4 +286,10 @@ public class TestCaseService { example.createCriteria().andIdIn(request.getIds()); testCaseMapper.deleteByExample(example); } + + public void deleteTestCaseByProjectId(String projectId) { + TestCaseExample example = new TestCaseExample(); + example.createCriteria().andProjectIdEqualTo(projectId); + testCaseMapper.deleteByExample(example); + } } diff --git a/frontend/src/business/components/project/MsProject.vue b/frontend/src/business/components/project/MsProject.vue index 2f36028a3d..f5ceb84058 100644 --- a/frontend/src/business/components/project/MsProject.vue +++ b/frontend/src/business/components/project/MsProject.vue @@ -142,16 +142,18 @@ }); }, del(row) { - this.$confirm(this.$t('project.delete_confirm'), this.$t('commons.prompt'), { - confirmButtonText: this.$t('commons.confirm'), - cancelButtonText: this.$t('commons.cancel'), - type: 'warning' - }).then(() => { - this.$get('/project/delete/' + row.id, () => { - Message.success(this.$t('commons.delete_success')); - this.list(); + this.getRelatedResource(row.id).then(tip => { + this.$confirm(tip + this.$t('project.delete_confirm'), this.$t('commons.prompt'), { + confirmButtonText: this.$t('commons.confirm'), + cancelButtonText: this.$t('commons.cancel'), + type: 'warning' + }).then(() => { + this.$get('/project/delete/' + row.id, () => { + Message.success(this.$t('commons.delete_success')); + this.list(); + }); + }).catch(() => { }); - }).catch(() => { }); }, search() { @@ -165,6 +167,29 @@ this.total = data.itemCount; }) }, + getRelatedResource(projectId) { + return new Promise((resolve, reject) => { + this.$get('/project/related/resource/' + projectId, response => { + let data = response.data; + let result = ''; + result = this.appendDeleteTip(result, data.testCaseCount, this.$t('test_track.case.test_case')); + result = this.appendDeleteTip(result, data.testPlanCount, this.$t('test_track.plan.test_plan') ); + result = this.appendDeleteTip(result, data.loadTestCount, this.$t('commons.performance')); + result = this.appendDeleteTip(result, data.apiTestCount, this.$t('commons.api')); + if (result != '') { + result = this.$t('project.delete_tip') + result; + } + resolve(result); + }); + }); + }, + appendDeleteTip(result, count, tip) { + if (count > 0) { + return result + count + "个" + tip + ','; + } else { + return result; + } + } } } diff --git a/frontend/src/i18n/en-US.js b/frontend/src/i18n/en-US.js index 5843bdcb93..f879729e03 100644 --- a/frontend/src/i18n/en-US.js +++ b/frontend/src/i18n/en-US.js @@ -121,6 +121,7 @@ export default { 'create': 'Create Project', 'edit': 'Edit Project', 'delete_confirm': 'Are you sure you want to delete this project?', + 'delete_tip': 'These resources will be deleted:', 'search_by_name': 'Search by name', 'input_name': 'Please enter a workspace name', 'owning_workspace': 'Owning Workspace', diff --git a/frontend/src/i18n/zh-CN.js b/frontend/src/i18n/zh-CN.js index 4c8f6b1d50..bfd2a5f835 100644 --- a/frontend/src/i18n/zh-CN.js +++ b/frontend/src/i18n/zh-CN.js @@ -118,7 +118,8 @@ export default { 'recent': '最近的项目', 'create': '创建项目', 'edit': '编辑项目', - 'delete_confirm': '这个项目确定要删除吗?', + 'delete_confirm': '确定要删除这个项目吗?', + 'delete_tip': '删除该项目,会删除以下资源:', 'search_by_name': '根据名称搜索', 'input_name': '请输入项目名称', 'owning_workspace': '所属工作空间', diff --git a/frontend/src/i18n/zh-TW.js b/frontend/src/i18n/zh-TW.js index 534a571195..3229826df1 100644 --- a/frontend/src/i18n/zh-TW.js +++ b/frontend/src/i18n/zh-TW.js @@ -110,7 +110,8 @@ export default { 'recent': '最近的項目', 'create': '創建項目', 'edit': '編輯項目', - 'delete_confirm': '這個項目確定要刪除嗎?', + 'delete_confirm': '確定要刪除這個項目嗎?', + 'delete_tip': '刪除該項目,會刪除以下資源:', 'search_by_name': '根據名稱搜索', 'input_name': '請輸入項目名稱', 'owning_workspace': '所屬工作空間',