Browse Source

优化

master
陈裕财 2 years ago
parent
commit
bc911d9b1a
  1. 150
      src/views/xm/core/xmIteration/XmIterationEdit.vue
  2. 254
      src/views/xm/core/xmMenu/XmMenuEdit.vue
  3. 242
      src/views/xm/core/xmMenu/XmMenuMng.vue
  4. 346
      src/views/xm/core/xmMenu/XmMenuSelect.vue
  5. 284
      src/views/xm/core/xmProduct/XmProductMng.vue
  6. 516
      src/views/xm/core/xmProject/XmProjectEdit.vue
  7. 428
      src/views/xm/core/xmProject/XmProjectMng.vue
  8. 286
      src/views/xm/core/xmQuestion/XmQuestionEdit.vue
  9. 242
      src/views/xm/core/xmQuestion/XmQuestionMng.vue
  10. 322
      src/views/xm/core/xmTask/XmTaskAdd.vue
  11. 660
      src/views/xm/core/xmTask/XmTaskEdit.vue
  12. 288
      src/views/xm/core/xmTask/XmTaskMng.vue
  13. 242
      src/views/xm/core/xmTestCase/XmTestCaseEdit.vue
  14. 60
      src/views/xm/core/xmTestCase/XmTestCaseMng.vue
  15. 34
      src/views/xm/core/xmTestCase/XmTestCaseSelect.vue
  16. 46
      src/views/xm/core/xmTestCasedb/XmTestCasedbEdit.vue
  17. 50
      src/views/xm/core/xmTestPlan/XmTestPlanEdit.vue
  18. 38
      src/views/xm/core/xmTestPlan/XmTestPlanListForProject.vue
  19. 66
      src/views/xm/core/xmTestPlan/XmTestPlanMng.vue
  20. 40
      src/views/xm/core/xmTestPlan/XmTestPlanSelect.vue
  21. 78
      src/views/xm/core/xmTestPlanCase/TestStepResult.vue
  22. 258
      src/views/xm/core/xmTestPlanCase/XmTestPlanCaseEdit.vue
  23. 110
      src/views/xm/core/xmTestPlanCase/XmTestPlanCaseMng.vue
  24. 62
      src/views/xm/core/xmTestPlanCase/XmTestPlanCaseSelect.vue
  25. 66
      src/views/xm/core/xmWorkload/XmWorkloadList.vue
  26. 80
      src/views/xm/core/xmWorkload/XmWorkloadMng.vue
  27. 50
      src/views/xm/core/xmWorkload/XmWorkloadSimpleList.vue
  28. 80
      src/views/xm/core/xmWorkload/XmWorkloadSimpleListForBizDate.vue
  29. 78
      src/views/xm/rpt/branch/branchRptOverview.vue
  30. 76
      src/views/xm/rpt/iteration/iterationRptOverview.vue
  31. 74
      src/views/xm/rpt/product/productRptOverview.vue
  32. 74
      src/views/xm/rpt/project/projectRptOverview.vue
  33. 52
      src/views/xm/rpt/testCase/testCasedbRptOverview.vue
  34. 80
      src/views/xm/rpt/testPlan/testPlanRptOverview.vue

150
src/views/xm/core/xmIteration/XmIterationEdit.vue

@ -1,62 +1,62 @@
<template>
<section class="padding border">
<section class="padding border">
<el-row>
<!--新增界面 XmIteration 迭代定义-->
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editForm" label-position="left">
<!--新增界面 XmIteration 迭代定义-->
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editForm" label-position="left">
<el-form-item label="迭代名称" prop="iterationName">
<el-input v-model="editForm.iterationName" placeholder="迭代名称 选择上线日期后会自动生成名字" @change="editSomeFields(editForm,'iterationName',$event)"></el-input>
<el-row class="label-font-color" v-if="opType!=='add'"> <span >迭代编号{{editForm.id}} </span><el-divider direction="vertical"></el-divider>{{editForm.productName?editForm.productName:editForm.productId}}
</el-row>
</el-form-item>
</el-form-item>
<el-form-item label="归属产品" prop="seqNo" v-if="opType==='add'">
<xm-product-select v-if=" (!xmProduct||!xmProduct.id)" ref="xmProductSelect" :auto-select="true" :link-project-id="selProject?selProject.id:null" @row-click="onProductRowClick" @clear="onProductClearSelect"></xm-product-select>
{{ xmProduct && xmProduct.id?xmProduct.productName||xmProduct.id:''}}
</el-form-item>
</el-form-item>
<el-row>
<el-col :span="12">
<el-col :span="12">
<el-form-item prop="onlineTime" label-width="0px">
<mdp-date-x label="上线时间" type="date" placeholder="选择日期" v-model="editForm.onlineTime" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd" @change="editSomeFields(editForm,'onlineTime',$event)"></mdp-date-x>
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="12">
<el-form-item prop="startTime" label-width="0px">
<mdp-date-range-x label="起止时间" :auto-default="false" start-key="startTime" end-key="endTime" v-model="editForm" placeholder="选择日期" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd" @change="editSomeFields(editForm,'startTime',$event)"></mdp-date-range-x>
</el-form-item>
</el-form-item>
</el-col>
</el-row>
</el-row>
<el-row>
<el-col :span="12">
<el-col :span="12">
<el-form-item prop="adminUserid" label-width="0px">
<mdp-select-user-xm label="负责人姓名" v-model="editForm" userid-key="adminUserid" username-key="adminUsername" @change="editSomeFields(editForm,'adminUserid',$event)"></mdp-select-user-xm>
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="istatus" label-width="0px">
<mdp-select show-style="x" label="状态" :dict="dicts['iterationStatus']" v-model="editForm.istatus" @change="editSomeFields(editForm,'istatus',$event)"></mdp-select>
</el-form-item>
</el-col>
</el-row>
<mdp-select show-style="x" label="状态" item-code="iterationStatus" v-model="editForm.istatus" @change="editSomeFields(editForm,'istatus',$event)"></mdp-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row v-if="opType=='add'" style="float:right;">
<el-button type="primary" @click="addSubmit">保存</el-button>
</el-row>
</el-row>
</el-row>
</section>
</template>
<script>
import util from '@/common/js/util';//
import util from '@/common/js/util';//
import { initDicts,addXmIteration,editSomeFieldsXmIteration } from '@/api/xm/core/xmIteration';
import { mapGetters } from 'vuex'
import { mapGetters } from 'vuex'
import MdpSelectUserXm from "@/views/xm/core/components/MdpSelectUserXm";
import XmProductSelect from '@/views/xm/core/components/XmProductSelect.vue'
export default {
export default {
computed: {
...mapGetters([
'userInfo','roles'
@ -73,7 +73,7 @@
return 1;
}
}
}
}
},
props:['xmIteration','visible','opType','xmProduct','selProject'],
watch: {
@ -82,9 +82,9 @@
this.initData();
},
deep:true,
},
'visible':function(visible) {
if(visible==true){
},
'visible':function(visible) {
if(visible==true){
this.initData();
}
},
@ -104,7 +104,7 @@
if(!date){
return;
}
if(this.opType!=='add'){
return;
}
@ -115,22 +115,22 @@
},
data() {
return {
dicts:{iterationStatus:[]},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{iterationStatus:[]},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, add: false, del: false, edit: false },//...
editFormRules: {
editFormRules: {
iterationName: [
{ required: true, message: '迭代名称不能为空', trigger: 'change' },
{ min:10,max:250, message: '名称长度在10-250个字符', trigger: 'change' }
],
],
startTime: [
{ required: true, message: '开始时间不能为空', trigger: 'change' },
],
{ required: true, message: '开始时间不能为空', trigger: 'change' },
],
endTime: [
{ required: true, message: '结束时间不能为空', trigger: 'change' },
],
{ required: true, message: '结束时间不能为空', trigger: 'change' },
],
onlineTime: [
{ required: true, message: '上线时间不能为空', trigger: 'change' },
],
{ required: true, message: '上线时间不能为空', trigger: 'change' },
],
},
// ,
editForm: {
@ -149,33 +149,33 @@
handleCancel:function(){
this.$refs['editForm'].resetFields();
this.$emit('cancel');
},
},
/**begin 在下面加自定义方法,记得补上面的一个逗号**/
onUserSelected: function(users) {
onUserSelected: function(users) {
if(users.length>1){
this.$notify.error("只能选一个人");
return;
}
var user=users[0]
var user=users[0]
this.editSomeFields(this.editForm,'adminUserid',user)
this.userSelectVisible = false;
},
},
editSomeFields(row,fieldName,$event){
editSomeFields(row,fieldName,$event){
if(this.opType==='add'){
return;
}
}
this.$refs.editForm.validate((vali)=>{
if(!vali){
this.$notify({position:'bottom-left',showClose:true,message:"表单检查不通过,请修改后提交", type: 'error' });
this.$notify({position:'bottom-left',showClose:true,message:"表单检查不通过,请修改后提交", type: 'error' });
return;
}else{
let params={};
params['ids']=[row].map(i=>i.id)
if(fieldName=='adminUserid'){
params['adminUserid']=$event[0].userid
params['adminUserid']=$event[0].userid
params['adminUsername']=$event[0].username
}else if(fieldName=='startTime'){
params['startTime']=row.startTime
@ -183,7 +183,7 @@
}else{
params[fieldName]=$event
}
var func = editSomeFieldsXmIteration
func(params).then(res=>{
let tips = res.data.tips;
@ -198,68 +198,68 @@
}).catch((e)=>Object.assign(this.editForm,this.editFormBak))
}
});
});
},
initData(){
this.editForm=Object.assign(this.editForm, this.xmIteration);
initData(){
this.editForm=Object.assign(this.editForm, this.xmIteration);
if(this.opType==='add'){
this.editForm.cuserid=this.userInfo.userid
this.editForm.cusername=this.userInfo.username
this.editForm.adminUserid=this.userInfo.userid
this.editForm.adminUsername=this.userInfo.username;
if(this.xmProduct && this.xmProduct.id){
if(this.xmProduct && this.xmProduct.id){
this.editForm.productId=this.xmProduct.id
this.editForm.productName=this.xmProduct.productName;
}
}
}
}
this.editFormBak={...this.editForm}
},
onProductRowClick(product){
this.editForm.productId=product.id
this.editForm.productName=product.productName
},
onProductClearSelect(){
this.editForm.productName=product.productName
},
onProductClearSelect(){
this.editForm.productId=''
this.editForm.productName=''
this.editForm.productName=''
},
//XmIteration @submit="afterAddSubmit"
addSubmit: function () {
addSubmit: function () {
this.$refs.editForm.validate((valid) => {
if (valid) {
var params={...this.editForm}
this.$confirm('确认提交迭代吗?', '提示', {}).then(() => {
this.load.add=true
if (valid) {
var params={...this.editForm}
this.$confirm('确认提交迭代吗?', '提示', {}).then(() => {
this.load.add=true
addXmIteration(params).then((res) => {
this.load.add=false
var tips=res.data.tips;
if(tips.isOk){
if(tips.isOk){
this.$emit('submit',res.data.data);// @submit="afterAddSubmit"
}
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.add=false);
});
}else{
this.$notify({position:'bottom-left',showClose:true,message: "表单验证不通过", type: 'error' });
this.$notify({position:'bottom-left',showClose:true,message: "表单验证不通过", type: 'error' });
}
});
},
/**end 在上面加自定义方法**/
},//end method
components: {
components: {
// 'xm-iteration-edit':XmIterationEdit
MdpSelectUserXm,XmProductSelect,
},
mounted() {
mounted() {
this.$nextTick(()=>{
initDicts(this)
this.initData()
})
/**在下面写其它函数***/
}//end mounted
}
@ -267,4 +267,4 @@
<style scoped>
</style>
</style>

254
src/views/xm/core/xmMenu/XmMenuEdit.vue

@ -1,24 +1,24 @@
<template>
<section>
<el-row :gutter="20" >
<el-row :gutter="20" >
<el-col :span="4" class="border padding">
<h3 class="padding-bottom">
<div class="big-icon" :style="{backgroundColor: calcMenuLabel.color }">
<i :class="calcMenuLabel.icon"></i>
</div>
{{calcMenuLabel.label}}
</h3>
</h3>
<el-steps :active="calcMenuCurrStep" align-center finish-status="success" process-status="process" direction="vertical">
<el-step v-for="(item,index) in dicts.menuStatus" :title="item.name" :description="item.name" :key="index">
<el-step v-for="(item,index) in dicts.menuStatus" :title="item.name" :description="item.name" :key="index">
<span slot="description">
<span v-if="item.id=='0'"><!--打开-->
<el-button class="step-btn" type="primary" @click="activateTabPaneName='1'" plain>基础信息</el-button>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='4'" plain>概述</el-button>
<span v-if="item.id==editForm.status">
<el-button class="step-btn" type="danger" icon="el-icon-d-caret" @click="editXmMenuSomeFields(editForm,'status','1')" plain>设为进行中</el-button>
<el-button class="step-btn" type="danger" icon="el-icon-d-caret" @click="editXmMenuSomeFields(editForm,'status','1')" plain>设为进行中</el-button>
</span>
</span>
</span>
<span v-else-if="item.id=='1'"> <!--执行中-->
<span v-if="item.id==editForm.status">
<span v-if="editForm.dclass<='1'">
@ -26,15 +26,15 @@
<el-button class="step-btn" type="primary" @click="activateTabPaneName='6'" plain>创建故事</el-button>
</span>
<span v-else-if="editForm.dclass=='2'">
<el-button class="step-btn" type="primary" @click="activateTabPaneName='6'" plain>创建故事</el-button>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='6'" plain>创建故事</el-button>
</span>
<span v-else-if="editForm.dclass>='3'">
<el-button class="step-btn" type="primary" @click="activateTabPaneName='6'" plain>创建任务</el-button>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='62'" plain>测试用例</el-button>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='6'" plain>创建缺陷</el-button>
</span>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='6'" plain>创建缺陷</el-button>
</span>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='3'" plain>成本</el-button>
<el-button class="step-btn" type="danger" icon="el-icon-d-caret" @click="editXmMenuSomeFields(editForm,'status','2')" plain>设为已完工</el-button>
<el-button class="step-btn" type="danger" icon="el-icon-d-caret" @click="editXmMenuSomeFields(editForm,'status','2')" plain>设为已完工</el-button>
</span>
<span v-if="item.id!=editForm.status">
<span v-if="editForm.dclass<='1'">
@ -42,134 +42,134 @@
<el-button class="step-btn" type="primary" @click="activateTabPaneName='6'" plain>创建故事</el-button>
</span>
<span v-else-if="editForm.dclass=='2'">
<el-button class="step-btn" type="primary" @click="activateTabPaneName='6'" plain>创建故事</el-button>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='6'" plain>创建故事</el-button>
</span>
<span v-else-if="editForm.dclass>='3'">
<el-button class="step-btn" type="primary" @click="activateTabPaneName='6'" plain>创建任务</el-button>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='62'" plain>测试用例</el-button>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='6'" plain>创建缺陷</el-button>
</span>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='6'" plain>创建缺陷</el-button>
</span>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='3'" plain>成本</el-button>
</span>
</span>
<span v-else-if="item.id=='2'"> <!--已完工-->
<span v-if="item.id==editForm.status">
<span v-else-if="item.id=='2'"> <!--已完工-->
<span v-if="item.id==editForm.status">
<el-button class="step-btn" type="primary" @click="activateTabPaneName='7'" plain>wiki</el-button>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='8'" plain>附件</el-button>
<el-button class="step-btn" type="danger" icon="el-icon-d-caret" @click="editXmMenuSomeFields(editForm,'status','3')" plain>去关闭</el-button>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='8'" plain>附件</el-button>
<el-button class="step-btn" type="danger" icon="el-icon-d-caret" @click="editXmMenuSomeFields(editForm,'status','3')" plain>去关闭</el-button>
</span>
<span v-if="item.id!=editForm.status">
<span v-if="item.id!=editForm.status">
<el-button class="step-btn" type="primary" @click="activateTabPaneName='7'" plain>wiki</el-button>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='8'" plain>附件</el-button>
<el-button class="step-btn" type="primary" @click="activateTabPaneName='8'" plain>附件</el-button>
</span>
</span>
<span v-else-if="item.id=='3'"> <!--已关闭-->
<span v-else-if="item.id=='3'"> <!--已关闭-->
<span v-if="item.id==editForm.status">
<el-button class="step-btn" type="danger" icon="el-icon-d-caret" @click="editXmMenuSomeFields(editForm,'status','0')" plain>去重新打开</el-button>
<el-button class="step-btn" type="danger" icon="el-icon-d-caret" @click="editXmMenuSomeFields(editForm,'status','0')" plain>去重新打开</el-button>
</span>
</span>
</span>
</span>
</el-step>
</el-steps>
</el-step>
</el-steps>
</el-col>
<el-col :span="20">
<el-col :span="20">
<el-form :model="editForm" label-width="100px" label-position="left" :rules="editFormRules" ref="editForm">
<el-form-item prop="menuName">
<template slot="label">
<div class="big-icon" :style="{backgroundColor: calcMenuLabel.color }">
<i :class="calcMenuLabel.icon"></i>
</div>
</div>
{{calcMenuLabel.label}}
</template>
<el-input v-model="editForm.menuName" placeholder="名称" title="名称" @change="editXmMenuSomeFields(editForm,'menuName',$event)">
</template>
<el-input v-model="editForm.menuName" placeholder="名称" title="名称" @change="editXmMenuSomeFields(editForm,'menuName',$event)">
</el-input>
<el-row class="label-font-color">
编号{{editForm.menuId}}
编号{{editForm.menuId}}
<el-divider direction="vertical"></el-divider>
<span v-if="editForm.productName">归属产品{{ editForm.productName}}
<span v-if="editForm.productName">归属产品{{ editForm.productName}}
<el-divider direction="vertical"></el-divider>
</span>
归属产品编号{{ editForm.productId }}
<el-divider direction="vertical"></el-divider>
<el-divider direction="vertical"></el-divider>
<el-button type="text" icon="el-icon-share" @click="copyLink">分享</el-button>
</el-row>
</el-form-item>
<el-row class="padding">
</el-form-item>
<el-row class="padding">
<el-col :span="8">
<mdp-field-x v-if="!editForm.pmenuId" v-model="editForm.pmenuId" :disabled="true" label="上级需求">
<mdp-field-x v-if="!editForm.pmenuId" v-model="editForm.pmenuId" :disabled="true" label="上级需求">
</mdp-field-x>
<mdp-field-x v-else v-model="editForm.pmenuId" :label="editForm.dclass==='3'?'归属特性':(editForm.dclass==='2'?'归属史诗':'归属')" :icon="editForm.dclass==='2'?'el-icon-s-promotion':'el-icon-s-flag'" :color="editForm.dclass==='2'?'rgb(255, 153, 51)':'rgb(0, 153, 51)'">
<div slot="oper">
<el-button
@click="pmenuFormVisible=true"
<div slot="oper">
<el-button
@click="pmenuFormVisible=true"
title="查看上级"
icon="el-icon-upload2"> 查看上级</el-button>
icon="el-icon-upload2"> 查看上级</el-button>
<el-button
@click="parentMenuVisible=true"
@click="parentMenuVisible=true"
title="更换上级"
icon="el-icon-upload2"> 更换上级</el-button>
icon="el-icon-upload2"> 更换上级</el-button>
</div>
</mdp-field-x>
</el-col>
</mdp-field-x>
</el-col>
<el-col :span="8">
<mdp-select-user-xm label="负责人" v-model="editForm" userid-key="mmUserid" username-key="mmUsername" @change="editXmMenuSomeFields(editForm,'mmUserid',$event)"></mdp-select-user-xm>
<mdp-select-user-xm label="负责人" v-model="editForm" userid-key="mmUserid" username-key="mmUsername" @change="editXmMenuSomeFields(editForm,'mmUserid',$event)"></mdp-select-user-xm>
</el-col>
<el-col :span="8">
<mdp-select-user-xm label="提出人" v-model="editForm" userid-key="proposerId" username-key="proposerName" @change="editXmMenuSomeFields(editForm,'proposerId',$event)"></mdp-select-user-xm>
<mdp-select-user-xm label="提出人" v-model="editForm" userid-key="proposerId" username-key="proposerName" @change="editXmMenuSomeFields(editForm,'proposerId',$event)"></mdp-select-user-xm>
</el-col>
</el-row>
</el-row>
<el-row class="padding">
<el-col :span="8">
<mdp-select show-style="x" label="状态" v-model="editForm.status" :dict="dicts['menuStatus']" @change="editXmMenuSomeFields(editForm,'status',$event)">
</mdp-select>
<el-col :span="8">
<mdp-select show-style="x" label="状态" v-model="editForm.status" item-code="menuStatus" @change="editXmMenuSomeFields(editForm,'status',$event)">
</mdp-select>
</el-col>
<el-col :span="8">
<mdp-field-x v-model="editForm.finishRate" label="进度">
<el-col :span="8">
<mdp-field-x v-model="editForm.finishRate" label="进度">
<div slot="value" style="min-width:150px;"><el-progress :percentage="editForm.finishRate?editForm.finishRate:0"></el-progress>
</div>
<div slot="oper"><el-button @click="activateTabPaneName='51'" type="primary">查看工时</el-button><el-button @click="activateTabPaneName='6'" type="primary"></el-button></div>
</mdp-field-x>
</el-col>
<el-col :span="8">
</mdp-field-x>
</el-col>
<el-col :span="8">
<mdp-date-range-x label="起止时间" type="daterange" :style-obj="{maxWidth:'100%'}" :auto-default="false" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd" v-model="editForm" start-key="startTime" end-key="endTime" @change="editXmMenuSomeFields(editForm,'startTime',editForm)"></mdp-date-range-x>
</el-col>
</el-row>
</el-col>
</el-row>
<el-tabs v-model="activateTabPaneName" >
<el-tab-pane label="基本信息" name="1" >
<el-row>
<el-col :span="12">
<el-form-item label="归属模块" prop="funcName" v-if="editForm.dclass>='3'">
<el-col :span="12">
<el-form-item label="归属模块" prop="funcName" v-if="editForm.dclass>='3'">
{{ editForm.funcName }}
<el-button
@click="funcVisible=true"
title="设置模块" > 设置</el-button>
@click="funcVisible=true"
title="设置模块" > 设置</el-button>
</el-form-item>
</el-col>
</el-col>
<el-col :span="12">
<el-form-item label="排序序号" prop="seqNo" >
<el-form-item label="排序序号" prop="seqNo" >
<el-input style="max-width:90%;" v-model="editForm.seqNo" title="序号 如 1.1,1.2.3,1.3.2等" placeholder="如1.0 , 1.1 , 1.1.1等" @change="editXmMenuSomeFields(editForm,'seqNo',$event)"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="12">
<el-form-item label="版本号" prop="sinceVersion" >
<el-input style="max-width:90%;" v-model="editForm.sinceVersion" @change="editXmMenuSomeFields(editForm,'sinceVersion',$event)">
<el-input style="max-width:90%;" v-model="editForm.sinceVersion" @change="editXmMenuSomeFields(editForm,'sinceVersion',$event)">
</el-input>
</el-form-item>
</el-col>
</el-col>
<el-col :span="12">
<el-form-item label="提出时间" prop="ctime" >
<el-date-picker value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd" v-model="editForm.ctime" @change="editXmMenuSomeFields(editForm,'ctime',$event)"></el-date-picker>
@ -195,28 +195,28 @@
<el-option v-for="i in this.dicts.demandLvl" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
</el-col>
<el-col :span="12">
<el-form-item label="优先级" prop="priority" >
<el-select v-model="editForm.priority" @change="editXmMenuSomeFields(editForm,'priority',$event)">
<el-option v-for="i in dicts.priority" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-col>
</el-row>
</el-tab-pane >
<el-tab-pane label="概述" name="4">
<el-form-item prop="remark" label-width="0px">
<el-input type="textarea" :autosize="{ minRows: 6, maxRows: 20}" v-model="editForm.remark" @change="editXmMenuSomeFields(editForm,'remark',editForm.remark)" placeholder="什么人?做什么事?,为什么?如: 作为招聘专员,我需要统计员工半年在职/离职人数,以便我能够制定招聘计划" ></el-input>
</el-form-item>
</el-form-item>
</el-tab-pane>
<el-tab-pane :label="'子工作项( '+(subWorkitemCpd?subWorkitemCpd:0)+' )'" name="6">
<xm-sub-work-item v-if="this.activateTabPaneName=='6'" :parent-xm-menu="editForm" :link-project-id="selProject?selProject.id:null" @sub-work-item-num="setSubWorkItemNum" @add-sub-menu="onAddSubMenu"></xm-sub-work-item>
</el-tab-pane>
</el-tab-pane>
<el-tab-pane :label="'测试用例('+(editForm.testCases?editForm.testCases:0)+')'" name="62">
<xm-test-case-mng v-if="activateTabPaneName=='62'" :xm-product="{id:editForm.productId,productName:editForm.productName}" :xm-menu="editForm"></xm-test-case-mng>
</el-tab-pane>
<el-tab-pane :label="'缺陷('+(editForm.bugCnt?editForm.bugCnt:0)+')'" name="63">
<el-tab-pane :label="'缺陷('+(editForm.bugCnt?editForm.bugCnt:0)+')'" name="63">
<xm-question-mng v-if="activateTabPaneName=='63'" :xm-product="editForm.productId?{id:editForm.productId,productName:editForm.productName}:null" :xm-menu="editForm"></xm-question-mng>
</el-tab-pane>
<el-tab-pane label="成本" name="3">
@ -227,9 +227,9 @@
<el-input-number :disabled="editForm.calcType!=='2' " style="width:200px;" v-model="editForm.actAt" :precision="2" :step="100" :min="0" placeholder="实际金额"></el-input-number>
</el-form-item>
</el-tab-pane>
<el-tab-pane :label="'工时( '+(editForm.actWorkload?editForm.actWorkload:0)+' / '+(editForm.budgetWorkload?editForm.budgetWorkload:0)+' h )'" name="51">
<el-tab-pane :label="'工时( '+(editForm.actWorkload?editForm.actWorkload:0)+' / '+(editForm.budgetWorkload?editForm.budgetWorkload:0)+' h )'" name="51">
<xm-workload-record v-if="activateTabPaneName=='51'" biz-type="5" :xm-menu="editForm" ></xm-workload-record>
</el-tab-pane>
<el-tab-pane label="链接" name="5">
@ -252,11 +252,11 @@
</el-tab-pane>
<el-tab-pane label="wiki" name="7">
<archive-edit v-if="activateTabPaneName=='7' && editForm && editForm.menuId" :xm-menu="editForm"></archive-edit>
</el-tab-pane>
</el-tab-pane>
<el-tab-pane label="附件" name="8">
上传附件
</el-tab-pane>
<el-tab-pane label="关注" name="91">
<el-tab-pane label="关注" name="91">
<xm-my-do-focus v-if="activateTabPaneName=='91'" :biz-id="editForm.menuId" :pbiz-id="editForm.productId" :biz-name="editForm.menuName" focus-type="4"></xm-my-do-focus>
</el-tab-pane>
<el-tab-pane label="日志" name="9">
@ -267,7 +267,7 @@
</el-tab-pane>
</el-tabs>
</el-form>
</el-col>
</el-col>
</el-row>
<el-drawer title="选择提出人" :visible.sync="proposerSelectVisible" size="60%" append-to-body>
<users-select @confirm="onProposerSelected" ref="usersSelect"></users-select>
@ -276,17 +276,17 @@
<el-drawer title="选择跟进人" :visible.sync="mmUserSelectVisible" size="60%" append-to-body>
<users-select @confirm="onMmUserSelected" ref="mmUsersSelect"></users-select>
</el-drawer>
<el-drawer append-to-body title="标签" :visible.sync="tagSelectVisible" class="dialog-body" size="60%">
<tag-mng :tagIds="editForm.tagIds?editForm.tagIds.split(','):[]" :jump="true" @select-confirm="onTagSelected">
</tag-mng>
</el-drawer>
<el-dialog title="上级需求详情" :visible.sync="pmenuFormVisible" :with-header="false" width="90%" top="20px" append-to-body :close-on-click-modal="false" >
<xm-menu-edit v-if="pmenuFormVisible" :reload="true" :xm-menu="{menuId:editForm.pmenuId}" :sel-project="selProject" :visible="pmenuFormVisible" @cancel="pmenuFormVisible=false"></xm-menu-edit>
</el-dialog>
<el-drawer
append-to-body
title="选择上级需求"
@ -294,7 +294,7 @@
size="60%"
:close-on-click-modal="false"
>
<xm-epic-features-select
<xm-epic-features-select
@select="onParentMenuSelected"
:xm-product="{id:editForm.productId,productName:editForm.productName}"
></xm-epic-features-select>
@ -311,14 +311,14 @@
import {listXmMenuWithState,editXmMenu,editXmMenuSomeFields,batchChangeParentMenu } from '@/api/xm/core/xmMenu';
import { mapGetters } from 'vuex'
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
import XmMenuOverview from './XmMenuOverview.vue';
import XmMenuOverview from './XmMenuOverview.vue';
import TagMng from "@/views/mdp/arc/tag/TagMng";
import XmSubWorkItem from "@/views/xm/core/xmMenuWorkItem/XmSubWorkItem";
import XmRecord from '../xmRecord/XmRecord'
import XmRecord from '../xmRecord/XmRecord'
import XmMyDoFocus from '@/views/myWork/my/components/DoFocus';
import ArchiveEdit from '@/views/xm/core/wiki/archive/WikiMenuEdit';
import XmTestCaseMng from '@/views/xm/core/xmTestCase/XmTestCaseMng';
import xmQuestionMng from "@/views/xm/core/xmQuestion/XmQuestionMng";
import XmFuncSelect from '../xmFunc/XmFuncSelect'
@ -329,10 +329,10 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
computed: {
...mapGetters([
'userInfo','roles'
]),
calcMenuCurrStep(){
]),
calcMenuCurrStep(){
var status=this.dicts['menuStatus'].findIndex(i=>this.editForm.status==i.id) +1
return status;
return status;
},
calcMenuLabel(){
var params={label:'工作项',icon:'',color:''};
@ -362,8 +362,8 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
}else{
return this.editForm.childrenCnt
}
}
}
}
},
props:['xmMenu','visible','parentMenu','product','dclass','selProject','reload'],
@ -371,13 +371,13 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
'xmMenu':function( xmMenu ) {
//this.editForm = {...xmMenu};
},
'visible':function(visible) {
'visible':function(visible) {
if(visible==true){
this.subWorkItemNum=0;
if(this.reload==true){
this.searchXmMenus();
}else{
this.editForm = {...this.xmMenu};
this.editForm = {...this.xmMenu};
}
this.activateTabPaneName="4"
this.editFormBak=Object.assign({},this.editForm)
@ -419,12 +419,12 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
menuName: [
{ required: true, message: '需求名称不能为空', trigger: 'change' },
{ min: 2, max: 250, message: '长度在 2 到 250 个字符', trigger: 'change' },//
],
],
mmUserid: [
{ required: true, message: '负责人不能为空', trigger: 'change' }
],
remark: [
{ max: 1000, message: '长度在 0 到 1000 个字符', trigger: 'change' },//
],
remark: [
{ max: 1000, message: '长度在 0 到 1000 个字符', trigger: 'change' },//
],
},
//
@ -434,10 +434,10 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
proposerSelectVisible:false,
mmUserSelectVisible:false,
dicts:{
menuStatus:[
menuStatus:[
]
},
tagSelectVisible:false,
tagSelectVisible:false,
subWorkItemNum:-1,
activateTabPaneName:'4',
pmenuFormVisible:false,
@ -458,7 +458,7 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
this.$emit('cancel');
},
showPmenu(){
},
changePmenu(){
@ -470,7 +470,7 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.load.edit=true
let params = Object.assign({}, this.editForm);
let params = Object.assign({}, this.editForm);
editXmMenu(params).then((res) => {
this.load.edit=false
var tips=res.data.tips;
@ -575,10 +575,10 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
}
var func=(params)=>{
editXmMenuSomeFields(params).then(res=>{
editXmMenuSomeFields(params).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
this.$nextTick(()=>{
this.$nextTick(()=>{
Object.assign(row,params)
})
Object.assign(this.editFormBak,row)
@ -586,26 +586,26 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
if(fieldName==='remark'||fieldName==='link'){
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
}
}else{
this.$nextTick(()=>{
}else{
this.$nextTick(()=>{
Object.assign(row,this.editFormBak)
})
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
}
})
}
if(fieldName=='remark'){
this.$refs.editForm.validateField('remark',err=>{
if(err){
if(err){
this.$notify({position:'bottom-left',showClose:true,message: err,type: 'error'})
return;
}else{
func(params)
}
})
}else if(fieldName=='menuName'){
}else if(fieldName=='menuName'){
this.$refs.editForm.validateField('menuName',err=>{
if(err){
this.$notify({position:'bottom-left',showClose:true,message: err,type: 'error'})
@ -619,24 +619,24 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
}
},
onAddSubMenu(menu){
this.$emit("add-sub-menu",menu)
},
searchXmMenus(){
let callback= (res)=>{
var tips=res.data.tips;
if(tips.isOk){
this.editForm=res.data.data[0]
this.editForm=res.data.data[0]
this.editFormBak=Object.assign({},this.editForm)
}else{
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: 'error' });
}
this.load.list = false;
}
this.load.list = true;
this.load.list = true;
var params={menuId:this.xmMenu.menuId}
listXmMenuWithState(params).then( callback ).catch( err => this.load.list = false );
},
listXmMenuWithState(params).then( callback ).catch( err => this.load.list = false );
},
onParentMenuSelected(menu){
if(!menu||!menu.menuId){
@ -658,7 +658,7 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
})
},
onFuncSelected(row){
this.editForm.funcId=row.id
this.editForm.funcName=row.name
@ -667,20 +667,20 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
this.editXmMenuSomeFields(this.editForm,'funcId',row)
}
},
copyLink(){
var curlDomain=window.location.protocol+"//"+window.location.host; // https://mp.csdn.net
var link=curlDomain+"/"+process.env.CONTEXT+"/"+process.env.VERSION+"/#/xm/core/menu/detail?menuId="+this.editForm.menuId
this.$copyText(link).then(e => {
this.$notify({position:'bottom-left',showClose:true,message:"拷贝链接成功,您可以黏贴到任何地方",type:'success'})
});
},
},
},//end method
components: {
// 'xm-menu-edit':XmMenuEdit
UsersSelect,
XmMenuOverview,
TagMng,
TagMng,
XmSubWorkItem,
XmRecord,
XmMyDoFocus,
@ -699,7 +699,7 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
initSimpleDicts('all',['demandSource','demandLvl','demandType','priority','menuStatus'] ).then(res=>{
this.dicts=res.data.data;
})
this.editForm=Object.assign(this.editForm, this.xmMenu);
this.editForm=Object.assign(this.editForm, this.xmMenu);
this.editFormBak=Object.assign({},this.editForm)
if(this.reload==true){
this.searchXmMenus();
@ -712,7 +712,7 @@ import CommentArea from '../xmMenuComment/comment-area.vue';
</script>
<style scoped>
.step-btn{
margin-left:0px;margin-bottom: 5px;
}

242
src/views/xm/core/xmMenu/XmMenuMng.vue

@ -1,11 +1,11 @@
<template>
<section>
<section>
<el-row>
<xm-product-select ref="xmProductSelect1" style="display:inline;" v-if="(!xmProduct||!xmProduct.id)&&(!xmIteration||!xmIteration.id)" :auto-select="false" :link-project-id="selProject?selProject.id:null" @row-click="onProductSelected" :iterationId="xmIteration?xmIteration.id:null" @clear="onProductClearSelect"></xm-product-select>
<mdp-select v-model="filters.priority" placeholder="优先级" clearable style="width: 6em;" :dict="dicts['priority']">
<mdp-select v-model="filters.priority" placeholder="优先级" clearable style="width: 6em;" item-code="priority">
</mdp-select>
<mdp-select v-model="filters.status" placeholder="状态" clearable style="width: 6em;" :dict="dicts['menuStatus']">
<mdp-select v-model="filters.status" placeholder="状态" clearable style="width: 6em;" item-code="menuStatus">
</mdp-select>
<el-input v-model="filters.key" style="max-width: 15em;" placeholder="需求名称查询" clearable>
</el-input>
@ -17,65 +17,65 @@
width="800"
v-model="moreVisible"
trigger="manual" >
<el-row style="float:right;margin-top:-40px">
<el-button
<el-row style="float:right;margin-top:-40px">
<el-button
icon="el-icon-close"
@click="moreVisible=false"
type="text"
>关闭</el-button
>
</el-row>
>
</el-row>
<el-descriptions class="margin-top" size="mini" :column="2" border>
<template slot="extra">
<el-button @click="showParentMenu" icon="el-icon-top" title="更换上级">更换上级</el-button>
<template slot="extra">
<el-button @click="showParentMenu" icon="el-icon-top" title="更换上级">更换上级</el-button>
<el-button @click="handleExport" icon="el-icon-download">导出</el-button>
<el-button @click="loadTasksToXmMenuState" icon="el-icon-s-marketing">汇总进度</el-button>
<el-button type="danger" @click="batchDel" icon="el-icon-delete" title="删除">删除</el-button>
</template>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-s-grid"></i>
显示方式
</template>
</template>
<el-radio v-model="displayType" label="agileUser">故事看板</el-radio>
<el-radio v-model="displayType" label="table">列表</el-radio>
<el-radio v-model="displayType" label="table">列表</el-radio>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-user"></i>
责任人
</template>
<mdp-select-user-xm style="max-width:180px;" label="选择责任人" v-model="filters.mmUser" :clearable="true"></mdp-select-user-xm>
</el-descriptions-item>
<mdp-select-user-xm style="max-width:180px;" label="选择责任人" v-model="filters.mmUser" :clearable="true"></mdp-select-user-xm>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-key"></i>
需求编号
</template>
<el-input v-model="filters.menuId" placeholder="需求编号查询" clearable></el-input>
</template>
<el-input v-model="filters.menuId" placeholder="需求编号查询" clearable></el-input>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-document"></i>
归属模块
</template>
</template>
<span v-if="filters.func">{{ filters.func.name }}&nbsp;</span><el-button type="text" v-if="filters.func" @click="filters.func=null" icon="el-icon-close"></el-button><el-button @click="funcVisible=true" type="text">选择模块</el-button>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-connection"></i>
归属迭代
</template>
</template>
<xm-iteration-select v-if="!xmIteration || !xmIteration.id" style="display:inline;" :auto-select="false" :product-id="filters.product?filters.product.id:null" :link-project-id="selProject?selProject.id:null" placeholder="迭代" @row-click="onIterationSelected" @clear="onIterationClearSelect">
</xm-iteration-select>
</xm-iteration-select>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-connection"></i>
迭代情况
</template>
</template>
<el-select v-model="filters.iterationFilterType" placeholder="加入过迭代?" clearable >
<el-option value="not-join-any-iteration" label="未加入过迭代"></el-option>
<el-option value="join-any-iteration" label="已加入过迭代"></el-option>
@ -87,7 +87,7 @@
<template slot="label">
<i class="el-icon-time"></i>
任务情况
</template>
</template>
<el-select v-model="filters.taskFilterType" placeholder="已分配任务的需求?" clearable >
<el-option value="not-join-any-project" label="未分配过任务的需求"></el-option>
@ -109,7 +109,7 @@
<template slot="label">
<i class="el-icon-document"></i>
需求来源
</template>
</template>
<el-select v-model="filters.source" placeholder="需求来源" clearable >
<el-option v-for="i in this.dicts.demandSource" :label="i.name" :key="i.id" :value="i.id"></el-option>
@ -123,7 +123,7 @@
<el-select v-model="filters.dlvl" placeholder="需求层次" clearable >
<el-option v-for="i in this.dicts.demandLvl" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item :span="2">
<template slot="label">
<i class="el-icon-watch"></i>
@ -131,15 +131,15 @@
</template>
<mdp-date-range
v-model="filters"
type="daterange"
type="daterange"
start-key="planStartTimeStart"
end-key="planStartTimeEnd"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="完成日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:auto-default="false"
key="planStartTime"
></mdp-date-range>
@ -149,30 +149,30 @@
<i class="el-icon-watch-1"></i>
结束时间
</template>
<mdp-date-range
v-model="filters"
type="daterange"
type="daterange"
start-key="planEndTimeStart"
end-key="planEndTimeEnd"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="完成日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:auto-default="false"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:auto-default="false"
key="planEndTime"
></mdp-date-range>
</el-descriptions-item>
<el-descriptions-item :span="2">
<el-button type="primary" style="float:right;" @click="searchXmMenus" icon="el-icon-search">查询</el-button>
<el-button type="primary" style="float:right;" @click="searchXmMenus" icon="el-icon-search">查询</el-button>
</el-descriptions-item>
</el-descriptions>
<el-button slot="reference" icon="el-icon-more" @click="moreVisible=!moreVisible"></el-button>
</el-popover>
<span style="float:right;">
@ -188,7 +188,7 @@
</div>
<el-button @click="showAdd('1')">新建史诗</el-button>
</el-row>
<el-row>
<div class="icon" style="background-color: rgb(0, 153, 51);">
<i class="el-icon-s-flag"></i>
@ -203,7 +203,7 @@
</div>
<el-button @click="showAdd('3')" >新建用户故事</el-button>
</el-row>
<el-row>
<el-button @click="showImportFromMenuTemplate()" icon="el-icon-upload2">由模板快速导入需求</el-button>
@ -218,8 +218,8 @@
<xm-table-config class="hidden-lg-and-down" ref="tableConfig" style="display:inline;" :table="$refs.table"></xm-table-config>
</span>
</el-row>
<el-row v-if="displayType=='table'" class="padding-top">
</el-row>
<el-row v-if="displayType=='table'" class="padding-top">
<el-table element-loading-text="努力加载中" element-loading-spinner="el-icon-loading" :cell-style="cellStyleCalc" :expand-row-keys="expandRowKeysCpd" :header-cell-style="cellStyleCalc" stripe fit border ref="table" :height="maxTableHeight" :data="xmMenusTreeData" current-row-key="menuId" row-key="menuId" @sort-change="sortChange" highlight-current-row v-loading="load.list" @selection-change="selsChange" @row-click="rowClick">
<el-table-column sortable type="selection" width="40"></el-table-column>
@ -236,8 +236,8 @@
<i class="el-icon-document" style="width:20px;"></i>
</div>
<el-link @click="showEdit( scope.row,scope.$index)">{{scope.row.seqNo}} &nbsp; {{scope.row.menuName}} </el-link>
<div class="tool-bar">
<el-button @click="copyOne(scope.row,scope.$index)" icon="el-icon-document-copy" circle title="复制一行"></el-button>
<div class="tool-bar">
<el-button @click="copyOne(scope.row,scope.$index)" icon="el-icon-document-copy" circle title="复制一行"></el-button>
</div>
</div>
</template>
@ -246,50 +246,50 @@
</el-table-column>
<template>
<el-table-column prop="mmUsername" label="跟进人" min-width="100" show-overflow-tooltip sortable>
<template slot-scope="scope">
<template slot-scope="scope">
<mdp-select-user-xm size="mini" @visible-change="selectVisible(scope.row,$event)" :value="scope.row" userid-key="mmUserid" username-key="mmUsername" :project-id="scope.row.projectId" @change="editXmMenuSomeFields(scope.row,'mmUserid',$event)"></mdp-select-user-xm>
</template>
</el-table-column>
<el-table-column prop="productId" label="产品" width="100" show-overflow-tooltip sortable>
</el-table-column>
<el-table-column prop="finishRate" label="进度" width="100" show-overflow-tooltip sortable>
<template slot-scope="scope">
<span
:style="{borderRadius: '30px',color:scope.row.finishRate >= 100 ? 'green' : 'blue'}"
<span
:style="{borderRadius: '30px',color:scope.row.finishRate >= 100 ? 'green' : 'blue'}"
>
{{ (scope.row.finishRate != null ? scope.row.finishRate : 0) + "%" }}
</span>
</span>
</template>
</el-table-column>
<el-table-column prop="status" label="状态" min-width="80" sortable>
<template slot-scope="scope">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" :dict="dicts['menuStatus']" v-model="scope.row.status" label="需求状态" @change="editXmMenuSomeFields(scope.row,'status',$event)">
</mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" item-code="menuStatus" v-model="scope.row.status" label="需求状态" @change="editXmMenuSomeFields(scope.row,'status',$event)">
</mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="priority" label="优先级" width="100" sortable>
<template slot-scope="scope">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" :dict="dicts['priority']" v-model="scope.row.priority" placeholder="优先级" style="display:block;" @change="editXmMenuSomeFields(scope.row,'priority',$event)">
<template slot-scope="scope">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" item-code="priority" v-model="scope.row.priority" placeholder="优先级" style="display:block;" @change="editXmMenuSomeFields(scope.row,'priority',$event)">
</mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="dtype" label="类型" width="100" sortable v-if="false">
<template slot-scope="scope">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" :dict="dicts['demandType']" v-model="scope.row.dtype" placeholder="类型" style="display:block;" @change="editXmMenuSomeFields(scope.row,'dtype',$event)">
<template slot-scope="scope">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" item-code="demandType" v-model="scope.row.dtype" placeholder="类型" style="display:block;" @change="editXmMenuSomeFields(scope.row,'dtype',$event)">
</mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="source" label="来源" width="100" :formatter="formaterByDicts" show-overflow-tooltip sortable v-if="false">
<template slot-scope="scope">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" :dict="dicts['demandSource']" v-model="scope.row.source" placeholder="来源" style="display:block;" @change="editXmMenuSomeFields(scope.row,'source',$event)">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" item-code="demandSource" v-model="scope.row.source" placeholder="来源" style="display:block;" @change="editXmMenuSomeFields(scope.row,'source',$event)">
</mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="dlvl" label="层次" width="100" sortable>
<template slot-scope="scope">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" :dict="dicts['demandLvl']" v-model="scope.row.dlvl" placeholder="层次" style="display:block;" @change="editXmMenuSomeFields(scope.row,'dlvl',$event)">
<template slot-scope="scope">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" item-code="demandLvl" v-model="scope.row.dlvl" placeholder="层次" style="display:block;" @change="editXmMenuSomeFields(scope.row,'dlvl',$event)">
</mdp-select-tag>
</template>
</el-table-column>
@ -312,12 +312,12 @@
<div>{{scope.row.taskFinishCnt}}/{{scope.row.taskCnt}}</div>
</template>
</el-table-column>
<el-table-column prop="budgetWorkload" label="工时" min-width="100" show-overflow-tooltip sortable>
<template slot-scope="scope">
<template slot-scope="scope">
<span title="实际工时 / 预算工时 或者 (剩余工时+实际工时)">{{scope.row.actWorkload}} &nbsp;/ &nbsp;{{scope.row.budgetWorkload}}h </span>
</template>
</el-table-column>
</template>
</el-table-column>
<el-table-column prop="bugCnt" label="缺陷" min-width="100" show-overflow-tooltip sortable>
<template slot="header">
@ -339,15 +339,15 @@
</template>
</el-table-column>
</template>
</el-table>
</el-row>
</el-table>
</el-row>
<el-row v-else-if="displayType=='agileUser'" class="padding-top">
<xm-menu-agile-kanban-user :xm-menus="xmMenus" :xm-product="xmProduct" ref="table" :table-height="maxTableHeight"></xm-menu-agile-kanban-user>
</el-row>
</el-row>
<el-row>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</el-row>
</el-row>
<!--编辑 XmMenu xm_project_menu界面-->
<el-dialog title="编辑故事" :visible.sync="editFormVisible" :with-header="false" fullscreen width="90%" top="20px" append-to-body :close-on-click-modal="false" >
<xm-menu-edit :xm-menu="editForm" :sel-project="selProject" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit" @add-sub-menu="onAddSubMenu" @edit-fields="onEditSomeFields"></xm-menu-edit>
@ -377,8 +377,8 @@
:with-header="false"
size="80%">
<xm-task-mng :sel-project="selProject" :menu-id="editForm.menuId" :menu-name="editForm.menuName"></xm-task-mng>
</el-drawer>
</el-drawer>
<tag-dialog ref="tagDialog" :tagIds="filters.tags?filters.tags.map(i=>i.tagId):[]" :jump="true" @select-confirm="onTagSelected">
</tag-dialog>
<xm-group-dialog ref="xmGroupDialog" :isSelectSingleUser="true" :sel-project="selProject" :xm-product="xmProductCpd" @user-confirm="onGroupUserSelect">
@ -390,12 +390,12 @@
size="60%"
:close-on-click-modal="false"
>
<xm-epic-features-select
<xm-epic-features-select
@select="onParentMenuSelected"
:xm-product="filters.product"
></xm-epic-features-select>
</el-drawer>
<el-dialog append-to-body title="模块选择" :visible.sync="funcVisible" size="40%" top="20px" :close-on-click-modal="false">
<xm-func-select :show-select="true" class="padding-left padding-right" v-if="funcVisible" @select="onFuncSelected" :xm-product="xmProductCpd"></xm-func-select>
</el-dialog>
@ -414,7 +414,7 @@
import { batchDelXmIterationMenu,batchAddXmIterationMenu } from '@/api/xm/core/xmIterationMenu';
import XmMenuAdd from './XmMenuAdd';//
import XmMenuEdit from './XmMenuEdit';//
import XmMenuEdit from './XmMenuEdit';//
import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//
import XmMenuTemplateMng from '../xmMenuTemplate/XmMenuTemplateMng';//
import XmMenuRichDetail from './XmMenuRichDetail';
@ -444,7 +444,7 @@
'userInfo','roles'
]),
xmMenusTreeData() {
xmMenusTreeData() {
return this.xmMenus;
},
toSearchCpd(){
@ -455,12 +455,12 @@
}else{
key.iterationId=''
}
if(this.xmProduct&&this.xmProduct.id){
if(this.xmProduct&&this.xmProduct.id){
key.productId=this.xmProduct.id
}else{
key.productId=''
}
if(this.selProject&&this.selProject.id){
if(this.selProject&&this.selProject.id){
key.projectId=this.selProject.id
}else{
key.projectId=''
@ -488,11 +488,11 @@
watch:{
xmIteration:function(){
this.filters.iterationFilterType="join-curr-iteration"
this.filters.iteration=this.xmIteration
this.filters.iteration=this.xmIteration
},
xmProduct:function(){
this.filters.product=this.xmProduct
},
this.filters.product=this.xmProduct
},
toSearchCpd:function(){
this.searchXmMenus();
}
@ -519,7 +519,7 @@
source:'',
dclasss:['3'],
menuId:'',//
productId:'',//
productId:'',//
planStartTimeStart:'',
planStartTimeEnd:'',
planEndTimeStart:'',
@ -554,8 +554,8 @@
//xmMenu
editForm: {
startTime:'',menuId:'',menuName:'',pmenuId:'',productId:'',remark:'',status:'0',online:'0',demandUrl:'',codeUrl:'',designUrl:'',docUrl:'',helpUrl:'',operDocUrl:'',seqNo:'',mmUserid:'',mmUsername:'',ctime:'',ntype:'0',sinceVersion:'',childrenCnt:'0',ltime:'',tagIds:'',tagNames:'',pidPaths:'',lvl:'0',isTpl:'0',phaseId:'',iterationId:'',source:'1',proposerId:'',proposerName:'',dlvl:'0',dtype:'0',priority:'0',dclass:'',iterationName:'',endTime:'',funcId:'',funcName:'',comments:'',ups:'0',reads:'0'
},
menuTemplateVisible:false,
},
menuTemplateVisible:false,
valueChangeRows:[],
menuDetailVisible:false,
selectTaskVisible:false,
@ -624,17 +624,17 @@
params.key="%"+this.filters.key+"%"
}
if (this.filters.planStartTimeStart) {
params.planStartTimeStart = this.filters.planStartTimeStart
params.planStartTimeStart = this.filters.planStartTimeStart
}
if (this.filters.planStartTimeEnd) {
params.planStartTimeEnd = this.filters.planStartTimeEnd
params.planStartTimeEnd = this.filters.planStartTimeEnd
}
if (this.filters.planEndTimeStart) {
params.planEndTimeStart = this.filters.planEndTimeStart
params.planEndTimeStart = this.filters.planEndTimeStart
}
if (this.filters.planEndTimeEnd) {
params.planEndTimeEnd = this.filters.planEndTimeEnd
params.planEndTimeEnd = this.filters.planEndTimeEnd
}
if(this.filters.mmUser){
@ -724,7 +724,7 @@
this.maps.set(tree.menuId, { tree, treeNode, resolve }) //
var params={pmenuId:tree.menuId}
params=this.getParams(params);
params=this.getParams(params);
this.load.list = true;
var func=listXmMenuWithState
if(this.selProject&&this.selProject.id){
@ -760,7 +760,7 @@
if( this.filters.product && this.filters.product.id){
params.productId=this.filters.product.id
}
params=this.getParams(params);
params=this.getParams(params);
let callback= (res)=>{
var tips=res.data.tips;
if(tips.isOk){
@ -786,21 +786,21 @@
this.editFormVisible = true;
},
// XmMenu xm_project_menu
showAdd: function (dclass) {
showAdd: function (dclass) {
this.addForm={...this.addFormInit}
if(this.filters.product && this.filters.product.id){
if(this.filters.product && this.filters.product.id){
this.addForm.productId=this.filters.product.id
this.addForm.productName=this.filters.product.productName
this.addForm.dclass=dclass
this.addForm.dclass=dclass
}
if(this.filters.iteration && this.filters.iteration.id){
this.addForm.productId=this.filters.iteration.productId
if(this.filters.iteration && this.filters.iteration.id){
this.addForm.productId=this.filters.iteration.productId
this.addForm.iterationId=this.filters.iteration.id
this.addForm.iterationName=this.filters.iteration.iterationName
this.addForm.dclass=dclass
}
}
if(!this.addForm.productId){
this.$refs.xmProductSelect1.productVisible=true;
this.$refs.xmProductSelect1.searchXmProducts();
@ -812,9 +812,9 @@
//this.addForm=Object.assign({}, this.editForm);
},
showSubAdd:function(row){
this.addForm={...this.addFormInit}
this.editForm=row
this.editForm=row
this.expandRowKeysCpd.push(row.pmenuId);
this.addForm.productId=row.productId
if(this.filters.product && row.productId==this.filters.product.id){
@ -833,15 +833,15 @@
showProdcutAdd:function(){
this.$refs.xmProductMng.showAdd();
},
afterAddSubmit(row){
this.pageInfo.count=true;
this.xmMenus.push(row);
afterAddSubmit(row){
this.pageInfo.count=true;
this.xmMenus.push(row);
if(this.parentMenu){
this.parentMenu.childrenCnt=this.parentMenu.childrenCnt?this.parentMenu.childrenCnt+1:1;
}
}
},
afterEditSubmit(row){
this.editFormVisible=false;
this.editFormVisible=false;
},
//xmMenu
selsChange: function (sels) {
@ -860,10 +860,10 @@
this.getXmMenus()
},
onIterationSelected:function(iteration){
this.filters.iteration=iteration
this.filters.iteration=iteration
},
onIterationClearSelect:function(){
this.filters.iteration=null
this.filters.iteration=null
},
//xmMenu
handleDel: function (row,index) {
@ -876,7 +876,7 @@
this.load.del=false;
var tips=res.data.tips;
if(tips.isOk){
this.pageInfo.count=true;
this.pageInfo.count=true;
this.getXmMenus();
}
@ -1016,7 +1016,7 @@
this.load.add=false
var tips =res.data.tips
if(tips.isOk){
this.getXmMenus()
this.getXmMenus()
}else{
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: 'error' });
}
@ -1058,12 +1058,12 @@
},
loadTasksToXmMenuState: function () {
if(!this.filters.product ){
if(!this.filters.iteration){
this.$notify.warning("请先选择产品或者迭代");
return;
}
}
}
this.load.edit=true;
let params = { productId: ''};
@ -1072,7 +1072,7 @@
}else{
params = { productId: this.filters.product.id };
}
loadTasksToXmMenuState(params).then((res) => {
this.load.edit=false;
var tips=res.data.tips;
@ -1086,7 +1086,7 @@
},
onGroupUserSelect(users,option){
this.editXmMenuSomeFields(option.data,"mmUserid",users);
},
},
toSelectProduct(){
this.productVisible=true;
},
@ -1139,7 +1139,7 @@
batchChangeParentMenu(params).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
this.searchXmMenus();
this.searchXmMenus();
}
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
})
@ -1263,7 +1263,7 @@
Object.assign(row,params)
}
Object.assign(this.editFormBak,row)
}else{
}else{
Object.assign(row,this.editFormBak)
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
}
@ -1342,24 +1342,24 @@
onEditSomeFields(params){
Object.assign(this.editForm,params)
},
onAddSubMenu(row){
onAddSubMenu(row){
},
onFuncSelected(row){
onFuncSelected(row){
this.filters.func=row
this.funcVisible=false;
this.funcVisible=false;
},
copyOne(row,index){
var params={...row}
params.menuId=null;
params.menuId=null;
params.status="0"
params.menuName=row.menuName+'V'
addXmMenu(params).then(res=>{
var tips = res.data.tips
if(tips.isOk){
if(tips.isOk){
var row2=res.data.data
this.xmMenus.splice(index+1,0,row2)
this.pageInfo.total=this.pageInfo.total+1
@ -1379,7 +1379,7 @@
XmTaskList,
XmTaskMng,
XmTaskListForMenu,
UsersSelect,
UsersSelect,
TagDialog,
XmEpicFeaturesSelect,
XmMenuWorkload,
@ -1393,7 +1393,7 @@
},
mounted() {
initSimpleDicts("all",['menuStatus','demandSource','demandLvl','demandType','priority','dclass']).then(res=>{
Object.assign(this.dicts,res.data.data)
Object.assign(this.dicts,res.data.data)
})
this.filters.product=this.xmProduct
if(this.xmProduct && this.xmProduct.id){
@ -1414,7 +1414,7 @@
</script>
<style lang="scss" scoped>
.align-right{
float: right;
}

346
src/views/xm/core/xmMenu/XmMenuSelect.vue

@ -1,49 +1,49 @@
<template>
<section>
<el-row>
<section>
<el-row>
<el-col :span="7">
<xm-epic-features class="padding-right" :xm-product="xmProduct" :sel-project="selProject" @row-click="onEpicFeaturesRowClick" :show-select="false" @product-select="onProductSelected"></xm-epic-features>
</el-col>
<el-col :span="17" >
<el-row>
<el-row>
<xm-iteration-select style="display:inline;" v-if="(!xmIteration||!xmIteration.id) && filters.product" :auto-select="false" :link-project-id="selProject?selProject.id:null" @row-click="onIterationSelected" ref="xmIterationMng" :product-id="filters.product?filters.product.id:null" @clear="onIterationClearSelect"></xm-iteration-select>
<el-select v-model="filters.taskFilterType" placeholder="已分配任务的需求?" clearable v-if="taskFilterType">
<el-option value="not-join-any-project" label="未分配过任务的需求"></el-option>
<el-option value="join-any-project" label="已分配过任务的需求"></el-option>
<el-option value="not-join-curr-project" :label="'未分配任务到项目【'+selProject.name+'】'" v-if="selProject && selProject.id"></el-option>
<el-option value="join-curr-project" :label="'已分配任务到项目【'+selProject.name+'】'" v-if="selProject && selProject.id"></el-option>
</el-select>
<el-option value="not-join-any-project" label="未分配过任务的需求"></el-option>
<el-option value="join-any-project" label="已分配过任务的需求"></el-option>
<el-option value="not-join-curr-project" :label="'未分配任务到项目【'+selProject.name+'】'" v-if="selProject && selProject.id"></el-option>
<el-option value="join-curr-project" :label="'已分配任务到项目【'+selProject.name+'】'" v-if="selProject && selProject.id"></el-option>
</el-select>
<el-select v-model="filters.iterationFilterType" placeholder="加入过迭代?" clearable v-if="iterationFilterType">
<el-option value="not-join-any-iteration" label="未加入过迭代"></el-option>
<el-option value="join-any-iteration" label="已加入过迭代"></el-option>
<el-option value="not-join-curr-iteration" :label="'未加入迭代【'+filters.iteration.iterationName+'】'" v-if="filters.iteration && filters.iteration.id"></el-option>
<el-option value="join-curr-iteration" :label="'已加入本迭代【'+filters.iteration.iterationName+'】'" v-if="filters.iteration && filters.iteration.id"></el-option>
</el-select>
<mdp-select v-model="filters.priority" placeholder="优先级" class="hidden-md-and-down" clearable style="width: 90px;" :dict="dicts['priority']">
</mdp-select>
<mdp-select v-model="filters.status" placeholder="需求状态" class="hidden-md-and-down" clearable style="width: 90px;" :dict="dicts['menuStatus']">
</mdp-select>
<el-input v-model="filters.key" style="width: 100px;" placeholder="需求名称查询" clearable>
</el-input>
<el-option value="not-join-any-iteration" label="未加入过迭代"></el-option>
<el-option value="join-any-iteration" label="已加入过迭代"></el-option>
<el-option value="not-join-curr-iteration" :label="'未加入迭代【'+filters.iteration.iterationName+'】'" v-if="filters.iteration && filters.iteration.id"></el-option>
<el-option value="join-curr-iteration" :label="'已加入本迭代【'+filters.iteration.iterationName+'】'" v-if="filters.iteration && filters.iteration.id"></el-option>
</el-select>
<mdp-select v-model="filters.priority" placeholder="优先级" class="hidden-md-and-down" clearable style="width: 90px;" item-code="priority">
</mdp-select>
<mdp-select v-model="filters.status" placeholder="需求状态" class="hidden-md-and-down" clearable style="width: 90px;" item-code="menuStatus">
</mdp-select>
<el-input v-model="filters.key" style="width: 100px;" placeholder="需求名称查询" clearable>
</el-input>
<el-button v-loading="load.list" :disabled="load.list==true" v-on:click="searchXmMenus" icon="el-icon-search">查询</el-button>
<el-popover
placement="top-start"
title=""
width="500"
trigger="click" >
<el-row>
<el-row>
<el-col :span="24" style="padding-top:5px;" >
<font class="more-label-font">标签条件:</font>
<font class="more-label-font">标签条件:</font>
<el-button type="text" v-if="!filters.tags||filters.tags.length==0" @click.native="tagSelectVisible=true">标签</el-button>
<el-tag v-else @click="tagSelectVisible=true" closable @close="clearFiltersTag(filters.tags[0])">{{filters.tags[0].tagName.substr(0,5)}}({{filters.tags.length}})</el-tag>
</el-col>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<font class="more-label-font">创建日期:</font>
<font class="more-label-font">创建日期:</font>
<el-date-picker
v-model="dateRanger"
v-model="dateRanger"
type="daterange"
align="right"
unlink-panels
@ -53,99 +53,99 @@
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00','23:59:59']"
:picker-options="pickerOptions"
></el-date-picker>
</el-col>
></el-date-picker>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<font class="more-label-font">
责任人:
</font>
<el-tag v-if="filters.mmUser" closable @close="clearFiltersMmUser()">{{filters.mmUser.username}}</el-tag>
</font>
<el-tag v-if="filters.mmUser" closable @close="clearFiltersMmUser()">{{filters.mmUser.username}}</el-tag>
<el-button v-else @click="selectFiltersMmUser()">选责任人</el-button>
<el-button @click="setFiltersMmUserAsMySelf()">我的</el-button>
</el-col>
<el-col :span="24" style="padding-top:5px;" class="hidden-log-and-up">
<font class="more-label-font">
需求是否加入了迭代:
</font>
</font>
<el-select v-model="filters.iterationFilterType" placeholder="加入过迭代?" clearable >
<el-option value="not-join-any-iteration" label="未加入过迭代"></el-option>
<el-option value="join-any-iteration" label="已加入过迭代"></el-option>
<el-option value="not-join-curr-iteration" :label="'未加入迭代【'+filters.iteration.iterationName+'】'" v-if="filters.iteration && filters.iteration.id"></el-option>
<el-option value="join-curr-iteration" :label="'已加入本迭代【'+filters.iteration.iterationName+'】'" v-if="filters.iteration && filters.iteration.id"></el-option>
</el-select>
<el-option value="not-join-any-iteration" label="未加入过迭代"></el-option>
<el-option value="join-any-iteration" label="已加入过迭代"></el-option>
<el-option value="not-join-curr-iteration" :label="'未加入迭代【'+filters.iteration.iterationName+'】'" v-if="filters.iteration && filters.iteration.id"></el-option>
<el-option value="join-curr-iteration" :label="'已加入本迭代【'+filters.iteration.iterationName+'】'" v-if="filters.iteration && filters.iteration.id"></el-option>
</el-select>
</el-col>
<el-col :span="24" style="padding-top:5px;" class="hidden-log-and-up">
<font class="more-label-font">
需求是否分配了任务:
</font>
</font>
<el-select v-model="filters.taskFilterType" placeholder="已分配任务的需求?" clearable >
<el-option value="not-join-any-project" label="未分配过任务的需求"></el-option>
<el-option value="join-any-project" label="已分配过任务的需求"></el-option>
<el-option value="not-join-curr-project" :label="'未分配任务到项目【'+selProject.name+'】'" v-if="selProject && selProject.id"></el-option>
<el-option value="join-curr-project" :label="'已分配任务到项目【'+selProject.name+'】'" v-if="selProject && selProject.id"></el-option>
</el-select>
<el-option value="not-join-any-project" label="未分配过任务的需求"></el-option>
<el-option value="join-any-project" label="已分配过任务的需求"></el-option>
<el-option value="not-join-curr-project" :label="'未分配任务到项目【'+selProject.name+'】'" v-if="selProject && selProject.id"></el-option>
<el-option value="join-curr-project" :label="'已分配任务到项目【'+selProject.name+'】'" v-if="selProject && selProject.id"></el-option>
</el-select>
</el-col>
<el-col :span="24" style="padding-top:5px;" class="hidden-log-and-up">
<font class="more-label-font">
需求层次:
</font>
</font>
<el-select v-model="filters.dlvl" placeholder="需求层次" clearable>
<el-option v-for="i in this.dicts.demandLvl" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-select>
</el-col>
<el-col :span="24" style="padding-top:5px;" class="hidden-log-and-up">
<font class="more-label-font">
需求类型:
</font>
</font>
<el-select v-model="filters.dtype" clearable placeholder="需求类型" style="width: 100px;">
<el-option v-for="i in this.dicts.demandType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-select>
</el-col>
<el-col :span="24" style="padding-top:5px;" class="hidden-log-and-up">
<font class="more-label-font">
需求来源:
</font>
</font>
<el-select v-model="filters.source" placeholder="需求来源" clearable style="width: 100px;">
<el-option v-for="i in this.dicts.demandSource" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-select>
</el-col>
<el-col :span="24" style="padding-top:5px;" class="hidden-log-and-up">
<font class="more-label-font">
需求层次:
</font>
</font>
<el-select v-model="filters.dlvl" placeholder="需求层次" clearable class="hidden-md-and-down" style="width: 100px;">
<el-option v-for="i in this.dicts.demandLvl" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-select>
</el-col>
<el-col :span="24" style="padding-top:5px;" class="hidden-log-and-up">
<font class="more-label-font">
需求层次:
</font>
</font>
<el-select v-model="filters.dlvl" placeholder="需求层次" clearable>
<el-option v-for="i in this.dicts.demandLvl" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-select>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<el-button type="primary" @click="searchXmMenus" icon="el-icon-search">查询</el-button>
</el-col>
</el-row>
</el-col>
</el-row>
<el-button slot="reference" icon="el-icon-more"></el-button>
</el-popover>
</el-popover>
<el-button style="float:right;" type="primary" v-if="multi" v-on:click="multiSelectedConfirm">确认</el-button>
</el-row>
</el-row>
<el-row class="padding-top">
<el-table ref="table" element-loading-text="努力加载中" element-loading-spinner="el-icon-loading" class="menu-table" :height="maxTableHeight" :data="xmMenusTreeData" row-key="menuId" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column v-if="multi" type="selection" width="50"></el-table-column>
<el-table-column prop="menuName" label="需求名称" min-width="140" >
<el-table-column v-if="multi" type="selection" width="50"></el-table-column>
<el-table-column prop="menuName" label="需求名称" min-width="140" >
<template slot-scope="scope">
<div v-if="scope.row.dclass=='1'" class="icon" style="background-color: rgb(255, 153, 51);">
<i class="el-icon-s-promotion"></i>
</div>
</div>
<div v-if="scope.row.dclass=='2'" class="icon" style="background-color: rgb(0, 153, 51);">
<i class="el-icon-s-flag"></i>
</div>
@ -153,34 +153,34 @@
<i class="el-icon-document"></i>
</div>
<span class="vlink" @click="toMenu(scope.row)">{{scope.row.seqNo}}&nbsp;
{{scope.row.menuName}}</span>
<span
:style="{borderRadius: '30px',color:scope.row.finishRate >= 100 ? 'green' : 'blue'}"
{{scope.row.menuName}}</span>
<span
:style="{borderRadius: '30px',color:scope.row.finishRate >= 100 ? 'green' : 'blue'}"
>
{{ (scope.row.finishRate != null ? scope.row.finishRate : 0) + "%" }}
</span>
</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="iterationName" label="迭代" min-width="140" > </el-table-column>
<template v-if="!multi">
<el-table-column label="操作" width="100" fixed="right" >
<template slot-scope="scope">
<el-button type="primary" @click="selectedMenu( scope.row,scope.$index)">选择</el-button>
<template slot-scope="scope">
<el-button type="primary" @click="selectedMenu( scope.row,scope.$index)">选择</el-button>
</template>
</el-table-column>
</template>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</el-row>
</el-col>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</el-row>
</el-col>
<el-drawer title="选择员工" :visible.sync="selectFiltersMmUserVisible" size="60%" append-to-body>
<users-select @confirm="onFiltersMmUserSelected" ref="selectFiltersMmUser"></users-select>
</el-drawer>
<el-drawer title="需求谈论" :visible.sync=" menuDetailVisible" size="50%" append-to-body :close-on-click-modal="false">
<xm-menu-rich-detail :visible="menuDetailVisible" :reload="false" :xm-menu="editForm" ></xm-menu-rich-detail>
</el-drawer>
</el-drawer>
<el-drawer append-to-body title="标签条件" :visible.sync="tagSelectVisible" size="60%">
<tag-mng :tagIds="filters.tags?filters.tags.map(i=>i.tagId):[]" :jump="true" @select-confirm="onTagSelected">
</tag-mng>
@ -197,7 +197,7 @@
import { listXmMenu } from '@/api/xm/core/xmMenu';
import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//
import XmMenuRichDetail from './XmMenuRichDetail';
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
import TagMng from "@/views/mdp/arc/tag/TagMng";
@ -206,18 +206,18 @@
import { mapGetters } from 'vuex'
import XmEpicFeatures from './XmEpicFeaturesSelect.vue';
export default {
export default {
props:['isSelectMenu','multi','visible','xmIteration','xmProduct','selProject','checkScope'/**1-史诗,2-特性,3-用户故事 */,'iterationFilterType','taskFilterType'],
computed: {
...mapGetters([
'userInfo','roles'
]),
xmMenusTreeData(){
xmMenusTreeData(){
return this.xmMenus
},
toSearchCpd(){
var key={iterationId:'',projectId:'',productId:''};
if(this.xmIteration&&this.xmIteration.id){
@ -226,20 +226,20 @@ import XmEpicFeatures from './XmEpicFeaturesSelect.vue';
}else{
key.iterationId=''
}
if(this.xmProduct&&this.xmProduct.id){
if(this.xmProduct&&this.xmProduct.id){
key.productId=this.xmProduct.id
}else{
key.productId=''
}
if(this.selProject&&this.selProject.id){
if(this.selProject&&this.selProject.id){
key.projectId=this.selProject.id
}else{
key.projectId=''
}
}
return key.iterationId+key.projectId+key.productId
}
},
watch:{
watch:{
visible:function(visible){
if(visible==true){
//this.searchXmMenus();
@ -251,13 +251,13 @@ import XmEpicFeatures from './XmEpicFeaturesSelect.vue';
}
if(this.xmIteration){
this.filters.iteration=this.xmIteration
}
}
},
"xmProduct"(){
this.filters.product=this.xmProduct
this.filters.product=this.xmProduct
},
"selProject"(){
"selProject"(){
},
toSearchCpd:function(){
this.searchXmMenus();
@ -288,14 +288,14 @@ import XmEpicFeatures from './XmEpicFeaturesSelect.vue';
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmMenu
//xmMenu
addForm: {
menuId:'',menuName:'',pmenuId:'',productId:'',remark:'',status:'',online:'',demandUrl:'',codeUrl:'',designUrl:'',docUrl:'',helpUrl:'',operDocUrl:''
},
editFormVisible: false,//
//xmMenu
editForm: {
@ -307,15 +307,15 @@ import XmEpicFeatures from './XmEpicFeaturesSelect.vue';
iterationVisible:false,
/**begin 自定义属性请在下面加 请加备注**/
maxTableHeight:300,
dateRanger: [ ],
dateRanger: [ ],
tagSelectVisible:false,
pickerOptions: util.getPickerOptions('datarange'),
/**end 自定义属性请在上面加 请加备注**/
}
},//end data
methods: {
handleSizeChange(pageSize) {
this.pageInfo.pageSize=pageSize;
methods: {
handleSizeChange(pageSize) {
this.pageInfo.pageSize=pageSize;
this.getXmMenus();
},
handleCurrentChange(pageNum) {
@ -337,18 +337,18 @@ import XmEpicFeatures from './XmEpicFeaturesSelect.vue';
this.getXmMenus();
},
searchXmMenus(){
this.pageInfo.count=true;
this.pageInfo.count=true;
this.getXmMenus();
},
getParams(params){
getParams(params){
if( this.filters.key){
params.key="%"+this.filters.key+"%"
}
if(this.filters.mmUser){
params.mmUserid=this.filters.mmUser.userid;
}
}
if(this.filters.iterationFilterType){
params.iterationFilterType=this.filters.iterationFilterType
if(params.iterationFilterType==='not-join-any-iteration'){
@ -359,88 +359,88 @@ import XmEpicFeatures from './XmEpicFeaturesSelect.vue';
params.filterIterationId=this.filters.iteration.id
}else if(params.iterationFilterType==='join-curr-iteration'){
params.filterIterationId=this.filters.iteration.id
}
}
params.ntype="0"
}else{
if(this.filters.iteration){
params.iterationId=this.filters.iteration.id
}
}
if(this.xmIteration && this.xmIteration.id){
if(this.xmIteration && this.xmIteration.id){
params.linkIterationId=this.xmIteration.id
}
if(this.filters.taskFilterType){
params.taskFilterType=this.filters.taskFilterType
params.taskFilterType=this.filters.taskFilterType
if(params.taskFilterType==='not-join-curr-project'){
params.projectId=this.selProject.id
}
params.projectId=this.selProject.id
}
if(params.taskFilterType==='join-curr-project'){
params.projectId=this.selProject.id
}
params.projectId=this.selProject.id
}
params.ntype="0"
}
}
if(this.selProject && this.selProject.id){
params.linkProjectId=this.selProject.id
}
}
if(this.filters.product){
params.productId=this.filters.product.id
}
}
if(this.filters.status){
params.status=this.filters.status
}
if(this.filters.dlvl){
params.dlvl=this.filters.dlvl
}
if(this.filters.dtype){
params.dtype=this.filters.dtype
}
if(this.filters.priority){
params.priority=this.filters.priority
}
if(this.filters.source){
params.source=this.filters.source
}
if( this.dateRanger && this.dateRanger.length==2){
params.ctimeStart=this.dateRanger[0]
params.ctimeEnd=this.dateRanger[1]
}
params.ctimeStart=this.dateRanger[0]
params.ctimeEnd=this.dateRanger[1]
}
if(this.filters.tags && this.filters.tags.length>0){
params.tagIdList=this.filters.tags.map(i=>i.tagId)
}
}
if(this.filters.dclasss){
params.dclasss=this.filters.dclasss
}
}
if(this.parentMenu && this.parentMenu.menuId){
params.pidPathsLike=this.parentMenu.pidPaths
}
return params;
},
loadMenusLazy(tree, treeNode, resolve) {
loadMenusLazy(tree, treeNode, resolve) {
this.maps.set(tree.menuId, { tree, treeNode, resolve }) //
var params={pmenuId:tree.menuId}
params=this.getParams(params);
params.isTop=""
this.load.list = true;
var func=listXmMenu
var func=listXmMenu
func(params).then(res=>{
this.load.list = false
var tips = res.data.tips;
if(tips.isOk){
resolve(res.data.data)
resolve(res.data.data)
}else{
resolve([])
}
}).catch( err => this.load.list = false );
}).catch( err => this.load.list = false );
},
reloadChildren(rows){
//treeTool.reloadAllChildren(this.$refs.table,this.maps,rows,'pmenuId',this.loadMenusLazy)
reloadChildren(rows){
//treeTool.reloadAllChildren(this.$refs.table,this.maps,rows,'pmenuId',this.loadMenusLazy)
},
// XmMenu xm_project_menu
getXmMenus() {
@ -452,45 +452,45 @@ import XmEpicFeatures from './XmEpicFeaturesSelect.vue';
};
if(this.pageInfo.orderFields!=null && this.pageInfo.orderFields.length>0){
let orderBys=[];
for(var i=0;i<this.pageInfo.orderFields.length;i++){
for(var i=0;i<this.pageInfo.orderFields.length;i++){
orderBys.push(this.pageInfo.orderFields[i]+" "+this.pageInfo.orderDirs[i])
}
}
params.orderBy= orderBys.join(",")
}
}
if( this.filters.product && this.filters.product.id){
params.productId=this.filters.product.id
}
params=this.getParams(params)
if(!params.productId && !params.iterationId && !params.linkIterationId){
if(!params.productId && !params.iterationId && !params.linkIterationId){
this.$notify({position:'bottom-left',showClose:true,message: "请先选择产品", type: 'warning' });
return;
}
return;
}
this.load.list = true;
listXmMenu(params).then((res) => {
var tips=res.data.tips;
if(tips.isOk){
if(tips.isOk){
this.pageInfo.total = res.data.total;
this.pageInfo.count=false;
this.xmMenus = res.data.data;
}else{
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: 'error' });
}
}
this.load.list = false;
}).catch( err => this.load.list = false );
},
//xmMenu
selsChange: function (sels) {
this.sels = sels;
},
},
rowClick: function(row, event, column){
this.$emit('row-click',row, event, column);// @row-click="rowClick"
},
/**begin 自定义函数请在下面加**/
selectedMenu:function(row){
this.$emit("selected",row)
@ -502,16 +502,16 @@ import XmEpicFeatures from './XmEpicFeaturesSelect.vue';
toMenu:function(row){
this.editForm=row
this.menuDetailVisible=true;
},
},
clearFiltersMmUser:function(){
this.filters.mmUser=null;
this.searchXmMenus();
},
},
selectFiltersMmUser(){
this.selectFiltersMmUserVisible=true;
},
onFiltersMmUserSelected(users){
if(users && users.length>0){
this.filters.mmUser=users[0]
}else{
@ -524,82 +524,82 @@ import XmEpicFeatures from './XmEpicFeaturesSelect.vue';
this.filters.mmUser=this.userInfo;
this.searchXmMenus();
},
onProductSelected:function(product){
this.filters.product=product
this.filters.product=product
this.productVisible=false;
this.xmMenus=[]
this.searchXmMenus()
},
onProductClearSelect:function(){
this.filters.product=null
this.filters.product=null
this.productVisible=false;
this.xmMenus=[]
this.searchXmMenus()
},
},
onIterationSelected:function(iteration){
this.filters.iteration=iteration
this.filters.iteration=iteration
this.iterationVisible=false;
this.xmMenus=[]
this.searchXmMenus()
},
onIterationClearSelect:function(){
this.filters.iteration=null
this.filters.iteration=null
this.iterationVisible=false;
this.xmMenus=[]
this.searchXmMenus()
},
},
clearFiltersTag(tag){
var index=this.filters.tags.findIndex(i=>i.tagId==tag.tagId)
this.filters.tags.splice(index,1);
this.searchXmMenus();
},
onTagSelected(tags){
this.tagSelectVisible = false;
if (!tags || tags.length == 0) {
this.tagSelectVisible = false;
if (!tags || tags.length == 0) {
this.filters.tags=[]
}else{
this.filters.tags=tags
}
this.searchXmMenus();
},
onEpicFeaturesRowClick(menu){
this.parentMenu=menu
this.searchXmMenus();
}
/**end 自定义函数请在上面加**/
},//end methods
components: {
components: {
XmProductSelect,XmMenuRichDetail,UsersSelect,XmIterationSelect,TagMng,
XmEpicFeatures,
//
},
mounted() {
mounted() {
initSimpleDicts("all",['menuStatus','demandSource','demandLvl','demandType','priority']).then(res=>{
this.dicts=res.data.data;
})
this.$nextTick(() => {
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el)-40;
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el)-40;
if(this.iterationFilterType){
this.filters.iterationFilterType=this.iterationFilterType
}
if(this.xmIteration){
this.filters.iteration=this.xmIteration
}
if(this.taskFilterType){
this.filters.taskFilterType=this.taskFilterType
}
this.filters.product=this.xmProduct
this.getXmMenus();
});
this.getXmMenus();
});
}
}
@ -615,4 +615,4 @@ XmEpicFeatures,
.top{
margin-top:-30px;
}
</style>
</style>

284
src/views/xm/core/xmProduct/XmProductMng.vue

@ -5,32 +5,32 @@
<el-option :label="userInfo.branchName+'机构下所有的产品'" value="branchId"></el-option>
<el-option label="我相关的产品" value="compete"></el-option>
<el-option label="按产品编号精确查找" value="productId"></el-option>
</el-select>
<mdp-select placeholder="状态" :dict="dicts['xmProductPstatus']" v-model="filters.pstatus"></mdp-select>
</el-select>
<mdp-select placeholder="状态" item-code="xmProductPstatus" v-model="filters.pstatus"></mdp-select>
<el-input v-if="filters.queryScope=='productId'" style="width:20%;" v-model="filters.id" placeholder="输入产品编号" @keyup.enter.native="searchXmProducts" clearable>
</el-input>
<el-input v-if="filters.queryScope!='productId'" v-model="filters.key" style="width: 20%;" placeholder="名称查询" clearable>
<el-input v-if="filters.queryScope!='productId'" v-model="filters.key" style="width: 20%;" placeholder="名称查询" clearable>
</el-input>
<el-button type="primary" v-loading="load.list" :disabled="load.list==true" v-on:click="searchXmProducts" icon="el-icon-search">查询</el-button>
<el-popover
placement="top-start"
title="更多查询条件、操作"
width="600"
trigger="click" >
trigger="click" >
<el-descriptions class="margin-top" size="mini" :column="1" border>
<template slot="extra">
<template slot="extra">
<el-button type="text" @click="templateVisible=!templateVisible">{{templateVisible?'隐藏模板':'显示模板'}}</el-button>
<el-button type="text" @click="guiderStart(true)" icon="el-icon-help">新手导航</el-button>
</template>
</template>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-time"></i>
显示方式
</template>
</template>
<el-radio v-model="showType" :label="false">表格</el-radio>
<el-radio v-model="showType" :label="true">卡片</el-radio>
</el-descriptions-item>
<el-radio v-model="showType" :label="true">卡片</el-radio>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-document"></i>
@ -41,21 +41,21 @@
<el-option label="我相关的产品" value="compete"></el-option>
<el-option label="按产品编号精确查找" value="productId"></el-option>
</el-select>
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item v-if="selProject">
<template slot="label">
<i class="el-icon-document"></i>
当前项目
</template>
<el-tag v-if="selProject">{{selProject?selProject.name:''}}</el-tag>
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item v-if="xmIteration">
<template slot="label">
<i class="el-icon-document"></i>
当前迭代
</template>
<el-tag v-if="xmIteration">{{xmIteration.iterationName}}</el-tag>
</el-descriptions-item>
<el-tag v-if="xmIteration">{{xmIteration.iterationName}}</el-tag>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-document"></i>
@ -63,72 +63,72 @@
</template>
<el-tag v-if="filters.pmUser" closable @click="selectFiltersPmUser" @close="clearFiltersPmUser()">{{filters.pmUser.username}}</el-tag>
<el-button v-else @click="selectFiltersPmUser()">选责任人</el-button>
<el-button @click="setFiltersPmUserAsMySelf()">我的</el-button>
</el-descriptions-item>
<el-button @click="setFiltersPmUserAsMySelf()">我的</el-button>
</el-descriptions-item>
<el-descriptions-item :span="2">
<template slot="label">
<i class="el-icon-watch-1"></i>
创建时间
</template>
<mdp-date-range
v-model="filters"
type="daterange"
type="daterange"
start-key="ctimeStart"
end-key="ctimeEnd"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="完成日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:auto-default="false"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:auto-default="false"
key="planEndTime"
></mdp-date-range>
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-document"></i>
产品编号
</template>
<el-input v-model="filters.id" clearable style="width:100%;"></el-input>
</template>
<el-input v-model="filters.id" clearable style="width:100%;"></el-input>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-document"></i>
产品名称
</template>
<el-input v-model="filters.key" clearable style="width:100%;"></el-input>
</template>
<el-input v-model="filters.key" clearable style="width:100%;"></el-input>
</el-descriptions-item>
<el-descriptions-item>
<el-button type="primary" style="float:right;" @click="searchXmProducts" icon="el-icon-search">查询</el-button>
<el-button type="primary" style="float:right;" @click="searchXmProducts" icon="el-icon-search">查询</el-button>
</el-descriptions-item>
</el-descriptions>
</el-descriptions>
<el-button slot="reference" icon="el-icon-more" id="guider-two"></el-button>
</el-popover>
<span style="float:right;">
<el-popover
<el-popover
placement="top-start"
width="450"
trigger="click" >
<el-row>
width="450"
trigger="click" >
<el-row>
<el-row>
<el-badge value="都适用">
<el-button @click="showAdd" icon="el-icon-plus">直接添加新产品</el-button>
<el-button @click="showAdd" icon="el-icon-plus">直接添加新产品</el-button>
</el-badge>
</el-row>
</el-row>
<el-row>
<el-badge value="进阶">
<el-button type="primary" icon="el-icon-plus" >通过产品-复制一键创建新的产品</el-button>
<el-button type="primary" icon="el-icon-plus" >通过产品-复制一键创建新的产品</el-button>
</el-badge>
</el-row>
</el-row>
<el-row>
<el-badge value="新手">
<el-button type="warning" @click="templateVisible=!templateVisible" icon="el-icon-plus">通过模板-复制一键创建新的产品</el-button>
<el-button type="warning" @click="templateVisible=!templateVisible" icon="el-icon-plus">通过模板-复制一键创建新的产品</el-button>
</el-badge>
</el-row>
</el-row>
</el-row>
</el-row>
<el-button type="primary" slot="reference" icon="el-icon-plus" v-if="!xmIteration" id="guider-one" round>产品</el-button>
</el-popover>
</span>
@ -143,16 +143,16 @@
<div class="project-name">
<el-tag title="产品状态" v-for="(item,index) in formatDictsWithClass(dicts,'xmProductPstatus',p.pstatus)" :key="index" :type="item.className">{{item.name}}</el-tag>
{{p.productName}}
</div>
</div>
<el-popover
placement="top-start"
title="更多操作"
width="200"
trigger="hover">
<div class="project-id">
<el-link id="prj-copy-btn" type="primary" title="通过复制快速创建新产品" @click.stop="onCopyToBtnClick(p)" v-loading="load.add">复制&nbsp;</el-link>
<el-link v-if="menukey=='myFocus'" type="primary" @click.stop="focusOrUnfocus(p)" >取消关注</el-link>
<el-link v-else type="primary" @click.stop="focusOrUnfocus(p)" >关注</el-link>
<div class="project-id">
<el-link id="prj-copy-btn" type="primary" title="通过复制快速创建新产品" @click.stop="onCopyToBtnClick(p)" v-loading="load.add">复制&nbsp;</el-link>
<el-link v-if="menukey=='myFocus'" type="primary" @click.stop="focusOrUnfocus(p)" >取消关注</el-link>
<el-link v-else type="primary" @click.stop="focusOrUnfocus(p)" >关注</el-link>
<el-link type="danger" title="删除项目" @click.stop="handleDel(p)" v-loading="load.del">删除</el-link>
<!--<el-link id="prj-calc-btn" type="warning" style="font-size:14px;float:right;margin-left:2px;" title="统计项目的工作量、进度、需求、bugs等数据" @click.stop="loadTasksToXmProjectState(p)" v-loading="load.add">统计</el-link>-->
@ -160,9 +160,9 @@
<el-button size="mini" slot="reference" icon="el-icon-setting" circle plain></el-button>
</el-popover>
</div>
<div class="project-info">
</div>
<div class="project-info">
<div class="info-task" title="已完成需求数 / 总需求数 ">
<span class="nums">
<span class="item-total finish-task">{{p.menuFinishCnt==null?0:p.menuFinishCnt}}</span>
@ -197,20 +197,20 @@
</span>
<span class="item-type">缺陷</span>
</div>
</div>
</div>
<div class="project-rate">
<el-progress :percentage="(p.finishRate==null?0:p.finishRate)"></el-progress>
<el-tag v-if="getPlanRealProgress(p)>0" type="warning" effect="dark">超前{{ getPlanRealProgress(p) }}%</el-tag>
<el-tag v-else-if="getPlanRealProgress(p)<0" type="danger" effect="dark">落后{{ 0-getPlanRealProgress(p) }}%</el-tag>
<el-tag v-else-if="getProgress(p)>0" effect="dark" type="success" class="el-icon-check"> </el-tag>
<el-tag v-else-if="getProgress(p)==0" effect="dark" type="info">未开始 </el-tag>
</div>
<div class="project-footer">
<div class="project-footer">
<div class="project-type" title="产品经理">
<mdp-select-user-xm v-if="p.pmUserid" :value="p" userid-key="pmUserid" username-key="pmUsername" :disabled="true"></mdp-select-user-xm>
<mdp-select-user-xm v-else-if="p.admUserid" :value="p" userid-key="admUserid" username-key="admUsername" :disabled="true"></mdp-select-user-xm>
<mdp-select-user-xm v-if="p.pmUserid" :value="p" userid-key="pmUserid" username-key="pmUsername" :disabled="true"></mdp-select-user-xm>
<mdp-select-user-xm v-else-if="p.admUserid" :value="p" userid-key="admUserid" username-key="admUsername" :disabled="true"></mdp-select-user-xm>
</div>
<div class="project-period">{{p.startTime?p.startTime.substr(0,10):''}} ~{{p.endTime?p.endTime.substr(0,10):''}}</div>
<!--<div class="project-period">{{p.startTime.substr(0,10)}} ~{{p.endTime.substr(0,10)}}</div>-->
@ -225,10 +225,10 @@
<el-row>
您可以通过 &nbsp;<el-button @click="showAdd" icon="el-icon-plus" type="primary" plain>产品</el-button>&nbsp;
</el-row>
<el-row>
<el-row>
通过&nbsp;<el-button @click="templateVisible=true" type="primary" plain style="margin-bottom:5px;">公共模板</el-button>&nbsp;体验产品的过程。<br/>
</el-row>
<el-row>
<el-row>
通过&nbsp;<el-button @click="templateVisible=true" type="primary" plain style="margin-bottom:5px;">拷贝模板</el-button>&nbsp;快速创建新产品。<br/>
</el-row>
</el-row>
@ -239,37 +239,37 @@
<el-row v-show="!showType" class="padding-top">
<!--列表 XmProduct 产品表-->
<el-table ref="table" :height="maxTableHeight" :data="xmProducts" @sort-change="sortChange" highlight-current-row v-loading="load.list" @selection-change="selsChange" @row-click="rowClick" style="width: 100%;" border>
<el-row slot="empty">
<el-row slot="empty">
<el-result icon="info" title="信息提示" subTitle="没有查到相关产品,有可能是您暂时还没有产品,有可能是您无权限查询产品。">
<template slot="extra">
<el-row>
<el-row>
您可以通过 &nbsp;<el-button @click="showAdd" icon="el-icon-plus" type="primary" plain>产品</el-button>&nbsp;
</el-row>
<el-row>
<el-row>
通过&nbsp;<el-button @click="templateVisible=true" type="primary" plain style="margin-bottom:5px;">公共模板</el-button>&nbsp;体验产品的过程。<br/>
</el-row>
<el-row>
<el-row>
通过&nbsp;<el-button @click="templateVisible=true" type="primary" plain style="margin-bottom:5px;">拷贝模板</el-button>&nbsp;快速创建新产品。<br/>
</el-row>
</el-row>
</template>
</el-result>
</el-row>
</el-result>
</el-row>
<el-table-column prop="productName" label="产品名称" min-width="250" sortable fixed="left">
<template slot-scope="scope" >
<el-link id="guider-three" type="primary" @click="intoInfo(scope.row)">{{scope.row.productName}}</el-link>
</template>
</el-table-column>
<el-table-column prop="id" label="产品编码" min-width="150" sortable fixed="left" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="pstatus" label="状态" width="100" sortable :formatter="formatPstatus" fixed="left">
<template slot-scope="scope">
<mdp-select-tag placeholder="状态" :dict="dicts['xmProductPstatus']" v-model="scope.row.pstatus" effect="dark"></mdp-select-tag>
<el-table-column prop="id" label="产品编码" min-width="150" sortable fixed="left" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="pstatus" label="状态" width="100" sortable :formatter="formatPstatus" fixed="left">
<template slot-scope="scope">
<mdp-select-tag placeholder="状态" item-code="xmProductPstatus" v-model="scope.row.pstatus" effect="dark"></mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="finishRate" label="进度" width="180" sortable>
<template slot-scope="scope">
<template slot-scope="scope">
<div style="display:flex;">
<div style="width:3em;">{{ getProgress(scope.row) }}%</div>
<el-button plain circle id="guider-four" type="text" icon="el-icon-video-play" @click.stop="loadTasksToXmProductState( scope.row)"></el-button>
@ -283,51 +283,51 @@
</template>
</el-table-column>
<el-table-column prop="pmUsername" label="产品经理" width="150" sortable show-overflow-tooltip>
<template slot-scope="scope">
<template slot-scope="scope">
<mdp-select-user-xm v-model="scope.row" userid-key="pmUserid" username-key="pmUsername" :disabled="true"></mdp-select-user-xm>
</template>
</el-table-column>
<el-table-column prop="menuCnt" label="需求数" width="120" sortable show-overflow-tooltip>
<template slot-scope="scope">
<template slot-scope="scope">
<span title=" 已完成 / 总需求数">{{scope.row.menuCnt>0?scope.row.menuFinishCnt+'&nbsp;/&nbsp;'+scope.row.menuCnt:''}}</span>
</template>
</el-table-column>
<el-table-column prop="projectCnt" label="项目数" width="120" sortable show-overflow-tooltip>
<template slot-scope="scope">
<template slot-scope="scope">
<span title="实际发生的关联项目数">{{scope.row.projectCnt>0? scope.row.projectCnt:''}}</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="iterationCnt" label="迭代数" width="120" sortable show-overflow-tooltip>
<template slot-scope="scope">
<template slot-scope="scope">
<span title="实际发生的关联迭代数">{{scope.row.iterationCnt>0? scope.row.iterationCnt:''}}</span>
</template>
</el-table-column>
<el-table-column prop="taskCnt" label="任务数" width="120" sortable show-overflow-tooltip>
<template slot-scope="scope">
<template slot-scope="scope">
<span title=" 已完成 / 总任务数">{{scope.row.taskCnt>0?scope.row.taskFinishCnt+'&nbsp;/&nbsp;'+scope.row.taskCnt:''}}</span>
</template>
</el-table-column>
<el-table-column prop="bugCnt" label="缺陷数" width="120" sortable show-overflow-tooltip>
<template slot-scope="scope">
<template slot-scope="scope">
<span title=" 已关闭 / 总缺陷数 ">{{scope.row.bugCnt>0?scope.row.closedBugs+'&nbsp;/&nbsp;'+scope.row.bugCnt:''}}</span>
</template>
</el-table-column>
<el-table-column prop="budgetWorkload" label="预计工时" width="100" show-overflow-tooltip sortable></el-table-column>
<el-table-column prop="actWorkload" label="实际工时" width="100" show-overflow-tooltip sortable></el-table-column>
<el-table-column label="操作" width="150" fixed="right">
<template slot-scope="scope">
<el-button v-if="menukey=='myFocus'" type="primary" @click.stop="focusOrUnfocus(scope.row)" >取消关注</el-button>
<el-button v-else type="text" @click.stop="focusOrUnfocus(scope.row)" >关注</el-button>
<el-button v-if="menukey=='myFocus'" type="primary" @click.stop="focusOrUnfocus(scope.row)" >取消关注</el-button>
<el-button v-else type="text" @click.stop="focusOrUnfocus(scope.row)" >关注</el-button>
<el-button id="guider-five" type="text" title="通过复制创建新的产品" @click="onCopyToBtnClick(scope.row)" :disabled="load.add" v-loading="load.add">复制</el-button>
<el-button type="text" v-loading="load.del" @click="handleDel(scope.row)" :disabled="load.del==true" icon="el-icon-delete">删除</el-button>
<el-button type="text" v-loading="load.del" @click="handleDel(scope.row)" :disabled="load.del==true" icon="el-icon-delete">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
</el-row>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[12,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
@ -357,23 +357,23 @@
</el-drawer>
<el-drawer title="选择项目" :visible.sync="projectVisible" size="60%" append-to-body>
<xm-project-list @select="onProjectSelected"></xm-project-list>
</el-drawer>
</el-drawer>
<el-drawer title="迭代报告" :visible.sync="iterationSelectVisible" fullscreen append-to-body :close-on-click-modal="false">
<xm-iteration-select @row-click="onXmIterationSelect"></xm-iteration-select>
</el-drawer>
</el-drawer>
<el-dialog
title="通过复制创建新的模板或者新的产品"
:visible.sync="copyToVisible"
width="500" >
width="500" >
<el-form>
<el-form-item label="产品名称">
<el-input v-model="xmProductCopy.productName" placeholder="新的产品名称"></el-input>
<el-input v-model="xmProductCopy.productName" placeholder="新的产品名称"></el-input>
</el-form-item>
<el-form-item label="产品代号">
<el-input v-model="xmProductCopy.code" placeholder="新的产品代号">
<el-form-item label="产品代号">
<el-input v-model="xmProductCopy.code" placeholder="新的产品代号">
<template slot="append">
<el-button type="text" @click="createProductCode">自动生成</el-button>
</template></el-input>
</template></el-input>
<font color="blue" style="font-size:10px;">产品代号为合同上的产品代号甲乙方共享产品内部编号为&nbsp;代号-四位随机码</font>
</el-form-item>
<el-form-item label="目标">
@ -381,10 +381,10 @@
<el-radio v-model="xmProductCopy.isTpl" label="0">复制为新的产品</el-radio>
</el-form-item>
<el-form-item label="附加任务">
<el-checkbox v-model="xmProductCopy.copyMenu" true-label="1" false-label="0">拷贝需求列表</el-checkbox>
<el-checkbox v-model="xmProductCopy.copyPhase" true-label="1" false-label="0">拷贝计划</el-checkbox>
<el-checkbox v-model="xmProductCopy.copyGroup" true-label="1" false-label="0">拷贝组织架构</el-checkbox>
<el-checkbox v-model="xmProductCopy.copyGroupUser" true-label="1" false-label="0">拷贝产品组成员</el-checkbox>
<el-checkbox v-model="xmProductCopy.copyMenu" true-label="1" false-label="0">拷贝需求列表</el-checkbox>
<el-checkbox v-model="xmProductCopy.copyPhase" true-label="1" false-label="0">拷贝计划</el-checkbox>
<el-checkbox v-model="xmProductCopy.copyGroup" true-label="1" false-label="0">拷贝组织架构</el-checkbox>
<el-checkbox v-model="xmProductCopy.copyGroupUser" true-label="1" false-label="0">拷贝产品组成员</el-checkbox>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
@ -392,7 +392,7 @@
<el-button type="primary" @click="onCopyToConfirm" :disabled="load.add" v-loading="load.add"> </el-button>
</span>
</el-dialog>
<el-dialog :visible.sync="templateVisible" append-to-body width="60%" top="20px">
<xm-product-tpl-mng @copy="searchXmProducts" :show-type="'simple'" ref="xmProductTplMngRef"></xm-product-tpl-mng>
</el-dialog>
@ -413,9 +413,9 @@
import XmIterationMng from '@/views/xm/core/components/XmIterationSelect';//
import XmProductStateMng from '../xmProductState/XmProductStateMng';//
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
import XmIterationSelect from '@/views/xm/core/components/XmIterationSelect.vue';
import XmProductSelect from '@/views/xm/core/components/XmProductSelect.vue';
import XmProductSelect from '@/views/xm/core/components/XmProductSelect.vue';
import { addUserFocus , delUserFocus } from '@/api/mdp/sys/userFocus';
import MdpSelectUserXm from "@/views/xm/core/components/MdpSelectUserXm/index";
@ -466,13 +466,13 @@
addFormVisible: false,//xmProduct
//xmProduct
addForm: {
id:'',productName:'',branchId:'',remark:'',version:'',pmUserid:'',pmUsername:'',ctime:'',deptid:'',pstatus:'',startTime:'',endTime:'',deptName:'',admUserid:'',admUsername:'',assUserid:'',assUsername:'',bizProcInstId:'',bizFlowState:'',isTpl:'',baselineId:'',baseTime:'',code:'',pbudgetWorkload:'',pbudgetAmount:'',pmenuBudgetWorkload:'',pmenuBudgetAmount:'',budgetCtrl:'',phaseBudgetCtrl:'',phaseActCtrl:'',locked:'',del:'',ltime:''
},
editFormVisible: false,//
//xmProduct
//xmProduct
editForm: {
id:'',productName:'',branchId:'',remark:'',version:'',pmUserid:'',pmUsername:'',ctime:'',deptid:'',pstatus:'',startTime:'',endTime:'',deptName:'',admUserid:'',admUsername:'',assUserid:'',assUsername:'',bizProcInstId:'',bizFlowState:'',isTpl:'',baselineId:'',baseTime:'',code:'',pbudgetWorkload:'',pbudgetAmount:'',pmenuBudgetWorkload:'',pmenuBudgetAmount:'',budgetCtrl:'',phaseBudgetCtrl:'',phaseActCtrl:'',locked:'',del:'',ltime:''
},
@ -480,7 +480,7 @@
iterationSelectVisible:false,
productStateVisible:false,
selectFiltersPmUserVisible:false,
maxTableHeight:300,
maxTableHeight:300,
projectVisible:false,
productSelectVisible:false,
showType:true,
@ -488,7 +488,7 @@
id:'',productName:'',code:'',isTpl:'',copyMenu:'1',copyPhase:'1',copyGroup:'1',copyGroupUser:'0'
},
copyToVisible:false,
templateVisible:false,
templateVisible:false,
menukey:'',
/**end 自定义属性请在上面加 请加备注**/
}
@ -566,9 +566,9 @@
if(this.filters.queryScope=="branchId"){
params.branchId=this.userInfo.branchId
}
params.ctimeStart=this.filters.ctimeStart
params.ctimeEnd=this.filters.ctimeEnd
params.ctimeEnd=this.filters.ctimeEnd
if(this.xmIteration){
params.iterationId=this.xmIteration.id
}
@ -590,14 +590,14 @@
if(tips.isOk){
this.pageInfo.total = res.data.total;
this.pageInfo.count=false;
this.xmProducts = res.data.data;
this.xmProducts = res.data.data;
}else{
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: 'error' });
}
if(callBack){
this.$nextTick(()=>{
callBack();
})
})
}
this.load.list = false;
}).catch( err => this.load.list = false );
@ -609,7 +609,7 @@
this.editForm = Object.assign({}, row);
},
// XmProduct
showAdd: function () {
showAdd: function () {
this.addFormVisible = true;
//this.addForm=Object.assign({}, this.editForm);
},
@ -631,16 +631,16 @@
intoInfo(row) {
this.editForm = row;
store.dispatch("setXmProduct",row).then(res=>{
this.$router.push({ name:'productOverview', query: {productId:row.id} })
})
this.$router.push({ name:'productOverview', query: {productId:row.id} })
})
//this.showInfo = true;
},
//xmProduct
selsChange: function (sels) {
this.sels = sels;
},
handleDel: function (row,index) {
},
handleDel: function (row,index) {
this.$prompt('将同步删除计划、组织、需求等,慎重起见,请输入产品代号:'+row.code, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
@ -658,14 +658,14 @@
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.del=false );
}else{
this.$notify({position:'bottom-left',showClose:true,message: "产品代号不正确", type: 'error' });
this.$notify({position:'bottom-left',showClose:true,message: "产品代号不正确", type: 'error' });
}
}).catch(() => {
return;
});
}).catch(() => {
return;
});
},
//xmProduct
batchDel: function () {
batchDel: function () {
var mmSels=this.sels.filter(i=>i.pmUserid!=this.userInfo.userid)
if(mmSels.length>0){
this.$notify({position:'bottom-left',showClose:true,message: "只能删除你负责的产品", type: 'error'});
@ -706,7 +706,7 @@
},
/**begin 自定义函数请在下面加**/
clearFiltersPmUser:function(){
this.filters.pmUser=null;
this.filters.pmUser=null;
},
selectFiltersPmUser(){
this.selectFiltersPmUserVisible=true;
@ -717,10 +717,10 @@
}else{
this.filters.pmUser=null;
}
this.selectFiltersPmUserVisible=false;
this.selectFiltersPmUserVisible=false;
},
setFiltersPmUserAsMySelf(){
this.filters.pmUser=this.userInfo;
this.filters.pmUser=this.userInfo;
},
onProjectSelected(projects){
@ -759,20 +759,20 @@
})
})
},
onCopyToBtnClick(row){
this.xmProductCopy.id=row.id;
this.xmProductCopy.productName=row.productName+"(复制)";
this.xmProductCopy.isTpl=row.isTpl;
this.xmProductCopy.isTpl=row.isTpl;
this.copyToVisible=true;
},
onCopyToConfirm(){
onCopyToConfirm(){
if(!this.xmProductCopy.code){
this.$notify({position:'bottom-left',showClose:true,message: '产品代号不能为空', type: 'error' });
return;
}
this.load.add=true;
copyTo(this.xmProductCopy).then(res=>{
copyTo(this.xmProductCopy).then(res=>{
this.load.add=false;
var tips = res.data.tips;
if(tips.isOk){
@ -794,38 +794,38 @@
}else{
return cellValue;
}
},
},
createProductCode(){
createProductCode({}).then(res=>{
var tips=res.data.tips;
if(tips.isOk){
this.xmProductCopy.code=res.data.data
}
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
})
},
/**end 自定义函数请在上面加**/
guiderStart(forceDisplayWhileClosed) { //
Guider.startByName('xmProductMng',forceDisplayWhileClosed);
Guider.startByName('xmProductMng',forceDisplayWhileClosed);
},
focusOrUnfocus:function(row){
if(this.menukey=="myFocus"){
delUserFocus({pbizId:row.id,bizId:row.id}).then(res=>{
var tips=res.data.tips;
if(tips.isOk){
this.getXmProjects();
}
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
this.getXmProjects();
}
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
})
}else{
addUserFocus({pbizId:row.id,focusType:'3',bizId:row.id,bizName:row.productName}).then(res=>{
var tips=res.data.tips;
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
})
}
},
getProgress(p){
var planRate=0;
if(!p.estimateWorkload||!p.budgetWorkload){
@ -850,30 +850,30 @@
'xm-product-edit':XmProductEdit,
XmIterationMng,
XmProductStateMng,
UsersSelect,
UsersSelect,
XmIterationSelect,
XmProductSelect,
XmProductTplMng,
XmProductTplMng,
MdpSelectUserXm,
//
},
mounted() {
initSimpleDicts('all',['xmProductPstatus'] ).then(res=>{
if(res.data.tips.isOk){
this.dicts['xmProductPstatus']=res.data.data.xmProductPstatus
if(res.data.tips.isOk){
this.dicts['xmProductPstatus']=res.data.data.xmProductPstatus
}
});
this.$nextTick(() => {
this.maxTableHeight = this.source == 'GZT' ? this.maxTableHeight : util.calcTableMaxHeight(this.$refs.table1.$el);
this.getXmProducts(this.guiderStart);
this.$nextTick(() => {
this.maxTableHeight = this.source == 'GZT' ? this.maxTableHeight : util.calcTableMaxHeight(this.$refs.table1.$el);
this.getXmProducts(this.guiderStart);
});
},
}
</script>
<style lang="scss" scoped>
<style lang="scss" scoped>
.more-label-font{
@ -892,7 +892,7 @@
.project-card{
cursor: pointer;
font-size: 12px;
color: #999;
color: #999;
padding: 10px;
}
.project-card:hover{
@ -931,7 +931,7 @@
font-size: 18px;
color: #666;
}
.info-task{
.info-task{
span{
display: flex;
justify-content:center;

516
src/views/xm/core/xmProject/XmProjectEdit.vue
File diff suppressed because it is too large
View File

428
src/views/xm/core/xmProject/XmProjectMng.vue

@ -1,131 +1,131 @@
<template>
<section class="padding">
<el-row class="padding-left padding-right">
<xm-product-select class="hidden-md-and-down" :auto-select="false" @row-click="onProductSelected" @clear="onProductClose"></xm-product-select>
<section class="padding">
<el-row class="padding-left padding-right">
<xm-product-select class="hidden-md-and-down" :auto-select="false" @row-click="onProductSelected" @clear="onProductClose"></xm-product-select>
<el-select v-model="menukey" @change="handleSelect" clearable style="width:10em;">
<el-option value="all" label="全部"></el-option>
<el-option value="compete" label="我参与"></el-option>
<el-option value="leader" label="我管理"></el-option>
<el-option value="leader" label="我管理"></el-option>
<el-option value="approver" label="我审核"></el-option>
<el-option value="create" label="我创建"></el-option>
<el-option value="myFocus" label="我关注"></el-option>
<el-option value="myExecuserStatus0" label="我排队"></el-option>
<el-option value="myExecuserStatus1" label="我执行"></el-option>
<el-option value="myExecuserStatus7" label="我放弃"></el-option>
</el-select>
<mdp-select label="项目状态" placeholder="状态" style="width:10em;" :dict="dicts['projectStatus']" v-model="filters.status"></mdp-select>
<el-option value="myExecuserStatus1" label="我执行"></el-option>
<el-option value="myExecuserStatus7" label="我放弃"></el-option>
</el-select>
<mdp-select label="项目状态" placeholder="状态" style="width:10em;" item-code="projectStatus" v-model="filters.status"></mdp-select>
<el-input v-model="filters.key" style="width:10em;" placeholder="名称查询" clearable >
</el-input>
<el-button type="primary" icon="el-icon-search" @click="searchXmProjects">查询</el-button>
<el-button type="primary" icon="el-icon-search" @click="searchXmProjects">查询</el-button>
<el-popover
placement="top-start"
title="更多条件、操作"
width="600"
trigger="click" >
trigger="click" >
<el-descriptions class="margin-top" size="mini" :column="1" border>
<template slot="extra">
<template slot="extra">
<el-button type="text" @click="templateVisible=!templateVisible">{{templateVisible?'隐藏模板':'显示模板'}}</el-button>
<el-button type="text" @click="guiderStart(true)" icon="el-icon-help">新手导航</el-button>
</template>
</template>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-time"></i>
显示方式
</template>
</template>
<el-radio v-model="showType" :label="false">表格</el-radio>
<el-radio v-model="showType" :label="true">卡片</el-radio>
</el-descriptions-item>
<el-radio v-model="showType" :label="true">卡片</el-radio>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-document"></i>
选择产品
</template>
<xm-product-select style="display:inline;" :auto-select="false" @row-click="onProductSelected" @clear="onProductClose"></xm-product-select>
<xm-product-select style="display:inline;" :auto-select="false" @row-click="onProductSelected" @clear="onProductClose"></xm-product-select>
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item :span="2">
<template slot="label">
<i class="el-icon-watch-1"></i>
创建时间
</template>
<mdp-date-range
v-model="filters"
type="daterange"
type="daterange"
start-key="createTimeStart"
end-key="createTimeEnd"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="完成日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:auto-default="false"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:auto-default="false"
key="planEndTime"
></mdp-date-range>
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-document"></i>
项目编号
</template>
<el-input v-model="filters.id" clearable style="width:100%;"></el-input>
</template>
<el-input v-model="filters.id" clearable style="width:100%;"></el-input>
</el-descriptions-item>
<el-descriptions-item>
<el-button type="primary" style="float:right;" @click="searchXmProjects" icon="el-icon-search">查询</el-button>
<el-button type="primary" style="float:right;" @click="searchXmProjects" icon="el-icon-search">查询</el-button>
</el-descriptions-item>
</el-descriptions>
<el-button slot="reference" icon="el-icon-more" id="prj-more-btn"></el-button>
</el-popover>
<span style="float:right;">
<el-popover style="padding-left:10px;"
<el-popover style="padding-left:10px;"
placement="top-start"
width="450"
trigger="click" >
<el-row>
width="450"
trigger="click" >
<el-row>
<el-row>
<el-badge value="都适用">
<el-button @click="showAdd" icon="el-icon-plus">直接添加新项目</el-button>
<el-button @click="showAdd" icon="el-icon-plus">直接添加新项目</el-button>
</el-badge>
</el-row>
</el-row>
<el-row>
<el-badge value="进阶">
<el-button type="primary" icon="el-icon-plus">通过项目-复制一键创建新的项目</el-button>
<el-button type="primary" icon="el-icon-plus">通过项目-复制一键创建新的项目</el-button>
</el-badge>
</el-row>
</el-row>
<el-row>
<el-badge value="新手">
<el-button type="warning" @click="templateVisible=!templateVisible" icon="el-icon-plus">通过模板-复制一键创建新的项目</el-button>
<el-button type="warning" @click="templateVisible=!templateVisible" icon="el-icon-plus">通过模板-复制一键创建新的项目</el-button>
</el-badge>
</el-row>
</el-row>
</el-row>
</el-row>
<el-button id="prj-plus-btn" type="primary" slot="reference" icon="el-icon-plus" round>项目</el-button>
</el-popover>
</el-popover>
</span>
</el-row>
<el-row ref="table1">
</el-row>
<el-row ref="table1">
<!--列表 XmProject xm_project-->
<el-row v-show="showType" v-loading="load.list" :style="{overflowX:'hidden',height:maxTableHeight+'px'}" >
<el-row>
<el-col v-cloak v-for="(p,i) in ScreenData" :key="i" :xl="6" :lg="8" :md="8" :sm="12" :xs="24" class="project-card">
<el-card @click.native="intoInfo(p,i)" shadow="always" id="prj-view-box">
<div slot="header" style="display:flex;justify-content: space-between;">
<div class="project-name">
<el-tag title="项目状态" v-for="(item,index) in formatDictsWithClass(dicts,'projectStatus',p.status)" :key="index" :type="item.className">{{item.name}}</el-tag>
{{p.name}}
</div>
</div>
<el-popover
placement="top-start"
title="更多操作"
width="200"
trigger="hover">
<div class="project-id">
<el-link id="prj-copy-btn" type="primary" title="通过复制快速创建新项目" @click.stop="onCopyToBtnClick(p)" v-loading="load.add">复制&nbsp;</el-link>
<el-link v-if="menukey=='myFocus'" type="primary" @click.stop="focusOrUnfocus(p)" >取消关注</el-link>
<el-link v-else type="primary" @click.stop="focusOrUnfocus(p)" >关注</el-link>
<div class="project-id">
<el-link id="prj-copy-btn" type="primary" title="通过复制快速创建新项目" @click.stop="onCopyToBtnClick(p)" v-loading="load.add">复制&nbsp;</el-link>
<el-link v-if="menukey=='myFocus'" type="primary" @click.stop="focusOrUnfocus(p)" >取消关注</el-link>
<el-link v-else type="primary" @click.stop="focusOrUnfocus(p)" >关注</el-link>
<el-link type="danger" title="删除项目" @click.stop="handleDel(p)" v-loading="load.del">删除</el-link>
<!--<el-link id="prj-calc-btn" type="warning" style="font-size:14px;float:right;margin-left:2px;" title="统计项目的工作量、进度、需求、bugs等数据" @click.stop="loadTasksToXmProjectState(p)" v-loading="load.add">统计</el-link>-->
@ -134,9 +134,9 @@
<el-button size="mini" slot="reference" icon="el-icon-setting" circle plain></el-button>
</el-popover>
</div>
<div class="project-info">
<div class="project-info">
<div class="info-task" title="已完成需求数 / 总需求数 ">
<span>
<span class="item-total finish-task">{{menuFinishCntCalc(p)}}</span>
@ -174,7 +174,7 @@
</div>
<div class="project-rate">
<el-progress :percentage="(p.finishRate==null?0:p.finishRate)"></el-progress>
<el-tag v-if="getPlanRealProgress(p)>0" type="warning" effect="dark">超前{{ getPlanRealProgress(p) }}%</el-tag>
<el-tag v-else-if="getPlanRealProgress(p)<0" type="danger" effect="dark">落后{{ 0-getPlanRealProgress(p) }}%</el-tag>
<el-tag v-else-if="getProgress(p)>0" effect="dark" type="success" class="el-icon-check"> </el-tag>
@ -182,15 +182,15 @@
</div>
<div class="project-footer">
<div class="project-type" title="项目经理">
<mdp-select-user-xm v-if="p.pmUserid" :value="p" userid-key="pmUserid" username-key="pmUsername" :disabled="true"></mdp-select-user-xm>
<mdp-select-user-xm v-else-if="p.createUserid" :value="p" userid-key="createUserid" username-key="createUsername" :disabled="true"></mdp-select-user-xm>
<mdp-select-user-xm v-if="p.pmUserid" :value="p" userid-key="pmUserid" username-key="pmUsername" :disabled="true"></mdp-select-user-xm>
<mdp-select-user-xm v-else-if="p.createUserid" :value="p" userid-key="createUserid" username-key="createUsername" :disabled="true"></mdp-select-user-xm>
</div>
</div>
<div class="project-period">{{p.startTime?p.startTime.substr(0,10):''}} ~{{p.endTime?p.endTime.substr(0,10):''}}</div>
</div>
</el-card>
</el-col>
</el-row>
<el-row v-if="!load.list && xmProjects.length<=0">
<el-result icon="info" title="信息提示" subTitle="没有查到相关项目,有可能是您暂时还没有项目,有可能是您无权限查询项目。">
@ -199,17 +199,17 @@
<el-row>
您可以通过 &nbsp;<el-button @click="showAdd" icon="el-icon-plus" type="primary" plain>项目</el-button>&nbsp;
</el-row>
<el-row>
<el-row>
通过&nbsp;<el-button @click="templateVisible=true" type="primary" plain style="margin-bottom:5px;">公共模板</el-button>&nbsp;体验项目的过程。<br/>
</el-row>
<el-row>
<el-row>
通过&nbsp;<el-button @click="templateVisible=true" type="primary" plain style="margin-bottom:5px;">拷贝模板</el-button>&nbsp;快速创建新项目。<br/>
</el-row>
</el-row>
</template>
</el-result>
</el-row>
</el-row>
</el-row>
<el-row class="padding-top">
<el-table ref="table" :height="maxTableHeight" v-cloak v-show="!showType" fit stripe :data="ScreenData" @sort-change="sortChange" highlight-current-row v-loading="load.list" @selection-change="selsChange" @row-click="rowClick" style="width: 100%;" :border="true">
<el-row slot="empty">
@ -219,10 +219,10 @@
<el-row>
您可以通过 &nbsp;<el-button @click="showAdd" icon="el-icon-plus" type="primary" plain>项目</el-button>&nbsp;
</el-row>
<el-row>
<el-row>
通过&nbsp;<el-button @click="templateVisible=true" type="primary" plain style="margin-bottom:5px;">公共模板</el-button>&nbsp;体验项目的过程。<br/>
</el-row>
<el-row>
<el-row>
通过&nbsp;<el-button @click="templateVisible=true" type="primary" plain style="margin-bottom:5px;">拷贝模板</el-button>&nbsp;快速创建新项目。<br/>
</el-row>
</el-row>
@ -233,54 +233,54 @@
<template slot-scope="scope">
<el-link type="primary" @click.stop="intoInfo(scope.row)">{{scope.row.name}}</el-link>
</template>
</el-table-column>
<el-table-column prop="id" label="项目编码" sortable min-width="180" fixed="left" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="status" label="状态" width="100" sortable fixed="left">
<template slot-scope="scope">
<mdp-select-tag :dict="dicts['projectStatus']" :disabled="true" v-model="scope.row.status"></mdp-select-tag>
</el-table-column>
<el-table-column prop="id" label="项目编码" sortable min-width="180" fixed="left" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="status" label="状态" width="100" sortable fixed="left">
<template slot-scope="scope">
<mdp-select-tag item-code="projectStatus" :disabled="true" v-model="scope.row.status"></mdp-select-tag>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="bizFlowState" label="审批状态" min-width="120" >
<template slot-scope="scope">
<mdp-select-tag :dict="dicts['bizFlowState']" :disabled="true" v-model="scope.row.bizFlowState"></mdp-select-tag>
<mdp-select-tag item-code="bizFlowState" :disabled="true" v-model="scope.row.bizFlowState"></mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="finishRate" label="进度" width="180" sortable>
<template slot-scope="scope">
<div style="display:flex;">
<template slot-scope="scope">
<div style="display:flex;">
<div style="width:3em;">
{{getProgress(scope.row)}} %
</div>
<el-button id="guider-four" type="text" circle plain icon="el-icon-video-play" title="统计项目的工作量、进度、需求、bugs等数据" @click.stop="loadTasksToXmProjectState( scope.row)"></el-button>
<el-button id="guider-four" type="text" circle plain icon="el-icon-video-play" title="统计项目的工作量、进度、需求、bugs等数据" @click.stop="loadTasksToXmProjectState( scope.row)"></el-button>
<el-tag v-if="getPlanRealProgress(scope.row)>0" type="warning" effect="dark">超前{{ getPlanRealProgress(scope.row) }}%</el-tag>
<el-tag v-else-if="getPlanRealProgress(scope.row)<0" type="danger" effect="dark">落后{{ 0-getPlanRealProgress(scope.row) }}%</el-tag>
<el-tag v-else-if="getProgress(scope.row)>0" effect="dark" type="success" class="el-icon-check"> </el-tag>
<el-tag v-else-if="getProgress(scope.row)==0" effect="dark" type="info">未开始 </el-tag>
<el-tag v-else-if="getProgress(scope.row)==0" effect="dark" type="info">未开始 </el-tag>
</div>
</template>
</el-table-column>
<el-table-column prop="productCnt" label="项目数" sortable min-width="120" >
</el-table-column>
<el-table-column prop="iterationCnt" label="迭代数" sortable min-width="120" >
</el-table-column>
<el-table-column prop="menuCnt" label="需求数" sortable min-width="120" >
</el-table-column>
<el-table-column prop="productCnt" label="项目数" sortable min-width="120" >
</el-table-column>
<el-table-column prop="iterationCnt" label="迭代数" sortable min-width="120" >
</el-table-column>
<el-table-column prop="menuCnt" label="需求数" sortable min-width="120" >
<template slot-scope="scope">
<span title="完成的需求数 / 需求总数 ">{{scope.row.menuCnt>0?scope.row.menuFinishCnt+'&nbsp;/&nbsp;'+scope.row.menuCnt:''}}</span>
</template>
</el-table-column>
<el-table-column prop="taskCnt" label="任务数" sortable min-width="120" >
</el-table-column>
<el-table-column prop="taskCnt" label="任务数" sortable min-width="120" >
<template slot-scope="scope">
<span title="完成的任务数 / 任务总数 ">{{ ((scope.row.taskFinishCnt||0)+(scope.row.taskSetCnt||0)+(scope.row.taskCloseCnt||0))+'&nbsp;/&nbsp;'+(scope.row.taskCnt||0)}}</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="bugCnt" label="缺陷" sortable min-width="120" >
<template slot-scope="scope">
<span title="关闭的缺陷数 / 缺陷总数 ">{{scope.row.bugCnt>0?scope.row.closedBugs+'&nbsp;/&nbsp;'+scope.row.bugCnt:''}}</span>
</template>
</template>
</el-table-column>
<el-table-column prop="startTime" label="起止时间" sortable min-width="150" show-overflow-tooltip>
<template slot-scope="scope">
@ -292,44 +292,44 @@
<!-- <el-popover
placement="left"
trigger="hover"> -->
<el-button v-if="menukey=='myFocus'" type="text" @click.stop="focusOrUnfocus(scope.row)" >取消关注</el-button>
<el-button v-else type="text" @click.stop="focusOrUnfocus(scope.row)" >关注</el-button>
<el-button v-if="menukey=='myFocus'" type="text" @click.stop="focusOrUnfocus(scope.row)" >取消关注</el-button>
<el-button v-else type="text" @click.stop="focusOrUnfocus(scope.row)" >关注</el-button>
<el-button type="text" title="通过复制快速创建新项目" @click.stop="onCopyToBtnClick(scope.row)" v-loading="load.add">复制</el-button>
<el-button type="text" title="删除项目" @click.stop="handleDel(scope.row)" v-loading="load.del">删除</el-button>
<!--
<!--
<el-button type="primary" @click.stop="statusChange(scope,'1')" v-if="scope.row.status==0 || scope.row.status == 2">提交审核</el-button>
<el-button type="primary" @click.stop="statusChange(scope,'3')" v-if="scope.row.status==1">批准</el-button>
<el-button type="primary" @click.stop="statusChange(scope,'2')" v-if="scope.row.status==1">退回</el-button>
<el-button type="primary" @click.stop="statusChange(scope,'4')" v-if="scope.row.status==3">结束</el-button>
<el-button type="primary" @click.stop="statusChange(scope,'3')" v-if="scope.row.status==4">重新启动</el-button>
<el-button type="primary" @click.stop="handleDel(scope.row,scope.$index)" v-if="isLeader(scope.row.leader)">删除</el-button>
<el-dropdown @command="handleCommand" :hide-on-click="false">
<span class="el-dropdown-link">
更多<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item icon="el-icon-success" :command="{type:'sendToProcessApprova',row:scope.row,bizKey:'xm_project_start_approva'}">立项发审(审核通过后起效)</el-dropdown-item>
<el-dropdown-item icon="el-icon-success" :command="{type:'sendToProcessApprova',row:scope.row,bizKey:'xm_project_delete_approva'}">删除发审(审核通过后删除)</el-dropdown-item>
<el-dropdown-item icon="el-icon-success" :command="{type:'showEdit',row:scope.row,bizKey:'xm_project_baseinfo_change_approva'}">基础信息变更发审(审核通过后生效)</el-dropdown-item>
<el-dropdown-item icon="el-icon-success" :command="{type:'showEdit',row:scope.row,bizKey:'xm_project_budget_change_approva'}">预算变更发审(审核通过后生效)</el-dropdown-item>
<el-dropdown-item icon="el-icon-success" :command="{type:'sendToProcessApprova',row:scope.row,bizKey:'xm_project_over_approva'}">项目结项发审(审核通过后生效)</el-dropdown-item>
<el-dropdown-item icon="el-icon-success" :command="{type:'sendToProcessApprova',row:scope.row,bizKey:'xm_project_suspension_approva'}">项目暂停发审(审核通过后生效)</el-dropdown-item>
<el-dropdown-item icon="el-icon-success" :command="{type:'sendToProcessApprova',row:scope.row,bizKey:'xm_project_start_approva'}">立项发审(审核通过后起效)</el-dropdown-item>
<el-dropdown-item icon="el-icon-success" :command="{type:'sendToProcessApprova',row:scope.row,bizKey:'xm_project_delete_approva'}">删除发审(审核通过后删除)</el-dropdown-item>
<el-dropdown-item icon="el-icon-success" :command="{type:'showEdit',row:scope.row,bizKey:'xm_project_baseinfo_change_approva'}">基础信息变更发审(审核通过后生效)</el-dropdown-item>
<el-dropdown-item icon="el-icon-success" :command="{type:'showEdit',row:scope.row,bizKey:'xm_project_budget_change_approva'}">预算变更发审(审核通过后生效)</el-dropdown-item>
<el-dropdown-item icon="el-icon-success" :command="{type:'sendToProcessApprova',row:scope.row,bizKey:'xm_project_over_approva'}">项目结项发审(审核通过后生效)</el-dropdown-item>
<el-dropdown-item icon="el-icon-success" :command="{type:'sendToProcessApprova',row:scope.row,bizKey:'xm_project_suspension_approva'}">项目暂停发审(审核通过后生效)</el-dropdown-item>
<el-dropdown-item icon="el-icon-success" :command="{type:'sendToProcessApprova',row:scope.row,bizKey:'xm_project_restart_approva'}">项目重新启动发审(审核通过后生效)</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
-->
</el-dropdown>
-->
<!-- <el-button style="width:100%;" slot="reference" class="see-more" type="text" icon="el-icon-more"></el-button>
</el-popover> -->
</template>
</el-table-column>
</el-table>
</el-row>
</el-row>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[12,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</el-row>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[12,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
<el-dialog title="项目新增" :visible.sync="addFormVisible" :with-header="false" width="80%" top="20px" :close-on-click-modal="false" append-to-body>
<xm-project-add :sel-project="addForm" op-type="add" :visible="addFormVisible" @cancel="addFormVisible=false" @submit="afterAddSubmit"></xm-project-add>
@ -340,53 +340,53 @@
<el-drawer :title="selectProject==null?'项目明细':selectProject.name" center :fullscreen="true" :visible.sync="showInfo" size="50%" :close-on-click-modal="false" append-to-body>
<xm-project-info :sel-project="selectProject" :visible="showInfo" @changeShowInfo="changeShowInfo" @submit="changeShowInfo"></xm-project-info>
</el-drawer>
<el-drawer v-if="selectProject" :title="selectProject==null?'操作日志':selectProject.name+'操作日志'" center :visible.sync="xmRecordVisible" size="50%" :close-on-click-modal="false" append-to-body>
<xm-record :obj-type="'project'" :project-id="selectProject.id" :visible="xmRecordVisible" :simple="1"></xm-record>
</el-drawer>
<el-dialog
title="通过复制创建新的模板或者新的项目"
:visible.sync="copyToVisible"
width="500" >
width="500" >
<el-form>
<el-form-item label="项目名称">
<el-input v-model="xmProjectCopy.name" placeholder="新的项目名称"></el-input>
<el-input v-model="xmProjectCopy.name" placeholder="新的项目名称"></el-input>
</el-form-item>
<el-form-item label="项目代号">
<el-form-item label="项目代号">
<el-input v-model="xmProjectCopy.code" placeholder="新的项目代号">
<template slot="append">
<el-button type="text" @click="createProjectCode">自动生成</el-button>
</template>
</el-input>
<font color="blue" style="font-size:10px;">项目代号为合同上的项目代号甲乙方共享;项目内部编号为 &nbsp;代号-四位随机码</font>
</el-form-item>
<el-form-item label="目标">
<el-radio v-model="xmProjectCopy.isTpl" label="1">复制为新的模板</el-radio>
<el-radio v-model="xmProjectCopy.isTpl" label="0">复制为新的项目</el-radio>
</el-form-item>
</el-form-item>
<el-form-item label="公开范围" v-if="xmProjectCopy.isTpl=='1'">
<el-radio v-model="xmProjectCopy.tplType" label="1">向全网公开</el-radio>
<el-radio v-model="xmProjectCopy.tplType" label="2">只向本企业公开</el-radio>
</el-form-item>
<el-form-item label="附加任务">
<el-checkbox v-model="xmProjectCopy.copyPhase" true-label="1" false-label="0">拷贝计划</el-checkbox>
<el-checkbox v-model="xmProjectCopy.copyTask" true-label="1" false-label="0">拷贝任务</el-checkbox>
<el-checkbox v-model="xmProjectCopy.copyGroup" true-label="1" false-label="0">拷贝项目组织架构</el-checkbox>
<el-checkbox v-model="xmProjectCopy.copyGroupUser" true-label="1" false-label="0">拷贝项目组成员</el-checkbox>
<el-checkbox v-model="xmProjectCopy.copyProduct" true-label="1" false-label="0">拷贝关联产品及需求明细</el-checkbox>
<el-checkbox v-model="xmProjectCopy.copyPhase" true-label="1" false-label="0">拷贝计划</el-checkbox>
<el-checkbox v-model="xmProjectCopy.copyTask" true-label="1" false-label="0">拷贝任务</el-checkbox>
<el-checkbox v-model="xmProjectCopy.copyGroup" true-label="1" false-label="0">拷贝项目组织架构</el-checkbox>
<el-checkbox v-model="xmProjectCopy.copyGroupUser" true-label="1" false-label="0">拷贝项目组成员</el-checkbox>
<el-checkbox v-model="xmProjectCopy.copyProduct" true-label="1" false-label="0">拷贝关联产品及需求明细</el-checkbox>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="copyToVisible = false;load.add=false"> </el-button>
<el-button type="primary" @click="onCopyToConfirm" :disabled="load.add" v-loading="load.add"> </el-button>
</span>
</el-dialog>
</el-dialog>
<el-dialog :visible.sync="templateVisible" append-to-body width="60%" top="20px">
<xm-project-tpl-mng @copy="searchXmProjects" :show-type="'simple'" ref="xmProjectTplMngRef"></xm-project-tpl-mng>
</el-dialog>
</section>
</section>
</template>
@ -396,23 +396,23 @@
//import Sticky from '@/components/Sticky' // header
import config from "@/common/config"; //
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProject, editStatus, delXmProject, batchDelXmProject,copyTo,createProjectCode ,getDefOptions} from '@/api/xm/core/xmProject';
import { listXmProject, editStatus, delXmProject, batchDelXmProject,copyTo,createProjectCode ,getDefOptions} from '@/api/xm/core/xmProject';
import { loadTasksToXmProjectState , loadTasksSettleToXmProjectState} from '@/api/xm/core/xmProjectState';
import { addUserFocus , delUserFocus } from '@/api/mdp/sys/userFocus';
import XmProjectAdd from './XmProjectEdit';//
import XmProjectEdit from './XmProjectEdit';//
import { mapGetters } from 'vuex'
import xmTaskMng from '../xmTask/XmTaskMng';
import XmProjectTplMng from './XmProjectTplMng';
import xmTaskMng from '../xmTask/XmTaskMng';
import XmProjectTplMng from './XmProjectTplMng';
import XmProductSelect from '@/views/xm/core/components/XmProductSelect';
import MdpSelectUserXm from "@/views/xm/core/components/MdpSelectUserXm/index";
import store from '@/store'
import store from '@/store'
import Guider from '@/components/Guider/Index.js';
export default {
export default {
props:['dataScope', 'source'],
computed: {
...mapGetters([
@ -422,7 +422,7 @@
const key = this.menukey;
const userid = this.userInfo.userid;
return this.xmProjects;
},
},
watch: {
@ -435,7 +435,7 @@
this.searchXmProjects();
}
},
data() {
data() {
return {
filters: {
key: '',
@ -456,14 +456,14 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
dicts: getDefOptions(),// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts: getDefOptions(),// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmProject
//xmProject
addForm: {
id:'',code:'',name:'',xmType:'',startTime:'',endTime:'',urgent:'',priority:'',description:'',createUserid:'',createUsername:'',createTime:'',assess:'',assessRemarks:'',status:'',branchId:'',planTotalCost:'',bizProcInstId:'',bizFlowState:'',planNouserAt:'',planIuserAt:'',planOuserAt:'',locked:'',baseTime:'',baseRemark:'',baselineId:'',planWorkload:'0',totalReceivables:'0',budgetMarginRate:13,contractAmt:0,planIuserPrice:85,planOuserPrice:100,planOuserCnt:0,planIuserCnt:0,planWorkingHours:0,taxRate:3,planIuserWorkload:0,planOuserWorkload:0,fromTplId:'',budgetCtrl:'0',deptid:'',showOut:'0',isTpl:'0',pmUserid:'',pmUsername:'',assUserid:'',assUsername:'',admUserid:'',admUsername:'',budgetEarly:'',phaseActCtrl:'',del:'0',ltime:'',ostatus:'0',workType:'',wtype:'',earlyAmt:0,maxTaskAmt:0,menuLink:'0',phaseLink:'0',tplType:'',qxCode:''
},
editFormVisible: false,//
//xmProject
editForm: {
@ -477,7 +477,7 @@
finishFlag: false,
xmRecordVisible: false,
productSelectVisible:false,
maxTableHeight:300,
maxTableHeight:300,
xmProjectCopy:{
id:'',name:'',code:'',isTpl:'',copyPhase:'1',copyTask:'1',copyGroup:'1',copyGroupUser:'0',copyProduct:'1',tplType:'2',
},
@ -488,8 +488,8 @@
},//end data
methods: {
...util,
handleSizeChange(pageSize) {
this.pageInfo.pageSize=pageSize;
handleSizeChange(pageSize) {
this.pageInfo.pageSize=pageSize;
this.getXmProjects();
},
handleCurrentChange(pageNum) {
@ -511,7 +511,7 @@
this.getXmProjects();
},
searchXmProjects(){
this.pageInfo.count=true;
this.pageInfo.count=true;
this.getXmProjects();
},
// XmProject xm_project
@ -526,13 +526,13 @@
//params.xxx=this.filters.key
}else{
//params.xxx=xxxxx
}
this.load.list = true;
}
this.load.list = true;
if(this.pageInfo.orderFields!=null && this.pageInfo.orderFields.length>0){
let orderBys=[];
for(var i=0;i<this.pageInfo.orderFields.length;i++){
for(var i=0;i<this.pageInfo.orderFields.length;i++){
orderBys.push(this.pageInfo.orderFields[i]+" "+this.pageInfo.orderDirs[i])
}
}
params.orderBy= orderBys.join(",")
}
if(this.finishFlag){
@ -542,25 +542,25 @@
params = this.menuFilter(params);
if(this.filters.productId){
params.linkProductId = this.filters.productId
}
}
if(this.filters.status){
params.status = this.filters.status
}
}
params.createTimeStart=this.filters.createTimeStart
params.createTimeEnd=this.filters.createTimeEnd
listXmProject(params).then((res) => {
var tips=res.data.tips;
if(tips.isOk){
if(tips.isOk){
console.log(res.data);
this.pageInfo.total = res.data.total;
this.pageInfo.count=false;
this.xmProjects = res.data.data;
this.pageInfo.count=false;
this.xmProjects = res.data.data;
}else{
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: 'error' });
}
}
if(callBack){
this.$nextTick(()=>{
callBack();
callBack();
})
}
this.load.list = false;
@ -570,10 +570,10 @@
menuFilter(params) {
const key = this.menukey;
const userid = this.userInfo.userid;
if( this.dataScope=='all' && key == "compete"){
params.compete = userid;
if( this.dataScope=='all' && key == "compete"){
params.compete = userid;
}else if( this.dataScope!='all' && (key == "compete" || key=="all")){
params.compete = userid;
params.compete = userid;
} else if(key == "leader"){ //
params.pgTypeIds=['nbxmjl']
params.userid=userid
@ -630,9 +630,9 @@
//xmProject
selsChange: function (sels) {
this.sels = sels;
},
},
//xmProject
handleDel: function (row,index) {
handleDel: function (row,index) {
this.$prompt('将同步删除计划、组织、任务等,慎重起见,请输入项目代号:'+row.code, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
@ -643,40 +643,40 @@
delXmProject(params).then((res) => {
this.load.del=false;
var tips=res.data.tips;
if(tips.isOk){
if(tips.isOk){
this.pageInfo.count=true;
this.getXmProjects();
}
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.del=false );
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.del=false );
}else{
this.$notify({position:'bottom-left',showClose:true,message: "项目代号不正确", type: 'error' });
this.$notify({position:'bottom-left',showClose:true,message: "项目代号不正确", type: 'error' });
}
}).catch(() => {
return;
}).catch(() => {
return;
});
},
//xmProject
batchDel: function () {
this.$confirm('确认删除选中记录吗?', '提示', {
type: 'warning'
}).then(() => {
}).then(() => {
this.load.del=true;
batchDelXmProject(this.sels).then((res) => {
this.load.del=false;
var tips=res.data.tips;
if( tips.isOk ){
if( tips.isOk ){
this.pageInfo.count=true;
this.getXmProjects();
this.getXmProjects();
}
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error'});
}).catch( err => this.load.del=false );
});
},
rowClick: function(row, event, column){
const that = this;
const that = this;
this.selectProject=row;
this.editform=row;
},
@ -691,7 +691,7 @@
this.selectProject = row;
store.dispatch("setProjectInfo",row).then(res=>{
this.$router.push({ name:'projectOverview', query: {projectId:row.id} })
})
})
},
//
@ -712,7 +712,7 @@
this.ScreenData[scope.$index].status = val;
this.status = val;
}
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
this.load.edit = false;
}).catch( err => this.load.edut = false );
},
@ -721,41 +721,41 @@
this.xmProjects = [];
this.getXmProjects();
this.showInfo = false;
},
},
showApprovaInfo:function(row){
var msgFields=[];
if(row.mainTitle!=null && row.mainTitle!=""){
msgFields.push("流程【"+row.mainTitle+"】");
}
if(row.taskName!=null && row.taskName!=""){
msgFields.push("当前环节【"+row.taskName+"】");
}
if(row.assigneeName!=null && row.assigneeName!=""){
msgFields.push("执行人【"+row.assigneeName+"】");
}
if(row.commentMsg!=null && row.commentMsg!=""){
msgFields.push("审批意见【"+row.commentMsg+"】");
}
var msg=msgFields.join(",");
return msg;
},
sendToProcessApprova:function(row,bizKey){
sendToProcessApprova:function(row,bizKey){
if(row.bizFlowState=='1'){
this.$notify.error("审核中,不允许重新发起");
return;
}
let extVars={projectId:row.id}
let jsonExtVars=JSON.stringify(extVars);
let jsonExtVars=JSON.stringify(extVars);
var currDomain=window.location.protocol+"//"+window.location.host;
var fullPath=this.$route.fullPath;
var fullPath=this.$route.fullPath;
var bizUrl=currDomain+'/'+process.env.CONTEXT+'/'+process.env.VERSION+'/#'+fullPath+'?extVars='+jsonExtVars
var titleNames=row.name
var mainTitle=''
var mainContext=''
@ -775,7 +775,7 @@
}
mainTitle='关于项目【'+titleNames+"】结项的审批"
mainContext=mainTitle;
} else if(bizKey=='xm_project_restart_approva'){
if(row.status!='3'){
this.$notify.error("只有状态为暂停的项目可以进行重新启动操作");
@ -807,9 +807,9 @@
} else{
this.$notify.error("暂不支持的业务审批");
return;
}
}
let params={
let params={
mainContext:mainContext,
mainTitle:mainTitle,
bizKey:bizKey,
@ -823,9 +823,9 @@
},
}
let jsonParmas=encodeURIComponent(JSON.stringify(params));// decodeURIComponent
this.$router.push({name:'ProcdefListForBizStart',params:jsonParmas});
},
handleCommand(command) {
this.$router.push({name:'ProcdefListForBizStart',params:jsonParmas});
},
handleCommand(command) {
if(command.type=='sendToProcessApprova'){
this.sendToProcessApprova(command.row,command.bizKey);
} else if(command.type=='showEdit'){
@ -837,50 +837,50 @@
delUserFocus({pbizId:row.id,focusType:'1',bizId:row.id,bizName:row.name}).then(res=>{
var tips=res.data.tips;
if(tips.isOk){
this.getXmProjects();
}
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
this.getXmProjects();
}
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
})
}else{
addUserFocus({pbizId:row.id,focusType:'1',bizId:row.id,bizName:row.name}).then(res=>{
var tips=res.data.tips;
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
})
}
},
onProductSelected:function(product){
this.filters.productId=product.id
this.filters.productName=product.productName
this.filters.productName=product.productName
this.productSelectVisible=false;
},
onProductClose:function(){
this.filters.productId=''
this.filters.productName=''
this.filters.productName=''
},
onCopyToBtnClick(row){
this.xmProjectCopy.id=row.id;
this.xmProjectCopy.name=row.name+"(复制)";
this.xmProjectCopy.isTpl=row.isTpl;
this.xmProjectCopy.isTpl=row.isTpl;
this.copyToVisible=true;
},
onCopyToConfirm(){
if(!this.xmProjectCopy.code){
this.$notify({position:'bottom-left',showClose:true,message: '项目代号不能为空', type: 'error' });
return;
}
}
copyTo(this.xmProjectCopy);
this.$notify({position:'bottom-left',showClose:true,message: "已提交拷贝任务,执行需要1-5分钟,请稍后刷新项目列表", type: 'success' });
},
},
createProjectCode(){
createProjectCode({}).then(res=>{
var tips=res.data.tips;
if(tips.isOk){
this.xmProjectCopy.code=res.data.data
}
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
})
},
formatProjectStatus(status){
@ -895,27 +895,27 @@
return status;
}
},
formatterByDicts(row,column,cellValue){
formatterByDicts(row,column,cellValue){
if(column.property=='status'){
return this.formatProjectStatus(cellValue);
}
}
},
loadTasksToXmProjectState(row){
var params={projectId:row.id}
loadTasksToXmProjectState(params).then((res) => {
this.load.edit=false;
var tips=res.data.tips;
if( tips.isOk ){
if( tips.isOk ){
this.pageInfo.count=true;
this.searchXmProjects();
this.searchXmProjects();
}
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error'});
}).catch( err => this.load.edit=false );
}).catch( err => this.load.edit=false );
},
guiderStart(forceDisplayWhileClosed) { //
Guider.startByName('xmProjectMng',forceDisplayWhileClosed);
Guider.startByName('xmProjectMng',forceDisplayWhileClosed);
},
menuFinishCntCalc(project){
var allFinishCnt= (project.menuFinishCnt||0 )+ (project.menuCloseCnt||0)
@ -940,36 +940,36 @@
return Math.round((project.finishRate||0)-planRate)
}
/**end 自定义函数请在上面加**/
},//end methods
components: {
components: {
'xm-project-add':XmProjectAdd,
'xm-project-edit':XmProjectEdit,
'xm-project-edit':XmProjectEdit,
XmProductSelect,
xmTaskMng,
XmProjectTplMng,MdpSelectUserXm
//
},
mounted() {
mounted() {
if(this.$route.params){
this.filters.productId=this.$route.params.productId;
this.filters.productName=this.$route.params.productName;
}
this.$nextTick(() => {
this.$nextTick(() => {
initSimpleDicts('all',['projectType','priority','projectStatus','bizFlowState']).then(res=>{
this.dicts=res.data.data;
})
this.maxTableHeight = this.source == 'GZT' ? this.maxTableHeight : util.calcTableMaxHeight(this.$refs.table1.$el);
this.showInfo = false;
this.getXmProjects(this.guiderStart);
});
},
});
},
}
</script>
<style lang="scss" scoped>
<style lang="scss" scoped>
.changebtn{
float: right;
padding: 2px 10px;
@ -1009,11 +1009,11 @@
.el-menu--horizontal>.el-submenu .el-submenu__title:hover{
background-color: transparent;
}
.project-card{
.project-card{
cursor: pointer;
font-size: 12px;
color: #999;
padding: 10px;
padding: 10px;
}
.project-card:hover{
border-color: #00abfc;
@ -1052,7 +1052,7 @@
color: #666;
}
.info-task{
.info-task{
span{
display: flex;
justify-content:center;
@ -1110,7 +1110,7 @@
}
.right-btn{
margin-top: 12px;
}
}
@media only screen and (max-height: 2400px) {
.project-box{
max-height: 1600x;
@ -1135,5 +1135,5 @@
overflow-y: auto;
}
}
</style>
</style>

286
src/views/xm/core/xmQuestion/XmQuestionEdit.vue

@ -1,7 +1,7 @@
<template>
<section>
<section>
<el-row>
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editForm" label-position="left">
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editForm" label-position="left">
<el-row>
<el-col :span="6" >
<el-row class="padding border">
@ -9,8 +9,8 @@
{{editForm.projectId}}
</el-form-item>
<el-form-item label="归属产品" prop="productId">
<span v-if="editForm.productId">{{editForm.productId}}</span>
<span v-if="!xmProductCpd || !xmProductCpd.id">
<span v-if="editForm.productId">{{editForm.productId}}</span>
<span v-if="!xmProductCpd || !xmProductCpd.id">
<xm-product-select ref="xmProductSelect1" style="display:inline;" :auto-select="false" :link-project-id="selProject?selProject.id:null" @row-click="onProductSelected" @clear="onProductClearSelect" ></xm-product-select>
</span>
</el-form-item>
@ -21,15 +21,15 @@
<el-form-item label="归属模块" prop="funcId">
<span>{{editForm.funcName?editForm.funcName:'无'}} <el-button type="text" @click="funcVisible=true">选择模块</el-button></span>
</el-form-item>
<el-form-item label="归属需求" prop="menuId">
<el-form-item label="归属需求" prop="menuId">
<el-tag title="隶属需求" style="width:100%;" closable @click="showSelectMenu" @close.stop="handleCloseMenuTag">
<div class="icon" :style="{backgroundColor: 'rgb(79, 140, 255)' }">
<i :class=" 'el-icon-document' " ></i>
</div> {{editForm.menuName?editForm.menuName:"未关联需求"}}</el-tag>
</div> {{editForm.menuName?editForm.menuName:"未关联需求"}}</el-tag>
</el-form-item>
</span>
</el-row>
<el-row class="padding border">
<el-form-item label="最新意见" prop="remarks" class="field">
<div class="field-text">
@ -39,11 +39,11 @@
<el-input type="textarea" :rows="3" v-model="editForm.remarks" placeholder="处理意见" @change="editXmQuestionSomeFields(editForm,'remarks',$event)"></el-input>
</div>
</el-form-item>
</el-row>
</el-col>
<el-col :span="18" class="border padding">
<el-col :span="18" class="border padding">
<el-form-item label="缺陷标题" prop="name">
<el-input v-model="editForm.name" placeholder="缺陷标题" @change="editXmQuestionSomeFields(editForm,'name',$event)"></el-input>
<span v-if="opType!=='add'">
@ -53,146 +53,146 @@
<el-divider direction="vertical"></el-divider>
<el-tag v-if="editForm.tagNames">{{editForm.tagNames?editForm.tagNames:''}} </el-tag>
<el-button type="text" icon="el-icon-plus" @click="tagSelectVisible=true">标签</el-button>
<el-divider direction="vertical"></el-divider>
<el-divider direction="vertical"></el-divider>
<el-button type="text" icon="el-icon-share" @click="copyLink">分享</el-button>
</span>
</el-form-item>
<el-row class="padding">
<el-col :span="6">
</el-form-item>
<el-row class="padding">
<el-col :span="6">
<mdp-select-user-xm :project-id="editForm.projectId" :product-id="editForm.productId" label="责任人" v-model="editForm" userid-key="handlerUserid" username-key="handlerUsername" @change="editXmQuestionSomeFields(editForm,'handlerUserid',$event)">
<el-row slot="extOper" style="margin-left:20px;">
指派给 <el-button type="text" @click="sendToAsk"> 提出人</el-button> <el-button type="text" @click="sendToCreater"> 创建人</el-button>
</el-row>
指派给 <el-button type="text" @click="sendToAsk"> 提出人</el-button> <el-button type="text" @click="sendToCreater"> 创建人</el-button>
</el-row>
</mdp-select-user-xm>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="状态" :dict="dicts['bugStatus']" v-model="editForm.bugStatus" @change="editXmQuestionSomeFields(editForm,'bugStatus',$event)"></mdp-select>
</el-col>
<mdp-select show-style="x" label="状态" item-code="bugStatus" v-model="editForm.bugStatus" @change="editXmQuestionSomeFields(editForm,'bugStatus',$event)"></mdp-select>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="优先级" :dict="dicts['priority']" v-model="editForm.priority" @change="editXmQuestionSomeFields(editForm,'priority',$event)"></mdp-select>
<mdp-select show-style="x" label="优先级" item-code="priority" v-model="editForm.priority" @change="editXmQuestionSomeFields(editForm,'priority',$event)"></mdp-select>
</el-col>
<el-col :span="6">
<el-col :span="6">
<mdp-date-x label="结束时间" style="max-width:100%;" value-format="yyyy-MM-dd HH:mm:ss" v-model="editForm.endTime" @change="editXmQuestionSomeFields(editForm,'endTime',$event)"></mdp-date-x>
</el-col>
</el-row>
<el-tabs v-model="activateTabPaneName" ref="editRef">
<el-tab-pane label="缺陷描述" name="12" >
<el-form-item label="" prop="description" label-width="0px">
<vue-editor :height="maxTableHeight" v-if="visible && activateTabPaneName=='12'" class="rich-context" :id="'description_'+editForm.id" :branch-id="userInfo.branchId" v-model="editForm.description"></vue-editor>
<el-form-item label="" prop="description" label-width="0px">
<vue-editor :height="maxTableHeight" v-if="visible && activateTabPaneName=='12'" class="rich-context" :id="'description_'+editForm.id" :branch-id="userInfo.branchId" v-model="editForm.description"></vue-editor>
</el-form-item>
<el-row style="float:right;" v-if="opType!=='add'">
<el-button @click.native="handleCancel">取消</el-button>
<el-button v-loading="load.edit" v-if="editForm.description!==editFormBak.description" type="primary" @click.native="editXmQuestionSomeFields(editForm,'description',editForm.description)" :disabled="load.edit==true">保存</el-button>
<el-button v-loading="load.edit" v-if="editForm.description!==editFormBak.description" type="primary" @click.native="editXmQuestionSomeFields(editForm,'description',editForm.description)" :disabled="load.edit==true">保存</el-button>
</el-row>
</el-tab-pane>
<el-tab-pane name="1" label="基本信息">
<el-row>
<el-row>
<el-col :span="8">
<el-form-item label="提出人" prop="askUsername">
<mdp-select-user-xm :project-id="editForm.projectId" :product-id="editForm.productId" label="提出人" v-model="editForm" userid-key="askUserid" username-key="askUsername" @change="editXmQuestionSomeFields(editForm,'askUserid',$event)"></mdp-select-user-xm>
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="复现频率" prop="repRate">
<mdp-select-tag :dict="dicts['bugRepRate']" v-model="editForm.repRate" @change="editXmQuestionSomeFields(editForm,'repRate',$event)"></mdp-select-tag>
<el-form-item label="复现频率" prop="repRate">
<mdp-select-tag item-code="bugRepRate" v-model="editForm.repRate" @change="editXmQuestionSomeFields(editForm,'repRate',$event)"></mdp-select-tag>
</el-form-item>
</el-col>
<el-col :span="8">
</el-col>
<el-col :span="8">
<el-form-item label="复现版本" prop="verNum">
<el-input v-model="editForm.verNum" placeholder="请填写版本号" @change="editXmQuestionSomeFields(editForm,'verNum',$event)">
</el-input>
<el-input v-model="editForm.verNum" placeholder="请填写版本号" @change="editXmQuestionSomeFields(editForm,'verNum',$event)">
</el-input>
</el-form-item>
</el-col>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="严重程度" prop="bugSeverity">
<mdp-select-tag :dict="dicts['bugSeverity']" v-model="editForm.bugSeverity" @change="editXmQuestionSomeFields(editForm,'bugSeverity',$event)"></mdp-select-tag>
<mdp-select-tag item-code="bugSeverity" v-model="editForm.bugSeverity" @change="editXmQuestionSomeFields(editForm,'bugSeverity',$event)"></mdp-select-tag>
</el-form-item>
</el-col>
</el-col>
<el-col :span="8">
<el-form-item label="原因分析" prop="bugReason">
<mdp-select-tag :dict="dicts['bugReason']" v-model="editForm.bugReason" @change="editXmQuestionSomeFields(editForm,'bugReason',$event)"></mdp-select-tag>
<mdp-select-tag item-code="bugReason" v-model="editForm.bugReason" @change="editXmQuestionSomeFields(editForm,'bugReason',$event)"></mdp-select-tag>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="解决方案" prop="solution">
<mdp-select-tag :dict="dicts['bugSolution']" v-model="editForm.solution" @change="editXmQuestionSomeFields(editForm,'solution',$event)"></mdp-select-tag>
<mdp-select-tag item-code="bugSolution" v-model="editForm.solution" @change="editXmQuestionSomeFields(editForm,'solution',$event)"></mdp-select-tag>
</el-form-item>
</el-col>
</el-col>
<el-col :span="8">
<el-form-item label="缺陷类别" prop="bugType">
<mdp-select-tag :dict="dicts['bugType']" v-model="editForm.bugType" @change="editXmQuestionSomeFields(editForm,'bugType',$event)"></mdp-select-tag>
<mdp-select-tag item-code="bugType" v-model="editForm.bugType" @change="editXmQuestionSomeFields(editForm,'bugType',$event)"></mdp-select-tag>
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
</el-tab-pane>
<el-tab-pane label="测试步骤" name="2">
<el-form-item label="" prop="opStep" label-width="0px" v-if="stepConfigVisible==false">
<test-step-result v-model="editForm.opStep"></test-step-result>
<test-step-result v-model="editForm.opStep"></test-step-result>
</el-form-item>
<el-form-item label="" prop="opStep" label-width="0px" v-if="stepConfigVisible==true">
<test-step-config v-model="editForm.opStep"></test-step-config>
<test-step-config v-model="editForm.opStep"></test-step-config>
</el-form-item>
<el-row class="page-bottom">
<el-button @click.native="handleCancel">取消</el-button>
<el-button @click="stepConfigVisible=!stepConfigVisible">{{stepConfigVisible?'完成步骤配置':'去配置步骤'}}</el-button>
<el-button v-loading="load.edit" v-if="editForm.opStep!=editFormBak.opStep" type="primary" @click.native="editXmQuestionSomeFields(editForm,'opStep',editForm.opStep)" :disabled="load.edit==true">保存</el-button>
<el-button v-loading="load.edit" v-if="editForm.opStep!=editFormBak.opStep" type="primary" @click.native="editXmQuestionSomeFields(editForm,'opStep',editForm.opStep)" :disabled="load.edit==true">保存</el-button>
</el-row>
</el-tab-pane>
<el-tab-pane :label="'工时( '+(editForm.actWorkload?editForm.actWorkload:0)+' / '+(editForm.budgetWorkload?editForm.budgetWorkload:0)+' h )'" name="55">
</el-tab-pane>
<el-tab-pane :label="'工时( '+(editForm.actWorkload?editForm.actWorkload:0)+' / '+(editForm.budgetWorkload?editForm.budgetWorkload:0)+' h )'" name="55">
<xm-workload-record v-if="activateTabPaneName=='55'" biz-type="2" :xm-question="editForm" ></xm-workload-record>
</el-tab-pane>
<el-tab-pane label="流转记录" name="4" v-if="opType!='add'">
<el-tab-pane label="流转记录" name="4" v-if="opType!='add'">
<xm-question-handle-mng v-if="activateTabPaneName=='4'" :bug="editForm" :visible="activateTabPaneName=='4'"></xm-question-handle-mng>
</el-tab-pane>
<el-tab-pane label="关注" name="91" v-if="opType!='add'">
</el-tab-pane>
<el-tab-pane label="关注" name="91" v-if="opType!='add'">
<xm-my-do-focus v-if="activateTabPaneName=='91'" :biz-id="editForm.id" :pbiz-id="editForm.projectId" :biz-name="editForm.name" focus-type="5"></xm-my-do-focus>
</el-tab-pane>
</el-tabs>
</el-tabs>
</el-col>
</el-row>
<el-row style="float:right;" v-if="opType==='add'">
<el-button type="primary" @click="saveSubmit">保存</el-button>
</el-row>
</el-form>
</el-form>
<el-drawer append-to-body title="需求选择" :visible.sync="selectMenuVisible" size="80%" :close-on-click-modal="false">
<xm-menu-select v-if="selectMenuVisible" :xm-product="editForm.productId?{id:editForm.productId,productName:editForm.productName}:xmProductCpd" :xm-iteration="xmIteration" :visible="selectMenuVisible" :is-select-menu="true" checkScope="3" @selected="onSelectedMenu" :sel-project="selProject"></xm-menu-select>
</el-drawer>
</el-row>
</el-row>
<el-drawer append-to-body title="标签" :visible.sync="tagSelectVisible" class="dialog-body" size="60%">
<tag-mng :tagIds="editForm.tagIds?editForm.tagIds.split(','):[]" :jump="true" @select-confirm="onTagSelected">
</tag-mng>
</el-drawer>
<el-dialog append-to-body title="模块选择" :visible.sync="funcVisible" size="40%" top="20px" :close-on-click-modal="false">
<xm-func-select class="padding-left padding-right" v-if="funcVisible" @row-click="onFuncSelected" :xm-product="editForm.productId?{id:editForm.productId,productName:editForm.productName}:xmProductCpd"></xm-func-select>
</el-dialog>
<el-drawer append-to-body title="执行用例选择" :visible.sync="caseVisible" size="80%" top="20px" :close-on-click-modal="false">
<xm-test-plan-case-mng v-if="caseVisible" :select="true" :visible="caseVisible" :xm-project="selProject&&selProject.id?selProject:(editForm.projectId?{id:editForm.projectId}:null)" :xm-test-plan="xmTestPlan" :xm-product="editForm.productId?{id:editForm.productId,productName:editForm.productName}:xmProductCpd" @select="onTestPlanCaseSelected" ></xm-test-plan-case-mng>
</el-drawer>
@ -202,7 +202,7 @@
<script>
import util from '@/common/js/util';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmQuestion,editXmQuestionSomeFields } from '@/api/xm/core/xmQuestion';
import { addXmQuestion,editXmQuestionSomeFields } from '@/api/xm/core/xmQuestion';
import { mapGetters } from 'vuex';
import AttachmentUpload from "@/views/mdp/arc/archiveAttachment/AttachmentUpload"; //
import {sn} from '@/common/js/sequence';
@ -210,7 +210,7 @@
import xmMenuSelect from '../xmMenu/XmMenuSelect';
import XmQuestionHandleMng from '../xmQuestionHandle/XmQuestionHandleMng';//
import TagMng from "@/views/mdp/arc/tag/TagMng";
import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect';
import XmMyDoFocus from '@/views/myWork/my/components/DoFocus';
@ -238,15 +238,15 @@
}else{
return 0;
}
},
xmProductCpd(){
xmProductCpd(){
if(this.xmQuestion && this.xmQuestion.id && this.xmQuestion.productId){
return {id:this.xmQuestion.productId,productName:this.xmQuestion.productName}
}
if(this.xmProduct&& this.xmProduct.id){
return this.xmProduct
}
}
if(this.xmTestPlan && this.xmTestPlan.id){
return {id:this.xmTestPlan.productId,productName:this.xmTestPlan.productName}
}
@ -259,7 +259,7 @@
if(this.xmMenu && this.xmMenu.menuId){
return {id:this.xmMenu.productId,productName:this.xmMenu.productName}
}
if(this.xmIteration && this.xmIteration.id){
return {id:this.xmIteration.productId,productName:this.xmIteration.productName}
}
@ -273,7 +273,7 @@
},
'visible':function(visible) {
if(visible==true){
this.initData();
this.initData();
}
this.activateTabPaneName='12'
}
@ -290,7 +290,7 @@
bugReason:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
editFormRules: {
name: [
{required: true, message: '缺陷标题不可为空', trigger: 'change' },
{ min: 5, max: 250, message: '长度在 5 到 250 个字符', trigger: 'change' },//
@ -301,44 +301,44 @@
handlerUsername: [
{required: true, message: '请指派给一个人', trigger: 'change' }
],
description: [
description: [
{ min: 0, max: 1000, message: '缺陷描述长度在 0 到 1000 个字符', trigger: 'change' },//
],
opStep: [
opStep: [
{ min: 0, max: 1000, message: '测试步骤长度在 0 到 1000 个字符', trigger: 'change' },//
],
expectResult: [
expectResult: [
{ min: 0, max: 1000, message: '预期结果长度在 0 到 1000 个字符', trigger: 'change' },//
],
remarks: [
remarks: [
{ min: 0, max: 1000, message: '处理意见长度在 0 到 1000 个字符', trigger: 'change' },//
],
},
// xm_question
editForm: {
id:'',name:'',projectId:'',projectName:'',caseId:'',caseName:'',endTime:'',askUserid:'',askUsername:'',handlerUserid:'',handlerUsername:'',priority:'',solution:'',description:'',createUserid:'',createUsername:'',createTime:'',bugStatus:'',bizProcInstId:'',bizFlowState:'',menuId:'',menuName:'',budgetWorkload:'',budgetAt:'',actWorkload:'',actAt:'',expectResult:'',opStep:'',currResult:'',refRequire:'',bugSeverity:'',bugType:'',tagIds:'',tagNames:'',urls:'',ltime:'',qtype:'',caseExecId:'',remarks:'',productId:'',repRate:'',verNum:'',vpath:'',pverNum:'',bugReason:'',rate:'',initWorkload:'',taskOut:'',taskId:'',funcId:'',funcName:'',funcPnames:'',planId:'',casedbId:'',
attachment: [],
attachment: [],
productName:''
},
// xm_question
editFormInit: {
id:'',name:'',projectId:'',projectName:'',caseId:'',caseName:'',endTime:'',askUserid:'',askUsername:'',handlerUserid:'',handlerUsername:'',priority:'',solution:'',description:'',createUserid:'',createUsername:'',createTime:'',bugStatus:'',bizProcInstId:'',bizFlowState:'',menuId:'',menuName:'',budgetWorkload:'',budgetAt:'',actWorkload:'',actAt:'',expectResult:'',opStep:'',currResult:'',refRequire:'',bugSeverity:'',bugType:'',tagIds:'',tagNames:'',urls:'',ltime:'',qtype:'',caseExecId:'',remarks:'',productId:'',repRate:'',verNum:'',vpath:'',pverNum:'',bugReason:'',rate:'',initWorkload:'',taskOut:'',taskId:'',funcId:'',funcName:'',funcPnames:'',planId:'',casedbId:'',
attachment: [],
attachment: [],
productName:''
},
editFormBak: {
id:'',name:'',projectId:'',projectName:'',caseId:'',caseName:'',endTime:'',askUserid:'',askUsername:'',handlerUserid:'',handlerUsername:'',priority:'',solution:'',description:'',createUserid:'',createUsername:'',createTime:'',bugStatus:'',bizProcInstId:'',bizFlowState:'',menuId:'',menuName:'',budgetWorkload:'',budgetAt:'',actWorkload:'',actAt:'',expectResult:'',opStep:'',currResult:'',refRequire:'',bugSeverity:'',bugType:'',tagIds:'',tagNames:'',urls:'',ltime:'',qtype:'',caseExecId:'',remarks:'',productId:'',repRate:'',verNum:'',vpath:'',pverNum:'',bugReason:'',rate:'',initWorkload:'',taskOut:'',taskId:'',funcId:'',funcName:'',funcPnames:'',planId:'',casedbId:'',
attachment: [],
attachment: [],
productName:''
},
/**begin 在下面加自定义属性,记得补上面的一个逗号**/
fileVisible: true,
userFieldName:'',
xmQuestionHandles:[],
selectTaskVisible:false,
selectMenuVisible:false,
tagSelectVisible:false,
selectTaskVisible:false,
selectMenuVisible:false,
tagSelectVisible:false,
xmProductVersions:[{id:"1.0.0" ,name:'1.0.0'}],
activateTabPaneName:'12',
funcVisible:false,
@ -355,14 +355,14 @@
},
//XmQuestion xm_question @submit="afterAddSubmit"
saveSubmit: function (tardgetBugStatus) {
if(this.xmIteration && this.xmIteration.id){
if(!this.editForm.menuId){
this.$notify({position:'bottom-left',showClose:true,message: '迭代视图中,新增缺陷必须关联需求,您可以通过设置【测试用例】或者【用户故事】达到关联需求目的。', type: 'error' });
return ;
}
}
this.$refs.editForm.validate((valid) => {
this.$refs.editForm.validate((valid) => {
if (valid) {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
//
@ -373,7 +373,7 @@
this.load.edit=true
let params = Object.assign({}, this.editForm);
params.tardgetBugStatus=tardgetBugStatus;
if(params.description){
params.description=params.description.replace(/<p>\n<br>\n<\/p>/g,"");
params.description=params.description.replace(/<p><br><\/p>/g,"");
@ -382,7 +382,7 @@
this.load.edit=false
var tips=res.data.tips;
if(tips.isOk){
this.$emit('submit');// @submit="afterAddSubmit"
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);
@ -417,9 +417,9 @@
const d = date.getDate();
return date.getFullYear()+"-"+(m < 10 ? "0"+m : m)+"-"+ (d < 10 ? "0"+d : d) + " 00:00:00";
},
handleQuestion:function(tardgetBugStatus){
handleQuestion:function(tardgetBugStatus){
this.editSubmit(tardgetBugStatus);
},
},
handleCloseTaskTag:function(){
this.editForm.taskId=''
this.editForm.taskName=""
@ -430,11 +430,11 @@
this.editXmQuestionSomeFields(this.editForm,"handlerUserid",[{userid:this.editForm.createUserid,username:this.editForm.createUsername}])
},
sendToAsk(){
sendToAsk(){
this.editForm.handlerUsername=this.editForm.askUsername
this.editForm.handlerUserid=this.editForm.askUserid
this.editXmQuestionSomeFields(this.editForm,"handlerUserid",[{userid:this.editForm.askUserid,username:this.editForm.askUsername}])
},
},
/**end 在上面加自定义方法**/
showSelectMenu:function(){
@ -460,8 +460,8 @@
this.editForm.menuName=""
},
onTagSelected(tags) {
this.tagSelectVisible = false;
if(tags && tags.length>0){
this.tagSelectVisible = false;
if(tags && tags.length>0){
this.editForm.tagIds=tags.map(i=>i.tagId).join(",")
this.editForm.tagNames=tags.map(i=>i.tagName).join(",")
}else{
@ -469,39 +469,39 @@
this.editForm.tagNames=""
}
},
onPorjectConfirm:function(project){
onPorjectConfirm:function(project){
this.editForm.projectId=project.id
this.editForm.projectName=project.name
this.editForm.projectName=project.name
},
clearProject(){
clearProject(){
this.editForm.projectId=''
this.editForm.projectName=''
},
editXmQuestionSomeFields(row,fieldName,$event){
if(this.opType==='add'){
return;
}
var params={ids:[row.id]};
var params={ids:[row.id]};
if(fieldName==='handlerUserid'){
if($event){
if($event){
params[fieldName]=$event[0].userid;
params.handlerUsername=$event[0].username
params.handlerUsername=$event[0].username
}else{
return;
}
}else if(fieldName==='askUserid'){
if($event){
if($event){
params[fieldName]=$event[0].userid;
params.askUsername=$event[0].username
params.askUsername=$event[0].username
}else{
return;
}
}else if(fieldName==='tagIds'){
if($event){
if($event){
params[fieldName]=$event.map(i=>i.tagId).join(",");
params.tagNames=$event.map(i=>i.tagName).join(",");
params.tagNames=$event.map(i=>i.tagName).join(",");
}else{
return;
}
@ -511,7 +511,7 @@
params.projectId=$event.id
params.projectName=$event.name
}else if(fieldName==='productId'){
params.productId=$event.id
params.productId=$event.id
}else if(fieldName==='menuId'){
params.productId=$event.productId
params.menuId=$event.menuId
@ -523,16 +523,16 @@
}else if(fieldName==='funcId'){
params.productId=$event.productId
params.funcId=$event.id
params.funcName=$event.name
params.funcName=$event.name
}else if(fieldName==='caseId'){
params=Object.assign(params,$event)
}else{
params[fieldName]=$event
}
editXmQuestionSomeFields(params).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
if(tips.isOk){
this.editFormBak={...this.editForm}
this.$emit('edit-fields',this.editForm)
}else{
@ -547,7 +547,7 @@
this.$copyText(link).then(e => {
this.$notify({position:'bottom-left',showClose:true,message:"拷贝链接成功,您可以黏贴到任何地方",type:'success'})
});
},
},
onFuncSelected(row){
this.editForm.funcId=row.id
this.editForm.funcName=row.name
@ -560,11 +560,11 @@
if(this.$refs['xmProductSelect1'])this.$refs['xmProductSelect1'].selectedProduct(null)
this.editForm=Object.assign(this.editForm,this.editFormInit)
this.editForm=Object.assign(this.editForm, this.xmQuestion);
if(this.opType==='add'){
if(this.opType==='add'){
this.editForm.askUserid=this.userInfo.userid
this.editForm.askUsername=this.userInfo.username
this.editForm.handlerUserid=this.userInfo.userid
this.editForm.handlerUsername=this.userInfo.username
this.editForm.handlerUsername=this.userInfo.username
this.editForm.bugReason="0"
this.editForm.bugReason="0"
this.editForm.qtype="1"
@ -584,14 +584,14 @@
this.editForm.productName=this.xmTestCase.productName
this.editForm.caseId=this.xmTestCase.id
this.editForm.caseName=this.xmTestCase.caseName
this.editForm.casedbId=this.xmTestCase.casedbId
this.editForm.casedbId=this.xmTestCase.casedbId
this.editForm.funcId=this.xmTestCase.funcId
this.editForm.funcName=this.xmTestCase.funcName
this.editForm.funcName=this.xmTestCase.funcName
this.editForm.menuId=this.xmTestCase.menuId
this.editForm.menuName=this.xmTestCase.menuName
this.editForm.opStep=this.xmTestCase.testStep
this.editForm.menuName=this.xmTestCase.menuName
this.editForm.opStep=this.xmTestCase.testStep
this.editForm.name=this.xmTestCase.caseName
}
}
if(this.xmTestPlan && this.xmTestPlan.id){
this.editForm.casedbId=this.xmTestPlan.casedbId
this.editForm.casedbName=this.xmTestPlan.casedbName
@ -607,11 +607,11 @@
this.editForm.productName=this.xmTestPlanCase.productName
this.editForm.caseId=this.xmTestPlanCase.caseId
this.editForm.caseName=this.xmTestPlanCase.caseName
this.editForm.casedbId=this.xmTestPlanCase.casedbId
this.editForm.casedbId=this.xmTestPlanCase.casedbId
this.editForm.funcId=this.xmTestPlanCase.funcId
this.editForm.funcName=this.xmTestPlanCase.funcName
this.editForm.funcName=this.xmTestPlanCase.funcName
this.editForm.menuId=this.xmTestPlanCase.menuId
this.editForm.menuName=this.xmTestPlanCase.menuName
this.editForm.menuName=this.xmTestPlanCase.menuName
this.editForm.opStep=this.xmTestPlanCase.testStep
this.editForm.name=this.xmTestPlanCase.caseName
this.editForm.projectId=this.xmTestPlanCase.projectId
@ -623,9 +623,9 @@
this.editForm.productId=this.xmMenu.productId
this.editForm.productName=this.xmMenu.productName
}
if(this.xmMenu.funcId){
if(this.xmMenu.funcId){
this.editForm.funcId=this.xmMenu.funcId
this.editForm.funcName=this.xmMenu.funcName
this.editForm.funcName=this.xmMenu.funcName
}
}
}else{
@ -633,26 +633,26 @@
}
this.editFormBak={...this.editForm}
},
onTestPlanCaseSelected(xmTestPlanCase){
onTestPlanCaseSelected(xmTestPlanCase){
var params={};
params.planId=xmTestPlanCase.planId
params.productId=xmTestPlanCase.productId
params.productName=xmTestPlanCase.productName
params.caseId=xmTestPlanCase.caseId
params.caseName=xmTestPlanCase.caseName
params.casedbId=xmTestPlanCase.casedbId
params.casedbId=xmTestPlanCase.casedbId
params.funcId=xmTestPlanCase.funcId
params.funcName=xmTestPlanCase.funcName
params.funcName=xmTestPlanCase.funcName
params.menuId=xmTestPlanCase.menuId
params.menuName=xmTestPlanCase.menuName
params.menuName=xmTestPlanCase.menuName
if(!this.editForm.opStep){
params.opStep=xmTestPlanCase.testStep
}
if(!this.editForm.name){
params.name=xmTestPlanCase.caseName
}
params.projectId=xmTestPlanCase.projectId
params.projectId=xmTestPlanCase.projectId
Object.assign(this.editForm,params)
this.editXmQuestionSomeFields(this.editForm,"caseId",params)
this.caseVisible=false;
@ -664,10 +664,10 @@
this.editXmQuestionSomeFields(this.editForm,'productId',product);
}
},
onProductClearSelect(){
onProductClearSelect(){
this.editForm.productId=""
this.editForm.productName=""
}
}
},//end method
components: {
// 'xm-question-edit':XmQuestionEdit
@ -676,8 +676,8 @@
xmTestPlanCaseMng:()=>import('../xmTestPlanCase/XmTestPlanCaseSelect'),
'xm-workload-record':()=>import("../xmWorkload/XmWorkloadRecord"),
},
mounted() {
this.initData();
mounted() {
this.initData();
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.editRef.$el)-200;
initSimpleDicts('all',['bugSeverity','bugSolution','bugStatus','bugType','priority','bugRepRate','bugReason']).then(res=>{

242
src/views/xm/core/xmQuestion/XmQuestionMng.vue

@ -4,30 +4,30 @@
<xm-product-select v-if="!xmProduct&&!xmIteration" style="display:inline;" :auto-select="false" :link-project-id="selProject?selProject.id:null" @row-click="onProductSelected" @clear="clearProduct"></xm-product-select>
<xm-project-select v-if="!selProject" style="display:inline;" ref="xmProjectSelect" :auto-select="false" :link-product-id="xmProduct?xmProduct.id:null" @row-click="onProjectConfirm" @clear="clearProject"></xm-project-select>
<mdp-select v-model="filters.bugStatus" placeholder="状态" style="width:120px;" clearable :dict="dicts['bugStatus']"/>
<mdp-select class="hidden-md-and-down" v-model="filters.priority" placeholder="优先级" style="width:120px;" clearable :dict="dicts['priority']"/>
<mdp-select class="hidden-md-and-down" v-model="filters.bugSeverity" placeholder="严重程度" style="width:120px;" clearable :dict="dicts['bugSeverity']"/>
<mdp-select v-model="filters.bugStatus" placeholder="状态" style="width:120px;" clearable item-code="bugStatus"/>
<mdp-select class="hidden-md-and-down" v-model="filters.priority" placeholder="优先级" style="width:120px;" clearable item-code="priority"/>
<mdp-select class="hidden-md-and-down" v-model="filters.bugSeverity" placeholder="严重程度" style="width:120px;" clearable item-code="bugSeverity"/>
<el-button v-if="!filters.tags||filters.tags.length==0" @click.native="$refs.tagDialog.open()">标签</el-button>
<el-tag v-else @click="$refs.tagDialog.open()" closable @close="clearFiltersTag(filters.tags[0])">{{filters.tags[0].tagName.substr(0,5)}}({{filters.tags.length}})</el-tag>
<el-input style="width:200px;" v-model="filters.key" placeholder="缺陷名称" clearable>
<el-input style="width:200px;" v-model="filters.key" placeholder="缺陷名称" clearable>
</el-input>
<el-button @click="searchXmQuestions" type="primary" icon="el-icon-search"></el-button>
<el-button @click="searchXmQuestions" type="primary" icon="el-icon-search"></el-button>
<el-popover
placement="top-start"
title="更多条件、操作"
width="800"
v-model="moreVisible"
trigger="manual" >
trigger="manual" >
<el-button @click="moreVisible=false" type="text" style="float:right;margin-top:-40px;" icon="el-icon-close">关闭</el-button>
<el-descriptions class="margin-top" :column="2" border>
<template slot="extra">
<template slot="extra">
<el-button @click="handleExport" icon="el-icon-download">导出</el-button>
</template>
<el-descriptions-item>
@ -35,14 +35,14 @@
<i class="el-icon-user"></i>
创建者
</template>
<mdp-select-user-xm label="选择创建者" v-model="filters.createUser" :clearable="true"></mdp-select-user-xm>
<mdp-select-user-xm label="选择创建者" v-model="filters.createUser" :clearable="true"></mdp-select-user-xm>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-user"></i>
指派给
</template>
<mdp-select-user-xm label="选择负责人" v-model="filters.handlerUser" :clearable="true"></mdp-select-user-xm>
<mdp-select-user-xm label="选择负责人" v-model="filters.handlerUser" :clearable="true"></mdp-select-user-xm>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
@ -58,15 +58,15 @@
<template slot="label">
<i class="el-icon-question"></i>
缺陷编号
</template>
</template>
<el-input v-model="filters.id" clearable></el-input>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-top"></i>
优先级
</template>
<mdp-select v-model="filters.priority" placeholder="请选择优先级" clearable :dict="dicts['priority']"/>
</template>
<mdp-select v-model="filters.priority" placeholder="请选择优先级" clearable item-code="priority"/>
</el-descriptions-item>
<el-descriptions-item>
@ -74,7 +74,7 @@
<i class="el-icon-document-checked"></i>
解决方案
</template>
<mdp-select v-model="filters.solution" placeholder="请选择解决方案" clearable :dict="dicts['bugSolution']"/>
<mdp-select v-model="filters.solution" placeholder="请选择解决方案" clearable item-code="bugSolution"/>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
@ -121,103 +121,103 @@
</el-descriptions>
<el-button slot="reference" icon="el-icon-more" @click="moreVisible=!moreVisible"></el-button>
</el-popover>
<span style="float:right;">
<el-button v-if="filters.selProject && filters.selProject.id" type="primary" icon="el-icon-plus" @click="showAdd" round> </el-button>
</el-popover>
<span style="float:right;">
<el-button v-if="filters.selProject && filters.selProject.id" type="primary" icon="el-icon-plus" @click="showAdd" round> </el-button>
<xm-project-select v-else style="display:inline;" :auto-select="false" :link-product-id="xmProduct?xmProduct.id:null" @row-click="showAddAfterProjectSelect" >
<el-button slot="reference" type="primary" icon="el-icon-plus" round> </el-button>
<el-button slot="reference" type="primary" icon="el-icon-plus" round> </el-button>
</xm-project-select>
<el-button @click="batchDel" type="danger" icon="el-icon-delete"></el-button>
</span>
</el-row>
</el-row>
<el-row class="padding-top">
<!--列表 XmQuestion xm_question-->
<el-table element-loading-text="努力加载中" element-loading-spinner="el-icon-loading" ref="table" :height="maxTableHeight" :data="xmQuestions" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column label="全选" type="selection" min-width="50" fixed="left"></el-table-column>
<el-table-column prop="id" label="缺陷编号" width="120" show-overflow-tooltip fixed="left">
<template slot-scope="scope">
{{scope.row.id}}
<template slot-scope="scope">
{{scope.row.id}}
</template>
</el-table-column>
<el-table-column prop="name" label="缺陷名称" min-width="400" fixed="left">
<template slot-scope="scope">
<el-link @click="showEdit(scope.row)"> {{scope.row.name}}</el-link>
<template slot-scope="scope">
<el-link @click="showEdit(scope.row)"> {{scope.row.name}}</el-link>
<span class="tool-bar">
<el-button @click="copyOne(scope.row,scope.$index)" icon="el-icon-document-copy" circle title="复制一行"></el-button>
<el-button @click="copyOne(scope.row,scope.$index)" icon="el-icon-document-copy" circle title="复制一行"></el-button>
</span>
</template>
</el-table-column>
<el-table-column prop="bugStatus" label="状态" width="100">
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" v-model="scope.row.bugStatus" placeholder="类型" :dict="dicts['bugStatus']" style="display:block;" @change="editXmQuestionSomeFields(scope.row,'bugStatus',$event)">
</mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" v-model="scope.row.bugStatus" placeholder="类型" item-code="bugStatus" style="display:block;" @change="editXmQuestionSomeFields(scope.row,'bugStatus',$event)">
</mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="priority" label="优先级" width="100">
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" v-model="scope.row.priority" placeholder="优先级" :dict="dicts['priority']" style="display:block;" @change="editXmQuestionSomeFields(scope.row,'priority',$event)">
</mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" v-model="scope.row.priority" placeholder="优先级" item-code="priority" style="display:block;" @change="editXmQuestionSomeFields(scope.row,'priority',$event)">
</mdp-select-tag>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="solution" label="解决方案" width="100">
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" v-model="scope.row.solution" placeholder="类型" :dict="dicts['bugSolution']" style="display:block;" @change="editXmQuestionSomeFields(scope.row,'solution',$event)">
</mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" v-model="scope.row.solution" placeholder="类型" item-code="bugSolution" style="display:block;" @change="editXmQuestionSomeFields(scope.row,'solution',$event)">
</mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="bugSeverity" label="严重程度" width="100">
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" v-model="scope.row.bugSeverity" placeholder="类型" :dict="dicts['bugSeverity']" style="display:block;" @change="editXmQuestionSomeFields(scope.row,'bugSeverity',$event)">
</mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" v-model="scope.row.bugSeverity" placeholder="类型" item-code="bugSeverity" style="display:block;" @change="editXmQuestionSomeFields(scope.row,'bugSeverity',$event)">
</mdp-select-tag>
</template>
</el-table-column>
<!--
<el-table-column prop="projectId" label="项目" width="100" show-overflow-tooltip>
<template slot-scope="scope">
<el-table-column prop="projectId" label="项目" width="100" show-overflow-tooltip>
<template slot-scope="scope">
<div class="cell-text">
{{scope.row.projectId}}
</div>
<span class="cell-bar">
<span class="cell-bar">
<xm-project-select style="display:inline;" :auto-select="false" :link-product-id="xmProduct?xmProduct.id:null" @row-click="editXmQuestionSomeFields(scope.row,'projectId',$event)" ></xm-project-select>
</span>
</span>
</template>
</el-table-column>
<el-table-column prop="productId" label="产品" width="100" show-overflow-tooltip>
<template slot-scope="scope">
<el-table-column prop="productId" label="产品" width="100" show-overflow-tooltip>
<template slot-scope="scope">
<div class="cell-text">
{{scope.row.productId}}
</div>
<span class="cell-bar">
<span class="cell-bar">
<xm-product-select style="display:inline;" :auto-select="false" :link-project-id="selProject?selProject.id:null" @row-click="editXmQuestionSomeFields(scope.row,'productId',$event)" ></xm-product-select>
</span>
</span>
</template>
</el-table-column>
<el-table-column prop="askUsername" label="创建人" width="100" show-overflow-tooltip>
<el-table-column prop="askUsername" label="创建人" width="100" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" sortable width="100" show-overflow-tooltip>
<el-table-column prop="createTime" label="创建时间" sortable width="100" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="ltime" label="更新时间" sortable width="100" show-overflow-tooltip>
<el-table-column prop="ltime" label="更新时间" sortable width="100" show-overflow-tooltip>
</el-table-column>
-->
<el-table-column prop="handlerUsername" label="负责人" width="100" show-overflow-tooltip>
<template slot-scope="scope">
<el-table-column prop="handlerUsername" label="负责人" width="100" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-user-xm @visible-change="selectVisible(scope.row,$event)" :key="scope.row.id" v-model="scope.row" userid-key="handlerUserid" username-key="handlerUsername" :project-id="scope.row.projectId" @change="editXmQuestionSomeFields(scope.row,'handlerUserid',$event)"></mdp-select-user-xm>
</template>
</el-table-column>
<el-table-column prop="tagNames" label="标签" width="100" show-overflow-tooltip>
<template slot-scope="scope">
<el-table-column prop="tagNames" label="标签" width="100" show-overflow-tooltip>
<template slot-scope="scope">
<div class="cell-text">
{{ scope.row.tagNames}}
</div>
<span class="cell-bar">
<span class="cell-bar">
<el-button @click="$refs.tagDialog.open({data:scope.row,action:'editTagIds'})">标签</el-button>
</span>
</span>
</template>
</el-table-column>
<el-table-column prop="menuName" label="需求" width="100" show-overflow-tooltip></el-table-column>
<el-table-column prop="menuName" label="需求" width="100" show-overflow-tooltip></el-table-column>
</el-table>
</el-row>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
@ -231,11 +231,11 @@
<el-dialog title="新增缺陷" :visible.sync="addFormVisible" fullscreen width="90%" top="10px" append-to-body :close-on-click-modal="false">
<xm-question-add :xm-menu="xmMenu" op-type="add" :xm-test-plan-case="xmTestPlanCase" :xm-test-plan="xmTestPlan" :xm-product="filters.product" :xm-iteration="xmIteration" :xm-test-case="xmTestCase" :qtype="qtype" :sel-project=" filters.selProject " :xm-question="addForm" :visible="addFormVisible" @cancel="addFormVisible=false" @submit="afterAddSubmit"></xm-question-add>
</el-dialog>
<xm-group-dialog ref="xmGroupDialog" :sel-project=" filters.selProject " :is-select-single-user="1" @user-confirm="onUserConfirm"></xm-group-dialog>
<xm-group-dialog ref="xmGroupDialog" :sel-project=" filters.selProject " :is-select-single-user="1" @user-confirm="onUserConfirm"></xm-group-dialog>
<el-drawer append-to-body title="需求选择" :visible.sync="menuVisible" size="60%" :close-on-click-modal="false">
<xm-menu-select :visible="menuVisible" :is-select-menu="true" :multi="true" :xm-product="filters.product" @menus-selected="onSelectedMenus" ></xm-menu-select>
</el-drawer>
</el-drawer>
<tag-dialog ref="tagDialog" :tagIds="filters.tags?filters.tags.map(i=>i.tagId):[]" :jump="true" @select-confirm="onTagSelected"></tag-dialog>
</section>
</template>
@ -258,7 +258,7 @@
import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//
import TagDialog from '@/views/mdp/arc/tag/TagDialog.vue';
export default {
computed: {
...mapGetters([
@ -270,13 +270,13 @@
selProject:function(selProject){
this.filters.selProject=this.selProject
this.getXmQuestions();
},
},
qtype:function(){
this.getXmQuestions()
},
xmIteration:function(){
this.getXmQuestions()
},
},
xmProduct:function(){
this.filters.product=this.xmProduct
this.getXmQuestions()
@ -293,7 +293,7 @@
bugStatus:'',
priority:'',
solution:'',
bugSeverity:'',
bugSeverity:'',
handlerUser:{},
selProject:null,
menus:[],
@ -328,7 +328,7 @@
//xmQuestion
addForm: {
id:'',name:'',projectId:'',projectName:'',caseId:'',caseName:'',endTime:'',askUserid:'',askUsername:'',handlerUserid:'',handlerUsername:'',priority:'',solution:'',description:'',createUserid:'',createUsername:'',createTime:'',bugStatus:'',bizProcInstId:'',bizFlowState:'',menuId:'',menuName:'',budgetWorkload:'',budgetAt:'',actWorkload:'',actAt:'',expectResult:'',opStep:'',currResult:'',refRequire:'',bugSeverity:'',bugType:'',tagIds:'',tagNames:'',urls:'',ltime:'',qtype:'',caseExecId:'',remarks:'',productId:'',repRate:'',verNum:'',vpath:'',pverNum:'',bugReason:'',rate:'',initWorkload:'',taskOut:'',taskId:'',funcId:'',funcName:'',funcPnames:'',planId:'',casedbId:'',
attachment: [],
attachment: [],
productName:''
},
editFormBak:{},
@ -336,7 +336,7 @@
//xmQuestion
editForm: {
id:'',name:'',projectId:'',projectName:'',caseId:'',caseName:'',endTime:'',askUserid:'',askUsername:'',handlerUserid:'',handlerUsername:'',priority:'',solution:'',description:'',createUserid:'',createUsername:'',createTime:'',bugStatus:'',bizProcInstId:'',bizFlowState:'',menuId:'',menuName:'',budgetWorkload:'',budgetAt:'',actWorkload:'',actAt:'',expectResult:'',opStep:'',currResult:'',refRequire:'',bugSeverity:'',bugType:'',tagIds:'',tagNames:'',urls:'',ltime:'',qtype:'',caseExecId:'',remarks:'',productId:'',repRate:'',verNum:'',vpath:'',pverNum:'',bugReason:'',rate:'',initWorkload:'',taskOut:'',taskId:'',funcId:'',funcName:'',funcPnames:'',planId:'',casedbId:'',
attachment: [],
attachment: [],
productName:''
},
/**begin 自定义属性请在下面加 请加备注**/
@ -424,7 +424,7 @@
},
// XmQuestion xm_question
getXmQuestions() {
let params = {
pageSize: this.pageInfo.pageSize,
pageNum: this.pageInfo.pageNum,
@ -440,7 +440,7 @@
}
if(this.dateRanger&&this.dateRanger.length==2){
if(this.dateRanger&&this.dateRanger.length==2){
params.createTimeStart=this.dateRanger[0]
params.createTimeEnd=this.dateRanger[1]
}
@ -503,12 +503,12 @@
params.projectId = this.filters.selProject.id;
}
if(this.xmTestPlanCase){
params.planId=this.xmTestPlanCase.planId
params.planId=this.xmTestPlanCase.planId
params.caseId=this.xmTestPlanCase.caseId
}
if(this.xmTestPlan){
params.planId=this.xmTestPlan.id
params.planId=this.xmTestPlan.id
params.projectId=this.xmTestPlan.projectId
}
if(this.xmTestCase){
@ -567,8 +567,8 @@
this.menuVisible=false
return;
}
this.menuVisible=false
this.filters.menus=JSON.parse(JSON.stringify(menus));
this.menuVisible=false
this.filters.menus=JSON.parse(JSON.stringify(menus));
},
clearFiltersMenu(){
this.filters.menus=[]
@ -582,16 +582,16 @@
this.editForm = Object.assign({}, row);
},
// XmQuestion xm_question
showAdd: function () {
if(!this.filters.selProject){
showAdd: function () {
if(!this.filters.selProject){
this.$notify({position:'bottom-left',showClose:true,message: "请先选中项目", type: 'warning' });
this.$refs.xmProjectSelect.projectVisible=true;
this.nextAction="showAdd"
this.nextAction="showAdd"
return;
}
this.addFormVisible = true;
},
showAddAfterProjectSelect(project){
showAddAfterProjectSelect(project){
this.filters.selProject=project;
this.addFormVisible = true;
this.searchXmQuestions();
@ -723,7 +723,7 @@
},
formatterPriorityDicts(cellValue){
var key="priority";
var key="priority";
if(this.dicts[key]==undefined || this.dicts[key]==null || this.dicts[key].length==0 ){
return {id:cellValue,name:cellValue,className:'primary'};
}
@ -750,7 +750,7 @@
},
formatterBugStatusDicts: function(cellValue){
var key="bugStatus";
var key="bugStatus";
if(this.dicts[key]==undefined || this.dicts[key]==null || this.dicts[key].length==0 ){
return {id:cellValue,name:cellValue,className:'primary'};
}
@ -779,11 +779,11 @@
return {id:cellValue,name:cellValue,className:'primary'}
}
},
},
showGroupUsers:function(userType,row){
this.$refs.xmGroupDialog.open({data:row,action:userType})
},
handleExport() {
this.downloadLoading = true
let header = [];
@ -857,10 +857,10 @@
}else if(option.action=='editHandlerUserid'){
this.editXmQuestionSomeFields(option.data,"handlerUserid",groupUsers)
return;
}
this.selectUserVisible=false
}
this.selectUserVisible=false
},
},
onProjectConfirm:function(project){
this.filters.selProject=project
this.selectProjectVisible=false;
@ -945,12 +945,12 @@
this.filters.selProject=null
this.nextAction=""
this.searchXmQuestions()
},
},
handleCommand(command) {
if(command.type=='sendToProcessApprova'){
this.sendToProcessApprova(command.data,command.bizKey);
}
},
},
getBadge(row){
var msg="";
if(row.bugStatus=='closed'){
@ -959,14 +959,14 @@
if(row.handlerUsername){
if(row.remarks){
var remarks=row.remarks;
remarks=remarks.replace(/<\w?>/g,"");
remarks=remarks.replace(/<\w?>/g,"");
remarks=remarks.replace(/<\/\w?>/g,"");
if(remarks.length<=10){
msg='已指派给'+row.handlerUsername+','+remarks
}else{
msg='已指派给'+row.handlerUsername+','+remarks.substr(0,10)+"..."
}
}else{
msg='已指派给'+row.handlerUsername;
}
@ -975,21 +975,21 @@
}
return msg;
},
onTagSelected(tags,option) {
onTagSelected(tags,option) {
if(option.action=="editTagIds"){
this.editXmQuestionSomeFields(option.data,"tagIds",tags);
}else{
if (!tags || tags.length == 0) {
if (!tags || tags.length == 0) {
this.filters.tags=[]
}else{
this.filters.tags=JSON.parse(JSON.stringify(tags))
}
}
}
},
},
editXmQuestionSomeFields(row,fieldName,$event){
var params={ids:[row.id]};
if(this.sels.length>0){
if(!this.sels.some(k=>k.id==row.id)){
@ -999,16 +999,16 @@
params.ids=this.sels.map(i=>i.id)
}
if(fieldName==='handlerUserid'){
if($event){
if($event){
params[fieldName]=$event[0].userid;
params.handlerUsername=$event[0].username
params.handlerUsername=$event[0].username
}else{
return;
}
}else if(fieldName==='tagIds'){
if($event){
if($event){
params[fieldName]=$event.map(i=>i.tagId).join(",");
params.tagNames=$event.map(i=>i.tagName).join(",");
params.tagNames=$event.map(i=>i.tagName).join(",");
}else{
return;
}
@ -1021,17 +1021,17 @@
}else{
params[fieldName]=$event
}
editXmQuestionSomeFields(params).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
if(tips.isOk){
if(this.sels.length>0){
this.getXmQuestions();
}else{
Object.assign(row,params)
}else{
Object.assign(row,params)
}
}else{
Object.assign(row,this.editFormBak)
Object.assign(row,this.editFormBak)
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
}
})
@ -1039,7 +1039,7 @@
/**
* 'bugSeverity','bugSolution','bugStatus','bugType','priority'bugRepRate
*/
formaterByDicts(row,property,cellValue){
formaterByDicts(row,property,cellValue){
var property=property
var dict=null;
if(property=='bugSeverity'){
@ -1054,7 +1054,7 @@
dict=this.dicts['bugType']
}else if(property=='repRate'){
dict=this.dicts['bugRepRate']
}
}
if(!dict){
return cellValue;
}else{
@ -1063,20 +1063,20 @@
}
},
onEditFields(row){
Object.assign(this.editForm,row)
Object.assign(this.editForm,row)
},
copyOne(row,index){
var params={...row}
params.id=null;
params.createUserid=this.userInfo.userid
params.createUsername=this.userInfo.username
params.createUsername=this.userInfo.username
params.bugStatus="1"
params.name=row.name+'V'
addXmQuestion(params).then(res=>{
var tips = res.data.tips
if(tips.isOk){
if(tips.isOk){
var row2=res.data.data
this.xmQuestions.splice(index+1,0,row2)
this.pageInfo.total=this.pageInfo.total+1
@ -1104,15 +1104,15 @@
this.filters.handlerUserid=this.userInfo.userid;
this.filters.handlerUsername=this.userInfo.username;
}
this.$nextTick(() => {
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el);
this.getXmQuestions();
});
initSimpleDicts('all',['bugSeverity','bugSolution','bugStatus','bugType','priority','bugRepRate']).then(res=>{
if(res.data.tips.isOk){
if(res.data.tips.isOk){
this.dicts=res.data.data;
}
});
@ -1122,7 +1122,7 @@
</script>
<style lang="scss" scoped>
.align-right{
float: right;

322
src/views/xm/core/xmTask/XmTaskAdd.vue

@ -1,63 +1,63 @@
<template>
<section>
<section>
<el-row>
<!--新增界面 XmTask xm_task-->
<el-form :model="addForm" label-width="125px" label-position="left" :rules="addFormRules" ref="addForm">
<el-form-item prop="name">
<template slot="label">
<el-form :model="addForm" label-width="125px" label-position="left" :rules="addFormRules" ref="addForm">
<el-form-item prop="name">
<template slot="label">
<div class="big-icon" :style="{backgroundColor: addForm.ntype==='0'?'#409EFF':'#E6A23C'}">
<i :class=" addForm.ntype==='0'?'el-icon-s-operation':'el-icon-time' " ></i>
</div>
</div>
{{addForm.ntype==='0'?'任务名称':'计划名称'}}
</template>
<el-input v-model="addForm.name" placeholder="名称" ></el-input>
<span class="label-font-color" v-if="xmProjectCpd && xmProjectCpd.id">
<el-input v-model="addForm.name" placeholder="名称" ></el-input>
<span class="label-font-color" v-if="xmProjectCpd && xmProjectCpd.id">
<span>归属项目{{addForm.projectName?addForm.projectName:''}}{{addForm.projectId?'('+addForm.projectId+')':''}} &nbsp;&nbsp;</span>
<span v-if="addForm.productId">归属产品{{addForm.productId?addForm.productId:''}} </span>
</span>
<span class="label-font-color" v-if="!xmProjectCpd || !xmProjectCpd.id">
<span class="label-font-color" v-if="!xmProjectCpd || !xmProjectCpd.id">
<span>归属项目</span><xm-project-select style="display:inline;" :auto-select="false" :link-iteration-id="xmIteration?xmIteration.id:null" :link-product-id="xmProduct?xmProduct.id:null" @row-click="onProjectRowClick" @clear="onProjectClear" ></xm-project-select>
<span v-if="addForm.productId">归属产品{{addForm.productId?addForm.productId:''}} </span>
<span v-if="addForm.productId">归属产品{{addForm.productId?addForm.productId:''}} </span>
</span>
</el-form-item>
<el-row class="padding-left padding-right">
<el-col :span="8">
</el-form-item>
<el-row class="padding-left padding-right">
<el-col :span="8">
<mdp-field-x v-model="addForm.parentTaskname" label="上级计划" icon="el-icon-time" color="#E6A23C">
<el-button slot="oper"
@click="toSelectParent"
@click="toSelectParent"
title="更换任务的上级,实现任务搬家功能"
icon="el-icon-upload2"
> 选择新的上级</el-button>
</mdp-field-x>
</el-col>
<el-col :span="8">
<mdp-select show-style="x" :label="addForm.ntype=='0'?'任务状态':'计划状态'" :dict="dicts['taskState']" v-model="addForm.taskState" @change="editXmTaskSomeFields(addForm,'taskState',$event)"></mdp-select>
</el-col>
<el-col :span="8">
<mdp-select show-style="x" label="优先级别" :dict="dicts['priority']" v-model="addForm.level" @change="editXmTaskSomeFields(addForm,'level',$event)"></mdp-select>
</el-col>
icon="el-icon-upload2"
> 选择新的上级</el-button>
</mdp-field-x>
</el-col>
<el-col :span="8">
<mdp-select show-style="x" :label="addForm.ntype=='0'?'任务状态':'计划状态'" item-code="taskState" v-model="addForm.taskState" @change="editXmTaskSomeFields(addForm,'taskState',$event)"></mdp-select>
</el-col>
<el-col :span="8">
<mdp-select show-style="x" label="优先级别" item-code="priority" v-model="addForm.level" @change="editXmTaskSomeFields(addForm,'level',$event)"></mdp-select>
</el-col>
</el-row>
<el-row class="padding">
<el-col :span="8">
<mdp-select-user-xm label="负责人" v-model="addForm" userid-key="createUserid" username-key="createUsername" :project-id="addForm.projectId?addForm.projectId:(xmProjectCpd?xmProjectCpd.id:null)" @change="editXmTaskSomeFields(addForm,'createUserid',$event)"></mdp-select-user-xm>
</el-col>
<el-col :span="8">
<el-col :span="8">
<mdp-select-user-xm label="负责人" v-model="addForm" userid-key="createUserid" username-key="createUsername" :project-id="addForm.projectId?addForm.projectId:(xmProjectCpd?xmProjectCpd.id:null)" @change="editXmTaskSomeFields(addForm,'createUserid',$event)"></mdp-select-user-xm>
</el-col>
<el-col :span="8">
<mdp-date-range-x
:style-obj="{maxWidth:'100%'}"
v-model="addForm"
start-key="startTime"
end-key="endTime"
@change="onBudgetDateRangerChange"
@change="onBudgetDateRangerChange"
type="daterange"
:auto-default="false"
:auto-default="false"
unlink-panels
range-separator="-"
start-placeholder="开始日期"
@ -65,110 +65,110 @@
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00','23:59:59']"
:picker-options="pickerOptions"
></mdp-date-range-x>
</el-col>
></mdp-date-range-x>
</el-col>
</el-row>
<el-tabs v-model="activateTabPaneName">
<el-tab-pane label="概述" name="2">
<el-form-item prop="description" label-width="0px">
<el-input type="textarea" :autosize="{ minRows:12, maxRows: 20}" v-model="addForm.description" placeholder="什么人?做什么事?,为什么?如: 作为招聘专员,我需要统计员工半年在职/离职人数,以便我能够制定招聘计划" ></el-input>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="基础信息" name="1">
<el-row>
<el-tab-pane label="概述" name="2">
<el-form-item prop="description" label-width="0px">
<el-input type="textarea" :autosize="{ minRows:12, maxRows: 20}" v-model="addForm.description" placeholder="什么人?做什么事?,为什么?如: 作为招聘专员,我需要统计员工半年在职/离职人数,以便我能够制定招聘计划" ></el-input>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="基础信息" name="1">
<el-row>
<el-col :span="10">
<el-form-item label="" prop="milestone">
<el-form-item label="" prop="milestone">
<el-checkbox v-model="addForm.milestone" :true-label="1" :false-label="0">里程碑</el-checkbox>
<el-checkbox v-model="addForm.taskOut" @change="onTaskOutChange" true-label="1" false-label="0">众包</el-checkbox>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item prop="skill" label="" v-if="addForm.ntype!='1'" label-width="0">
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item prop="skill" label="" v-if="addForm.ntype!='1'" label-width="0">
<el-tag class="fs-ft" style="margin-right:10px" v-for="(item,i) in taskSkills" :key="i">{{item.taskSkillName}}</el-tag>
<el-button type="text" @click.stop="showSkill()" icon="el-icon-plus">技能要求</el-button>
</el-form-item>
</el-col>
</el-row>
<el-row>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="排序序号" prop="sortLevel" >
<el-input v-model="addForm.sortLevel" style="max-width:90%;" placeholder="如1.0或者1.2.3等" title="序号,如1.0、1.1.1或者1,2,3等" ></el-input>
</el-form-item>
<el-form-item label="排序序号" prop="sortLevel" >
<el-input v-model="addForm.sortLevel" style="max-width:90%;" placeholder="如1.0或者1.2.3等" title="序号,如1.0、1.1.1或者1,2,3等" ></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工期类型">
<el-col :span="12">
<el-form-item label="工期类型">
<el-select v-model=" addForm.planType">
<el-option v-for="i in this.dicts.planType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item :label="addForm.ntype=='0'?'任务前置':'计划前置'">
<el-col :span="12">
<el-form-item :label="addForm.ntype=='0'?'任务前置':'计划前置'">
<el-tag v-if="addForm.preTaskid" @close="clearPreTask" closable >{{addForm.preTaskname}}</el-tag>
<el-button type="text" @click.stop="selectTaskVisible=true" >选前置</el-button>
</el-form-item>
</el-col>
<el-button type="text" @click.stop="selectTaskVisible=true" >选前置</el-button>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="addForm.ntype=='0'?'任务类型':'计划类型'" prop="taskType">
<el-form-item :label="addForm.ntype=='0'?'任务类型':'计划类型'" prop="taskType">
<el-select v-model="addForm.taskType">
<el-option v-for="i in this.dicts.taskType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-row>
</el-tab-pane>
<el-tab-pane label="工时" name="5">
<el-form-item label="报工方式" prop="wtype" >
<el-tab-pane label="工时" name="5">
<el-form-item label="报工方式" prop="wtype" >
<el-select v-model="addForm.wtype">
<el-option label="无须报工" value="0"></el-option>
<el-option label="强制每日报工" value="1"></el-option>
<el-option label="工期内报工" value="2"></el-option>
</el-select>
</el-form-item>
</el-select>
</el-form-item>
<el-form-item label="原始预估工时" prop="initWorkload">
<el-input type="number" style="width:250px;" v-model="addForm.initWorkload" @change="onBudgetWorkloadChange" :precision="2" :step="8" :min="0" placeholder="原始预估总工时(人时)"></el-input> <el-tag>h</el-tag>
<br><font color="blue">原始预估工时一旦填写后续一般不做修改</font>
<br><font color="blue">计划执行过程中用于识别出当前进度与原始预估值之间的偏离幅度偏离过大需要进一步分析原因</font>
</el-form-item>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="成本" name="6666">
<el-tab-pane label="成本" name="6666">
<el-form-item label="自研工时单价" prop="uniInnerPrice">
<el-input type="number" style="width:150px;" v-model="addForm.uniInnerPrice" :precision="2" :step="10" :min="0" placeholder="自研工时单价" ></el-input > /h
</el-form-item>
<el-form-item label="外包、众包单价" prop="uniOutPrice">
</el-form-item>
<el-form-item label="外包、众包单价" prop="uniOutPrice">
<el-input type="number" style="width:150px;" v-model="addForm.uniOutPrice" :precision="2" :step="10" :min="0" placeholder="外发工时单价" ></el-input > /h
</el-form-item>
</el-form-item>
<el-form-item label="预算金额" prop="budgetAt">
<el-input type="number" style="width:150px;" v-model="addForm.budgetAt" :precision="2" :step="100" :min="0" placeholder="预算金额" ></el-input >
<el-input type="number" style="width:150px;" v-model="addForm.budgetAt" :precision="2" :step="100" :min="0" placeholder="预算金额" ></el-input >
<br><font color="blue">预算金额至上而下逐级分解下级预算总和不能超出上级预算金额实际金额不能超出预算金额</font>
</el-form-item>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="需求" name="3" v-if="addForm.ntype!='1'">
</el-tab-pane>
<el-tab-pane label="需求" name="3" v-if="addForm.ntype!='1'">
<el-row>
<el-col :span="12">
<el-form-item label="归属产品" prop="productId">
<el-col :span="12">
<el-form-item label="归属产品" prop="productId">
{{addForm.productId}}
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="用户故事" prop="menuId" id="menuInfo" v-if="addForm.ntype!='1'">
<el-col :span="12">
<el-form-item label="用户故事" prop="menuId" id="menuInfo" v-if="addForm.ntype!='1'">
{{addForm.menuName}} &nbsp;&nbsp;&nbsp; <el-link @click="menuVisible=true" type="primary">{{addForm.menuName?'更改':'设置'}}</el-link>&nbsp;&nbsp;&nbsp;
<el-link v-if="addForm.menuName" @click="toMenu" type="primary">查看需求</el-link>
</el-form-item>
</el-col>
</el-form-item>
</el-col>
</el-row>
</el-tab-pane>
</el-tab-pane>
<el-tab-pane label="结算信息" name="7" v-if="addForm.ntype!='1'">
<el-form-item label="" prop="taskClass">
<el-checkbox v-model="addForm.taskClass" true-label="1" false-label="0">是否需要结算</el-checkbox>
@ -180,21 +180,21 @@
</el-form-item>
</el-tab-pane>
<el-tab-pane label="外包、众包、互联网" name="8" v-if="addForm.ntype!='1' ">
<el-form-item>
<el-checkbox v-model="addForm.taskOut" true-label="1" false-label="0" id="taskOut" >外包</el-checkbox>
<el-checkbox v-model="addForm.crowd" true-label="1" false-label="0" id="crowd" v-if="addForm.taskOut==='1'">开通众包</el-checkbox>
<el-checkbox v-model="addForm.toTaskCenter" true-label="1" false-label="0" id="toTaskCenter" v-if="addForm.taskOut==='1'">发布到互联网任务大厅</el-checkbox>
<el-form-item>
<el-checkbox v-model="addForm.taskOut" true-label="1" false-label="0" id="taskOut" >外包</el-checkbox>
<el-checkbox v-model="addForm.crowd" true-label="1" false-label="0" id="crowd" v-if="addForm.taskOut==='1'">开通众包</el-checkbox>
<el-checkbox v-model="addForm.toTaskCenter" true-label="1" false-label="0" id="toTaskCenter" v-if="addForm.taskOut==='1'">发布到互联网任务大厅</el-checkbox>
</el-form-item>
<el-form-item label="分享赚" prop="oshare" v-if="addForm.taskOut==='1'">
<el-checkbox v-model="addForm.oshare" true-label="1" false-label="0" id="oshare" >开通分享赚</el-checkbox>
</el-form-item>
<el-checkbox v-model="addForm.oshare" true-label="1" false-label="0" id="oshare" >开通分享赚</el-checkbox>
</el-form-item>
<el-form-item label="分享佣金" prop="shareFee" v-if="addForm.oshare==='1' && addForm.taskOut==='1'">
<el-input type="number" style="width:150px;" v-model="addForm.shareFee" :precision="2" :step="100" :min="0" placeholder="分享赚佣金" ></el-input >
<font color="blue">开通分享赚后起效佣金从任务预算中扣除如果未发生分享佣金则不扣除一般建议为任务佣金的1%-5%</font>
</el-form-item>
<el-steps :active="calcTaskStep" align-center simple>
<el-step title="发布" description="任务创建成功后即发布"></el-step>
<el-step title="竞标" description="候选人参与竞标,或者由责任人主动设置候选人"></el-step>
@ -203,23 +203,23 @@
<el-step title="结算" description="提交结算申请审批流程,审批过程自动根据审批结果进行结算"></el-step>
<el-step title="企业付款" description="结算流程审批通过,自动付款到个人钱包"></el-step>
<el-step title="提现" description="企业付款完成后,个人对钱包中余额进行提现"></el-step>
</el-steps>
</el-steps>
</el-tab-pane>
</el-tabs>
</el-tabs>
<el-row class="padding" style="float:right;">
<el-button @click.native="handleCancel">取消</el-button>
<el-button v-loading="load.add" type="primary" @click.native="addSubmit(1)" :disabled="load.add==true">提交(关闭窗口)</el-button>
<el-button v-loading="load.add" type="primary" @click.native="addSubmit(2)" :disabled="load.add==true">提交(继续新增)</el-button>
</el-row>
</el-row>
</el-form>
</el-row>
</el-row>
<el-drawer append-to-body title="新增技能" :visible.sync="skillVisible" size="60%" :close-on-click-modal="false">
<skill-mng v-if="skillVisible" :task-skills="taskSkills" :jump="true" @select-confirm="onTaskSkillsSelected"></skill-mng>
</el-drawer>
<el-drawer append-to-body title="需求选择" :visible.sync="menuVisible" size="60%" :close-on-click-modal="false">
<xm-menu-select v-if="menuVisible" :is-select-menu="true" @selected="onMenuSelected" :sel-project="addForm.projectId?{id:addForm.projectId,name:addForm.projectName}:xmProjectCpd" :xm-product="xmProductCpd" :xm-iteration="xmIteration"></xm-menu-select>
</el-drawer>
</el-drawer>
<el-drawer title="选中任务" :visible.sync="selectTaskVisible" size="60%" append-to-body :close-on-click-modal="false">
<xm-task-list v-if="selectTaskVisible" check-scope="task" query-scope="planTask" :sel-project="addForm.projectId?{id:addForm.projectId,name:addForm.projectName}:xmProjectCpd" :xm-product="xmProductCpd" :ptype="addForm.ptype" @task-selected="onSelectedTask"></xm-task-list>
@ -252,12 +252,12 @@
computed: {
...mapGetters([
'userInfo','roles'
]),
]),
calcTaskStep(){
if(!this.addForm.executorUserid){
return 1
}else if(this.addForm.exeUsernames) {
if(this.addForm.exeUsernames.indexOf('执行中')>=0){
return 3
}else if(this.addForm.exeUsernames.indexOf('已验收')>=0){
@ -269,7 +269,7 @@
} if(this.addForm.exeUsernames.indexOf('已结算')>=0){
return 5
}
}
}
},
xmProjectCpd(){
if(this.xmProject && this.xmProject.id){
@ -277,21 +277,21 @@
}
if(this.parentTask && this.parentTask.id && this.parentTask.projectId){
return {id:this.parentTask.projectId,name:this.parentTask.projectName}
}
}
if(this.xmTask.projectId){
return {id:this.xmTask.projectId,name:this.xmTask.projectName}
}
return null;
},
xmProductCpd(){
if(this.xmProduct && this.xmProduct.id){
return this.xmProduct
}
if(this.xmIteration && this.xmIteration.id){
return {id:this.xmIteration.productName,productName:this.xmIteration.productName}
}
}
if(this.xmTask.productId){
return {id:this.xmTask.productId,productName:this.xmTask.productName}
}
@ -310,7 +310,7 @@
},
},
data() {
return {
dicts:{
priority:[],
@ -320,24 +320,24 @@
xmTaskSettleSchemel:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
addFormRules: {
name: [
{ required: true, message: '任务名称不能为空', trigger: 'change' },
{ min: 2, max: 150, message: '长度在 2 到 150 个字符', trigger: 'change' },//
],
description: [
{ max: 1000, message: '长度在 0 到 1000 个字符', trigger: 'change' },//
description: [
{ max: 1000, message: '长度在 0 到 1000 个字符', trigger: 'change' },//
],
taskState: [
{ required: true, message: '请选择任务状态', trigger: 'change' }
],
],
// execuser:[{
// validator: validateExec, trigger: 'blur'
// }],
},
// xm_task
// xm_task
addForm: {
id:'',name:'',parentTaskid:'',parentTaskname:'',projectId:'',projectName:'',level:'',sortLevel:'',executorUserid:'',executorUsername:'',preTaskid:'',preTaskname:'',startTime:'',endTime:'',milestone:'',description:'',remarks:'',createUserid:'',createUsername:'',createTime:'',rate:0,budgetAt:0,budgetWorkload:0,actAt:0,actWorkload:0,taskState:'0',taskType:'4',taskClass:'',toTaskCenter:'0',actStartTime:'',actEndTime:'',bizProcInstId:'',bizFlowState:'',phaseId:'',phaseName:'',taskSkillNames:'',exeUsernames:'',taskSkillIds:'',exeUserids:'',taskOut:'0',planType:'w2',settleSchemel:'1',menuId:'',menuName:'',productId:'',cbranchId:'',cdeptid:'',tagIds:'',tagNames:'',ntype:'',childrenCnt:'',ltime:'',pidPaths:'',lvl:'',isTpl:'',keyPath:'',uniInnerPrice:80,uniOutPrice:100,calcType:'',ptype:'',wtype:'',bctrl:'',initWorkload:'',shareFee:'',oshare:'',crowd:'',browseUsers:'',execUsers:'',cityId:'',cityName:'',regionType:'',browseTimes:'',capaLvls:'',tranMode:'',supRequires:'',hot:'0',top:'0',urgent:'0',crmSup:'0',bidStep:'0',interestLvls:'',filePaths:'',estate:'0',efunds:0,etoPlatTime:'',etoDevTime:'',ebackTime:'',topStime:'',topEtime:'',hotStime:'',hotEtime:'',urgentStime:'',urgentEtime:''
},
@ -353,8 +353,8 @@
selectParentTaskVisible:false,
execUserVisible:false,
groupUserSelectVisible:false,
execGroupUserSelectVisible:false,
pickerOptions: util.getPickerOptions('datarange'),
execGroupUserSelectVisible:false,
pickerOptions: util.getPickerOptions('datarange'),
activateTabPaneName:'1'
/**end 在上面加自定义属性**/
}//end return
@ -386,29 +386,29 @@
this.$notify({position:'bottom-left',showClose:true,message:'请选择项目',type: 'error'})
return;
}
this.$refs.addForm.validate((valid) => {
if (valid) {
if(this.addForm.oshare==='1'){
if(this.addForm.shareFee>1000){
if(this.addForm.shareFee>1000){
this.$notify({position:'bottom-left',showClose:true,message:'分享佣金不能超过1000元',type: 'error'})
return;
}else if( !this.addForm.budgetAt){
}else if( !this.addForm.budgetAt){
this.$notify({position:'bottom-left',showClose:true,message:'请先设置预算金额',type: 'error'})
return;
}else if(this.addForm.shareFee/this.addForm.budgetAt>0.05){
}else if(this.addForm.shareFee/this.addForm.budgetAt>0.05){
this.$notify({position:'bottom-left',showClose:true,message:'分享佣金不能超过预算金额的5%',type: 'error'})
return;
}
}
this.$confirm('确认提交吗?', '提示', {}).then(() => {
let params = Object.assign({}, this.addForm);
let params = Object.assign({}, this.addForm);
addTask(params).then((res) => {
this.load.add=false
var tips=res.data.tips;
if(tips.isOk){
if(tips.isOk){
this.$emit('submit',res.data.data);// @submit="afterAddSubmit"
if(submitType==1){
this.handleCancel()
@ -419,7 +419,7 @@
}
}
this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.add=false);
});
}else{
@ -453,14 +453,14 @@
onTaskSkillsSelected(skills) {
let taskSkill = [];
skills.forEach(i=>{
let obj = {
let obj = {
taskSkillId: i.skillId,
taskSkillName: i.skillName,
skillRemarks: '',
};
taskSkill.push(obj);
});
this.taskSkills = taskSkill;
this.taskSkills = taskSkill;
this.skillVisible=false;
},
@ -511,8 +511,8 @@
}
this.addForm.budgetAt=this.addForm.budgetWorkload * price
},
onBudgetWorkloadChange(){
onBudgetWorkloadChange(){
},
onTaskOutChange(){
this.onBudgetWorkloadChange();
@ -530,12 +530,12 @@
},
onSelectedParentTask(parentTask){
this.selectParentTaskVisible=false;
if(parentTask && parentTask.id){
if(parentTask && parentTask.id){
this.addForm.parentTaskid=parentTask.id
this.addForm.parentTaskname=parentTask.name;
this.addForm.taskType=parentTask.taskType
this.addForm.planType=parentTask.planType
this.addForm.planType=parentTask.planType
if(parentTask.childrenCnt && parentTask.sortLevel){
this.addForm.sortLevel=parentTask.sortLevel+"."+(parentTask.childrenCnt+1)
}else if(parentTask.sortLevel){
@ -581,7 +581,7 @@
})
},
/**end 在上面加自定义方法**/
/**end 在上面加自定义方法**/
initData(){
this.addForm={...this.addFormInit}
if(this.parentTask && this.parentTask.id){
@ -589,7 +589,7 @@
this.addForm.parentTaskid=this.parentTask.id
this.addForm.parentTaskname=this.parentTask.name;
this.addForm.taskType=this.parentTask.taskType
this.addForm.planType=this.parentTask.planType
this.addForm.planType=this.parentTask.planType
this.addForm.ptype=this.parentTask.ptype
this.addForm.name=this.parentTask.name+"-请修改"
this.addForm.budgetAt=0
@ -607,23 +607,23 @@
this.addForm.taskOut="0"
this.addForm.toTaskCenter="0"
this.addForm.crowd="0"
}else{
}else{
this.addForm.parentTaskid=''
this.addForm.parentTaskname='';
}
if(this.xmProject){
this.addForm.projectId=this.xmProject.id
this.addForm.projectName=this.xmProject.name
}
}
if(this.xmProduct){
this.addForm.productId=this.xmProduct.id
this.addForm.productName=this.xmProduct.productName
}
}
if(this.xmIteration && !this.xmProduct && !this.addForm.productId){
this.addForm.productId=this.xmIteration.productId
this.addForm.productName=this.xmIteration.productName
}
}
if(this.parentTask && this.parentTask.id){
if(this.parentTask.childrenCnt && this.parentTask.sortLevel){
this.addForm.sortLevel=this.parentTask.sortLevel+"."+(this.parentTask.childrenCnt+1)
@ -635,18 +635,18 @@
}
if(!this.addForm.uniInnerPrice){
this.addForm.uniInnerPrice=80
}
}
if(this.addForm.taskOut!='1'){
this.addForm.taskOut='0'
}
if(!this.addForm.uniOutPrice){
this.addForm.uniOutPrice=100
}
if(!this.parentTask || !this.parentTask.id){
this.addForm.ptype=this.ptype
}
if(!this.parentTask || !this.parentTask.id){
this.addForm.ptype=this.ptype
}
this.addForm.createUserid=this.userInfo.userid
this.addForm.createUsername=this.userInfo.username;
this.addForm.createUsername=this.userInfo.username;
this.addForm.ntype=this.xmTask.ntype
this.addForm.wtype="2"
if(!this.addForm.startTime){
@ -657,19 +657,19 @@
this.addForm.endTime=util.formatDate(endDate, "yyyy-MM-dd HH:mm:ss")
this.onBudgetDateRangerChange();
}
this.addForm.id=null;
this.activateTabPaneName="1"
},
toMenu(){
this.menuDetailVisible=true
},
onProjectRowClick: function (project) {
onProjectRowClick: function (project) {
this.addForm.projectId=project.id
this.addForm.projectName=project.name
},
onProjectClear(){
onProjectClear(){
this.addForm.projectId=""
this.addForm.projectName=""
},
@ -679,8 +679,8 @@
skillMng,xmMenuSelect,XmTaskList,MdpSelectUserXm,XmPhaseSelect,XmProjectSelect
// 'xm-task-edit':XmTaskEdit
},
mounted() {
this.initData();
mounted() {
this.initData();
initDicts(this)
/**在下面写其它函数***/

660
src/views/xm/core/xmTask/XmTaskEdit.vue
File diff suppressed because it is too large
View File

288
src/views/xm/core/xmTask/XmTaskMng.vue

@ -2,17 +2,17 @@
<section>
<el-row>
<el-col
:span="24"
:span="24"
:class="{ 'flex-box': displayType == 'agil' }"
>
<el-row>
<xm-project-select style="display:inline;" v-if="!selProject||!selProject.id" :auto-select="isTaskCenter?false:true" :link-iteration-id="xmIteration?xmIteration.id:null" :link-product-id="xmProduct?xmProduct.id:null" @row-click="onProjectRowClick" @clear="onProjectClear" ></xm-project-select>
<el-select
v-model="selkey"
placeholder="场景"
clearable
clearable
style="width: 8em;"
>
<el-option class="showall" value="" label="全部场景"
@ -34,10 +34,10 @@
>我放弃的</el-option
>
</el-select>
<mdp-select class="hidden-md-and-down" placeholder="状态" style="width: 6em;" clearable :dict="dicts['taskState']" v-model="filters.taskState"/>
<mdp-select class="hidden-md-and-down" placeholder="状态" style="width: 6em;" clearable item-code="taskState" v-model="filters.taskState"/>
<mdp-select class="hidden-md-and-down" placeholder="类型" style="width: 6em;" clearable item-code="taskType" v-model="filters.taskType"/>
<mdp-select class="hidden-md-and-down" placeholder="类型" style="width: 6em;" clearable :dict="dicts['taskType']" v-model="filters.taskType"/>
<el-input
style="width: 15em;"
v-model="filters.key" clearable
@ -58,41 +58,41 @@
trigger="manual"
v-model="moreVisible"
>
<el-row style="margin-top:-40px;">
<el-row style="margin-top:-40px;">
<el-button style="float:right;"
icon="el-icon-close"
@click="moreVisible=false"
type="text"
>关闭</el-button
>
</el-row>
>
</el-row>
<el-descriptions class="margin-top" :column="2" size="mini" border>
<el-descriptions-item :span="2">
<template slot="label">显示方式</template>
<template slot="label">显示方式</template>
<span class="more-label-font">
<el-radio v-model="displayType" label="grant" >甘特图</el-radio>
<el-radio v-model="displayType" label="agile">故事分组</el-radio>
<el-radio v-model="displayType" label="agileUser">执行人分组</el-radio>
<el-radio v-model="displayType" label="agileUser">执行人分组</el-radio>
<el-radio v-model="displayType" label="agileWeek">按周分组</el-radio>
<el-radio v-model="displayType" label="table">列表</el-radio>
<el-radio v-model="displayType" label="table">列表</el-radio>
</span>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">责任人</template>
<mdp-select-user-xm label="选择责任人" v-model="filters.createUser" :clearable="true"></mdp-select-user-xm>
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">责任人</template>
<mdp-select-user-xm label="选择责任人" v-model="filters.createUser" :clearable="true"></mdp-select-user-xm>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">执行人</template>
<mdp-select-user-xm label="选择执行人" v-model="filters.executor" :clearable="true"></mdp-select-user-xm>
<template slot="label">执行人</template>
<mdp-select-user-xm label="选择执行人" v-model="filters.executor" :clearable="true"></mdp-select-user-xm>
</el-descriptions-item>
<el-descriptions-item>
<el-descriptions-item>
<template slot="label">产品</template>
<xm-product-select :auto-select="false" :link-project-id="filters.selProject && filters.selProject.id?filters.selProject.id:null" @row-click="onProductSelected" @clear="onProductClearSelect"></xm-product-select>
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">需求</template>
<font v-if="filters.menus && filters.menus.length > 0">
<el-tag
@ -105,9 +105,9 @@
</font>
<el-button v-else @click="showMenuStory" type="plian" icon="el-icon-search"
>选需求</el-button
>
>
</el-descriptions-item>
<el-descriptions-item>
<el-descriptions-item>
<template slot="label">技能</template>
<el-button
v-if="!filters.skillTags || filters.skillTags.length == 0"
@ -124,7 +124,7 @@
@close="skillTagClear(skill)"
>{{ skill.skillName }}</el-tag
>
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">标签</template>
<el-button
@ -140,9 +140,9 @@
>{{ filters.tags[0].tagName.substr(0, 5) }}({{
filters.tags.length
}})</el-tag
>
>
</el-descriptions-item>
<el-descriptions-item>
<el-descriptions-item>
<template slot="label">众包任务</template>
<el-checkbox class="more-label-font"
@ -150,93 +150,93 @@
true-label="1"
false-label=""
>只查众包</el-checkbox
>
</el-descriptions-item>
<el-descriptions-item>
>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">最后变动日期</template>
<mdp-date-range
v-model="filters"
type="daterange"
type="daterange"
start-key="ltimeStart"
end-key="ltimeEnd"
end-key="ltimeEnd"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="完成日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:auto-default="false"
key="ltime"
></mdp-date-range>
</el-descriptions-item>
<el-descriptions-item>
></mdp-date-range>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">计划开始时间</template>
<mdp-date-range
v-model="filters"
type="daterange"
type="daterange"
start-key="planStartTimeStart"
end-key="planStartTimeEnd"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="完成日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:auto-default="false"
key="planStartTime"
></mdp-date-range>
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">实际开始时间</template>
<mdp-date-range
v-model="filters"
type="daterange"
type="daterange"
start-key="actStartTimeStart"
end-key="actStartTimeEnd"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="完成日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:auto-default="false"
></mdp-date-range>
</el-descriptions-item>
<el-descriptions-item>
></mdp-date-range>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">计划结束时间</template>
<mdp-date-range
v-model="filters"
type="daterange"
type="daterange"
start-key="planEndTimeStart"
end-key="planEndTimeEnd"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="完成日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:auto-default="false"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:auto-default="false"
key="planEndTime"
></mdp-date-range>
</el-descriptions-item>
></mdp-date-range>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">实际结束时间</template>
<mdp-date-range
v-model="filters"
type="daterange"
type="daterange"
start-key="actEndTimeStart"
end-key="actEndTimeEnd"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="完成日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:auto-default="false"
></mdp-date-range>
</el-descriptions-item>
></mdp-date-range>
</el-descriptions-item>
<el-descriptions-item>
<el-button style="float:right;"
type="primary"
@ -245,7 +245,7 @@
>查询</el-button
>
</el-descriptions-item>
</el-descriptions>
</el-descriptions>
<el-button slot="reference" @click="moreVisible=!moreVisible">更多</el-button>
</el-popover>
<span style="float:right;">
@ -325,15 +325,15 @@
:xmTasks="xmTasks"
@submit="afterEditSubmit"
></xm-task-agile-kanban>
<xm-task-agile-kanban-user
:tableHeight="tableHeight"
v-else-if="displayType == 'agileUser'"
:xmTasks="xmTasks"
@submit="afterEditSubmit"
></xm-task-agile-kanban-user>
<xm-task-agile-kanban-week
:tableHeight="tableHeight"
v-else-if="displayType == 'agileWeek'"
@ -356,7 +356,7 @@
tooltip-effect="light"
:height="tableHeight"
row-key="id"
>
<el-table-column
label="全选"
@ -367,7 +367,7 @@
</el-table-column>
<el-table-column
sortable
prop="name"
prop="name"
fixed="left"
label="任务名称"
min-width="400"
@ -376,11 +376,11 @@
<div style="display:flex; flex-wrap:nowrap;">
<div class="icon" :style="{backgroundColor: scope.row.ntype==='1'?'#E6A23C':'#409EFF'}">
<i :class="scope.row.ntype==='1'?'el-icon-time':'el-icon-s-operation'" style="width:20px;"></i>
</div>
</div>
<el-link @click="showEdit(scope.row)">{{ scope.row.sortLevel }}&nbsp; {{ scope.row.name }}</el-link>
<span class="tool-bar">
<el-button @click="copyOne(scope.row,scope.$index)" icon="el-icon-document-copy" circle title="复制一行"></el-button>
<el-button @click="copyOne(scope.row,scope.$index)" icon="el-icon-document-copy" circle title="复制一行"></el-button>
</span>
</div>
</template>
@ -392,7 +392,7 @@
width="100"
>
<template slot-scope="scope">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" :dict="dicts['taskState']" v-model="scope.row.taskState" placeholder="任务状态" style="display:block;" @change="editXmTaskSomeFields(scope.row,'taskState',$event)">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" item-code="taskState" v-model="scope.row.taskState" placeholder="任务状态" style="display:block;" @change="editXmTaskSomeFields(scope.row,'taskState',$event)">
</mdp-select-tag>
</template>
</el-table-column>
@ -429,7 +429,7 @@
width="120"
show-overflow-tooltip
>
<template slot-scope="scope">
<template slot-scope="scope">
<mdp-select-user-xm size="mini" v-model="scope.row" userid-key="createUserid" @visible-change="selectVisible(scope.row,$event)" username-key="createUsername" :project-id="scope.row.projectId" @change="editXmTaskSomeFields(scope.row,'createUserid',$event)"></mdp-select-user-xm>
</template>
</el-table-column>
@ -440,7 +440,7 @@
width="120"
show-overflow-tooltip
>
<template slot-scope="scope">
<template slot-scope="scope">
<mdp-select-user-xm size="mini" :key="scope.row.id" v-model="scope.row" userid-key="executorUserid" @visible-change="selectVisible(scope.row,$event)" username-key="executorUsername" :project-id="scope.row.projectId" @change="editXmTaskSomeFields(scope.row,'executorUserid',$event)"></mdp-select-user-xm>
</template>
</el-table-column>
@ -459,7 +459,7 @@
>
<span title="实际工时 / 预算工时 或者 (剩余工时+实际工时)">{{scope.row.actWorkload}} &nbsp;/ &nbsp;{{scope.row.rworkload?parseInt(scope.row.actWorkload)+parseInt(scope.row.rworkload):scope.row.budgetWorkload}}h </span>
</el-link>
</template>
</el-table-column>
<el-table-column sortable prop="productId" label="产品" width="100" show-overflow-tooltip>
@ -484,7 +484,7 @@
width="100"
>
<template slot-scope="scope">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" :dict="dicts['priority']" v-model="scope.row.level" placeholder="优先级" style="display:block;" @change="editXmTaskSomeFields(scope.row,'level',$event)">
<mdp-select-tag size="mini" @visible-change="selectVisible(scope.row,$event)" item-code="priority" v-model="scope.row.level" placeholder="优先级" style="display:block;" @change="editXmTaskSomeFields(scope.row,'level',$event)">
</mdp-select-tag>
</template>
@ -533,7 +533,7 @@
:useRealTime="true"
></xm-gantt>
</el-row>
<el-pagination v-if="displayType != 'grant'"
ref="pagination"
layout="total, sizes, prev, pager, next"
@ -557,11 +557,11 @@
<el-row style="font-size: 12px; overflow-x: hidden">
<div class="task-header extra">
<div class="title" v-if="sels.length==0">
{{ editForm.name }}
</div>
{{ editForm.name }}
</div>
<div class="title" v-if="sels.length>0">
{{ editForm.name }} <font color="red">{{sels.length}}个任务</font>
</div>
</div>
</div>
<div class="exector extra">
@ -569,14 +569,14 @@
<mdp-date-range
v-model="editForm"
start-key="startTime"
end-key="endTime"
type="daterange"
end-key="endTime"
type="daterange"
unlink-panels
range-separator="至"
start-placeholder="计划开始日期"
end-placeholder="计划完成日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:default-time="['00:00:00', '23:59:59']"
@change="editTime(editForm,'startTime')"
:auto-default="false"
></mdp-date-range>
@ -587,17 +587,17 @@
<mdp-date-range
v-model="editForm"
start-key="actStartTime"
end-key="actEndTime"
type="daterange"
end-key="actEndTime"
type="daterange"
unlink-panels
range-separator="至"
start-placeholder="实际开始日期"
end-placeholder="实际完成日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
:default-time="['00:00:00', '23:59:59']"
@change="editTime(editForm,'actStartTime')"
:auto-default="false"
></mdp-date-range>
></mdp-date-range>
</div>
</el-row>
</el-row>
@ -639,7 +639,7 @@
@cancel="taskWorkloadVisible=false"
@submit="onTaskWorkloadSubmit"
></xm-workload-edit>
</el-dialog>
</el-dialog>
<el-drawer
v-if="taskWorkloadInitVisible == true"
@ -650,18 +650,18 @@
<el-form class="padding" ref="workloadInit" :model="editForm" label-position="top" label-width="80px" size="mini">
<el-form-item label="更新范围">
<div v-if="sels.length==0">
{{ editForm.name }}
</div>
{{ editForm.name }}
</div>
<div v-if="sels.length>0">
{{ editForm.name }} <font color="red">{{sels.length}}个任务</font>
</div>
</el-form-item>
</div>
</el-form-item>
<el-form-item label="预估工时(小时)">
<el-input style="width:50%;" v-model="editForm.budgetWorkload" @change="editXmTaskSomeFields(editForm,'budgetWorkload',$event)">
</el-input>
</el-form-item>
</el-form-item>
</el-form>
</el-drawer>
<!-- 新增 XmTask xm_task界面-->
<el-dialog
@ -868,7 +868,7 @@ import xmSkillMng from "../xmTaskSkill/XmTaskSkillMng";
import skillMng from "@/views/xm/core/skill/skillMng";
import { batchAddSkill } from "@/api/xm/core/xmTaskSkill";
import { sn } from "@/common/js/sequence";
import xmTaskTemplateMng from "../xmTaskTemplate/XmTaskTemplateMng";
import xmTaskTemplateMng from "../xmTaskTemplate/XmTaskTemplateMng";
import xmMenuSelect from "../xmMenu/XmMenuSelect";
import { addUserFocus, delUserFocus } from "@/api/mdp/sys/userFocus";
@ -924,22 +924,22 @@ export default {
tasksTreeData() {
return this.xmTasks;
},
toSearchCpd(){
var key={iterationId:'',projectId:'',productId:'',parentTaskid:''};
if(this.xmIteration&&this.xmIteration.id){
key.iterationId=this.xmIteration.id
key.productId=this.xmIteration.productId
}else{
key.iterationId=''
key.iterationId=''
}
if(this.xmProduct&&this.xmProduct.id){
if(this.xmProduct&&this.xmProduct.id){
key.productId=this.xmProduct.id
}else{
key.productId=''
}
if(this.selProject&&this.selProject.id){
if(this.selProject&&this.selProject.id){
key.projectId=this.selProject.id
}else{
key.projectId=''
@ -948,7 +948,7 @@ export default {
key.parentTaskid=this.parentTask.id
key.projectId=this.parentTask.projectId
}else{
key.parentTaskid=''
key.parentTaskid=''
}
return key.iterationId+key.projectId+key.productId+key.parentTaskid
}
@ -972,7 +972,7 @@ export default {
this.filters.selProject = this.selProject;
this.changeSelKey("");
},
menuId: function (menuId) {
menuId: function (menuId) {
},
timeVisible: function (timeVisible) {
if (timeVisible == false) {
@ -980,14 +980,14 @@ export default {
}
},
xmProduct: function () {
this.filters.product = this.xmProduct;
this.filters.product = this.xmProduct;
},
xmIteration: function () {
xmIteration: function () {
},
parentTask:function(){
parentTask:function(){
},
toSearchCpd:function(){
toSearchCpd:function(){
this.searchXmTasks();
}
},
@ -1024,7 +1024,7 @@ export default {
total: 0, //0>0
pageSize: 20, //
count:true, //
pageNum: 1, //1
pageNum: 1, //1
orderFields: ['cast(sort_level as signed)','menu_id',"start_time"], // ['sex','student_id']
orderDirs: ["asc","asc","desc"], // asc,desc ['asc','desc']
},
@ -1071,12 +1071,12 @@ export default {
taskTemplateVisible: false,
projectInfoVisible: false,
menuVisible: false,
menuDetailVisible: false,
menuDetailVisible: false,
displayType: "table",
menuStory: false, //
showSkillSearchVisible: false, //
tableHeight: 300,
productSelectVisible: false,
productSelectVisible: false,
budgetDateRanger: [],
actDateRanger: [],
@ -1126,7 +1126,7 @@ export default {
},
changeShowInfo() {
this.projectInfoVisible = false;
},
},
clearFiltersMenu(menu) {
this.filters.menus = this.filters.menus.filter(
(i) => i.menuId != menu.menuId
@ -1438,7 +1438,7 @@ export default {
this.addForm.ntype=ntype;
this.addFormVisible = true;
},
afterAddSubmit(row) {
afterAddSubmit(row) {
this.pageInfo.count = true;
this.xmTasks.push(row)
//this.getXmTasks()
@ -1516,7 +1516,7 @@ export default {
.catch((err) => (this.load.del = false));
});
},
rowClick: function (row) {
rowClick: function (row) {
this.editForm = row;
this.editFormBak=Object.assign({},row)
// this.$emit('row-click',row,);// @row-click="rowClick"
@ -1848,7 +1848,7 @@ export default {
}else if(option.action==='executorUserid'){
var user= groupUsers[0];
var params={}
var row=option.data;
var row=option.data;
params.taskId = row.id;
params.projectId=row.projectId
params.projectName=row.projectName
@ -1859,7 +1859,7 @@ export default {
params.quoteWorkload=row.budgetWorkload
params.userid=user.userid
params.username=user.username
if(this.sels.length>0){
if(this.sels.length>0){
this.editXmTaskSomeFields(row,"executorUserid",params)
}else{
addTaskExecuser(params).then(res=>{
@ -1875,11 +1875,11 @@ export default {
}
})
}
}
}
},
formatExeUsernames(row) {
var exeUsernames = row.exeUsernames;
@ -1927,10 +1927,10 @@ export default {
params.actStartTime=row.actStartTime
params.actEndTime=row.actEndTime
}
this.editXmTaskSomeFields( row,fieldName,params)
this.editXmTaskSomeFields( row,fieldName,params)
},
clearFiltersTag(){
this.filters.tags=[]
this.filters.tags=[]
},
onTagSelected(tags,option){
if(option && option.action=='editTagIds'){
@ -1940,44 +1940,44 @@ export default {
this.filters.tags=[]
}else{
this.filters.tags=JSON.parse(JSON.stringify(tags))
}
}
}
},
getParams(params) {
if (this.filters.planStartTimeStart) {
params.planStartTimeStart = this.filters.planStartTimeStart
params.planStartTimeStart = this.filters.planStartTimeStart
}
if (this.filters.planStartTimeEnd) {
params.planStartTimeEnd = this.filters.planStartTimeEnd
params.planStartTimeEnd = this.filters.planStartTimeEnd
}
if (this.filters.planEndTimeStart) {
params.planEndTimeStart = this.filters.planEndTimeStart
params.planEndTimeStart = this.filters.planEndTimeStart
}
if (this.filters.planEndTimeEnd) {
params.planEndTimeEnd = this.filters.planEndTimeEnd
params.planEndTimeEnd = this.filters.planEndTimeEnd
}
if (this.filters.actStartTimeStart) {
params.actStartTimeStart = this.filters.actStartTimeStart
params.actStartTimeStart = this.filters.actStartTimeStart
}
if (this.filters.actStartTimeEnd) {
params.actStartTimeEnd = this.filters.actStartTimeEnd
params.actStartTimeEnd = this.filters.actStartTimeEnd
}
if (this.filters.actEndTimeStart) {
params.actEndTimeStart = this.filters.actEndTimeStart
params.actEndTimeStart = this.filters.actEndTimeStart
}
if (this.filters.actEndTimeEnd) {
params.actEndTimeEnd = this.filters.actEndTimeEnd
params.actEndTimeEnd = this.filters.actEndTimeEnd
}
if (this.filters.ltimeStart) {
params.ltimeStart = this.filters.ltimeStart
params.ltimeStart = this.filters.ltimeStart
}
if (this.filters.ltimeEnd) {
params.ltimeEnd = this.filters.ltimeEnd
params.ltimeEnd = this.filters.ltimeEnd
}
@ -2102,10 +2102,10 @@ export default {
}else if(fieldName==='workload'){
params={...params,...$event}
}else if(fieldName==='executorUserid'){
if(row.out=='1'||row.crowd=='1'){
if(row.out=='1'||row.crowd=='1'){
this.$nextTick(()=>{
Object.assign(this.editForm,this.editFormBak)
})
})
this.$notify({position:'bottom-left',showClose:true,message:'外包任务不允许直接设置执行人,请到执行人管理中选择',type:'error'})
return;
}
@ -2201,33 +2201,33 @@ export default {
this.taskWorkloadInitVisible=false;
this.searchXmTasks();
},
showWorkload(row){
this.editForm=row
this.taskWorkloadVisible=true;
},
setInitWorkload(row){
setInitWorkload(row){
this.editForm=row
this.taskWorkloadInitVisible=true;
},
copyOne(row,index){
var params={...row}
params.id=null;
params.createUserid=this.userInfo.userid
params.createUsername=this.userInfo.username
params.createUsername=this.userInfo.username
params.executorUserid=null
params.executorUseranme=null
params.execUserids=null;
params.execUsername=null;
params.execUsername=null;
params.actWorkload=null;
params.actAt=null;
params.efunds=0
params.efunds=0
params.name=row.name+'V'
addTask(params).then(res=>{
var tips = res.data.tips
if(tips.isOk){
if(tips.isOk){
var row2=res.data.data
this.xmTasks.splice(index+1,0,row2)
this.pageInfo.total=this.pageInfo.total+1
@ -2249,7 +2249,7 @@ export default {
xmSkillMng,
skillMng,
xmTaskTemplateMng,
XmProjectSelect,
XmProjectSelect,
xmMenuSelect,
XmMenuRichDetail,
XmGantt,
@ -2315,8 +2315,8 @@ export default {
font-size: 16px;
overflow-x: auto;
overflow-y: hidden;
}
}
>>> .el-date-editor--daterange.el-input, .el-date-editor--daterange.el-input__inner, .el-date-editor--timerange.el-input, .el-date-editor--timerange.el-input__inner {
width: 250px;

242
src/views/xm/core/xmTestCase/XmTestCaseEdit.vue

@ -1,93 +1,93 @@
<template>
<section>
<section>
<el-row>
<!--编辑界面 XmTestCase 测试用例-->
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editFormRef" label-position="left">
<!--编辑界面 XmTestCase 测试用例-->
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editFormRef" label-position="left">
<el-row>
<el-col :span="6" class="padding border">
<el-form-item label="测试库" prop="casedbName">
{{editForm.casedbName?editForm.casedbName:editForm.casedbId }}
{{editForm.casedbName?editForm.casedbName:editForm.casedbId }}
<el-button type="text" @click="testCasedbVisible=true" v-if="opType==='add' && (!xmTestCasedb||!xmTestCasedb.id)">选择测试库</el-button>
</el-form-item>
</el-form-item>
<el-form-item label="产品" prop="productId">
{{editForm.productName?editForm.productName:editForm.productId }}
</el-form-item>
{{editForm.productName?editForm.productName:editForm.productId }}
</el-form-item>
<el-form-item label="关联模块" prop="menuName">
{{editForm.funcName?editForm.funcName:'暂无关联需求'}} <el-button type="text" @click="funcVisible=true">选择模块</el-button>
</el-form-item>
<el-form-item label="关联需求" prop="menuId" id="menuInfo">
</el-form-item>
<el-form-item label="关联需求" prop="menuId" id="menuInfo">
{{editForm.menuName}} &nbsp;&nbsp;&nbsp; <el-link @click="menuVisible=true" type="primary">{{editForm.menuName?'更改':'设置'}}</el-link>&nbsp;&nbsp;&nbsp;
<el-link v-if="editForm.menuId" @click="menuFormVisible=true" type="primary">查看需求</el-link>
</el-form-item>
</el-form-item>
<el-form-item label="测试方式" prop="testType">
<mdp-select-tag placeholder="测试方式" clearable :dict="dicts['testType']" v-model="editForm.testType" effect="dark" @change="editSomeFields(editForm,'testType',$event)"></mdp-select-tag>
</el-form-item>
<mdp-select-tag placeholder="测试方式" clearable item-code="testType" v-model="editForm.testType" effect="dark" @change="editSomeFields(editForm,'testType',$event)"></mdp-select-tag>
</el-form-item>
<el-form-item label="版本号" prop="verNum">
<el-input v-model="editForm.verNum" placeholder="版本号" :maxlength="50" @change="editSomeFields(editForm,'verNum',$event)"></el-input>
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="18" class="border padding-left padding-right padding-top">
<el-form-item label="用例标题" prop="caseName">
<el-input v-model="editForm.caseName" placeholder="测试用例 标题" @change="editSomeFields(editForm,'caseName',$event)"></el-input>
<el-col :span="18" class="border padding-left padding-right padding-top">
<el-form-item label="用例标题" prop="caseName">
<el-input v-model="editForm.caseName" placeholder="测试用例 标题" @change="editSomeFields(editForm,'caseName',$event)"></el-input>
<el-row class="label-font-color" v-if="opType=='edit'">
<span><span >编号:</span>&nbsp;&nbsp;{{editForm.id}} &nbsp;&nbsp;</span>
<span><span >编号:</span>&nbsp;&nbsp;{{editForm.id}} &nbsp;&nbsp;</span>
</el-row>
</el-form-item>
<el-form-item label="接口地址" prop="url">
</el-form-item>
<el-form-item label="接口地址" prop="url">
<div style="display:flex;">
<mdp-select-tag label="请求方法" v-model="autoStep.method" :dict="dicts.autoTestMethod" ></mdp-select-tag>
<mdp-select-tag label="请求方法" v-model="autoStep.method" :dict="dicts.autoTestMethod" ></mdp-select-tag>
<el-input v-model="autoStep.url" placeholder="url 如#{baseApi}/user/list,支持通过 #{变量名}引用环境变量"></el-input>
<el-button style="margin-left:10px;" type="primary" @click="sendMsgForTestSetting" title="执行用例">发送</el-button>
</div>
</el-form-item>
<el-row class="padding">
<el-col :span="6">
<mdp-select show-style="x" label="状态" :dict="dicts['testCaseStatus']" v-model="editForm.caseStatus" @change="editSomeFields(editForm,'caseStatus',$event)"></mdp-select>
</el-col>
<el-col :span="6">
<el-col :span="6">
<mdp-select show-style="x" label="状态" item-code="testCaseStatus" v-model="editForm.caseStatus" @change="editSomeFields(editForm,'caseStatus',$event)"></mdp-select>
</el-col>
<el-col :span="6">
<mdp-select-user-xm label="责任人" userid-key="cuserid" username-key="cusername" v-model="editForm" @change="editSomeFields(editForm,'cuserid',$event)" :product-id="editForm.productId"></mdp-select-user-xm>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="用例类型" :dict="dicts['caseType']" v-model="editForm.caseType" @change="editSomeFields(editForm,'caseType',$event)"></mdp-select>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="优先级" :dict="dicts['priority']" v-model="editForm.cpriority" @change="editSomeFields(editForm,'cpriority',$event)"></mdp-select>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="用例类型" item-code="caseType" v-model="editForm.caseType" @change="editSomeFields(editForm,'caseType',$event)"></mdp-select>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="优先级" item-code="priority" v-model="editForm.cpriority" @change="editSomeFields(editForm,'cpriority',$event)"></mdp-select>
</el-col>
</el-row>
<el-tabs v-model="activeTab">
<el-tab-pane name="1" label="基本信息">
<el-form-item label="" prop="preRmark" label-width="0px">
<el-row class="label-font-color">
前置条件
</el-row>
</el-row>
<el-row>
<el-input type="textarea" :rows="4" v-model="editForm.preRemark" placeholder="请输入前置条件" @change="editSomeFields(editForm,'preRemark',$event)"></el-input>
</el-row>
</el-form-item>
</el-row>
</el-form-item>
<el-form-item label="" prop="testStep" label-width="0px" v-if="editForm.testType!='1'">
<el-row class="label-font-color">
测试步骤
</el-row>
</el-row>
<el-row>
<test-step-config v-model="editForm.testStep"></test-step-config>
</el-row>
<el-row v-if="opType!=='add' && editForm.testStep!=editFormBak.testStep">
<el-button type="primary" @click="editSomeFields(editForm,'testStep',editForm.testStep)">保存测试步骤</el-button>
</el-row>
</el-form-item>
</el-form-item>
<el-form-item label="" prop="caseRmark" label-width="0px">
<el-row class="label-font-color">
用例描述
</el-row>
</el-row>
<el-row>
<el-input type="textarea" :rows="4" v-model="editForm.caseRemark" placeholder="请输入用例描述" @change="editSomeFields(editForm,'caseRemark',$event)"></el-input>
</el-row>
</el-form-item>
</el-row>
</el-form-item>
</el-tab-pane>
<el-tab-pane name="12" label="Params" v-if="editForm.testType=='1'">
<el-form-item label="url" class="field">
@ -127,15 +127,15 @@
<template scope="scope">
<el-input v-model="scope.row.value" placeholder="支持通过 #{变量名}引用环境变量"></el-input>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="操作" width="180">
<template slot="header" slot-scope="scope">
操作
<el-button v-if="!autoStep.params||autoStep.params.length==0" @click="addParamsRow({},0)" icon="el-icon-plus" circle plain></el-button>
操作
<el-button v-if="!autoStep.params||autoStep.params.length==0" @click="addParamsRow({},0)" icon="el-icon-plus" circle plain></el-button>
</template>
<template scope="scope">
<el-button type="danger" @click="deleteParamsRow(scope.row,scope.$index)" icon="el-icon-delete" circle plain></el-button>
<el-button @click="addParamsRow(scope.row,scope.$index)" icon="el-icon-plus" circle plain></el-button>
<el-button type="danger" @click="deleteParamsRow(scope.row,scope.$index)" icon="el-icon-delete" circle plain></el-button>
<el-button @click="addParamsRow(scope.row,scope.$index)" icon="el-icon-plus" circle plain></el-button>
</template>
</el-table-column>
</el-table>
@ -167,15 +167,15 @@
<template scope="scope">
<el-input v-model="scope.row.value" placeholder="支持通过 #{变量名}引用环境变量"></el-input>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="操作" width="180">
<template slot="header" slot-scope="scope">
操作
<el-button v-if="!autoStep.body||autoStep.body.length==0" @click="addBodyRow({},0)" icon="el-icon-plus" circle plain></el-button>
操作
<el-button v-if="!autoStep.body||autoStep.body.length==0" @click="addBodyRow({},0)" icon="el-icon-plus" circle plain></el-button>
</template>
<template scope="scope">
<el-button type="danger" @click="deleteBodyRow(scope.row,scope.$index)" icon="el-icon-delete" circle plain></el-button>
<el-button @click="addBodyRow(scope.row,scope.$index)" icon="el-icon-plus" circle plain></el-button>
<el-button type="danger" @click="deleteBodyRow(scope.row,scope.$index)" icon="el-icon-delete" circle plain></el-button>
<el-button @click="addBodyRow(scope.row,scope.$index)" icon="el-icon-plus" circle plain></el-button>
</template>
</el-table-column>
</el-table>
@ -185,7 +185,7 @@
</el-row>
</el-tab-pane>
<el-tab-pane name="14" label="Cookie" v-if="editForm.testType=='1'">
<el-tab-pane name="14" label="Cookie" v-if="editForm.testType=='1'">
<el-table
:data="autoStep.cookies"
style="width: 100%">
@ -204,15 +204,15 @@
<template scope="scope">
<el-input v-model="scope.row.value" placeholder="支持通过 #{变量名}引用环境变量"></el-input>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="操作" width="180">
<template slot="header" slot-scope="scope">
操作
<el-button v-if="!autoStep.cookies||autoStep.cookies.length==0" @click="addCookieRow({},0)" icon="el-icon-plus" circle plain></el-button>
操作
<el-button v-if="!autoStep.cookies||autoStep.cookies.length==0" @click="addCookieRow({},0)" icon="el-icon-plus" circle plain></el-button>
</template>
<template scope="scope">
<el-button type="danger" @click="deleteCookieRow(scope.row,scope.$index)" icon="el-icon-delete" circle plain></el-button>
<el-button @click="addCookieRow(scope.row,scope.$index)" icon="el-icon-plus" circle plain></el-button>
<el-button type="danger" @click="deleteCookieRow(scope.row,scope.$index)" icon="el-icon-delete" circle plain></el-button>
<el-button @click="addCookieRow(scope.row,scope.$index)" icon="el-icon-plus" circle plain></el-button>
</template>
</el-table-column>
</el-table>
@ -240,15 +240,15 @@
<template scope="scope">
<el-input v-model="scope.row.value" placeholder="支持通过 #{变量名}引用环境变量"></el-input>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="操作" width="180">
<template slot="header" slot-scope="scope">
操作
<el-button v-if="!autoStep.headers||autoStep.headers.length==0" @click="addHeaderRow({},0)" icon="el-icon-plus" circle plain></el-button>
操作
<el-button v-if="!autoStep.headers||autoStep.headers.length==0" @click="addHeaderRow({},0)" icon="el-icon-plus" circle plain></el-button>
</template>
<template scope="scope">
<el-button type="danger" @click="deleteHeaderRow(scope.row,scope.$index)" icon="el-icon-delete" circle plain></el-button>
<el-button @click="addHeaderRow(scope.row,scope.$index)" icon="el-icon-plus" circle plain></el-button>
<el-button type="danger" @click="deleteHeaderRow(scope.row,scope.$index)" icon="el-icon-delete" circle plain></el-button>
<el-button @click="addHeaderRow(scope.row,scope.$index)" icon="el-icon-plus" circle plain></el-button>
</template>
</el-table-column>
</el-table>
@ -258,9 +258,9 @@
</el-row>
</el-tab-pane>
<el-tab-pane name="16" label="Auth" v-if="editForm.testType=='1'">
<mdp-select show-style="x" style="margin-bottom:10px;" class="padding" label="授权方式" v-model="autoStep.authType" :dict="dicts.autoTestAuthType"></mdp-select>
<el-row v-if="autoStep.authType=='basic-auth'">
<el-form-item label="username" class="field">
@ -270,7 +270,7 @@
<div class="field-bar">
<el-input v-model="autoStep.authData.username" placeholder="username 支持通过 #{变量名}引用环境变量" ></el-input>
</div>
</el-form-item>
</el-form-item>
<el-form-item label="password" class="field">
<div class="field-text">
<i class="el-icon-edit"></i>{{autoStep.authData.password||'暂无'}}
@ -289,8 +289,8 @@
<div class="field-bar">
<el-input type="textarea" autosize v-model="autoStep.authData.bearerToken" placeholder="Bearer 支持通过 #{变量名}引用环境变量"></el-input>
</div>
</el-form-item>
</el-row>
</el-form-item>
</el-row>
<el-row class="padding" style="float:right;">
<el-button @click="sendMsgForTestSetting" title="仅仅用于测试用例配置是否正确,不会保存任何执行结果,如果需要正式使用,请构建测试计划,进行统一管理">发送</el-button>
<el-button @click="saveAutoStep" type="primary">保存</el-button>
@ -301,14 +301,14 @@
<el-row class="padding">可使用的变量 env={key1:value1,key2:value2,等等},env为测试库环境变量及测试计划的环境变量合并重复则以测试计划的为准可通过env['key1']获取值</el-row>
<el-form-item label="成功与失败的逻辑判断">
<el-input type="textarea" :rows="10" v-model="autoStep.expectResult" placeholder="成功与失败的判断" ></el-input>
</el-form-item>
<el-input type="textarea" :rows="10" v-model="autoStep.expectResult" placeholder="成功与失败的判断" ></el-input>
</el-form-item>
<el-form-item label="例子">
if(res.status==200){<br/>
&nbsp;&nbsp;return true;<br/>
}else{<br/>
&nbsp;&nbsp;return false;<br/>
}<br/>
}<br/>
</el-form-item>
<el-form-item label="响应数据预览" >
<el-row> <el-checkbox v-model="resDataVisible">显示响应数据</el-checkbox></el-row>
@ -319,30 +319,30 @@
<el-button @click="sendMsgForTestSetting" title="仅仅用于测试用例配置是否正确,不会保存任何执行结果,如果需要正式使用,请构建测试计划,进行统一管理">发送</el-button>
<el-button @click="saveAutoStep" type="primary">保存</el-button>
</el-row>
</el-tab-pane>
</el-tab-pane>
<el-tab-pane name="2" label="缺陷" v-if="opType!=='add'">
<xm-question-mng v-if="activeTab=='2'" :xm-test-case="editForm" :xm-product="{id:editForm.productId,productName:editForm.productName}" :sel-project="{id:editForm.projectId,name:editForm.projectName}"></xm-question-mng>
</el-tab-pane>
<el-tab-pane name="3" label="执行记录" v-if="opType!=='add'">
<xm-test-plan-case-mng :xm-test-casedb="xmTestCasedb" :xm-test-case="editForm" v-if="activeTab=='3'"></xm-test-plan-case-mng>
</el-tab-pane>
<el-tab-pane :label="'工时( '+( editForm.actWorkload||0)+' / '+( editForm.budgetWorkload||0)+' h )'" name="55">
<el-tab-pane :label="'工时( '+( editForm.actWorkload||0)+' / '+( editForm.budgetWorkload||0)+' h )'" name="55">
<xm-workload-record v-if="activeTab=='55'" biz-type="3" :xm-test-case="editForm" ></xm-workload-record>
</el-tab-pane>
<el-tab-pane name="4" label="日志" v-if="opType!=='add'"></el-tab-pane>
</el-tabs>
<el-row v-if="opType=='add'" class="padding">
<span style="float:right;">
<el-button @click.native="handleCancel">取消</el-button>
<el-button v-loading="load.edit" type="primary" @click.native="saveSubmit" :disabled="load.edit==true">提交</el-button>
</span>
</el-row>
</el-row>
</el-col>
</el-row>
</el-row>
</el-form>
</el-row>
@ -356,7 +356,7 @@
<el-dialog title="需求详情" :visible.sync="menuFormVisible" :with-header="false" width="90%" top="20px" append-to-body :close-on-click-modal="false" >
<xm-menu-edit v-if="menuFormVisible" :reload="true" :xm-menu="{menuId:editForm.menuId}" :visible="menuFormVisible" @cancel="menuFormVisible=false"></xm-menu-edit>
</el-dialog>
<el-dialog title="选择测试库" :visible.sync="testCasedbVisible" :with-header="false" width="90%" top="20px" append-to-body :close-on-click-modal="false" >
<xm-test-casedb-mng v-if="testCasedbVisible" :select="true" :xm-product="xmProduct&&xmProduct.id?xmProduct:(xmMenu&&xmMenu.menuId?{id:xmMenu.productId,productName:xmMenu.productName}:null)" :visible="testCasedbVisible" @cancel="testCasedbVisible=false" @select="onTestCasedbSelect"></xm-test-casedb-mng>
</el-dialog>
@ -370,18 +370,18 @@
import {autoStepToAxios,initEnvVars} from '@/api/xm/core/XmTestAutoStep.js';//
import { mapGetters } from 'vuex'
import XmMenuSelect from '../xmMenu/XmMenuSelect'
import XmMenuSelect from '../xmMenu/XmMenuSelect'
import XmFuncSelect from '../xmFunc/XmFuncSelect'
import TestStepConfig from './TestStepConfig.vue';
import XmQuestionMng from '@/views/xm/core/xmQuestion/XmQuestionMng';//
import XmTestPlanCaseMng from '@/views/xm/core/xmTestPlanCase/XmTestPlanCaseMng';//
import MyInput from '@/components/MDinput/index';
import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//
import axios from 'axios'//访
import JsonViewer from 'vue-json-viewer'
import JsonViewer from 'vue-json-viewer'
export default {
name:'xmTestCaseEdit',
@ -408,18 +408,18 @@ import JsonViewer from 'vue-json-viewer'
}
},
'visible':function(visible) {
'visible':function(visible) {
if(visible==true){
this.initData()
}
},
},
'autoStep.bodyType'(){
if(this.autoStep.bodyType=='form-data'||this.autoStep.bodyType=='x-www-form-urlencoded'){
this.autoStep.body=[]
}else{
this.autoStep.body=''
}
}
},
data() {
@ -448,7 +448,7 @@ import JsonViewer from 'vue-json-viewer'
funcVisible:false,
activeTab:'1',
testCasedbVisible:false,
queryStr:'',
testRes:{},
resDataVisible:false,
@ -456,19 +456,19 @@ import JsonViewer from 'vue-json-viewer'
url:'',
method:'GET',
authType:'none',
authData:{
authData:{
},
bodyType:'json',
params:[],
body:[],
cookies:[],
expectResult:''
},
},
autoStepInit:{
url:'',
method:'',
authType:'',
authData:{
authData:{
},
bodyType:'',
params:[],
@ -476,7 +476,7 @@ import JsonViewer from 'vue-json-viewer'
cookies:[],
expectResult:''
}
}//end return
},//end data
methods: {
@ -492,7 +492,7 @@ import JsonViewer from 'vue-json-viewer'
saveSubmit: function () {
this.$refs.editFormRef.validate((valid) => {
if (valid) {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.load.edit=true
let params = Object.assign({}, this.editForm);
var func=addXmTestCase
@ -519,7 +519,7 @@ import JsonViewer from 'vue-json-viewer'
initQueryStr(){
this.queryStr=this.autoStep.params.map(k=>k.id+'='+k.value).join("&")
},
onQueryStrChange(){
onQueryStrChange(){
this.autoStep.params=[]
this.queryStr.split("&").forEach(k=>{
var k2=k.split("=")
@ -528,33 +528,33 @@ import JsonViewer from 'vue-json-viewer'
p={id:k2[0],value:k2[1]}
}else{
p={id:k2[0],value:''}
}
}
this.autoStep.params.push(p)
})
})
},
addParamsRow(row,index){
this.autoStep.params.splice(index+1,0,{id:'',value:''})
},
},
deleteParamsRow(row,index){
this.autoStep.params.splice(index,1)
},
addBodyRow(row,index){
this.autoStep.body.splice(index+1,0,{id:'',value:''})
},
},
deleteBodyRow(row,index){
this.autoStep.body.splice(index,1)
},
addCookieRow(row,index){
this.autoStep.cookies.splice(index+1,0,{id:'',value:''})
},
},
deleteCookieRow(row,index){
this.autoStep.cookies.splice(index,1)
},
addHeaderRow(row,index){
this.autoStep.headers.splice(index+1,0,{id:'',value:''})
},
},
deleteHeaderRow(row,index){
this.autoStep.headers.splice(index,1)
},
@ -562,14 +562,14 @@ import JsonViewer from 'vue-json-viewer'
var autoStep=this.autoStep
this.editSomeFields(this.editForm,'autoStep',JSON.stringify(autoStep));
},
sendMsgForTestSetting(){
sendMsgForTestSetting(){
var autoStepObj=this.autoStep;
if(!autoStepObj.url){
this.$notify({position:'bottom-left',showClose:true,message:'url不能为空',type: 'error'})
this.$notify({position:'bottom-left',showClose:true,message:'url不能为空',type: 'error'})
return;
}
var env=initEnvVars(this.xmTestCasedb?this.xmTestCasedb.envJson:null,this.xmTestPlan ?this.xmTestPlan.envJson:null);
var axiosObj=autoStepToAxios(autoStepObj,env)
var axiosObj=autoStepToAxios(autoStepObj,env)
//axiosObj.headers['Access-Control-Allow-Origin']='*'
//axios.defaults.withCredentials = true // cookie
//axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
@ -579,14 +579,14 @@ import JsonViewer from 'vue-json-viewer'
var func=new Function('res','env',autoStepObj.expectResult)
var result=func(res,env)
if(result==true){
this.$notify({position:'bottom-left',showClose:true,message:'成功',type: 'success'})
this.$notify({position:'bottom-left',showClose:true,message:'成功',type: 'success'})
}else{
this.$notify({position:'bottom-left',showClose:true,message:'失败',type: 'error'})
this.$notify({position:'bottom-left',showClose:true,message:'失败',type: 'error'})
}
}else{
this.$notify({position:'bottom-left',showClose:true,message:'执行完毕',type: res.status==200?'success':'error'})
this.$notify({position:'bottom-left',showClose:true,message:'执行完毕',type: res.status==200?'success':'error'})
}
})
@ -607,12 +607,12 @@ import JsonViewer from 'vue-json-viewer'
this.editForm.casedbId=this.xmTestCasedb.id
this.editForm.casedbName=this.xmTestCasedb.name
}
if(this.xmProduct && this.xmProduct.id){
this.editForm.productId=this.xmProduct.id
this.editForm.productName=this.xmProduct.productName
this.editForm.productName=this.xmProduct.productName
}
if(this.xmMenu && this.xmMenu.menuId){
this.editForm.productId=this.xmMenu.productId
this.editForm.productName=this.xmMenu.productName
@ -620,7 +620,7 @@ import JsonViewer from 'vue-json-viewer'
this.editForm.menuName=this.xmMenu.menuName
}
this.editForm.id=null
}
if(!this.editForm.autoStep){
@ -640,19 +640,19 @@ import JsonViewer from 'vue-json-viewer'
if(fieldName=='funcId'){
params[fieldName]=$event.id
params['funcName']=$event.name
}else if(fieldName=='menuId'){
}else if(fieldName=='menuId'){
params[fieldName]=$event.menuId
params['menuName']=$event.menuName
}else if(fieldName=='cuserid'){
params[fieldName]=$event[0].userid
params['cusername']=$event[0].username
params['cbranchId']=$event[0].branchId
params['cusername']=$event[0].username
params['cbranchId']=$event[0].branchId
}else if(fieldName=='luserid'){
params[fieldName]=$event[0].userid
params['lusername']=$event[0].username
params['lusername']=$event[0].username
}else{
params[fieldName]=$event
}
}
var func = editSomeFieldsXmTestCase
func(params).then(res=>{
let tips = res.data.tips;
@ -692,13 +692,13 @@ import JsonViewer from 'vue-json-viewer'
this.editForm.productName=testCasedb.productName
}
this.testCasedbVisible=false;
}
},//end method
mounted() {
this.$nextTick(() => {
initDicts(this);
this.initData()
this.initData()
});
}
}
@ -707,4 +707,4 @@ import JsonViewer from 'vue-json-viewer'
<style scoped>
</style>
</style>

60
src/views/xm/core/xmTestCase/XmTestCaseMng.vue

@ -2,15 +2,15 @@
<section>
<el-row :gutter="10">
<el-col :span="6">
<xm-func-select v-if="xmProductCpd" :xm-product="xmProductCpd" @row-click="onXmFuncRowClick">
<xm-func-select v-if="xmProductCpd" :xm-product="xmProductCpd" @row-click="onXmFuncRowClick">
</xm-func-select>
</el-col>
<el-col :span="18">
<el-row>
<el-input v-model="filters.key" style="width: 20%;" placeholder="名称 按回车" @keyup.enter.native="searchXmTestCases" clearable></el-input>
<mdp-select placeholder="用例状态" style="width:15%;" clearable :dict="dicts['testCaseStatus']" v-model="filters.caseStatus" effect="dark"></mdp-select>
<mdp-select placeholder="测试方式" style="width:15%;" clearable :dict="dicts['testType']" v-model="filters.testType" effect="dark"></mdp-select>
<mdp-select placeholder="用例状态" style="width:15%;" clearable item-code="testCaseStatus" v-model="filters.caseStatus" effect="dark"></mdp-select>
<mdp-select placeholder="测试方式" style="width:15%;" clearable item-code="testType" v-model="filters.testType" effect="dark"></mdp-select>
<el-button v-loading="load.list" :disabled="load.list==true" @click="searchXmTestCases" icon="el-icon-search">查询</el-button>
<span style="float:right;">
@ -32,45 +32,45 @@
<template slot-scope="scope">
<span> <el-link @click="showEdit( scope.row,scope.$index)">{{scope.row.caseName}} </el-link></span>
<span class="tool-bar">
<el-button @click="copyOne(scope.row,scope.$index)" icon="el-icon-document-copy" circle title="复制一行"></el-button>
<el-button @click="copyOne(scope.row,scope.$index)" icon="el-icon-document-copy" circle title="复制一行"></el-button>
</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="caseStatus" label="状态" width="100" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" :dict="dicts['testCaseStatus']" v-model="scope.row.caseStatus" effect="dark" @change="editSomeFields(scope.row,'caseStatus',$event)"></mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" item-code="testCaseStatus" v-model="scope.row.caseStatus" effect="dark" @change="editSomeFields(scope.row,'caseStatus',$event)"></mdp-select-tag>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="testType" label="测试方式" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" :dict="dicts['testType']" v-model="scope.row.testType" effect="dark" @change="editSomeFields(scope.row,'testType',$event)"></mdp-select-tag>
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" item-code="testType" v-model="scope.row.testType" effect="dark" @change="editSomeFields(scope.row,'testType',$event)"></mdp-select-tag>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="funcName" label="模块" min-width="150" show-overflow-tooltip>
<template slot-scope="scope">
<span> {{scope.row.funcName}} </span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="verNum" label="版本号" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<span> {{scope.row.verNum}} </span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="cusername" label="负责人姓名" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-user-xm @visible-change="selectVisible(scope.row,$event)" userid-key="cuserid" username-key="cusername" :product-id="xmProductCpd?xmProductCpd.id:null" v-model="scope.row" @change="editSomeFields(scope.row,'cuserid',$event)">
<template slot-scope="scope">
<mdp-select-user-xm @visible-change="selectVisible(scope.row,$event)" userid-key="cuserid" username-key="cusername" :product-id="xmProductCpd?xmProductCpd.id:null" v-model="scope.row" @change="editSomeFields(scope.row,'cuserid',$event)">
</mdp-select-user-xm>
</template>
</el-table-column>
</el-table-column>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</el-row>
</el-col>
</el-row>
<el-row>
<!--编辑 XmTestCase 测试用例界面-->
<el-dialog title="编辑测试用例" :visible.sync="editFormVisible" fullscreen width="90%" top="20px" append-to-body :close-on-click-modal="false">
@ -109,7 +109,7 @@ export default {
}
if(this.xmTestCasedb && this.xmTestCasedb.id){
return {id:this.xmTestCasedb.productId,productName:this.xmTestCasedb.productName}
}
}
if(this.xmMenu && this.xmMenu.id){
return {id:this.xmMenu.productId,productName:this.xmMenu.productName}
}
@ -210,12 +210,12 @@ export default {
}
if(this.filters.key){
params.key=this.filters.key
}
}
if(this.filters.caseStatus){
params.caseStatus=this.filters.caseStatus
}
if(this.filters.testType){
params.testType=this.filters.testType
}
@ -229,7 +229,7 @@ export default {
if(this.xmProduct && this.xmProduct.id){
params.productId=this.xmProduct.id
}
if(this.xmMenu && this.xmMenu.menuId){
params.menuId=this.xmMenu.menuId
}
@ -332,7 +332,7 @@ export default {
}else{
params[fieldName]=$event
}
var func = editSomeFieldsXmTestCase
func(params).then(res=>{
let tips = res.data.tips;
@ -353,11 +353,11 @@ export default {
this.$emit('row-click',row, event, column);// @row-click="rowClick"
},
initData: function(){
if(this.scene){
this.filters.caseStatus='1'
}
this.filters.xmProduct=this.xmProduct
}
this.filters.xmProduct=this.xmProduct
},
onXmFuncRowClick(row){
this.filters.xmFunc=row
@ -368,7 +368,7 @@ export default {
this.editFormBak={...this.editForm}
},
copyOne(row,index){
var params={...row}
params.cuserid=this.userInfo.userid
params.cusername=this.userInfo.username
@ -377,7 +377,7 @@ export default {
params.caseName=row.caseName+'V'
addXmTestCase(params).then(res=>{
var tips = res.data.tips
if(tips.isOk){
if(tips.isOk){
var row2=res.data.data
this.xmTestCases.splice(index+1,0,row2)
this.pageInfo.total=this.pageInfo.total+1
@ -403,4 +403,4 @@ export default {
</script>
<style scoped>
</style>
</style>

34
src/views/xm/core/xmTestCase/XmTestCaseSelect.vue

@ -1,23 +1,23 @@
<template>
<section>
<el-row :gutter="10">
<el-col :span="6">
<xm-func-select v-if="xmTestCasedb && xmTestCasedb.productId" class="padding-right padding-left" :xm-product="{id:xmTestCasedb.productId,productName:xmTestCasedb.productName}" @row-click="onXmFuncRowClick">
<xm-func-select v-if="xmTestCasedb && xmTestCasedb.productId" class="padding-right padding-left" :xm-product="{id:xmTestCasedb.productId,productName:xmTestCasedb.productName}" @row-click="onXmFuncRowClick">
</xm-func-select>
</el-col>
<el-col :span="18">
<el-row>
<el-checkbox v-if="xmTestPlan && xmTestPlan.id" true-label="1" false-label="" v-model="filters.notJoinPlan" :title="'查询未曾加入计划【'+xmTestPlan.name+'】的测试用例'"> 未加入 </el-checkbox>
<el-input v-model="filters.key" style="width: 20%;" placeholder="模糊查询"></el-input>
<mdp-select label="状态" style="width:15%;" clearable placeholder="用例状态" :dict="dicts['testCaseStatus']" v-model="filters.caseStatus"></mdp-select>
<mdp-select placeholder="测试方式" style="width:15%;" clearable :dict="dicts['testType']" v-model="filters.testType" effect="dark"></mdp-select>
<mdp-select label="状态" style="width:15%;" clearable placeholder="用例状态" item-code="testCaseStatus" v-model="filters.caseStatus"></mdp-select>
<mdp-select placeholder="测试方式" style="width:15%;" clearable item-code="testType" v-model="filters.testType" effect="dark"></mdp-select>
<el-button v-loading="load.list" :disabled="load.list==true" @click="searchXmTestCases" icon="el-icon-search">查询</el-button>
<span style="float:right;">
<el-button type="primary" v-loading="load.edit" @click="selectConfirm" :disabled="this.sels.length===0 || load.edit==true" icon="el-icon-finished">确认选择</el-button>
</span>
</el-row>
@ -36,23 +36,23 @@
<span> {{scope.row.caseName}} </span>
</template>
</el-table-column>
<el-table-column prop="caseStatus" label="状态" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag :dict="dicts['testCaseStatus']" v-model="scope.row.caseStatus" effect="dark" :disabled="true"></mdp-select-tag>
<mdp-select-tag item-code="testCaseStatus" v-model="scope.row.caseStatus" effect="dark" :disabled="true"></mdp-select-tag>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="testType" label="测试方式" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag :dict="dicts['testType']" v-model="scope.row.testType" effect="dark" :disabled="true"></mdp-select-tag>
<mdp-select-tag item-code="testType" v-model="scope.row.testType" effect="dark" :disabled="true"></mdp-select-tag>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="caseRemark" label="备注" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<span> {{scope.row.caseRemark}} </span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="moduleName" label="模块名称" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<span> {{scope.row.moduleName}} </span>
@ -62,7 +62,7 @@
<template slot-scope="scope">
<span> {{scope.row.cusername}} </span>
</template>
</el-table-column>
</el-table-column>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</el-row>
@ -328,7 +328,7 @@ export default {
selectConfirm(){
this.$emit('select',this.sels)
},
onXmFuncRowClick(row){
this.filters.xmFunc=row
this.searchXmTestCases();
@ -349,4 +349,4 @@ export default {
</script>
<style scoped>
</style>
</style>

46
src/views/xm/core/xmTestCasedb/XmTestCasedbEdit.vue

@ -1,37 +1,37 @@
<template>
<section class="padding">
<section class="padding">
<el-row ref="table">
<!--编辑界面 XmTestCasedb 测试用例库-->
<!--编辑界面 XmTestCasedb 测试用例库-->
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editFormRef" label-position="left">
<el-form-item label="归属产品" prop="productName">
<span v-if="opType=='add'">
<xm-product-select v-if="!xmProduct" style="display:inline;" :auto-select="false" :link-project-id="selProject?selProject.id:null" @row-click="onProductSelected" @clear="clearProduct"></xm-product-select>
<div v-else>{{editForm.productName}}</div>
</span>
</span>
<div v-else>{{editForm.productName}}</div>
</el-form-item>
</el-form-item>
<el-form-item label="用例库名称" prop="name">
<my-input v-model="editForm.name" placeholder="用例库名称" :maxlength="255" @change="editSomeFields(editForm,'name',$event)"></my-input>
</el-form-item>
</el-form-item>
<el-row class="padding">
<el-col :span="8">
<el-form-item prop="cuserid" label-width="0px">
<mdp-select-user-xm label="负责人" userid-key="cuserid" username-key="cusername" v-model="editForm" @change="editSomeFields(editForm,'cuserid',$event)" :product-id="editForm.productId" :project-id="selProject?selProject.id:null"></mdp-select-user-xm>
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="8">
<mdp-select show-style="x" label="状态" :dict="dicts['casedbStatus']" v-model="editForm.status" @change="editSomeFields(editForm,'status',$event)"></mdp-select>
<mdp-select show-style="x" label="状态" item-code="casedbStatus" v-model="editForm.status" @change="editSomeFields(editForm,'status',$event)"></mdp-select>
</el-col>
<el-col :span="8">
<mdp-date-x label="创建日期" v-model="editForm.ctime" @change="editSomeFields(editForm,'ctime',$event)"></mdp-date-x>
</el-col>
</el-row>
</el-row>
</el-form>
</el-row>
@ -48,7 +48,7 @@
import { initDicts, addXmTestCasedb,editXmTestCasedb,editSomeFieldsXmTestCasedb } from '@/api/xm/core/xmTestCasedb';
import { mapGetters } from 'vuex'
import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//
import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//
@ -70,11 +70,11 @@ import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//修
}
},
'visible':function(visible) {
'visible':function(visible) {
if(visible==true){
this.initData()
}
}
}
},
data() {
return {
@ -112,7 +112,7 @@ import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//修
saveSubmit: function () {
this.$refs.editFormRef.validate((valid) => {
if (valid) {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.load.edit=true
let params = Object.assign({}, this.editForm);
var func=addXmTestCasedb
@ -167,7 +167,7 @@ import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//修
}else{
params[fieldName]=$event
}
var func = editSomeFieldsXmTestCasedb
func(params).then(res=>{
let tips = res.data.tips;
@ -180,12 +180,12 @@ import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//修
}).catch((e)=>Object.assign(this.editForm,this.editFormBak))
},
clearProduct(){
clearProduct(){
this.editForm.productId=''
this.editForm.productName=''
},
onProductSelected(product){
},
onProductSelected(product){
this.editForm.productId=product.id
this.editForm.productName=product.productName
this.editForm.name=this.editForm.productName+"-测试库-V1.0"
@ -204,4 +204,4 @@ import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//修
<style scoped>
</style>
</style>

50
src/views/xm/core/xmTestPlan/XmTestPlanEdit.vue

@ -1,8 +1,8 @@
<template>
<section class="padding">
<section class="padding">
<el-row ref="table">
<!--编辑界面 XmTestPlan 测试计划-->
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editFormRef" label-position="left">
<!--编辑界面 XmTestPlan 测试计划-->
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editFormRef" label-position="left">
<el-form-item prop="name" label-width="0px">
<el-row class="padding-bottom">
<my-input v-model="editForm.name" placeholder="计划名称" :maxlength="255" @change="editSomeFields(editForm,'name',$event)"></my-input>
@ -16,36 +16,36 @@
<mdp-select-user-xm label="负责人" userid-key="cuserid" username-key="cusername" v-model="editForm" :project-id="editForm.projectId" :product-id="editForm.productId" @change="editSomeFields(editForm,'cuserid',$event)"></mdp-select-user-xm>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="状态" :dict="dicts['testPlanStatus']" v-model="editForm.status" @change="editSomeFields(editForm,'status',$event)"></mdp-select>
<mdp-select show-style="x" label="状态" item-code="testPlanStatus" v-model="editForm.status" @change="editSomeFields(editForm,'status',$event)"></mdp-select>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="测试方式" :dict="dicts['testType']" v-model="editForm.testType" @change="editSomeFields(editForm,'testType',$event)"></mdp-select>
<mdp-select show-style="x" label="测试方式" item-code="testType" v-model="editForm.testType" @change="editSomeFields(editForm,'testType',$event)"></mdp-select>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="测试结果" :dict="dicts['testPlanTcode']" v-model="editForm.tcode" @change="editSomeFields(editForm,'tcode',$event)"></mdp-select>
<mdp-select show-style="x" label="测试结果" item-code="testPlanTcode" v-model="editForm.tcode" @change="editSomeFields(editForm,'tcode',$event)"></mdp-select>
</el-col>
</el-row>
</el-row>
<el-form-item label="归属测试库" prop="casedbName" class="padding-top">
{{editForm.casedbName}}
</el-form-item>
</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">
</xm-project-select>
</span>
</span>
<div v-else>{{editForm.projectName}}</div>
</el-form-item>
</el-form-item>
<el-form-item label="归属产品" prop="productName">
{{editForm.productName}}
</el-form-item>
</el-form-item>
<el-form-item label="起止时间" prop="stime">
<mdp-date-range :auto-default="false" placeholder="选择日期" v-model="editForm" start-key="stime" end-key="etime" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd" @change="editSomeFields(editForm,'stime',editForm)"></mdp-date-range>
</el-form-item>
</el-form-item>
</el-form>
</el-row>
@ -64,7 +64,7 @@
import { initDicts, addXmTestPlan,editXmTestPlan,editSomeFieldsXmTestPlan } from '@/api/xm/core/xmTestPlan';
import { mapGetters } from 'vuex'
import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect';
import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//
export default {
name:'xmTestPlanEdit',
@ -84,11 +84,11 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}
},
'visible':function(visible) {
'visible':function(visible) {
if(visible==true){
this.initData()
}
}
}
},
data() {
return {
@ -106,7 +106,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
{ min: 2, max: 50, message: '长度在 2 到 50 个字符', trigger: 'change' },//
],
projectId: [
{ required: true, message: '项目不能为空', trigger: 'change' },
{ required: true, message: '项目不能为空', trigger: 'change' },
],
},
editForm: {
@ -131,7 +131,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
saveSubmit: function () {
this.$refs.editFormRef.validate((valid) => {
if (valid) {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.load.edit=true
let params = Object.assign({}, this.editForm);
var func=addXmTestPlan
@ -164,7 +164,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
if(this.opType=='edit'){
}else{
}else{
if(this.$refs['xmProjectSelect']) this.$refs['xmProjectSelect'].clearSelect()
}
this.editFormBak={...this.editForm}
@ -176,7 +176,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}
let params={};
params['ids']=[row].map(i=>i.id)
if(fieldName=='stime'){
params[fieldName]=$event.stime
params.etime=$event.etime
@ -217,4 +217,4 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
<style scoped>
</style>
</style>

38
src/views/xm/core/xmTestPlan/XmTestPlanListForProject.vue

@ -1,10 +1,10 @@
<template>
<section class="padding" ref="xmTestPlanTable">
<el-row>
<el-input v-model="filters.key" style="width: 20%;" placeholder="模糊查询" clearable></el-input>
<el-button v-loading="load.list" :disabled="load.list==true" @click="searchXmTestPlans" icon="el-icon-search">查询</el-button>
</el-row>
<el-row class="padding-top">
<!--列表 XmTestPlan 测试计划-->
@ -18,19 +18,19 @@
-->
<el-table-column prop="name" label="计划名称" min-width="250">
<template slot-scope="scope">
<el-link @click="select(scope.row)"> {{scope.row.name}} </el-link>
<el-link @click="select(scope.row)"> {{scope.row.name}} </el-link>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="projectName" label="项目" min-width="150">
<template slot-scope="scope">
<span> {{scope.row.projectName}} </span>
<span> {{scope.row.projectName}} </span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="status" label="状态" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag :dict="dicts['testPlanStatus']" v-model="scope.row.status" effect="dark" :disabled="true"></mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag item-code="testPlanStatus" v-model="scope.row.status" effect="dark" :disabled="true"></mdp-select-tag>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="stime" label="开始时间" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<span> {{scope.row.stime}} </span>
@ -40,14 +40,14 @@
<template slot-scope="scope">
<span> {{scope.row.etime}} </span>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="操作" width="120" fixed="right">
<template slot-scope="scope">
<el-button type="primary" @click="select(scope.row)">选择</el-button>
</template>
</el-table-column>
</el-table-column>
</el-table>
</el-row>
</el-row>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</section>
@ -57,12 +57,12 @@
import util from '@/common/js/util';//
import config from '@/common/config';//
import { initDicts,listXmTestPlan } from '@/api/xm/core/xmTestPlan';
import { initDicts,listXmTestPlan } from '@/api/xm/core/xmTestPlan';
import { mapGetters } from 'vuex'
export default {
name:'xmTestPlanSelect',
components: {
components: {
},
props:[],
computed: {
@ -182,12 +182,12 @@ export default {
}).catch( err => this.load.list = false );
},
//xmTestPlan
selsChange: function (sels) {
this.sels = sels;
},
rowClick: function(row, event, column){
this.editForm=row
this.editFormBak={...row};
@ -196,11 +196,11 @@ export default {
initData: function(){
},
open(){
this.visible=true
},
select(row){
select(row){
var key="xm-test-plan-info-"+row.id
sessionStorage.setItem(key,JSON.stringify(row))
this.$router.push({
@ -227,4 +227,4 @@ export default {
</script>
<style scoped>
</style>
</style>

66
src/views/xm/core/xmTestPlan/XmTestPlanMng.vue

@ -2,10 +2,10 @@
<section>
<el-row>
<el-input v-model="filters.key" style="width: 15%;" placeholder="模糊查询" clearable></el-input>
<mdp-select style="width:15%;" clearable placeholder="状态" :dict="dicts['testPlanStatus']" v-model="filters.status" effect="dark"></mdp-select>
<mdp-select style="width:15%;" clearable placeholder="状态" item-code="testPlanStatus" v-model="filters.status" effect="dark"></mdp-select>
<mdp-select style="width:15%;" clearable placeholder="结果" :dict="dicts['testPlanTcode']" v-model="filters.tcode" effect="dark" ></mdp-select>
<mdp-select placeholder="测试方式" style="width:15%;" clearable :dict="dicts['testType']" v-model="filters.testType" effect="dark"></mdp-select>
<mdp-select style="width:15%;" clearable placeholder="结果" item-code="testPlanTcode" v-model="filters.tcode" effect="dark" ></mdp-select>
<mdp-select placeholder="测试方式" style="width:15%;" clearable item-code="testType" v-model="filters.testType" effect="dark"></mdp-select>
<el-button v-loading="load.list" :disabled="load.list==true" @click="searchXmTestPlans" icon="el-icon-search">查询</el-button>
<span style="float:right;">
@ -26,56 +26,56 @@
<el-table-column prop="name" label="计划名称" min-width="250">
<template slot-scope="scope">
<span> <el-link type="primary" @click="goToTestPlanCase(scope.row)"> {{scope.row.name}}</el-link> </span>
<span class="tool-bar">
<el-button @click="showEdit(scope.row)" icon="el-icon-edit" circle title="编辑"></el-button>
<span class="tool-bar">
<el-button @click="showEdit(scope.row)" icon="el-icon-edit" circle title="编辑"></el-button>
</span>
</template>
</el-table-column>
<el-table-column prop="projectName" label="项目" min-width="120">
</el-table-column>
</el-table-column>
<el-table-column prop="projectName" label="项目" min-width="120">
</el-table-column>
<el-table-column prop="cusername" label="负责人" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-user-xm userid-key="cuserid" username-key="cusername" v-model="scope.row" :disabled="true">
<template slot-scope="scope">
<mdp-select-user-xm userid-key="cuserid" username-key="cusername" v-model="scope.row" :disabled="true">
</mdp-select-user-xm>
</template>
</el-table-column>
<el-table-column prop="totalCases" label="用例数" width="120" show-overflow-tooltip>
</el-table-column>
</el-table-column>
<el-table-column prop="totalCases" label="用例数" width="120" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="status" label="状态" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag :dict="dicts['testPlanStatus']" v-model="scope.row.status" effect="dark" @change="editSomeFields(scope.row,'status',$event)"></mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag item-code="testPlanStatus" v-model="scope.row.status" effect="dark" @change="editSomeFields(scope.row,'status',$event)"></mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="testType" label="测试方式" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag :dict="dicts['testType']" v-model="scope.row.testType" effect="dark" @change="editSomeFields(scope.row,'testType',$event)"></mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag item-code="testType" v-model="scope.row.testType" effect="dark" @change="editSomeFields(scope.row,'testType',$event)"></mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="tcode" label="测试结果" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag :dict="dicts['testPlanTcode']" v-model="scope.row.tcode" effect="dark" @change="editSomeFields(scope.row,'tcode',$event)"></mdp-select-tag>
<mdp-select-tag item-code="testPlanTcode" v-model="scope.row.tcode" effect="dark" @change="editSomeFields(scope.row,'tcode',$event)"></mdp-select-tag>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="totalCases" label="进度" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<template slot-scope="scope">
<el-tooltip :open-delay="300" :content="'总用例数:'+scope.row.totalCases+' 成功:'+scope.row.okCases +' 失败:'+scope.row.errCases+' 忽略:'+scope.row.igCases+' 阻塞:'+scope.row.blCases">
<el-progress :stroke-width="22" :text-inside="true" :status="scope.row.totalCases>0 && scope.row.errCases<=0 ?'success':'exception'" :percentage="scope.row.totalCases>0?parseInt((parseInt(scope.row.okCases)+parseInt(scope.row.igCases)+parseInt(scope.row.errCases)+parseInt(scope.row.blCases))*100/parseInt(scope.row.totalCases)):0"></el-progress>
</el-tooltip>
</el-tooltip>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="totalCases" label="统计" width="80" show-overflow-tooltip>
<template slot-scope="scope">
<template slot-scope="scope">
<el-tooltip content="点击统计进度"
><el-button
><el-button
icon="el-icon-video-play"
@click.stop="calcXmTestPlan(scope.row)"
></el-button
></el-tooltip>
></el-tooltip>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="stime" label="开始时间" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<span> {{scope.row.stime}} </span>
@ -85,7 +85,7 @@
<template slot-scope="scope">
<span> {{scope.row.etime}} </span>
</template>
</el-table-column>
</el-table-column>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</el-row>
@ -348,7 +348,7 @@ export default {
initData: function(){
},
goToTestPlanCase(row){
goToTestPlanCase(row){
var key="xm-test-plan-info-"+row.id
sessionStorage.setItem(key,JSON.stringify(row))
this.$router.push({
@ -360,7 +360,7 @@ export default {
})
},
calcXmTestPlan(row){
calcXmTestPlan({id:row.id}).then(res=>{
calcXmTestPlan({id:row.id}).then(res=>{
var tips=res.data.tips
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
if(tips.isOk){
@ -384,4 +384,4 @@ export default {
</script>
<style scoped>
</style>
</style>

40
src/views/xm/core/xmTestPlan/XmTestPlanSelect.vue

@ -1,11 +1,11 @@
<template>
<section class="page-container padding" ref="xmTestPlanTable">
<el-dialog append-to-body modal-append-to-body width="60%" top="20px" :visible.sync="visible">
<el-dialog append-to-body modal-append-to-body width="60%" top="20px" :visible.sync="visible">
<el-row>
<el-input v-model="filters.key" style="width: 20%;" placeholder="模糊查询" clearable></el-input>
<el-button v-loading="load.list" :disabled="load.list==true" @click="searchXmTestPlans" icon="el-icon-search">查询</el-button>
</el-row>
<el-row class="padding-top">
<!--列表 XmTestPlan 测试计划-->
@ -19,16 +19,16 @@
-->
<el-table-column prop="name" label="计划名称" min-width="250">
<template slot-scope="scope">
<span> {{scope.row.name}} </span>
<span> {{scope.row.name}} </span>
</template>
</el-table-column>
<el-table-column prop="projectName" label="项目" min-width="120">
</el-table-column>
</el-table-column>
<el-table-column prop="projectName" label="项目" min-width="120">
</el-table-column>
<el-table-column prop="status" label="状态" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag :dict="dicts['testPlanStatus']" v-model="scope.row.status" effect="dark" :disabled="true"></mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag item-code="testPlanStatus" v-model="scope.row.status" effect="dark" :disabled="true"></mdp-select-tag>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="stime" label="开始时间" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<span> {{scope.row.stime}} </span>
@ -38,15 +38,15 @@
<template slot-scope="scope">
<span> {{scope.row.etime}} </span>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="操作" width="120" fixed="right">
<template slot-scope="scope">
<el-button type="primary" @click="select(scope.row)">选择</el-button>
</template>
</el-table-column>
</el-table-column>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</el-row>
</el-row>
</el-dialog>
</section>
</template>
@ -55,12 +55,12 @@
import util from '@/common/js/util';//
import config from '@/common/config';//
import { initDicts,listXmTestPlan } from '@/api/xm/core/xmTestPlan';
import { initDicts,listXmTestPlan } from '@/api/xm/core/xmTestPlan';
import { mapGetters } from 'vuex'
export default {
name:'xmTestPlanSelect',
components: {
components: {
},
props:['casedbId','productId','projectId'],
computed: {
@ -166,7 +166,7 @@ export default {
}
if(this.casedbId){
params.casedbId=this.casedbId
}
}
if(this.productId){
params.productId=this.productId
}
@ -184,12 +184,12 @@ export default {
}).catch( err => this.load.list = false );
},
//xmTestPlan
selsChange: function (sels) {
this.sels = sels;
},
rowClick: function(row, event, column){
this.editForm=row
this.editFormBak={...row};
@ -198,7 +198,7 @@ export default {
initData: function(){
},
open(){
this.visible=true
},
@ -222,4 +222,4 @@ export default {
</script>
<style scoped>
</style>
</style>

78
src/views/xm/core/xmTestPlanCase/TestStepResult.vue

@ -1,7 +1,7 @@
<template>
<section>
<el-row>
<el-form ref="extInfosRef">
<section>
<el-row>
<el-form ref="extInfosRef">
<!-- 扩展字段[{name:'中文名称',id:'编号',value:'值',remark:'备注',type:'支持简单的1-普通文本2-数字,3-日期,8-富文本,9单图文,15-是否'}] -->
<el-row>
<el-col :span="1">
@ -9,7 +9,7 @@
</el-col>
<el-col :span="11">
操作
</el-col>
</el-col>
<el-col :span="8">
实际结果
</el-col>
@ -23,42 +23,42 @@
<el-divider></el-divider>
<div v-for="(item, index) in extInfosList" :key="index">
<el-row >
<el-col :span="1">
{{index+1}}
</el-col>
<el-col :span="11">
<span><span></span>{{item.op}}</span><br/>
<span><span style="color:#C0C4CC;">预期</span>{{item.eresult}}</span>
</el-col>
</el-col>
<el-col :span="8">
<my-input class="padding-right" v-model="item.aresult" clearable placeholder="步骤结果"></my-input>
<my-input class="padding-right" v-model="item.aresult" clearable placeholder="步骤结果"></my-input>
</el-col>
<el-col :span="3">
<mdp-select show-style="x" label="结果" :dict="dicts['testStepTcode']" v-model="item.tcode" :get-icon="getExecStatusIcon"></mdp-select>
</el-col>
<el-col :span="1">
<el-col :span="3">
<mdp-select show-style="x" label="结果" item-code="testStepTcode" v-model="item.tcode" :get-icon="getExecStatusIcon"></mdp-select>
</el-col>
<el-col :span="1">
<slot name="addBug">
<el-button @click="addBug(item,index)" icon="el-icon-plus" circle></el-button>
<el-button @click="addBug(item,index)" icon="el-icon-plus" circle></el-button>
</slot>
</el-col>
</el-row>
</el-col>
</el-row>
</div>
<el-divider v-if="extInfosList.length>0"></el-divider>
</el-form>
</el-form>
</el-row>
</section>
</template>
<script>
<script>
import util from '@/common/js/util';//
import { mapGetters } from 'vuex'
import { initDicts } from '@/api/xm/core/xmTestPlanCase';
import MyInput from '@/components/MDinput/index';
export default {
export default {
name: 'testStepConfig',
props:['value','unConfig'],
computed: {
@ -68,22 +68,22 @@
},
watch:{
value(val){
this.initData();
},
extInfosList:{
deep:true,
handler(val,oldVal){
handler(val,oldVal){
if(this.value instanceof Array){
this.$emit("input",val)
}else{
}else{
this.$emit("input",JSON.stringify(val))
}
}
},
},
},
data() {
return{
data() {
return{
dicts:{
testStepTcode:[],
},
@ -91,14 +91,14 @@
}
},//end data
methods: {
methods: {
...util,
save(){
if(this.value instanceof Array){
this.$emit("finish",this.extInfosList)
}else{
}else{
this.$emit("finish",JSON.stringify(this.extInfosList))
}
}
},
addExtInfosFirstItem(){
if(!this.extInfosList){
@ -106,7 +106,7 @@
}
this.extInfosList.push({id:'',op:'',eresult:'',aresult:'',tcode:'0'})
},
addExtInfosItem(item,index){
addExtInfosItem(item,index){
this.extInfosList.splice(index+1,0,{id:'',op:'',eresult:'',aresult:'',tcode:'0'})
},
removeExtInfosItem(item,index){
@ -123,10 +123,10 @@
this.extInfosList=[]
}
},
getExecStatusIcon(execStatus){
var icons=['el-icon-arrow-up','el-icon-right','el-icon-check','el-icon-minus','el-icon-close'];
if(!execStatus){
return icons[0]
@ -136,26 +136,26 @@
addBug(item,index){
if(this.value instanceof Array){
this.$emit("add-bug",val)
}else{
}else{
this.$emit("add-bug",JSON.stringify(val))
}
}
}
},//end methods
components: {
components: {
MyInput
},
mounted() {
mounted() {
this.$nextTick(()=>{
initDicts(this)
})
this.initData();
}
}
</script>
<style lang="scss" scoped>
</style>
</style>

258
src/views/xm/core/xmTestPlanCase/XmTestPlanCaseEdit.vue

@ -1,41 +1,41 @@
<template>
<section >
<section >
<el-row>
<!--编辑界面 XmTestPlanCase 测试计划与用例关系表-->
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editFormRef" label-position="left" >
<!--编辑界面 XmTestPlanCase 测试计划与用例关系表-->
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editFormRef" label-position="left" >
<el-row ref="table">
<el-col :span="6" class="border padding">
<el-form-item label="测试库" prop="casedbName">
{{editForm.casedbName?editForm.casedbName:editForm.casedbId }}
</el-form-item>
{{editForm.casedbName?editForm.casedbName:editForm.casedbId }}
</el-form-item>
<el-form-item label="归属计划" prop="planId">
{{editForm.planId?editForm.planId:editForm.planId }}
</el-form-item>
{{editForm.planId?editForm.planId:editForm.planId }}
</el-form-item>
<el-form-item label="归属项目" prop="projectId">
{{editForm.projectId?editForm.projectId:editForm.projectId }}
</el-form-item>
{{editForm.projectId?editForm.projectId:editForm.projectId }}
</el-form-item>
<el-form-item label="归属产品" prop="productId">
{{editForm.productName?editForm.productName:editForm.productId }}
</el-form-item>
{{editForm.productName?editForm.productName:editForm.productId }}
</el-form-item>
<el-form-item label="关联模块" prop="menuName">
{{editForm.funcName?editForm.funcName:'暂无关联需求'}}
</el-form-item>
{{editForm.funcName?editForm.funcName:'暂无关联需求'}}
</el-form-item>
<el-form-item label="关联需求" prop="menuName">
{{editForm.menuName?editForm.menuName:'暂无关联需求'}} <el-button type="text" @click="menuFormVisible=true">查看需求</el-button>
</el-form-item>
</el-form-item>
<el-form-item label="测试方式" prop="testType">
<mdp-select-tag placeholder="测试方式" clearable :dict="dicts['testType']" v-model="editForm.testType" effect="dark" @change="editSomeFields(editForm,'testType',$event)" :disabled="true"></mdp-select-tag>
</el-form-item>
<mdp-select-tag placeholder="测试方式" clearable item-code="testType" v-model="editForm.testType" effect="dark" @change="editSomeFields(editForm,'testType',$event)" :disabled="true"></mdp-select-tag>
</el-form-item>
<el-form-item label="版本号" prop="verNum">
<el-input v-model="editForm.verNum" placeholder="版本号" :maxlength="50" @change="editSomeFields(editForm,'verNum',$event)"></el-input>
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="18" class="border padding-left padding-right padding-top">
<el-form-item label="" prop="caseName" label-width="0px">
<el-form-item label="" prop="caseName" label-width="0px">
<el-row>
名称{{editForm.caseName}}<span class="label-font-color"> &nbsp;&nbsp; {{editForm.caseId}} </span>
名称{{editForm.caseName}}<span class="label-font-color"> &nbsp;&nbsp; {{editForm.caseId}} </span>
</el-row>
<el-row v-if="editForm.testType=='1'" class="padding-bottom">
<div style="display:flex;">
@ -46,34 +46,34 @@
</div>
</el-row>
<el-row class="padding">
<el-col :span="6">
<el-col :span="6">
<mdp-select-user-xm label="执行人" userid-key="execUserid" username-key="execUsername" v-model="editForm" @change="editSomeFields(editForm,'execUserid',$event)"></mdp-select-user-xm>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="优先级" :dict="dicts['priority']" v-model="editForm.priority" @change="editSomeFields(editForm,'priority',$event)"></mdp-select>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="执行结果" :dict="dicts['testStepTcode']" v-model="editForm.execStatus" :get-icon="getExecStatusIcon" @change="editSomeFields(editForm,'execStatus',$event)"></mdp-select>
</el-col>
<el-col :span="6">
<el-button v-if="opType!='add'" style="margin-top:12px;float:right;" @click="$emit('next')" type="primary">下一条</el-button>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="优先级" item-code="priority" v-model="editForm.priority" @change="editSomeFields(editForm,'priority',$event)"></mdp-select>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="执行结果" item-code="testStepTcode" v-model="editForm.execStatus" :get-icon="getExecStatusIcon" @change="editSomeFields(editForm,'execStatus',$event)"></mdp-select>
</el-col>
<el-col :span="6">
<el-button v-if="opType!='add'" style="margin-top:12px;float:right;" @click="$emit('next')" type="primary">下一条</el-button>
<el-row v-if="opType=='add'">
<el-button @click.native="handleCancel">取消</el-button>
<el-button v-loading="load.edit" type="primary" @click.native="saveSubmit" :disabled="load.edit==true">提交</el-button>
</el-row>
</el-col>
</el-col>
</el-row>
</el-form-item>
</el-form-item>
<el-tabs v-model="activateName" >
<el-tab-pane name="1" label="用例信息" >
<el-tab-pane name="1" label="用例信息" >
<el-row>
<el-col :span="6">
<el-row class="label-font-size">
用例状态
</el-row>
<el-row>
<mdp-select-tag :dict="dicts['testCaseStatus']" v-model="editForm.caseStatus" :disabled="true"></mdp-select-tag>
<mdp-select-tag item-code="testCaseStatus" v-model="editForm.caseStatus" :disabled="true"></mdp-select-tag>
</el-row>
</el-col>
<el-col :span="6">
@ -85,66 +85,66 @@
</el-row>
</el-col>
<el-col :span="6">
<el-row class="label-font-size">
用例类型
</el-row>
<el-row>
<mdp-select-tag :dict="dicts['caseType']" v-model="editForm.caseType" :disabled="true" ></mdp-select-tag>
<mdp-select-tag item-code="caseType" v-model="editForm.caseType" :disabled="true" ></mdp-select-tag>
</el-row>
</el-col>
<el-col :span="6">
<el-row class="label-font-size">
紧急程度
</el-row>
<el-row>
<mdp-select-tag :dict="dicts['priority']" v-model="editForm.cpriority" :disabled="true"></mdp-select-tag>
<mdp-select-tag item-code="priority" v-model="editForm.cpriority" :disabled="true"></mdp-select-tag>
</el-row>
</el-col>
</el-row>
<el-row class="padding-top">
</el-row>
<el-row class="padding-top">
<el-row class="label-font-size padding-top">
前置条件
</el-row>
</el-row>
<el-row class="padding">
{{editForm.preRemark?editForm.preRemark:'无'}}
</el-row>
</el-row>
</el-row>
<el-row class="padding-top">
<el-row class="padding-top">
<el-row class="label-font-size padding-top">
备注
</el-row>
</el-row>
<el-row class="padding">
{{editForm.caseRemark?editForm.caseRemark:'无'}}
</el-row>
</el-row>
</el-tab-pane>
<el-tab-pane name="21" label="测试步骤" v-if="editForm.testType!='1'">
<el-row>
</el-row>
</el-row>
</el-tab-pane>
<el-tab-pane name="21" label="测试步骤" v-if="editForm.testType!='1'">
<el-row>
<el-row class="label-font-size">
测试步骤
</el-row>
</el-row>
<el-row class="padding">
<test-step-result class="padding" v-model="editForm.testStep">
<el-button slot="addBug" @click="addBugVisible=true" icon="el-icon-plus" circle></el-button>
<el-button slot="addBug" @click="addBugVisible=true" icon="el-icon-plus" circle></el-button>
</test-step-result>
</el-row>
</el-row>
<el-row class="label-font-size">
执行备注
</el-row>
</el-row>
<el-row class="padding">
<el-input type="textarea" :rows="6" v-model="editForm.remark" placeholder="执行备注" :maxlength="2147483647" @change="editSomeFields(editForm,'remark',$event)"></el-input>
</el-row>
<el-row v-if="opType!='add' && editFormBak.testStep!=editForm.testStep" >
</el-row>
<el-row v-if="opType!='add' && editFormBak.testStep!=editForm.testStep" >
<el-button v-loading="load.edit" type="primary" @click.native="editSomeFields(editForm,'testStep',editForm.testStep)" :disabled="load.edit==true">保存测试步骤</el-button>
</el-row>
</el-row>
</el-tab-pane>
<el-tab-pane name="12" label="Params" v-if="editForm.testType=='1'">
<el-tab-pane name="12" label="Params" v-if="editForm.testType=='1'">
<el-form-item label="查询参数" class="field">
{{queryStrCpd||'暂无'}}
</el-form-item>
@ -154,14 +154,14 @@
<el-table-column
prop="id"
label="参数名"
min-width="200">
min-width="200">
</el-table-column>
<el-table-column
prop="value"
label="参数值"
min-width="250">
</el-table-column>
</el-table>
min-width="250">
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane name="13" label="Body" v-if="editForm.testType=='1'">
<mdp-select show-style="x" style="margin-bottom:10px;" class="padding" label="参数格式" v-model="autoStep.bodyType" :dict="dicts.autoTestBodyType" :disabled="true"></mdp-select>
@ -174,31 +174,31 @@
<el-table-column
prop="id"
label="参数名"
min-width="200">
min-width="200">
</el-table-column>
<el-table-column
prop="value"
label="参数值"
min-width="250">
</el-table-column>
</el-table>
min-width="250">
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane name="14" label="Cookie" v-if="editForm.testType=='1'">
<el-tab-pane name="14" label="Cookie" v-if="editForm.testType=='1'">
<el-table
:data="autoStep.cookies"
style="width: 100%">
<el-table-column
prop="id"
label="参数名"
min-width="200">
min-width="200">
</el-table-column>
<el-table-column
prop="value"
label="参数值"
min-width="250">
</el-table-column>
</el-table>
min-width="250">
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane name="15" label="Header" v-if="editForm.testType=='1'">
<el-table
@ -207,24 +207,24 @@
<el-table-column
prop="id"
label="参数名"
min-width="200">
min-width="200">
</el-table-column>
<el-table-column
prop="value"
label="参数值"
min-width="250">
</el-table-column>
</el-table>
min-width="250">
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane name="16" label="Auth" v-if="editForm.testType=='1'">
<mdp-select show-style="x" style="margin-bottom:10px;" class="padding" label="授权方式" v-model="autoStep.authType" :dict="dicts.autoTestAuthType" :disabled="true"></mdp-select>
<el-row v-if="autoStep.authType=='basic-auth'">
<el-form-item label="username" class="field">
<el-form-item label="username" class="field">
{{autoStep.authData.username}}
</el-form-item>
</el-form-item>
<el-form-item label="password" class="field">
{{autoStep.authData.password||'暂无'}}
</el-form-item>
@ -233,58 +233,58 @@
<el-row v-if="autoStep.authType=='bearer-token'">
<el-form-item label="Bearer" class="field">
{{autoStep.authData.bearerToken}}
</el-form-item>
</el-row>
</el-form-item>
</el-row>
</el-tab-pane>
<el-tab-pane name="17" label="响应" v-if="editForm.testType=='1'">
<el-row class="padding">可使用的变量 res={config:{协议配置},data:{接口返回的业务数据对象} ,headers:{协议头,key-value型},status:状态码如200/201 }</el-row>
<el-row class="padding">可使用的变量 env={key1:value1,key2:value2,等等},env为测试库环境变量及测试计划的环境变量合并重复则以测试计划的为准可通过env['key1']获取值</el-row>
<el-form-item label="成功与失败的逻辑判断">
<el-input type="textarea" :rows="10" v-model="autoStep.expectResult" placeholder="成功与失败的判断" readonly></el-input>
</el-form-item>
<el-input type="textarea" :rows="10" v-model="autoStep.expectResult" placeholder="成功与失败的判断" readonly></el-input>
</el-form-item>
<el-form-item label="例子">
if(res.status==200){<br/>
&nbsp;&nbsp;return true;<br/>
}else{<br/>
&nbsp;&nbsp;return false;<br/>
}<br/>
}<br/>
</el-form-item>
<el-form-item label="响应数据预览" >
<el-row> <el-checkbox v-model="resDataVisible">显示响应数据</el-checkbox></el-row>
<json-viewer v-if="resDataVisible==true" :value="testRes" copyable theme="my-awesome-json-theme"></json-viewer>
</el-form-item>
</el-tab-pane>
<el-tab-pane name="3" label="缺陷">
</el-tab-pane>
<el-tab-pane name="3" label="缺陷">
<xm-question-mng v-if="activateName=='3'" :xm-test-plan-case="editForm" :xm-product="{id:editForm.productId,productName:editForm.productName}" :sel-project="{id:editForm.projectId,name:editForm.projectName}"></xm-question-mng>
</el-tab-pane>
<el-tab-pane :label="'工时( '+( editForm.actWorkload||0)+' / '+( editForm.budgetWorkload||0)+' h )'" name="55">
<el-tab-pane :label="'工时( '+( editForm.actWorkload||0)+' / '+( editForm.budgetWorkload||0)+' h )'" name="55">
<xm-workload-record v-if="activateName=='55'" biz-type="4" :xm-test-plan-case="editForm" ></xm-workload-record>
</el-tab-pane>
<el-tab-pane name="4" label="附件">
</el-tab-pane>
</el-tabs>
</el-tabs>
</el-col>
</el-row>
</el-form>
</el-row>
</el-row>
</el-form>
</el-row>
<el-dialog append-to-body title="需求明细" :visible.sync="menuFormVisible" fullscreen width="80%" top="20px" :close-on-click-modal="false">
<xm-menu-edit :visible="menuFormVisible" :reload="true" :xm-menu="{menuId:editForm.menuId,menuName:editForm.menuName}" ></xm-menu-edit>
</el-dialog>
<!--新增 XmQuestion xm_question界面-->
<el-dialog title="新增缺陷" :visible.sync="addBugVisible" fullscreen width="90%" top="20px" append-to-body :close-on-click-modal="false">
<xm-question-add op-type="add" :xm-product="{id:editForm.productId,productName:editForm.productName}" :xm-test-plan-case="editForm" :sel-project=" {id:editForm.projectId,name:editForm.projectName} " :visible="addBugVisible" @cancel="addBugVisible=false" ></xm-question-add>
</el-dialog>
</el-dialog>
</section>
</template>
@ -302,7 +302,7 @@ import XmQuestionMng from '@/views/xm/core/xmQuestion/XmQuestionMng';//修改
import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//
import XmQuestionAdd from '../xmQuestion/XmQuestionEdit';//
import axios from 'axios'//访
import JsonViewer from 'vue-json-viewer'
import JsonViewer from 'vue-json-viewer'
export default {
name:'xmTestPlanCaseEdit',
@ -328,11 +328,11 @@ import JsonViewer from 'vue-json-viewer'
}
},
'visible':function(visible) {
'visible':function(visible) {
if(visible==true){
this.initData()
}
}
}
},
data() {
return {
@ -359,25 +359,25 @@ import JsonViewer from 'vue-json-viewer'
testRes:{},
resDataVisible:false,
resDataVisible:false,
autoStep:{
url:'',
method:'GET',
authType:'none',
authData:{
authData:{
},
bodyType:'json',
params:[],
body:[],
cookies:[],
expectResult:''
},
},
autoStepInit:{
url:'',
method:'',
authType:'',
authData:{
authData:{
},
bodyType:'',
params:[],
@ -400,7 +400,7 @@ import JsonViewer from 'vue-json-viewer'
saveSubmit: function () {
this.$refs.editFormRef.validate((valid) => {
if (valid) {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.load.edit=true
let params = Object.assign({}, this.editForm);
var func=addXmTestPlanCase
@ -424,7 +424,7 @@ import JsonViewer from 'vue-json-viewer'
}
});
},
initQueryStr(){
this.queryStr=this.autoStep.params.map(k=>k.id+'='+k.value).join("&")
},
@ -444,36 +444,36 @@ import JsonViewer from 'vue-json-viewer'
}else{
this.autoStep=JSON.parse(this.editForm.autoStep)
}
this.editFormBak={...this.editForm}
},
sendMsgForTestSetting(){
sendMsgForTestSetting(){
this.activateName='17'
var autoStepObj=this.autoStep
if(!autoStepObj.url){
this.$notify({position:'bottom-left',showClose:true,message:'url不能为空',type: 'error'})
this.$notify({position:'bottom-left',showClose:true,message:'url不能为空',type: 'error'})
return;
}
var env=initEnvVars(this.xmTestCasedb?this.xmTestCasedb.envJson:null,this.xmTestPlan ?this.xmTestPlan.envJson:null);
var axiosObj=autoStepToAxios(autoStepObj,env)
var axiosObj=autoStepToAxios(autoStepObj,env)
//axiosObj.headers['Access-Control-Allow-Origin']='*'
//axios.defaults.withCredentials = true // cookie
//axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
axios(axiosObj).then(res=>{
axios(axiosObj).then(res=>{
this.testRes=res
if(autoStepObj.expectResult){
var func=new Function('res','env',autoStepObj.expectResult)
var result=func(res,env)
if(result==true){
this.$notify({position:'bottom-left',showClose:true,message:'成功',type: 'success'})
this.$notify({position:'bottom-left',showClose:true,message:'成功',type: 'success'})
}else{
this.$notify({position:'bottom-left',showClose:true,message:'失败',type: 'error'})
this.$notify({position:'bottom-left',showClose:true,message:'失败',type: 'error'})
}
this.editSomeFields(this.editForm,'execStatus',result==true?"2":"4")
}else{
this.$notify({position:'bottom-left',showClose:true,message:'执行完毕',type: res.status==200?'success':'error'})
this.$notify({position:'bottom-left',showClose:true,message:'执行完毕',type: res.status==200?'success':'error'})
this.editSomeFields(this.editForm,'execStatus',res.status==200?"2":"4")
}
}).catch(res=>{
@ -481,18 +481,18 @@ import JsonViewer from 'vue-json-viewer'
var func=new Function('res','env',autoStepObj.expectResult)
var result=func(res,env)
if(result==true){
this.$notify({position:'bottom-left',showClose:true,message:'成功',type: 'success'})
this.$notify({position:'bottom-left',showClose:true,message:'成功',type: 'success'})
this.editSomeFields(this.editForm,'execStatus', "2")
}else{
if(res.code=='401'){
this.$notify({position:'bottom-left',showClose:true,message:'未登录,可能是授权数据过期',type: 'error'})
this.$notify({position:'bottom-left',showClose:true,message:'未登录,可能是授权数据过期',type: 'error'})
}else{
this.$notify({position:'bottom-left',showClose:true,message:'失败',type: 'error'})
this.$notify({position:'bottom-left',showClose:true,message:'失败',type: 'error'})
}
this.editSomeFields(this.editForm,'execStatus', "4")
this.editSomeFields(this.editForm,'execStatus', "4")
}
})
},
@ -505,7 +505,7 @@ import JsonViewer from 'vue-json-viewer'
}
let params={};
params['pkList']=[row].map(i=>{ return { caseId:i.caseId, planId:i.planId}})
if(fieldName=='execUserid'){
params.execUserid=$event[0].userid
params.execUsername=$event[0].username
@ -517,7 +517,7 @@ import JsonViewer from 'vue-json-viewer'
params.testStep=this.editForm.testStep
}
}
var func = editSomeFieldsXmTestPlanCase
func(params).then(res=>{
let tips = res.data.tips;
@ -530,7 +530,7 @@ import JsonViewer from 'vue-json-viewer'
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
}
}).catch((e)=>Object.assign(this.editForm,this.editFormBak))
},
},
getExecStatusIcon(execStatus){
var icons=['el-icon-arrow-up','el-icon-right','el-icon-check','el-icon-minus','el-icon-close'];
@ -542,7 +542,7 @@ import JsonViewer from 'vue-json-viewer'
},//end method
mounted() {
this.$nextTick(() => {
initDicts(this);
initDicts(this);
this.initData()
this.maxTableHeight = util.calcMaxHeight(this.$refs.table.$el)
});
@ -553,8 +553,8 @@ import JsonViewer from 'vue-json-viewer'
<style lang="scss" scoped>
.my-input input {
font-size: 28px !important;
font-size: 28px !important;
}
</style>
</style>

110
src/views/xm/core/xmTestPlanCase/XmTestPlanCaseMng.vue

@ -1,21 +1,21 @@
<template>
<section>
<el-row :gutter="10">
<el-row :gutter="10">
<el-col :span="6" v-if="!xmTestCase||!xmTestCase.id">
<xm-func-select v-if="xmProductCpd && xmProductCpd.id" :xm-product="xmProductCpd" @row-click="onXmFuncRowClick">
<xm-func-select v-if="xmProductCpd && xmProductCpd.id" :xm-product="xmProductCpd" @row-click="onXmFuncRowClick">
</xm-func-select>
</el-col>
<el-col :span="!xmTestCase||!xmTestCase.id?18:24">
<el-row>
<el-input v-model="filters.key" style="width: 15%;" placeholder="模糊查询" clearable></el-input>
<mdp-select style="width:15%;" placeholder="用例状态" clearable :dict="dicts['testCaseStatus']" v-model="filters.caseStatus" effect="dark"></mdp-select>
<mdp-select placeholder="测试方式" style="width:15%;" clearable :dict="dicts['testType']" v-model="filters.testType" effect="dark"></mdp-select>
<mdp-select style="width:15%;" placeholder="用例状态" clearable item-code="testCaseStatus" v-model="filters.caseStatus" effect="dark"></mdp-select>
<mdp-select placeholder="测试方式" style="width:15%;" clearable item-code="testType" v-model="filters.testType" effect="dark"></mdp-select>
<mdp-select style="width:15%;" placeholder="执行结果" clearable :dict="dicts['testStepTcode']" v-model="filters.execStatus" effect="dark"></mdp-select>
<mdp-select style="width:15%;" placeholder="执行结果" clearable item-code="testStepTcode" v-model="filters.execStatus" effect="dark"></mdp-select>
<el-button v-loading="load.list" :disabled="load.list==true" @click="searchXmTestPlanCases" icon="el-icon-search">查询</el-button>
<span style="float:right;" v-if="!xmTestCase||!xmTestCase.id">
<el-button type="primary" @click="batchExec" icon="el-icon-video-play">批量执行</el-button>
<el-button type="primary" @click="batchExec" icon="el-icon-video-play">批量执行</el-button>
<el-button type="primary" @click="showAdd" icon="el-icon-plus">将用例纳入计划</el-button>
<el-button type="danger" v-loading="load.del" @click="batchDel" :disabled="this.sels.length===0 || load.del==true" icon="el-icon-delete"></el-button>
</span>
@ -29,55 +29,55 @@
<span class="cell-text"> {{scope.row.username}}} </span>
<span class="cell-bar"><el-input style="display:inline;" v-model="scope.row.username" placeholder="" @change="editSomeFields(scope.row,'username',$event)" :maxlength="22"></el-input></span>
</el-table-column>
-->
-->
<el-table-column prop="caseName" label="用例名称" min-width="250">
<template slot-scope="scope">
<span> <el-link @click="showEdit( scope.row,scope.$index)">{{scope.row.caseName}} </el-link></span>
<span class="tool-bar">
<el-button type="primary" @click="showEdit( scope.row,scope.$index)" icon="el-icon-edit" circle ></el-button>
<el-button type="primary" @click="showEdit( scope.row,scope.$index)" icon="el-icon-edit" circle ></el-button>
</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="caseStatus" label="用例状态" width="100" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" :dict="dicts['testCaseStatus']" v-model="scope.row.caseStatus" effect="dark" @change="editSomeFields(scope.row,'caseStatus',$event)" :disabled="true"></mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" item-code="testCaseStatus" v-model="scope.row.caseStatus" effect="dark" @change="editSomeFields(scope.row,'caseStatus',$event)" :disabled="true"></mdp-select-tag>
</template>
</el-table-column>
<template v-if="select!==true">
</el-table-column>
<template v-if="select!==true">
<el-table-column prop="testType" label="执行方式" width="120" >
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" :dict="dicts['testType']" v-model="scope.row.testType" @change="editSomeFields(scope.row,'testType',$event)" :disabled="true"></mdp-select-tag>
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" item-code="testType" v-model="scope.row.testType" @change="editSomeFields(scope.row,'testType',$event)" :disabled="true"></mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="execStatus" label="执行结果" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" :dict="dicts['testStepTcode']" v-model="scope.row.execStatus" effect="dark" @change="editSomeFields(scope.row,'execStatus',$event)"></mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" item-code="testStepTcode" v-model="scope.row.execStatus" effect="dark" @change="editSomeFields(scope.row,'execStatus',$event)"></mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="execUsername" label="执行人姓名" min-width="120" >
<template slot-scope="scope">
<mdp-select-user-xm @visible-change="selectVisible(scope.row,$event)" :product-id="xmProductCpd?xmProductCpd.id:null" :project-id="xmProject?xmProject.id:null" userid-key="execUserid" username-key="execUsername" v-model="scope.row" @change="editSomeFields(scope.row,'execUserid',$event)">
<template slot-scope="scope">
<mdp-select-user-xm @visible-change="selectVisible(scope.row,$event)" :product-id="xmProductCpd?xmProductCpd.id:null" :project-id="xmProject?xmProject.id:null" userid-key="execUserid" username-key="execUsername" v-model="scope.row" @change="editSomeFields(scope.row,'execUserid',$event)">
</mdp-select-user-xm>
</template>
</el-table-column>
<el-table-column prop="priority" label="优先级" width="120" >
<template slot-scope="scope">
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" :dict="dicts['priority']" v-model="scope.row.priority" @change="editSomeFields(scope.row,'priority',$event)"></mdp-select-tag>
<mdp-select-tag @visible-change="selectVisible(scope.row,$event)" item-code="priority" v-model="scope.row.priority" @change="editSomeFields(scope.row,'priority',$event)"></mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="remark" label="执行备注" min-width="150" show-overflow-tooltip>
<template slot-scope="scope">
<span> {{scope.row.remark}} </span>
</template>
</el-table-column>
</template>
<template v-if="select==true">
</el-table-column>
</template>
<template v-if="select==true">
<el-table-column label="操作" min-width="150">
<template slot-scope="scope">
<el-button type="primary" @click="$emit('select',scope.row)">选择</el-button>
</template>
</el-table-column>
</el-table-column>
</template>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
@ -95,10 +95,10 @@
<xm-test-case-select :xm-test-plan="xmTestPlan" :xm-test-casedb="xmTestCasedb" :visible="addFormVisible" @cancel="addFormVisible=false" @select="onXmTestCaseSelect"></xm-test-case-select>
</el-dialog>
<el-dialog title="批量执行自动化测试用例" :visible.sync="doBatchExecVisible" width="600" top="20px" append-to-body :close-on-click-modal="false">
<el-result v-if="load.doBatch" icon="warning" title="警告提示" :subTitle="'正在批量执行测试用例,请勿关闭窗口,当前进度【'+batchProgress+'%】'">
</el-result>
<el-result v-if="!load.doBatch" icon="success" title="执行完毕" :subTitle="'成功用例【'+okCasesNum+'】,失败【'+errCasesNum+'】,忽略【'+igCasesNum+'】'">
<template slot="extra">
@ -116,13 +116,13 @@ import util from '@/common/js/util';//全局公共库
import config from '@/common/config';//
import { initDicts,listXmTestPlanCase, delXmTestPlanCase, batchDelXmTestPlanCase,editSomeFieldsXmTestPlanCase,importFromTestCase } from '@/api/xm/core/xmTestPlanCase';
import XmTestPlanCaseEdit from './XmTestPlanCaseEdit';//
import XmTestCaseSelect from '../xmTestCase/XmTestCaseSelect';//
import XmTestCaseSelect from '../xmTestCase/XmTestCaseSelect';//
import XmFuncSelect from '../xmFunc/XmFuncSelect';//
import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//
import {autoStepToAxios,initEnvVars} from '@/api/xm/core/XmTestAutoStep.js';//
import { mapGetters } from 'vuex'
import axios from 'axios'//访
import axios from 'axios'//访
export default {
name:'xmTestPlanCaseMng',
@ -132,7 +132,7 @@ export default {
props:['visible','xmTestPlan','xmTestCasedb','xmTestCase','xmProduct','xmProject','select'],
computed: {
...mapGetters(['userInfo']),
xmProductCpd(){
xmProductCpd(){
if(this.xmProduct&& this.xmProduct.id){
return this.xmProduct
}
@ -262,7 +262,7 @@ export default {
if(this.xmTestCasedb && this.xmTestCasedb.id){
params.casedbId=this.xmTestCasedb.id
}
if(this.xmTestCase && this.xmTestCase.id){
params.caseId=this.xmTestCase.id
}
@ -369,7 +369,7 @@ export default {
}else{
params[fieldName]=$event
}
var func = editSomeFieldsXmTestPlanCase
func(params).then(res=>{
let tips = res.data.tips;
@ -389,12 +389,12 @@ export default {
this.searchXmTestPlanCases();
},
editSomeFieldsForExec(sels,fieldName,$event){
let params={};
let params={};
params['pkList']=sels.map(i=>{ return { caseId:i.caseId, planId:i.planId}})
params[fieldName]=$event
params[fieldName]=$event
var func = editSomeFieldsXmTestPlanCase
func(params).then(res=>{
func(params).then(res=>{
}).catch((e)=>{})
},
selectVisible(row,visible){
@ -418,7 +418,7 @@ export default {
}
if(cases.some(k=>k.testType!=this.xmTestPlan.testType)){
if(this.xmTestPlan.testType=='1'){
this.$notify({position:'bottom-left',showClose:true,message:"当前计划为自动化测试计划,请选择自动测试的用例加入",type:'error'})
this.$notify({position:'bottom-left',showClose:true,message:"当前计划为自动化测试计划,请选择自动测试的用例加入",type:'error'})
return;
}
}
@ -429,16 +429,16 @@ export default {
} ,
batchExec(){
if(this.sels.length==0){
this.$notify({ position:'bottom-left',showClose:true, message:'测试用例为0条,无须执行', type: 'error' });
this.$notify({ position:'bottom-left',showClose:true, message:'测试用例为0条,无须执行', type: 'error' });
return;
}
if(this.sels.length>100){
this.$notify({ position:'bottom-left',showClose:true, message:'一次批量执行测试用例不能超过'+(100)+'条', type: 'error' });
this.$notify({ position:'bottom-left',showClose:true, message:'一次批量执行测试用例不能超过'+(100)+'条', type: 'error' });
return;
}
this.doBatchExec(this.sels)
},
async doBatchExec(planCases){
async doBatchExec(planCases){
this.doBatchExecVisible=true;
this.load.doBatch=true;
var igCases=planCases.filter(k=> !k.autoStep || k.testType!='1')
@ -447,7 +447,7 @@ export default {
}
this.igCasesNum=igCases.length;
this.batchProgress=Math.round(igCases.length/planCases.length)
var cases=planCases.filter(k=>k.autoStep && k.testType=='1')
var cases=planCases.filter(k=>k.autoStep && k.testType=='1')
var execAll=[]
var env=initEnvVars(this.xmTestCasedb?this.xmTestCasedb.envJson:null,this.xmTestPlan ?this.xmTestPlan.envJson:null);
for( let k of cases ){
@ -455,13 +455,13 @@ export default {
execAll.push(data)
this.batchProgress=Math.round((igCases.length+execAll.length)/planCases.length)
}
}
var okCases=execAll.filter(k=>k.execStatus=='2')
this.okCasesNum=okCases.length
if(okCases.length>0){
this.editSomeFieldsForExec(okCases,"execStatus",'2')
}
var errCases=execAll.filter(k=>k.execStatus=='4')
this.errCasesNum=errCases.length;
if(errCases.length>0){
@ -469,40 +469,40 @@ export default {
}
this.load.doBatch=false;
},
sendMsgForTestSetting:function(planCase,env){
sendMsgForTestSetting:function(planCase,env){
return new Promise((resolve,reject)=>{
var autoStepObj=JSON.parse(planCase.autoStep)
if(!autoStepObj.url){
planCase.execStatus='1'
planCase.execStatus='1'
resolve(planCase)
}else{
var axiosObj=autoStepToAxios(autoStepObj,env)
var axiosObj=autoStepToAxios(autoStepObj,env)
//axiosObj.headers['Access-Control-Allow-Origin']='*'
//axios.defaults.withCredentials = true // cookie
//axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
axios(axiosObj).then(res=>{
axios(axiosObj).then(res=>{
if(autoStepObj.expectResult){
var func=new Function('res','env',autoStepObj.expectResult)
var result=func(res,env)
var result=func(res,env)
planCase.execStatus=result==true?"2":"4"
}else{
planCase.execStatus=res.status==200?"2":"4"
}
resolve(planCase)
}).catch(res=>{
}).catch(res=>{
var func=new Function('res','env',autoStepObj.expectResult)
var result=func(res,env)
if(result==true){
planCase.execStatus="2"
}else{
}else{
planCase.execStatus="4"
}
resolve(planCase)
})
}
})
},
onXmFuncRowClick(row){
@ -511,10 +511,10 @@ export default {
},
onEditFields(row){
Object.assign(this.editForm,row)
this.editFormBak={...this.editForm}
this.editFormBak={...this.editForm}
},
nextEdit(){
var index=this.xmTestPlanCases.findIndex(k=>k.caseId==this.editForm.caseId)
nextEdit(){
var index=this.xmTestPlanCases.findIndex(k=>k.caseId==this.editForm.caseId)
if(index==this.xmTestPlanCases.length-1){
this.editFormVisible=false;
this.$notify({position:'bottom-left',showClose:true,message:"已是最后一条数据",type:'error'})
@ -522,7 +522,7 @@ export default {
}
this.editForm=this.xmTestPlanCases[index+1]
this.$refs.xmTestPlanCaseTable.setCurrentRow(this.editForm)
this.editFormBak={...this.editForm}
this.editFormBak={...this.editForm}
}
},//end methods
mounted() {
@ -539,4 +539,4 @@ export default {
</script>
<style scoped>
</style>
</style>

62
src/views/xm/core/xmTestPlanCase/XmTestPlanCaseSelect.vue

@ -1,17 +1,17 @@
<template>
<section>
<el-row :gutter="10">
<el-row :gutter="10">
<el-col :span="6" v-if="!xmTestCase||!xmTestCase.id">
<xm-func-select :xm-product="xmProductCpd" @row-click="onXmFuncRowClick">
<xm-func-select :xm-product="xmProductCpd" @row-click="onXmFuncRowClick">
</xm-func-select>
</el-col>
<el-col :span="(xmTestCase&&xmTestCase.id)?24:18">
<el-row>
<el-input v-model="filters.key" style="width:20%;" placeholder="模糊查询" clearable></el-input>
<mdp-select style="width:20%;" placeholder="用例状态" clearable :dict="dicts['testCaseStatus']" v-model="filters.caseStatus" effect="dark"></mdp-select>
<mdp-select style="width:20%;" placeholder="执行结果" clearable :dict="dicts['testStepTcode']" v-model="filters.execStatus" effect="dark"></mdp-select>
<mdp-select style="width:20%;" placeholder="用例状态" clearable item-code="testCaseStatus" v-model="filters.caseStatus" effect="dark"></mdp-select>
<mdp-select style="width:20%;" placeholder="执行结果" clearable item-code="testStepTcode" v-model="filters.execStatus" effect="dark"></mdp-select>
<el-button v-loading="load.list" :disabled="load.list==true" @click="searchXmTestPlanCases" icon="el-icon-search">查询</el-button>
<el-button v-loading="load.list" :disabled="load.list==true" @click="searchXmTestPlanCases" icon="el-icon-search">查询</el-button>
</el-row>
<el-row class="padding-top">
<!--列表 XmTestPlanCase 测试计划与用例关系表-->
@ -21,48 +21,48 @@
<span class="cell-text"> {{scope.row.username}}} </span>
<span class="cell-bar"><el-input style="display:inline;" v-model="scope.row.username" placeholder="" @change="editSomeFields(scope.row,'username',$event)" :maxlength="22"></el-input></span>
</el-table-column>
-->
<el-table-column prop="caseName" label="用例名称" min-width="250">
<template slot-scope="scope">
-->
<el-table-column prop="caseName" label="用例名称" min-width="250">
<template slot-scope="scope">
<span :title="'归属测试计划'+scope.row.planId">{{ scope.row.caseName }}</span>
</template>
</el-table-column>
<el-table-column prop="planId" label="测试计划" width="150" sortable>
</el-table-column>
</el-table-column>
<el-table-column prop="planId" label="测试计划" width="150" sortable>
</el-table-column>
<el-table-column prop="caseStatus" label="用例状态" width="100" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag :dict="dicts['testCaseStatus']" v-model="scope.row.caseStatus" effect="dark" :disabled="true"></mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag item-code="testCaseStatus" v-model="scope.row.caseStatus" effect="dark" :disabled="true"></mdp-select-tag>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="execStatus" label="执行结果" width="100" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag :dict="dicts['testStepTcode']" v-model="scope.row.execStatus" effect="dark" :disabled="true"></mdp-select-tag>
<template slot-scope="scope">
<mdp-select-tag item-code="testStepTcode" v-model="scope.row.execStatus" effect="dark" :disabled="true"></mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="execUsername" label="执行人姓名" min-width="120" >
<template slot-scope="scope">
<mdp-select-user-xm userid-key="execUserid" username-key="execUsername" v-model="scope.row" :disabled="true">
<template slot-scope="scope">
<mdp-select-user-xm userid-key="execUserid" username-key="execUsername" v-model="scope.row" :disabled="true">
</mdp-select-user-xm>
</template>
</el-table-column>
<el-table-column prop="priority" label="优先级" width="120" >
<template slot-scope="scope">
<mdp-select-tag :dict="dicts['priority']" v-model="scope.row.priority" :disabled="true"></mdp-select-tag>
<mdp-select-tag item-code="priority" v-model="scope.row.priority" :disabled="true"></mdp-select-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="100" fixed="right">
<template slot-scope="scope">
<el-button type="primary" @click="$emit('select',scope.row)">选择</el-button>
</template>
</el-table-column>
</el-table-column>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</el-row>
</el-col>
</el-row>
</el-row>
</section>
</template>
@ -83,7 +83,7 @@ export default {
props:['visible','xmTestPlan','xmTestCasedb','xmTestCase','xmProduct','select','xmProject'],
computed: {
...mapGetters(['userInfo']),
xmProductCpd(){
xmProductCpd(){
if(this.xmProduct&& this.xmProduct.id){
return this.xmProduct
}
@ -206,7 +206,7 @@ export default {
if(this.xmTestCasedb && this.xmTestCasedb.id){
params.casedbId=this.xmTestCasedb.id
}
if(this.xmTestCase && this.xmTestCase.id){
params.caseId=this.xmTestCase.id
}
@ -237,12 +237,12 @@ export default {
}).catch( err => this.load.list = false );
},
//xmTestPlanCase
selsChange: function (sels) {
this.sels = sels;
},
rowClick: function(row, event, column){
this.editForm=row
this.editFormBak={...row};
@ -250,12 +250,12 @@ export default {
},
initData: function(){
},
},
onXmFuncRowClick(row){
this.filters.xmFunc=row
this.searchXmTestPlanCases();
},
},//end methods
mounted() {
this.$nextTick(() => {
@ -271,4 +271,4 @@ export default {
</script>
<style scoped>
</style>
</style>

66
src/views/xm/core/xmWorkload/XmWorkloadList.vue

@ -27,15 +27,15 @@
<el-table-column prop="bizType" label="报工类型" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag :disabled="true" v-model="scope.row.bizType" :dict="dicts['wlBizType']"></mdp-select-tag>
</template>
</el-table-column>
<mdp-select-tag :disabled="true" v-model="scope.row.bizType" item-code="wlBizType"></mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="bizName" label="报工业务" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<el-link @click="openDialog(scope.row)">{{scope.row.bizName}}</el-link>
</template>
</el-table-column>
<el-table-column prop="remark" label="报工备注" width="120" show-overflow-tooltip></el-table-column>
</el-table-column>
<el-table-column prop="remark" label="报工备注" width="120" show-overflow-tooltip></el-table-column>
<el-table-column prop="ttype" label="任务类型" min-width="80" show-overflow-tooltip :formatter="formatterOption"></el-table-column>
</el-table>
@ -47,23 +47,23 @@
<el-dialog :title="'【'+editForm.name+'】新增工时'" :visible.sync="addFormVisible" width="60%" top="20px" append-to-body :close-on-click-modal="false">
<xm-workload-edit op-type="add" :biz-type="bizType" :xm-task="xmTask" :xm-menu="xmMenu" :xm-test-case="xmTestCase" :xm-test-plan-case="xmTestPlanCase" :xm-question="xmQuestion" :visible="addFormVisible" @cancel="addFormVisible=false" @submit="afterAddSubmit"></xm-workload-edit>
</el-dialog>
<el-dialog title="任务明细" :visible.sync="taskDetailVisible" width="90%" top="20px" append-to-body>
<xm-task-detail :visible="taskDetailVisible" :xm-task="{id:editForm.taskId,name:editForm.bizName}" :reload="true"></xm-task-detail>
</el-dialog>
<el-dialog title="缺陷明细" :visible.sync="bugDetailVisible" width="90%" top="20px" append-to-body>
<xm-question-detail :visible="bugDetailVisible" :xm-question="{id:editForm.bugId,name:editForm.bizName}" :reload="true"></xm-question-detail>
</el-dialog>
<el-dialog title="测试用例明细" :visible.sync="caseDetailVisible" width="90%" top="20px" append-to-body>
<xm-test-case-detail :visible="caseDetailVisible" :xm-test-case="{id:editForm.caseId,name:editForm.bizName}" :reload="true"></xm-test-case-detail>
</el-dialog>
<el-dialog title="执行用例明细" :visible.sync="planCaseDetailVisible" width="90%" top="20px" append-to-body>
<xm-test-plan-case-detail :visible="planCaseDetailVisible" :xm-plan-test-case="{planId:editForm.planId,caseId:editForm.caseId,name:editForm.bizName}" :reload="true"></xm-test-plan-case-detail>
</el-dialog>
<el-dialog title="需求明细" :visible.sync="menuDetailVisible" width="90%" top="20px" append-to-body>
<xm-menu-detail :visible="menuDetailVisible" :xm-menu="{id:editForm.menuId,name:editForm.bizName}" :reload="true"></xm-menu-detail>
</el-dialog>
@ -87,7 +87,7 @@
name:'xmWorkloadMng',
components: {
XmWorkloadEdit,
"xm-task-detail":()=>import("../xmTask/XmTaskDetail"),
"xm-question-detail":()=>import("../xmQuestion/XmQuestionDetail"),
"xm-test-case-detail":()=>import("../xmTestCase/XmTestCaseDetail"),
@ -108,9 +108,9 @@
params.actWorkload=this.xmTask.actWorkload
params.ntype=this.xmTask.ntype
params.name=this.xmTask.name
}
}
if( this.xmMenu && this.xmMenu.menuId){
params.menuId=this.xmMenu.menuId
params.menuId=this.xmMenu.menuId
params.initWorkload=this.xmMenu.initWorkload
params.budgetWorkload=this.xmMenu.budgetWorkload
params.actWorkload=this.xmMenu.actWorkload
@ -118,14 +118,14 @@
params.dclass=this.xmMenu.dclass
params.name=this.xmMenu.name
params.menuName=this.xmMenu.menuName
}
}
if( this.xmQuestion && this.xmQuestion.id){
params.id=this.xmQuestion.id
params.initWorkload=this.xmQuestion.initWorkload
params.budgetWorkload=this.xmQuestion.budgetWorkload
params.actWorkload=this.xmQuestion.actWorkload
params.name=this.xmQuestion.name
}
}
if( this.xmTestCase && this.xmTestCase.id){
params.id=this.xmTestCase.id
params.initWorkload=this.xmTestCase.initWorkload
@ -133,29 +133,29 @@
params.actWorkload=this.xmTestCase.actWorkload
params.name=this.xmTestCase.caseName
params.caseName=this.xmTestCase.caseName
}
}
if( this.xmTestPlanCase && this.xmTestPlanCase.planId){
params.planId=this.xmTestPlanCase.planId
params.planId=this.xmTestPlanCase.planId
params.caseId=this.xmTestPlanCase.caseId
params.initWorkload=this.xmTestPlanCase.initWorkload
params.budgetWorkload=this.xmTestPlanCase.budgetWorkload
params.actWorkload=this.xmTestPlanCase.actWorkload
params.name=this.xmTestPlanCase.caseName
params.caseName=this.xmTestPlanCase.caseName
}
}
return params
}
},
watch:{
watch:{
visible(val){
if(val==true){
if(val==true){
this.searchXmWorkloads()
}
},
val:{
handler(){
this.initData();
handler(){
this.initData();
},
deep:true,
}
@ -191,12 +191,12 @@
},
maxTableHeight:300,
taskDetailVisible:false,
bugDetailVisible:false,
caseDetailVisible:false,
planCaseDetailVisible:false,
menuDetailVisible:false,
menuDetailVisible:false,
userWorkloadDayListVisible:false,
}
@ -270,23 +270,23 @@
}
if(this.filters.key){
params.key=this.filters.key
}
}
if( this.xmTask && this.xmTask.id){
params.taskId=this.xmTask.id
}
}
if( this.xmMenu && this.xmMenu.menuId){
params.menuId=this.xmMenu.menuId
}
}
if( this.xmQuestion && this.xmQuestion.id){
params.bugId=this.xmQuestion.id
}
}
if( this.xmTestCase && this.xmTestCase.id){
params.caseId=this.xmTestCase.id
}
}
if( this.xmTestPlanCase && this.xmTestPlanCase.planId){
params.planId=this.xmTestPlanCase.planId
params.caseId=this.xmTestPlanCase.caseId
}
}
if(this.bizType!=='all'&&!params.planId&&!params.caseId&&!params.caseId &&!params.bugId&&!params.taskId&&!params.menuId){
return;
}
@ -393,11 +393,11 @@
}else if(this.bizType=='5'){
this.menuDetailVisible=true
}
},
},
queryUserWorkload(row){
this.editForm=row
this.userWorkloadDayListVisible=true;
},
},
openDialog(row){
this.editForm=row
if(row.bizType=='1'){
@ -411,7 +411,7 @@
}else if(this.bizType=='5'){
this.menuDetailVisible=true
}
},
},
},//end methods
mounted() {

80
src/views/xm/core/xmWorkload/XmWorkloadMng.vue

@ -4,7 +4,7 @@
<xm-project-select style="display:inline;" ref="xmProjectSelect" :auto-select="false" @row-click="onProjectConfirm" @clear="clearProject"></xm-project-select>
<el-select v-if="wstatuses && wstatuses.toString()=='0,2'" v-model="filters.wstatus" clearable @change="searchXmWorkloads" placeholder="请选择工时单状态">
<el-option label="全部状态" value=""></el-option>
<el-option label="待确认" value="0"></el-option>
<el-option label="待确认" value="0"></el-option>
</el-select>
<el-select v-if="sstatuses && sstatuses.toString()!='1'" v-model="filters.sstatus" clearable @change="searchXmWorkloads" placeholder="请选择工时单状态">
@ -18,7 +18,7 @@
<el-input v-model="filters.userid" style="width: 150px;" clearable placeholder="员工编号"></el-input>
<el-input v-model="filters.taskId" style="width: 150px;" clearable placeholder="任务编号"></el-input>
<el-button type="primary" v-loading="load.list" :disabled="load.list==true" @click="searchXmWorkloads" icon="el-icon-search">查询</el-button>
<span style="float:right;">
<!-- <el-button type="primary" @click="showAdd" icon="el-icon-plus"> </el-button>-->
<el-button type="warning" v-loading="load.edit" @click="batchSetSbillIdNull" :disabled="this.sels.length===0 || load.edit==true" icon="el-icon-setting">移出结算单</el-button>
@ -52,8 +52,8 @@
:cell-style="{'text-align':'center'}">
<el-table-column type="selection" width="55" show-overflow-tooltip fixed="left"></el-table-column>
<el-table-column sortable type="index" width="55" show-overflow-tooltip fixed="left"></el-table-column>
<el-table-column prop="username" label="姓名" min-width="120" show-overflow-tooltip sortable fixed="left">
<template slot-scope="scope">
<el-table-column prop="username" label="姓名" min-width="120" show-overflow-tooltip sortable fixed="left">
<template slot-scope="scope">
<span class="cell-text">
{{scope.row.username}}
</span>
@ -64,7 +64,7 @@
</el-table-column>
<el-table-column prop="bizName" label="业务" min-width="120" show-overflow-tooltip sortable fixed="left">
<template slot-scope="scope">
<span class="cell-text">
{{scope.row.bizName}}
</span>
@ -73,18 +73,18 @@
<xm-workload-simple-list :visible="scope.row.id==editForm.id" :xm-task="{id:scope.row.taskId,name:scope.row.taskName,projectName:scope.row.projectName,projectId:scope.row.projectId,budgetWorkload:scope.row.budgetWorkload,actWorkload:scope.row.actWorkload}" ref="xmWorkloadSimpleList"></xm-workload-simple-list>
<el-button slot="reference" icon="el-icon-search" style="display:inline;">所有工时</el-button>
</el-popover>
</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="bizDate" label="工时日期" width="120" show-overflow-tooltip sortable fixed="left">
<template slot-scope="scope">
<span>{{scope.row.bizDate}}</span>
</template>
</el-table-column>
<el-table-column prop="projectId" label="归属项目" min-width="120" show-overflow-tooltip sortable>
<template slot-scope="scope">
</el-table-column>
<el-table-column prop="projectId" label="归属项目" min-width="120" show-overflow-tooltip sortable>
<template slot-scope="scope">
<span class="cell-text">
{{scope.row.projectName}}
</span>
@ -108,7 +108,7 @@
<el-table-column prop="sstatus" label="结算状态" width="120" show-overflow-tooltip sortable>
<template slot-scope="scope">
<div class="cell-text">
<el-tag v-for="(item,index) in formatDictsWithClass(dicts,'sstatus',scope.row.sstatus)" :key="index" :type="item.className">{{item.name}}</el-tag>
<el-tag v-for="(item,index) in formatDictsWithClass(dicts,'sstatus',scope.row.sstatus)" :key="index" :type="item.className">{{item.name}}</el-tag>
</div>
<span class="cell-bar">
<el-select v-model="scope.row.sstatus" placeholder="结算状态" style="display:block;" @change="editXmWorkloadSomeFields(scope.row,'sstatus',$event)">
@ -124,7 +124,7 @@
</el-table-column>
<!--
<el-table-column prop="sworkload" label="结算工时" width="120" show-overflow-tooltip sortable>
<template slot-scope="scope">
<template slot-scope="scope">
<span class="cell-text">
{{scope.row.sworkload}}h
</span>
@ -134,7 +134,7 @@
</template>
</el-table-column>
<el-table-column prop="amt" label="标准金额" width="120" show-overflow-tooltip sortable>
<template slot-scope="scope">
<template slot-scope="scope">
<span class="cell-text">
<span v-if="scope.row.amt">¥{{ scope.row.amt}}</span>
<span v-else>-</span>
@ -142,12 +142,12 @@
<span class="cell-bar">
<el-input type="number" style="display:inline;" v-model="scope.row.amt" placeholder="标准金额" @change="editXmWorkloadSomeFields(scope.row,'amt',$event)"></el-input>
</span>
</template>
</template>
</el-table-column>
-->
<!--
<el-table-column prop="samt" label="结算金额" width="120" show-overflow-tooltip sortable>
<template slot-scope="scope">
<el-table-column prop="samt" label="结算金额" width="120" show-overflow-tooltip sortable>
<template slot-scope="scope">
<span class="cell-text">
<span v-if="scope.row.samt">¥{{ scope.row.samt}}</span>
<span v-else>-</span>
@ -158,7 +158,7 @@
</template>
</el-table-column>
<el-table-column v-if="sstatuses && sstatuses=='1'" prop="sbillId" label="结算单" width="120" show-overflow-tooltip sortable>
<template slot-scope="scope">
<template slot-scope="scope">
<span class="cell-text">
{{scope.row.sbillId}}
</span>
@ -170,19 +170,19 @@
-->
<!-- <el-table-column prop="cuserid" label="创建人编号" width="120" show-overflow-tooltip></el-table-column>
<el-table-column prop="bizDate" label="业务日期yyyy-MM-dd" width="120" show-overflow-tooltip></el-table-column>-->
<el-table-column prop="bizType" label="报工类型" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag :disabled="true" v-model="scope.row.bizType" :dict="dicts['wlBizType']"></mdp-select-tag>
</template>
</el-table-column>
<mdp-select-tag :disabled="true" v-model="scope.row.bizType" item-code="wlBizType"></mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="bizName" label="报工业务" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<el-link @click="openDialog(scope.row)">{{scope.row.bizName}}</el-link>
</template>
</el-table-column>
<el-table-column prop="remark" label="报工备注" width="120" show-overflow-tooltip></el-table-column>
<template slot-scope="scope">
</el-table-column>
<el-table-column prop="remark" label="报工备注" width="120" show-overflow-tooltip></el-table-column>
<template slot-scope="scope">
<span class="cell-text">
<span v-if="scope.row.remark">{{ scope.row.remark}}</span>
<span v-else>-</span>
@ -219,26 +219,26 @@
</el-drawer>
<el-drawer title="选择员工" :visible.sync="selectFiltersPmUserVisible" size="60%" append-to-body>
<users-select @confirm="onFiltersPmUserSelected" ref="usersSelect"></users-select>
</el-drawer>
</el-drawer>
<el-dialog title="任务明细" :visible.sync="taskDetailVisible" width="90%" top="20px" append-to-body>
<xm-task-detail :visible="taskDetailVisible" :xm-task="{id:editForm.taskId,name:editForm.bizName}" :reload="true"></xm-task-detail>
</el-dialog>
<el-dialog title="缺陷明细" :visible.sync="bugDetailVisible" width="90%" top="20px" append-to-body>
<xm-question-detail :visible="bugDetailVisible" :xm-question="{id:editForm.bugId,name:editForm.bizName}" :reload="true"></xm-question-detail>
</el-dialog>
<el-dialog title="测试用例明细" :visible.sync="caseDetailVisible" width="90%" top="20px" append-to-body>
<xm-test-case-detail :visible="caseDetailVisible" :xm-test-case="{id:editForm.caseId,name:editForm.bizName}" :reload="true"></xm-test-case-detail>
</el-dialog>
<el-dialog title="执行用例明细" :visible.sync="planCaseDetailVisible" width="90%" top="20px" append-to-body>
<xm-test-plan-case-detail :visible="planCaseDetailVisible" :xm-plan-test-case="{planId:editForm.planId,caseId:editForm.caseId,name:editForm.bizName}" :reload="true"></xm-test-plan-case-detail>
</el-dialog>
<el-dialog title="需求明细" :visible.sync="menuDetailVisible" width="90%" top="20px" append-to-body>
<xm-menu-detail :visible="menuDetailVisible" :xm-menu="{id:editForm.menuId,name:editForm.bizName}" :reload="true"></xm-menu-detail>
</el-dialog>
@ -271,7 +271,7 @@
XmTaskSbillSelect,
UsersSelect,
XmWorkloadSimpleList,
"xm-task-detail":()=>import("../xmTask/XmTaskDetail"),
"xm-question-detail":()=>import("../xmQuestion/XmQuestionDetail"),
"xm-test-case-detail":()=>import("../xmTestCase/XmTestCaseDetail"),
@ -411,7 +411,7 @@
if(this.filters.sstatus){
params.sstatuses = this.filters.sstatus;
}
if(this.filters.userid){
params.userid = this.filters.userid;
}
@ -515,7 +515,7 @@
}).catch( err => this.load.edit=false );
});
},
batchDel: function () {
if(this.sels.length<=0){
return;
@ -553,7 +553,7 @@
this.selProject = null;
this.getXmWorkloads();
},
editXmWorkloadSomeFields(row,fieldName,$event){
editXmWorkloadSomeFields(row,fieldName,$event){
let params={
ids:[row.id],
};
@ -562,27 +562,27 @@
this.$notify({position:'bottom-left',showClose:true,message:'存在不同项目的工时单,请重新选择',type:'warning'})
return;
}
params.ids=this.sels.map(i=>i.id);
params.ids=this.sels.map(i=>i.id);
}else{
params.ids = [row.id];
params.ids = [row.id];
params[fieldName]=$event
}
var func = editXmWorkloadSomeFields
if(fieldName==='sbillId'){
func = editWorkloadToSbill
params.sbillId=$event.id
}else{
}else{
params[fieldName]=$event
}
func(params).then(res=>{
let tips = res.data.tips;
let tips = res.data.tips;
this.getXmWorkloads();
if(tips.isOk){
}else{
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
}
})
},
},
clearFiltersPmUser:function(){
this.filters.pmUser=null;
this.searchXmWorkloads();

50
src/views/xm/core/xmWorkload/XmWorkloadSimpleList.vue

@ -1,5 +1,5 @@
<template>
<section>
<section>
<el-row class="padding-top">
<!--列表 XmWorkload 工时登记表-->
<el-descriptions :column="3" border>
@ -12,7 +12,7 @@
<el-descriptions-item label="工时进度">
<el-tag type="warning">{{xmTask.budgetWorkload>0?Math.round(xmTask.actWorkload/xmTask.budgetWorkload*100):0}}%&nbsp;</el-tag>
</el-descriptions-item>
</el-descriptions>
</el-descriptions>
<el-table ref="xmWorkloadTable" :max-height="maxTableHeight" :data="xmWorkloads" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column type="selection" width="55" show-overflow-tooltip></el-table-column>
<el-table-column prop="username" label="姓名" width="120" show-overflow-tooltip>
@ -48,15 +48,15 @@
</el-table-column>
<el-table-column prop="bizType" label="报工类型" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag :disabled="true" v-model="scope.row.bizType" :dict="dicts['wlBizType']"></mdp-select-tag>
</template>
</el-table-column>
<mdp-select-tag :disabled="true" v-model="scope.row.bizType" item-code="wlBizType"></mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="bizName" label="报工业务" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<el-link @click="openDialog(scope.row)">{{scope.row.bizName}}</el-link>
</template>
</el-table-column>
<el-table-column prop="remark" label="报工备注" width="120" show-overflow-tooltip></el-table-column>
</el-table-column>
<el-table-column prop="remark" label="报工备注" width="120" show-overflow-tooltip></el-table-column>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
@ -68,23 +68,23 @@
<xm-workload-edit op-type="add" :xm-task="xmTask" :visible="addFormVisible" @cancel="addFormVisible=false" @submit="afterAddSubmit"></xm-workload-edit>
</el-dialog>
<el-dialog title="任务明细" :visible.sync="taskDetailVisible" width="90%" top="20px" append-to-body>
<xm-task-detail :visible="taskDetailVisible" :xm-task="{id:editForm.taskId,name:editForm.bizName}" :reload="true"></xm-task-detail>
</el-dialog>
<el-dialog title="缺陷明细" :visible.sync="bugDetailVisible" width="90%" top="20px" append-to-body>
<xm-question-detail :visible="bugDetailVisible" :xm-question="{id:editForm.bugId,name:editForm.bizName}" :reload="true"></xm-question-detail>
</el-dialog>
<el-dialog title="测试用例明细" :visible.sync="caseDetailVisible" width="90%" top="20px" append-to-body>
<xm-test-case-detail :visible="caseDetailVisible" :xm-test-case="{id:editForm.caseId,name:editForm.bizName}" :reload="true"></xm-test-case-detail>
</el-dialog>
<el-dialog title="执行用例明细" :visible.sync="planCaseDetailVisible" width="90%" top="20px" append-to-body>
<xm-test-plan-case-detail :visible="planCaseDetailVisible" :xm-plan-test-case="{planId:editForm.planId,caseId:editForm.caseId,name:editForm.bizName}" :reload="true"></xm-test-plan-case-detail>
</el-dialog>
<el-dialog title="需求明细" :visible.sync="menuDetailVisible" width="90%" top="20px" append-to-body>
<xm-menu-detail :visible="menuDetailVisible" :xm-menu="{id:editForm.menuId,name:editForm.bizName}" :reload="true"></xm-menu-detail>
</el-dialog>
@ -107,7 +107,7 @@
export default {
name:'xmWorkloadSimpleList',
components: {
XmWorkloadEdit,
XmWorkloadEdit,
"xm-task-detail":()=>import("../xmTask/XmTaskDetail"),
"xm-question-detail":()=>import("../xmQuestion/XmQuestionDetail"),
"xm-test-case-detail":()=>import("../xmTestCase/XmTestCaseDetail"),
@ -121,7 +121,7 @@
},
watch:{
'xmTask.id':function(){
'xmTask.id':function(){
this.initData();
this.searchXmWorkloads()
},
@ -170,7 +170,7 @@
},//end data
methods: {
...util,
editXmWorkloadSomeFields(row,fieldName,$event){
editXmWorkloadSomeFields(row,fieldName,$event){
let params={
ids:[row.id],
};
@ -179,20 +179,20 @@
this.$notify({position:'bottom-left',showClose:true,message:'存在不同项目的工时单,请重新选择',type:'warning'})
return;
}
params.ids=this.sels.map(i=>i.id);
params.ids=this.sels.map(i=>i.id);
}else{
params.ids = [row.id];
params.ids = [row.id];
params[fieldName]=$event
}
var func = editXmWorkloadSomeFields
if(fieldName==='sbillId'){
func = editWorkloadToSbill
params.sbillId=$event.id
}else{
}else{
params[fieldName]=$event
}
func(params).then(res=>{
let tips = res.data.tips;
let tips = res.data.tips;
this.getXmWorkloads();
if(tips.isOk){
this.$emit("edit-some-fields",params)
@ -200,7 +200,7 @@
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
}
})
},
},
handleSizeChange(pageSize) {
this.pageInfo.pageSize=pageSize;
this.getXmWorkloads();
@ -354,7 +354,7 @@
},
initData: function(){
},
},
openDialog(row){
this.editForm=row
if(row.bizType=='1'){
@ -368,16 +368,16 @@
}else if(this.bizType=='5'){
this.menuDetailVisible=true
}
},
},
queryUserWorkload(row){
this.editForm=row
this.userWorkloadDayListVisible=true;
}
},//end methods
mounted() {
this.$nextTick(() => {
this.$nextTick(() => {
initDicts(this);
if(this.visible==true){
if(this.visible==true){
this.initData()
this.searchXmWorkloads();
}
@ -391,6 +391,6 @@
<style scoped>
.label {
font-family: 黑体;
font-family: 黑体;
}
</style>

80
src/views/xm/core/xmWorkload/XmWorkloadSimpleListForBizDate.vue

@ -1,9 +1,9 @@
<template>
<section>
<el-row class="padding-top">
<section>
<el-row class="padding-top">
<el-table ref="xmWorkloadTable" :max-height="maxTableHeight" :data="xmWorkloads" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column type="selection" width="55" show-overflow-tooltip></el-table-column>
<el-table-column prop="username" label="姓名" width="120" show-overflow-tooltip>
<el-table-column prop="username" label="姓名" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<el-link @click="queryUserWorkload(scope.row)">{{scope.row.username}}</el-link>
</template>
@ -33,54 +33,54 @@
</el-select>
</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="bizType" label="报工类型" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-tag :disabled="true" v-model="scope.row.bizType" :dict="dicts['wlBizType']"></mdp-select-tag>
</template>
</el-table-column>
<mdp-select-tag :disabled="true" v-model="scope.row.bizType" item-code="wlBizType"></mdp-select-tag>
</template>
</el-table-column>
<el-table-column prop="bizName" label="报工业务" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<el-link @click="openDialog(scope.row)">{{scope.row.bizName}}</el-link>
</template>
</el-table-column>
<el-table-column prop="remark" label="报工备注" width="120" show-overflow-tooltip></el-table-column>
</el-table-column>
<el-table-column prop="remark" label="报工备注" width="120" show-overflow-tooltip></el-table-column>
<el-table-column fixed="right" label="操作" min-width="120">
<template slot-scope="scope">
<xm-task-sbill-select style="display:inline;" :auto-select="false" :project-id="scope.row.projectId" placeholder="结算" @row-click="batchJoinToSbill(scope.row,$event)">
<span slot="title">{{scope.row.sbillId?'结算单:'+scope.row.sbillId:'选择结算单'}}</span>
</xm-task-sbill-select>
</xm-task-sbill-select>
</template>
</el-table-column>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</el-row>
</el-row>
<el-dialog title="任务明细" :visible.sync="taskDetailVisible" width="90%" top="20px" append-to-body>
<xm-task-detail :visible="taskDetailVisible" :xm-task="{id:editForm.taskId,name:editForm.bizName}" :reload="true"></xm-task-detail>
</el-dialog>
<el-dialog title="缺陷明细" :visible.sync="bugDetailVisible" width="90%" top="20px" append-to-body>
<xm-question-detail :visible="bugDetailVisible" :xm-question="{id:editForm.bugId,name:editForm.bizName}" :reload="true"></xm-question-detail>
</el-dialog>
<el-dialog title="测试用例明细" :visible.sync="caseDetailVisible" width="90%" top="20px" append-to-body>
<xm-test-case-detail :visible="caseDetailVisible" :xm-test-case="{id:editForm.caseId,name:editForm.bizName}" :reload="true"></xm-test-case-detail>
</el-dialog>
<el-dialog title="执行用例明细" :visible.sync="planCaseDetailVisible" width="90%" top="20px" append-to-body>
<xm-test-plan-case-detail :visible="planCaseDetailVisible" :xm-plan-test-case="{planId:editForm.planId,caseId:editForm.caseId,name:editForm.bizName}" :reload="true"></xm-test-plan-case-detail>
</el-dialog>
<el-dialog title="需求明细" :visible.sync="menuDetailVisible" width="90%" top="20px" append-to-body>
<xm-menu-detail :visible="menuDetailVisible" :xm-menu="{id:editForm.menuId,name:editForm.bizName}" :reload="true"></xm-menu-detail>
</el-dialog>
<el-dialog :title="'【'+editForm.username+'】在项目【'+editForm.projectId+'】的工时记录情况'" :visible.sync="userWorkloadDayListVisible" width="90%" top="20px" append-to-body>
<workload-set-day-list :xm-project="{id:editForm.projectId}" :user="{userid:editForm.userid,username:editForm.username}"></workload-set-day-list>
</el-dialog>
</section>
</template>
@ -91,7 +91,7 @@
import { getDicts,initSimpleDicts,initComplexDicts } from '@/api/mdp/meta/item';//
import { listXmWorkload, delXmWorkload, batchDelXmWorkload,editXmWorkloadSomeFields,initDicts } from '@/api/xm/core/xmWorkload';
import { mapGetters } from 'vuex'
import XmTaskSbillSelect from "./XmTaskSbillSelect";
export default {
@ -156,14 +156,14 @@
bugDetailVisible:false,
caseDetailVisible:false,
planCaseDetailVisible:false,
menuDetailVisible:false,
menuDetailVisible:false,
userWorkloadDayListVisible:false,
}
},//end data
methods: {
...util,
editXmWorkloadSomeFields(row,fieldName,$event){
editXmWorkloadSomeFields(row,fieldName,$event){
let params={
ids:[row.id],
};
@ -172,20 +172,20 @@
this.$notify({position:'bottom-left',showClose:true,message:'存在不同项目的工时单,请重新选择',type:'warning'})
return;
}
params.ids=this.sels.map(i=>i.id);
params.ids=this.sels.map(i=>i.id);
}else{
params.ids = [row.id];
params.ids = [row.id];
params[fieldName]=$event
}
var func = editXmWorkloadSomeFields
if(fieldName==='sbillId'){
func = editWorkloadToSbill
params.sbillId=$event.id
}else{
}else{
params[fieldName]=$event
}
func(params).then(res=>{
let tips = res.data.tips;
let tips = res.data.tips;
this.getXmWorkloads();
if(tips.isOk){
this.$emit("edit-some-fields",params)
@ -193,7 +193,7 @@
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
}
})
},
},
handleSizeChange(pageSize) {
this.pageInfo.pageSize=pageSize;
this.getXmWorkloads();
@ -241,12 +241,12 @@
}
if(this.filters.key){
params.key=this.filters.key
}
}
if(this.projectId){
params.projectId=this.projectId
}
if(this.taskId){
params.taskId=this.taskId
}
@ -264,7 +264,7 @@
if(this.bizMonth){
params.bizMonth=this.bizMonth
}
if(this.bizDate){
params.bizDate=this.bizDate
}
@ -272,7 +272,7 @@
if(this.detailId){
params.detailId=this.detailId
}
if(this.sbillId){
params.sbillId=this.sbillId
}
@ -384,8 +384,8 @@
this.$notify({position:'bottom-left',showClose:true,message:'存在不同项目的工时单,请重新选择',type:'warning'})
return;
}
params.workloadIds=this.sels.map(i=>i.id);
}
params.workloadIds=this.sels.map(i=>i.id);
}
this.load.edit=true;
batchJoinToSbill(params).then((res) => {
this.load.edit=false;
@ -395,7 +395,7 @@
this.getXmWorkloads();
}
this.$notify({position:'bottom-left',showClose:true, message: tips.msg, type: tips.isOk?'success':'error'});
}).catch( err => this.load.edit=false );
}).catch( err => this.load.edit=false );
},
openDialog(row){
this.editForm=row
@ -410,18 +410,18 @@
}else if(this.bizType=='5'){
this.menuDetailVisible=true
}
},
},
queryUserWorkload(row){
this.editForm=row
this.editForm=row
this.userWorkloadDayListVisible=true;
}
},//end methods
mounted() {
this.$nextTick(() => {
initDicts(this);
this.initData()
this.searchXmWorkloads();
this.$nextTick(() => {
initDicts(this);
this.initData()
this.searchXmWorkloads();
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.xmWorkloadTable.$el)
});
@ -432,6 +432,6 @@
<style scoped>
.label {
font-family: 黑体;
font-family: 黑体;
}
</style>

78
src/views/xm/rpt/branch/branchRptOverview.vue

@ -1,5 +1,5 @@
<template>
<section class="padding">
<section class="padding">
<el-row :class="{'row-box':true,'cfg':isRptCfg}">
<div class="rpt-title">{{ rawDatas.name }}</div>
<el-input class="input" v-model="rawDatas.name" placeholder="计划名称"/>
@ -7,78 +7,78 @@
<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>
<el-row ref="table">
<el-row class="box">
<el-col :span="6" class="box-red">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.totalCases?rawDatas.totalCases:'0'}}</div>
<div class="label">用例数</div>
<div class="label">用例数</div>
</div>
</el-col>
<el-col :span="6" class="box-blue">
<div class="box-info">
<div class="box-info">
<div class="num">{{caseFuGaiLv}}%</div>
<div class="label">用例覆盖率</div>
<div class="label">用例覆盖率</div>
</div>
</el-col>
<el-col :span="6" class="box-green">
<div class="box-info">
<div class="box-info">
<div class="num">{{caseTongGuoLv}}%</div>
<div class="label">用例通过率</div>
<div class="label">用例通过率</div>
</div>
</el-col>
<el-col :span="6" class="box-orange">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.bugCnt?rawDatas.bugCnt:0}}</div>
<div class="label">缺陷数</div>
<div class="label">缺陷数</div>
</div>
</el-col>
</el-row>
<!--编辑界面 XmTestPlan 测试计划-->
<el-form :model="rawDatas" label-width="120px" :rules="rawDatasRules" ref="rawDatasRef" label-position="left">
<!--编辑界面 XmTestPlan 测试计划-->
<el-form :model="rawDatas" label-width="120px" :rules="rawDatasRules" ref="rawDatasRef" label-position="left">
<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>
<el-col :span="8">
<mdp-select show-style="x" label="状态" :dict="dicts['testPlanStatus']" v-model="rawDatas.status"></mdp-select>
<mdp-select show-style="x" label="状态" item-code="testPlanStatus" v-model="rawDatas.status"></mdp-select>
</el-col>
<el-col :span="8">
<mdp-select show-style="x" label="测试结果" :dict="dicts['testPlanTcode']" v-model="rawDatas.tcode"></mdp-select>
<mdp-select show-style="x" label="测试结果" item-code="testPlanTcode" v-model="rawDatas.tcode"></mdp-select>
</el-col>
</el-row>
</el-row>
<el-form-item label="归属测试库" prop="casedbName">
{{rawDatas.casedbName}}
</el-form-item>
</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>
</span>
<div v-else>{{rawDatas.projectName}}</div>
</el-form-item>
</el-form-item>
<el-form-item label="归属产品" prop="productName">
{{rawDatas.productName}}
</el-form-item>
</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-item>
</el-form>
</el-row>
<el-row class="padding-bottom">
<span>报告总结</span>
</el-row>
<el-row>
<el-row>
<el-input type="textarea" :rows="8" v-model="rawDatas.summaryRemark"></el-input>
</el-row>
<el-row v-if="rawDatas.summaryRemark!==rawDatasBak.summaryRemark" >
<span style="float:right;">
<span style="float:right;">
<el-button type="primary" @click.native="editSomeFields(rawDatas,'summaryRemark',rawDatas.summaryRemark)">提交</el-button>
</span>
</el-row>
@ -91,7 +91,7 @@
import { initDicts, addXmTestPlan,editXmTestPlan,editSomeFieldsXmTestPlan } from '@/api/xm/core/xmTestPlan';
import { mapGetters } from 'vuex'
import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect';
import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//
export default {
name:'xmTestPlanEdit',
@ -135,11 +135,11 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}
},
'visible':function(visible) {
'visible':function(visible) {
if(visible==true){
this.initData()
}
}
}
},
data() {
return {
@ -153,12 +153,12 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
},// 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:''
},
@ -179,7 +179,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
saveSubmit: function () {
this.$refs.rawDatasRef.validate((valid) => {
if (valid) {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.load.edit=true
let params = Object.assign({}, this.rawDatas);
var func=addXmTestPlan
@ -203,10 +203,10 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}
});
},
initData: function(){
initData: function(){
if(this.xmTestPlan){
this.rawDatas = Object.assign({},this.xmTestPlan);
}
}
if(this.rptDatas){
this.rawDatas=Object.assign({},this.rptDatas)
}
@ -219,7 +219,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}
let params={};
params['ids']=[row].map(i=>i.id)
if(fieldName=='stime'){
params[fieldName]=$event.stime
params.etime=$event.etime
@ -234,7 +234,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
let tips = res.data.tips;
if(tips.isOk){
this.rawDatasBak=[...this.rawDatas]
this.$emit('edit-fields',params)
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'})
@ -245,9 +245,9 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
this.rawDatas.projectId=row.id
this.rawDatas.projectName=row.name
this.rawDatas.name=this.rawDatas.projectName+'-测试计划-V1.0'
},
},
sizeAutoChange(){
}
},//end method
mounted() {
@ -261,6 +261,6 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
</script>
<style lang="scss" scoped>
<style lang="scss" scoped>
@import url('../index/overview.scss');
</style>
</style>

76
src/views/xm/rpt/iteration/iterationRptOverview.vue

@ -1,5 +1,5 @@
<template>
<section>
<section>
<el-row :class="{'row-box':true,'cfg':isRptCfg}">
<div class="rpt-title">{{ rawDatas.iterationName }}</div>
<el-input class="input" v-model="rawDatas.iterationName" placeholder="报告名称"/>
@ -7,66 +7,66 @@
<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>
<el-row class="padding">
<el-row class="padding-top padding-left padding-right">
<span>数据汇总</span>
</el-row>
</el-row>
<el-row ref="table">
<el-row class="box padding" >
<el-col :span="6" class="box-red">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.taskCnt?rawDatas.taskCnt:'0'}}</div>
<div class="label">总任务数</div>
<div class="label">总任务数</div>
</div>
</el-col>
<el-col :span="6" class="box-blue">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.menuCnt?rawDatas.menuCnt:'0'}}</div>
<div class="label">需求数</div>
<div class="label">需求数</div>
</div>
</el-col>
<el-col :span="6" class="box-green">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.testCases?rawDatas.testCases:'0'}}</div>
<div class="label">测试用例数</div>
<div class="label">测试用例数</div>
</div>
</el-col>
<el-col :span="6" class="box-orange">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.bugCnt?rawDatas.bugCnt:0}}</div>
<div class="label">缺陷数</div>
<div class="label">缺陷数</div>
</div>
</el-col>
</el-row>
</el-row>
</el-row>
<el-row class="padding-top padding-left padding-right">
<span>责任人</span>
</el-row>
<el-row class="padding">
<el-row class="padding">
<el-col :span="8">
<mdp-select-user-xm label="负责人" userid-key="adminUserid" username-key="adminUsername" v-model="rawDatas"></mdp-select-user-xm>
</el-col>
</el-col>
<el-col :span="8">
<mdp-select show-style="x" label="状态" :dict="dicts['iterationStatus']" v-model="rawDatas.istatus"></mdp-select>
</el-col>
</el-row>
<mdp-select show-style="x" label="状态" item-code="iterationStatus" v-model="rawDatas.istatus"></mdp-select>
</el-col>
</el-row>
<el-row class="padding-top padding-left padding-right">
<span>起始时间</span>
</el-row>
<el-row class="padding">
<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>
<el-row class="padding-top padding-left padding-right">
<span>报告总结</span>
</el-row>
<el-row>
<el-row class="padding">
<el-row>
<el-row class="padding">
<el-input type="textarea" :rows="8" v-model="remark"></el-input>
</el-row>
</el-row>
</el-row>
</el-row>
</el-row>
</section>
</template>
@ -76,7 +76,7 @@
import { initDicts } from '@/api/xm/core/xmIteration';
import { mapGetters } from 'vuex'
import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect';
import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//
export default {
name:'iterationRptOverview',
@ -84,7 +84,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
XmProjectSelect,MdpSelectUserXm,
},
computed: {
...mapGetters([ 'userInfo' ]),
...mapGetters([ 'userInfo' ]),
},
props:['xmIteration','rptDatas','isRptCfg'],
@ -96,11 +96,11 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}
},
'visible':function(visible) {
'visible':function(visible) {
if(visible==true){
this.initData()
}
}
}
},
data() {
return {
@ -109,33 +109,33 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
currOpType:'add',//add/edit
load:{ list: false, edit: false, del: false, add: false },//...
dicts:{
iterationStatus:[],
iterationStatus:[],
},// params={categoryId:'all',itemCodes:['sex']} {sex: [{id:'1',name:''},{id:'2',name:''}]}
rawDatasRules: {
},
rawDatas: {
id:'',name:'',casedbId:'',casedbName:'',iterationId:'',iterationName:'',cuserid:'',cusername:'',ctime:'',stime:'',etime:'',status:'',tcode:'',taskCnt:'',okCases:'',errCases:'',igCases:'',blCases:'',iterationId:'',iterationName:'',flowState:'',summaryRemark:''
},
},
maxTableHeight:300,
summaryRemarkEditVisible:false,
}//end return
},//end data
methods: {
...util,
initData: function(){
...util,
initData: function(){
if(this.xmIteration){
this.rawDatas = Object.assign({},this.xmIteration);
}
}
if(this.rptDatas){
this.rawDatas=Object.assign({},this.rptDatas)
}
this.rawDatasBak={...this.rawDatas}
},
},
sizeAutoChange(){
}
},//end method
mounted() {
@ -149,6 +149,6 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
</script>
<style lang="scss" scoped>
<style lang="scss" scoped>
@import '../index/overview.scss';
</style>
</style>

74
src/views/xm/rpt/product/productRptOverview.vue

@ -1,5 +1,5 @@
<template>
<section>
<section>
<el-row :class="{'row-box':true,'cfg':isRptCfg}">
<div class="rpt-title">{{ rawDatas.productName }}</div>
<el-input class="input" v-model="rawDatas.productName" placeholder="报告名称"/>
@ -7,43 +7,43 @@
<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>
<el-row class="padding">
<el-row class="padding-top padding-left padding-right">
<span>数据汇总</span>
</el-row>
</el-row>
<el-row ref="table">
<el-row class="box padding" >
<el-col :span="6" class="box-red">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.taskCnt?rawDatas.taskCnt:'0'}}</div>
<div class="label">总任务数</div>
<div class="label">总任务数</div>
</div>
</el-col>
<el-col :span="6" class="box-blue">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.menuCnt?rawDatas.menuCnt:'0'}}</div>
<div class="label">需求数</div>
<div class="label">需求数</div>
</div>
</el-col>
<el-col :span="6" class="box-green">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.testCases?rawDatas.testCases:'0'}}</div>
<div class="label">测试用例数</div>
<div class="label">测试用例数</div>
</div>
</el-col>
<el-col :span="6" class="box-orange">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.bugCnt?rawDatas.bugCnt:0}}</div>
<div class="label">缺陷数</div>
<div class="label">缺陷数</div>
</div>
</el-col>
</el-row>
</el-row>
</el-row>
<el-row class="padding-top padding-left padding-right">
<span>责任人</span>
</el-row>
<el-row class="padding">
<el-row class="padding">
<el-col :span="6">
<mdp-select-user-xm label="主管领导" userid-key="admUserid" username-key="admUsername" v-model="rawDatas"></mdp-select-user-xm>
</el-col>
@ -54,25 +54,25 @@
<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 show-style="x" label="状态" :dict="dicts['xmProductPstatus']" v-model="rawDatas.pstatus"></mdp-select>
</el-col>
</el-row>
<mdp-select show-style="x" label="状态" item-code="xmProductPstatus" v-model="rawDatas.pstatus"></mdp-select>
</el-col>
</el-row>
<el-row class="padding-top padding-left padding-right">
<span>起始时间</span>
</el-row>
<el-row class="padding">
<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>
<el-row class="padding-top padding-left padding-right">
<span>报告总结</span>
</el-row>
<el-row>
<el-row class="padding">
<el-row>
<el-row class="padding">
<el-input type="textarea" :rows="8" v-model="remark"></el-input>
</el-row>
</el-row>
</el-row>
</el-row>
</el-row>
</section>
</template>
@ -82,7 +82,7 @@
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:'productRptOverview',
@ -90,7 +90,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
XmProjectSelect,MdpSelectUserXm,
},
computed: {
...mapGetters([ 'userInfo' ]),
...mapGetters([ 'userInfo' ]),
},
props:['xmProduct','rptDatas','isRptCfg'],
@ -102,11 +102,11 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}
},
'visible':function(visible) {
'visible':function(visible) {
if(visible==true){
this.initData()
}
}
}
},
data() {
return {
@ -115,33 +115,33 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
currOpType:'add',//add/edit
load:{ list: false, edit: false, del: false, add: false },//...
dicts:{
xmProductPstatus:[],
xmProductPstatus:[],
},// params={categoryId:'all',itemCodes:['sex']} {sex: [{id:'1',name:''},{id:'2',name:''}]}
rawDatasRules: {
},
rawDatas: {
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,
}//end return
},//end data
methods: {
...util,
initData: function(){
...util,
initData: function(){
if(this.xmProduct){
this.rawDatas = Object.assign({},this.xmProduct);
}
}
if(this.rptDatas){
this.rawDatas=Object.assign({},this.rptDatas)
}
this.rawDatasBak={...this.rawDatas}
},
},
sizeAutoChange(){
}
},//end method
mounted() {
@ -155,6 +155,6 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
</script>
<style lang="scss" scoped>
<style lang="scss" scoped>
@import '../index/overview.scss';
</style>
</style>

74
src/views/xm/rpt/project/projectRptOverview.vue

@ -1,5 +1,5 @@
<template>
<section>
<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="报告名称"/>
@ -7,43 +7,43 @@
<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>
<el-row class="padding">
<el-row class="padding-top padding-left padding-right">
<span>数据汇总</span>
</el-row>
</el-row>
<el-row ref="table">
<el-row class="box padding" >
<el-col :span="6" class="box-red">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.taskCnt?rawDatas.taskCnt:'0'}}</div>
<div class="label">总任务数</div>
<div class="label">总任务数</div>
</div>
</el-col>
<el-col :span="6" class="box-blue">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.menuCnt?rawDatas.menuCnt:'0'}}</div>
<div class="label">需求数</div>
<div class="label">需求数</div>
</div>
</el-col>
<el-col :span="6" class="box-green">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.testCases?rawDatas.testCases:'0'}}</div>
<div class="label">测试用例数</div>
<div class="label">测试用例数</div>
</div>
</el-col>
<el-col :span="6" class="box-orange">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.bugCnt?rawDatas.bugCnt:0}}</div>
<div class="label">缺陷数</div>
<div class="label">缺陷数</div>
</div>
</el-col>
</el-row>
</el-row>
</el-row>
<el-row class="padding-top padding-left padding-right">
<span>责任人</span>
</el-row>
<el-row class="padding">
<el-row class="padding">
<el-col :span="6">
<mdp-select-user-xm label="主管领导" userid-key="admUserid" username-key="admUsername" v-model="rawDatas"></mdp-select-user-xm>
</el-col>
@ -54,25 +54,25 @@
<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 show-style="x" label="状态" :dict="dicts['projectStatus']" v-model="rawDatas.status"></mdp-select>
</el-col>
</el-row>
<mdp-select show-style="x" label="状态" item-code="projectStatus" v-model="rawDatas.status"></mdp-select>
</el-col>
</el-row>
<el-row class="padding-top padding-left padding-right">
<span>起始时间</span>
</el-row>
<el-row class="padding">
<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>
<el-row class="padding-top padding-left padding-right">
<span>报告总结</span>
</el-row>
<el-row>
<el-row class="padding">
<el-row>
<el-row class="padding">
<el-input type="textarea" :rows="8" v-model="remark"></el-input>
</el-row>
</el-row>
</el-row>
</el-row>
</el-row>
</section>
</template>
@ -82,7 +82,7 @@
import { initDicts } from '@/api/xm/core/xmProject';
import { mapGetters } from 'vuex'
import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect';
import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//
export default {
name:'projectRptOverview',
@ -90,7 +90,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
XmProjectSelect,MdpSelectUserXm,
},
computed: {
...mapGetters([ 'userInfo' ]),
...mapGetters([ 'userInfo' ]),
},
props:['xmProject','rptDatas','isRptCfg'],
@ -102,11 +102,11 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}
},
'visible':function(visible) {
'visible':function(visible) {
if(visible==true){
this.initData()
}
}
}
},
data() {
return {
@ -115,33 +115,33 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
currOpType:'add',//add/edit
load:{ list: false, edit: false, del: false, add: false },//...
dicts:{
projectStatus:[],
projectStatus:[],
},// 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:'',taskCnt:'',okCases:'',errCases:'',igCases:'',blCases:'',productId:'',productName:'',flowState:'',summaryRemark:''
},
},
maxTableHeight:300,
summaryRemarkEditVisible:false,
}//end return
},//end data
methods: {
...util,
initData: function(){
...util,
initData: function(){
if(this.xmProject){
this.rawDatas = Object.assign({},this.xmProject);
}
}
if(this.rptDatas){
this.rawDatas=Object.assign({},this.rptDatas)
}
this.rawDatasBak={...this.rawDatas}
},
},
sizeAutoChange(){
}
},//end method
mounted() {
@ -155,6 +155,6 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
</script>
<style lang="scss" scoped>
<style lang="scss" scoped>
@import '../index/overview.scss';
</style>
</style>

52
src/views/xm/rpt/testCase/testCasedbRptOverview.vue

@ -1,5 +1,5 @@
<template>
<section>
<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="报告名称"/>
@ -7,28 +7,28 @@
<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>
<el-row class="padding">
<el-row class="padding-top padding-left padding-right">
<span>责任人</span>
</el-row>
<el-row class="padding">
<el-row class="padding">
<el-col :span="6">
<mdp-select-user-xm label="负责人" userid-key="cuserid" username-key="cusername" v-model="rawDatas"></mdp-select-user-xm>
</el-col>
</el-col>
<el-col :span="6">
<mdp-select show-style="x" label="状态" :dict="dicts['casedbStatus']" v-model="rawDatas.status"></mdp-select>
</el-col>
</el-row>
<mdp-select show-style="x" label="状态" item-code="casedbStatus" v-model="rawDatas.status"></mdp-select>
</el-col>
</el-row>
<el-row class="padding-top padding-left padding-right">
<span>报告总结</span>
</el-row>
<el-row>
<el-row class="padding">
<el-row>
<el-row class="padding">
<el-input type="textarea" :rows="8" v-model="remark"></el-input>
</el-row>
</el-row>
</el-row>
</el-row>
</el-row>
</section>
</template>
@ -38,7 +38,7 @@
import { initDicts } from '@/api/xm/core/xmTestCasedb';
import { mapGetters } from 'vuex'
import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect';
import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//
export default {
name:'projectRptOverview',
@ -46,7 +46,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
XmProjectSelect,MdpSelectUserXm,
},
computed: {
...mapGetters([ 'userInfo' ]),
...mapGetters([ 'userInfo' ]),
},
props:['xmTestCasedb','rptDatas','isRptCfg'],
@ -58,11 +58,11 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}
},
'visible':function(visible) {
'visible':function(visible) {
if(visible==true){
this.initData()
}
}
}
},
data() {
return {
@ -71,33 +71,33 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
currOpType:'add',//add/edit
load:{ list: false, edit: false, del: false, add: false },//...
dicts:{
casedbStatus:[],
casedbStatus:[],
},// 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:'',taskCnt:'',okCases:'',errCases:'',igCases:'',blCases:'',productId:'',productName:'',flowState:'',summaryRemark:''
},
},
maxTableHeight:300,
summaryRemarkEditVisible:false,
}//end return
},//end data
methods: {
...util,
initData: function(){
...util,
initData: function(){
if(this.xmTestCasedb){
this.rawDatas = Object.assign({},this.xmTestCasedb);
}
}
if(this.rptDatas){
this.rawDatas=Object.assign({},this.rptDatas)
}
this.rawDatasBak={...this.rawDatas}
},
},
sizeAutoChange(){
}
},//end method
mounted() {
@ -111,6 +111,6 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
</script>
<style lang="scss" scoped>
<style lang="scss" scoped>
@import '../index/overview.scss';
</style>
</style>

80
src/views/xm/rpt/testPlan/testPlanRptOverview.vue

@ -1,5 +1,5 @@
<template>
<section>
<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="报告名称"/>
@ -7,79 +7,79 @@
<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>
<el-row ref="table" class="padding">
<el-row class="padding">
<span>数据汇总</span>
</el-row>
<el-row class="box padding">
<el-col :span="6" class="box-red">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.totalCases?rawDatas.totalCases:'0'}}</div>
<div class="label">用例数</div>
<div class="label">用例数</div>
</div>
</el-col>
<el-col :span="6" class="box-blue">
<div class="box-info">
<div class="box-info">
<div class="num">{{caseFuGaiLv}}%</div>
<div class="label">用例覆盖率</div>
<div class="label">用例覆盖率</div>
</div>
</el-col>
<el-col :span="6" class="box-green">
<div class="box-info">
<div class="box-info">
<div class="num">{{caseTongGuoLv}}%</div>
<div class="label">用例通过率</div>
<div class="label">用例通过率</div>
</div>
</el-col>
<el-col :span="6" class="box-orange">
<div class="box-info">
<div class="box-info">
<div class="num">{{rawDatas.bugCnt?rawDatas.bugCnt:0}}</div>
<div class="label">缺陷数</div>
<div class="label">缺陷数</div>
</div>
</el-col>
</el-row>
<!--编辑界面 XmTestPlan 测试计划-->
<el-form :model="rawDatas" label-width="120px" :rules="rawDatasRules" ref="rawDatasRef" label-position="left">
<!--编辑界面 XmTestPlan 测试计划-->
<el-form :model="rawDatas" label-width="120px" :rules="rawDatasRules" ref="rawDatasRef" label-position="left">
<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>
<el-col :span="8">
<mdp-select show-style="x" label="状态" :dict="dicts['testPlanStatus']" v-model="rawDatas.status"></mdp-select>
<mdp-select show-style="x" label="状态" item-code="testPlanStatus" v-model="rawDatas.status"></mdp-select>
</el-col>
<el-col :span="8">
<mdp-select show-style="x" label="测试结果" :dict="dicts['testPlanTcode']" v-model="rawDatas.tcode"></mdp-select>
<mdp-select show-style="x" label="测试结果" item-code="testPlanTcode" v-model="rawDatas.tcode"></mdp-select>
</el-col>
</el-row>
</el-row>
<el-form-item label="归属测试库" prop="casedbName">
{{rawDatas.casedbName}}
</el-form-item>
</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>
</span>
<div v-else>{{rawDatas.projectName}}</div>
</el-form-item>
</el-form-item>
<el-form-item label="归属产品" prop="productName">
{{rawDatas.productName}}
</el-form-item>
</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-item>
</el-form>
<el-row>
<span>报告总结</span>
</el-row>
<el-row>
<el-row>
<el-input type="textarea" :rows="8" v-model="remark"></el-input>
</el-row>
</el-row>
</el-row>
</section>
</template>
@ -90,7 +90,7 @@
import { initDicts, addXmTestPlan,editXmTestPlan,editSomeFieldsXmTestPlan } from '@/api/xm/core/xmTestPlan';
import { mapGetters } from 'vuex'
import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect';
import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//
export default {
name:'xmTestPlanEdit',
@ -134,11 +134,11 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}
},
'visible':function(visible) {
'visible':function(visible) {
if(visible==true){
this.initData()
}
}
}
},
data() {
return {
@ -152,12 +152,12 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
},// 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:''
},
@ -178,7 +178,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
saveSubmit: function () {
this.$refs.rawDatasRef.validate((valid) => {
if (valid) {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.load.edit=true
let params = Object.assign({}, this.rawDatas);
var func=addXmTestPlan
@ -202,10 +202,10 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}
});
},
initData: function(){
initData: function(){
if(this.xmTestPlan){
this.rawDatas = Object.assign({},this.xmTestPlan);
}
}
if(this.rptDatas){
this.rawDatas=Object.assign({},this.rptDatas)
}
@ -218,7 +218,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}
let params={};
params['ids']=[row].map(i=>i.id)
if(fieldName=='stime'){
params[fieldName]=$event.stime
params.etime=$event.etime
@ -233,7 +233,7 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
let tips = res.data.tips;
if(tips.isOk){
this.rawDatasBak=[...this.rawDatas]
this.$emit('edit-fields',params)
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'})
@ -244,9 +244,9 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
this.rawDatas.projectId=row.id
this.rawDatas.projectName=row.name
this.rawDatas.name=this.rawDatas.projectName+'-测试计划-V1.0'
},
},
sizeAutoChange(){
}
},//end method
mounted() {
@ -260,6 +260,6 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
</script>
<style lang="scss" scoped>
<style lang="scss" scoped>
@import '../index/overview.scss';
</style>
</style>
Loading…
Cancel
Save