测试计划关联测试缺陷完善

This commit is contained in:
pfl
2025-05-06 18:51:57 +08:00
parent 7afae71c8a
commit d3cd149ca5
9 changed files with 190 additions and 51 deletions

View File

@@ -7,6 +7,8 @@ import com.test.common.core.page.TableDataInfo;
import com.test.common.enums.BusinessType; import com.test.common.enums.BusinessType;
import com.test.common.utils.poi.ExcelUtil; import com.test.common.utils.poi.ExcelUtil;
import com.test.test.domain.TestPlanDefect; import com.test.test.domain.TestPlanDefect;
import com.test.test.domain.qo.TestPlanDefectQO;
import com.test.test.domain.vo.TestPlanDefectVo;
import com.test.test.service.ITestPlanDefectService; import com.test.test.service.ITestPlanDefectService;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -31,10 +33,10 @@ public class TestPlanDefectController extends BaseController
* 查询测试计划测试缺陷关联列表 * 查询测试计划测试缺陷关联列表
*/ */
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo list(TestPlanDefect testPlanDefect) public TableDataInfo list(TestPlanDefectQO testPlanDefect)
{ {
startPage(); startPage();
List<TestPlanDefect> list = testPlanDefectService.selectTestPlanDefectList(testPlanDefect); List<TestPlanDefectVo> list = testPlanDefectService.selectTestPlanDefectList(testPlanDefect);
return getDataTable(list); return getDataTable(list);
} }
@@ -43,10 +45,10 @@ public class TestPlanDefectController extends BaseController
*/ */
@Log(title = "测试计划测试缺陷关联", businessType = BusinessType.EXPORT) @Log(title = "测试计划测试缺陷关联", businessType = BusinessType.EXPORT)
@PostMapping("/export") @PostMapping("/export")
public void export(HttpServletResponse response, TestPlanDefect testPlanDefect) public void export(HttpServletResponse response, TestPlanDefectQO testPlanDefect)
{ {
List<TestPlanDefect> list = testPlanDefectService.selectTestPlanDefectList(testPlanDefect); List<TestPlanDefectVo> list = testPlanDefectService.selectTestPlanDefectList(testPlanDefect);
ExcelUtil<TestPlanDefect> util = new ExcelUtil<TestPlanDefect>(TestPlanDefect.class); ExcelUtil<TestPlanDefectVo> util = new ExcelUtil<TestPlanDefectVo>(TestPlanDefectVo.class);
util.exportExcel(response, list, "测试计划测试缺陷关联数据"); util.exportExcel(response, list, "测试计划测试缺陷关联数据");
} }

View File

@@ -0,0 +1,38 @@
package com.test.test.domain.qo;
import com.test.common.core.domain.BaseEntity;
import lombok.Data;
/**
* 测试计划测试缺陷关联请求QO
*/
@Data
public class TestPlanDefectQO extends BaseEntity {
private static final long serialVersionUID = 3754531916096288164L;
/** 主键ID */
private Long id;
/** 测试计划主键ID */
private String planId;
/** 测试缺陷主键ID */
private String defectId;
/**
* 缺陷编码
*/
private String serialNumber;
/**
* 缺陷概要
*/
private String outline;
/** 测试用例类型(0,冒烟测试,1,功能测试,2,回归测试,3,准生产测试,4,生产验证) */
private String type;
/** 版本 */
private String version;
}

View File

@@ -0,0 +1,48 @@
package com.test.test.domain.vo;
import com.test.common.core.domain.BaseEntity;
import lombok.Data;
/**
* 测试计划测试缺陷关联返回Vo
*/
@Data
public class TestPlanDefectVo extends BaseEntity {
private static final long serialVersionUID = -4826790211276641073L;
/**
* 主键ID
*/
private Long id;
/**
* 测试计划关联缺陷ID
*/
private String defectId;
/**
* 测试计划关联缺陷ID
*/
private String serialNumber;
/**
* 测试计划关联缺陷概要
*/
private String summary;
/**
* 测试计划关联缺陷状态
*/
private String status;
/**
* 测试计划关联缺陷经办人
*/
private String manager;
/**
* 测试计划关联缺陷严重程度
*/
private String level;
}

View File

@@ -1,7 +1,8 @@
package com.test.test.mapper; package com.test.test.mapper;
import com.test.test.domain.TestPlanDefect; import com.test.test.domain.TestPlanDefect;
import com.test.test.domain.qo.TestPlanDefectQO;
import com.test.test.domain.vo.TestPlanDefectVo;
import java.util.List; import java.util.List;
/** /**
@@ -26,7 +27,7 @@ public interface TestPlanDefectMapper
* @param testPlanDefect 测试计划测试缺陷关联 * @param testPlanDefect 测试计划测试缺陷关联
* @return 测试计划测试缺陷关联集合 * @return 测试计划测试缺陷关联集合
*/ */
public List<TestPlanDefect> selectTestPlanDefectList(TestPlanDefect testPlanDefect); public List<TestPlanDefectVo> selectTestPlanDefectList(TestPlanDefectQO testPlanDefect);
/** /**
* 新增测试计划测试缺陷关联 * 新增测试计划测试缺陷关联

View File

@@ -2,6 +2,8 @@ package com.test.test.service;
import com.test.test.domain.TestPlanDefect; import com.test.test.domain.TestPlanDefect;
import com.test.test.domain.qo.TestPlanDefectQO;
import com.test.test.domain.vo.TestPlanDefectVo;
import java.util.List; import java.util.List;
/** /**
@@ -26,7 +28,7 @@ public interface ITestPlanDefectService
* @param testPlanDefect 测试计划测试缺陷关联 * @param testPlanDefect 测试计划测试缺陷关联
* @return 测试计划测试缺陷关联集合 * @return 测试计划测试缺陷关联集合
*/ */
public List<TestPlanDefect> selectTestPlanDefectList(TestPlanDefect testPlanDefect); public List<TestPlanDefectVo> selectTestPlanDefectList(TestPlanDefectQO testPlanDefect);
/** /**
* 新增测试计划测试缺陷关联 * 新增测试计划测试缺陷关联

View File

@@ -2,6 +2,8 @@ package com.test.test.service.impl;
import com.test.common.utils.DateUtils; import com.test.common.utils.DateUtils;
import com.test.test.domain.TestPlanDefect; import com.test.test.domain.TestPlanDefect;
import com.test.test.domain.qo.TestPlanDefectQO;
import com.test.test.domain.vo.TestPlanDefectVo;
import com.test.test.mapper.TestPlanDefectMapper; import com.test.test.mapper.TestPlanDefectMapper;
import com.test.test.service.ITestPlanDefectService; import com.test.test.service.ITestPlanDefectService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@@ -40,7 +42,7 @@ public class TestPlanDefectServiceImpl implements ITestPlanDefectService
* @return 测试计划测试缺陷关联 * @return 测试计划测试缺陷关联
*/ */
@Override @Override
public List<TestPlanDefect> selectTestPlanDefectList(TestPlanDefect testPlanDefect) public List<TestPlanDefectVo> selectTestPlanDefectList(TestPlanDefectQO testPlanDefect)
{ {
return testPlanDefectMapper.selectTestPlanDefectList(testPlanDefect); return testPlanDefectMapper.selectTestPlanDefectList(testPlanDefect);
} }

View File

@@ -19,14 +19,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select id, plan_id, defect_id, type, create_time, update_time, version, del_flag from test_plan_defect select id, plan_id, defect_id, type, create_time, update_time, version, del_flag from test_plan_defect
</sql> </sql>
<select id="selectTestPlanDefectList" parameterType="TestPlanDefect" resultMap="TestPlanDefectResult"> <select id="selectTestPlanDefectList" parameterType="TestPlanDefectQO" resultType="TestPlanDefectVo">
<include refid="selectTestPlanDefectVo"/> SELECT
<where> tpd.id,
<if test="planId != null and planId != ''"> and plan_id = #{planId}</if> tpd.defect_id AS defectId,
<if test="defectId != null and defectId != ''"> and defect_id = #{defectId}</if> td.serial_number AS serialNumber,
<if test="type != null and type != ''"> and type = #{type}</if> td.outline AS summary,
<if test="version != null and version != ''"> and version = #{version}</if> td.create_time AS createTime,
</where> td.status,
su.user_name AS manager,
td.level
FROM test_plan_defect tpd
LEFT JOIN test_defect td ON td.id = tpd.defect_id
LEFT JOIN sys_user su ON su.user_id = td.manager
where 1=1
AND tpd.del_flag = '0'
<if test="serialNumber != null and serialNumber != ''">
AND td.serial_number LIKE concat('%', #{serialNumber}, '%')
</if>
<if test="outline != null and outline != ''">
AND td.outline LIKE concat('%', #{outline}, '%')
</if>
<if test="planId != null and planId != ''">
AND tpd.plan_id = #{planId}
</if>
<if test="type != null">
AND tpd.type = #{type}
</if>
</select> </select>
<select id="selectTestPlanDefectById" parameterType="Long" resultMap="TestPlanDefectResult"> <select id="selectTestPlanDefectById" parameterType="Long" resultMap="TestPlanDefectResult">

View File

@@ -2,6 +2,7 @@ import request from '@/utils/request'
const api = { const api = {
delRelDefect: 'testPlan/defect/list', delRelDefect: 'testPlan/defect/list',
getDefectList: 'testPlan/defect/list',
} }
export function delRelDefect(data) { export function delRelDefect(data) {
@@ -11,3 +12,11 @@ export function delRelDefect(data) {
data data
}) })
} }
export function getDefectList(data) {
return request({
url: api.getDefectList,
method: 'get',
params: data
})
}

View File

@@ -22,9 +22,10 @@
@click="handleCollapse(!activeNames.includes('1'))" @click="handleCollapse(!activeNames.includes('1'))"
>高级筛选 >高级筛选
</el-button> </el-button>
<el-button icon="el-icon-plus" type="primary" size="medium" style="margin-left: 10px;" @click="relateCaseVue"> <el-button icon="el-icon-plus" type="primary" size="medium" style="margin-left: 10px;" @click="relateDefect">
关联缺陷 关联缺陷
</el-button> </el-button>
<el-button type="primary" plain icon="el-icon-download" size="medium" :disabled="isExecuteVisible">全部导出</el-button>
<el-button <el-button
type="danger" type="danger"
plain plain
@@ -81,11 +82,19 @@
<el-Table v-loading="loading" :data="list" @selection-change="handleSelectionChange"> <el-Table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
<el-table-column type="selection"/> <el-table-column type="selection"/>
<el-table-column prop="caseName" label="ID" align="center"/> <el-table-column prop="serialNumber" label="ID" align="center"/>
<el-table-column prop="executeResult" label="概要" align="center"/> <el-table-column prop="summary" label="概要" align="center"/>
<el-table-column prop="createBy" label="状态" align="center"/> <el-table-column prop="status" label="状态" align="center">
<el-table-column prop="executeBy" label="经办人" align="center"/> <template #default="{ row }">
<el-table-column prop="executeTime" label="严重程度" align="center"/> <dict-tag :options="dict.type.bug_status" :value="row.status"/>
</template>
</el-table-column>
<el-table-column prop="manager" label="经办人" align="center"/>
<el-table-column prop="level" label="严重程度" align="center">
<template #default="{ row }">
<dict-tag :options="dict.type.severity_level" :value="row.level"/>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" align="center"/> <el-table-column prop="createTime" label="创建时间" align="center"/>
<el-table-column label="操作" align="left" fixed="right"> <el-table-column label="操作" align="left" fixed="right">
<template slot-scope="scope"> <template slot-scope="scope">
@@ -107,11 +116,19 @@
<el-dialog title="关联缺陷" :visible.sync="open" width="1000px" v-loading="submitLoading" append-to-body> <el-dialog title="关联缺陷" :visible.sync="open" width="1000px" v-loading="submitLoading" append-to-body>
<el-table v-loading="relLoading" :data="relList" @selection-change="handleSelectionChange"> <el-table v-loading="relLoading" :data="relList" @selection-change="handleSelectionChange">
<el-table-column type="selection"/> <el-table-column type="selection"/>
<el-table-column prop="caseName" label="ID" align="center"/> <el-table-column prop="serialNumber" label="ID" align="center"/>
<el-table-column prop="executeResult" label="概要" align="center"/> <el-table-column prop="outline" label="概要" align="center"/>
<el-table-column prop="createBy" label="状态" align="center"/> <el-table-column prop="status" label="状态" align="center">
<el-table-column prop="executeBy" label="经办人" align="center"/> <template #default="{ row }">
<el-table-column prop="executeTime" label="严重程度" align="center"/> <dict-tag :options="dict.type.bug_status" :value="row.status"/>
</template>
</el-table-column>
<el-table-column prop="manager" label="经办人" align="center"/>
<el-table-column prop="level" label="严重程度" align="center">
<template #default="{ row }">
<dict-tag :options="dict.type.severity_level" :value="row.level"/>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" align="center"/> <el-table-column prop="createTime" label="创建时间" align="center"/>
</el-table> </el-table>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
@@ -123,17 +140,17 @@
</template> </template>
<script> <script>
import {getPlanCaseList, saveRelate} from "@/api/test/planCase"; import {saveRelate} from "@/api/test/planCase";
import SimpleOptions from "@/components/FormItem/option/SimpleOptions.vue"; import SimpleOptions from "@/components/FormItem/option/SimpleOptions.vue";
import RelateCase from "@/views/test/testplan/execute/relateCase.vue"; import RelateCase from "@/views/test/testplan/execute/relateCase.vue";
import page1 from "../../case/detail/page1.vue"; import page1 from "../../case/detail/page1.vue";
import {runTestPlanCase} from "../../../../api/test/planCase"; import {delRelDefect, getDefectList} from "@/api/test/planDefect";
import {delRelDefect} from "@/api/test/planDefect"; import {getBugList} from "@/api/test/bug";
export default { export default {
name: 'project', name: 'project',
components: {page1, SimpleOptions, RelateCase}, components: {page1, SimpleOptions, RelateCase},
dicts: ['priority_level', 'project_source', 'project_type', 'status'], dicts: ['severity_level', 'bug_status'],
props: { props: {
planId: { planId: {
type: String, type: String,
@@ -168,7 +185,8 @@ export default {
selectedData: [], selectedData: [],
managerList: [], managerList: [],
queryParams: { queryParams: {
caseName: '', serialNumber: '',
outline: '',
planId: '', planId: '',
type: 0, type: 0,
pageNum: 1, pageNum: 1,
@@ -180,7 +198,7 @@ export default {
created() { created() {
this.queryParams.planId = this.planId; this.queryParams.planId = this.planId;
this.title = this.name; this.title = this.name;
// this.getList(); this.getList();
}, },
computed: { computed: {
placeholderText() { placeholderText() {
@@ -206,12 +224,19 @@ export default {
}, },
// 搜索 // 搜索
handleQuery() { handleQuery() {
if (this.select === '1') {
this.queryParams.outline = this.query;
this.queryParams.serialNumber = '';
} else if (this.select === '2') {
this.queryParams.serialNumber = this.query;
this.queryParams.outline = '';
}
this.getList(); this.getList();
}, },
relateCaseVue() { relateDefect() {
this.open = true; this.open = true;
this.reset(); this.reset();
this.$refs.relateCase.getList() this.getRelList()
}, },
/** 查询列表 */ /** 查询列表 */
getList() { getList() {
@@ -219,7 +244,7 @@ export default {
const queryParams = { const queryParams = {
...this.queryParams ...this.queryParams
} }
getPlanDefectList(queryParams).then(list => { getDefectList(queryParams).then(list => {
this.list = list.rows; this.list = list.rows;
this.total = list.total; this.total = list.total;
if (this.total > 0) { if (this.total > 0) {
@@ -230,19 +255,12 @@ export default {
this.loading = false this.loading = false
}) })
}, },
handleRunAll() { getRelList() {
this.loading = true; this.relLoading = true
const queryParams = { getBugList(this.queryParams).then(list => {
planId: this.queryParams.planId, this.relList = list.rows;
type: this.queryParams.type this.relLoading = false
} })
this.$modal.confirm('是否确认执行全部接口用例?').then(function () {
return runTestPlanCase(queryParams);
}).then((res) => {
this.$modal.msgSuccess("提交执行成功");
this.open = true;
this.loading = false;
});
}, },
// 表单重置 // 表单重置
reset() { reset() {