|
|
|
@ -1,31 +1,35 @@ |
|
|
|
<template> |
|
|
|
<section class="padding"> |
|
|
|
<section> |
|
|
|
<el-row :class="{'row-box':true,'cfg':isRptCfg}"> |
|
|
|
<div class="rpt-title">{{ rawDatas.name }}</div> |
|
|
|
<el-input class="input" v-model="rawDatas.name" placeholder="计划名称"/> |
|
|
|
<div class="rpt-title">{{ rawDatas.productName }}</div> |
|
|
|
<el-input class="input" v-model="rawDatas.productName" placeholder="报告名称"/> |
|
|
|
</el-row> |
|
|
|
<el-row :class="{'row-box':true,'cfg':isRptCfg}"> |
|
|
|
<div class="title">{{ title?title:'报告概览' }}</div> |
|
|
|
<el-input class="input" v-model="title" placeholder="报告概览"/> |
|
|
|
</el-row> |
|
|
|
<el-row class="padding"> |
|
|
|
<el-row class="padding-top padding-left padding-right"> |
|
|
|
<span>数据汇总</span> |
|
|
|
</el-row> |
|
|
|
<el-row ref="table"> |
|
|
|
<el-row class="box"> |
|
|
|
<el-row class="box padding" > |
|
|
|
<el-col :span="6" class="box-red"> |
|
|
|
<div class="box-info"> |
|
|
|
<div class="num">{{rawDatas.totalCases?rawDatas.totalCases:'0'}}个</div> |
|
|
|
<div class="label">用例数</div> |
|
|
|
<div class="num">{{rawDatas.taskCnt?rawDatas.taskCnt:'0'}}个</div> |
|
|
|
<div class="label">总任务数</div> |
|
|
|
</div> |
|
|
|
</el-col> |
|
|
|
<el-col :span="6" class="box-blue"> |
|
|
|
<div class="box-info"> |
|
|
|
<div class="num">{{caseFuGaiLv}}%</div> |
|
|
|
<div class="label">用例覆盖率</div> |
|
|
|
<div class="num">{{rawDatas.menuCnt?rawDatas.menuCnt:'0'}}个</div> |
|
|
|
<div class="label">需求数</div> |
|
|
|
</div> |
|
|
|
</el-col> |
|
|
|
<el-col :span="6" class="box-green"> |
|
|
|
<div class="box-info"> |
|
|
|
<div class="num">{{caseTongGuoLv}}%</div> |
|
|
|
<div class="label">用例通过率</div> |
|
|
|
<div class="num">{{rawDatas.testCases?rawDatas.testCases:'0'}}个</div> |
|
|
|
<div class="label">测试用例数</div> |
|
|
|
</div> |
|
|
|
</el-col> |
|
|
|
<el-col :span="6" class="box-orange"> |
|
|
|
@ -35,52 +39,39 @@ |
|
|
|
</div> |
|
|
|
</el-col> |
|
|
|
</el-row> |
|
|
|
<!--编辑界面 XmTestPlan 测试计划--> |
|
|
|
<el-form :model="rawDatas" label-width="120px" :rules="rawDatasRules" ref="rawDatasRef" label-position="left"> |
|
|
|
</el-row> |
|
|
|
<el-row class="padding-top padding-left padding-right"> |
|
|
|
<span>责任人</span> |
|
|
|
</el-row> |
|
|
|
<el-row class="padding"> |
|
|
|
<el-col :span="8"> |
|
|
|
<mdp-select-user-xm label="负责人" userid-key="cuserid" username-key="cusername" v-model="rawDatas"></mdp-select-user-xm> |
|
|
|
<el-col :span="6"> |
|
|
|
<mdp-select-user-xm label="主管领导" userid-key="admUserid" username-key="admUsername" v-model="rawDatas"></mdp-select-user-xm> |
|
|
|
</el-col> |
|
|
|
<el-col :span="8"> |
|
|
|
<mdp-select-dict-x label="状态" :dict="dicts['testPlanStatus']" v-model="rawDatas.status"></mdp-select-dict-x> |
|
|
|
<el-col :span="6"> |
|
|
|
<mdp-select-user-xm label="负责人" userid-key="pmUserid" username-key="pmUsername" v-model="rawDatas"></mdp-select-user-xm> |
|
|
|
</el-col> |
|
|
|
|
|
|
|
<el-col :span="8"> |
|
|
|
<mdp-select-dict-x label="测试结果" :dict="dicts['testPlanTcode']" v-model="rawDatas.tcode"></mdp-select-dict-x> |
|
|
|
<el-col :span="6"> |
|
|
|
<mdp-select-user-xm label="助理" userid-key="assUserid" username-key="assUsername" v-model="rawDatas"></mdp-select-user-xm> |
|
|
|
</el-col> |
|
|
|
<el-col :span="6"> |
|
|
|
<mdp-select-dict-x label="状态" :dict="dicts['xmProductPstatus']" v-model="rawDatas.pstatus"></mdp-select-dict-x> |
|
|
|
</el-col> |
|
|
|
</el-row> |
|
|
|
<el-form-item label="归属测试库" prop="casedbName"> |
|
|
|
{{rawDatas.casedbName}} |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="归属项目" prop="projectId"> |
|
|
|
|
|
|
|
<span v-if="opType=='add'"> |
|
|
|
<xm-project-select v-if="!selProject || !selProject.id" ref="xmProjectSelect" :link-product-id="xmTestCasedb? xmTestCasedb.productId:null" @row-click="onPorjectConfirm" :auto-select="false"> |
|
|
|
<span slot="title">选择项目</span> |
|
|
|
</xm-project-select> |
|
|
|
<div v-else>{{rawDatas.projectName}}</div> |
|
|
|
</span> |
|
|
|
<div v-else>{{rawDatas.projectName}}</div> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="归属产品" prop="productName"> |
|
|
|
{{rawDatas.productName}} |
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
<el-form-item label="起止时间" prop="stime"> |
|
|
|
<mdp-date-range :auto-default="false" placeholder="选择日期" v-model="rawDatas" start-key="stime" end-key="etime" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd" ></mdp-date-range> |
|
|
|
</el-form-item> |
|
|
|
</el-form> |
|
|
|
<el-row class="padding-top padding-left padding-right"> |
|
|
|
<span>起始时间</span> |
|
|
|
</el-row> |
|
|
|
<el-row class="padding"> |
|
|
|
<mdp-date-range :auto-default="false" placeholder="选择日期" v-model="rawDatas" start-key="startTime" end-key="endTime" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd" ></mdp-date-range> |
|
|
|
</el-row> |
|
|
|
<el-row class="padding-bottom"> |
|
|
|
<el-row class="padding-top padding-left padding-right"> |
|
|
|
<span>报告总结</span> |
|
|
|
</el-row> |
|
|
|
<el-row> |
|
|
|
<el-input type="textarea" :rows="8" v-model="rawDatas.summaryRemark"></el-input> |
|
|
|
<el-row class="padding"> |
|
|
|
<el-input type="textarea" :rows="8" v-model="remark"></el-input> |
|
|
|
</el-row> |
|
|
|
</el-row> |
|
|
|
<el-row v-if="rawDatas.summaryRemark!==rawDatasBak.summaryRemark" > |
|
|
|
<span style="float:right;"> |
|
|
|
<el-button type="primary" @click.native="editSomeFields(rawDatas,'summaryRemark',rawDatas.summaryRemark)">提交</el-button> |
|
|
|
</span> |
|
|
|
</el-row> |
|
|
|
</section> |
|
|
|
</template> |
|
|
|
@ -88,50 +79,26 @@ |
|
|
|
<script> |
|
|
|
import util from '@/common/js/util';//全局公共库 |
|
|
|
import config from "@/common/config"; //全局公共库import |
|
|
|
import { initDicts, addXmTestPlan,editXmTestPlan,editSomeFieldsXmTestPlan } from '@/api/xm/core/xmTestPlan'; |
|
|
|
import { initDicts } from '@/api/xm/core/xmProduct'; |
|
|
|
import { mapGetters } from 'vuex' |
|
|
|
import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect'; |
|
|
|
|
|
|
|
import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修改界面 |
|
|
|
export default { |
|
|
|
name:'xmTestPlanEdit', |
|
|
|
name:'productRptOverview', |
|
|
|
components: { |
|
|
|
XmProjectSelect,MdpSelectUserXm, |
|
|
|
}, |
|
|
|
computed: { |
|
|
|
...mapGetters([ 'userInfo' ]), |
|
|
|
caseFuGaiLv(){ |
|
|
|
if(!this.rawDatas.totalCases){ |
|
|
|
return 0 |
|
|
|
} |
|
|
|
var okCases=parseInt(this.rawDatas.okCases>0?this.rawDatas.okCases:0) |
|
|
|
var errCases=parseInt(this.rawDatas.errCases>0?this.rawDatas.errCases:0) |
|
|
|
var igCases=parseInt(this.rawDatas.igCases>0?this.rawDatas.igCases:0) |
|
|
|
var blCases=parseInt(this.rawDatas.blCases>0?this.rawDatas.blCases:0) |
|
|
|
var totalExecs=okCases+errCases+igCases+blCases |
|
|
|
var rate=parseInt(totalExecs/this.rawDatas.totalCases*100) |
|
|
|
return rate; |
|
|
|
}, |
|
|
|
caseTongGuoLv(){ |
|
|
|
if(!this.rawDatas.totalCases){ |
|
|
|
return 0 |
|
|
|
} |
|
|
|
var okCases=parseInt(this.rawDatas.okCases>0?this.rawDatas.okCases:0) |
|
|
|
var errCases=parseInt(this.rawDatas.errCases>0?this.rawDatas.errCases:0) |
|
|
|
var igCases=parseInt(this.rawDatas.igCases>0?this.rawDatas.igCases:0) |
|
|
|
var blCases=parseInt(this.rawDatas.blCases>0?this.rawDatas.blCases:0) |
|
|
|
var totalExecs=okCases+igCases |
|
|
|
var rate=parseInt(totalExecs/this.rawDatas.totalCases*100) |
|
|
|
return rate; |
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
props:['xmTestPlan','visible','opType','selProject','xmTestCasedb','rptDatas','isRptCfg'], |
|
|
|
props:['xmProduct','rptDatas','isRptCfg'], |
|
|
|
|
|
|
|
watch: { |
|
|
|
'xmTestPlan':function( xmTestPlan ) { |
|
|
|
if(xmTestPlan){ |
|
|
|
this.rawDatas = {...xmTestPlan}; |
|
|
|
'xmProduct':function( xmProduct ) { |
|
|
|
if(xmProduct){ |
|
|
|
this.rawDatas = {...xmProduct}; |
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
@ -148,19 +115,14 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修 |
|
|
|
currOpType:'add',//add/edit |
|
|
|
load:{ list: false, edit: false, del: false, add: false },//查询中... |
|
|
|
dicts:{ |
|
|
|
testPlanStatus:[], |
|
|
|
testPlanTcode:[], |
|
|
|
xmProductPstatus:[], |
|
|
|
|
|
|
|
},//下拉选择框的所有静态数据 params={categoryId:'all',itemCodes:['sex']} 返回结果 {sex: [{id:'1',name:'男'},{id:'2',name:'女'}]} |
|
|
|
rawDatasRules: { |
|
|
|
|
|
|
|
}, |
|
|
|
rawDatas: { |
|
|
|
id:'',name:'',casedbId:'',casedbName:'',projectId:'',projectName:'',cuserid:'',cusername:'',ctime:'',stime:'',etime:'',status:'',tcode:'',totalCases:'',okCases:'',errCases:'',igCases:'',blCases:'',productId:'',productName:'',flowState:'',summaryRemark:'' |
|
|
|
}, |
|
|
|
|
|
|
|
rawDatasBak: { |
|
|
|
id:'',name:'',casedbId:'',casedbName:'',projectId:'',projectName:'',cuserid:'',cusername:'',ctime:'',stime:'',etime:'',status:'',tcode:'',totalCases:'',okCases:'',errCases:'',igCases:'',blCases:'',productId:'',productName:'',flowState:'',summaryRemark:'' |
|
|
|
id:'',name:'',casedbId:'',casedbName:'',productId:'',productName:'',cuserid:'',cusername:'',ctime:'',stime:'',etime:'',status:'',tcode:'',taskCnt:'',okCases:'',errCases:'',igCases:'',blCases:'',productId:'',productName:'',flowState:'',summaryRemark:'' |
|
|
|
}, |
|
|
|
maxTableHeight:300, |
|
|
|
summaryRemarkEditVisible:false, |
|
|
|
@ -169,83 +131,15 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修 |
|
|
|
methods: { |
|
|
|
|
|
|
|
...util, |
|
|
|
|
|
|
|
// 取消按钮点击 父组件监听@cancel="rawDatasVisible=false" 监听 |
|
|
|
handleCancel:function(){ |
|
|
|
this.$refs['rawDatasRef'].resetFields(); |
|
|
|
this.$emit('cancel'); |
|
|
|
}, |
|
|
|
//新增、编辑提交XmTestPlan 测试计划父组件监听@submit="afterEditSubmit" |
|
|
|
saveSubmit: function () { |
|
|
|
this.$refs.rawDatasRef.validate((valid) => { |
|
|
|
if (valid) { |
|
|
|
this.$confirm('确认提交吗?', '提示', {}).then(() => { |
|
|
|
this.load.edit=true |
|
|
|
let params = Object.assign({}, this.rawDatas); |
|
|
|
var func=addXmTestPlan |
|
|
|
if(this.currOpType=='edit'){ |
|
|
|
func=editXmTestPlan |
|
|
|
} |
|
|
|
func(params).then((res) => { |
|
|
|
this.load.edit=false |
|
|
|
var tips=res.data.tips; |
|
|
|
if(tips.isOk){ |
|
|
|
this.rawDatas=res.data.data |
|
|
|
this.initData() |
|
|
|
this.currOpType="edit"; |
|
|
|
this.$emit('submit');// @submit="afterAddSubmit" |
|
|
|
} |
|
|
|
this.$notify({ position:'bottom-left',showClose:true, message: tips.msg, type: tips.isOk?'success':'error' }); |
|
|
|
}).catch( err =>this.load.edit=false); |
|
|
|
}); |
|
|
|
}else{ |
|
|
|
this.$notify({ showClose:true, message: "表单验证不通过,请修改表单数据再提交", type: 'error' }); |
|
|
|
} |
|
|
|
}); |
|
|
|
}, |
|
|
|
initData: function(){ |
|
|
|
if(this.xmTestPlan){ |
|
|
|
this.rawDatas = Object.assign({},this.xmTestPlan); |
|
|
|
if(this.xmProduct){ |
|
|
|
this.rawDatas = Object.assign({},this.xmProduct); |
|
|
|
} |
|
|
|
if(this.rptDatas){ |
|
|
|
this.rawDatas=Object.assign({},this.rptDatas) |
|
|
|
} |
|
|
|
this.rawDatasBak={...this.rawDatas} |
|
|
|
}, |
|
|
|
|
|
|
|
editSomeFields(row,fieldName,$event){ |
|
|
|
if(this.opType=='add'){ |
|
|
|
return; |
|
|
|
} |
|
|
|
let params={}; |
|
|
|
params['ids']=[row].map(i=>i.id) |
|
|
|
|
|
|
|
if(fieldName=='stime'){ |
|
|
|
params[fieldName]=$event.stime |
|
|
|
params.etime=$event.etime |
|
|
|
}else if(fieldName=='cuserid'){ |
|
|
|
params[fieldName]=$event[0].userid |
|
|
|
params.cusername=$event[0].username |
|
|
|
}else{ |
|
|
|
params[fieldName]=$event |
|
|
|
} |
|
|
|
var func = editSomeFieldsXmTestPlan |
|
|
|
func(params).then(res=>{ |
|
|
|
let tips = res.data.tips; |
|
|
|
if(tips.isOk){ |
|
|
|
this.rawDatasBak=[...this.rawDatas] |
|
|
|
this.$emit('edit-fields',params) |
|
|
|
}else{ |
|
|
|
Object.assign(this.rawDatas,this.rawDatasBak) |
|
|
|
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'}) |
|
|
|
} |
|
|
|
}).catch((e)=>Object.assign(this.rawDatas,this.rawDatasBak)) |
|
|
|
}, |
|
|
|
onPorjectConfirm(row){ |
|
|
|
this.rawDatas.projectId=row.id |
|
|
|
this.rawDatas.projectName=row.name |
|
|
|
this.rawDatas.name=this.rawDatas.projectName+'-测试计划-V1.0' |
|
|
|
}, |
|
|
|
sizeAutoChange(){ |
|
|
|
|
|
|
|
} |
|
|
|
@ -262,5 +156,5 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修 |
|
|
|
</script> |
|
|
|
|
|
|
|
<style lang="scss" scoped> |
|
|
|
@import url('../index/overview.scss'); |
|
|
|
@import '../index/overview.scss'; |
|
|
|
</style> |