You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
458 lines
20 KiB
458 lines
20 KiB
<template>
|
|
<section>
|
|
<el-row class="padding-left padding-right">
|
|
<el-col :span="6">
|
|
<comps-set :comp-ids="compIds" :category="category" @row-click="onCompSelect" ref="compsSet" :show-checked-only="isRptShow"></comps-set>
|
|
</el-col>
|
|
<el-col :span="18">
|
|
<el-row class="padding">
|
|
<span class="rpt-name">{{ xmRptData && xmRptData.id?xmRptData.rptName:(xmRptConfig&&xmRptConfig.id?xmRptConfig.name: 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="finishRptCfg">保存报告</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-print="{id:'printBody',popTitle: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="index" :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-data="item.rawDatas" :show-params="paramsVisible"></component>
|
|
|
|
</div>
|
|
</el-row>
|
|
</el-col>
|
|
</el-row>
|
|
<el-dialog append-to-body modal-append-to-body :visible.sync="rptDataListVisible" top="20px" width="60%">
|
|
<rpt-data-list :xm-rpt-config="xmRptConfig" v-if="rptDataListVisible" @select="onRptDataSelect"/>
|
|
</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/CompsSet'
|
|
import rptDataList from '@/views/xm/rpt/rptDataList'
|
|
import { addXmRptData } from '@/api/xm/core/xmRptData';
|
|
|
|
|
|
import { listXmRptConfig,editXmRptConfig,addXmRptConfig } from '@/api/xm/core/xmRptConfig';
|
|
|
|
export default {
|
|
components: {
|
|
GridLayout: VueGridLayout.GridLayout,
|
|
GridItem: VueGridLayout.GridItem,
|
|
CompsSet, rptDataList,
|
|
xmTestRptOverview:()=>import("../core/xmTestPlan/xmTestRptOverview.vue"),
|
|
xmMenuDayTrend:()=>import("./product/menuDayTrend.vue"),
|
|
xmMenuDayAccumulate:()=>import("./product/menuDayTrend.vue"),
|
|
xmMenuAttDist:()=>import('./product/menuAttDist'),
|
|
xmMenuAgeDist:()=>import('./product/menuAgeDist.vue'),
|
|
xmMenuSort:()=>import('./product/menuSort.vue'),
|
|
xmMenuFuncSort:()=>import('./product/menuSort.vue'),
|
|
xmMenuProductSort:()=>import('./product/menuSort.vue'),
|
|
xmMenuIterationSort:()=>import('./product/menuSort.vue'),
|
|
xmProductWorkItemDayList:()=>import('./product/productWorkItemDayList.vue'),
|
|
|
|
|
|
xmTaskDayTrend:()=>import('./project/taskDayTrend.vue'),
|
|
xmTaskDayAccumulate:()=>import('./project/taskDayAccumulate.vue'),
|
|
xmTaskAttDist:()=>import('./project/taskAttDist.vue'),
|
|
xmTaskAgeDist:()=>import('./project/taskAgeDist.vue'),
|
|
xmTaskSort:()=>import('./project/taskSort.vue'),
|
|
xmProjectWorkItemDayList:()=>import('./project/projectWorkItemDayList.vue'),
|
|
xmProjectWorkloadSetDayList:()=>import('./project/projectWorkloadSetDayList.vue'),
|
|
xmProjectWorkloadSetMonthList:()=>import('./project/projectWorkloadSetMonthList.vue'),
|
|
|
|
xmQuestionDayTrend:()=>import('./product/questionDayTrend.vue'),
|
|
xmQuestionDayAccumulate:()=>import('./product/questionDayAccumulate.vue'),
|
|
xmQuestionAttDist:()=>import('./product/questionAttDist.vue'),
|
|
xmQuestionStateDist:()=>import('./product/questionAttDist.vue'),
|
|
xmQuestionAgeDist:()=>import('./product/questionAgeDist.vue'),
|
|
xmQuestionBugReasonDist:()=>import('./product/questionAttDist.vue'),
|
|
xmQuestionBugTypeDist:()=>import('./product/questionAttDist.vue'),
|
|
xmQuestionPriorityDist:()=>import('./product/questionAttDist.vue'),
|
|
xmQuestionSort:()=>import('./product/questionSort.vue'),
|
|
xmQuestionAskUserSort:()=>import('./product/questionSort.vue'),
|
|
xmQuestionHandlerUserSort:()=>import('./product/questionSort.vue'),
|
|
xmQuestionFuncSort:()=>import('./product/questionSort.vue'),
|
|
xmQuestionMenuSort:()=>import('./product/questionSort.vue'),
|
|
xmQuestionRetestDist:()=>import('./product/questionRetestDist.vue'),
|
|
|
|
|
|
xmTestPlanCaseExecStatusDist:()=>import('./testPlan/testPlanCaseExecStatusDist.vue'),
|
|
xmTestPlanCaseUserDist:()=>import('./testPlan/testPlanCaseUserDist.vue'),
|
|
xmTestDayTimesCalc:()=>import('./testPlan/testDayTimesCalc.vue'),
|
|
xmTestCaseToPlanCalc:()=>import('./testPlan/testCaseToPlanCalc.vue'),
|
|
xmTestCaseSort:()=>import('./testCase/testCaseSort.vue'),
|
|
xmTestCaseCuserSort:()=>import('./testCase/testCaseSort.vue'),
|
|
xmTestCaseFuncSort:()=>import('./testCase/testCaseSort.vue'),
|
|
xmTestCaseMenuSort:()=>import('./testCase/testCaseSort.vue'),
|
|
|
|
|
|
xmIterationMenuDayTrend:()=>import('./iteration/menuDayTrend.vue'),
|
|
xmIterationMenuDayAccumulate:()=>import('./iteration/menuDayAccumulate.vue'),
|
|
xmIterationBurnout:()=>import('./iteration/burnout.vue'),
|
|
xmIterationWorkItemDayList:()=>import('./iteration/iterationWorkItemDayList.vue'),
|
|
xmIterationQuestionDayTrend:()=>import('./iteration/questionDayTrend.vue'),
|
|
xmIterationQuestionDayAccumulate:()=>import('./iteration/questionDayAccumulate.vue'),
|
|
|
|
|
|
xmBranchWorkItemDayList:()=>import('./branch/branchWorkItemDayList.vue'),
|
|
xmBranchQuestionDayTrend:()=>import('./branch/questionDayTrend.vue'),
|
|
xmBranchQuestionDayAccumulate:()=>import('./branch/questionDayAccumulate.vue'),
|
|
xmBranchMenuDayTrend:()=>import('./branch/menuDayTrend.vue'),
|
|
xmBranchMenuDayAccumulate:()=>import('./branch/menuDayAccumulate.vue'),
|
|
|
|
},
|
|
props:['xmTestCasedb','xmTestPlan','xmProduct','xmProject','xmIteration','category','showParams'],
|
|
computed: {
|
|
...mapGetters(['userInfo']),
|
|
compIds(){
|
|
return this.compCfgList.map(k=>k.compId)
|
|
},
|
|
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=='测试级'){
|
|
if(this.xmTestPlan && this.xmTestPlan.id){
|
|
params.bizType='3';
|
|
params.bizId=this.xmTestPlan.id
|
|
params.name=this.xmTestPlan.name
|
|
}else{
|
|
params.bizType='6';
|
|
params.bizId=this.xmTestCasedb.id
|
|
params.name=this.xmTestCasedb.name
|
|
}
|
|
|
|
|
|
}else {
|
|
return params;
|
|
}
|
|
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:null,
|
|
xmRptData:{id:'',rptName:'',bizId:'',bizType:'',bizDate:''},
|
|
xmRptDataInit:{id:'',rptName:'',bizId:'',bizType:'',bizDate:''},
|
|
compCfgList:[],
|
|
maxTableHeight:300,
|
|
// 布局列数
|
|
layoutColNum: 12,
|
|
paramsVisible:true,
|
|
rptDataListVisible:false,
|
|
createRptDataVisible:false,
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
initData(){
|
|
if(this.showParams!=undefined){
|
|
this.paramsVisible=this.showParams
|
|
}
|
|
if(!this.toLoadXmRptConfigCpd){
|
|
this.initCompCfgList();
|
|
}else{
|
|
this.getXmRptConfig();
|
|
}
|
|
|
|
},
|
|
showCreateRptData(){
|
|
if(this.xmRptConfig==null){
|
|
this.$message.error("还没制作报告,请先制作报告")
|
|
return;
|
|
}
|
|
this.xmRptData.rptName=this.xmRptConfig.name
|
|
this.createRptDataVisible=true
|
|
|
|
},
|
|
toQueryRptData(){
|
|
this.rptDataListVisible=true;
|
|
},
|
|
createRptData(){
|
|
if(this.xmRptConfig==null){
|
|
this.$message.error("还没制作报告,请先制作报告")
|
|
return;
|
|
}
|
|
if(!this.xmRptData.rptName){
|
|
this.$message.error("请输入报告名称")
|
|
return;
|
|
}
|
|
var xmRptData={...this.xmRptData,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}
|
|
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}
|
|
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=null;
|
|
this.isRptCfg=false;
|
|
},
|
|
undoRptShow(){
|
|
this.isRptShow=false;
|
|
this.xmRptConfig=null;
|
|
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=null;
|
|
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=>{
|
|
this.xmRptConfig=res.data.data[0]
|
|
})
|
|
},
|
|
initCompCfgList(){
|
|
if(this.xmRptConfig && this.xmRptConfig.cfg){
|
|
var cfgJson=JSON.parse(this.xmRptConfig.cfg)
|
|
cfgJson.forEach(k=>k.id=k.compId+seq.sn())
|
|
this.compCfgList=cfgJson;
|
|
}else{
|
|
var defList=this.$refs['compsSet'].rptListCpd
|
|
if(defList && defList.length>3){
|
|
defList=defList.slice(0,3);
|
|
}
|
|
defList.forEach(k=>k.id=k.compId+seq.sn())
|
|
this.compCfgList=JSON.parse(JSON.stringify(defList))
|
|
}
|
|
},
|
|
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 compCfgListTemp=JSON.parse(JSON.stringify(this.compCfgList))
|
|
compCfgListTemp.sort((i1,i2)=>{
|
|
return i2.i-i1.i
|
|
})
|
|
var maxI=(compCfgListTemp.length>0?(compCfgListTemp[0].i+1):1);
|
|
compCfgListTemp.sort((i1,i2)=>{
|
|
return i2.y-i1.y
|
|
})
|
|
var maxY=(compCfgListTemp.length>0?(compCfgListTemp[0].y+6):0);
|
|
var compCfg={...comp,i:maxI, x: 0, y: maxY, w: 12, h: 6,id:comp.compId+seq.sn()}
|
|
this.compCfgList.push(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==null){
|
|
var xmRptConfig={...this.rptConfigParamsCpd,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)
|
|
}
|
|
},
|
|
sizeAutoChange(k){
|
|
|
|
|
|
},
|
|
onRptDataSelect(rptData){
|
|
this.xmRptData=rptData
|
|
this.rptDataListVisible=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
|
|
}
|
|
}
|
|
},
|
|
exportToPdf(){
|
|
this.paramsVisible=false
|
|
this.$nextTick(()=>{
|
|
this.$PDFSave(this.$refs.rptBox, this.rptConfigParamsCpd.name+"-报告");
|
|
})
|
|
|
|
},
|
|
|
|
},
|
|
|
|
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>
|