Browse Source

优化

master
陈裕财 3 years ago
parent
commit
9e799abd38
  1. 247
      src/views/xm/rpt/iteration/IterationWorkItemDayList.vue
  2. 294
      src/views/xm/rpt/iteration/menuDayAccumulate.vue
  3. 294
      src/views/xm/rpt/iteration/menuDayTrend.vue
  4. 261
      src/views/xm/rpt/iteration/questionDayAccumulate.vue
  5. 259
      src/views/xm/rpt/iteration/questionDayTrend.vue
  6. 7
      src/views/xm/rpt/product/menuAgeDist.vue
  7. 31
      src/views/xm/rpt/product/questionAgeDist.vue
  8. 30
      src/views/xm/rpt/product/questionAttDist.vue
  9. 31
      src/views/xm/rpt/product/questionSort.vue
  10. 18
      src/views/xm/rpt/reportIndex.vue

247
src/views/xm/rpt/iteration/IterationWorkItemDayList.vue

@ -0,0 +1,247 @@
<template>
<section>
<el-dialog fullscreen :title="(filters.product?'【'+filters.product.productName+'】':'')+'工作项按日分布趋势图'" append-to-body modal-append-to-body width="80%" top="20px" :visible.sync="visible">
<el-row :gutter="5">
<el-col :span="18">
<div>
<div class="main" id="productWorkItemDayList" style="width:100%;height:600px;margin:0 auto;"></div>
</div>
</el-col>
<el-col :span="6" class="border padding">
<el-form :model="filters">
<el-form-item label="归属产品">
<xm-product-select v-if="!xmProduct" ref="xmProductSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProductSelected" @clear="onProductClear"></xm-product-select>
</el-form-item>
<el-form-item label="日期区间">
<br>
<mdp-date-range v-model="filters" value-format="yyyy-MM-dd" start-key="startBizDate" end-key="endBizDate"></mdp-date-range>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="listXmProductStateHis">查询</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
</el-dialog>
</section>
</template>
<script>
import util from '@/common/js/util';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex'
import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//
import { listXmProductStateHis } from '@/api/xm/core/xmProductStateHis';
export default {
components: {
XmProductSelect,
},
props:['xmProduct','xmProject'],
computed: {
...mapGetters([
'userInfo','roles'
]),
dataSetCpd(){
return [
['日期',...this.xmProductStateHiss.map(i=>i.bizDate)],
['未关故事',...this.xmProductStateHiss.map(i=>i.menuCnt-i.menuCloseCnt)],
['已关故事',...this.xmProductStateHiss.map(i=>i.menuCloseCnt)],
['未关任务',...this.xmProductStateHiss.map(i=>i.taskCnt-i.taskCloseCnt)],
['已关任务',...this.xmProductStateHiss.map(i=>i.taskCloseCnt)],
['未关缺陷',...this.xmProductStateHiss.map(i=>i.bugCnt-i.closedBugs)],
['已关缺陷',...this.xmProductStateHiss.map(i=>i.closedBugs)]
]
}
},
watch: {
dataSetCpd(){
this.$nextTick(()=>{
this.drawCharts();
})
}
},
data() {
return {
filters:{
category:'',
product:null,
iteration:null,
project:null,
startBizDate:'',
endBizDate:'',
},
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,
xmProductStateHiss:[],
}//end return
},//end data
methods: {
listXmProductStateHis(){
if(!this.filters.product){
this.$notify({position:'bottom-left',showClose:true,message:'请先选中产品',type:'warning'})
return;
}
var params={productId:this.filters.product.id,orderBy:'biz_date asc'}
if(this.filters.startBizDate && this.filters.endBizDate){
params.startBizDate=this.filters.startBizDate;
params.endBizDate=this.filters.endBizDate;
}
listXmProductStateHis(params).then(res=>{
this.xmProductStateHiss=res.data.tips.isOk?res.data.data:this.xmProductStateHiss;
})
},
open(params){
this.visible=true;
this.filters.product=params.xmProduct
this.filters.project=params.xmProject
this.filters.iteration=params.xmIteration
this.xmProductStateHiss=[]
if(this.$refs['xmProductSelect'])this.$refs['xmProductSelect'].clearSelect();
this.$nextTick(()=>{
this.listXmProductStateHis();
})
},
drawCharts() {
this.myChart = this.$echarts.init(document.getElementById("productWorkItemDayList"));
var that=this;
this.myChart.on('updateAxisPointer', function (event) {
const xAxisInfo = event.axesInfo[0];
if (xAxisInfo) {
const dimension = xAxisInfo.value + 1;
that.myChart.setOption({
series: {
id: 'pie',
label: {
formatter: '{b}: {@[' + dimension + ']} ({d}%)'
},
encode: {
value: dimension,
tooltip: dimension
}
}
});
}
});
this.myChart.setOption({
title: {
text: '工作项分布',
},
tooltip: {
trigger: 'axis',
showContent: false
},
legend: {
},
dataset: {
source: this.dataSetCpd
},
xAxis: {
type: 'category',
},
yAxis: { gridIndex: 0 },
grid: { top: '55%' },
series: [
{ name:'未关故事',
type: 'line',
seriesLayoutBy: 'row',
smooth:true,
emphasis: { focus: 'series' },
},
{ name:'已关故事',
type: 'line',
seriesLayoutBy: 'row',
smooth:true,
emphasis: { focus: 'series' },
},
{
name:'未关任务',
type: 'line',
seriesLayoutBy: 'row',
smooth:true,
emphasis: { focus: 'series' },
},
{
name:'已关任务',
type: 'line',
seriesLayoutBy: 'row',
smooth:true,
emphasis: { focus: 'series' },
},
{ name:'未关缺陷',
type: 'line',
seriesLayoutBy: 'row',
smooth:true,
emphasis: { focus: 'series' },
},
{ name:'已关缺陷',
type: 'line',
seriesLayoutBy: 'row',
smooth:true,
emphasis: { focus: 'series' },
},
{
type: 'pie',
id: 'pie',
radius: '30%',
center: ['50%', '25%'],
emphasis: {
focus: 'self'
},
label: {
formatter: '{b}: {@日期} ({d}%)'
},
encode: {
itemName: '日期',
value: '日期',
tooltip: '日期'
}
}
]
});
},
onProductSelected(product){
this.filters.product=product
this.xmProductStateHiss=[];
this.listXmProductStateHis();
},
onProductClear(){
this.filters.product=null
this.xmProductStateHiss=[];
},
},//end method
mounted() {
/**
initSimpleDicts('all',['demandSource','demandLvl','demandType','priority','menuStatus'] ).then(res=>{
this.dicts=res.data.data;
})
*/
//this.charts();
//this.drawCharts();
}//end mounted
}
</script>
<style scoped>
.image {
width: 100%;
display: block;
}
</style>

294
src/views/xm/rpt/iteration/menuDayAccumulate.vue

@ -0,0 +1,294 @@
<template>
<section>
<el-dialog fullscreen :title="dialogTitle" append-to-body modal-append-to-body width="80%" top="20px" :visible.sync="visible">
<el-row :gutter="5">
<el-col :span="18"> <div>
<div class="main" id="menuDayAccumulate"
style="width:100%;height:600px;margin:0 auto;"></div>
</div>
</el-col>
<el-col :span="6" class="border padding">
<el-form :model="filters">
<el-form-item label="归属产品" >
<xm-product-select v-if="!xmProductCpd || !xmProductCpd.id" ref="xmProductSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProductSelected" :iterationId="xmIteration?xmIteration.id:null" @clear="onProductClear"></xm-product-select>
<span v-else>{{xmProductCpd.id}} <span v-if="xmProductCpd.productName"><br/>{{ xmProductCpd.productName }} </span> </span>
</el-form-item>
<el-form-item label="归属迭代">
<xm-iteration-select v-if="!xmIteration || !xmIteration.id" ref="xmIterationSelect" :auto-select="false" :product-id="filters.product?filters.product.id:null" :link-project-id="xmProject?xmProject.id:null" placeholder="迭代" @row-click="onIterationSelected" @clear="onIterationClear"></xm-iteration-select>
<span v-else> {{xmIteration.id}}
<span v-if="xmIteration.iterationName"><br/>{{ xmIteration.iterationName }} </span></span>
</el-form-item>
<el-form-item label="日期区间">
<br>
<mdp-date-range v-model="filters" value-format="yyyy-MM-dd" start-key="startBizDate" end-key="endBizDate"></mdp-date-range>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="listXmProductStateHis">查询</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
</el-dialog>
</section>
</template>
<script>
import util from '@/common/js/util';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex'
import { listXmProductStateHis } from '@/api/xm/core/xmProductStateHis';
import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//
export default {
components: {
XmProductSelect,
},
props:['xmProduct','xmProject','xmIteration'],
computed: {
...mapGetters([
'userInfo','roles'
]),
datesCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=>i.bizDate)
}
},
menuCloseCntCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=>i.menuCloseCnt)
}
},
menuUnstartCntCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=> i.menuUnstartCnt)
}
},
menuExecCntCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=> i.menuExecCnt)
}
},
menuFinishCntCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=>i.menuFinishCnt)
}
},
dialogTitle(){
if(this.xmIteration && this.xmIteration.id){
return (this.xmIteration?'迭代【'+this.xmIteration.iterationName+'】':'')+'需求每日累积图'
}else {
return (filters.product?'产品【'+filters.product.productName+'】':'')+'需求每日累积图'
}
},
xmProductCpd(){
if(this.xmIteration && this.xmIteration.id){
return {id:this.xmIteration.productId,productName:this.xmIteration.productName}
}
if(this.xmProduct && this.xmProduct.id){
return this.xmProduct
}
return null;
}
},
watch: {
datesCpd(){
this.$nextTick(()=>{
this.drawCharts();
})
}
},
data() {
return {
filters:{
category:'',
product: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,
xmProductStateHiss:[],
}//end return
},//end data
methods: {
listXmProductStateHis(){
if(!this.filters.product){
this.$notify({position:'bottom-left',showClose:true,message:'请先选中产品',type:'warning'})
return;
}
var params={productId:this.filters.product.id,orderBy:'biz_date asc'}
if(this.filters.startBizDate && this.filters.endBizDate){
params.startBizDate=this.filters.startBizDate;
params.endBizDate=this.filters.endBizDate;
}
listXmProductStateHis(params).then(res=>{
this.xmProductStateHiss=res.data.tips.isOk?res.data.data:this.xmProductStateHiss;
})
},
open(params){
this.visible=true;
this.filters.product=params.xmProduct
this.filters.project=params.xmProject
this.filters.Product=params.xmProduct
this.xmProductStateHiss=[]
if(this.$refs['xmProductSelect'])this.$refs['xmProductSelect'].clearSelect();
this.$nextTick(()=>{
this.listXmProductStateHis();
})
},
drawCharts() {
this.myChart = this.$echarts.init(document.getElementById("menuDayAccumulate"));
this.myChart.setOption(
{
title: {
text: '需求累积图'
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
backgroundColor: '#6a7985'
}
}
},
legend: {
data: ['未开始', '执行中', '已完成', '已关闭']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: {
type: 'category',
boundaryGap: false,
data: this.datesCpd,
},
yAxis: {
type: 'value'
},
series: [
{
name: '未开始',
type: 'line',
stack: 'Total',
areaStyle: {},
emphasis: {
focus: 'series'
},
data: this.menuUnstartCntCpd
},
{
name: '执行中',
type: 'line',
stack: 'Total',
areaStyle: {},
emphasis: {
focus: 'series'
},
data: this.menuExecCntCpd,
},
{
name: '已完成',
type: 'line',
stack: 'Total',
areaStyle: {},
emphasis: {
focus: 'series'
},
data: this.menuFinishCntCpd,
},
{
name: '已关闭',
type: 'line',
stack: 'Total',
areaStyle: {},
emphasis: {
focus: 'series'
},
label: {
show: true,
position: 'top'
},
data: this.menuCloseCntCpd,
}
]
}
)
},
onProductSelected(product){
this.filters.product=product
this.xmProductStateHiss=[];
this.listXmProductStateHis();
},
onProductClear(){
this.filters.product=null
this.xmProductStateHiss=[];
},
onIterationSelected(iteration){
this.filters.iteration=iteration
this.xmProductStateHiss=[];
this.listXmProductStateHis();
},
onIterationClear(){
this.filters.iteration=null
this.xmProductStateHiss=[];
}
},//end method
mounted() {
/**
initSimpleDicts('all',['demandSource','demandLvl','demandType','priority','menuStatus'] ).then(res=>{
this.dicts=res.data.data;
})
*/
//this.charts();
//this.drawCharts()
}//end mounted
}
</script>
<style scoped>
.image {
width: 100%;
display: block;
}
</style>

294
src/views/xm/rpt/iteration/menuDayTrend.vue

@ -0,0 +1,294 @@
<template>
<section>
<el-dialog fullscreen :title="dialogTitle" append-to-body modal-append-to-body width="80%" top="20px" :visible.sync="visible">
<el-row :gutter="5">
<el-col :span="18">
<div>
<div class="main" id="menuDayTrend"
style="width:100%;height:600px;margin:0 auto;"></div>
<div class="progress"></div>
</div>
</el-col>
<el-col :span="6" class="border padding">
<el-form :model="filters">
<el-form-item label="归属产品" >
<xm-product-select v-if="!xmProductCpd || !xmProductCpd.id" ref="xmProductSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProductSelected" :iterationId="xmIteration?xmIteration.id:null" @clear="onProductClear"></xm-product-select>
<span v-else>{{xmProductCpd.id}} <span v-if="xmProductCpd.productName"><br/>{{ xmProductCpd.productName }} </span> </span>
</el-form-item>
<el-form-item label="归属迭代">
<xm-iteration-select v-if="!xmIteration || !xmIteration.id" ref="xmIterationSelect" :auto-select="false" :product-id="filters.product?filters.product.id:null" :link-project-id="xmProject?xmProject.id:null" placeholder="迭代" @row-click="onIterationSelected" @clear="onIterationClear"></xm-iteration-select>
<span v-else> {{xmIteration.id}}
<span v-if="xmIteration.iterationName"><br/>{{ xmIteration.iterationName }} </span></span>
</el-form-item>
<el-form-item label="日期区间">
<br>
<mdp-date-range v-model="filters" value-format="yyyy-MM-dd" start-key="startBizDate" end-key="endBizDate"></mdp-date-range>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="listXmProductStateHis">查询</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
</el-dialog>
</section>
</template>
<script>
import util from '@/common/js/util';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex'
import { listXmProductStateHis } from '@/api/xm/core/xmProductStateHis';
import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//
export default {
components: {
XmProductSelect,
},
props:['xmProduct','xmProject','xmIteration'],
computed: {
...mapGetters([
'userInfo','roles'
]),
datesCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=>i.bizDate)
}
},
menuCloseCntCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=>i.menuCloseCnt)
}
},
menuUnstartCntCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=> i.menuUnstartCnt)
}
},
menuExecCntCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=> i.menuExecCnt)
}
},
menuFinishCntCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=>i.menuFinishCnt)
}
},
dialogTitle(){
if(this.xmIteration && this.xmIteration.id){
return (this.xmIteration?'迭代【'+this.xmIteration.iterationName+'】':'')+'需求每日趋势图'
}else {
return (filters.product?'产品【'+filters.product.productName+'】':'')+'需求每日趋势图'
}
},
xmProductCpd(){
if(this.xmIteration && this.xmIteration.id){
return {id:this.xmIteration.productId,productName:this.xmIteration.productName}
}
if(this.xmProduct && this.xmProduct.id){
return this.xmProduct
}
return null;
}
},
watch: {
datesCpd(){
this.$nextTick(()=>{
this.drawCharts();
})
}
},
data() {
return {
filters:{
category:'',
product: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,
xmProductStateHiss:[],
}//end return
},//end data
methods: {
listXmProductStateHis(){
if(!this.filters.product){
this.$notify({position:'bottom-left',showClose:true,message:'请先选中产品',type:'warning'})
return;
}
var params={productId:this.filters.product.id,orderBy:'biz_date asc'}
if(this.filters.startBizDate && this.filters.endBizDate){
params.startBizDate=this.filters.startBizDate;
params.endBizDate=this.filters.endBizDate;
}
listXmProductStateHis(params).then(res=>{
this.xmProductStateHiss=res.data.tips.isOk?res.data.data:this.xmProductStateHiss;
})
},
open(params){
this.visible=true;
this.filters.product=params.xmProduct
this.filters.project=params.xmProject
this.filters.Product=params.xmProduct
if(this.$refs['xmProductSelect'])this.$refs['xmProductSelect'].clearSelect();
this.$nextTick(()=>{
this.listXmProductStateHis();
})
},
drawCharts() {
this.myChart = this.$echarts.init(document.getElementById("menuDayTrend"));
this.myChart.setOption(
{
legend: {
right: 40,
data: ['未开始故事数','执行中故事数','已完成故事数','已关闭故事数']
},
xAxis: {
type: 'category',
data: this.datesCpd
},
yAxis: {
type: 'value'
},
series: [
{
name:'未开始故事数',
data: this.menuUnstartCntCpd,
type: 'line',
smooth: true,
itemStyle: {
normal: {
//
color: 'orange',
lineStyle: {
// 线
color: 'orange'
}
}
},
},
{
name:'执行中故事数',
data: this.menuExecCntCpd,
type: 'line',
smooth: true,
itemStyle: {
normal: {
//
color: 'blue',
lineStyle: {
// 线
color: 'blue'
}
}
},
},
{
name:'已完成故事数',
data: this.menuFinishCntCpd,
type: 'line',
smooth: true,
itemStyle: {
normal: {
//
color: 'green',
lineStyle: {
// 线
color: 'green'
}
}
},
},
{
name:'已关闭故事数',
data: this.menuCloseCntCpd,
type: 'line',
smooth: true,
itemStyle: {
normal: {
//
color: 'red',
lineStyle: {
// 线
color: 'red'
}
}
},
}
]
}
)
},
onProductSelected(product){
this.filters.product=product
this.xmProductStateHiss=[];
this.listXmProductStateHis();
},
onProductClear(){
this.filters.product=null
this.xmProductStateHiss=[];
},
onIterationSelected(iteration){
this.filters.iteration=iteration
this.xmProductStateHiss=[];
this.listXmProductStateHis();
},
onIterationClear(){
this.filters.iteration=null
this.xmProductStateHiss=[];
}
},//end method
mounted() {
/**
initSimpleDicts('all',['demandSource','demandLvl','demandType','priority','menuStatus'] ).then(res=>{
this.dicts=res.data.data;
})
*/
//this.charts();
//this.drawCharts();
}//end mounted
}
</script>
<style scoped>
.image {
width: 100%;
display: block;
}
</style>

261
src/views/xm/rpt/iteration/questionDayAccumulate.vue

@ -0,0 +1,261 @@
<template>
<section>
<el-dialog fullscreen :title="(filters.product?'产品【'+filters.product.productName+'】':'')+'缺陷累积图'" append-to-body modal-append-to-body width="80%" top="20px" :visible.sync="visible">
<el-row :gutter="5">
<el-col :span="18"> <div>
<div class="main" id="questionDayAccumulate"
style="width:100%;height:600px;margin:0 auto;"></div>
</div>
</el-col>
<el-col :span="6" class="border padding">
<el-form :model="filters">
<el-form-item label="归属产品">
<xm-product-select v-if="!xmProduct" ref="xmProductSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProductSelected" @clear="onProductClear"></xm-product-select>
</el-form-item>
<el-form-item label="日期区间">
<br>
<mdp-date-range v-model="filters" value-format="yyyy-MM-dd" start-key="startBizDate" end-key="endBizDate"></mdp-date-range>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="listXmProductStateHis">查询</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
</el-dialog>
</section>
</template>
<script>
import util from '@/common/js/util';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex'
import { listXmProductStateHis } from '@/api/xm/core/xmProductStateHis';
import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//
export default {
components: {
XmProductSelect,
},
props:['xmProduct','xmProject'],
computed: {
...mapGetters([
'userInfo','roles'
]),
datesCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=>i.bizDate)
}
},
closedBugsCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=>i.closedBugs)
}
},
activeBugsCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=> i.menuUnstartCnt)
}
},
confirmedBugsCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=> i.confirmedBugs)
}
},
resolvedBugsCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=>i.resolvedBugs)
}
},
},
watch: {
datesCpd(){
this.$nextTick(()=>{
this.drawCharts();
})
}
},
data() {
return {
filters:{
category:'',
product: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,
xmProductStateHiss:[],
}//end return
},//end data
methods: {
listXmProductStateHis(){
if(!this.filters.product){
this.$notify({position:'bottom-left',showClose:true,message:'请先选中产品',type:'warning'})
return;
}
var params={productId:this.filters.product.id,orderBy:'biz_date asc'}
if(this.filters.startBizDate && this.filters.endBizDate){
params.startBizDate=this.filters.startBizDate;
params.endBizDate=this.filters.endBizDate;
}
listXmProductStateHis(params).then(res=>{
this.xmProductStateHiss=res.data.tips.isOk?res.data.data:this.xmProductStateHiss;
})
},
open(params){
this.visible=true;
this.filters.product=params.xmProduct
this.filters.project=params.xmProject
this.filters.Product=params.xmProduct
this.xmProductStateHiss=[]
if(this.$refs['xmProductSelect'])this.$refs['xmProductSelect'].clearSelect();
this.$nextTick(()=>{
this.listXmProductStateHis();
})
},
drawCharts() {
this.myChart = this.$echarts.init(document.getElementById("questionDayAccumulate"));
this.myChart.setOption(
{
title: {
text: '缺陷累积图'
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
backgroundColor: '#6a7985'
}
}
},
legend: {
data: ['新提出', '执行中', '已解决', '已关闭']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: {
type: 'category',
boundaryGap: false,
data: this.datesCpd,
},
yAxis: {
type: 'value'
},
series: [
{
name: '新提出',
type: 'line',
stack: 'Total',
areaStyle: {},
emphasis: {
focus: 'series'
},
data: this.activeBugsCpd
},
{
name: '执行中',
type: 'line',
stack: 'Total',
areaStyle: {},
emphasis: {
focus: 'series'
},
data: this.confirmedBugsCpd,
},
{
name: '已解决',
type: 'line',
stack: 'Total',
areaStyle: {},
emphasis: {
focus: 'series'
},
data: this.resolvedBugsCpd,
},
{
name: '已关闭',
type: 'line',
stack: 'Total',
areaStyle: {},
emphasis: {
focus: 'series'
},
label: {
show: true,
position: 'top'
},
data: this.closedBugsCpd,
}
]
}
)
},
onProductSelected(product){
this.filters.product=product
this.xmProductStateHiss=[];
this.listXmProductStateHis();
},
onProductClear(){
this.filters.product=null
this.xmProductStateHiss=[];
},
},//end method
mounted() {
/**
initSimpleDicts('all',['demandSource','demandLvl','demandType','priority','menuStatus'] ).then(res=>{
this.dicts=res.data.data;
})
*/
//this.charts();
//this.drawCharts()
}//end mounted
}
</script>
<style scoped>
.image {
width: 100%;
display: block;
}
</style>

259
src/views/xm/rpt/iteration/questionDayTrend.vue

@ -0,0 +1,259 @@
<template>
<section>
<el-dialog fullscreen :title="(filters.product?'产品【'+filters.product.productName+'】':'')+'缺陷每日趋势'" append-to-body modal-append-to-body width="80%" top="20px" :visible.sync="visible">
<el-row :gutter="5">
<el-col :span="18">
<div>
<div class="main" id="questionDayTrend"
style="width:100%;height:600px;margin:0 auto;"></div>
<div class="progress"></div>
</div>
</el-col>
<el-col :span="6" class="border padding">
<el-form :model="filters">
<el-form-item label="归属产品" v-if="!xmProduct" >
<xm-product-select ref="xmProductSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProductSelected" @clear="onProductClear"></xm-product-select>
</el-form-item>
<el-form-item label="日期区间">
<br>
<mdp-date-range v-model="filters" value-format="yyyy-MM-dd" start-key="startBizDate" end-key="endBizDate"></mdp-date-range>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="listXmProductStateHis">查询</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
</el-dialog>
</section>
</template>
<script>
import util from '@/common/js/util';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex'
import { listXmProductStateHis } from '@/api/xm/core/xmProductStateHis';
import XmProductSelect from '@/views/xm/core/components/XmProductSelect';//
export default {
components: {
XmProductSelect,
},
props:['xmProduct','xmProject'],
computed: {
...mapGetters([
'userInfo','roles'
]),
datesCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=>i.bizDate)
}
},
closedBugsCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=>i.closedBugs)
}
},
activeBugsCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=> i.activeBugs)
}
},
confirmedBugsCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=> i.confirmedBugs)
}
},
resolvedBugsCpd(){
if(this.xmProductStateHiss.length==0){
return []
}else{
return this.xmProductStateHiss.map(i=>i.resolvedBugs)
}
},
},
watch: {
datesCpd(){
this.$nextTick(()=>{
this.drawCharts();
})
}
},
data() {
return {
filters:{
category:'',
product: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,
xmProductStateHiss:[],
}//end return
},//end data
methods: {
listXmProductStateHis(){
if(!this.filters.product){
this.$notify({position:'bottom-left',showClose:true,message:'请先选中产品',type:'warning'})
return;
}
var params={productId:this.filters.product.id,orderBy:'biz_date asc'}
if(this.filters.startBizDate && this.filters.endBizDate){
params.startBizDate=this.filters.startBizDate;
params.endBizDate=this.filters.endBizDate;
}
listXmProductStateHis(params).then(res=>{
this.xmProductStateHiss=res.data.tips.isOk?res.data.data:this.xmProductStateHiss;
})
},
open(params){
this.visible=true;
this.filters.product=params.xmProduct
this.filters.project=params.xmProject
this.filters.Product=params.xmProduct
if(this.$refs['xmProductSelect'])this.$refs['xmProductSelect'].clearSelect();
this.$nextTick(()=>{
this.listXmProductStateHis();
})
},
drawCharts() {
this.myChart = this.$echarts.init(document.getElementById("questionDayTrend"));
this.myChart.setOption(
{
legend: {
right: 40,
data: ['新提出','执行中','已解决','已关闭']
},
xAxis: {
type: 'category',
data: this.datesCpd
},
yAxis: {
type: 'value'
},
series: [
{
name:'新提出',
data: this.activeBugsCpd,
type: 'line',
smooth: true,
itemStyle: {
normal: {
//
color: 'orange',
lineStyle: {
// 线
color: 'orange'
}
}
},
},
{
name:'执行中',
data: this.confirmedBugsCpd,
type: 'line',
smooth: true,
itemStyle: {
normal: {
//
color: 'blue',
lineStyle: {
// 线
color: 'blue'
}
}
},
},
{
name:'已解决',
data: this.resolvedBugsCpd,
type: 'line',
smooth: true,
itemStyle: {
normal: {
//
color: 'green',
lineStyle: {
// 线
color: 'green'
}
}
},
},
{
name:'已关闭',
data: this.closedBugsCpd,
type: 'line',
smooth: true,
itemStyle: {
normal: {
//
color: 'red',
lineStyle: {
// 线
color: 'red'
}
}
},
}
]
}
)
},
onProductSelected(product){
this.filters.product=product
this.xmProductStateHiss=[];
this.listXmProductStateHis();
},
onProductClear(){
this.filters.product=null
this.xmProductStateHiss=[];
},
},//end method
mounted() {
/**
initSimpleDicts('all',['demandSource','demandLvl','demandType','priority','menuStatus'] ).then(res=>{
this.dicts=res.data.data;
})
*/
//this.charts();
//this.drawCharts();
}//end mounted
}
</script>
<style scoped>
.image {
width: 100%;
display: block;
}
</style>

7
src/views/xm/rpt/product/menuAgeDist.vue

@ -89,6 +89,10 @@
return datas; return datas;
} }
}, },
legendCpd(){
return ['0-2天','3-5天','6-7天','8-15天','16-30天','30天以上']
},
title(){ title(){
return '需求年龄数量分布' return '需求年龄数量分布'
}, },
@ -100,9 +104,6 @@
} }
}, },
legendCpd(){
return ['0-2天','3-5天','6-7天','8-15天','16-30天','30天以上']
},
xmProductCpd(){ xmProductCpd(){
if(this.xmIteration && this.xmIteration.id){ if(this.xmIteration && this.xmIteration.id){
return {id:this.xmIteration.productId,productName:this.xmIteration.productName} return {id:this.xmIteration.productId,productName:this.xmIteration.productName}

31
src/views/xm/rpt/product/questionAgeDist.vue

@ -1,6 +1,6 @@
<template> <template>
<section> <section>
<el-dialog fullscreen :title="(filters.product?'产品【'+filters.product.productName+'】':'')+'缺陷属性分布'" append-to-body modal-append-to-body width="80%" top="20px" :visible.sync="visible">
<el-dialog fullscreen :title="dialogTitle" append-to-body modal-append-to-body width="80%" top="20px" :visible.sync="visible">
<el-row :gutter="5"> <el-row :gutter="5">
<el-col :span="18"> <el-col :span="18">
<div> <div>
@ -11,11 +11,15 @@
</el-col> </el-col>
<el-col :span="6" class="border padding"> <el-col :span="6" class="border padding">
<el-form :model="filters"> <el-form :model="filters">
<el-form-item label="归属产品" v-if="!xmProduct && !xmIteration">
<xm-product-select ref="xmProductSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProductSelected" :iterationId="xmIteration?xmIteration.id:null" @clear="onProductClear"></xm-product-select>
<el-form-item label="归属产品" >
<xm-product-select v-if="!xmProductCpd || !xmProductCpd.id" ref="xmProductSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProductSelected" :iterationId="xmIteration?xmIteration.id:null" @clear="onProductClear"></xm-product-select>
<span v-else>{{xmProductCpd.id}} <span v-if="xmProductCpd.productName"><br/>{{ xmProductCpd.productName }} </span> </span>
</el-form-item> </el-form-item>
<el-form-item label="归属迭代" v-if="!xmIteration || !xmIteration.id">
<xm-iteration-select ref="xmIterationSelect" :auto-select="false" :product-id="filters.product?filters.product.id:null" :link-project-id="xmProject?xmProject.id:null" placeholder="迭代" @row-click="onIterationSelected" @clear="onIterationClear"></xm-iteration-select>
<el-form-item label="归属迭代">
<xm-iteration-select v-if="!xmIteration || !xmIteration.id" ref="xmIterationSelect" :auto-select="false" :product-id="filters.product?filters.product.id:null" :link-project-id="xmProject?xmProject.id:null" placeholder="迭代" @row-click="onIterationSelected" @clear="onIterationClear"></xm-iteration-select>
<span v-else> {{xmIteration.id}}
<span v-if="xmIteration.iterationName"><br/>{{ xmIteration.iterationName }} </span></span>
</el-form-item> </el-form-item>
<el-form-item label="缺陷状态" prop="bugStatus"> <el-form-item label="缺陷状态" prop="bugStatus">
<el-select v-model="filters.bugStatus" @change="onXmQuestionSomeFieldsChange('bugStatus',$event)" clearable> <el-select v-model="filters.bugStatus" @change="onXmQuestionSomeFieldsChange('bugStatus',$event)" clearable>
@ -102,6 +106,23 @@
}, },
legendCpd(){ legendCpd(){
return ['0-2天','3-5天','6-7天','8-15天','16-30天','30天以上'] return ['0-2天','3-5天','6-7天','8-15天','16-30天','30天以上']
},
dialogTitle(){
if(this.xmIteration && this.xmIteration.id){
return (this.xmIteration?'迭代【'+this.xmIteration.iterationName+'】':'')+'缺陷年龄数量分布'
}else {
return (filters.product?'产品【'+filters.product.productName+'】':'')+'缺陷年龄数量分布'
}
},
xmProductCpd(){
if(this.xmIteration && this.xmIteration.id){
return {id:this.xmIteration.productId,productName:this.xmIteration.productName}
}
if(this.xmProduct && this.xmProduct.id){
return this.xmProduct
}
return null;
} }
}, },

30
src/views/xm/rpt/product/questionAttDist.vue

@ -1,6 +1,6 @@
<template> <template>
<section> <section>
<el-dialog fullscreen :title="(filters.product?'产品【'+filters.product.productName+'】':'')+'缺陷属性分布'" append-to-body modal-append-to-body width="80%" top="20px" :visible.sync="visible">
<el-dialog fullscreen :title="dialogTitle" append-to-body modal-append-to-body width="80%" top="20px" :visible.sync="visible">
<el-row :gutter="5"> <el-row :gutter="5">
<el-col :span="18"> <el-col :span="18">
<div> <div>
@ -17,11 +17,14 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="归属产品" v-if="!xmProduct && !xmIteration">
<xm-product-select class="padding" v-if="!xmProduct && !xmIteration" ref="xmProductSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProductSelected" :iterationId="xmIteration?xmIteration.id:null" @clear="onProductClear"></xm-product-select>
<el-form-item label="归属产品" >
<xm-product-select v-if="!xmProductCpd || !xmProductCpd.id" ref="xmProductSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProductSelected" :iterationId="xmIteration?xmIteration.id:null" @clear="onProductClear"></xm-product-select>
<span v-else>{{xmProductCpd.id}} <span v-if="xmProductCpd.productName"><br/>{{ xmProductCpd.productName }} </span> </span>
</el-form-item> </el-form-item>
<el-form-item label="归属迭代" v-if="!xmIteration || !xmIteration.id">
<xm-iteration-select ref="xmIterationSelect" class="padding" v-if="!xmIteration || !xmIteration.id" :auto-select="false" :product-id="filters.product?filters.product.id:null" :link-project-id="xmProject?xmProject.id:null" placeholder="迭代" @row-click="onIterationSelected" @clear="onIterationClear"></xm-iteration-select>
<el-form-item label="归属迭代">
<xm-iteration-select v-if="!xmIteration || !xmIteration.id" ref="xmIterationSelect" :auto-select="false" :product-id="filters.product?filters.product.id:null" :link-project-id="xmProject?xmProject.id:null" placeholder="迭代" @row-click="onIterationSelected" @clear="onIterationClear"></xm-iteration-select>
<span v-else> {{xmIteration.id}}
<span v-if="xmIteration.iterationName"><br/>{{ xmIteration.iterationName }} </span></span>
</el-form-item> </el-form-item>
<el-form-item label="缺陷状态" prop="bugStatus"> <el-form-item label="缺陷状态" prop="bugStatus">
<el-select v-model="filters.bugStatus" @change="onXmQuestionSomeFieldsChange('bugStatus',$event)" clearable> <el-select v-model="filters.bugStatus" @change="onXmQuestionSomeFieldsChange('bugStatus',$event)" clearable>
@ -138,6 +141,23 @@
} }
return this.dicts[itemId].map(i=>i.name) return this.dicts[itemId].map(i=>i.name)
},
dialogTitle(){
if(this.xmIteration && this.xmIteration.id){
return (this.xmIteration?'迭代【'+this.xmIteration.iterationName+'】':'')+'缺陷属性数量分布'
}else {
return (filters.product?'产品【'+filters.product.productName+'】':'')+'缺陷属性数量分布'
}
},
xmProductCpd(){
if(this.xmIteration && this.xmIteration.id){
return {id:this.xmIteration.productId,productName:this.xmIteration.productName}
}
if(this.xmProduct && this.xmProduct.id){
return this.xmProduct
}
return null;
} }
}, },

31
src/views/xm/rpt/product/questionSort.vue

@ -1,6 +1,6 @@
<template> <template>
<section> <section>
<el-dialog fullscreen :title="(filters.product?'产品【'+filters.product.productName+'】':'')+'缺陷排行榜'" append-to-body modal-append-to-body width="80%" top="20px" :visible.sync="visible">
<el-dialog fullscreen :title="dialogTitle" append-to-body modal-append-to-body width="80%" top="20px" :visible.sync="visible">
<el-row :gutter="5"> <el-row :gutter="5">
<el-col :span="18"> <el-col :span="18">
<div> <div>
@ -16,11 +16,15 @@
<el-option v-for="i in this.groupBys" :label="i.name" :key="i.id" :value="i.id"></el-option> <el-option v-for="i in this.groupBys" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="归属产品" v-if="!xmProduct && !xmIteration">
<xm-product-select ref="xmProductSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProductSelected" :iterationId="xmIteration?xmIteration.id:null" @clear="onProductClear"></xm-product-select>
<el-form-item label="归属产品" >
<xm-product-select v-if="!xmProductCpd || !xmProductCpd.id" ref="xmProductSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProductSelected" :iterationId="xmIteration?xmIteration.id:null" @clear="onProductClear"></xm-product-select>
<span v-else>{{xmProductCpd.id}} <span v-if="xmProductCpd.productName"><br/>{{ xmProductCpd.productName }} </span> </span>
</el-form-item> </el-form-item>
<el-form-item label="归属迭代" v-if="!xmIteration || !xmIteration.id">
<xm-iteration-select ref="xmIterationSelect" :auto-select="false" :product-id="filters.product?filters.product.id:null" :link-project-id="xmProject?xmProject.id:null" placeholder="迭代" @row-click="onIterationSelected" @clear="onIterationClear"></xm-iteration-select>
<el-form-item label="归属迭代">
<xm-iteration-select v-if="!xmIteration || !xmIteration.id" ref="xmIterationSelect" :auto-select="false" :product-id="filters.product?filters.product.id:null" :link-project-id="xmProject?xmProject.id:null" placeholder="迭代" @row-click="onIterationSelected" @clear="onIterationClear"></xm-iteration-select>
<span v-else> {{xmIteration.id}}
<span v-if="xmIteration.iterationName"><br/>{{ xmIteration.iterationName }} </span></span>
</el-form-item> </el-form-item>
<el-form-item label="缺陷状态" prop="bugStatus"> <el-form-item label="缺陷状态" prop="bugStatus">
<el-select v-model="filters.bugStatus" @change="onXmQuestionSomeFieldsChange('bugStatus',$event)" clearable> <el-select v-model="filters.bugStatus" @change="onXmQuestionSomeFieldsChange('bugStatus',$event)" clearable>
@ -104,6 +108,23 @@
}else{ }else{
return this.xmQuestionSorts.map(i=>i.name) return this.xmQuestionSorts.map(i=>i.name)
} }
},
dialogTitle(){
if(this.xmIteration && this.xmIteration.id){
return (this.xmIteration?'迭代【'+this.xmIteration.iterationName+'】':'')+'需求年龄数量分布'
}else {
return (filters.product?'产品【'+filters.product.productName+'】':'')+'需求年龄数量分布'
}
},
xmProductCpd(){
if(this.xmIteration && this.xmIteration.id){
return {id:this.xmIteration.productId,productName:this.xmIteration.productName}
}
if(this.xmProduct && this.xmProduct.id){
return this.xmProduct
}
return null;
} }
}, },

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

@ -24,6 +24,8 @@
<xm-iteration-burnout ref="xmIterationBurnout" :xm-iteration="xmIteration" :xm-product="xmProduct" :xm-project="xmProject"></xm-iteration-burnout> <xm-iteration-burnout ref="xmIterationBurnout" :xm-iteration="xmIteration" :xm-product="xmProduct" :xm-project="xmProject"></xm-iteration-burnout>
<xm-menu-day-trend ref="xmMenuDayTrend" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-menu-day-trend> <xm-menu-day-trend ref="xmMenuDayTrend" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-menu-day-trend>
<xm-menu-day-accumulate ref="xmMenuDayAccumulate" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-menu-day-accumulate> <xm-menu-day-accumulate ref="xmMenuDayAccumulate" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-menu-day-accumulate>
<xm-iteration-xm-menu-day-trend ref="xmIterationXmMenuDayTrend" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-iteration-xm-menu-day-trend>
<xm-iteration-xm-menu-day-accumulate ref="xmIterationXmMenuDayAccumulate" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-iteration-xm-menu-day-accumulate>
<xm-menu-att-dist ref="xmMenuAttDist" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-menu-att-dist> <xm-menu-att-dist ref="xmMenuAttDist" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-menu-att-dist>
<xm-menu-age-dist ref="xmMenuAgeDist" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-menu-age-dist> <xm-menu-age-dist ref="xmMenuAgeDist" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-menu-age-dist>
<xm-menu-sort ref="xmMenuSort" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-menu-sort> <xm-menu-sort ref="xmMenuSort" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-menu-sort>
@ -39,12 +41,15 @@
<xm-project-workload-set-month-list ref="xmProjectWorkloadSetMonthList" :xm-product="xmProduct" :xm-project="xmProject"></xm-project-workload-set-month-list> <xm-project-workload-set-month-list ref="xmProjectWorkloadSetMonthList" :xm-product="xmProduct" :xm-project="xmProject"></xm-project-workload-set-month-list>
<xm-iteration-xm-question-day-trend ref="xmIterationXmQuestionDayTrend" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-iteration-xm-question-day-trend>
<xm-iteration-xm-question-day-accumulate ref="xmIterationXmQuestionDayAccumulate" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-iteration-xm-question-day-accumulate>
<xm-question-day-trend ref="xmQuestionDayTrend" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-question-day-trend> <xm-question-day-trend ref="xmQuestionDayTrend" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-question-day-trend>
<xm-question-day-accumulate ref="xmQuestionDayAccumulate" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-question-day-accumulate> <xm-question-day-accumulate ref="xmQuestionDayAccumulate" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-question-day-accumulate>
<xm-question-att-dist ref="xmQuestionAttDist" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-question-att-dist> <xm-question-att-dist ref="xmQuestionAttDist" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-question-att-dist>
<xm-question-age-dist ref="xmQuestionAgeDist" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-question-age-dist> <xm-question-age-dist ref="xmQuestionAgeDist" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-question-age-dist>
<xm-question-sort ref="xmQuestionSort" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-question-sort> <xm-question-sort ref="xmQuestionSort" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-question-sort>
<xm-product-work-item-day-list ref="xmProductWorkItemDayList" :xm-product="xmProduct" :xm-project="xmProject"></xm-product-work-item-day-list> <xm-product-work-item-day-list ref="xmProductWorkItemDayList" :xm-product="xmProduct" :xm-project="xmProject"></xm-product-work-item-day-list>
<xm-iteration-work-item-day-list ref="xmIterationWorkItemDayList" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration"></xm-iteration-work-item-day-list>
</section> </section>
</template> </template>
@ -55,10 +60,13 @@
import xmIterationBurnout from './iteration/burnout' import xmIterationBurnout from './iteration/burnout'
import xmMenuDayTrend from './product/menuDayTrend' import xmMenuDayTrend from './product/menuDayTrend'
import xmMenuDayAccumulate from './product/menuDayAccumulate' import xmMenuDayAccumulate from './product/menuDayAccumulate'
import xmIterationXmMenuDayTrend from './iteration/menuDayTrend'
import xmIterationXmMenuDayAccumulate from './iteration/menuDayAccumulate'
import xmMenuAttDist from './product/menuAttDist' import xmMenuAttDist from './product/menuAttDist'
import xmMenuAgeDist from './product/menuAgeDist' import xmMenuAgeDist from './product/menuAgeDist'
import xmMenuSort from './product/menuSort' import xmMenuSort from './product/menuSort'
import xmProductWorkItemDayList from './product/productWorkItemDayList' import xmProductWorkItemDayList from './product/productWorkItemDayList'
import xmIterationWorkItemDayList from './iteration/iterationWorkItemDayList'
import xmTaskDayTrend from './project/taskDayTrend' import xmTaskDayTrend from './project/taskDayTrend'
@ -72,6 +80,8 @@
import xmQuestionDayTrend from './product/questionDayTrend' import xmQuestionDayTrend from './product/questionDayTrend'
import xmQuestionDayAccumulate from './product/questionDayAccumulate' import xmQuestionDayAccumulate from './product/questionDayAccumulate'
import XmIterationXmQuestionDayTrend from './iteration/questionDayTrend'
import XmIterationXmQuestionDayAccumulate from './iteration/questionDayAccumulate'
import xmQuestionAttDist from './product/questionAttDist' import xmQuestionAttDist from './product/questionAttDist'
import xmQuestionAgeDist from './product/questionAgeDist' import xmQuestionAgeDist from './product/questionAgeDist'
import xmQuestionSort from './product/questionSort' import xmQuestionSort from './product/questionSort'
@ -130,13 +140,13 @@
rptList:[/**{name:'报表名称',category:'报表分类,组织级、产品级、项目级、迭代级、需求、测试、任务',path:'路由路径',imgUrl:'图片路径',query:{参数}} */ rptList:[/**{name:'报表名称',category:'报表分类,组织级、产品级、项目级、迭代级、需求、测试、任务',path:'路由路径',imgUrl:'图片路径',query:{参数}} */
// //
{rptName:'迭代燃尽图',category:'迭代级',ref:'xmIterationBurnout',desc:'跟踪迭代的剩余工作量按日期变化趋势,识别迭代当前进度情况',img:ranjintu }, {rptName:'迭代燃尽图',category:'迭代级',ref:'xmIterationBurnout',desc:'跟踪迭代的剩余工作量按日期变化趋势,识别迭代当前进度情况',img:ranjintu },
{rptName:'需求每日趋势',category:'迭代级',ref:'xmMenuDayTrend',desc:'跟踪未开始、执行中、已完成、已关闭状态的需求数量按日期变化趋势,识别需求工作情况',img:lineStack },
{rptName:'需求每日累积',category:'迭代级',ref:'xmMenuDayAccumulate',desc:'跟踪未开始、执行中、已完成、已关闭状态的需求数量按日期累积情况,识别需求工作的瓶颈',img:areaStack },
{rptName:'需求每日趋势',category:'迭代级',ref:'xmIterationXmMenuDayTrend',desc:'跟踪未开始、执行中、已完成、已关闭状态的需求数量按日期变化趋势,识别需求工作情况',img:lineStack },
{rptName:'需求每日累积',category:'迭代级',ref:'xmIterationXmMenuDayAccumulate',desc:'跟踪未开始、执行中、已完成、已关闭状态的需求数量按日期累积情况,识别需求工作的瓶颈',img:areaStack },
{rptName:'需求属性分布',category:'迭代级',ref:'xmMenuAttDist',desc:'统计所有需求任意属性数量分布情况(实时数据)',img:pieSimple }, {rptName:'需求属性分布',category:'迭代级',ref:'xmMenuAttDist',desc:'统计所有需求任意属性数量分布情况(实时数据)',img:pieSimple },
{rptName:'需求年龄分布',category:'迭代级',ref:'xmMenuAgeDist',desc:'统计所有需求年龄分布情况(实时数据)',img:pieSimple }, {rptName:'需求年龄分布',category:'迭代级',ref:'xmMenuAgeDist',desc:'统计所有需求年龄分布情况(实时数据)',img:pieSimple },
{rptName:'需求排行榜',category:'迭代级',ref:'xmMenuSort',desc:'需求提出人、负责人的用户故事数量排行(实时数据)',img:bar }, {rptName:'需求排行榜',category:'迭代级',ref:'xmMenuSort',desc:'需求提出人、负责人的用户故事数量排行(实时数据)',img:bar },
{rptName:'缺陷每日趋势',category:'迭代级',ref:'xmQuestionDayTrend',desc:'跟踪新提出、执行中、已解决、已关闭状态的缺陷数量按日期变化趋势,识别缺陷处理工作情况',img:lineStack },
{rptName:'缺陷每日累积',category:'迭代级',ref:'xmQuestionDayAccumulate',desc:'跟踪新提出、执行中、已解决、已关闭状态的缺陷数量按日期累积情况,识别缺陷处理工作的瓶颈',img:areaStack },
{rptName:'缺陷每日趋势',category:'迭代级',ref:'xmIterationXmQuestionDayTrend',desc:'跟踪新提出、执行中、已解决、已关闭状态的缺陷数量按日期变化趋势,识别缺陷处理工作情况',img:lineStack },
{rptName:'缺陷每日累积',category:'迭代级',ref:'xmIterationXmQuestionDayAccumulate',desc:'跟踪新提出、执行中、已解决、已关闭状态的缺陷数量按日期累积情况,识别缺陷处理工作的瓶颈',img:areaStack },
{rptName:'缺陷属性分布',category:'迭代级',ref:'xmQuestionAttDist',desc:'统计所有缺陷任意属性数量分布情况(实时数据)',img:pieSimple }, {rptName:'缺陷属性分布',category:'迭代级',ref:'xmQuestionAttDist',desc:'统计所有缺陷任意属性数量分布情况(实时数据)',img:pieSimple },
{rptName:'缺陷年龄分布',category:'迭代级',ref:'xmQuestionAgeDist',desc:'统计所有缺陷年龄分布情况(实时数据)',img:pieSimple }, {rptName:'缺陷年龄分布',category:'迭代级',ref:'xmQuestionAgeDist',desc:'统计所有缺陷年龄分布情况(实时数据)',img:pieSimple },
{rptName:'缺陷排行榜',category:'迭代级',ref:'xmQuestionSort',desc:'从缺陷提出人、创建人、负责人、故事等维度统计缺陷数量排行榜(实时数据)',img:bar }, {rptName:'缺陷排行榜',category:'迭代级',ref:'xmQuestionSort',desc:'从缺陷提出人、创建人、负责人、故事等维度统计缺陷数量排行榜(实时数据)',img:bar },

Loading…
Cancel
Save