fix: 测试计划报告菜单批量删除功能的缺失

解决测试计划报告菜单批量删除功能的缺失的问题
This commit is contained in:
song.tianyang 2021-01-25 13:58:15 +08:00
parent 7412faa7d9
commit a0bce7cda3
5 changed files with 185 additions and 20 deletions

View File

@ -4,9 +4,10 @@
<select id="list" resultType="io.metersphere.track.dto.TestPlanReportDTO"
parameterType="io.metersphere.track.request.report.QueryTestPlanReportRequest">
SELECT tpr.id AS id, tpr.`name` AS `name`, tp.`name` AS testPlanName, tpr.creator AS creator, tpr.create_time AS createTime,tpr.trigger_Mode AS triggerMode,tpr.status AS status
SELECT tpr.id AS id, tpr.`name` AS `name`, tp.`name` AS testPlanName, u.name AS creator, tpr.create_time AS createTime,tpr.trigger_Mode AS triggerMode,tpr.status AS status
FROM test_plan tp
INNER JOIN test_plan_report tpr on tp.id = tpr.test_plan_id
INNER JOIN user u on tpr.creator = u.id
<where>
<if test="name != null">
and tpr.name like CONCAT('%', #{name},'%')

View File

@ -54,6 +54,12 @@ public class TestPlanReportController {
testPlanReportService.delete(testPlanReportIdList);
}
@PostMapping("/deleteBatchByParams")
public void deleteBatchByParams(@RequestBody QueryTestPlanReportRequest request) {
testPlanReportService.delete(request);
}
@GetMapping("/apiExecuteFinish/{planId}/{userId}")
public void apiExecuteFinish(@PathVariable String planId,@PathVariable String userId) {
TestPlanReport report = testPlanReportService.genTestPlanReport(planId,userId,ReportTriggerMode.API.name());

View File

@ -25,5 +25,11 @@ public class QueryTestPlanReportRequest {
private List<OrderRequest> orders;
private Map<String, List<String>> filters;
// private Map<String, Object> combine;
/**
* 批量操作的参数用于判断是前台表格的当前页数据还是全库数据
*/
private boolean isSelectAllDate;
private List<String> unSelectIds;
private List<String> dataIds;
}

View File

@ -2,6 +2,8 @@ package io.metersphere.track.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.metersphere.api.dto.definition.ApiDefinitionRequest;
import io.metersphere.api.dto.definition.ApiDefinitionResult;
import io.metersphere.api.jmeter.TestResult;
import io.metersphere.base.domain.*;
import io.metersphere.base.mapper.*;
@ -413,4 +415,33 @@ public class TestPlanReportService {
testPlanReportDataMapper.deleteByExample(example);
}
}
public void delete(QueryTestPlanReportRequest request) {
List<String> deleteReportIds = request.getDataIds();
if (request.isSelectAllDate()) {
deleteReportIds = this.getAllApiIdsByFontedSelect(request.getFilters(), request.getName(), request.getProjectId(), request.getUnSelectIds());
}
TestPlanReportExample deleteReportExample = new TestPlanReportExample();
deleteReportExample.createCriteria().andIdIn(deleteReportIds);
testPlanReportMapper.deleteByExample(deleteReportExample);
TestPlanReportDataExample example = new TestPlanReportDataExample();
example.createCriteria().andTestPlanReportIdIn(deleteReportIds);
testPlanReportDataMapper.deleteByExample(example);
}
private List<String> getAllApiIdsByFontedSelect(Map<String, List<String>> filters, String name, String projectId, List<String> unSelectIds) {
QueryTestPlanReportRequest request = new QueryTestPlanReportRequest();
request.setFilters(filters);
request.setName(name);
request.setProjectId(projectId);
request.setWorkspaceId(SessionUtils.getCurrentWorkspaceId());
List<TestPlanReportDTO> resList = extTestPlanReportMapper.list(request);
List<String> ids = new ArrayList<>(0);
if (!resList.isEmpty()) {
List<String> allIds = resList.stream().map(TestPlanReportDTO::getId).collect(Collectors.toList());
ids = allIds.stream().filter(id -> !unSelectIds.contains(id)).collect(Collectors.toList());
}
return ids;
}
}

View File

@ -5,8 +5,25 @@
@search="initTableData"
:title="$t('test_track.report.name')"/>
</template>
<el-table border class="adjust-table" :data="tableData"
@filter-change="filter" @sort-change="sort">
<el-table border :data="tableData"
@select-all="handleSelectAll"
@select="handleSelect"
row-key="id" class="test-content adjust-table ms-select-all"
@filter-change="filter" @sort-change="sort" ref="testPlanReportTable">
<el-table-column width="50" type="selection"/>
<ms-table-select-all
:page-size="pageSize>total?total:pageSize"
:total="total"
@selectPageAll="isSelectDataAll(false)"
@selectAll="isSelectDataAll(true)"/>
<el-table-column width="30" :resizable="false" align="center">
<template v-slot:default="scope">
<show-more-btn :is-show="scope.row.showMore" :buttons="buttons" :size="selectDataCounts"/>
</template>
</el-table-column>
<el-table-column min-width="300" prop="name" :label="$t('test_track.report.list.name')" show-overflow-tooltip></el-table-column>
<el-table-column prop="testPlanName" sortable :label="$t('test_track.report.list.test_plan')" show-overflow-tooltip></el-table-column>
<el-table-column prop="creator" :label="$t('test_track.report.list.creator')" show-overflow-tooltip></el-table-column>
@ -25,9 +42,6 @@
<ms-tag v-if="scope.row.status == 'RUNNING'" type="success" effect="plain" :content="'Running'"/>
<ms-tag v-else-if="scope.row.status == 'COMPLETED'||scope.row.status == 'SUCCESS'||scope.row.status == 'FAILED'" type="info" effect="plain" :content="'Completed'"/>
<ms-tag v-else type="effect" effect="plain" :content="scope.row.status"/>
<!-- <el-tag size="mini" type="success" v-if="row.status === 'Running'">{{ row.status }}</el-tag>-->
<!-- <el-tag size="mini" type="info" v-else-if="row.status === 'Completed'">{{ row.status }}</el-tag>-->
<!-- <el-tag size="mini" type="info" v-if="row.status === 'Completed'">{{ row.status }}</el-tag>-->
</template>
</el-table-column>
<el-table-column min-width="150" :label="$t('commons.operating')">
@ -56,13 +70,16 @@ import {getCurrentProjectID} from "../../../../../common/js/utils";
import TestPlanReportView from "@/business/components/track/report/components/TestPlanReportView";
import ReportTriggerModeItem from "@/business/components/common/tableItem/ReportTriggerModeItem";
import MsTag from "@/business/components/common/components/MsTag";
import ShowMoreBtn from "@/business/components/track/case/components/ShowMoreBtn";
import MsTableSelectAll from "@/business/components/common/components/table/MsTableSelectAll";
export default {
name: "TestPlanReportList",
components: {
TestPlanReportView,
MsTableOperator, MsTableOperatorButton, MsTableHeader, MsTablePagination,
ReportTriggerModeItem,MsTag
ReportTriggerModeItem,MsTag,
ShowMoreBtn,MsTableSelectAll,
},
data() {
return {
@ -75,6 +92,7 @@ export default {
currentPage: 1,
pageSize: 10,
isTestManagerOrTestUser: false,
selectRows: new Set(),
total: 0,
tableData: [],
statusFilters: [
@ -87,13 +105,16 @@ export default {
{text: this.$t('test_track.plan.system_test'), value: 'system'},
{text: this.$t('test_track.plan.regression_test'), value: 'regression'},
],
buttons: [
{name: this.$t('api_test.definition.request.batch_delete'), handleClick: this.handleDeleteBatch},
],
selectAll: false,
unSelection: [],
selectDataCounts: 0,
}
},
watch: {
'$route'(to, from) {
// if (to.path.indexOf("/track/plan/all") >= 0) {
// this.initTableData();
// }
}
},
activated() {
@ -106,6 +127,10 @@ export default {
},
methods: {
initTableData() {
this.selectRows = new Set();
this.selectAll = false;
this.unSelection = [];
this.selectDataCounts = 0;
if (this.planId) {
this.condition.planId = this.planId;
}
@ -119,19 +144,52 @@ export default {
let data = response.data;
this.total = data.itemCount;
this.tableData = data.listObject;
// for (let i = 0; i < this.tableData.length; i++) {
// let path = "/test/plan/project";
// this.$post(path, {planId: this.tableData[i].id}, res => {
// let arr = res.data;
// let projectIds = arr.filter(d => d.id !== this.tableData[i].projectId).map(data => data.id);
// this.$set(this.tableData[i], "projectIds", projectIds);
// })
// }
this.unSelection = data.listObject.map(s => s.id);
});
},
buildPagePath(path) {
return path + "/" + this.currentPage + "/" + this.pageSize;
},
handleSelect(selection, row) {
row.hashTree = [];
if (this.selectRows.has(row)) {
this.$set(row, "showMore", false);
this.selectRows.delete(row);
} else {
this.$set(row, "showMore", true);
this.selectRows.add(row);
}
let arr = Array.from(this.selectRows);
// 1
if (this.selectRows.size === 1) {
this.$set(arr[0], "showMore", true);
} else if (this.selectRows.size === 2) {
arr.forEach(row => {
this.$set(row, "showMore", true);
})
}
this.selectRowsCount(this.selectRows)
},
handleSelectAll(selection) {
if (selection.length > 0) {
if (selection.length === 1) {
selection.hashTree = [];
this.selectRows.add(selection[0]);
} else {
this.tableData.forEach(item => {
item.hashTree = [];
this.$set(item, "showMore", true);
this.selectRows.add(item);
});
}
} else {
this.selectRows.clear();
this.tableData.forEach(row => {
this.$set(row, "showMore", false);
})
}
this.selectRowsCount(this.selectRows)
},
handleDelete(testPlanReport) {
this.$alert(this.$t('report.delete_confirm') + ' ' + testPlanReport.name + " ", '', {
confirmButtonText: this.$t('commons.confirm'),
@ -146,7 +204,32 @@ export default {
}
});
},
handleDeleteBatch(){
this.$alert(this.$t('report.delete_batch_confirm') + ' ' + " ", '', {
confirmButtonText: this.$t('commons.confirm'),
callback: (action) => {
if (action === 'confirm') {
let deleteParam = {};
let ids = Array.from(this.selectRows).map(row => row.id);
deleteParam.dataIds = ids;
deleteParam.projectId = getCurrentProjectID();
deleteParam.selectAllDate = this.isSelectAllDate;
deleteParam.unSelectIds = this.unSelection;
deleteParam = Object.assign(deleteParam, this.condition);
this.$post('/test/plan/report/deleteBatchByParams/', deleteParam, () => {
this.$success(this.$t('commons.delete_success'));
this.initTableData();
this.selectRows.clear();
});
}
}
});
},
getIds(rowSets) {
let rowArray = Array.from(rowSets)
let ids = rowArray.map(s => s.id);
return ids;
},
filter(filters) {
_filter(filters, this.condition);
this.initTableData();
@ -160,6 +243,26 @@ export default {
this.$refs.testPlanReportView.open(planId);
}
},
isSelectDataAll(dataType) {
this.isSelectAllDate = dataType;
this.selectRowsCount(this.selectRows)
//
if (this.selectRows.size != this.tableData.length) {
this.$refs.testPlanReportTable.toggleAllSelection(true);
}
},
selectRowsCount(selection) {
let selectedIDs = this.getIds(selection);
let allIDs = this.tableData.map(s => s.id);
this.unSelection = allIDs.filter(function (val) {
return selectedIDs.indexOf(val) === -1
});
if (this.isSelectAllDate) {
this.selectDataCounts = this.total - this.unSelection.length;
} else {
this.selectDataCounts = selection.size;
}
},
}
}
</script>
@ -175,4 +278,22 @@ export default {
.el-table {
cursor: pointer;
}
.operate-button > div {
display: inline-block;
margin-left: 10px;
}
.request-method {
padding: 0 5px;
color: #1E90FF;
}
.ms-select-all >>> th:first-child {
margin-top: 20px;
}
.ms-select-all >>> th:nth-child(2) .el-icon-arrow-down {
top: -2px;
}
</style>