完成大纲生成进度条
This commit is contained in:
46
cdTMP/package-lock.json
generated
46
cdTMP/package-lock.json
generated
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
})
|
||||
},
|
||||
}
|
||||
|
||||
14
cdTMP/src/api/generate/dgSeitaiGenerate.js
Normal file
14
cdTMP/src/api/generate/dgSeitaiGenerate.js
Normal 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
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
48
cdTMP/src/api/system/abbreviation.js
Normal file
48
cdTMP/src/api/system/abbreviation.js
Normal 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
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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", () => {
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
51
cdTMP/src/views/datamanage/abbreviation/index.vue
Normal file
51
cdTMP/src/views/datamanage/abbreviation/index.vue
Normal 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>
|
||||
@@ -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: "如果不是标准则不填",
|
||||
}
|
||||
])
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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",
|
||||
|
||||
84
cdTMP/src/views/testmanage/projmanage/cpns/progress.vue
Normal file
84
cdTMP/src/views/testmanage/projmanage/cpns/progress.vue
Normal 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>
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user