Browse Source

更新项目框架

master
陈裕财 5 years ago
parent
commit
661beb876a
  1. 17
      src/styles/mdp.scss
  2. 159
      src/views/xm/core/xmIteration/XmIterationComplex.vue
  3. 144
      src/views/xm/core/xmIteration/XmIterationSelect.vue
  4. 13
      src/views/xm/core/xmIterationMenu/XmIterationMenuMng.vue
  5. 3
      src/views/xm/core/xmIterationState/XmIterationStateMng.vue
  6. 261
      src/views/xm/core/xmIterationState/XmIterationStateShow.vue
  7. 91
      src/views/xm/core/xmMenu/XmMenuMng.vue
  8. 29
      src/views/xm/core/xmProduct/XmProductMng.vue
  9. 29
      src/views/xm/core/xmProduct/XmProductSelect.vue
  10. 273
      src/views/xm/core/xmProject/XmProjectInfo.vue
  11. 200
      src/views/xm/core/xmQuestion/XmQuestionEdit.vue
  12. 470
      src/views/xm/core/xmQuestion/XmQuestionMng.vue
  13. 4
      src/views/xm/core/xmTask/XmTaskEdit.vue
  14. 4
      src/views/xm/core/xmTask/XmTaskMng.vue

17
src/styles/mdp.scss

@ -1,10 +1,20 @@
//main-container全局样式 //main-container全局样式
.page-full-height{ .page-full-height{
height: calc(100vh);
height: calc(100vh);
} }
.page-height{ .page-height{
height: calc(90vh);
height: calc(90vh);
} }
.page-main-height{
height: calc(80vh);
overflow: auto;
}
.page-bottom-height{
height: calc(10vh);
overflow: auto;
}
.page-container { .page-container {
.page-header{ .page-header{
flex: 0 0 auto; flex: 0 0 auto;
@ -43,11 +53,14 @@
background-color:rgb(182, 206, 214); background-color:rgb(182, 206, 214);
} }
.page-main{ .page-main{
padding-top: 10px;
padding-left: 10px; padding-left: 10px;
padding-right: 10px; padding-right: 10px;
padding-bottom: 10px;
border:1px solid #e8e8e8; border:1px solid #e8e8e8;
} }
.page-bottom{ .page-bottom{
margin-top:5px;
padding-left:5px; padding-left:5px;
padding-right:5px; padding-right:5px;
} }

159
src/views/xm/core/xmIteration/XmIterationComplex.vue

@ -0,0 +1,159 @@
<template>
<section class="page-container border">
<el-row>
<el-col :span="iterationVisible==true?6:0" >
<xm-iteration-select :sel-project="selProject" @row-click="onIterationRowClick" @clear-select="onIterationClearSelect"></xm-iteration-select>
</el-col>
<el-col :span="iterationVisible==true?18:24" >
<el-tabs type="border-card">
<el-tab-pane label="产品、战略" lazy>
<span v-show="iterationVisible==true" slot="label" ><i class="el-icon-d-arrow-left" @click.stop="iterationVisible=false"></i> 产品战略</span>
<span v-show="iterationVisible==false" slot="label" ><i class="el-icon-d-arrow-right" @click.stop="iterationVisible=true"></i> 产品战略</span>
<xm-product-mng v-if="xmIteration" :xm-iteration="xmIteration" :sel-project="selProject"></xm-product-mng>
</el-tab-pane>
<el-tab-pane label="需求" lazy>
<xm-menu-mng v-if="xmIteration" :xm-iteration="xmIteration" :sel-project="selProject"></xm-menu-mng>
</el-tab-pane>
<el-tab-pane label="任务" lazy>
<xm-task-mng v-if="xmIteration" :sel-project="selProject"></xm-task-mng>
</el-tab-pane>
<el-tab-pane label="缺陷" lazy>
<xm-question-mng v-if="xmIteration" :sel-project="selProject"></xm-question-mng>
</el-tab-pane>
<el-tab-pane label="迭代概览" lazy>
<xm-iteration-state-show v-if="xmIteration" :sel-project="selProject"></xm-iteration-state-show>
</el-tab-pane>
</el-tabs>
<el-row>
</el-row>
</el-col>
</el-row>
</section>
</template>
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { listXmIteration,listXmIterationWithState, delXmIteration, batchDelXmIteration,loadTasksToXmIterationState } from '@/api/xm/core/xmIteration';
import XmIterationSelect from './XmIterationSelect.vue'
import XmMenuMng from '../xmMenu/XmMenuMng.vue'
import XmIterationStateShow from '../xmIterationState/XmIterationStateShow.vue'
import { mapGetters } from 'vuex'
import XmProductMng from '../xmProduct/XmProductMng.vue';
import XmTaskMng from '../xmTask/XmTaskMng.vue';
import XmQuestionMng from '../xmQuestion/XmQuestionMng.vue';
export default {
computed: {
...mapGetters([
'userInfo','roles'
]),
},
props:['visible','selProject'],
watch:{
visible:function(visible){
if(visible==true){
}
}
},
data() {
return{
xmIteration:null,
showPanel:'menus',//menus,tasks,bugs,iterationStateShow
topModules:
[
{
moduleName:"项目",
topModuleId:'xm',
link:"/xm/core/xmProject/XmProjectMng",
icon: require("@/assets/image/platform/module-project.png"),
isHighlight:false,
moduleType : '1' // 1- 2-
},
{
moduleName:"产品",
topModuleId:'xm',
link:"/xm/core/xmProduct/XmProductMng",
icon: require("@/assets/image/platform/module-marketing.png"),
isHighlight:false,
moduleType : '1' // 1- 2-
},
{
moduleName:"故事",
topModuleId:'xm',
link:"/xm/core/xmMenu/XmMenuMng",
icon: require("@/assets/image/platform/module-intelligentForms.png"),
isHighlight:false,
moduleType : '1' // 1- 2-
},
{
moduleName:"迭代",
topModuleId:'xm',
link:"/xm/core/xmIteration/XmIterationMng",
icon: require("@/assets/image/platform/module-iteration.png"),
isHighlight:false,
moduleType : '1' // 1- 2-
},
{
moduleName:"任务",
topModuleId:'xm',
link:"/xm/core/xmTask/XmMyTaskCenter",
icon: require("@/assets/image/platform/module-task.png"),
isHighlight:false,
moduleType : '1' // 1- 2-
},
{
moduleName:"缺陷",
topModuleId:'xm',
link:"/xm/core/xmQuestion/XmQuestionMng",
icon: require("@/assets/image/platform/anti-fake.png"),
isHighlight:false,
moduleType : '1' // 1- 2-
}
],
iterationVisible:true,
/**end 自定义属性请在上面加 请加备注**/
}
},//end data
methods: {
/**end 自定义函数请在上面加**/
onIterationRowClick(iteration){
this.xmIteration=iteration
},
onIterationClearSelect(){
this.iteration=null;
}
},//end methods
components: {
//
XmIterationSelect,
XmMenuMng,
XmIterationStateShow,
XmProductMng,
XmTaskMng,
XmQuestionMng
},
mounted() {
this.$nextTick(() => {
});
}
}
</script>
<style scoped>
.more-label-font{
text-align:center;
float:left;
padding-top:5px;
}
</style>

144
src/views/xm/core/xmIteration/XmIterationSelect.vue

@ -5,68 +5,66 @@
<el-table ref="table" :height="tableHeight" :data="xmIterationTreeData" row-key="id" default-expand-all :tree-props="{children: 'children', hasChildren: 'hasChildren'}" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;"> <el-table ref="table" :height="tableHeight" :data="xmIterationTreeData" row-key="id" default-expand-all :tree-props="{children: 'children', hasChildren: 'hasChildren'}" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column prop="iterationName" label="迭代名称" min-width="160" > <el-table-column prop="iterationName" label="迭代名称" min-width="160" >
<template slot="header" slot-scope="scope"> <template slot="header" slot-scope="scope">
<el-row>
迭代名称 <el-tag size="mini" v-if="editForm.iterationName" closable @close="clearSelectIteration()">{{editForm.seqNo}}&nbsp;{{editForm.iterationName}}</el-tag>
迭代名称 <el-popover v-if=" !menuId && !productId"
placement="top-start"
title=""
width="400"
trigger="click" >
<el-row>
<el-col :span="24" style="padding-top:5px;">
<font class="more-label-font">
迭代查询范围
</font>
<el-select size="mini" v-model="filters.queryScope" style="width:100%;" placeholder="迭代查询范围">
<el-option :label="userInfo.branchName+'机构下所有的迭代'" value="branchId"></el-option>
<el-option label="我相关的迭代" value="compete"></el-option>
<el-option label="按迭代编号精确查找" value="iterationId"></el-option>
<el-option label="后台智能匹配" value=""></el-option>
</el-select>
</el-col>
<el-col v-if="filters.queryScope=='iterationId'" :span="24" style="padding-top:5px;">
<el-input size="mini" v-model="filters.id" style="width:100%;" placeholder="输入迭代编号" @keyup.enter.native="searchXmProducts">
</el-input>
</el-col>
<el-col v-if="filters.queryScope!='iterationId'" :span="24" style="padding-top:5px;">
<font class="more-label-font">上线时间:</font>
<el-date-picker size="mini"
v-model="dateRangerOnline"
type="daterange"
align="right"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="完成日期"
value-format="yyyy-MM-dd"
:default-time="['00:00:00','23:59:59']"
:picker-options="pickerOptions"
></el-date-picker>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<font class="more-label-font">迭代名称:</font><el-input size="mini" v-model="filters.key" style="width: 60%;" placeholder="模糊查询"></el-input>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<el-tag>默认只能查询本人创建的迭代本人作为故事责任人参与的迭代</el-tag>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<el-button size="mini" type="primary" icon="el-icon-search" @click="getXmIterations">查询</el-button>
</el-col>
</el-row> </el-row>
</template>
<el-button slot="reference" icon="el-icon-more" circle></el-button>
</el-popover>
</template>
<template slot-scope="scope"> <template slot-scope="scope">
{{scope.row.seqNo}} &nbsp;&nbsp;{{scope.row.iterationName}}
{{scope.row.seqNo}} &nbsp;&nbsp;{{scope.row.iterationName}}<br>
<font class="font-class">{{formatterDate(scope.row,null,scope.row.startTime)}}~{{formatterDate(scope.row,null,scope.row.endTime)}} </font>
<el-tag type="warning">{{!scope.row.iphase?'未开始':scope.row.iphase}}</el-tag>
<el-tooltip content="点击统计进度"><el-button size="mini" icon="el-icon-video-play" @click.stop="loadTasksToXmIterationState( scope.row)"></el-button></el-tooltip>
<div class="progress">
<el-progress :percentage="calcFinishRate(scope.row)"></el-progress>
</div>
</template> </template>
</el-table-column>
<el-table-column prop="onlineTime" label="上线时间" min-width="80" :formatter="formatterDate">
<template slot="header" slot-scope="scope">
上线时间 <el-popover v-if=" !menuId && !productId"
placement="top-start"
title=""
width="400"
trigger="click" >
<el-row>
<el-col :span="24" style="padding-top:5px;">
<font class="more-label-font">
迭代查询范围
</font>
<el-select size="mini" v-model="filters.queryScope" style="width:100%;" placeholder="迭代查询范围">
<el-option :label="userInfo.branchName+'机构下所有的迭代'" value="branchId"></el-option>
<el-option label="我相关的迭代" value="compete"></el-option>
<el-option label="按迭代编号精确查找" value="iterationId"></el-option>
<el-option label="后台智能匹配" value=""></el-option>
</el-select>
</el-col>
<el-col v-if="filters.queryScope=='iterationId'" :span="24" style="padding-top:5px;">
<el-input size="mini" v-model="filters.id" style="width:100%;" placeholder="输入迭代编号" @keyup.enter.native="searchXmProducts">
</el-input>
</el-col>
<el-col v-if="filters.queryScope!='iterationId'" :span="24" style="padding-top:5px;">
<font class="more-label-font">上线时间:</font>
<el-date-picker size="mini"
v-model="dateRangerOnline"
type="daterange"
align="right"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="完成日期"
value-format="yyyy-MM-dd"
:default-time="['00:00:00','23:59:59']"
:picker-options="pickerOptions"
></el-date-picker>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<font class="more-label-font">迭代名称:</font><el-input size="mini" v-model="filters.key" style="width: 60%;" placeholder="模糊查询"></el-input>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<el-tag>默认只能查询本人创建的迭代本人作为故事责任人参与的迭代</el-tag>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<el-button size="mini" type="primary" icon="el-icon-search" @click="getXmIterations">查询</el-button>
</el-col>
</el-row>
<el-button slot="reference" icon="el-icon-more" circle></el-button>
</el-popover>
</template>
</el-table-column>
</el-table-column>
</el-table> </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-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>
@ -323,9 +321,28 @@
}else{ }else{
return cellValue; return cellValue;
} }
},
},
/**end 自定义函数请在上面加**/ /**end 自定义函数请在上面加**/
calcFinishRate(row){
if(row.finishRate){
return parseInt(row.finishRate);
}else{
return 0;
}
},
loadTasksToXmIterationState(row){
this.load.edit=true;
loadTasksToXmIterationState({id:row.id}).then(res=>{
this.load.edit=false;
var tips =res.data.tips;
if(tips.isOk){
this.getXmIterations();
}
this.$message({ message: tips.msg, type: tips.isOk?'success':'error'});
});
},
},//end methods },//end methods
components: { components: {
// //
@ -343,10 +360,13 @@
</script> </script>
<style scoped>
<style rel="stylesheet/scss" lang="scss" scoped>
.more-label-font{ .more-label-font{
text-align:center; text-align:center;
float:left; float:left;
padding-top:5px;
padding-top:5px;
} }
.font-class{
color: rgba(116, 85, 85, 0.493);
}
</style> </style>

13
src/views/xm/core/xmIterationMenu/XmIterationMenuMng.vue

@ -2,10 +2,10 @@
<section> <section>
<el-row > <el-row >
<el-col :span="8" class="app-container">
<el-col :span="8" class="app-container" v-if="!xmIteration">
<xm-iteration-mng :simple="true" @row-click="onIterationRowClick" @clear-select="onIterationClearSelect"></xm-iteration-mng> <xm-iteration-mng :simple="true" @row-click="onIterationRowClick" @clear-select="onIterationClearSelect"></xm-iteration-mng>
</el-col> </el-col>
<el-col :span="16">
<el-col :span="xmIteration?24:16">
<el-row class="app-container"> <el-row class="app-container">
<el-input v-model="filters.key" style="width: 20%;" placeholder="模糊查询"> <el-input v-model="filters.key" style="width: 20%;" placeholder="模糊查询">
<template slot="append"> <template slot="append">
@ -52,6 +52,7 @@
export default { export default {
props:['xmIteration'],
computed: { computed: {
...mapGetters([ ...mapGetters([
'userInfo','roles' 'userInfo','roles'
@ -60,6 +61,11 @@
return this.translateDataToTree(this.xmIterationMenus); return this.translateDataToTree(this.xmIterationMenus);
}, },
}, },
watch:{
'xmIteration':function(xmIteration){
this.onIterationRowClick(xmIteration)
}
},
data() { data() {
return { return {
filters: { filters: {
@ -322,6 +328,9 @@
// //
}, },
mounted() { mounted() {
if(this.xmIteration){
this.iteration=this.xmIteration
}
this.$nextTick(() => { this.$nextTick(() => {
var clientRect=this.$refs.table.$el.getBoundingClientRect(); var clientRect=this.$refs.table.$el.getBoundingClientRect();
var subHeight=50/1000 * window.innerHeight; var subHeight=50/1000 * window.innerHeight;

3
src/views/xm/core/xmIterationState/XmIterationStateMng.vue

@ -54,8 +54,7 @@
import { listXmIterationState, delXmIterationState, batchDelXmIterationState } from '@/api/xm/core/xmIterationState'; import { listXmIterationState, delXmIterationState, batchDelXmIterationState } from '@/api/xm/core/xmIterationState';
import XmIterationStateAdd from './XmIterationStateAdd';// import XmIterationStateAdd from './XmIterationStateAdd';//
import XmIterationStateEdit from './XmIterationStateEdit';// import XmIterationStateEdit from './XmIterationStateEdit';//
import { mapGetters } from 'vuex'
import TabPane from '../../../example/tab/components/tabPane.vue';
import { mapGetters } from 'vuex'
export default { export default {
computed: { computed: {

261
src/views/xm/core/xmIterationState/XmIterationStateShow.vue

@ -0,0 +1,261 @@
<template>
<section>
<el-row v-if="!xmIteration" class="app-container">
<el-input v-model="filters.key" style="width: 20%;" placeholder="模糊查询"></el-input>
<el-button type="primary" v-loading="load.list" :disabled="load.list==true" v-on:click="searchXmIterationStates">查询</el-button>
</el-row>
<el-row class="app-container">
<!--列表 XmIterationState 迭代定义-->
<el-table :data="xmIterationStates" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column sortable type="index" width="45"></el-table-column>
<el-table-column prop="iterationName" label="迭代名称" min-width="80" ></el-table-column>
<el-table-column prop="finishRate" label="进度" min-width="80">
<template slot-scope="scope">
{{scope.row.finishRate}} %
</template>
</el-table-column>
<el-table-column prop="calcTime" label="计算日期" min-width="80" ></el-table-column>
<el-table-column prop="budgetCost" label="预算成本" min-width="80" ></el-table-column>
<el-table-column prop="budgetWorkload" label="预算工作量" min-width="80" ></el-table-column>
<el-table-column prop="distBudgetCost" label="已分配到任务的预算" min-width="80" ></el-table-column>
<el-table-column prop="distBudgetWorkload" label="已分配到任务的预算工作量" min-width="80" ></el-table-column>
<el-table-column prop="actCost" label="实际成本" min-width="80" ></el-table-column>
<el-table-column prop="actWorkload" label="实际工作量" min-width="80" ></el-table-column>
<el-table-column prop="actStaffNum" label="实际投入人员数" min-width="80" ></el-table-column>
<el-table-column prop="testCases" label="测试用例总数" min-width="80" ></el-table-column>
<el-table-column prop="execCases" label="测试中用例总数" min-width="80" ></el-table-column>
<el-table-column prop="designCases" label="设计中用例总数" min-width="80" ></el-table-column>
<el-table-column prop="finishCases" label="完成用例总数" min-width="80" ></el-table-column>
<el-table-column prop="projectCnt" label="关联项目数" min-width="80" ></el-table-column>
<el-table-column prop="productCnt" label="关联产品数" min-width="80" ></el-table-column>
<el-table-column prop="menuCnt" label="关联故事数" min-width="80" ></el-table-column>
<el-table-column prop="taskCnt" label="关联任务数" min-width="80" ></el-table-column>
<el-table-column prop="finishTaskCnt" label="已完成的任务数" min-width="80" ></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>
<!--编辑 XmIterationState 迭代定义界面-->
<el-dialog title="编辑迭代定义" :visible.sync="editFormVisible" width="50%" append-to-body :close-on-click-modal="false">
<xm-iteration-state-edit :xm-iteration-state="editForm" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit"></xm-iteration-state-edit>
</el-dialog>
<!--新增 XmIterationState 迭代定义界面-->
<el-dialog title="新增迭代定义" :visible.sync="addFormVisible" width="50%" append-to-body :close-on-click-modal="false">
<xm-iteration-state-add :xm-iteration-state="addForm" :visible="addFormVisible" @cancel="addFormVisible=false" @submit="afterAddSubmit"></xm-iteration-state-add>
</el-dialog>
</el-row>
</section>
</template>
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { listXmIterationState, delXmIterationState, batchDelXmIterationState } from '@/api/xm/core/xmIterationState';
import XmIterationStateAdd from './XmIterationStateAdd';//
import XmIterationStateEdit from './XmIterationStateEdit';//
import { mapGetters } from 'vuex'
export default {
computed: {
...mapGetters([
'userInfo','roles'
])
},
props:['xmIteration'],
watch:{
xmIteration(xmIteration){
this.getXmIterationStates();
}
},
data() {
return {
filters: {
key: ''
},
xmIterationStates: [],//
pageInfo:{//
total:0,//0>0
pageSize:10,//
count:false,//
pageNum:1,//1
orderFields:[],// ['sex','student_id']
orderDirs:[]// asc,desc ['asc','desc']
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmIterationState
//xmIterationState
addForm: {
id:'',distBudgetCost:'',distBudgetWorkload:'',actCost:'',actWorkload:'',actStaffNum:'',finishRate:'',testCases:'',execCases:'',designCases:'',finishCases:'',projectCnt:'',productCnt:'',menuCnt:'',taskCnt:'',finishTaskCnt:'',calcTime:'',iterationName:'',budgetCost:'',budgetWorkload:'',iterationId:''
},
editFormVisible: false,//
//xmIterationState
editForm: {
id:'',distBudgetCost:'',distBudgetWorkload:'',actCost:'',actWorkload:'',actStaffNum:'',finishRate:'',testCases:'',execCases:'',designCases:'',finishCases:'',projectCnt:'',productCnt:'',menuCnt:'',taskCnt:'',finishTaskCnt:'',calcTime:'',iterationName:'',budgetCost:'',budgetWorkload:'',iterationId:''
}
/**begin 自定义属性请在下面加 请加备注**/
/**end 自定义属性请在上面加 请加备注**/
}
},//end data
methods: {
handleSizeChange(pageSize) {
this.pageInfo.pageSize=pageSize;
this.getXmIterationStates();
},
handleCurrentChange(pageNum) {
this.pageInfo.pageNum = pageNum;
this.getXmIterationStates();
},
// obj.order=ascending/descending, asc/desc ; obj.prop=,
sortChange( obj ){
var dir='asc';
if(obj.order=='ascending'){
dir='asc'
}else{
dir='desc';
}
if(obj.prop=='xxx'){
this.pageInfo.orderFields=['xxx'];
this.pageInfo.orderDirs=[dir];
}
this.getXmIterationStates();
},
searchXmIterationStates(){
this.pageInfo.count=true;
this.getXmIterationStates();
},
// XmIterationState
getXmIterationStates() {
let params = {
pageSize: this.pageInfo.pageSize,
pageNum: this.pageInfo.pageNum,
total: this.pageInfo.total,
count:this.pageInfo.count
};
if(this.pageInfo.orderFields!=null && this.pageInfo.orderFields.length>0){
let orderBys=[];
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.key!==""){
//params.xxx=this.filters.key
}else{
//params.xxx=xxxxx
}
if(this.xmIteration){
params.iterationId=this.xmIteration.id
}
this.load.list = true;
listXmIterationState(params).then((res) => {
var tips=res.data.tips;
if(tips.isOk){
this.pageInfo.total = res.data.total;
this.pageInfo.count=false;
this.xmIterationStates = res.data.data;
}else{
this.$message({ message: tips.msg, type: 'error' });
}
this.load.list = false;
}).catch( err => this.load.list = false );
},
// XmIterationState
showEdit: function ( row,index ) {
this.editFormVisible = true;
this.editForm = Object.assign({}, row);
},
// XmIterationState
showAdd: function () {
this.addFormVisible = true;
//this.addForm=Object.assign({}, this.editForm);
},
afterAddSubmit(){
this.addFormVisible=false;
this.pageInfo.count=true;
this.getXmIterationStates();
},
afterEditSubmit(){
this.editFormVisible=false;
},
//xmIterationState
selsChange: function (sels) {
this.sels = sels;
},
//xmIterationState
handleDel: function (row,index) {
this.$confirm('确认删除该记录吗?', '提示', {
type: 'warning'
}).then(() => {
this.load.del=true;
let params = { id: row.id };
delXmIterationState(params).then((res) => {
this.load.del=false;
var tips=res.data.tips;
if(tips.isOk){
this.pageInfo.count=true;
this.getXmIterationStates();
}
this.$message({ message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.del=false );
});
},
//xmIterationState
batchDel: function () {
this.$confirm('确认删除选中记录吗?', '提示', {
type: 'warning'
}).then(() => {
this.load.del=true;
batchDelXmIterationState(this.sels).then((res) => {
this.load.del=false;
var tips=res.data.tips;
if( tips.isOk ){
this.pageInfo.count=true;
this.getXmIterationStates();
}
this.$message({ message: tips.msg, type: tips.isOk?'success':'error'});
}).catch( err => this.load.del=false );
});
},
rowClick: function(row, event, column){
this.$emit('row-click',row, event, column);// @row-click="rowClick"
},
/**begin 自定义函数请在下面加**/
/**end 自定义函数请在上面加**/
},//end methods
components: {
'xm-iteration-state-add':XmIterationStateAdd,
'xm-iteration-state-edit':XmIterationStateEdit
//
},
mounted() {
this.$nextTick(() => {
this.getXmIterationStates();
});
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
}
});
**/
}
}
</script>
<style scoped>
</style>

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

@ -1,6 +1,10 @@
<template> <template>
<section> <section>
<el-row class="app-container" v-if=" !batchEditVisible"> <el-row class="app-container" v-if=" !batchEditVisible">
<el-col :span="6">
<xm-product-mng :sel-project="selProject" @row-click="onProductSelected" ref="xmProductMng" :simple="true"></xm-product-mng>
</el-col>
<el-col :span="18">
<el-row> <el-row>
<el-select v-model="filters.taskFilterType" placeholder="是否分配了任务?" clearable > <el-select v-model="filters.taskFilterType" placeholder="是否分配了任务?" clearable >
<el-option value="not-join" label="未分配任何任务的故事"></el-option> <el-option value="not-join" label="未分配任何任务的故事"></el-option>
@ -27,8 +31,7 @@
<el-button type="primary" @click="showAdd" icon="el-icon-plus">故事</el-button> <el-button type="primary" @click="showAdd" icon="el-icon-plus">故事</el-button>
<el-button @click="toBatchEdit" icon="el-icon-edit">修改</el-button>
<el-button @click="toSelectProduct" icon="el-icon-back">产品</el-button>
<el-button @click="toBatchEdit" icon="el-icon-edit">修改</el-button>
<el-popover <el-popover
placement="top-start" placement="top-start"
title="" title=""
@ -94,38 +97,24 @@
<el-table-column sortable type="selection" width="40"></el-table-column> <el-table-column sortable type="selection" width="40"></el-table-column>
<el-table-column prop="menuName" label="故事名称" min-width="160" show-overflow-tooltip> <el-table-column prop="menuName" label="故事名称" min-width="160" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{scope.row.seqNo}}&nbsp;&nbsp;<el-link type="primary" @click="showMenuExchange(scope.row)">{{scope.row.menuName}}</el-link></span>
</template>
</el-table-column>
<el-table-column prop="mmUsername" label="负责人" min-width="80" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="finishRate" label="总体进度" width="100" >
<template slot-scope="scope">
{{scope.row.finishRate}}%
</template>
</el-table-column>
<el-table-column prop="remark" label="描述" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<el-popover
v-if="scope.row.remark && scope.row.remark.length>20"
placement="top-start"
title="故事备注"
width="400"
trigger="click" >
<div v-html="scope.row.remark">
</div>
<div slot="reference">{{scope.row.remark?scope.row.remark.substr(0,18)+"...":""}}</div>
</el-popover>
<div v-else v-html="scope.row.remark">
</div>
</template>
</el-table-column>
<el-table-column label="操作" width="200" fixed="right" >
<template slot-scope="scope">
<span>{{scope.row.seqNo}}&nbsp;&nbsp;<el-link type="primary" @click="showEdit(scope.row)">{{scope.row.menuName}}</el-link></span>
<font class="align-right">
<span><el-tag :type="scope.row.finishRate>=100?'success':'warning'">{{scope.row.finishRate}}%</el-tag></span>
&nbsp;&nbsp;
<el-tooltip content="需求负责人"><span>{{scope.row.mmUsername}} </span> </el-tooltip>
<el-tooltip content="任务负责人"><span>{{scope.row.chargeUsername}} </span> </el-tooltip>
<el-popover
placement="top-start"
title="故事备注"
width="400"
trigger="click" >
<div v-html="scope.row.remark">
</div>
<el-tag slot="reference" icon="el-icon-chat-line-square">描述</el-tag>
</el-popover>
<el-button type="primary" @click="showSubAdd( scope.row,scope.$index)" icon="el-icon-plus" circle></el-button>
<el-button @click="showEdit(scope.row)" icon="el-icon-edit" circle></el-button>
<el-button type="primary" @click="showSubAdd( scope.row,scope.$index)" icon="el-icon-plus" circle></el-button>
<el-popover style="padding-left:10px;" <el-popover style="padding-left:10px;"
v-if="isPmUser" v-if="isPmUser"
placement="top-start" placement="top-start"
@ -149,16 +138,17 @@
<el-button slot="reference" icon="el-icon-more" circle></el-button> <el-button slot="reference" icon="el-icon-more" circle></el-button>
</el-popover> </el-popover>
</font>
</template> </template>
</el-table-column>
</el-table-column>
</el-table> </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-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界面--> <!--编辑 XmMenu xm_project_menu界面-->
<el-dialog title="编辑故事" :visible.sync="editFormVisible" width="50%" append-to-body :close-on-click-modal="false">
<el-drawer title="编辑故事" :visible.sync="editFormVisible" width="50%" append-to-body :close-on-click-modal="false">
<xm-menu-edit :xm-menu="editForm" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit"></xm-menu-edit> <xm-menu-edit :xm-menu="editForm" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit"></xm-menu-edit>
</el-dialog>
</el-drawer>
<!--新增 XmMenu xm_project_menu界面--> <!--新增 XmMenu xm_project_menu界面-->
<el-dialog title="新增故事" :visible.sync="addFormVisible" width="50%" append-to-body :close-on-click-modal="false"> <el-dialog title="新增故事" :visible.sync="addFormVisible" width="50%" append-to-body :close-on-click-modal="false">
@ -198,7 +188,8 @@
<el-dialog title="选择员工" :visible.sync="selectFiltersMmUserVisible" width="60%" append-to-body> <el-dialog title="选择员工" :visible.sync="selectFiltersMmUserVisible" width="60%" append-to-body>
<users-select @confirm="onFiltersMmUserSelected" ref="selectFiltersMmUser"></users-select> <users-select @confirm="onFiltersMmUserSelected" ref="selectFiltersMmUser"></users-select>
</el-dialog>
</el-dialog>
</el-col>
</el-row> </el-row>
<el-row v-if="batchEditVisible && filters.product" :span="24"> <el-row v-if="batchEditVisible && filters.product" :span="24">
@ -211,7 +202,7 @@
import util from '@/common/js/util';// import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header //import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';// //import { listOption } from '@/api/mdp/meta/itemOption';//
import { listXmMenu, delXmMenu, batchDelXmMenu,batchAddXmMenu,batchEditXmMenu,listXmMenuWithState } from '@/api/xm/core/xmMenu';
import { listXmMenu, delXmMenu, batchDelXmMenu,batchAddXmMenu,batchEditXmMenu,listXmMenuWithState,listXmMenuWithPlan } from '@/api/xm/core/xmMenu';
import { batchRelTasksWithMenu } from '@/api/xm/core/xmTask'; import { batchRelTasksWithMenu } from '@/api/xm/core/xmTask';
import { loadTasksToXmMenuState} from '@/api/xm/core/xmMenuState'; import { loadTasksToXmMenuState} from '@/api/xm/core/xmMenuState';
@ -233,7 +224,7 @@
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
export default { export default {
props:['selProject'],
props:['selProject','xmIteration'],
computed: { computed: {
...mapGetters([ ...mapGetters([
'userInfo','roles' 'userInfo','roles'
@ -393,14 +384,20 @@
} }
if(this.filters.mmUser){ if(this.filters.mmUser){
params.mmUserid=this.filters.mmUser.userid; params.mmUserid=this.filters.mmUser.userid;
}
params.excludeIterationId=this.excludeIterationId
}
if(this.filters.iterationFilterType){ if(this.filters.iterationFilterType){
params.iterationFilterType=this.filters.iterationFilterType params.iterationFilterType=this.filters.iterationFilterType
} }
if(this.xmIteration){
params.iterationFilterType='join'
params.iterationId=this.xmIteration.id
}
if(this.filters.taskFilterType){ if(this.filters.taskFilterType){
params.taskFilterType=this.filters.taskFilterType params.taskFilterType=this.filters.taskFilterType
} }
if(this.selProject){
params.projectId=this.selProject.id
}
params.ctimeStart=this.dateRanger[0]+" 00:00:00" params.ctimeStart=this.dateRanger[0]+" 00:00:00"
params.ctimeEnd=this.dateRanger[1]+" 23:59:59" params.ctimeEnd=this.dateRanger[1]+" 23:59:59"
let callback= (res)=>{ let callback= (res)=>{
@ -415,7 +412,7 @@
this.load.list = false; this.load.list = false;
} }
this.load.list = true; this.load.list = true;
listXmMenuWithState(params).then( callback ).catch( err => this.load.list = false );
listXmMenuWithPlan(params).then( callback ).catch( err => this.load.list = false );
}, },
// XmMenu xm_project_menu // XmMenu xm_project_menu
@ -809,10 +806,7 @@
// //
}, },
mounted() {
if(this.filters.product==null){
this.productVisible=true;
}
mounted() {
this.$nextTick(() => { this.$nextTick(() => {
var clientRect=this.$refs.table.$el.getBoundingClientRect(); var clientRect=this.$refs.table.$el.getBoundingClientRect();
var subHeight=50/1000 * window.innerHeight; var subHeight=50/1000 * window.innerHeight;
@ -830,5 +824,8 @@
text-align:center; text-align:center;
float:left; float:left;
padding-top:5px; padding-top:5px;
}
}
.align-right{
float: right;
}
</style> </style>

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

@ -94,19 +94,18 @@
<el-row class="app-container"> <el-row class="app-container">
<!--列表 XmProduct 产品表--> <!--列表 XmProduct 产品表-->
<el-table ref="table" :height="tableHeight" :data="xmProducts" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;"> <el-table ref="table" :height="tableHeight" :data="xmProducts" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column sortable type="selection" width="55"></el-table-column>
<el-table-column sortable type="index" width="55"></el-table-column>
<el-table-column prop="productName" label="产品名称" min-width="200" show-overflow-tooltip>
<el-table-column prop="productName" label="产品名称" min-width="300">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{scope.row.id}}&nbsp;&nbsp;<el-link type="primary" @click="showEdit(scope.row)">{{scope.row.productName}}</el-link></span>
</template>
</el-table-column>
<el-table-column prop="finishRate" label="进度" width="80" show-overflow-tooltip>
<template slot-scope="scope">
{{scope.row.finishRate}}%
<span><el-link type="primary" @click="showEdit(scope.row)">{{scope.row.productName}}</el-link></span>
<font class="align-right"><el-tag :type="scope.row.finishRate>=100?'success':'warning'">{{scope.row.finishRate}}%</el-tag>
<el-tooltip content="产品经理"><el-tag v-if="scope.row.pmUsername">{{scope.row.pmUsername}}</el-tag></el-tooltip>
<el-tooltip content="点击统计进度"><el-button size="mini" icon="el-icon-video-play" @click.stop="loadTasksToXmProductState( scope.row)"></el-button></el-tooltip>
</font>
</template> </template>
</el-table-column>
<el-table-column prop="pmUsername" label="产品经理" width="120" show-overflow-tooltip></el-table-column>
</el-table-column>
<el-table-column prop="planWorkload" label="预计工作量.人时" width="150" show-overflow-tooltip></el-table-column> <el-table-column prop="planWorkload" label="预计工作量.人时" width="150" show-overflow-tooltip></el-table-column>
<el-table-column prop="actWorkload" label="实际工作量.人时" width="150" show-overflow-tooltip></el-table-column> <el-table-column prop="actWorkload" label="实际工作量.人时" width="150" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="200" fixed="right"> <el-table-column label="操作" width="200" fixed="right">
@ -143,9 +142,9 @@
</el-row> </el-row>
<!--编辑 XmProduct 产品表界面--> <!--编辑 XmProduct 产品表界面-->
<el-dialog title="编辑产品" :visible.sync="editFormVisible" width="50%" append-to-body :close-on-click-modal="false">
<el-drawer title="编辑产品" :visible.sync="editFormVisible" width="50%" append-to-body :close-on-click-modal="false">
<xm-product-edit :xm-product="editForm" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit"></xm-product-edit> <xm-product-edit :xm-product="editForm" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit"></xm-product-edit>
</el-dialog>
</el-drawer>
<!--新增 XmProduct 产品表界面--> <!--新增 XmProduct 产品表界面-->
<el-dialog title="新增产品" :visible.sync="addFormVisible" width="50%" append-to-body :close-on-click-modal="false"> <el-dialog title="新增产品" :visible.sync="addFormVisible" width="50%" append-to-body :close-on-click-modal="false">
@ -488,4 +487,8 @@
float:left; float:left;
padding-top:5px; padding-top:5px;
} }
.align-right{
float: right;
}
</style> </style>

29
src/views/xm/core/xmProduct/XmProductSelect.vue

@ -3,8 +3,7 @@
<el-row > <el-row >
<!--列表 XmProduct 产品表--> <!--列表 XmProduct 产品表-->
<el-table ref="table" :height="tableHeight" :data="xmProducts" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;"> <el-table ref="table" :height="tableHeight" :data="xmProducts" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column sortable type="index" width="55"></el-table-column>
<el-table-column prop="productName" label="产品名称" min-width="150" >
<el-table-column prop="productName" label="产品名称" min-width="150" >
<template slot="header" slot-scope="scope"> <template slot="header" slot-scope="scope">
产品名称 产品名称
<el-popover <el-popover
@ -68,7 +67,13 @@
</el-popover> </el-popover>
</template> </template>
<template slot-scope="scope"> <template slot-scope="scope">
<font>{{scope.row.id}}&nbsp;&nbsp;<el-link type="primary">{{scope.row.productName}}</el-link></font>
<font>{{scope.row.productName}}</font>
<font class="align-right"><el-tag :type="scope.row.finishRate>=100?'success':'warning'">{{scope.row.finishRate}}%</el-tag>
<el-tooltip content="产品经理"><el-tag v-if="scope.row.pmUsername">{{scope.row.pmUsername}}</el-tag></el-tooltip>
<el-tooltip content="点击统计进度"><el-button size="mini" icon="el-icon-video-play" @click.stop="loadTasksToXmProductState( scope.row)"></el-button></el-tooltip>
</font>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="isSelectProduct==true" label="操作" width="100" fixed="right" > <el-table-column v-if="isSelectProduct==true" label="操作" width="100" fixed="right" >
@ -93,6 +98,7 @@
import { listXmProductWithState } from '@/api/xm/core/xmProduct'; import { listXmProductWithState } from '@/api/xm/core/xmProduct';
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import UsersSelect from "@/views/mdp/sys/user/UsersSelect"; import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
import { loadTasksToXmProductState } from '@/api/xm/core/xmProductState';
export default { export default {
@ -272,6 +278,20 @@
this.searchXmProducts(); this.searchXmProducts();
}, },
loadTasksToXmProductState: function (row) {
this.load.edit=true;
let params = { productId: row.id };
loadTasksToXmProductState(params).then((res) => {
this.load.edit=false;
var tips=res.data.tips;
if(tips.isOk){
this.pageInfo.count=true;
this.getXmProducts();
}
this.$message({ message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.edit=false );
},
},//end methods },//end methods
components: { components: {
UsersSelect, UsersSelect,
@ -296,4 +316,7 @@
float:left; float:left;
padding-top:5px; padding-top:5px;
} }
.align-right{
float: right;
}
</style> </style>

273
src/views/xm/core/xmProject/XmProjectInfo.vue

@ -1,114 +1,170 @@
<template> <template>
<section>
<el-row class="app-container app-height">
<el-tabs :tab-position="tabPosition" v-model="infotype" @tab-click="handleClick" stretch=true class="tabs">
<el-tab-pane name="项目概览" class="tab-pannel">
<span slot="label"><i class="el-icon-s-data"></i>项目概览</span>
<xm-detail v-if="infotype=='项目概览'" :sel-project="selProject" @submit="afterEditSubmit"></xm-detail>
</el-tab-pane>
<el-tab-pane label="迭代" name="迭代">
<span slot="label"><i class="el-icon-document-copy"></i>迭代</span>
<xm-iteration-mng v-if="infotype=='迭代'" ref="xmIterationMng" :sel-project="selProject" ></xm-iteration-mng>
</el-tab-pane>
<el-tab-pane label="产品" name="产品">
<span slot="label"><i class="el-icon-s-flag"></i>产品</span>
<xm-product-mng v-if="infotype=='产品'" ref="xmProductMng" :sel-project="selProject" ></xm-product-mng>
</el-tab-pane>
<el-tab-pane label="故事" name="用户故事">
<span slot="label"><i class="el-icon-document"></i>故事</span>
<xm-menu-mng v-if="infotype=='用户故事'" :sel-project="selProject"></xm-menu-mng>
</el-tab-pane>
<el-tab-pane label="任务" name="任务">
<span slot="label"><i class="el-icon-s-operation"></i>任务</span>
<xm-task-mng v-if="infotype=='任务'" ref="xmTaskMng" :sel-project="selProject" ></xm-task-mng>
</el-tab-pane>
<el-tab-pane label="缺陷" name="缺陷">
<span slot="label"><i class="el-icon-question"></i>缺陷</span>
<xm-question v-if="infotype=='缺陷'" :qtype="'bug'" :sel-project='selProject' ref="xmQuestion"></xm-question>
</el-tab-pane>
<el-tab-pane label="团队" name="团队">
<span slot="label"><i class="el-icon-user-solid"></i>团队</span>
<xm-group-mng v-if="infotype=='团队'" :sel-project="selProject"></xm-group-mng>
<section class="page-container page-full-height">
<el-row>
<el-menu :default-active="'项目概览'" mode="horizontal" @select="setInfotype" class="menus" background-color="#545c64" text-color="#fff" active-text-color="#ffd04b">
<el-menu-item index="返回" >
<span slot="title" @click.stop="goBack"><i class="el-icon-back" ></i></span>
</el-menu-item>
<el-menu-item index="项目概览" >
<span slot="title" >
<i class="el-icon-s-data"></i>
<el-tag type="danger" v-if="selProject.name.length>=10">{{selProject.name.substring(0,10)}}</el-tag>
<el-tag type="danger" v-else>{{selProject.name}}</el-tag>
概览
</span>
</el-menu-item>
<el-menu-item index="迭代">
<span slot="title"><i class="el-icon-document-copy"></i>迭代</span>
</el-menu-item>
<el-menu-item index="产品">
<span slot="title"><i class="el-icon-s-flag"></i>产品</span>
</el-menu-item>
<el-menu-item label="故事" index="用户故事">
<span slot="title"><i class="el-icon-document"></i>故事</span>
</el-menu-item>
<el-menu-item index="任务">
<span slot="title"><i class="el-icon-s-operation"></i>任务</span>
</el-tab-pane>
<el-tab-pane label="文档" name="文档">
<span slot="label"><i class="el-icon-document"></i>文档</span>
<xm-file-mng v-if="infotype=='文档'" :sel-project="selProject"></xm-file-mng>
</el-menu-item>
<el-menu-item index="缺陷">
<span slot="title"><i class="el-icon-question"></i>缺陷</span>
</el-tab-pane>
<el-tab-pane label="阶段计划" name="阶段计划">
<span slot="label"><i class="el-icon-odometer"></i>阶段计划</span>
<xm-project-phase-mng v-if="infotype=='阶段计划'" ref="xmProjectPhaseMng" :sel-project="selProject" ></xm-project-phase-mng>
</el-menu-item>
<el-menu-item index="团队">
<span slot="title"><i class="el-icon-user-solid"></i>团队</span>
</el-menu-item>
<el-menu-item index="文档">
<span slot="title"><i class="el-icon-document"></i>文档</span>
</el-menu-item>
<el-submenu index="规划与里程碑">
<template slot="title">规划与里程碑 </template>
<el-menu-item index="阶段计划及里程碑">
<span slot="title"><i class="el-icon-odometer"></i>阶段计划及里程碑</span>
</el-menu-item>
<el-menu-item index="测试计划">
<span slot="title"><i class="el-icon-odometer"></i>测试计划</span>
</el-menu-item>
</el-submenu >
<el-menu-item index="项目监控" class="hidden-lg-and-down">
<span slot="title"><i class="el-icon-video-camera"></i>项目监控</span>
</el-menu-item>
<el-menu-item index="故事监控" class="hidden-lg-and-down">
<span slot="title"><i class="el-icon-video-camera"></i>故事监控</span>
</el-menu-item>
<el-menu-item index="合同管理" class="hidden-md-and-down">
<span slot="title"><i class="el-icon-s-data"></i>合同管理</span>
</el-menu-item>
<el-menu-item index="预算" class="hidden-md-and-down">
<span slot="title"><i class="el-icon-coin"></i>预算</span>
</el-tab-pane>
<el-tab-pane label="测试计划" name="测试计划">
<span slot="label"><i class="el-icon-odometer"></i>测试计划</span>
<xm-test-case-exec-mng v-if="infotype=='测试计划'" :visible="infotype=='测试计划'" :sel-project='selProject' ref="xmQuestion"></xm-test-case-exec-mng>
</el-menu-item>
<el-menu-item index="费用" class="hidden-md-and-down">
<span slot="title"><i class="el-icon-coin"></i>费用</span>
</el-tab-pane>
<el-tab-pane label="故事监控" name="故事监控">
<span slot="label"><i class="el-icon-video-camera"></i>故事监控</span>
<xm-menu-with-plan v-if="infotype=='故事监控'" ref="xmMenuWithPlan" :sel-project="selProject"></xm-menu-with-plan>
</el-menu-item>
<el-menu-item index="考核" class="hidden-lg-and-down">
<span slot="title"><i class="el-icon-view"></i>考核</span>
</el-tab-pane>
<el-tab-pane label="项目监控" name="项目监控">
<span slot="label"><i class="el-icon-video-camera"></i>项目监控</span>
<xm-project-state-mng v-if="infotype=='项目监控'" :sel-project="selProject"></xm-project-state-mng>
</el-menu-item>
<el-menu-item index="日志" class="hidden-lg-and-down">
<span slot="title"><i class="el-icon-edit-outline"></i>日志</span>
</el-tab-pane>
<el-tab-pane label="预算" name="预算">
<span slot="label"><i class="el-icon-coin"></i>预算</span>
<xm-budget v-if="infotype=='预算'" :sel-project="selProject"></xm-budget>
</el-menu-item>
<el-menu-item index="环境清单" class="hidden-lg-and-down">
<span slot="title"><i class="el-icon-setting"></i>环境清单</span>
</el-menu-item>
<el-menu-item index="风险" class="hidden-lg-and-down">
<span slot="title"><i class="el-icon-question"></i>风险</span>
</el-menu-item>
<el-submenu index="更多">
<template slot="title">更多 </template>
<el-menu-item index="故事监控" >
<span slot="title"><i class="el-icon-video-camera"></i>故事监控</span>
</el-menu-item>
<el-menu-item index="项目监控">
<span slot="title"><i class="el-icon-video-camera"></i>项目监控</span>
</el-menu-item>
<el-menu-item index="预算">
<span slot="title"><i class="el-icon-coin"></i>预算</span>
</el-tab-pane>
<el-tab-pane label="费用" name="费用">
<span slot="label"><i class="el-icon-coin"></i>费用</span>
<xm-cost v-if="infotype=='费用'" :sel-project="selProject"></xm-cost>
</el-menu-item>
<el-menu-item index="费用">
<span slot="title"><i class="el-icon-coin"></i>费用</span>
</el-tab-pane>
<el-tab-pane label="考核" name="考核">
<span slot="label"><i class="el-icon-view"></i>考核</span>
<xm-project-kpi v-if="infotype=='考核'" :sel-project="selProject"></xm-project-kpi>
</el-menu-item>
<el-menu-item index="考核">
<span slot="title"><i class="el-icon-view"></i>考核</span>
</el-tab-pane>
<el-tab-pane label="日志" name="日志">
<span slot="label"><i class="el-icon-edit-outline"></i>日志</span>
<xm-record v-if="infotype=='日志'" :visible="infotype=='日志'" :sel-project="selProject"></xm-record>
</el-menu-item>
<el-menu-item index="日志">
<span slot="title"><i class="el-icon-edit-outline"></i>日志</span>
</el-tab-pane>
<el-tab-pane label="合同管理" name="合同管理">
<span slot="label"><i class="el-icon-s-data"></i>合同管理</span>
<xm-contract v-if="infotype=='合同管理'" :sel-project="selProject"></xm-contract>
</el-menu-item>
<el-menu-item index="合同管理">
<span slot="title"><i class="el-icon-s-data"></i>合同管理</span>
</el-tab-pane>
<el-tab-pane label="环境清单" name="环境清单">
<span slot="label"><i class="el-icon-setting"></i>环境清单</span>
<xm-env-list v-if="infotype=='环境清单'" :sel-project="selProject"></xm-env-list>
</el-tab-pane>
<el-tab-pane label="风险" name="风险">
<span slot="label"><i class="el-icon-question"></i>风险</span>
<xm-question v-if="infotype=='风险'" :qtype="'risk'" :sel-project='selProject' ref="xmRisk"></xm-question>
</el-tab-pane>
<el-tab-pane label="论坛" name="论坛">
<span slot="label"><i class="el-icon-date"></i>论坛</span>
</el-tab-pane>
<el-tab-pane label="即聊" name="即聊">
<span slot="label"><i class="el-icon-date"></i>即聊</span>
</el-tab-pane>
<el-tab-pane label="客服" name="客服">
<span slot="label"><i class="el-icon-date"></i>客服</span>
</el-menu-item>
<el-menu-item index="环境清单">
<span slot="title"><i class="el-icon-setting"></i>环境清单</span>
</el-menu-item>
<el-menu-item index="风险">
<span slot="title"><i class="el-icon-question"></i>风险</span>
</el-menu-item>
<el-menu-item index="论坛">
<span slot="title"><i class="el-icon-date"></i>论坛</span>
</el-menu-item>
<el-menu-item index="即聊">
<span slot="title"><i class="el-icon-date"></i>即聊</span>
</el-menu-item>
<el-menu-item index="客服">
<span slot="title"><i class="el-icon-date"></i>客服</span>
</el-tab-pane>
</el-tabs>
</el-row>
</el-menu-item>
</el-submenu>
</el-menu>
<el-dialog title="选中团队成员" :visible.sync="groupUserVisible" width="50%" append-to-body :close-on-click-modal="false">
<xm-project-group-select :sel-project="selProject" :visible="groupUserVisible" is-select-multi-user="1" @user-confirm="onUserSelected"></xm-project-group-select>
</el-dialog>
<xm-detail v-if="infotype=='项目概览'" :sel-project="selProject" @submit="afterEditSubmit"></xm-detail>
<xm-iteration-complex v-if="infotype=='迭代'" ref="xmIterationMng" :sel-project="selProject" ></xm-iteration-complex>
<xm-product-mng v-if="infotype=='产品'" ref="xmProductMng" :sel-project="selProject" ></xm-product-mng>
<xm-menu-mng v-if="infotype=='用户故事'" :sel-project="selProject"></xm-menu-mng>
<xm-task-mng v-if="infotype=='任务'" ref="xmTaskMng" :sel-project="selProject" ></xm-task-mng>
<xm-question v-if="infotype=='缺陷'" :qtype="'bug'" :sel-project='selProject' ref="xmQuestion"></xm-question>
<xm-group-mng v-if="infotype=='团队'" :sel-project="selProject"></xm-group-mng>
<xm-file-mng v-if="infotype=='文档'" :sel-project="selProject"></xm-file-mng>
<xm-project-phase-mng v-if="infotype=='阶段计划及里程碑'" ref="xmProjectPhaseMng" :sel-project="selProject" ></xm-project-phase-mng>
<xm-test-case-exec-mng v-if="infotype=='测试计划'" :visible="infotype=='测试计划'" :sel-project='selProject' ref="xmQuestion"></xm-test-case-exec-mng>
<xm-menu-with-plan v-if="infotype=='故事监控'" ref="xmMenuWithPlan" :sel-project="selProject"></xm-menu-with-plan>
<xm-project-state-mng v-if="infotype=='项目监控'" :sel-project="selProject"></xm-project-state-mng>
<xm-budget v-if="infotype=='预算'" :sel-project="selProject"></xm-budget>
<xm-cost v-if="infotype=='费用'" :sel-project="selProject"></xm-cost>
<xm-project-kpi v-if="infotype=='考核'" :sel-project="selProject"></xm-project-kpi>
<xm-record v-if="infotype=='日志'" :visible="infotype=='日志'" :sel-project="selProject"></xm-record>
<xm-contract v-if="infotype=='合同管理'" :sel-project="selProject"></xm-contract>
<xm-env-list v-if="infotype=='环境清单'" :sel-project="selProject"></xm-env-list>
<xm-question v-if="infotype=='风险'" :qtype="'risk'" :sel-project='selProject' ref="xmRisk"></xm-question>
<el-dialog title="选中团队成员" :visible.sync="groupUserVisible" width="50%" append-to-body :close-on-click-modal="false">
<xm-project-group-select :sel-project="selProject" :visible="groupUserVisible" is-select-multi-user="1" @user-confirm="onUserSelected"></xm-project-group-select>
</el-dialog>
</el-row>
</section> </section>
</template> </template>
@ -141,6 +197,7 @@
import xmTestCaseExecMng from '../xmTestCaseExec/XmTestCaseExecMng'; import xmTestCaseExecMng from '../xmTestCaseExec/XmTestCaseExecMng';
import xmIterationMng from '../xmIteration/XmIterationMng'; import xmIterationMng from '../xmIteration/XmIterationMng';
import xmProductMng from '../xmProduct/XmProductMng'; import xmProductMng from '../xmProduct/XmProductMng';
import XmIterationComplex from '../xmIteration/XmIterationComplex.vue';
export default { export default {
@ -163,6 +220,7 @@
}, },
data() { data() {
return { return {
platformViewVisible:false,
tabPosition:'left', tabPosition:'left',
infotype:"项目概览", infotype:"项目概览",
load:{list:false,edit:false}, load:{list:false,edit:false},
@ -335,6 +393,9 @@
return dateStr.substr(0,10); return dateStr.substr(0,10);
} }
}, },
goBack(){
this.$router.back()
}
},//end methods },//end methods
components: { components: {
@ -357,7 +418,8 @@
xmTestCaseExecMng, xmTestCaseExecMng,
xmProjectGroupSelect, xmProjectGroupSelect,
xmIterationMng, xmIterationMng,
xmProductMng
xmProductMng,
XmIterationComplex,
// //
}, },
mounted() { mounted() {
@ -368,17 +430,12 @@
} }
</script> </script>
<style scoped>
.tabs{
height: calc(98vh);
}
.tab-pannel{
overflow: auto;
height: calc(98vh);
}
.app-height{
height: calc(100vh);
}
<style rel="stylesheet/scss" lang="scss" scoped>
.menus{
.el-menu-item{
padding-left: 0px !important;
}
}
/* 超过宽度则用...代替 */ /* 超过宽度则用...代替 */
.truncate{ .truncate{
overflow: hidden; overflow: hidden;

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

@ -1,72 +1,69 @@
<template> <template>
<section>
<el-row class="xm-question">
<!--新增界面 XmQuestion xm_question-->
<el-row>
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editForm">
<el-col :span="12">
<el-form-item label="缺陷标题" prop="name">
{{editForm.name}}
</el-form-item>
<el-form-item label="隶属项目" prop="projectName">
{{selProject.name}}
</el-form-item>
<section class="page-container page-full-height border padding">
<el-row >
<el-row class="page-main page-main-height">
<el-form :model="editForm" :rules="editFormRules" ref="editForm">
<el-row class="padding-bottom">
<h2>{{editForm.name}}</h2>
<el-tooltip content="项目"><el-tag type="warning">{{selProject.name}} </el-tag></el-tooltip>
<el-divider direction="vertical"></el-divider>
<el-tag>{{editForm.createUsername}} {{editForm.createTime}} 创建 </el-tag>
<el-divider direction="vertical"></el-divider>
<el-date-picker :clearable="false" style="width:150px;" type="date" placeholder="到期日期" v-model="editForm.endTime" value-format="yyyy-MM-dd" format="yyyy-MM-dd"></el-date-picker>
</el-row>
<el-row class="padding-bottom">
<el-steps :active="calcBugStep" simple finish-status="success">
<el-step title="已激活,待确认" description="创建后自动激活、关闭后重新激活)"></el-step>
<el-step title="已确认,待解决" description="业务确认缺陷后变为已确认"></el-step>
<el-step title="已解决,待关闭" description="开发修复缺陷后,变成已解决"></el-step>
<el-step title="已关闭(可重新激活)" description="测试通过后变为已关闭,已关闭缺陷可以重新激活"></el-step>
</el-steps>
</el-row>
<el-form-item label="隶属任务" prop="taskName"> <el-form-item label="隶属任务" prop="taskName">
<el-tag v-if="editForm.taskId!='' && editForm.taskId!=null " closable @close="handleCloseTaskTag">{{editForm.taskName}}</el-tag><el-button @click="showSelectTask">选任务</el-button>
<el-tag v-if="editForm.taskId!='' && editForm.taskId!=null " closable @close="handleCloseTaskTag" @click="showSelectTask">{{editForm.taskName}}</el-tag>&nbsp;&nbsp;<el-button @click="showSelectTask">选任务</el-button>
</el-form-item> </el-form-item>
<el-form-item label="隶属故事" prop="menuName"> <el-form-item label="隶属故事" prop="menuName">
<el-tag v-if="editForm.menuId!='' && editForm.menuId!=null " closable @close="handleCloseMenuTag">{{editForm.menuName}}</el-tag><el-button @click="showSelectMenu">选故事</el-button>
<el-tag v-if="editForm.menuId!='' && editForm.menuId!=null " closable @close="handleCloseMenuTag" @click="showSelectMenu">{{editForm.menuName}}</el-tag>&nbsp;&nbsp;<el-button @click="showSelectMenu">选故事</el-button>
</el-form-item> </el-form-item>
<el-form-item label="优先级别" prop="priority">
<el-radio-group v-model="editForm.priority">
<el-radio v-for="(i,index) in options['urgencyLevel']" :label="i.optionValue" :key="index">{{i.optionName}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="严重程度" prop="bugSeverity">
<el-radio-group v-model="editForm.bugSeverity">
<el-radio v-for="(i,index) in options['bugSeverity']" :label="i.optionValue" :key="index">{{i.optionName}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="解决方案" prop="solution">
<el-radio-group v-model="editForm.solution">
<el-radio v-for="(i,index) in options['bugSolution']" :label="i.optionValue" :key="index">{{i.optionName}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="到期时间" prop="endTime">
<el-date-picker :clearable="false" style="width:100%;" type="date" placeholder="选择日期" v-model="editForm.endTime" value-format="yyyy-MM-dd" format="yyyy-MM-dd"></el-date-picker>
</el-form-item>
<el-form-item label="提出人" prop="askUsername">
提出 {{editForm.askUsername}} 创建人 {{editForm.createUsername}} 创建时间{{editForm.createTime}}
</el-form-item>
<el-form-item label="缺陷属性" prop="priority">
<el-col :span="24">
<el-select v-model="editForm.priority" placeholder="请选择紧急程度">
<el-option v-for="(i,index) in options['urgencyLevel']" :label="i.optionName" :value="i.optionValue" :key="i.optionValue">{{i.optionName}}</el-option>
</el-select>
<el-select v-model="editForm.bugSeverity" placeholder="请选择严重程度">
<el-option v-for="(i,index) in options['bugSeverity']" :label="i.optionName" :value="i.optionValue" :key="i.optionValue">{{i.optionName}}</el-option>
</el-select>
<el-select v-model="editForm.solution" placeholder="请选择解决方案">
<el-option v-for="(i,index) in options['bugSolution']" :label="i.optionName" :value="i.optionValue" :key="i.optionValue">{{i.optionName}}</el-option>
</el-select>
</el-col>
</el-form-item>
<el-form-item label="指派给" prop="handlerUsername"> <el-form-item label="指派给" prop="handlerUsername">
{{editForm.handlerUsername}} <el-button @click="sendToAsk">指派给提出人</el-button><el-button @click="sendToCreater">指派给创建人</el-button><el-button @click="showGroupUsers('handlerUsername')">选其它人</el-button>
</el-form-item>
</el-col>
<el-col :span="12">
<el-row class="app-container">
<el-col :span="24" class="label-font">测试步骤</el-col>
<el-col :span="24" >
{{editForm.handlerUsername}} <el-button @click="sendToCreater">指派给创建人</el-button><el-button @click="showGroupUsers('handlerUsername')">选其它人</el-button>
</el-form-item>
<el-form-item label="测试步骤" prop="opStep">
<el-col :span="24" v-if="editForm.expectResult">
<div class="wf-main-context-box" v-if="editForm.opStep"> <div class="wf-main-context-box" v-if="editForm.opStep">
<div style="padding:10px;" class="wf-main-context" v-html="editForm.opStep"></div> <div style="padding:10px;" class="wf-main-context" v-html="editForm.opStep"></div>
</div> </div>
<font v-else></font>
</el-col>
</el-row>
<el-row class="app-container">
<el-col :span="24" class="label-font" >预期结果</el-col>
<el-col :span="24" >
<div class="wf-main-context-box" v-if="editForm.expectResult">
</el-col>
<font v-else></font>
</el-form-item>
<el-form-item label="预期结果" prop="expectResult">
<el-col :span="24" v-if="editForm.expectResult">
<div class="wf-main-context-box" >
<div style="padding:10px;" class="wf-main-context" v-html="editForm.expectResult"></div> <div style="padding:10px;" class="wf-main-context" v-html="editForm.expectResult"></div>
</div> </div>
<font v-else></font>
</el-col> </el-col>
</el-row>
<el-row class="app-container">
<el-col :span="24" class="label-font">流转信息
<font v-else></font>
</el-form-item>
<el-form-item label="流转信息">
<el-button icon="el-icon-search" v-if="flowInfoVisible==false" @click="showFlowInfo" >查询流转信息</el-button> <el-button icon="el-icon-search" v-if="flowInfoVisible==false" @click="showFlowInfo" >查询流转信息</el-button>
<el-button icon="el-icon-search" v-else @click="flowInfoVisible=false" >隐藏流转信息</el-button> <el-button icon="el-icon-search" v-else @click="flowInfoVisible=false" >隐藏流转信息</el-button>
</el-col>
<el-col :span="24" style="padding-top:12px;"> <el-col :span="24" style="padding-top:12px;">
<!--列表 XmQuestionHandle xm_question_handle--> <!--列表 XmQuestionHandle xm_question_handle-->
@ -87,38 +84,37 @@
</el-table> </el-table>
</el-col> </el-col>
</el-row>
</el-col>
<el-col :span="24">
</el-form-item>
<el-form-item label="缺陷描述" prop="description"> <el-form-item label="缺陷描述" prop="description">
<div class="wf-main-context-box" v-if="editForm.description"> <div class="wf-main-context-box" v-if="editForm.description">
<div style="padding:10px;" class="wf-main-context" v-html="editForm.description"></div>
<div class="wf-main-context" v-html="editForm.description"></div>
</div> </div>
<font v-else></font> <font v-else></font>
</el-form-item>
</el-col>
<el-col :span="24">
</el-form-item>
<el-form-item label="上次处理意见" prop="lremark"> <el-form-item label="上次处理意见" prop="lremark">
<div class="wf-main-context-box" v-if="editForm.lremark"> <div class="wf-main-context-box" v-if="editForm.lremark">
<div style="padding:10px;" class="wf-main-context" v-html="editForm.lremark"></div>
<div class="wf-main-context" v-html="editForm.lremark"></div>
</div> </div>
<font v-else></font> <font v-else></font>
</el-form-item>
</el-col>
<el-col :span="24">
</el-form-item>
<el-form-item label="处理意见" prop="description"> <el-form-item label="处理意见" prop="description">
<vue-editor :id="'description_'+editForm.id" :branch-id="userInfo.branchId" v-model="editForm.receiptMessage"></vue-editor> <vue-editor :id="'description_'+editForm.id" :branch-id="userInfo.branchId" v-model="editForm.receiptMessage"></vue-editor>
</el-form-item>
</el-col>
</el-form-item>
</el-form> </el-form>
</el-row>
<el-row class="app-container">
<el-col style="text-align:center;" :span="24">
<el-dialog title="选中用户" :visible.sync="selectUserVisible" width="80%" append-to-body :close-on-click-modal="false">
<xm-group-mng :sel-project="selProject" :is-select-single-user="1" @user-confirm="onUserConfirm"></xm-group-mng>
</el-dialog>
<el-dialog title="选中任务" :visible.sync="selectTaskVisible" width="80%" fullscreen append-to-body :close-on-click-modal="false">
<xm-task-list :sel-project="selProject" @task-selected="onSelectedTask"></xm-task-list>
</el-dialog>
<el-dialog append-to-body title="故事选择" :visible.sync="selectMenuVisible" fullscreen :close-on-click-modal="false">
<xm-menu-select :is-select-menu="true" @selected="onSelectedMenu" :sel-project="selProject"></xm-menu-select>
</el-dialog>
</el-row>
<el-row class="page-bottom page-bottom-height">
<el-button @click.native="handleCancel">取消</el-button> <el-button @click.native="handleCancel">取消</el-button>
<el-button v-if="editForm.bugStatus !='closed'" v-loading="load.edit" type="primary" @click.native="handleQuestion(editForm.bugStatus)" :disabled="load.edit==true">暂存</el-button> <el-button v-if="editForm.bugStatus !='closed'" v-loading="load.edit" type="primary" @click.native="handleQuestion(editForm.bugStatus)" :disabled="load.edit==true">暂存</el-button>
<el-button v-if="editForm.bugStatus=='active'" v-loading="load.edit" type="primary" @click.native="handleQuestion('confirmed')" :disabled="load.edit==true">确认</el-button> <el-button v-if="editForm.bugStatus=='active'" v-loading="load.edit" type="primary" @click.native="handleQuestion('confirmed')" :disabled="load.edit==true">确认</el-button>
@ -130,18 +126,7 @@
<el-button v-if="editForm.bugStatus=='resolved'" v-loading="load.edit" type="primary" @click.native="handleQuestion('closed')" :disabled="load.edit==true">关闭</el-button> <el-button v-if="editForm.bugStatus=='resolved'" v-loading="load.edit" type="primary" @click.native="handleQuestion('closed')" :disabled="load.edit==true">关闭</el-button>
<el-button v-if="editForm.bugStatus=='resolved'" v-loading="load.edit" type="primary" @click.native="handleQuestion('active')" :disabled="load.edit==true">重新激活</el-button> <el-button v-if="editForm.bugStatus=='resolved'" v-loading="load.edit" type="primary" @click.native="handleQuestion('active')" :disabled="load.edit==true">重新激活</el-button>
<el-button v-if="editForm.bugStatus=='closed'" v-loading="load.edit" type="primary" @click.native="handleQuestion('active')" :disabled="load.edit==true">重新激活</el-button> <el-button v-if="editForm.bugStatus=='closed'" v-loading="load.edit" type="primary" @click.native="handleQuestion('active')" :disabled="load.edit==true">重新激活</el-button>
</el-col>
</el-row>
<el-dialog title="选中用户" :visible.sync="selectUserVisible" width="80%" append-to-body :close-on-click-modal="false">
<xm-group-mng :sel-project="selProject" :is-select-single-user="1" @user-confirm="onUserConfirm"></xm-group-mng>
</el-dialog>
<el-dialog title="选中任务" :visible.sync="selectTaskVisible" width="80%" fullscreen append-to-body :close-on-click-modal="false">
<xm-task-list :sel-project="selProject" @task-selected="onSelectedTask"></xm-task-list>
</el-dialog>
<el-dialog append-to-body title="故事选择" :visible.sync="selectMenuVisible" fullscreen :close-on-click-modal="false">
<xm-menu-select :is-select-menu="true" @selected="onSelectedMenu" :sel-project="selProject"></xm-menu-select>
</el-dialog>
</el-row>
</el-row> </el-row>
</section> </section>
</template> </template>
@ -165,6 +150,20 @@
...mapGetters([ ...mapGetters([
'userInfo','roles' 'userInfo','roles'
]), ]),
calcBugStep(){
if(this.editForm.bugStatus=='active'){
return 1
}else if(this.editForm.bugStatus=='confirmed'){
return 2
}else if(this.editForm.bugStatus=='resolved'){
return 3
}else if(this.editForm.bugStatus=='closed'){
return 4
}else{
return 1;
}
}
}, },
props:['xmQuestion','visible',"selProject"], props:['xmQuestion','visible',"selProject"],
watch: { watch: {
@ -396,7 +395,7 @@
handleCloseMenuTag:function(){ handleCloseMenuTag:function(){
this.editForm.menuId='' this.editForm.menuId=''
this.editForm.menuName="" this.editForm.menuName=""
},
},
},//end method },//end method
components: { components: {
// 'xm-question-edit':XmQuestionEdit // 'xm-question-edit':XmQuestionEdit
@ -423,31 +422,10 @@
</script> </script>
<style scoped> <style scoped>
.xm-question{
padding: 10px;
}
.el-form-item{
margin-bottom: 15px;
}
.el-form-item__content{
margin-left: 0;
}
.el-form-item__content{
margin-left: 0;
}
.add-btns >>> .el-form-item__content{
margin-left: 0 !important;
}
.label-font{
font-weight: 700;
font-size: 14px;
}
.wf-main-context-box {
.wf-main-context-box {
border:1px dashed #000; border:1px dashed #000;
margin-bottom: 10px; margin-bottom: 10px;
margin-top: 10px;
margin-top: 30px;
} }
.wf-main-context p { .wf-main-context p {
color: #585858; color: #585858;

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

@ -1,6 +1,6 @@
<template> <template>
<section>
<el-row class="app-container">
<section>
<el-row class="app-container">
<el-select v-model="filters.bugStatus" placeholder="请选择状态" style="width:15%;" clearable @change="changeBugStatus"> <el-select v-model="filters.bugStatus" placeholder="请选择状态" style="width:15%;" clearable @change="changeBugStatus">
<el-option v-for="(b,index) in options['bugStatus']" :value="b.optionValue" :key="index" :label="b.optionName">{{b.optionName}} <el-option v-for="(b,index) in options['bugStatus']" :value="b.optionValue" :key="index" :label="b.optionName">{{b.optionName}}
</el-option> </el-option>
@ -12,7 +12,7 @@
<el-select class="hidden-md-and-down" v-model="filters.bugSeverity" placeholder="请选择严重程度" clearable @change="changeBugSeverity"> <el-select class="hidden-md-and-down" v-model="filters.bugSeverity" placeholder="请选择严重程度" clearable @change="changeBugSeverity">
<el-option v-for="(b,index) in options['bugSeverity']" :value="b.optionValue" :key="index" :label="b.optionName">{{b.optionName}} <el-option v-for="(b,index) in options['bugSeverity']" :value="b.optionValue" :key="index" :label="b.optionName">{{b.optionName}}
</el-option> </el-option>
</el-select>
</el-select>
<el-tag v-if=" filters.product " closable @close="clearProduct">{{this.filters.product.productName}}</el-tag> <el-tag v-if=" filters.product " closable @close="clearProduct">{{this.filters.product.productName}}</el-tag>
<el-button v-else @click="showProductVisible" type="plian">选产品</el-button> <el-button v-else @click="showProductVisible" type="plian">选产品</el-button>
<el-button v-if=" !filters.menus || filters.menus.length==0" @click="showMenu"> 选择故事</el-button> <el-button v-if=" !filters.menus || filters.menus.length==0" @click="showMenu"> 选择故事</el-button>
@ -21,7 +21,7 @@
<template slot="append"> <template slot="append">
<el-button @click="searchXmQuestions" type="primary" icon="el-icon-search"></el-button> <el-button @click="searchXmQuestions" type="primary" icon="el-icon-search"></el-button>
</template> </template>
</el-input>
</el-input>
<el-button type="primary" icon="el-icon-plus" @click="showAdd"> <el-button type="primary" icon="el-icon-plus" @click="showAdd">
</el-button> </el-button>
<el-popover <el-popover
@ -33,59 +33,59 @@
<el-col :span="24" style="padding-top:5px;"> <el-col :span="24" style="padding-top:5px;">
<font class="more-label-font">产品:</font><el-tag v-if=" filters.product " closable @close="clearProduct">{{this.filters.product.productName}}</el-tag> <font class="more-label-font">产品:</font><el-tag v-if=" filters.product " closable @close="clearProduct">{{this.filters.product.productName}}</el-tag>
<el-button v-else @click="showProductVisible" type="plian">选产品</el-button> <el-button v-else @click="showProductVisible" type="plian">选产品</el-button>
</el-col>
</el-col>
<el-col :span="24" style="padding-top:12px;" v-if="!selProject"> <el-col :span="24" style="padding-top:12px;" v-if="!selProject">
<font class="more-label-font">项目:</font> <font class="more-label-font">项目:</font>
<el-tag v-if="filters.selProject && !selProject" closable @close="clearProject" @click="showProjectList(true)">{{ filters.selProject.name }}</el-tag> <el-tag v-if="filters.selProject && !selProject" closable @close="clearProject" @click="showProjectList(true)">{{ filters.selProject.name }}</el-tag>
<el-button v-else @click="showProjectList(true)" >选择项目</el-button> <el-button v-else @click="showProjectList(true)" >选择项目</el-button>
</el-col> </el-col>
<el-col :span="24" style="padding-top:12px;"> <el-col :span="24" style="padding-top:12px;">
<font class="more-label-font">创建者:</font> <font class="more-label-font">创建者:</font>
<el-button v-if="!filters.createUser" @click="showGroupUsers('createUser')">选择创建人</el-button>
<el-button v-if="!filters.createUser" @click="showGroupUsers('createUser')">选择创建人</el-button>
<el-tag v-else closable @close="clearCreateUser" @click="showGroupUsers('createUser')">{{filters.createUser.username}}</el-tag> <el-tag v-else closable @close="clearCreateUser" @click="showGroupUsers('createUser')">{{filters.createUser.username}}</el-tag>
<el-button v-if="!filters.createUser||filters.createUser.userid!=userInfo.userid" @click="setFiltersCreateUserAsMySelf">我的</el-button>
<el-button v-if="!filters.createUser||filters.createUser.userid!=userInfo.userid" @click="setFiltersCreateUserAsMySelf">我的</el-button>
</el-col> </el-col>
<el-col :span="24" style="padding-top:12px;"> <el-col :span="24" style="padding-top:12px;">
<font class="more-label-font">指派给:</font> <font class="more-label-font">指派给:</font>
<el-button v-if="!filters.handlerUsername" @click="showGroupUsers('handlerUser')">选择被指派人</el-button>
<el-button v-if="!filters.handlerUsername" @click="showGroupUsers('handlerUser')">选择被指派人</el-button>
<el-tag v-else closable @close="clearHandler" @click="showGroupUsers('handlerUser')">{{filters.handlerUsername}}</el-tag> <el-tag v-else closable @close="clearHandler" @click="showGroupUsers('handlerUser')">{{filters.handlerUsername}}</el-tag>
<el-button v-if="filters.handlerUserid!=userInfo.userid" @click="setFiltersHandlerAsMySelf">我的</el-button>
</el-col>
<el-col :span="24" style="padding-top:12px;">
曾经由<el-button v-if="!filters.hisHandler||!filters.hisHandler.userid" @click="showGroupUsers('hisHandler')">执行人</el-button>
<el-button v-if="filters.handlerUserid!=userInfo.userid" @click="setFiltersHandlerAsMySelf">我的</el-button>
</el-col>
<el-col :span="24" style="padding-top:12px;">
曾经由<el-button v-if="!filters.hisHandler||!filters.hisHandler.userid" @click="showGroupUsers('hisHandler')">执行人</el-button>
<el-tag v-else closable @close="clearHisHandler" @click="showGroupUsers('hisHandler')">{{filters.hisHandler.username}}</el-tag> <el-tag v-else closable @close="clearHisHandler" @click="showGroupUsers('hisHandler')">{{filters.hisHandler.username}}</el-tag>
<el-button v-if="!filters.hisHandler||filters.hisHandler.userid!=userInfo.userid" @click="setFiltersHisHandlerAsMySelf">我的</el-button>
<el-button v-if="!filters.hisHandler||filters.hisHandler.userid!=userInfo.userid" @click="setFiltersHisHandlerAsMySelf">我的</el-button>
变更状态为 变更状态为
<el-select v-model="filters.hisHandleStatus" placeholder="请选择状态" clearable @change="changeHisHandleStatus"> <el-select v-model="filters.hisHandleStatus" placeholder="请选择状态" clearable @change="changeHisHandleStatus">
<el-option v-for="(b,index) in options['bugStatus']" :value="b.optionValue" :key="index" :label="b.optionName">{{b.optionName}} <el-option v-for="(b,index) in options['bugStatus']" :value="b.optionValue" :key="index" :label="b.optionName">{{b.optionName}}
</el-option> </el-option>
</el-select> </el-select>
</el-col>
</el-col>
<el-col :span="24" style="padding-top:5px;"> <el-col :span="24" style="padding-top:5px;">
<font class="more-label-font">故事:</font> <font class="more-label-font">故事:</font>
<font v-if=" filters.menus && filters.menus.length>0"> <font v-if=" filters.menus && filters.menus.length>0">
<el-tag v-for="(item,index) in filters.menus" :key="index" closable @close="clearFiltersMenu(item)">{{item.menuName.substr(0,10)}}</el-tag> <el-tag v-for="(item,index) in filters.menus" :key="index" closable @close="clearFiltersMenu(item)">{{item.menuName.substr(0,10)}}</el-tag>
</font> </font>
<el-button v-else @click="showMenu" type="plian">选故事</el-button> <el-button v-else @click="showMenu" type="plian">选故事</el-button>
</el-col>
<el-col :span="24" class="hidden-lg-and-up" style="padding-top:12px;">
</el-col>
<el-col :span="24" class="hidden-lg-and-up" style="padding-top:12px;">
<el-select v-model="filters.priority" placeholder="请选择紧急程度" clearable @change="changePriority"> <el-select v-model="filters.priority" placeholder="请选择紧急程度" clearable @change="changePriority">
<el-option v-for="(b,index) in options['urgencyLevel']" :value="b.optionValue" :key="index" :label="b.optionName">{{b.optionName}} <el-option v-for="(b,index) in options['urgencyLevel']" :value="b.optionValue" :key="index" :label="b.optionName">{{b.optionName}}
</el-option> </el-option>
</el-select> </el-select>
</el-col>
<el-col :span="24" style="padding-top:12px;">
</el-col>
<el-col :span="24" style="padding-top:12px;">
<el-select v-model="filters.solution" placeholder="请选择解决方案" clearable @change="changeSolution"> <el-select v-model="filters.solution" placeholder="请选择解决方案" clearable @change="changeSolution">
<el-option v-for="(b,index) in options['bugSolution']" :value="b.optionValue" :key="index" :label="b.optionName">{{b.optionName}} <el-option v-for="(b,index) in options['bugSolution']" :value="b.optionValue" :key="index" :label="b.optionName">{{b.optionName}}
</el-option> </el-option>
</el-select> </el-select>
</el-col>
</el-col>
<el-col :span="24" style="padding-top:5px;"> <el-col :span="24" style="padding-top:5px;">
<font class="more-label-font">创建时间:</font>
<font class="more-label-font">创建时间:</font>
<el-date-picker <el-date-picker
v-model="dateRanger"
v-model="dateRanger"
type="daterange" type="daterange"
align="right" align="right"
unlink-panels unlink-panels
@ -95,12 +95,12 @@
value-format="yyyy-MM-dd" value-format="yyyy-MM-dd"
:default-time="['00:00:00','23:59:59']" :default-time="['00:00:00','23:59:59']"
:picker-options="pickerOptions" :picker-options="pickerOptions"
></el-date-picker>
</el-col>
></el-date-picker>
</el-col>
<el-col :span="24" style="padding-top:5px;"> <el-col :span="24" style="padding-top:5px;">
<font class="more-label-font">最后更新时间:</font>
<font class="more-label-font">最后更新时间:</font>
<el-date-picker <el-date-picker
v-model="ltimeRanger"
v-model="ltimeRanger"
type="daterange" type="daterange"
align="right" align="right"
unlink-panels unlink-panels
@ -110,96 +110,83 @@
value-format="yyyy-MM-dd" value-format="yyyy-MM-dd"
:default-time="['00:00:00','23:59:59']" :default-time="['00:00:00','23:59:59']"
:picker-options="pickerOptions" :picker-options="pickerOptions"
></el-date-picker>
</el-col>
></el-date-picker>
</el-col>
<el-col :span="24" style="padding-top:5px;"> <el-col :span="24" style="padding-top:5px;">
<el-button type="primary" icon="el-icon-search" @click="searchXmQuestions">查询</el-button> <el-button type="primary" icon="el-icon-search" @click="searchXmQuestions">查询</el-button>
<el-button @click="handleExport" icon="el-icon-download">导出</el-button> <el-button @click="handleExport" icon="el-icon-download">导出</el-button>
</el-col>
</el-col>
</el-row> </el-row>
<el-button slot="reference" icon="el-icon-more" circle></el-button> <el-button slot="reference" icon="el-icon-more" circle></el-button>
</el-popover>
</el-popover>
</el-row> </el-row>
<el-row class="app-container"> <el-row class="app-container">
<!--列表 XmQuestion xm_question--> <!--列表 XmQuestion xm_question-->
<el-table ref="table" :height="tableHeight" :data="xmQuestions" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;"> <el-table ref="table" :height="tableHeight" :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 sortable type="index" width="45"></el-table-column>
<el-table-column prop="name" label="缺陷名称" min-width="200" show-overflow-tooltip>
<el-table-column type="index" width="45"></el-table-column>
<el-table-column prop="name" label="缺陷名称" min-width="200" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag type="info" v-if="scope.row.bugStatus=='create' ">创建</el-tag>
<el-tag type="primary" v-else-if="scope.row.bugStatus=='active'">激活</el-tag>
<el-tag type="warning" v-else-if="scope.row.bugStatus=='confirm'">确认</el-tag>
<el-tag type="warning" v-else-if="scope.row.bugStatus=='confirmed'">已确认</el-tag>
<el-tag type="success" v-else-if="scope.row.bugStatus=='solve'">解决</el-tag>
<el-tag type="success" v-else-if="scope.row.bugStatus=='resolved'">已解决</el-tag>
<el-tag type="success" v-else-if="scope.row.bugStatus=='close'">关闭</el-tag>
<el-tag type="success" v-else-if="scope.row.bugStatus=='closed'">已关闭</el-tag>
<el-tag v-else>{{scope.row.bugStatus}}</el-tag>
<el-link type="primary" @click="showEdit(scope.row)">{{scope.row.name}}</el-link>
</template>
</el-table-column>
<el-table-column prop="menuName" label="故事" width="100" show-overflow-tooltip></el-table-column>
<el-table-column prop="bugSeverity" label="严重程度" width="100" :formatter="formatterOption"></el-table-column>
<el-table-column prop="createUsername" label="创建人" width="100" show-overflow-tooltip></el-table-column>
<el-table-column prop="handlerUsername" width="100" label="指派给" show-overflow-tooltip>
<template slot="header">
指派给<el-button @click="showGroupUsers('handlerUser')" icon="el-icon-search" circle size="mini"></el-button>
</template>
</el-table-column>
<el-table-column sortable prop="ltime" label="更新时间" width="120" show-overflow-tooltip></el-table-column>
<el-table-column prop="lremark" label="更新说明" width="100" show-overflow-tooltip></el-table-column>
<el-table-column prop="createTime" label="创建时间" width="120" :formatter="formatterDate" show-overflow-tooltip></el-table-column>
<el-table-column prop="bizFlowState" label="升级处理" width="120" >
<template slot-scope="scope">
<el-tooltip v-if="scope.row.flowState!='' && scope.row.flowState!=null" :content="showApprovaInfo(scope.row)" placement="bottom" effect="light">
<el-tag v-if="scope.row.flowState=='0' || scope.row.flowState==null ">未发审</el-tag>
<el-tag v-else-if="scope.row.flowState=='1'">审核中</el-tag>
<el-tag v-else-if="scope.row.flowState=='2'">已通过</el-tag>
<el-tag v-else-if="scope.row.flowState=='3'">未通过</el-tag>
<el-tag v-else-if="scope.row.flowState=='4'">已取消</el-tag>
</el-tooltip>
<el-button icon="el-icon-star-on" v-if="!scope.row.flowState" @click="handleCommand({type:'sendToProcessApprova',data:scope.row,bizKey:'xm_question_up_approva'})">{{qtype=='risk'?'升级':'升级'}}</el-button>
</template>
</el-table-column>
<el-table-column style="text-align:center;" class="el-icon-s-operation" align="center" width="100" fixed="right" >
<!-- <template slot="header" slot-scope="scope"><div class="el-icon-s-operation"></div></template> -->
<template slot-scope="scope">
<!-- <el-popover style="min-width:0 !important;" popper-class="autowidth" placement="left" trigger="hover"> -->
<el-button-group>
<el-button size="small" type="primary" @click.stop="showEdit(scope.row)">{{showSolveName(scope.row)}}</el-button>
</el-button-group>
<!-- <el-button slot="reference" class="see-more" type="text" icon="el-icon-more"></el-button>
</el-popover> -->
<div>
<span>
<el-tag type="info" v-if="scope.row.bugStatus=='create' ">创建</el-tag>
<el-tag type="primary" v-else-if="scope.row.bugStatus=='active'">已激活</el-tag>
<el-tag type="warning" v-else-if="scope.row.bugStatus=='confirm'">确认</el-tag>
<el-tag type="warning" v-else-if="scope.row.bugStatus=='confirmed'">已确认</el-tag>
<el-tag type="success" v-else-if="scope.row.bugStatus=='solve'">解决</el-tag>
<el-tag type="success" v-else-if="scope.row.bugStatus=='resolved'">已解决</el-tag>
<el-tag type="success" v-else-if="scope.row.bugStatus=='close'">关闭</el-tag>
<el-tag type="success" v-else-if="scope.row.bugStatus=='closed'">已关闭</el-tag>
<el-tag v-else>{{scope.row.bugStatus}}</el-tag>
<el-tag type="info" v-if="scope.row.bugSeverity=='4' ">{{formatterOption(scope.row,{property:'bugSeverity'},scope.row.bugSeverity)}}</el-tag>
<el-tag type="primary" v-else-if="scope.row.bugSeverity=='3'">{{formatterOption(scope.row,{property:'bugSeverity'},scope.row.bugSeverity)}}</el-tag>
<el-tag type="warning" v-else-if="scope.row.bugSeverity=='2'">{{formatterOption(scope.row,{property:'bugSeverity'},scope.row.bugSeverity)}}</el-tag>
<el-tag type="danger" v-else-if="scope.row.bugSeverity=='1'">{{formatterOption(scope.row,{property:'bugSeverity'},scope.row.bugSeverity)}}</el-tag>
<el-tag v-else>{{formatterOption(scope.row,{property:'bugSeverity'},scope.row.bugSeverity)}}</el-tag>
<el-tooltip :content="scope.row.createUsername+'创建于'+scope.row.createTime+', 于'+scope.row.ltime+'指派给'+scope.row.handlerUsername"><el-tag type="info">{{scope.row.handlerUsername}}</el-tag></el-tooltip>
<span>
<el-tooltip v-if="scope.row.flowState!='' && scope.row.flowState!=null" :content="showApprovaInfo(scope.row)" placement="bottom" effect="light">
<el-tag v-if="scope.row.flowState=='0' || scope.row.flowState==null ">未发审</el-tag>
<el-tag v-else-if="scope.row.flowState=='1'">审核中</el-tag>
<el-tag v-else-if="scope.row.flowState=='2'">已通过</el-tag>
<el-tag v-else-if="scope.row.flowState=='3'">未通过</el-tag>
<el-tag v-else-if="scope.row.flowState=='4'">已取消</el-tag>
</el-tooltip>
<el-button icon="el-icon-upload2" v-if="!scope.row.flowState" @click="handleCommand({type:'sendToProcessApprova',data:scope.row,bizKey:'xm_question_up_approva'})">{{qtype=='risk'?'升级':'升级'}}</el-button>
</span>
<el-badge :value="getBadge(scope.row)">
<el-link type="primary" @click="showEdit(scope.row)">{{scope.row.name}}</el-link>
</el-badge>
</span>
</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="menuName" label="故事" width="100" show-overflow-tooltip></el-table-column>
</el-table> </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-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>
<!--编辑 XmQuestion xm_question界面--> <!--编辑 XmQuestion xm_question界面-->
<el-dialog title="编辑缺陷" :visible.sync="editFormVisible" fullscreen width="100%" append-to-body :close-on-click-modal="false">
<el-drawer title="编辑缺陷" :visible.sync="editFormVisible" :with-header="false" :size="750" :close-on-click-modal="false">
<xm-question-edit :sel-project=" {id:editForm.projectId,name:editForm.projectName} " :xm-question="editForm" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit"></xm-question-edit> <xm-question-edit :sel-project=" {id:editForm.projectId,name:editForm.projectName} " :xm-question="editForm" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit"></xm-question-edit>
</el-dialog>
</el-drawer>
<!--新增 XmQuestion xm_question界面--> <!--新增 XmQuestion xm_question界面-->
<el-dialog title="新增缺陷" :visible.sync="addFormVisible" fullscreen width="100%" append-to-body :close-on-click-modal="false">
<el-dialog title="新增缺陷" :visible.sync="addFormVisible" width="100%" append-to-body :close-on-click-modal="false">
<xm-question-add :xm-test-case-exec="xmTestCaseExec" :xm-test-case="xmTestCase" :qtype="qtype" :sel-project=" filters.selProject " :xm-question="addForm" :visible="addFormVisible" @cancel="addFormVisible=false" @submit="afterAddSubmit"></xm-question-add> <xm-question-add :xm-test-case-exec="xmTestCaseExec" :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>
</el-dialog>
<el-dialog title="选中用户" v-if=" filters.selProject " :visible.sync="selectUserVisible" width="80%" append-to-body :close-on-click-modal="false"> <el-dialog title="选中用户" v-if=" filters.selProject " :visible.sync="selectUserVisible" width="80%" append-to-body :close-on-click-modal="false">
<xm-group-mng :sel-project=" filters.selProject " :is-select-single-user="1" @user-confirm="onUserConfirm"></xm-group-mng> <xm-group-mng :sel-project=" filters.selProject " :is-select-single-user="1" @user-confirm="onUserConfirm"></xm-group-mng>
</el-dialog>
</el-dialog>
<el-dialog title="选中项目" :visible.sync="selectProjectVisible" width="80%" append-to-body :close-on-click-modal="false"> <el-dialog title="选中项目" :visible.sync="selectProjectVisible" width="80%" append-to-body :close-on-click-modal="false">
<xm-project-list @project-confirm="onPorjectConfirm"></xm-project-list> <xm-project-list @project-confirm="onPorjectConfirm"></xm-project-list>
</el-dialog>
</el-dialog>
<el-dialog append-to-body title="故事选择" :visible.sync="menuVisible" width="80%" :close-on-click-modal="false"> <el-dialog append-to-body title="故事选择" :visible.sync="menuVisible" width="80%" :close-on-click-modal="false">
<xm-menu-select :visible="menuVisible" :is-select-menu="true" :multi="true" @menus-selected="onSelectedMenus" ></xm-menu-select> <xm-menu-select :visible="menuVisible" :is-select-menu="true" :multi="true" @menus-selected="onSelectedMenus" ></xm-menu-select>
</el-dialog> </el-dialog>
<el-dialog title="选择产品" :visible.sync="productSelectVisible" width="80%" append-to-body :close-on-click-modal="false"> <el-dialog title="选择产品" :visible.sync="productSelectVisible" width="80%" append-to-body :close-on-click-modal="false">
<xm-product-select :isSelectProduct="true" :selProject="filters.selProject" :visible="productSelectVisible" @cancel="productSelectVisible=false" @selected="onProductSelected"></xm-product-select> <xm-product-select :isSelectProduct="true" :selProject="filters.selProject" :visible="productSelectVisible" @cancel="productSelectVisible=false" @selected="onProductSelected"></xm-product-select>
</el-dialog> </el-dialog>
@ -208,7 +195,7 @@
<script> <script>
import util from '@/common/js/util';// import util from '@/common/js/util';//
import config from '@/common/config';// import config from '@/common/config';//
//import Sticky from '@/components/Sticky' // header //import Sticky from '@/components/Sticky' // header
import { listOption } from '@/api/mdp/meta/itemOption';// import { listOption } from '@/api/mdp/meta/itemOption';//
@ -216,18 +203,18 @@
import XmQuestionAdd from './XmQuestionAdd';// import XmQuestionAdd from './XmQuestionAdd';//
import XmQuestionEdit from './XmQuestionEdit';// import XmQuestionEdit from './XmQuestionEdit';//
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import xmMenuSelect from '../xmMenu/XmMenuSelect'; import xmMenuSelect from '../xmMenu/XmMenuSelect';
import XmGroupMng from '../xmProjectGroup/XmProjectGroupMng'; import XmGroupMng from '../xmProjectGroup/XmProjectGroupMng';
import XmProjectList from '../xmProject/XmProjectList'; import XmProjectList from '../xmProject/XmProjectList';
import XmProductSelect from '../xmProduct/XmProductSelect';// import XmProductSelect from '../xmProduct/XmProductSelect';//
export default {
export default {
computed: { computed: {
...mapGetters([ ...mapGetters([
'userInfo','roles' 'userInfo','roles'
]),
]),
}, },
props: ["selProject",'qtype','xmTestCaseExec','xmTestCase','visible'], props: ["selProject",'qtype','xmTestCaseExec','xmTestCase','visible'],
watch:{ watch:{
@ -282,24 +269,24 @@
bugSolution:[], bugSolution:[],
bugStatus:[], bugStatus:[],
bugType:[], bugType:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmQuestion addFormVisible: false,//xmQuestion
//xmQuestion //xmQuestion
addForm: { addForm: {
id:'',name:'',projectId:'',projectName:'',taskId:'',taskName:'',endTime:'',askUserid:'',askUsername:'',handlerUserid:'',handlerUsername:'',priority:'3',solution:'',processTime:'',receiptMessage:'',receiptTime:'',description:'',createUserid:'',createUsername:'',createTime:'',bugStatus:'',bugSeverity:'3', id:'',name:'',projectId:'',projectName:'',taskId:'',taskName:'',endTime:'',askUserid:'',askUsername:'',handlerUserid:'',handlerUsername:'',priority:'3',solution:'',processTime:'',receiptMessage:'',receiptTime:'',description:'',createUserid:'',createUsername:'',createTime:'',bugStatus:'',bugSeverity:'3',
attachment: [], attachment: [],
}, },
editFormVisible: false,// editFormVisible: false,//
//xmQuestion //xmQuestion
editForm: { editForm: {
id:'',name:'',projectId:'',projectName:'',taskId:'',taskName:'',endTime:'',askUserid:'',askUsername:'',handlerUserid:'',handlerUsername:'',priority:'',solution:'',processTime:'',receiptMessage:'',receiptTime:'',description:'',createUserid:'',createUsername:'',createTime:'',bugStatus:'',bugSeverity:'3', id:'',name:'',projectId:'',projectName:'',taskId:'',taskName:'',endTime:'',askUserid:'',askUsername:'',handlerUserid:'',handlerUsername:'',priority:'',solution:'',processTime:'',receiptMessage:'',receiptTime:'',description:'',createUserid:'',createUsername:'',createTime:'',bugStatus:'',bugSeverity:'3',
attachment: [], attachment: [],
},
/**begin 自定义属性请在下面加 请加备注**/
},
/**begin 自定义属性请在下面加 请加备注**/
selectUserVisible:false, selectUserVisible:false,
selectProjectVisible:false,
selectProjectVisible:false,
productSelectVisible:false, productSelectVisible:false,
nextAction:'', nextAction:'',
tableHeight:300, tableHeight:300,
@ -344,19 +331,19 @@
dateRanger: [ dateRanger: [
util.formatDate.format(beginDate, "yyyy-MM-dd"), util.formatDate.format(beginDate, "yyyy-MM-dd"),
util.formatDate.format(endDate, "yyyy-MM-dd") util.formatDate.format(endDate, "yyyy-MM-dd")
],
ltimeRanger:[
],
ltimeRanger:[
], ],
pickerOptions: util.pickerOptions('datarange'), pickerOptions: util.pickerOptions('datarange'),
userType:'',//createUserhandlerUser userType:'',//createUserhandlerUser
/**end 自定义属性请在上面加 请加备注**/ /**end 自定义属性请在上面加 请加备注**/
} }
},//end data },//end data
methods: {
handleSizeChange(pageSize) {
this.pageInfo.pageSize=pageSize;
methods: {
handleSizeChange(pageSize) {
this.pageInfo.pageSize=pageSize;
this.getXmQuestions(); this.getXmQuestions();
}, },
handleCurrentChange(pageNum) { handleCurrentChange(pageNum) {
@ -378,7 +365,7 @@
this.getXmQuestions(); this.getXmQuestions();
}, },
searchXmQuestions(){ searchXmQuestions(){
this.pageInfo.count=true;
this.pageInfo.count=true;
this.getXmQuestions(); this.getXmQuestions();
}, },
// XmQuestion xm_question // XmQuestion xm_question
@ -391,38 +378,38 @@
}; };
if(this.pageInfo.orderFields!=null && this.pageInfo.orderFields.length>0){ if(this.pageInfo.orderFields!=null && this.pageInfo.orderFields.length>0){
let orderBys=[]; 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]) orderBys.push(this.pageInfo.orderFields[i]+" "+this.pageInfo.orderDirs[i])
}
}
params.orderBy= orderBys.join(",") params.orderBy= orderBys.join(",")
} }
if(!this.dateRanger || this.dateRanger.length==0){ if(!this.dateRanger || this.dateRanger.length==0){
this.$message({ message: "创建日期范围不能为空", type: 'error' }); this.$message({ message: "创建日期范围不能为空", type: 'error' });
return; return;
} }
if( this.filters.bugStatus!=null && this.filters.bugStatus!="" ){ if( this.filters.bugStatus!=null && this.filters.bugStatus!="" ){
params.bugStatus=this.filters.bugStatus params.bugStatus=this.filters.bugStatus
}
}
if( this.filters.solution!=null && this.filters.solution!=""){ if( this.filters.solution!=null && this.filters.solution!=""){
params.solution=this.filters.solution params.solution=this.filters.solution
}
}
if( this.filters.priority!=null && this.filters.priority!=""){ if( this.filters.priority!=null && this.filters.priority!=""){
params.priority=this.filters.priority params.priority=this.filters.priority
}
}
if( this.filters.bugSeverity!=null && this.filters.bugSeverity!=""){ if( this.filters.bugSeverity!=null && this.filters.bugSeverity!=""){
params.bugSeverity=this.filters.bugSeverity params.bugSeverity=this.filters.bugSeverity
}
}
if( this.filters.handlerUserid!=null && this.filters.handlerUserid!=""){ if( this.filters.handlerUserid!=null && this.filters.handlerUserid!=""){
params.handlerUserid=this.filters.handlerUserid params.handlerUserid=this.filters.handlerUserid
}
}
if(this.filters.menus && this.filters.menus.length==1){ if(this.filters.menus && this.filters.menus.length==1){
params.menuId=this.filters.menus[0].menuId params.menuId=this.filters.menus[0].menuId
}else if(this.filters.menus && this.filters.menus.length>1){ }else if(this.filters.menus && this.filters.menus.length>1){
params.menuIds=this.filters.menus.map(i=>i.menuId) params.menuIds=this.filters.menus.map(i=>i.menuId)
} }
if(this.filters.product){ if(this.filters.product){
params.productId=this.filters.product.id params.productId=this.filters.product.id
} }
@ -436,7 +423,7 @@
this.$message({ message: "请选择曾经的缺陷状态", type: 'error' }); this.$message({ message: "请选择曾经的缺陷状态", type: 'error' });
return; return;
} }
} }
if(this.filters.hisHandleStatus){ if(this.filters.hisHandleStatus){
if(this.filters.hisHandler){ if(this.filters.hisHandler){
@ -445,7 +432,7 @@
this.$message({ message: "请选择曾经的执行人", type: 'error' }); this.$message({ message: "请选择曾经的执行人", type: 'error' });
return; return;
} }
} }
params.createTimeStart=this.dateRanger[0]+" 00:00:00" params.createTimeStart=this.dateRanger[0]+" 00:00:00"
params.createTimeEnd=this.dateRanger[1]+" 23:59:59" params.createTimeEnd=this.dateRanger[1]+" 23:59:59"
@ -456,8 +443,8 @@
} }
this.load.list = true; this.load.list = true;
if(this.filters.selProject){
params.projectId = this.filters.selProject.id;
if(this.filters.selProject){
params.projectId = this.filters.selProject.id;
} }
if(this.xmTestCaseExec){ if(this.xmTestCaseExec){
params.caseExecId=this.xmTestCaseExec.id params.caseExecId=this.xmTestCaseExec.id
@ -465,29 +452,29 @@
if(this.xmTestCase){ if(this.xmTestCase){
params.caseId=this.xmTestCase.id params.caseId=this.xmTestCase.id
} }
if(this.filters.key){ if(this.filters.key){
params.key='%'+this.filters.key+'%' params.key='%'+this.filters.key+'%'
} }
params.qtype=this.qtype params.qtype=this.qtype
listXmQuestion(params).then((res) => { listXmQuestion(params).then((res) => {
var tips=res.data.tips; var tips=res.data.tips;
if(tips.isOk){
if(tips.isOk){
this.pageInfo.total = res.data.total; this.pageInfo.total = res.data.total;
this.pageInfo.count=false; this.pageInfo.count=false;
this.xmQuestions = res.data.data; this.xmQuestions = res.data.data;
}else{ }else{
this.$message({ message: tips.msg, type: 'error' }); this.$message({ message: tips.msg, type: 'error' });
}
}
this.load.list = false; this.load.list = false;
}).catch( err => this.load.list = false ); }).catch( err => this.load.list = false );
}, },
clearProduct(){ clearProduct(){
this.filters.product=null; this.filters.product=null;
this.searchXmQuestions(); this.searchXmQuestions();
}, },
showProductVisible(){
showProductVisible(){
this.productSelectVisible=true; this.productSelectVisible=true;
}, },
onProductSelected(product){ onProductSelected(product){
@ -498,7 +485,7 @@
showMenu(){ showMenu(){
this.menuVisible=true; this.menuVisible=true;
}, },
onSelectedMenus(menus){ onSelectedMenus(menus){
if(!menus || menus.length==0){ if(!menus || menus.length==0){
this.menuVisible=false this.menuVisible=false
@ -516,14 +503,14 @@
}, },
// XmQuestion xm_question // XmQuestion xm_question
showEdit: function ( row,index ) { showEdit: function ( row,index ) {
this.editFormVisible = true;
this.editFormVisible = true;
this.editForm = Object.assign({}, row); this.editForm = Object.assign({}, row);
}, },
// XmQuestion xm_question // XmQuestion xm_question
showAdd: function () { showAdd: function () {
if(this.filters.selProject==null){ if(this.filters.selProject==null){
this.$message({ message: "请先选中项目", type: 'success' });
this.$message({ message: "请先选中项目", type: 'success' });
this.nextAction="showAdd" this.nextAction="showAdd"
this.showProjectList(); this.showProjectList();
return; return;
@ -542,22 +529,22 @@
//xmQuestion //xmQuestion
selsChange: function (sels) { selsChange: function (sels) {
this.sels = sels; this.sels = sels;
},
},
//xmQuestion //xmQuestion
handleDel: function (row,index) {
handleDel: function (row,index) {
this.$confirm('确认删除该记录吗?', '提示', { this.$confirm('确认删除该记录吗?', '提示', {
type: 'warning' type: 'warning'
}).then(() => {
}).then(() => {
this.load.del=true; this.load.del=true;
let params = { id: row.id }; let params = { id: row.id };
delXmQuestion(params).then((res) => { delXmQuestion(params).then((res) => {
this.load.del=false; this.load.del=false;
var tips=res.data.tips; var tips=res.data.tips;
if(tips.isOk){
if(tips.isOk){
this.pageInfo.count=true; this.pageInfo.count=true;
this.getXmQuestions(); this.getXmQuestions();
} }
this.$message({ message: tips.msg, type: tips.isOk?'success':'error' });
this.$message({ message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.del=false ); }).catch( err => this.load.del=false );
}); });
}, },
@ -565,24 +552,24 @@
batchDel: function () { batchDel: function () {
this.$confirm('确认删除选中记录吗?', '提示', { this.$confirm('确认删除选中记录吗?', '提示', {
type: 'warning' type: 'warning'
}).then(() => {
}).then(() => {
this.load.del=true; this.load.del=true;
batchDelXmQuestion(this.sels).then((res) => { batchDelXmQuestion(this.sels).then((res) => {
this.load.del=false; this.load.del=false;
var tips=res.data.tips; var tips=res.data.tips;
if( tips.isOk ){
if( tips.isOk ){
this.pageInfo.count=true; this.pageInfo.count=true;
this.getXmQuestions();
this.getXmQuestions();
} }
this.$message({ message: tips.msg, type: tips.isOk?'success':'error'}); this.$message({ message: tips.msg, type: tips.isOk?'success':'error'});
}).catch( err => this.load.del=false ); }).catch( err => this.load.del=false );
}); });
}, },
rowClick: function(row, event, column){
rowClick: function(row, event, column){
this.editForm=row; this.editForm=row;
}, },
isEmpty(str) { isEmpty(str) {
return str == null || str == ""; return str == null || str == "";
@ -597,34 +584,34 @@
return date.getFullYear()+"-"+(m < 10 ? "0"+m : m)+"-"+ (d < 10 ? "0"+d : d) + " " + h+":"+min+":"+s; return date.getFullYear()+"-"+(m < 10 ? "0"+m : m)+"-"+ (d < 10 ? "0"+d : d) + " " + h+":"+min+":"+s;
}, },
changeBugStatus(val){ changeBugStatus(val){
this.filters.bugStatus= val;
this.filters.bugStatus= val;
this.getXmQuestions(); this.getXmQuestions();
}, },
changeHisHandleStatus(val){ changeHisHandleStatus(val){
this.filters.hisHandleStatus= val;
this.filters.hisHandleStatus= val;
this.getXmQuestions(); this.getXmQuestions();
}, },
changeBugSeverity(val){ changeBugSeverity(val){
this.filters.bugSeverity= val;
this.filters.bugSeverity= val;
this.getXmQuestions(); this.getXmQuestions();
}, },
changeSolution(val){ changeSolution(val){
this.filters.solution= val;
this.filters.solution= val;
this.getXmQuestions(); this.getXmQuestions();
}, },
changePriority(val){ changePriority(val){
this.filters.priority= val;
this.filters.priority= val;
this.getXmQuestions(); this.getXmQuestions();
}, },
formatterDate: function(row,column,cellValue, index){
formatterDate: function(row,column,cellValue, index){
if(cellValue){ if(cellValue){
return cellValue.substr(0,10); return cellValue.substr(0,10);
}else{ }else{
return "" return ""
} }
}, },
formatterOption: function(row,column,cellValue, index){
formatterOption: function(row,column,cellValue, index){
var columnName=column.property; var columnName=column.property;
var key=""; var key="";
if(columnName=='bugStatus'){ if(columnName=='bugStatus'){
@ -661,11 +648,11 @@
}else if(row.bugStatus=='closed'){ }else if(row.bugStatus=='closed'){
return "激活" return "激活"
} }
},
showGroupUsers:function(userType){
},
showGroupUsers:function(userType){
this.userType=userType; this.userType=userType;
if(this.filters.selProject==null || this.filters.selProject.id==''){ if(this.filters.selProject==null || this.filters.selProject.id==''){
this.$message({ message: "请先选中项目", type: 'success' });
this.$message({ message: "请先选中项目", type: 'success' });
this.nextAction="showGroupUsers" this.nextAction="showGroupUsers"
this.showProjectList(); this.showProjectList();
return; return;
@ -696,7 +683,7 @@
}, },
formatJson(filterVal, jsonData) { formatJson(filterVal, jsonData) {
console.log('this.options==', this.options); console.log('this.options==', this.options);
return jsonData.map(v => filterVal.map(j => { return jsonData.map(v => filterVal.map(j => {
let key = ''; let key = '';
if (j === 'timestamp') { if (j === 'timestamp') {
@ -726,38 +713,38 @@
})) }))
}, },
/**end 自定义函数请在上面加**/ /**end 自定义函数请在上面加**/
onUserConfirm:function(groupUsers){ onUserConfirm:function(groupUsers){
if(this.userType=='createUser'){ if(this.userType=='createUser'){
if(groupUsers==null || groupUsers.length==0){
this.filters.createUser=null
if(groupUsers==null || groupUsers.length==0){
this.filters.createUser=null
}else{ }else{
var user=groupUsers[0]
this.filters.createUser=user
}
var user=groupUsers[0]
this.filters.createUser=user
}
}else if(this.userType=='hisHandler'){ }else if(this.userType=='hisHandler'){
if(groupUsers==null || groupUsers.length==0){
this.filters.hisHandler=null
if(groupUsers==null || groupUsers.length==0){
this.filters.hisHandler=null
}else{ }else{
var user=groupUsers[0]
this.filters.hisHandler=user
}
var user=groupUsers[0]
this.filters.hisHandler=user
}
}else{ }else{
if(groupUsers==null || groupUsers.length==0){
if(groupUsers==null || groupUsers.length==0){
this.filters.handlerUserid='' this.filters.handlerUserid=''
this.filters.handlerUsername='';
this.filters.handlerUsername='';
}else{ }else{
var user=groupUsers[0]
var user=groupUsers[0]
this.filters.handlerUserid=user.userid this.filters.handlerUserid=user.userid
this.filters.handlerUsername=user.username
}
this.filters.handlerUsername=user.username
}
} }
this.selectUserVisible=false this.selectUserVisible=false
this.searchXmQuestions();
this.searchXmQuestions();
},
showProjectList:function(clear){
},
showProjectList:function(clear){
if(clear){ if(clear){
this.nextAction=""; this.nextAction="";
} }
@ -766,7 +753,7 @@
onPorjectConfirm:function(project){ onPorjectConfirm:function(project){
this.filters.selProject=project this.filters.selProject=project
this.selectProjectVisible=false; this.selectProjectVisible=false;
if(this.nextAction=='showAdd'){ if(this.nextAction=='showAdd'){
this.showAdd() this.showAdd()
}else if(this.nextAction=='showGroupUsers'){ }else if(this.nextAction=='showGroupUsers'){
@ -780,33 +767,33 @@
if(row.mainTitle!=null && row.mainTitle!=""){ if(row.mainTitle!=null && row.mainTitle!=""){
msgFields.push("流程【"+row.mainTitle+"】"); msgFields.push("流程【"+row.mainTitle+"】");
} }
if(row.taskName!=null && row.taskName!=""){ if(row.taskName!=null && row.taskName!=""){
msgFields.push("当前环节【"+row.taskName+"】"); msgFields.push("当前环节【"+row.taskName+"】");
} }
if(row.assigneeName!=null && row.assigneeName!=""){ if(row.assigneeName!=null && row.assigneeName!=""){
msgFields.push("执行人【"+row.assigneeName+"】"); msgFields.push("执行人【"+row.assigneeName+"】");
} }
if(row.commentMsg!=null && row.commentMsg!=""){ if(row.commentMsg!=null && row.commentMsg!=""){
msgFields.push("审批意见【"+row.commentMsg+"】"); msgFields.push("审批意见【"+row.commentMsg+"】");
} }
var msg=msgFields.join(","); var msg=msgFields.join(",");
return msg; return msg;
}, },
sendToProcessApprova:function(row,bizKey){
sendToProcessApprova:function(row,bizKey){
// //
if(row.flowState=='1'){ if(row.flowState=='1'){
this.$message.error("已经发起,不允许重复发起"); this.$message.error("已经发起,不允许重复发起");
return; return;
} }
let extVars={projectId:row.projectId,branchId:this.userInfo.branchId,questionId:row.id} let extVars={projectId:row.projectId,branchId:this.userInfo.branchId,questionId:row.id}
let jsonExtVars=JSON.stringify(extVars);
let jsonExtVars=JSON.stringify(extVars);
var currDomain=window.location.protocol+"//"+window.location.host; var currDomain=window.location.protocol+"//"+window.location.host;
var fullPath=this.$route.fullPath;
var fullPath=this.$route.fullPath;
var bizUrl=currDomain+'/#'+fullPath+'?extVars='+jsonExtVars var bizUrl=currDomain+'/#'+fullPath+'?extVars='+jsonExtVars
let params={ let params={
@ -818,24 +805,24 @@
mainContext:'', mainContext:'',
extVars:extVars, extVars:extVars,
flowVars:{ flowVars:{
subscribeTaskEvent:'TASK_COMPLETED',
subscribeTaskEvent:'TASK_COMPLETED',
data:{ data:{
id:row.id, id:row.id,
branchId:this.userInfo.branchId, branchId:this.userInfo.branchId,
projectId:row.projectId,
projectId:row.projectId,
} }
},
}
},
}
if(bizKey=="xm_question_up_approva"){ if(bizKey=="xm_question_up_approva"){
// //
params.mainTitle='关于缺陷【'+row.name+"】升级的申请"; params.mainTitle='关于缺陷【'+row.name+"】升级的申请";
params.mainContext='项目编号:'+row.projectId+','+'项目名称:'+row.projectName+',任务名称:'+row.taskName params.mainContext='项目编号:'+row.projectId+','+'项目名称:'+row.projectName+',任务名称:'+row.taskName
+'<br>'+row.askUsername+'于'+row.createTime+'提出缺陷('+row.id+'):'+row.name +'<br>'+row.askUsername+'于'+row.createTime+'提出缺陷('+row.id+'):'+row.name
+'<br>缺陷描述:'+row.description; +'<br>缺陷描述:'+row.description;
params.restUrl=config.getXmBasePath()+"/xm/core/xmQuestion/processApprova";
this.$router.push({name:'ProcdefListForBizStart',params:params});
params.restUrl=config.getXmBasePath()+"/xm/core/xmQuestion/processApprova";
this.$router.push({name:'ProcdefListForBizStart',params:params});
}else { }else {
this.$message.error("不支持的审批事项"); this.$message.error("不支持的审批事项");
return; return;
@ -848,50 +835,66 @@
this.searchXmQuestions() this.searchXmQuestions()
}, },
clearCreateUser(){ clearCreateUser(){
this.filters.createUser=null;
this.filters.createUser=null;
this.searchXmQuestions(); this.searchXmQuestions();
this.nextAction="" this.nextAction=""
}, },
clearHandler(){ clearHandler(){
this.filters.handlerUserid='' this.filters.handlerUserid=''
this.filters.handlerUsername='';
this.filters.handlerUsername='';
this.searchXmQuestions(); this.searchXmQuestions();
this.nextAction="" this.nextAction=""
}, },
clearHisHandler(){ clearHisHandler(){
this.filters.hisHandler=null
this.filters.hisHandler=null
this.searchXmQuestions(); this.searchXmQuestions();
this.nextAction="" this.nextAction=""
}, },
handleCommand(command) {
if(command.type=='sendToProcessApprova'){
handleCommand(command) {
if(command.type=='sendToProcessApprova'){
this.sendToProcessApprova(command.data,command.bizKey); this.sendToProcessApprova(command.data,command.bizKey);
} }
},
},
setFiltersHandlerAsMySelf(){ setFiltersHandlerAsMySelf(){
this.filters.handlerUserid=this.userInfo.userid; this.filters.handlerUserid=this.userInfo.userid;
this.filters.handlerUsername=this.userInfo.username; this.filters.handlerUsername=this.userInfo.username;
this.searchXmQuestions(); this.searchXmQuestions();
},
},
setFiltersCreateUserAsMySelf(){ setFiltersCreateUserAsMySelf(){
this.filters.createUser=this.userInfo this.filters.createUser=this.userInfo
this.searchXmQuestions(); this.searchXmQuestions();
},
},
setFiltersHisHandlerAsMySelf(){ setFiltersHisHandlerAsMySelf(){
this.filters.hisHandler=this.userInfo this.filters.hisHandler=this.userInfo
this.searchXmQuestions(); this.searchXmQuestions();
}, },
getBadge(row){
var msg="";
if(row.bugStatus=='closed'){
return ""
}
if(row.handlerUsername){
if(row.lremark){
msg='已指派给'+row.handlerUsername+','+row.lremark
}else{
msg='已指派给'+row.handlerUsername;
}
}else{
msg=row.createUsername+'创建的缺陷'
}
return msg;
}
},//end methods },//end methods
components: {
components: {
'xm-question-add':XmQuestionAdd, 'xm-question-add':XmQuestionAdd,
'xm-question-edit':XmQuestionEdit, 'xm-question-edit':XmQuestionEdit,
XmGroupMng,XmProjectList,xmMenuSelect,XmProductSelect XmGroupMng,XmProjectList,xmMenuSelect,XmProductSelect
// //
}, },
mounted() {
mounted() {
if(this.selProject){ if(this.selProject){
this.filters.selProject=this.selProject this.filters.selProject=this.selProject
} }
@ -899,12 +902,12 @@
this.filters.handlerUsername=this.userInfo.username; this.filters.handlerUsername=this.userInfo.username;
this.$nextTick(() => { this.$nextTick(() => {
var clientRect=this.$refs.table.$el.getBoundingClientRect(); var clientRect=this.$refs.table.$el.getBoundingClientRect();
var subHeight=50/1000 * window.innerHeight;
this.tableHeight = window.innerHeight -clientRect.y - this.$refs.table.$el.offsetTop-subHeight;
var subHeight=50/1000 * window.innerHeight;
this.tableHeight = window.innerHeight -clientRect.y - this.$refs.table.$el.offsetTop-subHeight;
this.getXmQuestions(); this.getXmQuestions();
});
});
listOption([{categoryId:'all',itemCode:'bugSeverity'},{categoryId:'all',itemCode:'bugSolution'},{categoryId:'all',itemCode:'bugStatus'},{categoryId:'all',itemCode:'bugType'},{categoryId:'all',itemCode:'urgencyLevel'}] ).then(res=>{ listOption([{categoryId:'all',itemCode:'bugSeverity'},{categoryId:'all',itemCode:'bugSolution'},{categoryId:'all',itemCode:'bugStatus'},{categoryId:'all',itemCode:'bugType'},{categoryId:'all',itemCode:'urgencyLevel'}] ).then(res=>{
if(res.data.tips.isOk){
if(res.data.tips.isOk){
this.options['bugSeverity']=res.data.data.bugSeverity this.options['bugSeverity']=res.data.data.bugSeverity
this.options['bugSolution']=res.data.data.bugSolution this.options['bugSolution']=res.data.data.bugSolution
this.options['bugStatus']=res.data.data.bugStatus this.options['bugStatus']=res.data.data.bugStatus
@ -917,56 +920,19 @@
</script> </script>
<style scoped>
.xm-question{
width: 100%;
}
.xm-question>.el-menu-demo{
height: 50px;
padding-left: 10px;
background: #fafbfc;
}
.xm-question>.el-menu-demo>li{
height: 100%;
line-height: 50px;
color: #303133;
}
.xm-question>.el-menu-demo>li:hover{
background: transparent;
}
.xm-question>.el-menu-demo>.is-active{
background: transparent;
}
.el-dialog__wrapper >>> .el-dialog__body {
padding: 0 20px;
}
.xm-file>.el-menu-demo,.title-bar{
height: 50px;
background: #fafbfc;
line-height: 50px;
}
.title-bar{
padding:0 10px;
}
.title-bar>button{
float:right;
margin:7px 10px;
}
.question-form{
padding: 10px 20px;
}
.question-form .el-form-item{
margin-bottom: 15px;
}
* >>> .autowidth{
min-width: 0px !important;
}
<style lang="scss" scoped>
.more-label-font{ .more-label-font{
text-align:center; text-align:center;
float:left; float:left;
padding-top:5px; padding-top:5px;
} }
</style>
.align-right{
float: right;
}
.badge {
margin-top: 7px;
padding-bottom: 10px;
}
</style>

4
src/views/xm/core/xmTask/XmTaskEdit.vue

@ -1,6 +1,6 @@
<template> <template>
<section>
<el-row class="app-container">
<section class="page-container page-height padding">
<el-row >
<!--新增界面 XmTask xm_task--> <!--新增界面 XmTask xm_task-->
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editForm"> <el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editForm">
<el-form-item label="项目名称"> <el-form-item label="项目名称">

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

@ -369,9 +369,9 @@
</div> </div>
</el-dialog> </el-dialog>
<!--编辑 XmTask xm_task界面--> <!--编辑 XmTask xm_task界面-->
<el-dialog title="编辑任务" :visible.sync="editFormVisible" style="margin-top:3vh;" width="80%" append-to-body :close-on-click-modal="false">
<el-drawer title="编辑任务" :visible.sync="editFormVisible" width="80%" append-to-body :close-on-click-modal="false">
<xm-task-edit :xm-project="currentProject" :xm-task="editForm" :project-phase="currentProjectPhase" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit"></xm-task-edit> <xm-task-edit :xm-project="currentProject" :xm-task="editForm" :project-phase="currentProjectPhase" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit"></xm-task-edit>
</el-dialog>
</el-drawer>
<!-- 新增 XmTask xm_task界面--> <!-- 新增 XmTask xm_task界面-->
<el-dialog class="xm-task-add" title="新增任务" :visible.sync="addFormVisible" width="80%" append-to-body :close-on-click-modal="false"> <el-dialog class="xm-task-add" title="新增任务" :visible.sync="addFormVisible" width="80%" append-to-body :close-on-click-modal="false">

Loading…
Cancel
Save