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.
 
 
 
 

478 lines
14 KiB

<template>
<div id="data-view">
<dv-full-screen-container>
<top-header :title="'唛盟项目管理综合数据监控'"/>
<div class="main-content">
<digital-flop :data="digitalFlopData" :title="'汇总数据'" />
<div class="block-left-right-content">
<ranking-board :data="rankingBoardData" :title="'项目进度'" />
<div class="block-top-bottom-content">
<div class="block-top-content">
<rose-chart :data="roseChartData" :title="'资金分布'"/>
<water-level-chart :data="waterLevelChartData" :title="'计划资金累计完成情况'"/>
<scroll-board :data="scrollBoardData" :title="'动态'" :header="['时间','操作人','动作','备注']"/>
</div>
<cards :data="cardsData" :title="'产品'" />
</div>
</div>
</div>
</dv-full-screen-container>
</div>
</template>
<script>
import Vue from 'vue'
import topHeader from './topHeader'
import digitalFlop from './digitalFlop'
import rankingBoard from './rankingBoard'
import roseChart from './roseChart'
import waterLevelChart from './waterLevelChart'
import scrollBoard from './scrollBoard'
import cards from './cards'
import dataV from '@jiaminghi/data-view'
Vue.use(dataV)
import util from '@/common/js/util';//全局公共库
import config from '@/common/config';//全局公共库
import { listOption } from '@/api/mdp/meta/itemOption';//下拉框数据查询
import { listXmBranchState } from '@/api/xm/core/xmBranchState';
import { listXmProjectState} from '@/api/xm/core/xmProjectState';
import { listXmBranchTaskTypeState } from '@/api/xm/core/xmBranchTaskTypeState';
import { listXmRecord } from '@/api/xm/core/xmRecord';
import { listXmProductState } from '@/api/xm/core/xmProductState';
import { mapGetters } from 'vuex'
export default {
name: 'BranchDataView',
components: {
topHeader,
digitalFlop,
rankingBoard,
roseChart,
waterLevelChart,
scrollBoard,
cards
},
computed: {
...mapGetters([
'userInfo'
]),
digitalFlopData(){
if(!this.xmBranchState){
return null;
}
var digitalFlopData = [
{
title: '累计金额',
number: {
number: [(this.floatValue(this.xmBranchState.totalBudgetNouserAmount) + this.floatValue(this.xmBranchState.totalBudgetIuserAmount) + this.floatValue(this.xmBranchState.totalBudgetOuserAmount))/10000],
content: '{nt}',
textAlign: 'right',
style: {
fill: '#40faee',
fontWeight: 'bold'
}
},
unit: '万元'
},
{
title: '发布总任务数',
number: {
number: [this.xmBranchState.totalTaskCnt ],
content: '{nt}',
textAlign: 'right',
style: {
fill: '#4d99fc',
fontWeight: 'bold'
}
},
unit: '个'
},
{
title: '项目',
number: {
number: [this.xmBranchState.projectCnt ],
content: '{nt}',
textAlign: 'right',
style: {
fill: '#f46827',
fontWeight: 'bold'
}
},
unit: '个'
},
{
title: '参与人数',
number: {
number: [this.xmBranchState.totalStaffCnt],
content: '{nt}',
textAlign: 'right',
style: {
fill: '#40faee',
fontWeight: 'bold'
}
},
unit: '人'
},
{
title: '客户',
number: {
number: [this.xmBranchState.productCnt],
content: '{nt}',
textAlign: 'right',
style: {
fill: '#4d99fc',
fontWeight: 'bold'
}
},
unit: '个'
},
{
title: '需求',
number: {
number: [this.xmBranchState.menuCnt],
content: '{nt}',
textAlign: 'right',
style: {
fill: '#f46827',
fontWeight: 'bold'
}
},
unit: '个'
},
{
title: '产品',
number: {
number: [this.xmBranchState.productCnt],
content: '{nt}',
textAlign: 'right',
style: {
fill: '#40faee',
fontWeight: 'bold'
}
},
unit: '个'
},
{
title: '测试用例',
number: {
number: [this.xmBranchState.testCases],
content: '{nt}',
textAlign: 'right',
style: {
fill: '#4d99fc',
fontWeight: 'bold'
}
},
unit: '个'
},
{
title: '迭代',
number: {
number: [this.xmBranchState.iterationCnt],
content: '{nt}',
textAlign: 'right',
style: {
fill: '#f46827',
fontWeight: 'bold'
}
},
unit: '个'
}
]
return digitalFlopData;
},
rankingBoardData(){
if( !this.xmProjectStates || this.xmProjectStates.length==0 ){
return [];
}
var rankingBoardData=this.xmProjectStates.map(i=>{
return {name:i.projectName,value:i.totalProgress+'%'}
})
return rankingBoardData
},
roseChartData(){
var taskTypeList=this.options.taskType
if(this.xmBranchTaskTypeStates && this.xmBranchTaskTypeStates.length>0){
var xmBranchTaskTypeStates=this.xmBranchTaskTypeStates.filter(i=>i.planAmount>0);
var roseChartData=xmBranchTaskTypeStates.map(i=>{
if(!taskTypeList || taskTypeList.length==0){
return {
name:i.taskType?i.taskType:'其它',
value:i.planAmount?i.planAmount:0
}
}else{
var taskTypes=taskTypeList.filter(k=>k.optionValue==i.taskType)
if(taskTypes && taskTypes.length>0){
var taskType=taskTypes[0]
return {
name:taskType.optionName,
value:i.planAmount?i.planAmount:0
}
}else{
return {
name:i.taskType?i.taskType:'其它',
value:i.planAmount?i.planAmount:0
}
}
}
})
return roseChartData
}else{
return null;
}
},
waterLevelChartData(){
if(this.xmBranchState){
var data={}
var allAmount=this.floatValue(this.xmBranchState.totalBudgetNouserAmount) + this.floatValue(this.xmBranchState.totalBudgetIuserAmount) + this.floatValue(this.xmBranchState.totalBudgetOuserAmount);
data.finishNum= this.floatValue(this.xmBranchState.totalCostNouserAmount) + this.floatValue(this.xmBranchState.totalCostIuserAmount) +this.floatValue(this.xmBranchState.totalCostOuserAmount)
data.finishPercent= parseFloat(data.finishNum/allAmount * 100).toFixed(0)
return data;
}else{
return null;
}
},
scrollBoardData(){
if(this.xmRecords && this.xmRecords.length>0){
var data = this.xmRecords.map(i=>{
return [i.operTime,i.operUsername,i.action,i.remarks]
})
return data;
}else{
return null;
}
},
cardsData(){
if(this.xmProductStates && this.xmProductStates.length>0){
var totalPlanWorkload=this.floatValue(this.xmBranchState.totalPlanWorkload)
return this.xmProductStates.map(i=>{
i.totalPlanWorkload=totalPlanWorkload
return i;
})
}else{
return null;
}
}
},
data () {
return {
xmBranchState:null,
xmProjectStates:[],
xmBranchTaskTypeStates:[],
xmRecords:[],
xmProductStates:[],
options:{
taskType:[],
},
xmRecordPageInfo:{//分页数据
total:0,//服务器端收到0时,会自动计算总记录数,如果上传>0的不自动计算。
pageSize:20,//每页数据
count:false,//是否需要重新计算总记录数
pageNum:1,//当前页码、从1开始计算
orderFields:["oper_time"],//排序列 如 ['sex','student_id'],必须为数据库字段
orderDirs:["desc"]//升序 asc,降序desc 如 性别 升序、学生编号降序 ['asc','desc']
},
xmProjectStatePageInfo:{//分页数据
total:0,//服务器端收到0时,会自动计算总记录数,如果上传>0的不自动计算。
pageSize:20,//每页数据
count:false,//是否需要重新计算总记录数
pageNum:1,//当前页码、从1开始计算
orderFields:["calc_time"],//排序列 如 ['sex','student_id'],必须为数据库字段
orderDirs:["desc"]//升序 asc,降序desc 如 性别 升序、学生编号降序 ['asc','desc']
},
xmProductStatePageInfo:{//分页数据
total:0,//服务器端收到0时,会自动计算总记录数,如果上传>0的不自动计算。
pageSize:20,//每页数据
count:false,//是否需要重新计算总记录数
pageNum:1,//当前页码、从1开始计算
orderFields:["calc_time"],//排序列 如 ['sex','student_id'],必须为数据库字段
orderDirs:["desc"]//升序 asc,降序desc 如 性别 升序、学生编号降序 ['asc','desc']
},
}
},
methods: {
getXmBranchState(){
var params = {
branchId:this.userInfo.branchId
}
listXmBranchState(params).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
if(res.data.data.length>0){
this.xmBranchState=res.data.data[0]
}
}
});
},
getXmProjectStates(){
let params = {
pageSize: this.xmProjectStatePageInfo.pageSize,
pageNum: this.xmProjectStatePageInfo.pageNum,
total: this.xmProjectStatePageInfo.total,
count:this.xmProjectStatePageInfo.count
};
if(this.xmProjectStatePageInfo.orderFields!=null && this.xmProjectStatePageInfo.orderFields.length>0){
let orderBys=[];
for(var i=0;i<this.xmProjectStatePageInfo.orderFields.length;i++){
orderBys.push(this.xmProjectStatePageInfo.orderFields[i]+" "+this.xmProjectStatePageInfo.orderDirs[i])
}
params.orderBy= orderBys.join(",")
}
params.branchId=this.userInfo.branchId
listXmProjectState(params).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
if(res.data.data.length>0){
this.xmProjectStates=res.data.data
}
}
});
},
getXmBranchTaskTypeStates(){
var params = {
branchId:this.userInfo.branchId
}
listXmBranchTaskTypeState(params).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
if(res.data.data.length>0){
this.xmBranchTaskTypeStates=res.data.data
}
}
});
},//获取列表 XmRecord xm_record
getXmRecords() {
let params = {
pageSize: this.xmRecordPageInfo.pageSize,
pageNum: this.xmRecordPageInfo.pageNum,
total: this.xmRecordPageInfo.total,
count:this.xmRecordPageInfo.count
};
if(this.xmRecordPageInfo.orderFields!=null && this.xmRecordPageInfo.orderFields.length>0){
let orderBys=[];
for(var i=0;i<this.xmRecordPageInfo.orderFields.length;i++){
orderBys.push(this.xmRecordPageInfo.orderFields[i]+" "+this.xmRecordPageInfo.orderDirs[i])
}
params.orderBy= orderBys.join(",")
}
listXmRecord(params).then((res) => {
var tips=res.data.tips;
if(tips.isOk){
this.xmRecordPageInfo.total = res.data.total;
this.xmRecordPageInfo.count=false;
this.xmRecords = res.data.data;
}else{
}
}) ;
},
//获取列表 XmProductState 功能状态表,无需前端维护,所有数据由汇总统计得出
getXmProductStates() {
let params = {
pageSize: this.xmProductStatePageInfo.pageSize,
pageNum: this.xmProductStatePageInfo.pageNum,
total: this.xmProductStatePageInfo.total,
count:this.xmProductStatePageInfo.count
};
if(this.xmProductStatePageInfo.orderFields!=null && this.xmProductStatePageInfo.orderFields.length>0){
let orderBys=[];
for(var i=0;i<this.xmProductStatePageInfo.orderFields.length;i++){
orderBys.push(this.xmProductStatePageInfo.orderFields[i]+" "+this.xmProductStatePageInfo.orderDirs[i])
}
params.orderBy= orderBys.join(",")
}
params.branchId=this.userInfo.branchId
listXmProductState(params).then((res) => {
var tips=res.data.tips;
if(tips.isOk){
this.xmProductStatePageInfo.total = res.data.total;
this.xmProductStatePageInfo.count=false;
this.xmProductStates = res.data.data;
}else{
}
}) ;
},
floatValue(value){
if(!value){
return 0.0;
}else{
return value
}
}
},
mounted(){
this.getXmBranchState();
this.getXmProjectStates();
this.getXmBranchTaskTypeStates();
this.getXmRecords();
this.getXmProductStates();
listOption([{categoryId:'all',itemCode:'taskType'}] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
}
});
}
}
</script>
<style lang="less">
#data-view {
width: 100%;
height: 100%;
background-color: #030409;
color: #fff;
#dv-full-screen-container {
background-image: url('../../../../assets/image/datav_bg.png');
background-size: 100% 100%;
box-shadow: 0 0 3px blue;
display: flex;
flex-direction: column;
}
.main-content {
flex: 1;
display: flex;
flex-direction: column;
}
.block-left-right-content {
flex: 1;
display: flex;
margin-top: 20px;
}
.block-top-bottom-content {
flex: 1;
display: flex;
flex-direction: column;
box-sizing: border-box;
padding-left: 20px;
}
.block-top-content {
height: 55%;
display: flex;
flex-grow: 0;
box-sizing: border-box;
padding-bottom: 20px;
}
}
</style>