6月7日
This commit is contained in:
@@ -1,10 +1,24 @@
|
|||||||
import { request } from "@/api/request"
|
import { request } from "@/api/request"
|
||||||
export default {
|
export default {
|
||||||
|
/**
|
||||||
|
* 得到单个问题单信息
|
||||||
|
*/
|
||||||
getSingleProblem(params = {}) {
|
getSingleProblem(params = {}) {
|
||||||
return request({
|
return request({
|
||||||
url: "/project/getSingleProblem",
|
url: "/project/getSingleProblem",
|
||||||
method: "get",
|
method: "get",
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 参数是对象,对象里面1.id-问题单id
|
||||||
|
* @returns 问题单关联的用例
|
||||||
|
*/
|
||||||
|
getRelativeCases(params = {}) {
|
||||||
|
return request({
|
||||||
|
url: "/project/getRelativeCases",
|
||||||
|
method: "get",
|
||||||
|
params
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ const text = ref("暂无数据")
|
|||||||
color: #aaa;
|
color: #aaa;
|
||||||
p {
|
p {
|
||||||
margin-top: 6px;
|
margin-top: 6px;
|
||||||
|
user-select: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<a-layout-footer class="flex items-center justify-center h-10 footer text-center">
|
||||||
<a-layout-footer class="flex items-center justify-center h-10 footer text-center"
|
<a-typography-title :heading="8"> 成都测试管理平台 </a-typography-title>
|
||||||
>成都测试管理平台
|
</a-layout-footer>
|
||||||
</a-layout-footer>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup></script>
|
<script setup></script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
.footer {
|
.footer {
|
||||||
|
border-top: 1px solid var(--color-border);
|
||||||
color: var(--color-text-2);
|
color: var(--color-text-2);
|
||||||
|
background-color: var(--color-bg-2);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -19,7 +19,11 @@
|
|||||||
</a-space>
|
</a-space>
|
||||||
</div>
|
</div>
|
||||||
<div class="center-side flex items-center justify-center font-bold text-lg">
|
<div class="center-side flex items-center justify-center font-bold text-lg">
|
||||||
<template v-if="title"> 项目名称:{{ $route.query.ident }}-{{ title }} </template>
|
<template v-if="title">
|
||||||
|
<a-typography-title :style="{ margin: 0, fontSize: '1.1rem', fontWeight: 'bold' }" :heading="4">
|
||||||
|
项目名称:{{ $route.query.ident }}-{{ title }}
|
||||||
|
</a-typography-title>
|
||||||
|
</template>
|
||||||
<Menu v-if="topMenu"></Menu>
|
<Menu v-if="topMenu"></Menu>
|
||||||
</div>
|
</div>
|
||||||
<ul class="right-side">
|
<ul class="right-side">
|
||||||
@@ -43,8 +47,8 @@
|
|||||||
<!-- 这里有个下拉列表 -->
|
<!-- 这里有个下拉列表 -->
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a-tooltip content="切换主题-暂无">
|
<a-tooltip content="切换主题">
|
||||||
<a-button class="nav-btn" type="outline" :shape="'circle'">
|
<a-button @click="handleChangeTheme" class="nav-btn" type="outline" :shape="'circle'">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<icon-moon-fill />
|
<icon-moon-fill />
|
||||||
</template>
|
</template>
|
||||||
@@ -121,6 +125,12 @@ import Menu from "@/layout/components/menu.vue"
|
|||||||
import { useRouter } from "vue-router"
|
import { useRouter } from "vue-router"
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const appStore = useAppStore()
|
const appStore = useAppStore()
|
||||||
|
// 切换暗黑主题
|
||||||
|
const handleChangeTheme = () => {
|
||||||
|
document.body.hasAttribute("arco-theme")
|
||||||
|
? document.body.removeAttribute("arco-theme")
|
||||||
|
: document.body.setAttribute("arco-theme", "dark")
|
||||||
|
}
|
||||||
// title管理-默认在后台
|
// title管理-默认在后台
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
title: {
|
title: {
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<router-view v-slot="{ Component, route }" class="mx-2 my-2">
|
<router-view v-slot="{ Component, route }" class="mx-2 my-2">
|
||||||
|
<template v-if="!Component">
|
||||||
|
<Empty class="full-empty" />
|
||||||
|
</template>
|
||||||
<transition name="ma-fade" mode="out-in" appear>
|
<transition name="ma-fade" mode="out-in" appear>
|
||||||
<!-- 这里主要在路由定义是否缓存页面 -->
|
<!-- 这里主要在路由定义是否缓存页面 -->
|
||||||
<component :is="Component" v-if="route.meta.ignoreCache" :key="route.fullPath" />
|
<component :is="Component" v-if="route.meta.ignoreCache" :key="route.fullPath" />
|
||||||
@@ -13,6 +16,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed, ref } from "vue"
|
import { computed, ref } from "vue"
|
||||||
import { useTabBarStore } from "@/store"
|
import { useTabBarStore } from "@/store"
|
||||||
|
import Empty from "@/components/Empty/index.vue"
|
||||||
// 获取缓存列表
|
// 获取缓存列表
|
||||||
const tabBarStore = useTabBarStore()
|
const tabBarStore = useTabBarStore()
|
||||||
const cacheList = computed(() => tabBarStore.getCacheList)
|
const cacheList = computed(() => tabBarStore.getCacheList)
|
||||||
@@ -29,4 +33,8 @@ const refresh = () => {
|
|||||||
defineExpose({ refresh })
|
defineExpose({ refresh })
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped>
|
||||||
|
.full-empty {
|
||||||
|
width: 79vw;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -96,7 +96,25 @@
|
|||||||
<template v-if="props.node.level === '1'"> [被测件] </template>
|
<template v-if="props.node.level === '1'"> [被测件] </template>
|
||||||
<template v-if="props.node.level === '2'"> [设] </template>
|
<template v-if="props.node.level === '2'"> [设] </template>
|
||||||
<template v-if="props.node.level === '3'"> [项] </template>
|
<template v-if="props.node.level === '3'"> [项] </template>
|
||||||
<template v-if="props.node.level === '4'"> [例] </template>
|
<template v-if="props.node.level === '4'">
|
||||||
|
<template v-if="props.node.isRelatedProblem">
|
||||||
|
<a-tooltip content="有问题单关联">
|
||||||
|
<button>[@]</button>
|
||||||
|
</a-tooltip>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<template v-if="props.node.isNotPassed">
|
||||||
|
<a-tooltip content="该用例未通过,但是未关联问题单,请关联">
|
||||||
|
<button :style="{ color: 'red' }">[×]</button>
|
||||||
|
</a-tooltip>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<a-tooltip content="该用例未执行或已通过,未关联问题单">
|
||||||
|
<button>[>]</button>
|
||||||
|
</a-tooltip>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
</template>
|
</template>
|
||||||
</a-tree>
|
</a-tree>
|
||||||
</div>
|
</div>
|
||||||
@@ -593,12 +611,32 @@ const roundColumn = ref([
|
|||||||
dataIndex: "beginTime",
|
dataIndex: "beginTime",
|
||||||
formType: "date",
|
formType: "date",
|
||||||
placeholder: "请选择时间",
|
placeholder: "请选择时间",
|
||||||
rules: [{ required: true, message: "开始时间必填" }]
|
extra: "尽量大于项目开始时间13天,生成文档才符合要求",
|
||||||
|
rules: [
|
||||||
|
{ required: true, message: "开始时间必填" },
|
||||||
|
{
|
||||||
|
validator: (value, callback) => {
|
||||||
|
const projectBegin = route.query.beginTime
|
||||||
|
value <= projectBegin
|
||||||
|
? callback(
|
||||||
|
"不能早于项目开始时间,由于还有前期测试设计阶段,建议大于项目开始时间13天"
|
||||||
|
)
|
||||||
|
: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "速度等级",
|
title: "速度等级",
|
||||||
dataIndex: "speedGrade",
|
dataIndex: "speedGrade",
|
||||||
placeholder: "请填入速度等级"
|
placeholder: "请填入速度等级"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "动态地点",
|
||||||
|
dataIndex: "location",
|
||||||
|
placeholder: "请填入测试地点",
|
||||||
|
extra: "该字段影响时间相关表格的地点",
|
||||||
|
rules: [{ required: true, message: "测试地点是必填的" }]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -611,12 +649,36 @@ const roundColumn = ref([
|
|||||||
dataIndex: "endTime",
|
dataIndex: "endTime",
|
||||||
formType: "date",
|
formType: "date",
|
||||||
placeholder: "请选择时间",
|
placeholder: "请选择时间",
|
||||||
rules: [{ required: true, message: "结束时间必填" }]
|
extra: "该字段决定《测试记录》封面时间",
|
||||||
|
rules: [
|
||||||
|
{ required: true, message: "结束时间必填" },
|
||||||
|
{
|
||||||
|
validator(value, errorCallback) {
|
||||||
|
let start = maFormModalRef.value.form.beginTime
|
||||||
|
value < start ? errorCallback("结束时间不能小于开始时间") : null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "封装",
|
title: "封装",
|
||||||
dataIndex: "package",
|
dataIndex: "package",
|
||||||
placeholder: "请填入封装"
|
placeholder: "请填入封装"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "质量等级",
|
||||||
|
dataIndex: "grade",
|
||||||
|
formType: "select",
|
||||||
|
dict: {
|
||||||
|
data: [
|
||||||
|
{ label: "军级", value: "1" },
|
||||||
|
{ label: "商业级", value: "2" },
|
||||||
|
{ label: "宇航级", value: "3" },
|
||||||
|
{ label: "工业级", value: "4" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
placeholder: "请填入质量等级",
|
||||||
|
rules: [{ required: true, message: "质量等级必填" }]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -624,21 +686,7 @@ const roundColumn = ref([
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: "质量等级",
|
|
||||||
dataIndex: "grade",
|
|
||||||
formType: "radio",
|
|
||||||
dict: {
|
|
||||||
data: [
|
|
||||||
{ label: "军级", value: "1" },
|
|
||||||
{ label: "商业级", value: "2" },
|
|
||||||
{ label: "宇航级", value: "3" },
|
|
||||||
{ label: "工业级", value: "4" }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
placeholder: "请填入质量等级",
|
|
||||||
rules: [{ required: true, message: "质量等级必填" }]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
formType: "card",
|
formType: "card",
|
||||||
title: "极端工况信息",
|
title: "极端工况信息",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<img src="@/assets/avatar/zhu.jpg" />
|
<img src="@/assets/avatar/zhu.jpg" />
|
||||||
</a-avatar>
|
</a-avatar>
|
||||||
<div class="pl-3 mt-2">
|
<div class="pl-3 mt-2">
|
||||||
<div class="content-block-title">{{ userStore.name }},今天天气很好,欢迎回来!</div>
|
<div class="content-block-title">{{ userStore.name }},好久不见,欢迎回来!</div>
|
||||||
<div class="leading-5 mt-2 flex items-center">
|
<div class="leading-5 mt-2 flex items-center">
|
||||||
<a-tag color="red" bordered class="mr-2">好用的测试工具集</a-tag>
|
<a-tag color="red" bordered class="mr-2">好用的测试工具集</a-tag>
|
||||||
欢迎使用测试管理平台 ⭐长期更新。
|
欢迎使用测试管理平台 ⭐长期更新。
|
||||||
|
|||||||
65
cdTMP/src/views/project/case/components/CaseModal.vue
Normal file
65
cdTMP/src/views/project/case/components/CaseModal.vue
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
<template>
|
||||||
|
<div class="case-modal-container">
|
||||||
|
<a-modal v-model:visible="visible" draggable unmount-on-close hide-cancel ok-text="关闭" width="900px">
|
||||||
|
<template #title> 问题单关联用例列表 </template>
|
||||||
|
<div>
|
||||||
|
<a-list>
|
||||||
|
<a-list-item v-for="(item, index) in transformData" :key="index">
|
||||||
|
<a-descriptions :data="item.showData" :title="'用例名称:' + item.case" bordered :column="1" />
|
||||||
|
</a-list-item>
|
||||||
|
</a-list>
|
||||||
|
</div>
|
||||||
|
</a-modal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, computed } from "vue"
|
||||||
|
|
||||||
|
const visible = ref(false)
|
||||||
|
// 数据储存在这里
|
||||||
|
const data = ref([])
|
||||||
|
// 转换为描述数据
|
||||||
|
const transformData = computed(() => {
|
||||||
|
return data.value.map((item) => {
|
||||||
|
// 数组的每一项都要转为{ case:'xxx',showData:[{label:'xxx',value:'xxx2'}] }
|
||||||
|
const showData = []
|
||||||
|
for (let key in item) {
|
||||||
|
let showKey = key
|
||||||
|
if (key === "case") continue
|
||||||
|
if (key === "dut") {
|
||||||
|
showKey = "被测件"
|
||||||
|
}
|
||||||
|
if (key === "round") {
|
||||||
|
showKey = "轮次"
|
||||||
|
}
|
||||||
|
if (key === "design") {
|
||||||
|
showKey = "设计需求"
|
||||||
|
}
|
||||||
|
if (key === "demand") {
|
||||||
|
showKey = "测试项"
|
||||||
|
}
|
||||||
|
if (key === "demand_ident") {
|
||||||
|
showKey = "测试项标识"
|
||||||
|
}
|
||||||
|
showData.push({
|
||||||
|
label: showKey,
|
||||||
|
value: item[key]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
case: item.case,
|
||||||
|
showData
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
function open(caseList) {
|
||||||
|
visible.value = true
|
||||||
|
data.value = caseList
|
||||||
|
}
|
||||||
|
defineExpose({
|
||||||
|
open
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped></style>
|
||||||
@@ -23,7 +23,14 @@
|
|||||||
<template #ident="{ record }">
|
<template #ident="{ record }">
|
||||||
{{ "PT_" + route.query.ident + "_" + record.ident.padStart(3, "0") }}
|
{{ "PT_" + route.query.ident + "_" + record.ident.padStart(3, "0") }}
|
||||||
</template>
|
</template>
|
||||||
|
<!-- table按钮后置插槽:这里用于提醒 -->
|
||||||
|
<template #tableAfterButtons>
|
||||||
|
<a-alert banner class="alert">
|
||||||
|
表格问题单右键可以查看<span :style="{ color: 'red', fontWeight: 700 }">关联用例信息</span>
|
||||||
|
</a-alert>
|
||||||
|
</template>
|
||||||
</ma-crud>
|
</ma-crud>
|
||||||
|
<case-modal ref="caseModalRef"></case-modal>
|
||||||
</div>
|
</div>
|
||||||
</a-modal>
|
</a-modal>
|
||||||
</template>
|
</template>
|
||||||
@@ -31,8 +38,10 @@
|
|||||||
<script setup lang="jsx">
|
<script setup lang="jsx">
|
||||||
import { ref } from "vue"
|
import { ref } from "vue"
|
||||||
import problemApi from "@/api/project/problem"
|
import problemApi from "@/api/project/problem"
|
||||||
import { Message } from "@arco-design/web-vue"
|
import problemSingleApi from "@/api/project/singleProblem"
|
||||||
|
import { Message, Notification } from "@arco-design/web-vue"
|
||||||
import { useRoute, useRouter } from "vue-router"
|
import { useRoute, useRouter } from "vue-router"
|
||||||
|
import CaseModal from "./CaseModal.vue"
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
// 定义props
|
// 定义props
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -79,6 +88,7 @@ const handleRelatedChange = async (record) => {
|
|||||||
// 数据定义
|
// 数据定义
|
||||||
const crudRef = ref()
|
const crudRef = ref()
|
||||||
const visible = ref(false)
|
const visible = ref(false)
|
||||||
|
const caseModalRef = ref()
|
||||||
|
|
||||||
// 定义open事件
|
// 定义open事件
|
||||||
const open = (row) => {
|
const open = (row) => {
|
||||||
@@ -113,6 +123,25 @@ const crudOptions = ref({
|
|||||||
operationColumn: true,
|
operationColumn: true,
|
||||||
operationColumnAlign: "center", // 操作列居中
|
operationColumnAlign: "center", // 操作列居中
|
||||||
isDbClickEdit: false, // 双击不编辑当前列
|
isDbClickEdit: false, // 双击不编辑当前列
|
||||||
|
contextMenu: {
|
||||||
|
enabled: true,
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
operation: "scancase",
|
||||||
|
icon: "icon-list",
|
||||||
|
text: "查看关联用例",
|
||||||
|
onCommand: async (args) => {
|
||||||
|
const hang = args.record.hang
|
||||||
|
const problemId = args.record.id
|
||||||
|
if (hang) {
|
||||||
|
Notification.warning("该问题单未关联用例")
|
||||||
|
}
|
||||||
|
const res = await problemSingleApi.getRelativeCases({ id: problemId })
|
||||||
|
caseModalRef.value.open(res.data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
bordered: { cell: true },
|
bordered: { cell: true },
|
||||||
formOption: {
|
formOption: {
|
||||||
width: 1000,
|
width: 1000,
|
||||||
@@ -437,5 +466,10 @@ const columns = ref([
|
|||||||
// 暴露自己的open方法
|
// 暴露自己的open方法
|
||||||
defineExpose({ open })
|
defineExpose({ open })
|
||||||
</script>
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
<style lang="less" scoped></style>
|
.alert {
|
||||||
|
max-height: 32px;
|
||||||
|
background-color: transparent;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -27,14 +27,14 @@
|
|||||||
|
|
||||||
<script setup lang="jsx">
|
<script setup lang="jsx">
|
||||||
import { ref } from "vue"
|
import { ref } from "vue"
|
||||||
import { useRoute, useRouter } from "vue-router"
|
import { useRoute } from "vue-router"
|
||||||
import problemApi from "@/api/project/problem"
|
import problemApi from "@/api/project/problem"
|
||||||
import { useTreeDataStore } from "@/store"
|
import { useTreeDataStore } from "@/store"
|
||||||
import ProblemChoose from "./components/ProblemChoose.vue"
|
import ProblemChoose from "./components/ProblemChoose.vue"
|
||||||
import { Message } from "@arco-design/web-vue"
|
import { Message } from "@arco-design/web-vue"
|
||||||
const treeDataStore = useTreeDataStore()
|
const treeDataStore = useTreeDataStore()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const router = useRouter()
|
// const router = useRouter()
|
||||||
const roundNumber = route.query.key.split("-")[0]
|
const roundNumber = route.query.key.split("-")[0]
|
||||||
const dutNumber = route.query.key.split("-")[1]
|
const dutNumber = route.query.key.split("-")[1]
|
||||||
const designDemandNumber = route.query.key.split("-")[2]
|
const designDemandNumber = route.query.key.split("-")[2]
|
||||||
@@ -59,6 +59,8 @@ const crudOptions = ref({
|
|||||||
edit: { show: true, api: problemApi.update },
|
edit: { show: true, api: problemApi.update },
|
||||||
delete: { show: true, api: problemApi.delete },
|
delete: { show: true, api: problemApi.delete },
|
||||||
operationColumnAlign: "center", // 操作列居中
|
operationColumnAlign: "center", // 操作列居中
|
||||||
|
// 列表选项卡配置
|
||||||
|
tabs:{},
|
||||||
beforeOpenAdd: function () {
|
beforeOpenAdd: function () {
|
||||||
// 先判断是否已经有个问题单了,如果有则不让用户创建
|
// 先判断是否已经有个问题单了,如果有则不让用户创建
|
||||||
if (crudRef.value.getTableData().length >= 1) {
|
if (crudRef.value.getTableData().length >= 1) {
|
||||||
@@ -106,6 +108,7 @@ const crudOptions = ref({
|
|||||||
},
|
},
|
||||||
showIndex: false,
|
showIndex: false,
|
||||||
showTools: false,
|
showTools: false,
|
||||||
|
operationColumnAlign:'center',
|
||||||
rowSelection: { showCheckedAll: true },
|
rowSelection: { showCheckedAll: true },
|
||||||
searchColNumber: 3,
|
searchColNumber: 3,
|
||||||
tablePagination: false,
|
tablePagination: false,
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ const crudOptions = ref({
|
|||||||
add: { show: true, api: caseApi.save, text: "新增用例" },
|
add: { show: true, api: caseApi.save, text: "新增用例" },
|
||||||
edit: { show: true, api: caseApi.update, text: "修改用例" },
|
edit: { show: true, api: caseApi.update, text: "修改用例" },
|
||||||
delete: { show: true, api: caseApi.delete },
|
delete: { show: true, api: caseApi.delete },
|
||||||
|
operationColumnAlign:'center',
|
||||||
// 处理新增删除后树状图显示
|
// 处理新增删除后树状图显示
|
||||||
beforeOpenAdd: function () {
|
beforeOpenAdd: function () {
|
||||||
let key_split = route.query.key.split("-")
|
let key_split = route.query.key.split("-")
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<!-- 描述列表组件 -->
|
<!-- 描述列表组件 -->
|
||||||
<a-modal width="1000px" v-model:visible="visible" :footer="false">
|
<a-modal width="1000px" v-model:visible="visible" :footer="false">
|
||||||
<template #title>{{ previewRecord.name }}</template>
|
<template #title>项目名称:{{ previewRecord.name }}</template>
|
||||||
<ma-info :columns="columns" :data="previewRecord" :column="3"></ma-info>
|
<ma-info :columns="props.columns" :data="previewRecord" :column="1" size="mini"></ma-info>
|
||||||
</a-modal>
|
</a-modal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -12,11 +12,15 @@ import MaInfo from "@/components/ma-info/index.vue"
|
|||||||
// 提供open方法给外界,并获取整行数据
|
// 提供open方法给外界,并获取整行数据
|
||||||
const visible = ref(false)
|
const visible = ref(false)
|
||||||
const previewRecord = ref({})
|
const previewRecord = ref({})
|
||||||
const columns = ref([])
|
const props = defineProps({
|
||||||
const open = (record, outColumns) => {
|
columns: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const open = (record) => {
|
||||||
visible.value = true
|
visible.value = true
|
||||||
previewRecord.value = record
|
previewRecord.value = record
|
||||||
columns.value = outColumns
|
|
||||||
}
|
}
|
||||||
defineExpose({ open })
|
defineExpose({ open })
|
||||||
// MA-INFO的columns
|
// MA-INFO的columns
|
||||||
|
|||||||
@@ -51,13 +51,14 @@ watch(
|
|||||||
() => props.visible,
|
() => props.visible,
|
||||||
(newVal, oldVal) => {
|
(newVal, oldVal) => {
|
||||||
if (newVal) {
|
if (newVal) {
|
||||||
|
percent.value = 0
|
||||||
timer = setInterval(() => {
|
timer = setInterval(() => {
|
||||||
if (percent.value <= 0.95) {
|
if (percent.value <= 0.95) {
|
||||||
let temp = parseFloat(percent.value.toFixed(2))
|
let temp = parseFloat(percent.value.toFixed(2))
|
||||||
temp += 0.01
|
temp += 0.01
|
||||||
percent.value = parseFloat(temp.toFixed(2))
|
percent.value = parseFloat(temp.toFixed(2))
|
||||||
}
|
}
|
||||||
}, 100)
|
}, 120)
|
||||||
} else {
|
} else {
|
||||||
// 进度条清零
|
// 进度条清零
|
||||||
percent.value = 0
|
percent.value = 0
|
||||||
|
|||||||
@@ -12,42 +12,91 @@
|
|||||||
文档生成
|
文档生成
|
||||||
</a-button>
|
</a-button>
|
||||||
<template #content>
|
<template #content>
|
||||||
<p><a-link @click="createDgItem(record)">大纲二段文档</a-link></p>
|
|
||||||
<p><a-link @click="createSmItem(record)">说明二段文档</a-link></p>
|
|
||||||
<p><a-link @click="createJLItem(record)">记录二级文档</a-link></p>
|
|
||||||
<p><a-link @click="createBgItem(record)">报告二级文档</a-link></p>
|
|
||||||
<p><a-link @click="createHsmItem(record)">回归说明二级文档</a-link></p>
|
|
||||||
<p><a-link @click="createHjlItem(record)">回归记录二级文档</a-link></p>
|
|
||||||
<p><a-link @click="createWtdItem(record)">问题单二级文档</a-link></p>
|
|
||||||
<p>
|
<p>
|
||||||
<a-link @click="createSeitaiDagang(record)"><icon-eye />[测试]生成最后大纲</a-link>
|
<a-link
|
||||||
|
:disabled="isGenerating"
|
||||||
|
:loading="isDgLoading"
|
||||||
|
@click="createDgItem($event, record)"
|
||||||
|
>
|
||||||
|
大纲二段文档
|
||||||
|
</a-link>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a-link @click="createSeitaiShuoming(record)"><icon-eye />[测试]生成最后说明</a-link>
|
<a-link :disabled="isGenerating" :loading="isSmLoading" @click="createSmItem(record)">
|
||||||
|
说明二段文档
|
||||||
|
</a-link>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a-link @click="createSeitaiJilu(record)"><icon-eye />[测试]生成最后记录</a-link>
|
<a-link :disabled="isGenerating" :loading="isJlloading" @click="createJLItem(record)">
|
||||||
|
记录二级文档
|
||||||
|
</a-link>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a-link @click="createSeitaiBaogao(record)"><icon-eye />[测试]生成测评报告</a-link>
|
<a-link :disabled="isGenerating" :loading="isBgLoading" @click="createBgItem(record)">
|
||||||
|
报告二级文档
|
||||||
|
</a-link>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a-link @click="createSeitaiHsm(record)"><icon-eye />[测试]回归测试说明</a-link>
|
<a-link :disabled="isGenerating" :loading="ishsmLoading" @click="createHsmItem(record)">
|
||||||
|
回归说明二级文档
|
||||||
|
</a-link>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a-link @click="createSeitaiHjl(record)"><icon-eye />[测试]回归测试记录</a-link>
|
<a-link :disabled="isGenerating" :loading="ishjlLoading" @click="createHjlItem(record)">
|
||||||
|
回归记录二级文档
|
||||||
|
</a-link>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a-link @click="createSeitaiWtd(record)"><icon-eye />[测试]生成问题单</a-link>
|
<a-link :disabled="isGenerating" :loading="isWtdLoading" @click="createWtdItem(record)">
|
||||||
|
问题单二级文档
|
||||||
|
</a-link>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a-link :disabled="isGenerating" @click="createSeitaiDagang(record)">
|
||||||
|
<icon-eye />
|
||||||
|
[测试]生成最后大纲
|
||||||
|
</a-link>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a-link :disabled="isGenerating" @click="createSeitaiShuoming(record)">
|
||||||
|
<icon-eye />[测试]生成最后说明
|
||||||
|
</a-link>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a-link :disabled="isGenerating" @click="createSeitaiJilu(record)"
|
||||||
|
><icon-eye />[测试]生成最后记录</a-link
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a-link :disabled="isGenerating" @click="createSeitaiBaogao(record)"
|
||||||
|
><icon-eye />[测试]生成测评报告</a-link
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a-link :disabled="isGenerating" @click="createSeitaiHsm(record)"
|
||||||
|
><icon-eye />[测试]回归测试说明</a-link
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a-link :disabled="isGenerating" @click="createSeitaiHjl(record)"
|
||||||
|
><icon-eye />[测试]回归测试记录</a-link
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a-link :disabled="isGenerating" @click="createSeitaiWtd(record)"
|
||||||
|
><icon-eye />[测试]生成问题单</a-link
|
||||||
|
>
|
||||||
</p>
|
</p>
|
||||||
</template>
|
</template>
|
||||||
</a-popover>
|
</a-popover>
|
||||||
<a-link @click="enterWorkPlant(record)">进入工作区</a-link>
|
<a-button @click="enterWorkPlant(record)" size="mini" status="warning" type="outline">
|
||||||
<a-link @click="previewRef.open(record, crudColumns)"><icon-eye />预览</a-link>
|
工作区
|
||||||
|
</a-button>
|
||||||
|
<a-link @click="previewRef.open(record)"><icon-eye />预览</a-link>
|
||||||
</template>
|
</template>
|
||||||
</ma-crud>
|
</ma-crud>
|
||||||
</div>
|
</div>
|
||||||
<preview ref="previewRef"></preview>
|
<preview ref="previewRef" :columns="crudColumns"></preview>
|
||||||
<Progress
|
<Progress
|
||||||
:visible="visible"
|
:visible="visible"
|
||||||
:isComplete="isComplete"
|
:isComplete="isComplete"
|
||||||
@@ -74,7 +123,7 @@ import Progress from "./cpns/progress.vue"
|
|||||||
import hoosk from "@/views/testmanage/projmanage/hooks.js"
|
import hoosk from "@/views/testmanage/projmanage/hooks.js"
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
// 定义预览组件的Ref
|
// 定义预览组件的Ref
|
||||||
const previewRef = ref(null)
|
const previewRef = ref()
|
||||||
// 点击进入工作区函数 - 每次点击后都清除localStorage中树状目录数据
|
// 点击进入工作区函数 - 每次点击后都清除localStorage中树状目录数据
|
||||||
const enterWorkPlant = function (record) {
|
const enterWorkPlant = function (record) {
|
||||||
if (localStorage.getItem("tree_local_data")) {
|
if (localStorage.getItem("tree_local_data")) {
|
||||||
@@ -89,6 +138,16 @@ const ptext = ref("测评大纲")
|
|||||||
const handleModalConfirmClick = () => {
|
const handleModalConfirmClick = () => {
|
||||||
visible.value = false
|
visible.value = false
|
||||||
}
|
}
|
||||||
|
// 该变量用于显示所以生成文档的按钮是否->禁用
|
||||||
|
const isGenerating = ref(false)
|
||||||
|
// 用于显示是否正在加载(全部按钮各一个)
|
||||||
|
const isDgLoading = ref(false)
|
||||||
|
const isSmLoading = ref(false)
|
||||||
|
const isBgLoading = ref(false)
|
||||||
|
const isJlloading = ref(false)
|
||||||
|
const ishsmLoading = ref(false)
|
||||||
|
const ishjlLoading = ref(false)
|
||||||
|
const isWtdLoading = ref(false)
|
||||||
// ~~~~~~~~测试说明生成文档~~~~~~~~
|
// ~~~~~~~~测试说明生成文档~~~~~~~~
|
||||||
const createSeitaiShuoming = async (record) => {
|
const createSeitaiShuoming = async (record) => {
|
||||||
ptext.value = "测试说明"
|
ptext.value = "测试说明"
|
||||||
@@ -131,127 +190,141 @@ const createSeitaiWtd = async (record) => {
|
|||||||
|
|
||||||
// 记录生成二级文档
|
// 记录生成二级文档
|
||||||
const createJLItem = async (record) => {
|
const createJLItem = async (record) => {
|
||||||
const st = await jlGenerateApi.createJLcaserecord({ id: record.id })
|
isGenerating.value = true
|
||||||
|
isJlloading.value = true
|
||||||
Message.success(st.message)
|
await jlGenerateApi.createJLcaserecord({ id: record.id }).finally(() => {
|
||||||
|
isGenerating.value = false
|
||||||
|
isJlloading.value = false
|
||||||
|
})
|
||||||
|
Message.success("记录-片段库生成成功,请查看output/jl文件夹")
|
||||||
}
|
}
|
||||||
// 说明生成二级文档
|
// 说明生成二级文档
|
||||||
const createSmItem = async (record) => {
|
const createSmItem = async (record) => {
|
||||||
// 生成测评对象 - 和大纲一样 - 可能会删除
|
isGenerating.value = true
|
||||||
await dgGenerateApi.createSoftComposition({ id: record.id })
|
isSmLoading.value = true
|
||||||
// 生成被测软件功能 - 和大纲重复 - 可能会删除
|
const id = record.id
|
||||||
await dgGenerateApi.createFuncList({ id: record.id })
|
await Promise.all([
|
||||||
// 生成被测软件接口 - 和大纲重复 - 可能会删除
|
dgGenerateApi.createSoftComposition({ id }), // 生成测评对象 - 和大纲一样
|
||||||
await dgGenerateApi.createInterface({ id: record.id })
|
dgGenerateApi.createFuncList({ id }), // 生成被测软件功能 - 和大纲重复
|
||||||
// 生成被测软件性能 - 和大纲重复 - 可能会删除
|
dgGenerateApi.createInterface({ id }), // 生成被测软件接口 - 和大纲重复 - 可能会删除
|
||||||
await dgGenerateApi.createPerformance({ id: record.id })
|
dgGenerateApi.createPerformance({ id }), // 生成被测软件性能 - 和大纲重复 - 可能会删除
|
||||||
// 生成被测软件基本信息 - 和大纲重复 - 可能会删除
|
dgGenerateApi.createBaseInformation({ id }), // 生成被测软件基本信息 - 和大纲重复 - 可能会删除
|
||||||
await dgGenerateApi.createBaseInformation({ id: record.id })
|
dgGenerateApi.createYiju({ id }), // 生成标准类引用文档 - 和大纲重复 - 可能会删除
|
||||||
// 生成标准类引用文档 - 和大纲重复 - 可能会删除
|
smGenerateApi.createSMTechyiju({ id }), // 生成技术类引用文档列表 -> 在大纲基础上添加《测评大纲》
|
||||||
await dgGenerateApi.createYiju({ id: record.id })
|
dgGenerateApi.createEnvironment({ id }), // 生成软硬件环境(注意标题级别不一样,这个在最后处理)
|
||||||
// 生成技术类引用文档列表 -> 在大纲基础上添加《测评大纲》
|
smGenerateApi.createSMCaseList({ id }), // 生成用例全
|
||||||
await smGenerateApi.createSMTechyiju({ id: record.id })
|
smGenerateApi.createSMCaseBreifList({ id }), // 生成用例列表-那个表格
|
||||||
// 生成软硬件环境(注意标题级别不一样,这个在最后处理)
|
smGenerateApi.createSMTrack({ id }) // 生成说明追踪
|
||||||
await dgGenerateApi.createEnvironment({ id: record.id })
|
]).finally(() => {
|
||||||
// 生成用例全
|
isGenerating.value = false
|
||||||
await smGenerateApi.createSMCaseList({ id: record.id })
|
isSmLoading.value = false
|
||||||
// 生成用例列表-那个表格
|
})
|
||||||
await smGenerateApi.createSMCaseBreifList({ id: record.id })
|
Message.success("说明-片段库生成成功,请查看output/sm文件夹")
|
||||||
// 生成说明追踪
|
|
||||||
const st = await smGenerateApi.createSMTrack({ id: record.id })
|
|
||||||
Message.success(st.message)
|
|
||||||
}
|
}
|
||||||
// 大纲生成二级文档
|
// 大纲生成二级文档
|
||||||
const createDgItem = async (record) => {
|
const createDgItem = async (e, record) => {
|
||||||
// 生成测试项文档
|
isGenerating.value = true
|
||||||
await dgGenerateApi.createTestDemand({ id: record.id })
|
isDgLoading.value = true
|
||||||
// 标准依据文件
|
const id = record.id
|
||||||
await dgGenerateApi.createYiju({ id: record.id })
|
await Promise.all([
|
||||||
// 技术依据文件
|
dgGenerateApi.createTestDemand({ id }), // 生成第一轮测试项
|
||||||
await dgGenerateApi.createTechYiju({ id: record.id })
|
dgGenerateApi.createYiju({ id }), // 生成依据文件
|
||||||
// 生成时间和地点
|
dgGenerateApi.createTechYiju({ id }), // 技术依据文件
|
||||||
await dgGenerateApi.createTimeaddress({ id: record.id })
|
dgGenerateApi.createContact({ id }), // 生成联系人和方式
|
||||||
// 生成被测软件功能列表
|
dgGenerateApi.createTimeaddress({ id }), // 生成测评时间和地点
|
||||||
await dgGenerateApi.createFuncList({ id: record.id })
|
dgGenerateApi.createFuncList({ id }), // 生成被测软件功能列表
|
||||||
// 生成测评对象-软件组成
|
dgGenerateApi.createSoftComposition({ id }), // 生成测评对象-软件组成
|
||||||
await dgGenerateApi.createSoftComposition({ id: record.id })
|
dgGenerateApi.createAdequacyEffectiveness({ id }), // 生成测试充分性(adequancy)和有效性(effectiveness)说明
|
||||||
// 生成联系人和方式
|
dgGenerateApi.createGroup({ id }), // 生成测评组织及分工
|
||||||
await dgGenerateApi.createContact({ id: record.id })
|
dgGenerateApi.createGuarantee({ id }), // 生成测评保障
|
||||||
// 生成测试充分性(adequancy)和有效性(effectiveness)说明
|
dgGenerateApi.createAbbreviation({ id }), // 生成缩略语
|
||||||
await dgGenerateApi.createAdequacyEffectiveness({ id: record.id })
|
dgGenerateApi.createInterface({ id }), // 生成-被测软件接口
|
||||||
// 生成测评组织及分工
|
dgGenerateApi.createPerformance({ id }), // 生成-被测软件性能
|
||||||
await dgGenerateApi.createGroup({ id: record.id })
|
dgGenerateApi.createBaseInformation({ id }), // 生成-被测软件基本信息
|
||||||
// 生成测评保障
|
dgGenerateApi.createRequirement({ id }), // 生成-测试总体要求
|
||||||
await dgGenerateApi.createGuarantee({ id: record.id })
|
dgGenerateApi.createYzComparison({ id }), // 生成-研总-测试项对照表
|
||||||
// 生成缩略语
|
dgGenerateApi.createXqComparison({ id }), // 生成-需求规格说明-测试项对照表
|
||||||
await dgGenerateApi.createAbbreviation({ id: record.id })
|
dgGenerateApi.createFanXqComparison({ id }), // 生成-反向测试项-需求规格说明对照表
|
||||||
// 生成-被测软件接口
|
dgGenerateApi.createCodeQuality({ id }), // 生成-代码质量度量分析表
|
||||||
await dgGenerateApi.createInterface({ id: record.id })
|
dgGenerateApi.createEnvironment({ id }), // 生成-软硬件环境
|
||||||
// 生成-被测软件性能
|
dgGenerateApi.createMainTech({ id }) // 生成-主要战技指标
|
||||||
await dgGenerateApi.createPerformance({ id: record.id })
|
]).finally(() => {
|
||||||
// 生成-被测软件基本信息
|
isGenerating.value = false
|
||||||
await dgGenerateApi.createBaseInformation({ id: record.id })
|
isDgLoading.value = false
|
||||||
// 生成-测试总体要求
|
})
|
||||||
await dgGenerateApi.createRequirement({ id: record.id })
|
Message.success("大纲-片段库文档生成成功,请查看output/dg文件夹")
|
||||||
// 生成-研总-测试项对照表
|
|
||||||
await dgGenerateApi.createYzComparison({ id: record.id })
|
|
||||||
// 生成-需求规格说明-测试项对照表
|
|
||||||
await dgGenerateApi.createXqComparison({ id: record.id })
|
|
||||||
// 生成-反向测试项-需求规格说明对照表
|
|
||||||
await dgGenerateApi.createFanXqComparison({ id: record.id })
|
|
||||||
// 生成-代码质量度量分析表
|
|
||||||
await dgGenerateApi.createCodeQuality({ id: record.id })
|
|
||||||
// 生成-软硬件环境
|
|
||||||
await dgGenerateApi.createEnvironment({ id: record.id })
|
|
||||||
// 生成-主要战技指标
|
|
||||||
const st = await dgGenerateApi.createMainTech({ id: record.id })
|
|
||||||
Message.success(st.message)
|
|
||||||
}
|
}
|
||||||
// 报告生成二级文档
|
// 报告生成二级文档
|
||||||
const createBgItem = async (record) => {
|
const createBgItem = async (record) => {
|
||||||
// 删除output/bg文件夹下文件
|
isGenerating.value = true
|
||||||
await bgGenerateApi.deleteBGFiles({ id: record.id })
|
isBgLoading.value = true
|
||||||
await bgGenerateApi.createBgTechYiju({ id: record.id })
|
const id = record.id
|
||||||
await bgGenerateApi.createBgTimeaddress({ id: record.id })
|
await Promise.all([
|
||||||
await bgGenerateApi.createBgBaseInformation({ id: record.id })
|
bgGenerateApi.deleteBGFiles({ id }), // 删除output/bg文件夹下文件
|
||||||
await bgGenerateApi.createBgCompletionstatus({ id: record.id })
|
bgGenerateApi.createBgTechYiju({ id }),
|
||||||
await bgGenerateApi.createBgSummary({ id: record.id })
|
bgGenerateApi.createBgTimeaddress({ id }),
|
||||||
await bgGenerateApi.createBgContentandresults1({ id: record.id })
|
bgGenerateApi.createBgBaseInformation({ id }),
|
||||||
await bgGenerateApi.createBgContentandresults2({ id: record.id })
|
bgGenerateApi.createBgCompletionstatus({ id }),
|
||||||
await bgGenerateApi.createBgEffectAndAdquacy({ id: record.id })
|
bgGenerateApi.createBgSummary({ id }),
|
||||||
await bgGenerateApi.createBgDemandEffective({ id: record.id })
|
bgGenerateApi.createBgContentandresults1({ id }),
|
||||||
await bgGenerateApi.createBgQualityEvaluate({ id: record.id })
|
bgGenerateApi.createBgContentandresults2({ id }),
|
||||||
await bgGenerateApi.createBgEntire({ id: record.id })
|
bgGenerateApi.createBgEffectAndAdquacy({ id }),
|
||||||
await bgGenerateApi.createBgYzxqTrack({ id: record.id })
|
bgGenerateApi.createBgDemandEffective({ id }),
|
||||||
const st = await bgGenerateApi.createBgProblemsSummary({ id: record.id })
|
bgGenerateApi.createBgQualityEvaluate({ id }),
|
||||||
Message.success(st.message)
|
bgGenerateApi.createBgEntire({ id }),
|
||||||
|
bgGenerateApi.createBgYzxqTrack({ id }),
|
||||||
|
bgGenerateApi.createBgProblemsSummary({ id })
|
||||||
|
]).finally(() => {
|
||||||
|
isGenerating.value = false
|
||||||
|
isBgLoading.value = false
|
||||||
|
})
|
||||||
|
Message.success("报告-片段库文档生成成功,请查看output/bg文件夹")
|
||||||
}
|
}
|
||||||
// 回归测试说明二级文档
|
// 回归测试说明二级文档
|
||||||
const createHsmItem = async (record) => {
|
const createHsmItem = async (record) => {
|
||||||
// 先调用删除文件夹里面文件
|
const id = record.id
|
||||||
await hsmGenerateApi.deleteHSMFiles({ id: record.id })
|
isGenerating.value = true
|
||||||
await hsmGenerateApi.createBasicInfo({ id: record.id })
|
ishsmLoading.value = true
|
||||||
await hsmGenerateApi.createDocSummary({ id: record.id })
|
await Promise.all([
|
||||||
await hsmGenerateApi.createJstech({ id: record.id })
|
hsmGenerateApi.deleteHSMFiles({ id }), // 先删除以前文件
|
||||||
await hsmGenerateApi.createChangePart({ id: record.id })
|
hsmGenerateApi.createBasicInfo({ id }),
|
||||||
await hsmGenerateApi.createHdemand({ id: record.id })
|
hsmGenerateApi.createDocSummary({ id }),
|
||||||
await hsmGenerateApi.createCaseListDesc({ id: record.id })
|
hsmGenerateApi.createJstech({ id }),
|
||||||
await hsmGenerateApi.createCaseList({ id: record.id })
|
hsmGenerateApi.createChangePart({ id }),
|
||||||
const st = await hsmGenerateApi.createTrack({ id: record.id })
|
hsmGenerateApi.createHdemand({ id }),
|
||||||
Message.success(st.message)
|
hsmGenerateApi.createCaseListDesc({ id }),
|
||||||
|
hsmGenerateApi.createCaseList({ id }),
|
||||||
|
hsmGenerateApi.createTrack({ id })
|
||||||
|
]).finally(() => {
|
||||||
|
isGenerating.value = false
|
||||||
|
ishsmLoading.value = false
|
||||||
|
})
|
||||||
|
Message.success("回归说明-片段库文档生成成功,请查看output/hsm文件夹")
|
||||||
}
|
}
|
||||||
// 回归测试记录二级文档
|
// 回归测试记录二级文档
|
||||||
const createHjlItem = async (record) => {
|
const createHjlItem = async (record) => {
|
||||||
// 先调用删除文件夹里面文件
|
const id = record.id
|
||||||
await hjlGenerateApi.deleteHJLFiles({ id: record.id })
|
isGenerating.value = true
|
||||||
await hjlGenerateApi.createBasicInfo({ id: record.id })
|
ishjlLoading.value = true
|
||||||
const st = await hjlGenerateApi.createCaseinfo({ id: record.id })
|
await Promise.all([
|
||||||
Message.success(st.message)
|
hjlGenerateApi.deleteHJLFiles({ id }), // 先调用删除文件夹里面文件
|
||||||
|
hjlGenerateApi.createBasicInfo({ id }),
|
||||||
|
hjlGenerateApi.createCaseinfo({ id })
|
||||||
|
]).finally(() => {
|
||||||
|
isGenerating.value = false
|
||||||
|
ishjlLoading.value = false
|
||||||
|
})
|
||||||
|
Message.success("回归记录-片段库文档生成成功,请查看output/hjl文件夹")
|
||||||
}
|
}
|
||||||
// 问题单二级文档
|
// 问题单二级文档
|
||||||
const createWtdItem = async (record) => {
|
const createWtdItem = async (record) => {
|
||||||
const st = await wtdGenerateApi.createWtdTable({ id: record.id })
|
isGenerating.value = true
|
||||||
Message.success(st.message)
|
isWtdLoading.value = true
|
||||||
|
await wtdGenerateApi.createWtdTable({ id: record.id }).finally(() => {
|
||||||
|
isGenerating.value = false
|
||||||
|
isWtdLoading.value = false
|
||||||
|
})
|
||||||
|
Message.success("问题单-片段库文档生成成功,请查看output/wtd文件夹")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -270,6 +343,8 @@ const crudOptions = ref({
|
|||||||
operationWidth: 500,
|
operationWidth: 500,
|
||||||
showIndex: false,
|
showIndex: false,
|
||||||
showTools: false,
|
showTools: false,
|
||||||
|
operationColumnWidth: 220, // 操作列宽度
|
||||||
|
operationColumnAlign: "center", // 操作列对齐方式
|
||||||
// 处理弹窗的title
|
// 处理弹窗的title
|
||||||
beforeOpenAdd: function () {
|
beforeOpenAdd: function () {
|
||||||
crudRef.value.crudFormRef.actionTitle = "项目"
|
crudRef.value.crudFormRef.actionTitle = "项目"
|
||||||
@@ -426,7 +501,20 @@ const crudColumns = ref([
|
|||||||
{
|
{
|
||||||
title: "结束时间",
|
title: "结束时间",
|
||||||
dataIndex: "endTime",
|
dataIndex: "endTime",
|
||||||
formType: "date"
|
formType: "date",
|
||||||
|
extra: "注意:开始时间和结束时间影响大纲、报告多个时间,谨慎填写",
|
||||||
|
commonRules: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: "结束时间必填"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
validator: (value, validationCallbackFunction) => {
|
||||||
|
let beginTime = crudRef.value.getFormData().beginTime
|
||||||
|
value < beginTime ? validationCallbackFunction("开始时间必须小于结束时间") : null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
// 这是只为了搜索的字段
|
// 这是只为了搜索的字段
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user