Browse Source

优化

master
陈裕财 3 years ago
parent
commit
afa49715d0
  1. 36
      src/common/js/util.js
  2. 30
      src/views/layout/Layout.vue
  3. 2
      src/views/xm/XmOverview.vue
  4. 4
      src/views/xm/core/xmIteration/XmIterationForLinkComplex.vue
  5. 4
      src/views/xm/core/xmIteration/XmIterationOverview.vue
  6. 12
      src/views/xm/core/xmIteration/XmIterationOverviewComplex.vue
  7. 10
      src/views/xm/core/xmProduct/XmProductForLinkComplex.vue
  8. 11
      src/views/xm/core/xmProduct/XmProductOverview.vue
  9. 12
      src/views/xm/core/xmProduct/XmProductOverviewComplex.vue
  10. 16
      src/views/xm/core/xmProject/XmProjectForLinkComplex.vue
  11. 4
      src/views/xm/core/xmProject/XmProjectOverview.vue
  12. 14
      src/views/xm/core/xmProject/XmProjectOverviewComplex.vue
  13. 457
      src/views/xm/rpt/index/CfigRpt.vue
  14. 4
      src/views/xm/rpt/index/CompsCard.vue
  15. 4
      src/views/xm/rpt/index/CompsSet.vue

36
src/common/js/util.js

@ -150,23 +150,37 @@ export default {
}
return classNames[typeIndex]
},
calcTableMaxHeight(cssSelector) {
calcMaxHeight(cssSelector) {
debugger;
var table=cssSelector;
if(typeof cssSelector == 'string'){
table=document.querySelector(cssSelector);
}
var innerHeight=window.innerHeight
var defaultInnerHeight=616;
var pageHeight=32/defaultInnerHeight*innerHeight
var top=150/defaultInnerHeight*innerHeight;
var bottomHeight=36/defaultInnerHeight*innerHeight
if(innerHeight>=916){
bottomHeight=20/defaultInnerHeight*innerHeight
}else if(innerHeight>=800){
bottomHeight=26/defaultInnerHeight*innerHeight
}else if(innerHeight>=700){
bottomHeight=32/defaultInnerHeight*innerHeight
var top=150;
if(table!=null){
var rect=table.getBoundingClientRect()
if(rect && rect.top){
top=rect.top;
}
}
var maxTableHeight =innerHeight-top;
return maxTableHeight;
},
calcTableMaxHeight(cssSelector) {
var table=cssSelector;
if(typeof cssSelector == 'string'){
table=document.querySelector(cssSelector);
}
var innerHeight=window.innerHeight
var pageHeight=32
var top=150;
var bottomHeight=32
if(table!=null){
var rect=table.getBoundingClientRect()

30
src/views/layout/Layout.vue

@ -4,7 +4,7 @@
<div class="main-container">
<navbar></navbar>
<tags-view></tags-view>
<app-main></app-main>
<app-main ref="main" :style="{overflowY:'auto',maxHeight:maxHeight?maxHeight+'px':'90vh'}"></app-main>
</div>
</div>
</template>
@ -20,10 +20,38 @@ export default {
AppMain,
TagsView
},
data(){
return {
maxHeight:null,
}
},
methods:{
calcMaxHeight(cssSelector) {
var table=cssSelector;
debugger;
if(typeof cssSelector == 'string'){
table=document.querySelector(cssSelector);
}
var innerHeight=window.innerHeight
var top=150;
if(table!=null){
var rect=table.getBoundingClientRect()
if(rect && rect.top!=0){
top=rect.top;
}
}
var maxTableHeight =innerHeight-top;
return maxTableHeight;
},
},
computed: {
sidebar() {
return this.$store.state.app.sidebar
}
},
mounted(){
this.maxHeight=this.calcMaxHeight(this.$refs.main.$el)
}
}
</script>

2
src/views/xm/XmOverview.vue

@ -1,6 +1,6 @@
<template>
<section>
<el-row class="padding" :style="{overflowX: 'hidden',height:maxTableHeight+'px'}" ref="table">
<el-row class="padding" ref="table">
<el-row class="row_1" style="margin-bottom:20px;">
<div class="r r1">
<span style="color: #4779F6">{{formatNum(xmBranch.projectCnt,0) || 0}}</span>

4
src/views/xm/core/xmIteration/XmIterationForLinkComplex.vue

@ -283,12 +283,12 @@
</el-col>
<el-col :xl="20" :lg="20" :md="19" :sm="19" :xs="19" class="padding-left padding-right">
<el-tabs :value="showPanel" @tab-click="tabClick">
<el-tab-pane label="迭代概览" lazy name="iterationOverview" v-if="xmIteration && xmIteration.id">
<el-tab-pane label="迭代概览" lazy name="iterationOverview" >
<xm-iteration-overview v-if="xmIteration && showPanel=='iterationOverview'" :xm-iteration="xmIteration" :sel-project="projectInfo"></xm-iteration-overview>
</el-tab-pane>
<el-tab-pane label="执行统计" lazy name="iterationCalc" v-if="xmIteration && xmIteration.id">
<el-tab-pane label="执行统计" lazy name="iterationCalc" >
<div v-if="showPanel=='iterationCalc'">
<el-row>
<el-button type="primary" @click="loadTasksToXmIterationState" v-loading="load.calcIteration">计算迭代统计数据</el-button>

4
src/views/xm/core/xmIteration/XmIterationOverview.vue

@ -1,6 +1,6 @@
<template>
<section>
<el-row :style="{overflowX: 'hidden',height:maxTableHeight+'px'}" ref="table">
<el-row :style="{overflowX: 'hidden',height:(maxTableHeight-24)+'px'}" ref="table">
<el-row :gutter="10">
<el-col :span="8" >
<el-card class="box-card" style="padding:0px ;height:425px">
@ -957,7 +957,7 @@ export default {
mounted() {
this.$nextTick(() => {
this.maxTableHeight=util.calcTableMaxHeight(this.$refs.table.$el)
this.maxTableHeight=util.calcMaxHeight(this.$refs.table.$el)
});
initSimpleDicts('all',['xmIterationPstatus']).then(res=>{

12
src/views/xm/core/xmIteration/XmIterationOverviewComplex.vue

@ -11,7 +11,7 @@
<h4>常用功能导航</h4>
</el-row>
<el-row
ref="pageBody" class="padding" :style="{ maxHeight: maxTableHeight + 'px', overflowY: 'auto' }"
ref="pageBody" class="padding" :style="{ height: (maxTableHeight-24) + 'px', overflowY: 'auto' }"
>
<el-steps
:active="calcIterationStatusStep"
@ -272,22 +272,22 @@
</el-col>
<el-col :xl="20" :lg="20" :md="19" :sm="19" :xs="19" class="padding-left padding-right">
<el-tabs :value="showPanel" @tab-click="tabClick">
<el-tab-pane label="迭代概览" lazy name="overview" v-if="xmIteration && xmIteration.id">
<el-tab-pane label="迭代概览" lazy name="overview" >
<xm-iteration-overview class="padding-top" v-if="showPanel=='overview'" :xm-iteration="xmIteration"></xm-iteration-overview>
</el-tab-pane>
<el-tab-pane label="迭代详情" lazy name="detail" v-if="xmIteration && xmIteration.id">
<el-tab-pane label="迭代详情" lazy name="detail" >
<xm-iteration-edit v-if="showPanel=='detail'" :xm-iteration="xmIteration" @edit-fields="onEditFields"></xm-iteration-edit>
</el-tab-pane>
<el-tab-pane label="配置需求范围" lazy name="iterationMenuMng" v-if="xmIteration && xmIteration.id">
<el-tab-pane label="配置需求范围" lazy name="iterationMenuMng" >
<xm-iteration-menu-mng v-if="showPanel=='iterationMenuMng'" :xm-iteration="xmIteration" ref="iterationMenuMng" class="padding-top"></xm-iteration-menu-mng>
</el-tab-pane>
<el-tab-pane label="执行统计" lazy name="iterationCalc" v-if="xmIteration && xmIteration.id">
<el-tab-pane label="执行统计" lazy name="iterationCalc" >
<div v-if="showPanel=='iterationCalc'" class="padding">
<el-row>
@ -407,7 +407,7 @@ export default {
mounted() {
this.$nextTick(() => {
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.pageBody.$el);
this.maxTableHeight = util.calcMaxHeight(this.$refs.pageBody.$el);
});
initDicts(this)
},

10
src/views/xm/core/xmProduct/XmProductForLinkComplex.vue

@ -157,7 +157,6 @@
<el-tab-pane
label="产品概览"
name="productOverview"
v-if="xmProduct && xmProduct.id"
>
<xm-product-overview
v-if="xmProduct && showPanel == 'productOverview'"
@ -169,7 +168,6 @@
<el-tab-pane
label="产品详情"
name="detail"
v-if="xmProduct && xmProduct.id"
>
<xm-product-edit
v-if="showPanel == 'detail'"
@ -187,7 +185,6 @@
label="配置关联的项目"
lazy
name="productProjectLink"
v-if="xmProduct && xmProduct.id && !projectInfo"
>
<xm-product-project-link-mng
v-if="showPanel == 'productProjectLink'"
@ -197,7 +194,6 @@
<el-tab-pane
label="迭代"
name="iterationProductLink"
v-if="xmProduct && xmProduct.id"
>
<xm-iteration-mng style="margin-top:-10px;"
v-if="showPanel == 'iterationProductLink'"
@ -208,7 +204,6 @@
label="需求"
lazy
name="menus"
v-if="xmProduct && xmProduct.id"
>
<xm-menu-mng
v-if="xmProduct && showPanel == 'menus'"
@ -222,7 +217,6 @@
label="任务"
lazy
name="tasks"
v-if="xmProduct && xmProduct.id"
>
<xm-task-mng
v-if="xmProduct && showPanel == 'tasks'"
@ -237,7 +231,6 @@
label="缺陷"
lazy
name="bugs"
v-if="xmProduct && xmProduct.id"
>
<xm-question-mng
v-if="xmProduct && showPanel == 'bugs'"
@ -249,7 +242,6 @@
<el-tab-pane
label="执行统计"
name="productCalc"
v-if="xmProduct && xmProduct.id"
>
<div
v-if="showPanel == 'productCalc'"
@ -282,7 +274,7 @@
</div>
</el-tab-pane>
<el-tab-pane label="效能分析" name="效能" v-if="xmProduct && xmProduct.id">
<el-tab-pane label="效能分析" name="效能">
<xm-rpt v-if="xmProduct && showPanel=='效能'" :xm-project="projectInfo" :xm-iteration="xmIteration" :xm-product="xmProduct" category="产品级"></xm-rpt>
</el-tab-pane>
</el-tabs>

11
src/views/xm/core/xmProduct/XmProductOverview.vue

@ -1,6 +1,6 @@
<template>
<section>
<el-row :style="{overflowX: 'hidden',height:maxTableHeight+'px'}" ref="table">
<el-row :style="{overflowX: 'hidden',height:(maxTableHeight-24)+'px'}" ref="table">
<el-row :gutter="10">
<el-col :span="8" >
<el-card class="box-card" style="padding:0px ;height:425px">
@ -961,9 +961,8 @@ export default {
},
mounted() {
this.$nextTick(() => {
this.maxTableHeight=util.calcTableMaxHeight(this.$refs.table.$el)
});
initSimpleDicts('all',['xmProductPstatus']).then(res=>{
this.dicts=res.data.data;
@ -976,7 +975,9 @@ export default {
this.drawCostPie();
this.drawWorkload();
this.drawIterationProduct();
this.$nextTick(()=>{
this.maxTableHeight=util.calcMaxHeight(this.$refs.table.$el)
})
},
};

12
src/views/xm/core/xmProduct/XmProductOverviewComplex.vue

@ -8,7 +8,7 @@
<div class="border">
<el-row
ref="pageBody"
class="padding" :style="{ maxHeight: maxTableHeight + 'px', overflowY: 'auto' }">
class="padding" :style="{ maxHeight: (maxTableHeight-24) + 'px', overflowY: 'auto' }">
<h4 class="padding-bottom">常用功能导航</h4>
<el-steps
:active="calcProductPstatusStep"
@ -194,29 +194,25 @@
<el-tab-pane
label="产品概览"
name="overview"
v-if="xmProduct && xmProduct.id"
>
<xm-product-overview v-if="showPanelName=='overview' && xmProduct && xmProduct.id" :xm-product="xmProduct"></xm-product-overview>
<xm-product-overview v-if="showPanelName=='overview' && xmProduct && xmProduct.id" :xm-product="xmProduct"></xm-product-overview>
</el-tab-pane>
<el-tab-pane
label="产品详情"
name="detail"
v-if="xmProduct && xmProduct.id"
>
<xm-product-edit v-if="showPanelName=='detail'" :xm-product="xmProduct"></xm-product-edit>
</el-tab-pane>
<el-tab-pane
label="配置关联项目"
name="productProjectLink"
v-if="xmProduct && xmProduct.id"
>
<xm-product-project-link-mng v-if="showPanelName=='productProjectLink'" :xm-product="xmProduct"></xm-product-project-link-mng>
</el-tab-pane>
<el-tab-pane
label="执行数据汇总计划"
name="productCalc"
v-if="xmProduct && xmProduct.id"
>
<div v-if="showPanelName=='productCalc'" class="padding">
<el-row>
@ -234,14 +230,12 @@
<el-tab-pane
label="当前审批流"
name="currFlow"
v-if="xmProduct && xmProduct.id"
>
<task-mng v-if="showPanelName === 'currFlow' " ref="currFlow" :biz-parent-pkid="xmProduct.id" > </task-mng>
</el-tab-pane>
<el-tab-pane
label="历史审批流"
name="hisFlow"
v-if="xmProduct && xmProduct.id"
>
<procinst-mng v-if="showPanelName === 'hisFlow' " ref="hisFlow" isAll="true" :biz-parent-pkid="xmProduct.id"></procinst-mng>
</el-tab-pane>
@ -417,7 +411,7 @@ export default {
mounted() {
this.$nextTick(() => {
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.pageBody.$el);
this.maxTableHeight = util.calcMaxHeight(this.$refs.pageBody.$el);
});
initDicts(this)
},

16
src/views/xm/core/xmProject/XmProjectForLinkComplex.vue

@ -122,7 +122,6 @@
<el-tab-pane
label="项目概览"
name="projectOverview"
v-if="selProject && selProject.id"
>
<xm-project-overview
v-if="selProject && showPanel == 'projectOverview'"
@ -134,7 +133,6 @@
<el-tab-pane
label="项目详情"
name="detail"
v-if="selProject && selProject.id"
>
<xm-project-detail
v-if="showPanel == 'detail'"
@ -147,7 +145,6 @@
<el-tab-pane
label="配置关联的产品"
name="productProjectLink"
v-if="selProject && selProject.id && !xmProduct"
>
<xm-product-project-link-mng class="padding-top"
v-if="showPanel == 'productProjectLink'"
@ -161,9 +158,7 @@
-->
<el-tab-pane
label="需求"
lazy
name="menus"
v-if="selProject && selProject.id"
>
<xm-menu-mng
v-if="selProject && showPanel == 'menus'"
@ -176,9 +171,7 @@
<el-tab-pane
label="计划"
lazy
name="plan"
v-if="selProject && selProject.id"
>
<xm-plan
v-if="selProject&&selProject.id && showPanel == 'plan'"
@ -191,9 +184,7 @@
</el-tab-pane>
<el-tab-pane
label="任务"
lazy
name="tasks"
v-if="selProject && selProject.id"
>
<xm-task-mng
v-if="selProject && showPanel == 'tasks'"
@ -206,9 +197,7 @@
</el-tab-pane>
<el-tab-pane
label="缺陷"
lazy
name="bugs"
v-if="selProject && selProject.id"
>
<xm-question-mng
v-if="selProject && showPanel == 'bugs'"
@ -219,9 +208,7 @@
</el-tab-pane>
<el-tab-pane
label="团队"
lazy
name="group"
v-if="selProject && selProject.id"
>
<xm-group-mng
v-if="showPanel == 'group'"
@ -231,7 +218,6 @@
<el-tab-pane
label="执行统计"
name="projectCalc"
v-if="selProject && selProject.id"
>
<div v-if="showPanel == 'projectCalc'">
<el-row>
@ -261,7 +247,7 @@
</div>
</el-tab-pane>
<el-tab-pane label="效能分析" name="效能" v-if="selProject && selProject.id">
<el-tab-pane label="效能分析" name="效能">
<xm-rpt v-if="selProject && showPanel=='效能'" :xm-project="selProject" :xm-iteration="xmIteration" :xm-product="xmProduct" category="项目级"></xm-rpt>
</el-tab-pane>
</el-tabs>

4
src/views/xm/core/xmProject/XmProjectOverview.vue

@ -1,6 +1,6 @@
<template>
<section>
<el-row :style="{overflowX: 'hidden',height:maxTableHeight+'px'}" ref="table">
<el-row :style="{overflowX: 'hidden',height:(maxTableHeight-24)+'px'}" ref="table">
<el-row :gutter="10">
<el-col :span="8" >
<el-card class="box-card" style="padding:0px ;height:425px">
@ -974,7 +974,7 @@ export default {
mounted() {
this.$nextTick(() => {
this.maxTableHeight=util.calcTableMaxHeight(this.$refs.table.$el)
this.maxTableHeight=util.calcMaxHeight(this.$refs.table.$el)
});
initSimpleDicts('all',['projectType','priority','projectStatus']).then(res=>{

14
src/views/xm/core/xmProject/XmProjectOverviewComplex.vue

@ -8,7 +8,7 @@
</el-row>
<el-row
ref="pageBody"
class="padding" :style="{height:maxTableHeight+'px',overflowY:'auto'}">
class="padding" :style="{maxHeight:(maxTableHeight-24)+'px',overflowY:'auto'}">
<el-steps :active="calcProjectStatusStep" finish-status="success" direction="vertical">
<el-step
v-for="(i, index) in dicts['projectStatus']"
@ -127,15 +127,13 @@
<el-tab-pane
label="项目概览"
name="overview"
v-if="projectInfo && projectInfo.id"
>
<xm-project-overview v-if="showPanelName=='overview'" :sel-project="projectInfo"></xm-project-overview>
<xm-project-overview v-if="showPanelName=='overview' && projectInfo && projectInfo.id" :sel-project="projectInfo"></xm-project-overview>
</el-tab-pane>
<el-tab-pane
label="项目详情"
name="detail"
v-if="projectInfo && projectInfo.id"
>
<xm-project-detail v-if="showPanelName=='detail'" :sel-project="projectInfo" @submit="afterEditSubmit" @edit-fields="onEditFields" ref="detail"></xm-project-detail>
@ -143,7 +141,6 @@
<el-tab-pane
label="关联产品"
name="productProjectLink"
v-if="projectInfo && projectInfo.id"
>
<xm-product-project-link-mng v-if="showPanelName=='productProjectLink'" :sel-project="projectInfo"></xm-product-project-link-mng>
@ -151,7 +148,6 @@
<el-tab-pane
label="执行项目数据统计计划"
name="projectCalc"
v-if="projectInfo && projectInfo.id"
>
<div v-if="showPanelName=='projectCalc'" class="padding">
<el-row>
@ -169,7 +165,6 @@
<el-tab-pane
label="当前审批流"
name="currFlow"
v-if="projectInfo && projectInfo.id"
>
<task-mng v-if="showPanelName === 'currFlow' " ref="currFlow" :biz-parent-pkid="projectInfo.id" @submit="afterFlowSubmit"> </task-mng>
@ -177,13 +172,10 @@
<el-tab-pane
label="历史审批流"
name="hisFlow"
v-if="projectInfo && projectInfo.id"
>
<procinst-mng v-if="showPanelName === 'hisFlow' " ref="hisFlow" isAll="true" :biz-parent-pkid="projectInfo.id"></procinst-mng>
</el-tab-pane>
</el-tabs>
<xm-iteration-link-for-project v-if="showPanelName=='iterationProjectLink'" :sel-project="projectInfo"></xm-iteration-link-for-project>
@ -364,7 +356,7 @@ export default {
this.$nextTick(() => {
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.pageBody.$el);
this.maxTableHeight = util.calcMaxHeight(this.$refs.pageBody.$el);
});
},

457
src/views/xm/rpt/index/CfigRpt.vue

@ -0,0 +1,457 @@
<template>
<section>
<el-row class="padding-left padding-right">
<el-col :span="6">
<comps-set :category="category" @row-click="onCompSelect" ref="compsSet" :show-checked-only="isRptShow||showCheckedOnly" :is-rpt-cfg="isRptCfg" @sort="onSort" @change="onCompChange"></comps-set>
</el-col>
<el-col :span="18">
<el-row class="padding">
<span class="rpt-name" v-if="xmRptData && xmRptData.id">{{ xmRptData.rptName}}</span>
<span class="rpt-name" v-else-if="xmRptConfig && xmRptConfig.id">{{ xmRptConfig.name}}</span>
<span class="rpt-name" v-else>{{ rptConfigParamsCpd.name+'-报告'}}</span>
<span style="float:right;">
<el-button type="text" v-if="isRptShow==true && isRptCfg==false" @click="toQueryRptData" icon="el-icon-time">查看历史报告</el-button>
<el-button type="primary" v-if="isRptShow==true && isRptCfg==false && (!xmRptData||!xmRptData.id)" @click="showCreateRptData()" icon="el-icon-time">存档</el-button>
<el-button type="text" v-if="isRptShow==false && isRptCfg==false" @click="isRptShow=true" icon="el-icon-time">查看报告</el-button>
<el-button type="warning" v-if="isRptShow==true" @click="undoRptShow" icon="el-icon-error">退出报告</el-button>
<el-button type="text" v-if="isRptCfg==false&&isRptShow==false" @click="toRptCfg" icon="el-icon-setting">制作报告</el-button>
<el-button type="primary" v-if="isRptCfg==true" @click="undoRptCfg" icon="el-icon-error">取消制作</el-button>
<el-button type="warning" v-if="isRptCfg==true" @click="toSaveRptCfg">保存&退出</el-button>
<el-button type="text" v-if="paramsVisible==true" @click="paramsVisible=false">隐藏过滤条件</el-button>
<el-button type="text" v-if="paramsVisible==false" @click="paramsVisible=true">显示过滤条件</el-button>
<el-button type="text" v-if="isRptShow==true && isRptCfg==false && xmRptData && xmRptData.id" @click="toShareRpt" icon="el-icon-share">分享</el-button>
<el-button type="text" v-print="{id:'printBody',popTitle:xmRptData && xmRptData.id?xmRptData.rptName:(xmRptConfig&&xmRptConfig.id?xmRptConfig.name: rptConfigParamsCpd.name+'-报告')}" icon="el-icon-printer"></el-button>
<el-button type="text" @click="exportToPdf">pdf</el-button>
</span>
</el-row>
<el-row :style="{height:maxTableHeight+'px',overflowY:'auto',overflowX:'hidden',}" ref="table">
<div class="empty" v-if="compCfgList.length == 0" >
<el-empty description="暂未选择报表,请至少选择一个报表"></el-empty>
</div>
<div v-else id="printBody" ref="rptBox">
<component style="margin-bottom:80px;" v-for="(item,index) in compCfgList" :key="item.compId" :is="item.compId" :xm-test-plan="xmTestPlan" :xm-product="xmProduct" :xm-project="xmProject" :xm-iteration="xmIteration" :xm-test-casedb="xmTestCasedb" :category="category" :cfg="item.cfg" :ref="item.id" @delete="doDelete(item)" :init-group-by="item.initGroupBy" :show-tool-bar="false" :id="item.id" :rpt-datas="item.rawDatas" :is-rpt-cfg="isRptCfg" :show-params="paramsVisible"></component>
</div>
</el-row>
</el-col>
</el-row>
<el-dialog append-to-body modal-append-to-body :visible.sync="rptDataSelectVisible" top="20px" width="60%">
<rpt-data-select :xm-rpt-config="xmRptConfig" v-if="rptDataSelectVisible" @select="onRptDataSelect"/>
</el-dialog>
<el-dialog title="请确认" append-to-body modal-append-to-body :visible.sync="createRptConfigVisible">
<el-form :model="xmRptConfig">
<el-form-item label="报告名称">
<el-input v-model="xmRptConfig.name"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="createRptConfigVisible = false"> </el-button>
<el-button type="primary" @click="finishRptCfg"> </el-button>
</div>
</el-dialog>
<el-dialog title="请确认" append-to-body modal-append-to-body :visible.sync="createRptDataVisible">
<el-form :model="xmRptData">
<el-form-item label="报告名称">
<el-input v-model="xmRptData.rptName"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="createRptDataVisible = false"> </el-button>
<el-button type="primary" @click="createRptData"> </el-button>
</div>
</el-dialog>
</section>
</template>
<script>
import util from '@/common/js/util';//
import seq from '@/common/js/sequence';//
import VueGridLayout from 'vue-grid-layout';
import { mapGetters } from 'vuex'
import CompsSet from '@/views/xm/rpt/index/CompsSet'
import rptDataSelect from '@/views/xm/rpt/his/rptDataSelect'
import { addXmRptData } from '@/api/xm/core/xmRptData';
import { listXmRptConfig,editXmRptConfig,addXmRptConfig } from '@/api/xm/core/xmRptConfig';
import rptComps from './comps.js';//
export default {
components: {
GridLayout: VueGridLayout.GridLayout,
GridItem: VueGridLayout.GridItem,
CompsSet, rptDataSelect,
...rptComps
},
props:['xmTestCasedb','xmTestPlan','xmProduct','xmProject','xmIteration','category','showParams','showCheckedOnly'],
computed: {
...mapGetters(['userInfo']),
rptConfigParamsCpd(){
//1-2-3-4-5-
var params={bizType:'5',bizId:this.userInfo.branchId,name:this.userInfo.branchName}
if(this.category=='企业级'){
params.bizType='5';
params.bizId=this.userInfo.branchId
params.name=this.userInfo.branchName
}else if(this.category=='产品级'){
params.bizType='1';
params.bizId=this.xmProduct.id
params.name=this.xmProduct.productName
}else if(this.category=='迭代级'){
params.bizType='2';
params.bizId=this.xmIteration.id
params.name=this.xmIteration.iterationName
}else if(this.category=='项目级'){
params.bizType='4';
params.bizId=this.xmProject.id
params.name=this.xmProject.name
}else if(this.category=='测试库级'){
params.bizType='6';
params.bizId=this.xmTestCasedb.id
params.name=this.xmTestCasedb.name
}else if(this.category=='测试计划级'){
params.bizType='3';
params.bizId=this.xmTestPlan.id
params.name=this.xmTestPlan.name
}
return params;
},
toLoadXmRptConfigCpd(){
return this.isRptCfg || this.isRptShow
}
},
watch: {
xmRptConfig:{
handler(){
this.initCompCfgList();
},
deep:true,
},
toLoadXmRptConfigCpd(){
this.getXmRptConfig();
this.$nextTick(()=>{
this.compCfgList.forEach(k=>{
this.sizeAutoChange(k);
})
})
},
rptConfigParamsCpd(){
if(this.isRptCfg ||this.isRptShow){
this.getXmRptConfig()
}
}
},
data() {
return {
isRptCfg:false,
isRptShow:false,
xmRptConfig:{id:'',name:'',bizType:'',bizId:'',cfg:[]},
xmRptData:{id:'',rptName:'',bizId:'',bizType:'',bizDate:'',rptData:[]},
xmRptDataInit:{id:'',rptName:'',bizId:'',bizType:'',bizDate:'',rptData:[]},
compCfgList:[],
maxTableHeight:300,
//
layoutColNum: 12,
paramsVisible:true,
rptDataSelectVisible:false,
createRptDataVisible:false,
createRptConfigVisible:false,
}
},
methods: {
initData(){
if(this.showParams!=undefined){
this.paramsVisible=this.showParams
}
if(!this.toLoadXmRptConfigCpd){
this.initCompCfgList();
}else{
this.getXmRptConfig();
}
},
toShareRpt(){
if(!this.xmRptData||!this.xmRptData.id){
this.$message.error("只能分享历史报告")
return;
}
var curlDomain=window.location.protocol+"//"+window.location.host; // https://mp.csdn.net
var link=curlDomain+"/"+process.env.CONTEXT+"/"+process.env.VERSION+"/#/xm/rpt/his/detail?id="+this.xmRptData.id
this.$copyText(link).then(e => {
this.$notify({position:'bottom-left',showClose:true,message:"拷贝链接成功,您可以黏贴到任何地方",type:'success'})
});
},
showCreateRptData(){
if(!this.xmRptConfig|| !this.xmRptConfig.id){
this.$message.error("还没制作报告,请先制作报告")
return;
}
this.xmRptData.rptName=this.xmRptConfig.name+"-"+util.getDate()
this.createRptDataVisible=true
},
toSaveRptCfg(){
this.createRptConfigVisible=true
if(!this.xmRptConfig.name){
this.xmRptConfig.name=this.rptConfigParamsCpd.name+"-报告"
}
},
toQueryRptData(){
this.rptDataSelectVisible=true;
},
createRptData(){
if(!this.xmRptConfig|| !this.xmRptConfig.id){
this.$message.error("还没制作报告,请先制作报告")
return;
}
if(!this.xmRptData.rptName){
this.$message.error("请输入报告名称")
return;
}
var xmRptData={rptName:this.xmRptData.rptName,bizType:this.xmRptConfig.bizType,bizId:this.xmRptConfig.bizId,cfgId:this.xmRptConfig.id,rptData:[]}
this.compCfgList.forEach(k=>{
if(this.$refs[k.id] && this.$refs[k.id][0].$refs && this.$refs[k.id][0].$refs[k.id]){
var com=this.$refs[k.id][0].$refs[k.id]
var comData={compId:k.compId,params:com.params,title:com.title,remark:com.remark,rawDatas:com.rawDatas}
xmRptData.rptData.push(comData)
}else{
var com=this.$refs[k.id][0]
var comData={compId:k.compId,params:com.params,title:com.title,remark:com.remark,rawDatas:com.rawDatas}
xmRptData.rptData.push(comData)
}
})
xmRptData.rptData=JSON.stringify(xmRptData.rptData)
addXmRptData(xmRptData).then(res=>{
var tips = res.data.tips
if(tips.isOk){
this.$message.success("报告保存成功")
this.createRptDataVisible=false
}else{
this.$message.error(tips.msg)
}
})
},
undoRptCfg(){
this.xmRptConfig={};
this.isRptCfg=false;
},
undoRptShow(){
this.isRptShow=false;
this.xmRptConfig={};
this.xmRptData={...this.xmRptDataInit};
},
toRptCfg(){
this.isRptCfg=true;
this.$message.success("切换到报告制作模式成功。请选择报表加入报告中。")
},
finishRptCfg(){
this.submitXmPrtConfig((res)=>{
var tips = res.data.tips;
if(tips.isOk){
this.isRptCfg=false
this.xmRptConfig={};
this.createRptConfigVisible=false;
this.$message.success("报告保存成功。将退出报告制作模式")
}else{
this.$message.error(tips.msg)
}
});
},
getXmRptConfig(){
if(!this.toLoadXmRptConfigCpd){
return;
}
if(this.rptDatas){
this.rawDatas=this.rptDatas
return;
}
var params={bizType:this.rptConfigParamsCpd.bizType,bizId:this.rptConfigParamsCpd.bizId}
listXmRptConfig(params).then(res=>{
if(!res.data.tips.isOk){
this.$message.error(res.data.tips.msg)
return ;
}
if(!res.data.data || res.data.data.length==0 ){
this.xmRptConfig={}
}else{
this.xmRptConfig=res.data.data[0]
}
})
},
initCompCfgList(){
if(this.xmRptConfig && this.xmRptConfig.id && this.xmRptConfig.cfg){
var cfgJson=JSON.parse(this.xmRptConfig.cfg)
cfgJson.forEach(k=>k.id=k.compId+seq.sn())
this.compCfgList=cfgJson;
this.$refs.compsSet.setCheckeds(this.compCfgList.map(k=>k.compId),true)
}
},
onCompSelect(comp){
if(this.compCfgList.some(k=>k.compId==comp.compId)){
var compCfg=this.compCfgList.find(k=>k.compId==comp.compId)
this.$nextTick(()=>{
this.scrollToComp(compCfg)
})
return;
}
var allCheckedList=this.$refs.compsSet.datas.filter(k=>k.isChecked)
var index=allCheckedList.findIndex(k=>k.compId==comp.compId)
var compCfg={...comp,id:comp.compId+seq.sn()}
this.compCfgList.splice(index,0,compCfg)
this.$nextTick(()=>{
setTimeout(()=>{
this.scrollToComp(compCfg)
},200)
})
},
scrollToComp(compCfg){
var doc=document.getElementById(compCfg.id)
if(doc){
doc.scrollIntoView(true)
}
},
submitXmPrtConfig(callback){
if(!this.xmRptConfig||!this.xmRptConfig.name){
this.$message.error("请输入报告名称")
return
}
if(!this.xmRptConfig.id){
var xmRptConfig={...this.rptConfigParamsCpd,name:this.xmRptConfig.name,cfg:[]}
this.compCfgList.forEach(k=>{
if(this.$refs[k.id] && this.$refs[k.id][0].$refs && this.$refs[k.id][0].$refs[k.id]){
var com=this.$refs[k.id][0].$refs[k.id]
var comData={compId:k.compId,params:com.params,title:com.title,remark:com.remark}
xmRptConfig.cfg.push(comData)
}else{
var com=this.$refs[k.id][0]
var comData={compId:k.compId,params:com.params,title:com.title,remark:com.remark}
xmRptConfig.cfg.push(comData)
}
})
xmRptConfig.cfg=JSON.stringify(xmRptConfig.cfg)
addXmRptConfig(xmRptConfig).then(res=>{
this.xmRptConfig=xmRptConfig;
callback(res)
})
}else{
var xmRptConfig={...this.xmRptConfig,cfg:[]}
this.compCfgList.forEach(k=>{
if(this.$refs[k.id] && this.$refs[k.id][0].$refs && this.$refs[k.id][0].$refs[k.id]){
var com=this.$refs[k.id][0].$refs[k.id]
var comData={compId:k.compId,params:com.params,title:com.title,remark:com.remark}
xmRptConfig.cfg.push(comData)
}else{
var com=this.$refs[k.id][0]
var comData={compId:k.compId,params:com.params,title:com.title,remark:com.remark}
xmRptConfig.cfg.push(comData)
}
})
xmRptConfig.cfg=JSON.stringify(xmRptConfig.cfg)
editXmRptConfig(xmRptConfig).then(res=>{
this.xmRptConfig=xmRptConfig;
callback(res)
})
}
},
doDelete(compCfg){
var index=this.compCfgList.findIndex(k=>k.id==compCfg.id)
if(index>=0){
this.compCfgList.splice(index,1)
}
this.$refs.compsSet.setChecked(compCfg.compId,false)
},
sizeAutoChange(k){
},
onRptDataSelect(rptData){
this.xmRptData=rptData
this.rptDataSelectVisible=false;
if(this.xmRptData && this.xmRptData.id ){
if( this.xmRptData.cfgId==this.xmRptConfig.id){
this.xmRptConfig.name=this.xmRptData.rptName
var cfgList=JSON.parse(this.xmRptData.rptData)
cfgList.forEach(k=>k.id=k.compId+seq.sn())
this.compCfgList=cfgList
this.$refs.compsSet.setCheckeds(this.compCfgList.map(k=>k.compId),true)
}
}
},
exportToPdf(){
this.paramsVisible=false
this.$nextTick(()=>{
this.$PDFSave(this.$refs.rptBox, this.rptConfigParamsCpd.name+"-报告");
})
},
onSort(evt,datas){
datas.forEach((d,index)=>{
var comp=this.compCfgList.find(k=>k.compId==d.compId)
if(comp){
comp.index=index
}
})
this.compCfgList.sort((i1,i2)=>{
return i1.index-i2.index
})
var compCfg=this.compCfgList.find(k=>k.compId==datas[evt.newIndex].compId)
this.$nextTick(()=>{
setTimeout(()=>{
this.scrollToComp(compCfg)
},200)
})
},
onCompChange(compCfg,checked){
if(!checked){
var index=this.compCfgList.findIndex(k=>k.compId==compCfg.compId)
if(index>=0){
this.compCfgList.splice(index,1)
}
}else{
this.onCompSelect(compCfg)
}
}
},
mounted() {
this.$nextTick(() => {
this.initData();
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el)
})
},
}
</script>
<style lang="less" scoped>
.toolbar{
z-index: 999;
position:absolute;
top:0px;
right:20px;
}
.rpt-name{
text-align: center;
font-size: 18px;
font-weight: 600;
}
</style>

4
src/views/xm/rpt/index/CompsCard.vue

@ -26,7 +26,7 @@
<el-button type="text" @click="exportToPdf">pdf</el-button>
</span>
</el-row>
<el-row :style="{height:maxTableHeight+'px',overflowY:'auto',overflowX:'hidden',}" ref="table">
<el-row :style="{height:(maxTableHeight-24)+'px',overflowY:'auto',overflowX:'hidden',}" ref="table">
<div class="empty" v-if="compCfgList.length == 0" >
<el-empty description="暂未选择报表,请至少选择一个报表"></el-empty>
</div>
@ -437,7 +437,7 @@ export default {
mounted() {
this.$nextTick(() => {
this.initData();
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el)
this.maxTableHeight = util.calcMaxHeight(this.$refs.table.$el)
})
},

4
src/views/xm/rpt/index/CompsSet.vue

@ -5,7 +5,7 @@
<el-option v-for="(item,index) in categorys" :label="item" :value="item" :key="index"></el-option>
</el-select>
</el-row>
<el-row ref="table" :style="{height:maxTableHeight+'px',overflow:'auto'}">
<el-row ref="table" :style="{height:(maxTableHeight-24)+'px',overflow:'auto'}">
<div class="moduleset-lg hidden-md-and-down">
<div class="nav">
<draggable @update="datadragEnd" v-model="datas" style='sort: false' >
@ -247,7 +247,7 @@ export default {
//this.comps.forEach(k=>k.id=k.id?k.id:k.compId)
this.$nextTick(()=>{
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el)
this.maxTableHeight = util.calcMaxHeight(this.$refs.table.$el)
if(this.category){
this.filters.category=this.category
}else{

Loading…
Cancel
Save