Browse Source

优化

master
陈裕财 4 years ago
parent
commit
90dd7eb0b2
  1. 17
      src/router/routes_xm.js
  2. 6
      src/views/xm/core/xmMenu/XmMenuEdit.vue
  3. 1
      src/views/xm/core/xmTask/XmTaskEdit.vue
  4. 7
      src/views/xm/core/xmTask/XmTaskMng.vue
  5. 142
      src/views/xm/rpt/iteration/burnout.vue
  6. 109
      src/views/xm/rpt/reportIndex.vue

17
src/router/routes_xm.js

@ -87,6 +87,23 @@ export default {
hidden:true hidden:true
}, },
}, },
{
path: '/xm/rpt',
name: 'reportIndex',
component: Layout,
iconCls: 'fa el-icon-menu',
meta: {
title: '报表统计',
icon: 'report',
hidden:true
},
children: [
{ path: 'reportIndex', component: _import('xm/rpt/reportIndex'), name: 'reportIndex', meta: { title: '报表统计', icon: 'chart' }},
]
},
{ {
path: '/xm/core', path: '/xm/core',
component: Layout, component: Layout,

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

@ -121,11 +121,8 @@
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="概述" name="4"> <el-tab-pane label="概述" name="4">
<el-form-item label="需求概述" prop="remark"> <el-form-item label="需求概述" prop="remark">
<el-input type="textarea" :autosize="{ minRows: 6, maxRows: 20}" v-model="editForm.remark" placeholder="什么人?做什么事?,为什么?如: 作为招聘专员,我需要统计员工半年在职/离职人数,以便我能够制定招聘计划" ></el-input>
<el-input type="textarea" :autosize="{ minRows: 6, maxRows: 20}" v-model="editForm.remark" @click.native="editXmMenuSomeFields(editForm,'remark',editForm.remark)" placeholder="什么人?做什么事?,为什么?如: 作为招聘专员,我需要统计员工半年在职/离职人数,以便我能够制定招聘计划" ></el-input>
</el-form-item> </el-form-item>
<el-row class="padding">
<el-button v-loading="load.edit" type="primary" @click.native="editXmMenuSomeFields(editForm,'remark',editForm.remark)" :disabled="load.edit==true">提交概述</el-button>
</el-row>
</el-tab-pane> </el-tab-pane>
<el-tab-pane :label="'子工作项'+(subWorkItemNum>=0?'('+subWorkItemNum+')':'')" name="6"> <el-tab-pane :label="'子工作项'+(subWorkItemNum>=0?'('+subWorkItemNum+')':'')" name="6">
<xm-sub-work-item :parent-xm-menu="editForm" :link-project-id="selProject?selProject.id:null" @sub-work-item-num="setSubWorkItemNum" @add-sub-menu="onAddSubMenu"></xm-sub-work-item> <xm-sub-work-item :parent-xm-menu="editForm" :link-project-id="selProject?selProject.id:null" @sub-work-item-num="setSubWorkItemNum" @add-sub-menu="onAddSubMenu"></xm-sub-work-item>
@ -251,6 +248,7 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
}else{ }else{
this.editForm = {...this.xmMenu}; this.editForm = {...this.xmMenu};
if(this.editForm.startTime && this.editForm.endTime){ if(this.editForm.startTime && this.editForm.endTime){
this.dateRanger=[]
this.dateRanger.push(this.editForm.startTime) this.dateRanger.push(this.editForm.startTime)
this.dateRanger.push(this.editForm.endTime) this.dateRanger.push(this.editForm.endTime)
} }

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

@ -613,6 +613,7 @@ import XmMenuEdit from '../xmMenu/XmMenuEdit.vue';
editXmTaskSomeFields(params).then(res=>{ editXmTaskSomeFields(params).then(res=>{
var tips = res.data.tips; var tips = res.data.tips;
if(tips.isOk){ if(tips.isOk){
this.$emit('edit-fields',params)
Object.assign(row,params) Object.assign(row,params)
}else{ }else{
this.$notify({showClose:true,message:tips.msg,type:tips.isOk?'success':'error'}) this.$notify({showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})

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

@ -714,6 +714,7 @@
@after-add-submit="afterExecEditSubmit" @after-add-submit="afterExecEditSubmit"
@after-edit-submit="afterExecEditSubmit" @after-edit-submit="afterExecEditSubmit"
@submit="afterEditSubmit" @submit="afterEditSubmit"
@edit-fields="onEditSomeFields"
></xm-task-edit> ></xm-task-edit>
</el-dialog> </el-dialog>
@ -1472,8 +1473,7 @@ export default {
// XmTask xm_task // XmTask xm_task
showEdit: function (row, index) { showEdit: function (row, index) {
this.editFormVisible = true; this.editFormVisible = true;
this.editForm = Object.assign({}, row);
console.log("editForm", this.editForm);
this.editForm=row
}, },
showTaskTemplate: function (row) { showTaskTemplate: function (row) {
if(!this.checkCanAdd(row)){ if(!this.checkCanAdd(row)){
@ -1557,6 +1557,9 @@ export default {
this.getXmTasks() this.getXmTasks()
treeTool.reloadChildren(this.$refs.table,this.maps,row.parentTaskid,'parentTaskid',this.loadXmTaskLazy) treeTool.reloadChildren(this.$refs.table,this.maps,row.parentTaskid,'parentTaskid',this.loadXmTaskLazy)
}, },
onEditSomeFields(params){
Object.assign(this.editForm,params )
},
//xmTask //xmTask
selsChange: function (sels) { selsChange: function (sels) {
this.sels = sels; this.sels = sels;

142
src/views/xm/rpt/iteration/burnout.vue

@ -0,0 +1,142 @@
<template>
<section>
<el-dialog title="xxxxxxxxxxxxx" append-to-body modal-append-to-body width="80%" top="20px" :visible.sync="visible">
<div>
<div class="main" id="main"
style="width:600px;height:400px;margin:0 auto;"></div>
<div class="progress"></div>
</div>
</el-dialog>
</section>
</template>
<script>
import util from '@/common/js/util';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex'
export default {
components: {
},
props:['xmProduct','xmIteration','xmProject'],
computed: {
...mapGetters([
'userInfo','roles'
]),
},
watch: {
datas(){
this.charts();
}
},
data() {
return {
filters:{
category:'',
product:null,
iteration:null,
project:null,
},
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
dateRanger:[],
maxTableHeight:300,
visible:false,
datas:[],
}//end return
},//end data
methods: {
open(params){
this.visible=true;
this.filters.product=params.xmProduct
this.filters.project=params.xmProject
this.filters.iteration=params.xmIteration
this.$nextTick(()=>{
this.charts()
})
},
charts() {
this.myChart = this.$echarts.init(document.getElementById("main"));
this.myChart.setOption({
title: {
text: '燃尽图:',
},
tooltip: {
trigger: 'axis'
},
legend: {
right: 40,
data: ['剩余工作量', '任务量']
},
xAxis: {
type: 'category',
boundaryGap: false,
splitLine: {
show: false
},
data: ['迭代一', '迭代二', '迭代三', '迭代四', '迭代五']
},
yAxis: {},
series: [
{
name: '剩余工作量',
type: 'line',
// stack: '',
data: [5, 4.6, 3.9, 2.7, 0.2],
itemStyle: {
normal: {
//
color: 'green',
lineStyle: {
// 线
color: 'green'
}
}
},
// data: this.opinionData,
},
{
name: '任务量',
type: 'line',
data: [5, 4, 3, 2, 0],
itemStyle: {
normal: {
//
color: 'orange',
lineStyle: {
// 线
color: 'orange'
}
}
},
},
]
})
}
},//end method
mounted() {
/**
initSimpleDicts('all',['demandSource','demandLvl','demandType','priority','menuStatus'] ).then(res=>{
this.dicts=res.data.data;
})
*/
//this.charts();
}//end mounted
}
</script>
<style scoped>
.image {
width: 100%;
display: block;
}
</style>

109
src/views/xm/rpt/reportIndex.vue

@ -0,0 +1,109 @@
<template>
<section class="padding">
<el-row class="page-main ">
<el-select v-model="filters.category" clearable>
<el-option v-for="(item,index) in categorys" :label="item" :value="item" :key="index"></el-option>
</el-select>
</el-row>
<el-row class="padding">
<el-row :style="{overflowX:'hidden',height:maxTableHeight+'px'}" ref="table">
<el-col v-cloak v-for="(p,i) in rptListCpd" :key="i" :xl="4" :lg="6" :md="8" :sm="12" :body-style="{ padding: '0px' }">
<el-card @click.native="intoInfo(p,i)" class="project-card" shadow="always" id="prj-view-box">
<img src="https://shadow.elemecdn.com/app/element/hamburger.9cf7b091-55e9-11e9-a976-7f4d0b07eef6.png" class="image">
<div style="padding: 14px;">
<span>{{p.rptName}}</span>
</div>
</el-card>
</el-col>
</el-row>
</el-row>
<xm-iteration-burnout ref="xmIterationBurnout"></xm-iteration-burnout>
</section>
</template>
<script>
import util from '@/common/js/util';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex'
import xmIterationBurnout from './iteration/burnout'
export default {
components: {
xmIterationBurnout
},
props:['xmProduct','xmIteration','xmProject'],
computed: {
...mapGetters([
'userInfo','roles'
]),
rptListCpd(){
if(!this.filters.category){
return this.rptList;
}else{
return this.rptList.filter(i=>i.category==this.filters.category)
}
},
categorys:function(){
var map={};
var list=[];
this.rptList.forEach(e => {
if(!map[e.category]){
list.push(e.category);
map[e.category]=e.category
}
});
return list;
},
},
watch: {
},
data() {
return {
filters:{
category:'',
},
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
dateRanger:[],
maxTableHeight:300,
rptList:[/**{name:'报表名称',category:'报表分类,组织级、产品级、项目级、迭代级、需求、测试、任务',path:'路由路径',imgUrl:'图片路径',query:{参数}} */
{rptName:'迭代燃尽图',category:'迭代级',ref:'xmIterationBurnout' }
],
}//end return
},//end data
methods: {
intoInfo(row) {
var params={...row}
params.xmProduct=this.xmProduct
params.xmProject=this.xmProject
params.xmIteration=this.xmIteration
this.$refs[row.ref].open(params);
},
},//end method
mounted() {
/**
initSimpleDicts('all',['demandSource','demandLvl','demandType','priority','menuStatus'] ).then(res=>{
this.dicts=res.data.data;
})
*/
this.maxTableHeight = this.source == 'GZT' ? this.maxTableHeight : util.calcTableMaxHeight(this.$refs.table.$el);
}//end mounted
}
</script>
<style scoped>
.image {
width: 100%;
display: block;
}
</style>
Loading…
Cancel
Save