删除项目提示并删除测试跟踪资源

This commit is contained in:
chenjianxing 2020-05-25 17:25:49 +08:00
parent afcd60c6f7
commit b7b33ad2bb
17 changed files with 141 additions and 24 deletions

View File

@ -8,4 +8,6 @@ import java.util.List;
public interface ExtApiTestMapper { public interface ExtApiTestMapper {
List<APITestResult> list(@Param("request") QueryAPITestRequest request); List<APITestResult> list(@Param("request") QueryAPITestRequest request);
Long countByProjectId(String projectId);
} }

View File

@ -29,5 +29,9 @@
</where> </where>
order by api_test.update_time desc order by api_test.update_time desc
</select> </select>
<select id="countByProjectId" resultType="java.lang.Long">
select count(id) from api_test
where project_id = #{projectId};
</select>
</mapper> </mapper>

View File

@ -8,4 +8,6 @@ import java.util.List;
public interface ExtLoadTestMapper { public interface ExtLoadTestMapper {
List<LoadTestDTO> list(@Param("request") QueryTestPlanRequest params); List<LoadTestDTO> list(@Param("request") QueryTestPlanRequest params);
Long countByProjectId(String projectId);
} }

View File

@ -27,5 +27,9 @@
</where> </where>
order by load_test.update_time desc order by load_test.update_time desc
</select> </select>
<select id="countByProjectId" resultType="java.lang.Long">
select count(id) from load_test
where project_id = #{projectId};
</select>
</mapper> </mapper>

View File

@ -12,4 +12,6 @@ public interface ExtTestCaseMapper {
List<TestCase> getTestCaseNames(@Param("request") QueryTestCaseRequest request); List<TestCase> getTestCaseNames(@Param("request") QueryTestCaseRequest request);
List<TestCaseDTO> list(@Param("request") QueryTestCaseRequest request); List<TestCaseDTO> list(@Param("request") QueryTestCaseRequest request);
Long countByProjectId(String projectId);
} }

View File

@ -53,4 +53,8 @@
</foreach> </foreach>
</if> </if>
</select> </select>
<select id="countByProjectId" resultType="java.lang.Long">
select count(id) from test_case
where project_id = #{projectId}
</select>
</mapper> </mapper>

View File

@ -11,4 +11,6 @@ public interface ExtTestPlanMapper {
List<TestPlanDTO> list(@Param("request") QueryTestPlanRequest params); List<TestPlanDTO> list(@Param("request") QueryTestPlanRequest params);
List<TestPlanDTOWithMetric> listRelate(@Param("request") QueryTestPlanRequest params); List<TestPlanDTOWithMetric> listRelate(@Param("request") QueryTestPlanRequest params);
Long countByProjectId(String projectId);
} }

View File

@ -45,5 +45,9 @@
) )
order by test_plan.update_time desc order by test_plan.update_time desc
</select> </select>
<select id="countByProjectId" resultType="java.lang.Long">
select count(id) from test_plan
where project_id = #{projectId}
</select>
</mapper> </mapper>

View File

@ -9,6 +9,7 @@ import io.metersphere.commons.utils.Pager;
import io.metersphere.commons.utils.SessionUtils; import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.controller.request.ProjectRequest; import io.metersphere.controller.request.ProjectRequest;
import io.metersphere.dto.ProjectDTO; import io.metersphere.dto.ProjectDTO;
import io.metersphere.dto.ProjectRelatedResourceDTO;
import io.metersphere.service.ProjectService; import io.metersphere.service.ProjectService;
import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresRoles; import org.apache.shiro.authz.annotation.RequiresRoles;
@ -71,4 +72,10 @@ public class ProjectController {
public void updateProject(@RequestBody Project Project) { public void updateProject(@RequestBody Project Project) {
projectService.updateProject(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);
}
} }

View File

@ -0,0 +1,11 @@
package io.metersphere.dto;
import lombok.Data;
@Data
public class ProjectRelatedResourceDTO {
Long testCaseCount;
Long testPlanCount;
Long loadTestCount;
Long apiTestCount;
}

View File

@ -70,20 +70,23 @@ public class PerformanceTestService {
LoadTestReportExample loadTestReportExample = new LoadTestReportExample(); LoadTestReportExample loadTestReportExample = new LoadTestReportExample();
loadTestReportExample.createCriteria().andTestIdEqualTo(testId); loadTestReportExample.createCriteria().andTestIdEqualTo(testId);
List<LoadTestReport> loadTestReports = loadTestReportMapper.selectByExample(loadTestReportExample); List<LoadTestReport> loadTestReports = loadTestReportMapper.selectByExample(loadTestReportExample);
List<String> reportIdList = loadTestReports.stream().map(LoadTestReport::getId).collect(Collectors.toList());
// delete load_test_report_result if (!loadTestReports.isEmpty()) {
LoadTestReportResultExample loadTestReportResultExample = new LoadTestReportResultExample(); List<String> reportIdList = loadTestReports.stream().map(LoadTestReport::getId).collect(Collectors.toList());
loadTestReportResultExample.createCriteria().andReportIdIn(reportIdList);
loadTestReportResultMapper.deleteByExample(loadTestReportResultExample);
// delete load_test_report, delete load_test_report_detail // delete load_test_report_result
reportIdList.forEach(reportId -> { LoadTestReportResultExample loadTestReportResultExample = new LoadTestReportResultExample();
LoadTestReportDetailExample example = new LoadTestReportDetailExample(); loadTestReportResultExample.createCriteria().andReportIdIn(reportIdList);
example.createCriteria().andReportIdEqualTo(reportId); loadTestReportResultMapper.deleteByExample(loadTestReportResultExample);
loadTestReportDetailMapper.deleteByExample(example);
reportService.deleteReport(reportId); // 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 // delete load_test
loadTestMapper.deleteByPrimaryKey(request.getId()); loadTestMapper.deleteByPrimaryKey(request.getId());

View File

@ -6,19 +6,26 @@ import io.metersphere.base.domain.Project;
import io.metersphere.base.domain.ProjectExample; import io.metersphere.base.domain.ProjectExample;
import io.metersphere.base.mapper.LoadTestMapper; import io.metersphere.base.mapper.LoadTestMapper;
import io.metersphere.base.mapper.ProjectMapper; 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.exception.MSException;
import io.metersphere.commons.utils.SessionUtils; import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.controller.request.ProjectRequest; import io.metersphere.controller.request.ProjectRequest;
import io.metersphere.dto.ProjectDTO; import io.metersphere.dto.ProjectDTO;
import io.metersphere.dto.ProjectRelatedResourceDTO;
import io.metersphere.i18n.Translator; import io.metersphere.i18n.Translator;
import io.metersphere.performance.service.PerformanceTestService; 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.request.testplan.DeleteTestPlanRequest;
import io.metersphere.track.service.TestCaseService;
import io.metersphere.track.service.TestPlanService;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -34,6 +41,18 @@ public class ProjectService {
private PerformanceTestService performanceTestService; private PerformanceTestService performanceTestService;
@Resource @Resource
private LoadTestMapper loadTestMapper; 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) { public Project addProject(Project project) {
if (StringUtils.isBlank(project.getName())) { if (StringUtils.isBlank(project.getName())) {
@ -76,6 +95,7 @@ public class ProjectService {
}); });
// TODO 删除项目下 测试跟踪 相关 // TODO 删除项目下 测试跟踪 相关
deleteTrackResourceByProjectId(projectId);
// TODO 删除项目下 接口测试 相关 // TODO 删除项目下 接口测试 相关
@ -83,6 +103,15 @@ public class ProjectService {
projectMapper.deleteByPrimaryKey(projectId); 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) { public void updateProject(Project project) {
project.setCreateTime(null); project.setCreateTime(null);
project.setUpdateTime(System.currentTimeMillis()); project.setUpdateTime(System.currentTimeMillis());
@ -107,4 +136,13 @@ public class ProjectService {
public Project getProjectById(String id) { public Project getProjectById(String id) {
return projectMapper.selectByPrimaryKey(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;
}
} }

View File

@ -286,4 +286,10 @@ public class TestCaseService {
example.createCriteria().andIdIn(request.getIds()); example.createCriteria().andIdIn(request.getIds());
testCaseMapper.deleteByExample(example); testCaseMapper.deleteByExample(example);
} }
public void deleteTestCaseByProjectId(String projectId) {
TestCaseExample example = new TestCaseExample();
example.createCriteria().andProjectIdEqualTo(projectId);
testCaseMapper.deleteByExample(example);
}
} }

View File

@ -142,16 +142,18 @@
}); });
}, },
del(row) { del(row) {
this.$confirm(this.$t('project.delete_confirm'), this.$t('commons.prompt'), { this.getRelatedResource(row.id).then(tip => {
confirmButtonText: this.$t('commons.confirm'), this.$confirm(tip + this.$t('project.delete_confirm'), this.$t('commons.prompt'), {
cancelButtonText: this.$t('commons.cancel'), confirmButtonText: this.$t('commons.confirm'),
type: 'warning' cancelButtonText: this.$t('commons.cancel'),
}).then(() => { type: 'warning'
this.$get('/project/delete/' + row.id, () => { }).then(() => {
Message.success(this.$t('commons.delete_success')); this.$get('/project/delete/' + row.id, () => {
this.list(); Message.success(this.$t('commons.delete_success'));
this.list();
});
}).catch(() => {
}); });
}).catch(() => {
}); });
}, },
search() { search() {
@ -165,6 +167,29 @@
this.total = data.itemCount; 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;
}
}
} }
} }
</script> </script>

View File

@ -121,6 +121,7 @@ export default {
'create': 'Create Project', 'create': 'Create Project',
'edit': 'Edit Project', 'edit': 'Edit Project',
'delete_confirm': 'Are you sure you want to delete this 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', 'search_by_name': 'Search by name',
'input_name': 'Please enter a workspace name', 'input_name': 'Please enter a workspace name',
'owning_workspace': 'Owning Workspace', 'owning_workspace': 'Owning Workspace',

View File

@ -118,7 +118,8 @@ export default {
'recent': '最近的项目', 'recent': '最近的项目',
'create': '创建项目', 'create': '创建项目',
'edit': '编辑项目', 'edit': '编辑项目',
'delete_confirm': '这个项目确定要删除吗?', 'delete_confirm': '确定要删除这个项目吗?',
'delete_tip': '删除该项目,会删除以下资源:',
'search_by_name': '根据名称搜索', 'search_by_name': '根据名称搜索',
'input_name': '请输入项目名称', 'input_name': '请输入项目名称',
'owning_workspace': '所属工作空间', 'owning_workspace': '所属工作空间',

View File

@ -110,7 +110,8 @@ export default {
'recent': '最近的項目', 'recent': '最近的項目',
'create': '創建項目', 'create': '創建項目',
'edit': '編輯項目', 'edit': '編輯項目',
'delete_confirm': '這個項目確定要刪除嗎?', 'delete_confirm': '確定要刪除這個項目嗎?',
'delete_tip': '刪除該項目,會刪除以下資源:',
'search_by_name': '根據名稱搜索', 'search_by_name': '根據名稱搜索',
'input_name': '請輸入項目名稱', 'input_name': '請輸入項目名稱',
'owning_workspace': '所屬工作空間', 'owning_workspace': '所屬工作空間',