parent
7412faa7d9
commit
a0bce7cda3
|
@ -4,9 +4,10 @@
|
||||||
|
|
||||||
<select id="list" resultType="io.metersphere.track.dto.TestPlanReportDTO"
|
<select id="list" resultType="io.metersphere.track.dto.TestPlanReportDTO"
|
||||||
parameterType="io.metersphere.track.request.report.QueryTestPlanReportRequest">
|
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
|
FROM test_plan tp
|
||||||
INNER JOIN test_plan_report tpr on tp.id = tpr.test_plan_id
|
INNER JOIN test_plan_report tpr on tp.id = tpr.test_plan_id
|
||||||
|
INNER JOIN user u on tpr.creator = u.id
|
||||||
<where>
|
<where>
|
||||||
<if test="name != null">
|
<if test="name != null">
|
||||||
and tpr.name like CONCAT('%', #{name},'%')
|
and tpr.name like CONCAT('%', #{name},'%')
|
||||||
|
|
|
@ -54,6 +54,12 @@ public class TestPlanReportController {
|
||||||
testPlanReportService.delete(testPlanReportIdList);
|
testPlanReportService.delete(testPlanReportIdList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/deleteBatchByParams")
|
||||||
|
public void deleteBatchByParams(@RequestBody QueryTestPlanReportRequest request) {
|
||||||
|
testPlanReportService.delete(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@GetMapping("/apiExecuteFinish/{planId}/{userId}")
|
@GetMapping("/apiExecuteFinish/{planId}/{userId}")
|
||||||
public void apiExecuteFinish(@PathVariable String planId,@PathVariable String userId) {
|
public void apiExecuteFinish(@PathVariable String planId,@PathVariable String userId) {
|
||||||
TestPlanReport report = testPlanReportService.genTestPlanReport(planId,userId,ReportTriggerMode.API.name());
|
TestPlanReport report = testPlanReportService.genTestPlanReport(planId,userId,ReportTriggerMode.API.name());
|
||||||
|
|
|
@ -25,5 +25,11 @@ public class QueryTestPlanReportRequest {
|
||||||
|
|
||||||
private List<OrderRequest> orders;
|
private List<OrderRequest> orders;
|
||||||
private Map<String, List<String>> filters;
|
private Map<String, List<String>> filters;
|
||||||
// private Map<String, Object> combine;
|
|
||||||
|
/**
|
||||||
|
* 批量操作的参数,用于判断是前台表格的当前页数据还是全库数据
|
||||||
|
*/
|
||||||
|
private boolean isSelectAllDate;
|
||||||
|
private List<String> unSelectIds;
|
||||||
|
private List<String> dataIds;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@ package io.metersphere.track.service;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
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.api.jmeter.TestResult;
|
||||||
import io.metersphere.base.domain.*;
|
import io.metersphere.base.domain.*;
|
||||||
import io.metersphere.base.mapper.*;
|
import io.metersphere.base.mapper.*;
|
||||||
|
@ -413,4 +415,33 @@ public class TestPlanReportService {
|
||||||
testPlanReportDataMapper.deleteByExample(example);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,25 @@
|
||||||
@search="initTableData"
|
@search="initTableData"
|
||||||
:title="$t('test_track.report.name')"/>
|
:title="$t('test_track.report.name')"/>
|
||||||
</template>
|
</template>
|
||||||
<el-table border class="adjust-table" :data="tableData"
|
<el-table border :data="tableData"
|
||||||
@filter-change="filter" @sort-change="sort">
|
@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 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="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>
|
<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-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-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"/>
|
<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>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column min-width="150" :label="$t('commons.operating')">
|
<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 TestPlanReportView from "@/business/components/track/report/components/TestPlanReportView";
|
||||||
import ReportTriggerModeItem from "@/business/components/common/tableItem/ReportTriggerModeItem";
|
import ReportTriggerModeItem from "@/business/components/common/tableItem/ReportTriggerModeItem";
|
||||||
import MsTag from "@/business/components/common/components/MsTag";
|
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 {
|
export default {
|
||||||
name: "TestPlanReportList",
|
name: "TestPlanReportList",
|
||||||
components: {
|
components: {
|
||||||
TestPlanReportView,
|
TestPlanReportView,
|
||||||
MsTableOperator, MsTableOperatorButton, MsTableHeader, MsTablePagination,
|
MsTableOperator, MsTableOperatorButton, MsTableHeader, MsTablePagination,
|
||||||
ReportTriggerModeItem,MsTag
|
ReportTriggerModeItem,MsTag,
|
||||||
|
ShowMoreBtn,MsTableSelectAll,
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@ -75,6 +92,7 @@ export default {
|
||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
isTestManagerOrTestUser: false,
|
isTestManagerOrTestUser: false,
|
||||||
|
selectRows: new Set(),
|
||||||
total: 0,
|
total: 0,
|
||||||
tableData: [],
|
tableData: [],
|
||||||
statusFilters: [
|
statusFilters: [
|
||||||
|
@ -87,13 +105,16 @@ export default {
|
||||||
{text: this.$t('test_track.plan.system_test'), value: 'system'},
|
{text: this.$t('test_track.plan.system_test'), value: 'system'},
|
||||||
{text: this.$t('test_track.plan.regression_test'), value: 'regression'},
|
{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: {
|
watch: {
|
||||||
'$route'(to, from) {
|
'$route'(to, from) {
|
||||||
// if (to.path.indexOf("/track/plan/all") >= 0) {
|
|
||||||
// this.initTableData();
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
activated() {
|
activated() {
|
||||||
|
@ -106,6 +127,10 @@ export default {
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
initTableData() {
|
initTableData() {
|
||||||
|
this.selectRows = new Set();
|
||||||
|
this.selectAll = false;
|
||||||
|
this.unSelection = [];
|
||||||
|
this.selectDataCounts = 0;
|
||||||
if (this.planId) {
|
if (this.planId) {
|
||||||
this.condition.planId = this.planId;
|
this.condition.planId = this.planId;
|
||||||
}
|
}
|
||||||
|
@ -119,19 +144,52 @@ export default {
|
||||||
let data = response.data;
|
let data = response.data;
|
||||||
this.total = data.itemCount;
|
this.total = data.itemCount;
|
||||||
this.tableData = data.listObject;
|
this.tableData = data.listObject;
|
||||||
// for (let i = 0; i < this.tableData.length; i++) {
|
this.unSelection = data.listObject.map(s => s.id);
|
||||||
// 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);
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
buildPagePath(path) {
|
buildPagePath(path) {
|
||||||
return path + "/" + this.currentPage + "/" + this.pageSize;
|
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) {
|
handleDelete(testPlanReport) {
|
||||||
this.$alert(this.$t('report.delete_confirm') + ' ' + testPlanReport.name + " ?", '', {
|
this.$alert(this.$t('report.delete_confirm') + ' ' + testPlanReport.name + " ?", '', {
|
||||||
confirmButtonText: this.$t('commons.confirm'),
|
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) {
|
||||||
_filter(filters, this.condition);
|
_filter(filters, this.condition);
|
||||||
this.initTableData();
|
this.initTableData();
|
||||||
|
@ -160,6 +243,26 @@ export default {
|
||||||
this.$refs.testPlanReportView.open(planId);
|
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>
|
</script>
|
||||||
|
@ -175,4 +278,22 @@ export default {
|
||||||
.el-table {
|
.el-table {
|
||||||
cursor: pointer;
|
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>
|
</style>
|
||||||
|
|
Loading…
Reference in New Issue