Browse Source

更新项目框架

master
陈裕财 5 years ago
parent
commit
661beb876a
  1. 13
      src/styles/mdp.scss
  2. 159
      src/views/xm/core/xmIteration/XmIterationComplex.vue
  3. 138
      src/views/xm/core/xmIteration/XmIterationSelect.vue
  4. 13
      src/views/xm/core/xmIterationMenu/XmIterationMenuMng.vue
  5. 1
      src/views/xm/core/xmIterationState/XmIterationStateMng.vue
  6. 261
      src/views/xm/core/xmIterationState/XmIterationStateShow.vue
  7. 77
      src/views/xm/core/xmMenu/XmMenuMng.vue
  8. 27
      src/views/xm/core/xmProduct/XmProductMng.vue
  9. 29
      src/views/xm/core/xmProduct/XmProductSelect.vue
  10. 299
      src/views/xm/core/xmProject/XmProjectInfo.vue
  11. 182
      src/views/xm/core/xmQuestion/XmQuestionEdit.vue
  12. 160
      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

13
src/styles/mdp.scss

@ -5,6 +5,16 @@
.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>

138
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-popover v-if=" !menuId && !productId"
placement="top-start"
title=""
width="400"
trigger="click" >
<el-row> <el-row>
迭代名称 <el-tag size="mini" v-if="editForm.iterationName" closable @close="clearSelectIteration()">{{editForm.seqNo}}&nbsp;{{editForm.iterationName}}</el-tag>
<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>
<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> </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;

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

@ -55,7 +55,6 @@
import XmIterationStateAdd from './XmIterationStateAdd';// import XmIterationStateAdd from './XmIterationStateAdd';//
import XmIterationStateEdit from './XmIterationStateEdit';// import XmIterationStateEdit from './XmIterationStateEdit';//
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import TabPane from '../../../example/tab/components/tabPane.vue';
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>

77
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>
@ -28,7 +32,6 @@
<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="toBatchEdit" icon="el-icon-edit">修改</el-button>
<el-button @click="toSelectProduct" icon="el-icon-back">产品</el-button>
<el-popover <el-popover
placement="top-start" placement="top-start"
title="" title=""
@ -94,37 +97,23 @@
<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"
@ -149,6 +138,7 @@
<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>
@ -156,9 +146,9 @@
</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">
@ -199,6 +189,7 @@
<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'
@ -394,13 +385,19 @@
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
@ -810,9 +807,6 @@
// //
}, },
mounted() { mounted() {
if(this.filters.product==null){
this.productVisible=true;
}
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;
@ -831,4 +825,7 @@
float:left; float:left;
padding-top:5px; padding-top:5px;
} }
.align-right{
float: right;
}
</style> </style>

27
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>
<el-table-column prop="pmUsername" label="产品经理" width="120" show-overflow-tooltip></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>

299
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>
</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-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-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-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-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-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-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-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-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-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-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-tab-pane>
</el-tabs>
</el-row>
<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-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-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-menu-item>
<el-menu-item index="费用" class="hidden-md-and-down">
<span slot="title"><i class="el-icon-coin"></i>费用</span>
</el-menu-item>
<el-menu-item index="考核" class="hidden-lg-and-down">
<span slot="title"><i class="el-icon-view"></i>考核</span>
</el-menu-item>
<el-menu-item index="日志" class="hidden-lg-and-down">
<span slot="title"><i class="el-icon-edit-outline"></i>日志</span>
</el-menu-item>
<el-menu-item index="环境清单" class="hidden-lg-and-down">
<span slot="title"><i class="el-icon-setting"></i>环境清单</span>
<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-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-menu-item>
<el-menu-item index="费用">
<span slot="title"><i class="el-icon-coin"></i>费用</span>
</el-menu-item>
<el-menu-item index="考核">
<span slot="title"><i class="el-icon-view"></i>考核</span>
</el-menu-item>
<el-menu-item index="日志">
<span slot="title"><i class="el-icon-edit-outline"></i>日志</span>
</el-menu-item>
<el-menu-item index="合同管理">
<span slot="title"><i class="el-icon-s-data"></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-menu-item>
</el-submenu>
</el-menu>
<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;

182
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-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-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="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 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>
<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>
{{editForm.handlerUsername}} <el-button @click="sendToCreater">指派给创建人</el-button><el-button @click="showGroupUsers('handlerUsername')">选其它人</el-button>
</el-form-item> </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" >
<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-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">
<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-form-item>
</el-col>
<el-col :span="24">
<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-form-item>
</el-col>
<el-col :span="24">
<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-form-item>
</el-col>
</el-form> </el-form>
</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-row class="app-container">
<el-col style="text-align:center;" :span="24">
<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: {
@ -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;

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

@ -124,69 +124,56 @@
<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 type="index" width="45"></el-table-column>
<el-table-column prop="name" label="缺陷名称" min-width="200" show-overflow-tooltip> <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>
<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-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> -->
</template>
</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">
@ -883,6 +870,22 @@
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: {
@ -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;
} }
.align-right{
float: right;
}
.badge {
margin-top: 7px;
padding-bottom: 10px;
}
</style> </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