问题单结构全面修改

This commit is contained in:
2024-05-14 20:02:19 +08:00
parent 17776d5316
commit 2da15bd687
8 changed files with 253 additions and 118 deletions

View File

@@ -65,5 +65,16 @@ export default {
method: "get", method: "get",
params params
}) })
},
/**
* TODO:生成最终问题单
* @returns 返回是否正确生成问题单
*/
createWtdDocument(params = {}) {
return request({
url: `/create/wtdDocument`,
method: "get",
params
})
} }
} }

View File

@@ -0,0 +1,14 @@
import { request } from "@/api/request"
export default {
/**
* 生成问题单的多个表格
* @returns Promise(message)
*/
createWtdTable(params = {}) {
return request({
url: `/generateWtd/create/problem`,
method: "get",
params
})
}
}

View File

@@ -205,6 +205,15 @@
content="选择移动/复制" content="选择移动/复制"
> >
</a-popconfirm> </a-popconfirm>
<!-- w1:外部下拉选项组件 -->
<roundRight
:fvisible="roundRightVisible"
@update:visible="roundRightVisible = false"
:container="roundRightContainer"
@click-problem-show="handleProblemShowClick"
></roundRight>
<!-- w2:轮次的问题单ma-crud这里要传参2个首先是请求另外一个接口然后取消是否关联字段 -->
<problem-choose ref="problemRoundRef" hasRelated="roundProblem" :title="problemTitle"></problem-choose>
</template> </template>
<script setup> <script setup>
@@ -219,6 +228,10 @@ import copyApi from "@/api/treeOperation/copy"
import caseApi from "@/api/project/case" import caseApi from "@/api/project/case"
import designApi from "@/api/project/designDemand" import designApi from "@/api/project/designDemand"
import demandApi from "@/api/project/testDemand" import demandApi from "@/api/project/testDemand"
// 轮次的右键菜单,单独一个组件 -> 在treeComponents里面
import roundRight from "./treeComponents/roundRight.vue"
// 问题单ma-crud
import ProblemChoose from "@/views/project/case/components/ProblemChoose.vue"
import { Message, Notification, Tr } from "@arco-design/web-vue" import { Message, Notification, Tr } from "@arco-design/web-vue"
import { useRoute } from "vue-router" import { useRoute } from "vue-router"
import { useRouter } from "vue-router" import { useRouter } from "vue-router"
@@ -731,10 +744,17 @@ const popupVisible = ref(false)
const popupContainer = ref() const popupContainer = ref()
/// 组件全局 /// 组件全局
const rightClickNode = { level: 3, isLeaf: false, nodekey: "", title: "" } const rightClickNode = { level: 3, isLeaf: false, nodekey: "", title: "" }
/// 轮次右键dropdown显示变量
const roundRightVisible = ref(false)
/// 轮次右键dropdown的容器
const roundRightContainer = ref(null)
/// 轮次问题单标题表里
const problemTitle = ref("第1轮问题单")
/// 紧点击测试项节点显示右键菜单 /// 紧点击测试项节点显示右键菜单
const displayRightMenu = (e) => { const displayRightMenu = (e) => {
const { proxy } = e.target.__vueParentComponent const { proxy } = e.target.__vueParentComponent
const { level, isLeaf, nodekey, title } = proxy const { level, isLeaf, nodekey, title } = proxy
// 如果是测试项则弹出【1.根据测试项步骤生成当前测试项用例 2.复制测试项到设计需求】
if (level === 3) { if (level === 3) {
e.preventDefault() e.preventDefault()
// 首先将被右键点击的node储存到组件全局 // 首先将被右键点击的node储存到组件全局
@@ -746,6 +766,22 @@ const displayRightMenu = (e) => {
popupContainer.value = e.target popupContainer.value = e.target
popupVisible.value = true popupVisible.value = true
} }
if (level === 0) {
// 测试显示下拉框
e.preventDefault()
rightClickNode.level = level
rightClickNode.isLeaf = isLeaf
rightClickNode.nodekey = nodekey
rightClickNode.title = title
problemTitle.value = `${+rightClickNode.nodekey + 1}轮问题单`
roundRightContainer.value = e.target.parentElement
roundRightVisible.value = true
}
}
/// 点击轮次-用户选择了打开问题单
const handleProblemShowClick = () => {
// 这里要显示轮次的问题单
problemRoundRef.value.open(rightClickNode.nodekey)
} }
/// 点击popup自动生成对应测试项的用例按钮处理函数 /// 点击popup自动生成对应测试项的用例按钮处理函数
const handleDoptionClickGreateCases = async () => { const handleDoptionClickGreateCases = async () => {
@@ -912,6 +948,8 @@ const paoCancel2 = async () => {
routeViewRef.value.refresh() routeViewRef.value.refresh()
Notification.success("复制用例成功") Notification.success("复制用例成功")
} }
// ~~~~大功能:轮次问题单~~~~
const problemRoundRef = ref(null)
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>

View File

@@ -0,0 +1,65 @@
<template>
<div>
<a-dropdown
@select="handleSelect"
:popup-visible="fvisible"
:popup-container="container"
@popup-visible-change="change"
position="bottom"
alignPoint
:style="{ display: 'block' }"
>
<div
:style="{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: '300px',
backgroundColor: 'var(--color-fill-2)'
}"
></div>
<template #content>
<a-dgroup title="执行操作">
<a-doption @click="handleProblemShow">
<template #icon>
<icon-list />
</template>
查看轮次下问题单
</a-doption>
</a-dgroup>
</template>
</a-dropdown>
</div>
</template>
<script setup>
const props = defineProps({
fvisible: {
type: Boolean,
default() {
return false
}
},
container: {
type: Object,
default() {
return false
}
}
})
const emits = defineEmits(["update:visible", "click-problem-show"])
// 点击查看问题单列表
const handleSelect = async (value) => {
emits("update:visible") // 给父组件传递关闭弹窗
}
// 点击空白取消显示
const change = () => {
emits("update:visible") // 给父组件传递关闭弹窗
}
// 点击给父组件发生事件
const handleProblemShow = () => {
emits("click-problem-show")
}
</script>
<style lang="less" scoped></style>

View File

@@ -1,6 +1,6 @@
<template> <template>
<a-modal v-model:visible="visible" width="1200px" :footer="false"> <a-modal v-model:visible="visible" width="1200px" :footer="false" draggable>
<template #title>关联添加问题单</template> <template #title>{{ title }}</template>
<!-- crud组件 --> <!-- crud组件 -->
<div class="lg:w-full w-full"> <div class="lg:w-full w-full">
<ma-crud :options="crudOptions" :columns="columns" ref="crudRef"> <ma-crud :options="crudOptions" :columns="columns" ref="crudRef">
@@ -34,6 +34,17 @@ import problemApi from "@/api/project/problem"
import { Message } from "@arco-design/web-vue" import { Message } from "@arco-design/web-vue"
import { useRoute, useRouter } from "vue-router" import { useRoute, useRouter } from "vue-router"
const route = useRoute() const route = useRoute()
// 定义props
const props = defineProps({
hasRelated: {
type: String,
default: "relatedProblem"
},
title: {
type: String,
default: "添加关联问题单"
}
})
// 定义emits // 定义emits
const emits = defineEmits(["deleted", "relatedOrunrelated"]) const emits = defineEmits(["deleted", "relatedOrunrelated"])
@@ -70,9 +81,18 @@ const visible = ref(false)
// 定义open事件 // 定义open事件
const open = (row) => { const open = (row) => {
if (props.hasRelated === "roundProblem") {
const columnService = crudRef.value.getColumnService()
columnService.get("related").setAttr("hide", true)
crudRef.value.requestParams = { round_key: row }
crudRef.value.requestData() // 这里要变化请求的API变化
visible.value = true
}
if (props.hasRelated === "relatedProblem") {
crudRef.value.requestData() // 手动请求数据 crudRef.value.requestData() // 手动请求数据
visible.value = true visible.value = true
} }
}
// crudOptions设置 // crudOptions设置
const crudOptions = ref({ const crudOptions = ref({
autoRequest: false, // 取消自己请求数据,后续自己调用方法请求 autoRequest: false, // 取消自己请求数据,后续自己调用方法请求
@@ -81,6 +101,7 @@ const crudOptions = ref({
rowSelection: { showCheckedAll: true }, rowSelection: { showCheckedAll: true },
operationWidth: 160, operationWidth: 160,
operationColumnAlign: "center", operationColumnAlign: "center",
add: { show: true, api: problemApi.save, text: "新增无关联用例的问题单" },
edit: { show: true, api: problemApi.modalupdate }, edit: { show: true, api: problemApi.modalupdate },
delete: { show: true, api: problemApi.delete }, delete: { show: true, api: problemApi.delete },
parameters: { parameters: {
@@ -120,31 +141,33 @@ const crudOptions = ref({
] ]
}, },
{ {
formType: "divider", formType: "divider"
title: "问题详情"
}, },
{ {
dataIndex: "operation" dataIndex: "operation"
}, },
{
dataIndex: "expect"
},
{ {
dataIndex: "result" dataIndex: "result"
}, },
{ {
dataIndex: "rules" title: "开发方回填",
formType: "divider"
}, },
{ {
dataIndex: "suggest" dataIndex: "analysis"
}, },
{ {
formType: "divider", dataIndex: "effect_scope"
title: "解决问题"
}, },
{ {
dataIndex: "solve" dataIndex: "solve"
}, },
{
formType: "divider"
},
{
dataIndex: "verify_result"
},
{ {
formType: "divider", formType: "divider",
title: "人员信息" title: "人员信息"
@@ -169,13 +192,6 @@ const crudOptions = ref({
{ span: 12, formList: [{ dataIndex: "verifyPerson" }] }, { span: 12, formList: [{ dataIndex: "verifyPerson" }] },
{ span: 12, formList: [{ dataIndex: "verifyDate" }] } { span: 12, formList: [{ dataIndex: "verifyDate" }] }
] ]
},
{
formType: "grid",
cols: [
{ span: 12, formList: [{ dataIndex: "revokePerson" }] },
{ span: 12, formList: [{ dataIndex: "revokeDate" }] }
]
} }
] ]
}, },
@@ -297,7 +313,7 @@ const columns = ref([
} }
}, },
{ {
title: "问题操作", title: "问题描述",
hide: true, hide: true,
search: true, search: true,
dataIndex: "operation", dataIndex: "operation",
@@ -305,44 +321,47 @@ const columns = ref([
addDefaultValue: "" addDefaultValue: ""
}, },
{ {
title: "期望结果", title: "问题影响",
hide: true,
dataIndex: "expect",
addDefaultValue: ""
},
{
title: "问题结果",
hide: true, hide: true,
dataIndex: "result", dataIndex: "result",
formType: "editor", formType: "editor",
addDefaultValue: "" addDefaultValue: ""
}, },
{ {
title: "违反规则", title: "原因分析",
hide: true, hide: true,
dataIndex: "rules", dataIndex: "analysis",
formType: "editor",
addDefaultValue: "" addDefaultValue: ""
}, },
{ {
title: "修改建议", title: "影响域分析",
hide: true, hide: true,
dataIndex: "suggest", dataIndex: "effect_scope",
formType: "editor",
addDefaultValue: "" addDefaultValue: ""
}, },
{ {
title: "处理方式", title: "改正措施",
hide: true, hide: true,
dataIndex: "solve", dataIndex: "solve",
addDefaultValue: "", addDefaultValue: "",
formType: "textarea" formType: "textarea"
}, },
{ {
title: "提单人", title: "回归结果",
hide: true,
dataIndex: "verify_result",
addDefaultValue: "",
formType: "editor"
},
{
title: "测试人员",
dataIndex: "postPerson", dataIndex: "postPerson",
search: true, search: true,
hide: true, hide: true,
formType: "select", formType: "select",
commonRules: [{ required: true, message: "提单人必填" }], commonRules: [{ required: true, message: "测试人员必填" }],
dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } } dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } }
}, },
{ {
@@ -357,14 +376,14 @@ const columns = ref([
let tagObj let tagObj
if (record.hang) { if (record.hang) {
tagObj = ( tagObj = (
<a-tag size="small" bordered color="green"> <a-tag size="small" bordered color="red">
有关联用例 悬挂
</a-tag> </a-tag>
) )
} else { } else {
tagObj = ( tagObj = (
<a-tag size="small" bordered color="red"> <a-tag size="small" bordered color="green">
悬挂 有关联用例
</a-tag> </a-tag>
) )
} }
@@ -380,50 +399,37 @@ const columns = ref([
editDisplay: false editDisplay: false
}, },
{ {
title: "提单日期", title: "测试日期",
hide: true, hide: true,
dataIndex: "postDate", dataIndex: "postDate",
formType: "date" formType: "date"
}, },
{ {
title: "设师上级", title: "开发人员",
hide: true, hide: true,
dataIndex: "designerPerson", dataIndex: "designerPerson",
commonRules: [{ required: true, message: "提单人必填" }] formType: "input",
commonRules: [{ required: true, message: "开发人员必填" }]
}, },
{ {
title: "确认日期", title: "开发方日期",
hide: true, hide: true,
dataIndex: "designDate", dataIndex: "designDate",
formType: "date" formType: "date"
}, },
{ {
title: "验证人", title: "回归人员",
hide: true, hide: true,
dataIndex: "verifyPerson", dataIndex: "verifyPerson",
formType: "select", formType: "select",
commonRules: [{ required: true, message: "提单人必填" }], commonRules: [{ required: true, message: "回归人" }],
dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } } dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } }
}, },
{ {
title: "验证日期", title: "回归日期",
hide: true, hide: true,
dataIndex: "verifyDate", dataIndex: "verifyDate",
formType: "date" formType: "date"
},
{
title: "撤销人",
hide: true,
dataIndex: "revokePerson",
formType: "select",
commonRules: [{ required: true, message: "提单人必填" }],
dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } }
},
{
title: "撤销日期",
hide: true,
dataIndex: "revokeDate",
formType: "date"
} }
]) ])

View File

@@ -132,31 +132,33 @@ const crudOptions = ref({
] ]
}, },
{ {
formType: "divider", formType: "divider"
title: "问题详情"
}, },
{ {
dataIndex: "operation" dataIndex: "operation"
}, },
{
dataIndex: "expect"
},
{ {
dataIndex: "result" dataIndex: "result"
}, },
{
dataIndex: "rules"
},
{
dataIndex: "suggest"
},
{ {
formType: "divider", formType: "divider",
title: "解决问题" title: "开发方回填"
},
{
dataIndex: "analysis"
},
{
dataIndex: "effect_scope"
}, },
{ {
dataIndex: "solve" dataIndex: "solve"
}, },
{
formType: "divider"
},
{
dataIndex: "verify_result"
},
{ {
formType: "divider", formType: "divider",
title: "人员信息" title: "人员信息"
@@ -182,13 +184,6 @@ const crudOptions = ref({
{ span: 12, formList: [{ dataIndex: "verifyDate" }] } { span: 12, formList: [{ dataIndex: "verifyDate" }] }
] ]
}, },
{
formType: "grid",
cols: [
{ span: 12, formList: [{ dataIndex: "revokePerson" }] },
{ span: 12, formList: [{ dataIndex: "revokeDate" }] }
]
}
] ]
} }
}) })
@@ -303,7 +298,7 @@ const crudColumns = ref([
} }
}, },
{ {
title: "问题操作", title: "问题描述",
hide: true, hide: true,
search: true, search: true,
dataIndex: "operation", dataIndex: "operation",
@@ -311,65 +306,69 @@ const crudColumns = ref([
addDefaultValue: "" addDefaultValue: ""
}, },
{ {
title: "期望结果", title: "问题影响",
hide: true,
dataIndex: "expect",
addDefaultValue: ""
},
{
title: "问题结果",
hide: true, hide: true,
dataIndex: "result", dataIndex: "result",
formType: "editor", formType: "editor",
addDefaultValue: "" addDefaultValue: ""
}, },
{ {
title: "违反规则", title: "原因分析",
hide: true, hide: true,
dataIndex: "rules", dataIndex: "analysis",
formType: "editor",
addDefaultValue: "" addDefaultValue: ""
}, },
{ {
title: "修改建议", title: "影响域分析",
hide: true, hide: true,
dataIndex: "suggest", dataIndex: "effect_scope",
formType: "editor",
addDefaultValue: "" addDefaultValue: ""
}, },
{ {
title: "处理方式", title: "改正措施",
hide: true, hide: true,
dataIndex: "solve", dataIndex: "solve",
addDefaultValue: "", addDefaultValue: "",
formType: "textarea" formType: "textarea"
}, },
{ {
title: "提单人", title: "回归结果",
hide: true,
dataIndex: "verify_result",
addDefaultValue: "",
formType: "editor"
},
{
title: "测试人员",
dataIndex: "postPerson", dataIndex: "postPerson",
search: true, search: true,
formType: "select", formType: "select",
commonRules: [{ required: true, message: "提单人必填" }], commonRules: [{ required: true, message: "测试人员必填" }],
dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } } dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } }
}, },
{ {
title: "提单日期", title: "测试日期",
hide: true, hide: true,
dataIndex: "postDate", dataIndex: "postDate",
formType: "date" formType: "date"
}, },
{ {
title: "设师上级", title: "开发人员",
hide: true, hide: true,
dataIndex: "designerPerson", dataIndex: "designerPerson",
commonRules: [{ required: true, message: "提单人必填" }] formType: "input",
commonRules: [{ required: true, message: "开发人员必填" }],
}, },
{ {
title: "确认日期", title: "开发方日期",
hide: true, hide: true,
dataIndex: "designDate", dataIndex: "designDate",
formType: "date" formType: "date"
}, },
{ {
title: "验证人", title: "回归人员",
hide: true, hide: true,
dataIndex: "verifyPerson", dataIndex: "verifyPerson",
formType: "select", formType: "select",
@@ -377,25 +376,11 @@ const crudColumns = ref([
dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } } dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } }
}, },
{ {
title: "验证日期", title: "回归日期",
hide: true, hide: true,
dataIndex: "verifyDate", dataIndex: "verifyDate",
formType: "date" formType: "date"
}, },
{
title: "撤销人",
hide: true,
dataIndex: "revokePerson",
formType: "select",
commonRules: [{ required: true, message: "提单人必填" }],
dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } }
},
{
title: "撤销日期",
hide: true,
dataIndex: "revokeDate",
formType: "date"
}
]) ])
</script> </script>

View File

@@ -63,6 +63,7 @@ const crudOptions = ref({
}, },
operationWidth: 500, operationWidth: 500,
showIndex: false, showIndex: false,
showTools: false,
rowSelection: { showCheckedAll: true }, rowSelection: { showCheckedAll: true },
searchColNumber: 3, searchColNumber: 3,
tablePagination: false, tablePagination: false,
@@ -180,7 +181,7 @@ const crudColumns = ref([
align: "center", align: "center",
dataIndex: "black_line", dataIndex: "black_line",
formType: "input-number", formType: "input-number",
commonRules: [{ required: true, message: "空行数必填" }], commonRules: [{ required: true, message: "空行数必填" }]
}, },
{ {
title: "纯代码行", title: "纯代码行",
@@ -188,7 +189,7 @@ const crudColumns = ref([
align: "center", align: "center",
dataIndex: "code_line", dataIndex: "code_line",
formType: "input-number", formType: "input-number",
commonRules: [{ required: true, message: "纯代码行数必填" }], commonRules: [{ required: true, message: "纯代码行数必填" }]
}, },
{ {
title: "纯注释行", title: "纯注释行",
@@ -196,7 +197,7 @@ const crudColumns = ref([
align: "center", align: "center",
dataIndex: "comment_line", dataIndex: "comment_line",
formType: "input-number", formType: "input-number",
commonRules: [{ required: true, message: "纯注释行数必填" }], commonRules: [{ required: true, message: "纯注释行数必填" }]
}, },
{ {
title: "混合行", title: "混合行",
@@ -204,7 +205,7 @@ const crudColumns = ref([
align: "center", align: "center",
dataIndex: "mix_line", dataIndex: "mix_line",
formType: "input-number", formType: "input-number",
commonRules: [{ required: true, message: "混合行数必填" }], commonRules: [{ required: true, message: "混合行数必填" }]
}, },
{ {
title: "注释率 %", title: "注释率 %",

View File

@@ -18,6 +18,7 @@
<p><a-link @click="createBgItem(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="createHsmItem(record)">回归说明二级文档</a-link></p>
<p><a-link @click="createHjlItem(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 @click="createSeitaiDagang(record)"><icon-eye />[测试]生成最后大纲</a-link>
</p> </p>
@@ -36,6 +37,9 @@
<p> <p>
<a-link @click="createSeitaiHjl(record)"><icon-eye />[测试]回归测试记录</a-link> <a-link @click="createSeitaiHjl(record)"><icon-eye />[测试]回归测试记录</a-link>
</p> </p>
<p>
<a-link @click="createSeitaiWtd(record)"><icon-eye />[测试]生成问题单</a-link>
</p>
</template> </template>
</a-popover> </a-popover>
<a-link @click="enterWorkPlant(record)">进入工作区</a-link> <a-link @click="enterWorkPlant(record)">进入工作区</a-link>
@@ -64,6 +68,7 @@ import jlGenerateApi from "@/api/generate/jlGenerate"
import bgGenerateApi from "@/api/generate/bgGenerate" import bgGenerateApi from "@/api/generate/bgGenerate"
import hsmGenerateApi from "@/api/generate/hsmGenerate" import hsmGenerateApi from "@/api/generate/hsmGenerate"
import hjlGenerateApi from "@/api/generate/hjlGenerate" import hjlGenerateApi from "@/api/generate/hjlGenerate"
import wtdGenerateApi from "@/api/generate/wtdGenerate"
import { Message } from "@arco-design/web-vue" import { Message } from "@arco-design/web-vue"
import Progress from "./cpns/progress.vue" import Progress from "./cpns/progress.vue"
import hoosk from "@/views/testmanage/projmanage/hooks.js" import hoosk from "@/views/testmanage/projmanage/hooks.js"
@@ -118,6 +123,11 @@ const createSeitaiHjl = async (record) => {
ptext.value = "回归测试记录" ptext.value = "回归测试记录"
hoosk.create_entire_doc(visible, isComplete, seitaiGenerateApi.createHjlDocument, record.id) hoosk.create_entire_doc(visible, isComplete, seitaiGenerateApi.createHjlDocument, record.id)
} }
// ~~~~~~~~问题单~~~~~~~~
const createSeitaiWtd = async (record) => {
ptext.value = "问题单"
hoosk.create_entire_doc(visible, isComplete, seitaiGenerateApi.createWtdDocument, record.id)
}
// 记录生成二级文档 // 记录生成二级文档
const createJLItem = async (record) => { const createJLItem = async (record) => {
@@ -232,6 +242,11 @@ const createHjlItem = async (record) => {
const st = await hjlGenerateApi.createCaseinfo({ id: record.id }) const st = await hjlGenerateApi.createCaseinfo({ id: record.id })
Message.success(st.message) Message.success(st.message)
} }
// 问题单二级文档
const createWtdItem = async (record) => {
const st = await wtdGenerateApi.createWtdTable({ id: record.id })
Message.success(st.message)
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~