完成大纲生成进度条

This commit is contained in:
2024-03-05 16:28:47 +08:00
parent 89fc1102f9
commit f85613f1e6
17 changed files with 704 additions and 48 deletions

View File

@@ -44,6 +44,8 @@
"@vitejs/plugin-vue-jsx": "^3.0.1",
"@vue/babel-plugin-jsx": "^1.1.1",
"autoprefixer": "^10.4.14",
"browserslist": "^4.23.0",
"caniuse-lite": "^1.0.30001591",
"eslint": "^8.42.0",
"eslint-plugin-vue": "^9.14.1",
"less": "^4.1.3",
@@ -1760,15 +1762,15 @@
}
},
"node_modules/browserslist": {
"version": "4.21.7",
"resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.7.tgz",
"integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==",
"version": "4.23.0",
"resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.0.tgz",
"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
"dev": true,
"dependencies": {
"caniuse-lite": "^1.0.30001489",
"electron-to-chromium": "^1.4.411",
"node-releases": "^2.0.12",
"update-browserslist-db": "^1.0.11"
"caniuse-lite": "^1.0.30001587",
"electron-to-chromium": "^1.4.668",
"node-releases": "^2.0.14",
"update-browserslist-db": "^1.0.13"
},
"bin": {
"browserslist": "cli.js"
@@ -1821,9 +1823,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001492",
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz",
"integrity": "sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==",
"version": "1.0.30001591",
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz",
"integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==",
"dev": true
},
"node_modules/chalk": {
@@ -2081,9 +2083,9 @@
}
},
"node_modules/electron-to-chromium": {
"version": "1.4.417",
"resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.417.tgz",
"integrity": "sha512-8rY8HdCxuSVY8wku3i/eDac4g1b4cSbruzocenrqBlzqruAZYHjQCHIjC66dLR9DXhEHTojsC4EjhZ8KmzwXqA==",
"version": "1.4.686",
"resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.686.tgz",
"integrity": "sha512-3avY1B+vUzNxEgkBDpKOP8WarvUAEwpRaiCL0He5OKWEFxzaOFiq4WoZEZe7qh0ReS7DiWoHMnYoQCKxNZNzSg==",
"dev": true
},
"node_modules/enhanced-resolve": {
@@ -2158,9 +2160,9 @@
}
},
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz",
"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
"dev": true,
"engines": {
"node": ">=6"
@@ -3341,9 +3343,9 @@
"peer": true
},
"node_modules/node-releases": {
"version": "2.0.12",
"resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.12.tgz",
"integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==",
"version": "2.0.14",
"resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz",
"integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
"dev": true
},
"node_modules/normalize-path": {
@@ -4296,9 +4298,9 @@
}
},
"node_modules/update-browserslist-db": {
"version": "1.0.11",
"resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
"integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
"version": "1.0.13",
"resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
"dev": true,
"dependencies": {
"escalade": "^3.1.1",

View File

@@ -47,6 +47,8 @@
"@vitejs/plugin-vue-jsx": "^3.0.1",
"@vue/babel-plugin-jsx": "^1.1.1",
"autoprefixer": "^10.4.14",
"browserslist": "^4.23.0",
"caniuse-lite": "^1.0.30001591",
"eslint": "^8.42.0",
"eslint-plugin-vue": "^9.14.1",
"less": "^4.1.3",

View File

@@ -33,4 +33,180 @@ export default {
params
})
},
/**
*
* @returns 生成技术依据文件部分
*/
createTechYiju(params = {}) {
return request({
url: `/generate/create/techyiju`,
method: "get",
params
})
},
/**
*
* @returns 生成测评大纲-测评时间和地点
*/
createTimeaddress(params = {}) {
return request({
url: `/generate/create/timeaddress`,
method: "get",
params
})
},
/**
*
* @returns 生成测评大纲-被测软件功能
*/
createFuncList(params = {}) {
return request({
url: `/generate/create/funcList`,
method: "get",
params
})
},
/**
*
* @returns 生成测评大纲-测评对象的软件组成描述
*/
createSoftComposition(params = {}) {
return request({
url: `/generate/create/softComposition`,
method: "get",
params
})
},
/**
*
* @returns 生成测评大纲-被测软件接口
*/
createInterface(params = {}) {
return request({
url: `/generate/create/interface`,
method: "get",
params
})
},
/**
*
* @returns 生成测评大纲-被测软件性能
*/
createPerformance(params = {}) {
return request({
url: `/generate/create/performance`,
method: "get",
params
})
},
/**
*
* @returns 生成测评大纲-被测软件性能
*/
createBaseInformation(params = {}) {
return request({
url: `/generate/create/baseInformation`,
method: "get",
params
})
},
/**
*
* @returns 生成测评大纲-测试总体要求
*/
createRequirement(params = {}) {
return request({
url: `/generate/create/requirement`,
method: "get",
params
})
},
/**
*
* @returns 生成-测试内容充分性及测试方法有效性
*/
createAdequacyEffectiveness(params = {}) {
return request({
url: `/generate/create/adequacy_effectiveness`,
method: "get",
params
})
},
/**
*
* @returns 生成-测评组织及分工
*/
createGroup(params = {}) {
return request({
url: `/generate/create/group`,
method: "get",
params
})
},
/**
*
* @returns 生成-测评条件和保障
*/
createGuarantee(params = {}) {
return request({
url: `/generate/create/guarantee`,
method: "get",
params
})
},
/**
*
* @returns 生成-缩略语
*/
createAbbreviation(params = {}) {
return request({
url: `/generate/create/abbreviation`,
method: "get",
params
})
},
/**
*
* @returns 生成-研制总要求-测试项对比表
*/
createYzComparison(params = {}) {
return request({
url: `/generate/create/yzComparison`,
method: "get",
params
})
},
/**
*
* @returns 生成-需求规格说明追踪表
*/
createXqComparison(params = {}) {
return request({
url: `/generate/create/xqComparison`,
method: "get",
params
})
},
/**
*
* @returns 生成-反向测试项-需求规格说明追踪表
*/
createFanXqComparison(params = {}) {
return request({
url: `/generate/create/fanXqComparison`,
method: "get",
params
})
},
/**
*
* @returns 生成-代码质量度量分析表
*/
createCodeQuality(params = {}) {
return request({
url: `/generate/create/codeQuality`,
method: "get",
params
})
},
}

View File

@@ -0,0 +1,14 @@
import { request } from "@/api/request"
export default {
/**
* 如果缺少部分文件给与提示
* @returns 根据output_dir生成最终大纲文档
*/
createDagangSeiTai(params = {}) {
return request({
url: `/create/dgDocument`,
method: "get",
params
})
}
}

View File

@@ -44,4 +44,37 @@ export default {
data
})
},
/**
* 请求一个项目的所有测试需求(即测试项)
* @returns
*/
getRelatedTestDemand(params = {}) {
return request({
url: "/project/testDemand/getRelatedTestDemand",
method: "get",
params
})
},
/**
* 设计需求关联测试需求(测试项)的接口请求
* @returns
*/
solveRelatedTestDemand(params = {}) {
return request({
url: "/project/testDemand/solveRelatedTestDemand",
method: "post",
data: params
})
},
/**
* 根据当前设计需求design找出已关联非自己的测试项
* @returns
*/
getExistRelatedTestDemand(params = {}) {
return request({
url: "/project/testDemand/getExistRelatedTestDemand",
method: "post",
data: params
})
}
}

View File

@@ -0,0 +1,48 @@
import { request } from "@/api/request"
export default {
/**
* 请求缩略语列表
* @returns 请求缩略语的数据
*/
getlist(params = {}) {
return request({
url: `system/abbreviation/getlist`,
method: "get",
params
})
},
/**
* 添加缩略语数据
* @returns 返回已添加的缩略语
*/
save(data = {}) {
return request({
url: "system/abbreviation/save",
method: "post",
data
})
},
/**
* 更新缩略语
* @returns
*/
update(id, data = {}) {
return request({
url: "system/abbreviation/update/" + id,
method: "put",
data
})
},
/**
* 删除缩略语
* @returns
*/
delete(data) {
return request({
url: "system/abbreviation/delete",
method: "delete",
data
})
}
}

View File

@@ -69,6 +69,7 @@
"
type="primary"
><icon-eye /> {{ options.see.text || '查看' }}</a-link> -->
<a-link
v-if="
(isFunction(options.edit.show)
@@ -106,9 +107,7 @@
: options.delete.show
"
>
<a-link
type="primary"
>
<a-link type="primary">
<icon-delete />
{{
props.isRecovery

View File

@@ -51,8 +51,8 @@ const props = defineProps({
},
toolbar: {
type: [String, Array],
default:
"code undo redo restoredraft | paste pastetext |bold italic underline strikethrough codesample | preview | alignleft alignjustify indent formatpainter | \
default: // 如果要取消粘贴只粘贴文本需要用户加格式请加上pastetext
"code undo redo restoredraft | paste |bold italic underline strikethrough codesample | preview | alignleft alignjustify indent formatpainter | \
styleselect formatselect fontselect fontsizeselect | bullist numlist | blockquote subscript superscript removeformat | charmap pagebreak insertdatetime"
}
})
@@ -81,6 +81,7 @@ const initConfig = reactive({
toolbar: props.toolbar,
skeletonScreen: true,
branding: false,
paste_as_text: true, // 粘贴文字只能是纯文本
content_css: "/tinymce/skins/content/default/content.css",
setup: (editor) => {
editor.on("init", () => {

View File

@@ -20,7 +20,7 @@
<ul class="right-side">
<li>
<a-tooltip content="搜索-暂无">
<a-button class="nav-btn" type="outline" :shape="'circle'" @click="testCreate">
<a-button class="nav-btn" type="outline" :shape="'circle'">
<template #icon>
<icon-search />
</template>
@@ -159,11 +159,10 @@ const handleClickLogo = () => {
}
// 测试生成文档-测试项和方法
const testCreate = async ()=>{
const testCreate = async () => {
const st = await dgGenerateApi.createTestDemand()
Message.success(st.message)
}
</script>
<style scoped lang="less">

View File

@@ -32,6 +32,17 @@ const DATAMANAGE = {
locale: "项目联系信息",
icon: "icon-phone"
}
},
{
path: "abbreviation",
name: "abbreviation",
component: () => import("@/views/datamanage/abbreviation/index.vue"),
meta: {
requiresAuth: true,
roles: ["*"],
locale: "缩略语",
icon: "icon-scissor"
}
}
]
}

View File

@@ -0,0 +1,51 @@
<template>
<div class="ma-content-block lg:flex justify-between p-4">
<div class="lg:w-full w-full lg:ml-4 mt-5 lg:mt-0">
<!-- crud组件 -->
<ma-crud :options="crudOptions" :columns="crudColumns" ref="crudRef"></ma-crud>
</div>
</div>
</template>
<script lang="jsx" setup>
import { ref } from "vue"
import { Message } from "@arco-design/web-vue"
import abbreviationApi from "@/api/system/abbreviation"
const crudRef = ref()
const crudOptions = ref({
autoRequest: true,
api: abbreviationApi.getlist,
add: { show: true, api: abbreviationApi.save },
edit: { show: true, api: abbreviationApi.update },
delete: { show: true, api: abbreviationApi.delete },
operationWidth: 160,
operationColumn: true,
operationColumnAlign: "center",
showIndex: false,
searchColNumber: 3,
tablePagination: false,
rowSelection: { showCheckedAll: true }
})
const crudColumns = ref([
{ title: "ID", dataIndex: "id", addDisplay: false, editDisplay: false, width: 50, hide: true },
{
title: "缩略语",
align: "center",
dataIndex: "title",
search: true,
commonRules: [{ required: true, message: "缩略语必填" }]
},
{
title: "全称",
align: "center",
dataIndex: "des",
search: true,
width: 500,
ellipsis: true,
commonRules: [{ required: true, message: "全称和描述必填" }]
}
])
</script>
<style lang="less" scoped></style>

View File

@@ -59,6 +59,30 @@ const open = (row) => {
crudRef.value.requestParams = { id: currentRow.value.id }
crudRef.value.requestData()
visible.value = true
// 判断如果是行数据的code值为standard则不显示文档名称发布来源发布日期,且表单也不显示
// columnService可以动态设置表格列的属性!!!
const columnService = crudRef.value.getColumnService()
if (currentRow.value.code === "standard") {
columnService.get("doc_name").setAttr("hide", false)
columnService.get("publish_date").setAttr("hide", false)
columnService.get("source").setAttr("hide", false)
columnService.get("doc_name").setAttr("addDisplay", true)
columnService.get("publish_date").setAttr("addDisplay", true)
columnService.get("source").setAttr("addDisplay", true)
columnService.get("doc_name").setAttr("editDisplay", true)
columnService.get("publish_date").setAttr("editDisplay", true)
columnService.get("source").setAttr("editDisplay", true)
} else {
columnService.get("doc_name").setAttr("hide", true)
columnService.get("publish_date").setAttr("hide", true)
columnService.get("source").setAttr("hide", true)
columnService.get("doc_name").setAttr("addDisplay", false)
columnService.get("publish_date").setAttr("addDisplay", false)
columnService.get("source").setAttr("addDisplay", false)
columnService.get("doc_name").setAttr("editDisplay", false)
columnService.get("publish_date").setAttr("editDisplay", false)
columnService.get("source").setAttr("editDisplay", false)
}
}
// crudOptions
const crudOptions = ref({
@@ -76,6 +100,7 @@ const crudOptions = ref({
edit: { show: true, api: dictApi.updateDictItemData },
delete: { show: true, api: dictApi.realDeleteItem }
})
// crudColumns
const columns = ref([
{ title: "ID", dataIndex: "id", addDisplay: false, editDisplay: false, width: 50, hide: true },
@@ -159,7 +184,7 @@ const columns = ref([
dataIndex: "source",
align: "center",
search: false,
placeholder: "如果不是标准则不填"
placeholder: "如果不是标准则不填",
}
])

View File

@@ -6,18 +6,47 @@
<template #ident="{ record }">
{{ showType(record) }}
</template>
<!-- 表格前置扩展槽:添加关联按钮 -->
<template #tableAfterButtons>
<a-button type="outline" status="warning" @click="handleOpenRelationCSX">
<template #icon>
<icon-tags />
</template>
关联测试项
</a-button>
</template>
</ma-crud>
</div>
<!-- 关联的modal组件 -->
<a-modal v-model:visible="visible" width="700px" draggable :on-before-ok="handleRelatedOk">
<template #title>关联测试项</template>
<div class="pb-3">已存在的关联项:</div>
<a-typography-paragraph>
<ol class="ol-reset">
<li v-for="item in computedRelatedData">{{ item }}</li>
</ol>
</a-typography-paragraph>
<div class="pb-3">选择关联的测试需求项:</div>
<a-cascader
:options="options"
multiple
allow-search
placeholder="暂无关联测试项,请选择..."
:loading="cascaderLoading"
v-model:model-value="relatedData"
/>
</a-modal>
</div>
</template>
<script setup>
import { ref } from "vue"
import { ref, computed } from "vue"
import { useRoute, useRouter } from "vue-router"
import testDemandApi from "@/api/project/testDemand"
import { useTreeDataStore } from "@/store"
import commonApi from "@/api/common"
import PinYinMatch from "pinyin-match"
import { Message } from "@arco-design/web-vue"
const treeDataStore = useTreeDataStore()
const route = useRoute()
@@ -28,6 +57,79 @@ const roundNumber = route.query.key.split("-")[0]
const dutNumber = route.query.key.split("-")[1]
const designDemandNumber = route.query.key.split("-")[2]
const projectId = ref(route.query.id)
// ~~~~~关联相关变量和函数~~~~~
// 定义关联弹窗变量函数
const visible = ref(false)
const relatedData = ref([])
const computedRelatedData = computed(() => {
const labelResultList = []
options.value.forEach((item) => {
if (item.children) {
item.children.forEach((child) => {
if (relatedData.value.includes(child.value)) {
labelResultList.push(child.label)
}
})
}
})
return labelResultList
})
// 定义cascader的加载圈
const cascaderLoading = ref(false)
// 点击关联测试项-button
const handleOpenRelationCSX = async () => {
// 请求接口获取数据
cascaderLoading.value = true
visible.value = true
// 点击进入时清除关联
relatedData.value = []
const res = await testDemandApi.getRelatedTestDemand({ id: projectId.value, round: roundNumber })
options.value = res.data
// 找出本设计需求design对应已关联的测试项
const res_exist = await testDemandApi.getExistRelatedTestDemand({
project_id: projectId.value,
roundNumber,
dutNumber,
designDemandNumber
})
relatedData.value = res_exist.data
cascaderLoading.value = false
}
// 点击关联确定按钮
const handleRelatedOk = async () => {
// 获取级联数据
const relationDestItemIds = relatedData.value
if (relationDestItemIds.length > 0) {
const res = await testDemandApi.solveRelatedTestDemand({
data: relationDestItemIds,
project_id: projectId.value,
roundNumber,
dutNumber,
designDemandNumber
})
if (res.code == 200) {
Message.success(res.message)
return true
}
} else {
const res = await testDemandApi.solveRelatedTestDemand({
data: [],
project_id: projectId.value,
roundNumber,
dutNumber,
designDemandNumber
})
if (res.code == 200) {
Message.success(res.message)
return true
}
}
return false
}
// 级联cascade组件options
const options = ref([])
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 标识显示字段
const testTypeDict = ref([])
!(function () {
@@ -52,7 +154,7 @@ const crudOptions = ref({
edit: { show: true, api: testDemandApi.update },
delete: { show: true, api: testDemandApi.delete },
beforeOpenAdd: function () {
let key_split = route.query.key.split("-")
let key_split = route.query.key.split("-")
let round_key = key_split[0]
let dut_key = key_split[1]
let design_key = key_split[2]
@@ -61,7 +163,7 @@ const crudOptions = ref({
return true
},
beforeOpenEdit: function (record) {
let key_split = route.query.key.split("-")
let key_split = route.query.key.split("-")
let round_key = key_split[0]
let dut_key = key_split[1]
let design_key = key_split[2]
@@ -216,4 +318,8 @@ const crudColumns = ref([
])
</script>
<style lang="less" scoped></style>
<style lang="less" scoped>
.ol-reset {
list-style: auto;
}
</style>

View File

@@ -50,7 +50,7 @@ const crudOptions = ref({
delete: { show: true, api: designDemandApi.delete },
// 处理添加后函数
beforeOpenAdd: function () {
let key_split = route.query.key.split("-")
let key_split = route.query.key.split("-")
let round_key = key_split[0]
let dut_key = key_split[1]
let td = treeDataStore.treeData
@@ -58,7 +58,7 @@ const crudOptions = ref({
return true
},
beforeOpenEdit: function (record) {
let key_split = route.query.key.split("-")
let key_split = route.query.key.split("-")
let round_key = key_split[0]
let dut_key = key_split[1]
let td = treeDataStore.treeData
@@ -98,7 +98,7 @@ const crudColumns = ref([
align: "center",
width: 50,
dataIndex: "id",
commonRules: [{ required: true, message: "标识是必填" }],
commonRules: [{ required: true, message: "ID必填" }],
validateTrigger: "blur"
},
{

View File

@@ -100,7 +100,8 @@ const beiceType = [
{ label: "源代码", value: "SO" },
{ label: "设计说明", value: "SJ" },
{ label: "需求文档", value: "XQ" },
{ label: "通信协议", value: "XY" }
{ label: "通信协议", value: "XY" },
{ label: "研制总要求", value: "YZ" }
]
const crudColumns = ref([
@@ -135,7 +136,7 @@ const crudColumns = ref([
dict: {
data: beiceType,
translation: true,
tagColors: { XQ: "blue", SO: "green", SJ: "orangered", XY: "pinkpurple" }
tagColors: { XQ: "blue", SO: "green", SJ: "orangered", XY: "pinkpurple",YZ:"red" }
},
control: (value, data) => {
if (value === "SO") {
@@ -150,7 +151,6 @@ const crudColumns = ref([
}
} else {
// 其他数据清除
return {
black_line: { display: false },
pure_code_line: { display: false },
@@ -180,6 +180,14 @@ const crudColumns = ref([
commonRules: [{ required: true, message: "版本必填" }],
validateTrigger: "blur"
},
{
title: "用户标识",
align: "center",
dataIndex: "ref",
search: true,
commonRules: [{ required: true, message: "用户标识或编号必填" }],
validateTrigger: "blur"
},
{
title: "单位",
align: "center",

View File

@@ -0,0 +1,84 @@
<template>
<div class="progress">
<a-modal
draggable
:visible="visible"
hide-cancel
:mask-closable="false"
:on-before-ok="handleClickConfirmButton"
@cancel="handleClickConfirmButton"
>
<template #title>生成大纲进度</template>
<div><a-progress :percent="percent" size="large" /></div>
</a-modal>
</div>
</template>
<script setup>
import { ref, watch, onUnmounted } from "vue"
import { Notification } from "@arco-design/web-vue"
const emits = defineEmits(["clickConfirm"])
const props = defineProps({
visible: {
type: Boolean,
default: false
},
isComplete: {
type: Boolean,
default: false
}
})
const percent = ref(0)
// 点击确定或关闭按钮判断是否完成未完成则无法关闭进度条modal
const handleClickConfirmButton = () => {
if (props.isComplete) {
emits("clickConfirm")
return true
}
Notification.warning({
title: "无法关闭",
content: "生成大纲未完成,请等待生成完成后再关闭"
})
return false
}
// 打开modal后自动移动
let timer = null
watch(
() => props.visible,
(newVal, oldVal) => {
if (newVal) {
timer = setInterval(() => {
if (percent.value <= 0.95) {
let temp = parseFloat(percent.value.toFixed(2))
temp += 0.01
percent.value = parseFloat(temp.toFixed(2))
}
}, 100)
} else {
// 进度条清零
percent.value = 0
clearInterval(timer)
timer = null
}
}
)
// 监听是否完成大纲生成
watch(
() => props.isComplete,
(newVal, oldVal) => {
if (newVal) {
percent.value = 1
clearInterval(timer)
timer = null
}
}
)
onUnmounted(() => {
clearInterval(timer)
timer = null
// 进度条清零
percent.value = 0
})
</script>
<style lang="less" scoped></style>

View File

@@ -6,12 +6,17 @@
<template #operationBeforeExtend="{ record }">
<a-link @click="enterWorkPlant(record)">进入工作区</a-link>
<a-link @click="previewRef.open(record, crudColumns)"><icon-eye />预览</a-link>
<a-link @click="createYiju(record)"><icon-eye />测试生成依据文件</a-link>
<a-link @click="createContact(record)"><icon-eye />测试联系方式</a-link>
<a-link @click="createItem(record)">生成测试</a-link>
<a-link @click="createYiju(record)"><icon-eye />[测试]生成依据文件</a-link>
<a-link @click="createContact(record)"><icon-eye />[测试]联系方式</a-link>
<a-link @click="createInter(record)"><icon-eye />[测试]生成接口</a-link>
<a-link @click="createZhuiZ(record)"><icon-eye />[测试]研总追踪</a-link>
<a-link @click="createSeitaiDagang(record)"><icon-eye />[测试]生成最后大纲</a-link>
</template>
</ma-crud>
</div>
<preview ref="previewRef"></preview>
<Progress :visible="visible" :isComplete="isComplete" @clickConfirm="handleModalConfirmClick"></Progress>
</div>
</template>
<script lang="jsx" setup>
@@ -20,7 +25,9 @@ import { useRoute, useRouter } from "vue-router"
import projectApi from "@/api/testmanage/project"
import preview from "./cpns/preview.vue"
import dgGenerateApi from "@/api/generate/dgGenerate"
import dgSeitaiGenerateApi from "@/api/generate/dgSeitaiGenerate"
import { Message } from "@arco-design/web-vue"
import Progress from "./cpns/progress.vue"
const router = useRouter()
// 定义预览组件的Ref
const previewRef = ref(null)
@@ -31,16 +38,96 @@ const enterWorkPlant = function (record) {
}
router.push({ name: "project", query: record })
}
// 这里放弹出进度条组件变量
const visible = ref(false)
const isComplete = ref(false)
const handleModalConfirmClick = () => {
visible.value = false
}
// ~~~~~~~~测试生成文档~~~~~~~~
const createYiju = async (record) => {
const st = await dgGenerateApi.createYiju({ id: record.id })
const createSeitaiDagang = async (record) => {
// 根据一系列文档生成大纲 - 这里有进度条组件、a-modal组件
// 1.打开进度条组件
visible.value = true
isComplete.value = false
const st = await dgSeitaiGenerateApi.createDagangSeiTai({ id: record.id }).catch((err) => {
isComplete.value = true
visible.value = false
})
isComplete.value = true
Message.success(st.message)
}
const createContact = async (record) => {
const st = await dgGenerateApi.createContact({ id: record.id })
const createItem = async (record) => {
// 生成测试项文档
const st = await dgGenerateApi.createTestDemand({ id: record.id })
Message.success(st.message)
}
const createYiju = async (record) => {
// 标准依据文件
const st = await dgGenerateApi.createYiju({ id: record.id })
// 技术依据文件
const st2 = await dgGenerateApi.createTechYiju({ id: record.id })
// 生成时间和地点
const st3 = await dgGenerateApi.createTimeaddress({ id: record.id })
// 生成被测软件功能列表
const st4 = await dgGenerateApi.createFuncList({ id: record.id })
// 生成测评对象-软件组成
const st5 = await dgGenerateApi.createSoftComposition({ id: record.id })
Message.success(st.message)
Message.success(st2.message)
Message.success(st3.message)
Message.success(st4.message)
Message.success(st5.message)
}
const createContact = async (record) => {
// 生成联系人和方式
const st = await dgGenerateApi.createContact({ id: record.id })
// 生成测试充分性adequancy和有效性effectiveness说明
const st2 = await dgGenerateApi.createAdequacyEffectiveness({ id: record.id })
// 生成测评组织及分工
const st3 = await dgGenerateApi.createGroup({ id: record.id })
// 生成测评保障
const st4 = await dgGenerateApi.createGuarantee({ id: record.id })
// 生成缩略语
const st5 = await dgGenerateApi.createAbbreviation({ id: record.id })
Message.success(st.message)
Message.success(st2.message)
Message.success(st3.message)
Message.success(st4.message)
Message.success(st5.message)
}
const createInter = async (record) => {
// 生成-被测软件接口
const st = await dgGenerateApi.createInterface({ id: record.id })
// 生成-被测软件性能
const st2 = await dgGenerateApi.createPerformance({ id: record.id })
// 生成-被测软件基本信息
const st3 = await dgGenerateApi.createBaseInformation({ id: record.id })
// 生成-测试总体要求
const st4 = await dgGenerateApi.createRequirement({ id: record.id })
Message.success(st.message)
Message.success(st2.message)
Message.success(st3.message)
Message.success(st4.message)
}
const createZhuiZ = async (record) => {
// 生成-研总-测试项对照表
const st = await dgGenerateApi.createYzComparison({ id: record.id })
// 生成-需求规格说明-测试项对照表
const st2 = await dgGenerateApi.createXqComparison({ id: record.id })
// 生成-反向测试项-需求规格说明对照表
const st3 = await dgGenerateApi.createFanXqComparison({ id: record.id })
// 生成-代码质量度量分析表
const st4 = await dgGenerateApi.createCodeQuality({ id: record.id })
Message.success(st.message)
Message.success(st2.message)
Message.success(st3.message)
Message.success(st4.message)
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CRUD-OPTIONS
@@ -94,6 +181,7 @@ const crudOptions = ref({
{ span: 8, formList: [{ dataIndex: "endTime" }] },
{ span: 8, formList: [{ dataIndex: "duty_person" }] },
{ span: 24, formList: [{ dataIndex: "member" }] },
{ span: 24, formList: [{ dataIndex: "abbreviation" }] },
{ span: 8, formList: [{ dataIndex: "quality_person" }] },
{ span: 8, formList: [{ dataIndex: "vise_person" }] },
{ span: 8, formList: [{ dataIndex: "config_person" }] }
@@ -240,6 +328,15 @@ const crudColumns = ref([
dict: { url: "system/user/list", props: { label: "name", value: "name" }, translation: true },
commonRules: [{ required: true, message: "成员至少选择一个" }]
},
{
title: "缩略语",
dataIndex: "abbreviation",
hide: true,
search: false,
formType: "select",
multiple: true,
dict: { url: "system/abbreviation/index", props: { label: "title", value: "title" }, translation: true }
},
{
title: "质量保证",
dataIndex: "quality_person",