1001 lines
39 KiB
Vue
1001 lines
39 KiB
Vue
|
|
<template>
|
|||
|
|
<!-- 进度管理 -->
|
|||
|
|
<div class="fullHeight">
|
|||
|
|
<div class="optionBox_wrap">
|
|||
|
|
<div class="optionBox">
|
|||
|
|
<vue-scroll v-if="ProgressPlanBidSectionList.length != 0" :ops="ops" ref="navScroll">
|
|||
|
|
<div @click="changeOptionBoxListIndex(index,item.id)" v-for="(item,index) in ProgressPlanBidSectionList" :key="index" class="optionBox_item" :class="{selectOptionBox_item:selectProgressPlanBidSection === index}">
|
|||
|
|
<span>{{item.projectfName}}</span>
|
|||
|
|
<div class="a"></div>
|
|||
|
|
<div class="b"></div>
|
|||
|
|
<div class="c"></div>
|
|||
|
|
<div class="d"></div>
|
|||
|
|
</div>
|
|||
|
|
</vue-scroll>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<!-- <vue-scroll>
|
|||
|
|
<img src="@/assets/images/dataBoard/6.png" style="height:auto;width:100%"/>
|
|||
|
|
</vue-scroll> -->
|
|||
|
|
<div class="aside fullHeight">
|
|||
|
|
<div class="blockBox">
|
|||
|
|
<div class="blockTitle">
|
|||
|
|
<!-- 进度总览 -->
|
|||
|
|
{{$t('message.dataBoard.progressOfTheOverview')}}
|
|||
|
|
</div>
|
|||
|
|
<div class="blockContent">
|
|||
|
|
<div class="blockContentTitleBox">
|
|||
|
|
<span class="TitleBoxSpan TitleBoxSpan1">
|
|||
|
|
<!-- 全景节点: -->
|
|||
|
|
{{$t('message.dataBoard.panoramaNode')+':'}}<span style="font-size: 18px;font-weight: 900">{{progressOverview.panoramaNodeNum ? progressOverview.panoramaNodeNum:'0'}}</span></span>
|
|||
|
|
<span class="TitleBoxSpan TitleBoxSpan2">
|
|||
|
|
<!-- 楼栋节点数: -->
|
|||
|
|
{{$t('message.dataBoard.buildingNodeNum')+':'}} <span style="font-size: 18px;font-weight: 900">{{progressOverview.buildingNodeNum ? progressOverview.buildingNodeNum:'0'}}</span></span>
|
|||
|
|
</div>
|
|||
|
|
<div class="ChartsBox">
|
|||
|
|
<div class="Charts" ref="Chart1"></div>
|
|||
|
|
<!-- 进行中节点数 -->
|
|||
|
|
{{$t('message.dataBoard.doingNodeNum')}}
|
|||
|
|
</div>
|
|||
|
|
<div class="ChartsBox">
|
|||
|
|
<div class="Charts" ref="Chart2"></div>
|
|||
|
|
<!-- 已完成节点数 -->
|
|||
|
|
{{$t('message.dataBoard.completeNodeNum')}}
|
|||
|
|
</div>
|
|||
|
|
<div class="ChartsBox">
|
|||
|
|
<div class="Charts" ref="Chart3"></div>
|
|||
|
|
<!-- 逾期节点数 -->
|
|||
|
|
{{$t('message.dataBoard.overdueNodeNum')}}
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="blockBox">
|
|||
|
|
<div class="blockTitle">
|
|||
|
|
<!-- 整体进度 -->
|
|||
|
|
{{$t('message.dataBoard.overallProgress')}}
|
|||
|
|
</div>
|
|||
|
|
<div class="blockContent">
|
|||
|
|
<div class="dotBox">
|
|||
|
|
<p class="text"><i style="background: #44D7B6;" class="dot"></i><span>
|
|||
|
|
<!-- 提前完成/正常完成/进行中 -->
|
|||
|
|
{{$t('message.dataBoard.progressStatusList')[0]}}
|
|||
|
|
</span></p>
|
|||
|
|
<p class="text"><i style="background: #FE6C7F;" class="dot"></i><span>
|
|||
|
|
<!-- 逾期完成/逾期 -->
|
|||
|
|
{{$t('message.dataBoard.progressStatusList')[1]}}
|
|||
|
|
</span></p>
|
|||
|
|
</div>
|
|||
|
|
<div v-if="noDataImg1.length != 0" class="companyChart" ref="companyChart"></div>
|
|||
|
|
<div style="text-align: center" class="noDataImgBox">
|
|||
|
|
<img style="width: 150px" v-if="noDataImg1.length == 0" class="noDataImg" src="@/assets/images/noData3.png" alt="" srcset="" />
|
|||
|
|
<p v-if="noDataImg1.length == 0">
|
|||
|
|
<!-- 暂无数据 -->
|
|||
|
|
{{$t('message.dataBoard.nodata')}}
|
|||
|
|
</p>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="right">
|
|||
|
|
<div class="blockBox blockBox3" style="height: calc(100% - 8px)">
|
|||
|
|
<div class="blockTitle">
|
|||
|
|
<!-- 全景计划 -->
|
|||
|
|
{{$t('message.dataBoard.panoramaPlan')}}
|
|||
|
|
</div>
|
|||
|
|
<div class="container">
|
|||
|
|
<plan-item :starDate="2021" :endDate="2022" :title="title" :item='item' v-for="item in 30" :key="item"></plan-item>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="footer">
|
|||
|
|
<div class="blockBox blockBox2" style="height: calc(100% - 8px)">
|
|||
|
|
<div class="blockTitle">
|
|||
|
|
<!-- 楼栋进度图 -->
|
|||
|
|
{{$t('message.dataBoard.buildingProgressPicture')}}
|
|||
|
|
</div>
|
|||
|
|
<div class="footerContainer">
|
|||
|
|
<progress-item v-for="item in 14"></progress-item>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<!-- 配置项目竣工日期 -->
|
|||
|
|
<el-dialog :modal-append-to-body="false" :title="$t('message.dataBoard.configProjectCompleteDate')" :visible.sync="dialogVisible" width="667px">
|
|||
|
|
<div style="text-align:center;margin-bottom:30px">
|
|||
|
|
<!-- 选择日期 -->
|
|||
|
|
<el-date-picker size="medium"
|
|||
|
|
v-model="endDate"
|
|||
|
|
type="date"
|
|||
|
|
:placeholder="$t('message.dataBoard.chooseDate')" value-format="yyyy-MM-dd">
|
|||
|
|
</el-date-picker>
|
|||
|
|
<!-- <br> -->
|
|||
|
|
<el-button type="primary" size="medium" @click="saveDataFn" style="margin-left: 20px">
|
|||
|
|
<!-- 保存 -->
|
|||
|
|
{{$t('message.dataBoard.save')}}
|
|||
|
|
</el-button>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</el-dialog>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
<script>
|
|||
|
|
import echarts from 'echarts4';;
|
|||
|
|
import { getProjectDetail,getProjectExtendInfoApi,editProjectExtendApi } from "@/assets/js/api/baseInfo.js";
|
|||
|
|
import {selectProgressItemStatisticsApi,
|
|||
|
|
selectProgressItemOverdueListApi,
|
|||
|
|
selectPersonOverdueProgressItemNumListApi,
|
|||
|
|
getPlanNodeStatisticsApi,
|
|||
|
|
selectBuildingNodeStatisticsListApi,
|
|||
|
|
progressBuildingPlanListApi,
|
|||
|
|
selectBuildingNodeDetailStatisticsListApi,
|
|||
|
|
selectPanoramaNodePlanListApi,
|
|||
|
|
selectProgressPlanBidSectionListApi} from "@/assets/js/api/dataBoard.js"
|
|||
|
|
import {GetDateStr} from "@/assets/js/util"
|
|||
|
|
import planItem from './components/planItem.vue'
|
|||
|
|
import progressItem from './components/progressItem.vue'
|
|||
|
|
export default {
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
selectItem:'',
|
|||
|
|
ops: {
|
|||
|
|
vuescroll: {
|
|||
|
|
// wheelScrollDuration: 0,
|
|||
|
|
wheelDirectionReverse: true,
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
stageList: this.$t("message.companyDiagram.CONSTRUCTIONSTAGE"),
|
|||
|
|
stageList2:'',//全景计划
|
|||
|
|
projectData: {
|
|||
|
|
constructionStage: 10,
|
|||
|
|
videoUrl: "",
|
|||
|
|
},
|
|||
|
|
alarmList:[],
|
|||
|
|
alarmType:1,
|
|||
|
|
endDate:'',
|
|||
|
|
dialogVisible:false,
|
|||
|
|
leftDays:0,
|
|||
|
|
baseURL:'',
|
|||
|
|
progressOverview:'',//进度总览所需数据
|
|||
|
|
resultList:'',//所有楼栋
|
|||
|
|
alarmType2:'',
|
|||
|
|
alarmType3:'',
|
|||
|
|
BuildingPlanList:'',//楼栋计划
|
|||
|
|
selectProgressPlanBidSection:0,//所选标段
|
|||
|
|
ProgressPlanBidSectionList:[],//标段列表
|
|||
|
|
bidSectionId:'',//标段id
|
|||
|
|
noDataImg1:'',//
|
|||
|
|
noDataImg2:'',//
|
|||
|
|
noDataImg3:'',//
|
|||
|
|
|
|||
|
|
title:'首次开盘后评估会'
|
|||
|
|
};
|
|||
|
|
},
|
|||
|
|
components:{
|
|||
|
|
planItem,
|
|||
|
|
progressItem
|
|||
|
|
},
|
|||
|
|
mounted() {
|
|||
|
|
this.baseURL = this.$http.defaults.baseURL;
|
|||
|
|
// this.getDataDateils();
|
|||
|
|
// this.getData()
|
|||
|
|
// this.getData3()
|
|||
|
|
this.selectProgressPlanBidSectionList()
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
changeOptionBoxListIndex(index,id){
|
|||
|
|
this.selectProgressPlanBidSection = index
|
|||
|
|
this.bidSectionId = id
|
|||
|
|
this.getPlanNodeStatistics()
|
|||
|
|
this.selectBuildingNodeStatisticsList()
|
|||
|
|
this.progressBuildingPlanList()
|
|||
|
|
this.selectPanoramaNodePlanList()
|
|||
|
|
},
|
|||
|
|
//标段列表
|
|||
|
|
selectProgressPlanBidSectionList(){
|
|||
|
|
selectProgressPlanBidSectionListApi({projectSn: this.$store.state.projectSn}).then( res => {
|
|||
|
|
console.log(res)
|
|||
|
|
this.ProgressPlanBidSectionList = res.result
|
|||
|
|
this.bidSectionId = this.ProgressPlanBidSectionList[0].id
|
|||
|
|
this.selectPanoramaNodePlanList()
|
|||
|
|
this.getPlanNodeStatistics()
|
|||
|
|
this.selectBuildingNodeStatisticsList()
|
|||
|
|
this.progressBuildingPlanList()
|
|||
|
|
console.log(res.result, '标段信息');//projectfName
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
//全景计划
|
|||
|
|
selectPanoramaNodePlanList(){
|
|||
|
|
selectPanoramaNodePlanListApi({projectSn: this.$store.state.projectSn,bidSectionId:this.bidSectionId}).then( res => {
|
|||
|
|
this.stageList2 = res.result
|
|||
|
|
const index = this.stageList2.findIndex((item,index) => {
|
|||
|
|
return item.status == 2
|
|||
|
|
})
|
|||
|
|
console.log(index, res.result);
|
|||
|
|
this.$nextTick(()=>{
|
|||
|
|
if (parseInt(index) > 4) {
|
|||
|
|
this.$refs["stageScroll"].scrollTo(
|
|||
|
|
{
|
|||
|
|
x: (index) * 230,
|
|||
|
|
// x:'50%'
|
|||
|
|
},
|
|||
|
|
500
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
console.log(res.result);
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
//班组图表
|
|||
|
|
createdGroupChart(xData, yData1, yData2, el, legendData) {
|
|||
|
|
console.log(yData2);
|
|||
|
|
let monitor = echarts.init(el);
|
|||
|
|
// var data = [220, 182, 191, 234, 290, 330, 310, 123, 442, 321, 90, 149, 210, 122, 133, 334, 198, 123, 125, 220];
|
|||
|
|
// var yMax = 500;
|
|||
|
|
// var dataShadow = [];
|
|||
|
|
|
|||
|
|
// for (var i = 0; i < data.length; i++) {
|
|||
|
|
// dataShadow.push(yMax);
|
|||
|
|
// }
|
|||
|
|
var option = {
|
|||
|
|
// legend: {
|
|||
|
|
// show: true,
|
|||
|
|
// align: "left",
|
|||
|
|
// top: 5,
|
|||
|
|
// left: 0,
|
|||
|
|
// // itemWidth: 13,
|
|||
|
|
// // itemHeight: 5,
|
|||
|
|
// textStyle: {
|
|||
|
|
// color: "#9fa2ad",
|
|||
|
|
// },
|
|||
|
|
// },
|
|||
|
|
grid: {
|
|||
|
|
left: "10",
|
|||
|
|
right: "50",
|
|||
|
|
bottom: "10",
|
|||
|
|
top: "30",
|
|||
|
|
containLabel: true,
|
|||
|
|
},
|
|||
|
|
xAxis: {
|
|||
|
|
type: "value",
|
|||
|
|
axisLabel: {
|
|||
|
|
textStyle: {
|
|||
|
|
color: "#fff",
|
|||
|
|
},
|
|||
|
|
formatter: function () {
|
|||
|
|
return "";
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
splitLine: {
|
|||
|
|
show: false,
|
|||
|
|
},
|
|||
|
|
axisLine: {
|
|||
|
|
show: false,
|
|||
|
|
},
|
|||
|
|
axisTick: {
|
|||
|
|
show: false,
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
yAxis: {
|
|||
|
|
type: "category",
|
|||
|
|
axisLine: {
|
|||
|
|
show: false,
|
|||
|
|
},
|
|||
|
|
axisTick: {
|
|||
|
|
show: false,
|
|||
|
|
},
|
|||
|
|
data: xData,
|
|||
|
|
axisLabel: {
|
|||
|
|
formatter: function (params) {
|
|||
|
|
var maxLength = 5;
|
|||
|
|
//判断长度,超出使用...代替
|
|||
|
|
if (params && params.length > maxLength) {
|
|||
|
|
return params.substring(0, maxLength - 1) + '...';
|
|||
|
|
} else {
|
|||
|
|
return params;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
textStyle: {
|
|||
|
|
// fontSize: 14,
|
|||
|
|
color: "white",
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
tooltip: {
|
|||
|
|
trigger: "axis",
|
|||
|
|
formatter(params){
|
|||
|
|
return params[0].name
|
|||
|
|
// console.log(params);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
series: [
|
|||
|
|
{
|
|||
|
|
name: "",
|
|||
|
|
type: "bar",
|
|||
|
|
barWidth: 10,
|
|||
|
|
data: yData1,
|
|||
|
|
barGap: "-100%",
|
|||
|
|
itemStyle: {
|
|||
|
|
// color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
|||
|
|
// { offset: 1, color: "#5181F6",},
|
|||
|
|
// ]),
|
|||
|
|
color:function (params) {
|
|||
|
|
//通过判断选中的名字改变柱子的颜色样式
|
|||
|
|
// console.log(params);//dataIndex
|
|||
|
|
// console.log(yData2[params.dataIndex]);
|
|||
|
|
if (yData2[params.dataIndex] == 1) {
|
|||
|
|
return '#5181F6';
|
|||
|
|
} else if(yData2[params.dataIndex] == 2){
|
|||
|
|
return '#848484';
|
|||
|
|
} else if (yData2[params.dataIndex] == 3) {
|
|||
|
|
return '#44D7B6';
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
barBorderRadius: 5,
|
|||
|
|
},
|
|||
|
|
// label: {
|
|||
|
|
// show: true,
|
|||
|
|
// position: "right",
|
|||
|
|
// color: "white",
|
|||
|
|
// textStyle: {
|
|||
|
|
// fontSize: 15,
|
|||
|
|
// },
|
|||
|
|
// },
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
};
|
|||
|
|
monitor.setOption(option);
|
|||
|
|
},
|
|||
|
|
changeResultList(){
|
|||
|
|
this.selectBuildingNodeDetailStatisticsList()
|
|||
|
|
},
|
|||
|
|
changeResultList2(){
|
|||
|
|
if(document.querySelector('iframe')){
|
|||
|
|
document.querySelector('iframe').contentWindow.location.reload();
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
//楼栋计划
|
|||
|
|
selectBuildingNodeDetailStatisticsList(){
|
|||
|
|
selectBuildingNodeDetailStatisticsListApi({buildingId:this.alarmType2}).then(res => {
|
|||
|
|
console.log(res.result);
|
|||
|
|
this.BuildingPlanList = res.result
|
|||
|
|
// this.createdGroupChart(xData, yData1, yData2, this.$refs.groupChart);
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
progressBuildingPlanList(){
|
|||
|
|
progressBuildingPlanListApi({projectSn: this.$store.state.projectSn,bidSectionId:this.bidSectionId}).then(res => {
|
|||
|
|
this.resultList = res.result
|
|||
|
|
if (res.result.length){
|
|||
|
|
this.alarmType2 = res.result[0].id
|
|||
|
|
this.alarmType3 = res.result[0].id
|
|||
|
|
} else {
|
|||
|
|
this.alarmType2 = ''
|
|||
|
|
this.alarmType3 = ''
|
|||
|
|
}
|
|||
|
|
this.selectBuildingNodeDetailStatisticsList()
|
|||
|
|
// console.log(this.BuildingPlanList);
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
createPieChart(data, div, color, title,total) {
|
|||
|
|
let that = this;
|
|||
|
|
let monitor = echarts.init(div);
|
|||
|
|
var option = {
|
|||
|
|
color: color ? color : ["#5181F6", "#61D2B9", "#F67F51", "#7851F6"],
|
|||
|
|
title: {
|
|||
|
|
show: true,
|
|||
|
|
text: total,
|
|||
|
|
x: "45%",
|
|||
|
|
y: "42%",
|
|||
|
|
z: 5,
|
|||
|
|
textAlign: "center",
|
|||
|
|
textStyle: {
|
|||
|
|
color: "rgba(255, 255, 255, 1)",
|
|||
|
|
fontSize: 20,
|
|||
|
|
},
|
|||
|
|
// subtext: title,
|
|||
|
|
// subtextStyle: {
|
|||
|
|
// color: "rgba(255, 255, 255, 0.8)",
|
|||
|
|
// fontSize: 13,
|
|||
|
|
// },
|
|||
|
|
},
|
|||
|
|
grid: {
|
|||
|
|
right: 0,
|
|||
|
|
},
|
|||
|
|
legend: {
|
|||
|
|
show: false,
|
|||
|
|
},
|
|||
|
|
series: [
|
|||
|
|
{
|
|||
|
|
name: "",
|
|||
|
|
type: "pie",
|
|||
|
|
radius: ["50%", "70%"],
|
|||
|
|
avoidLabelOverlap: false,
|
|||
|
|
hoverAnimation: false,
|
|||
|
|
label: {
|
|||
|
|
show: false,
|
|||
|
|
position: "center",
|
|||
|
|
},
|
|||
|
|
labelLine: {
|
|||
|
|
show: false,
|
|||
|
|
},
|
|||
|
|
data: data,
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
};
|
|||
|
|
monitor.setOption(option);
|
|||
|
|
},
|
|||
|
|
//进度总览
|
|||
|
|
getPlanNodeStatistics(){
|
|||
|
|
getPlanNodeStatisticsApi({
|
|||
|
|
projectSn: this.$store.state.projectSn,
|
|||
|
|
bidSectionId:this.bidSectionId
|
|||
|
|
}).then(res => {
|
|||
|
|
// console.log(res)
|
|||
|
|
this.createPieChart(
|
|||
|
|
[
|
|||
|
|
{ value: res.result.executeNodeNum + res.result.completeNodeNum + res.result.deferNodeNum + res.result.notStartNodeNum?res.result.executeNodeNum + res.result.completeNodeNum + res.result.deferNodeNum + res.result.notStartNodeNum:1, name: "" },
|
|||
|
|
{
|
|||
|
|
value: res.result.executeNodeNum,
|
|||
|
|
name: "",
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
this.$refs.Chart1,
|
|||
|
|
["rgba(68, 215, 182, 0.2)","#557ded"],
|
|||
|
|
"",res.result.executeNodeNum
|
|||
|
|
);
|
|||
|
|
this.createPieChart(
|
|||
|
|
[
|
|||
|
|
{ value: res.result.executeNodeNum + res.result.completeNodeNum + res.result.deferNodeNum + res.result.notStartNodeNum?res.result.executeNodeNum + res.result.completeNodeNum + res.result.deferNodeNum + res.result.notStartNodeNum:1, name: "" },
|
|||
|
|
{
|
|||
|
|
value: res.result.completeNodeNum,
|
|||
|
|
name: "",
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
this.$refs.Chart2,
|
|||
|
|
["rgba(68, 215, 182, 0.2)","#44D7B6"],
|
|||
|
|
"",res.result.completeNodeNum
|
|||
|
|
);
|
|||
|
|
this.createPieChart(
|
|||
|
|
[
|
|||
|
|
{ value: res.result.executeNodeNum + res.result.completeNodeNum + res.result.deferNodeNum + res.result.notStartNodeNum?res.result.executeNodeNum + res.result.completeNodeNum + res.result.deferNodeNum + res.result.notStartNodeNum:1, name: "" },
|
|||
|
|
{
|
|||
|
|
value: res.result.deferNodeNum,
|
|||
|
|
name: "",
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
this.$refs.Chart3,
|
|||
|
|
["rgba(68, 215, 182, 0.2)","#FF0000"],
|
|||
|
|
"",res.result.deferNodeNum
|
|||
|
|
);
|
|||
|
|
this.progressOverview = res.result;
|
|||
|
|
console.log(res.result);
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
//整体进度
|
|||
|
|
selectBuildingNodeStatisticsList(){
|
|||
|
|
selectBuildingNodeStatisticsListApi({
|
|||
|
|
projectSn: this.$store.state.projectSn,
|
|||
|
|
bidSectionId:this.bidSectionId
|
|||
|
|
}).then(res => {
|
|||
|
|
let arr1 = [],arr2 = [],arr3 = [],arr4 = [],arr5 = [],arr6 = [],nameArr = [];
|
|||
|
|
this.noDataImg1 = res.result
|
|||
|
|
console.log(res.result,this.noDataImg1.length != 0);
|
|||
|
|
res.result.forEach(item => {
|
|||
|
|
nameArr.push(item.buildingName)
|
|||
|
|
arr1.push(item.normalCompleteNodeNum )
|
|||
|
|
arr2.push(item.beforeCompleteNodeNum )
|
|||
|
|
arr3.push(item.deferCompleteNodeNum )
|
|||
|
|
arr4.push(item.executeNodeNum)
|
|||
|
|
arr5.push(item.deferNodeNum)
|
|||
|
|
arr6.push(item.completeNodeNum)
|
|||
|
|
// console.log(item);
|
|||
|
|
})
|
|||
|
|
this.$nextTick(()=>{
|
|||
|
|
this.createdBarCharts(nameArr,arr1,arr2,arr3,arr4,arr5,arr6,this.$refs.companyChart)
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
saveDataFn(){
|
|||
|
|
if(this.endDate==''){
|
|||
|
|
// '请选择日期!'
|
|||
|
|
this.$message.error(this.$t('message.dataBoard.pleaseChooseDate')+'!')
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
editProjectExtendApi({projectSn: this.$store.state.projectSn,engineeringEndTime:this.endDate}).then(res=>{
|
|||
|
|
// '保存成功!'
|
|||
|
|
this.$message.success(this.$t('message.dataBoard.saveSuccess')+'!')
|
|||
|
|
this.dialogVisible=false
|
|||
|
|
this.getDaysBetween()
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
/**
|
|||
|
|
* 计算两个日期之间的天数
|
|||
|
|
* @param dateString1 开始日期 yyyy-MM-dd
|
|||
|
|
* @param dateString2 结束日期 yyyy-MM-dd
|
|||
|
|
* @returns {number} 如果日期相同 返回一天 开始日期大于结束日期,返回0
|
|||
|
|
*/
|
|||
|
|
getDaysBetween(){
|
|||
|
|
var startDate = Date.parse(GetDateStr(0,'-'));
|
|||
|
|
var endDate = Date.parse(this.endDate);
|
|||
|
|
if (startDate>endDate){
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
if (startDate==endDate){
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
var days=(endDate - startDate)/(1*24*60*60*1000);
|
|||
|
|
// return days;
|
|||
|
|
this.leftDays=days
|
|||
|
|
},
|
|||
|
|
changeAlarmType(){
|
|||
|
|
if(this.alarmType==1){
|
|||
|
|
this.getData3()
|
|||
|
|
}else{
|
|||
|
|
this.getData2()
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
// getData(){
|
|||
|
|
// selectProgressItemStatisticsApi({projectSn: this.$store.state.projectSn}).then(res=>{
|
|||
|
|
// var data = res.result
|
|||
|
|
// // this.createdBarCharts(['未开始','进行中','已完成'], this.$refs.companyChart)
|
|||
|
|
// })
|
|||
|
|
// },
|
|||
|
|
// getData2(){
|
|||
|
|
// selectProgressItemOverdueListApi({projectSn: this.$store.state.projectSn}).then(res=>{
|
|||
|
|
// this.alarmList=res.result
|
|||
|
|
// })
|
|||
|
|
// },
|
|||
|
|
getData3(){
|
|||
|
|
selectPersonOverdueProgressItemNumListApi({projectSn: this.$store.state.projectSn}).then(res=>{
|
|||
|
|
this.alarmList=res.result
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
//年龄结构---图表
|
|||
|
|
createdBarCharts(xData, yData1,yData2,yData3,yData4,yData5,yData6, el) {
|
|||
|
|
let that = this;
|
|||
|
|
let ageChart = echarts.init(el);
|
|||
|
|
// ageChart.clear();
|
|||
|
|
let option = {
|
|||
|
|
grid: {
|
|||
|
|
top: 20,
|
|||
|
|
left: 0,
|
|||
|
|
bottom: 10,
|
|||
|
|
right: 20,
|
|||
|
|
containLabel: true,
|
|||
|
|
},
|
|||
|
|
color: ["#5CE2F6", "#5181F6"],
|
|||
|
|
dataZoom: [
|
|||
|
|
{
|
|||
|
|
show: true,
|
|||
|
|
// realtime: true,
|
|||
|
|
start: 50,
|
|||
|
|
end: 100,
|
|||
|
|
height: 8,
|
|||
|
|
borderColor: "transparent",
|
|||
|
|
backgroundColor: "#000",
|
|||
|
|
filterColor: "#999999",
|
|||
|
|
bottom: 0,
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
tooltip: {
|
|||
|
|
trigger: "axis",
|
|||
|
|
axisPointer: {
|
|||
|
|
type: "shadow",
|
|||
|
|
},
|
|||
|
|
formatter(params){
|
|||
|
|
return params[0].name + '<br />' + '<span style="font-size: 14px">' + this.$t('message.dataBoard.totalCompleteNum')+':' + yData6[params[0].dataIndex] + '</span>'
|
|||
|
|
+ '<br />' + '<span style="background: #44D7B6;height: 5px;width: 5px;display: inline-block;border-radius: 50%;margin-right: 5px"></span>' + '<span style="font-size: 12px">' + this.$t('message.dataBoard.completeStatus')[0]+':' + params[0].value + '</span>'
|
|||
|
|
+ '<br />' + '<span style="background: #F7D300;height: 5px;width: 5px;display: inline-block;border-radius: 50%;margin-right: 5px"></span>' + '<span style="font-size: 12px">' + this.$t('message.dataBoard.completeStatus')[1]+':' + params[1].value + '</span>'
|
|||
|
|
+ '<br />' + '<span style="background: #FE6C7F;height: 5px;width: 5px;display: inline-block;border-radius: 50%;margin-right: 5px"></span>' + '<span style="font-size: 12px">' + this.$t('message.dataBoard.completeStatus')[2]+':' + params[2].value + '</span>'
|
|||
|
|
+ '<br />' + '<span style="background: #3D6DC3;height: 5px;width: 5px;display: inline-block;border-radius: 50%;margin-right: 5px"></span>' + '<span style="font-size: 12px">' + this.$t('message.dataBoard.completeStatus')[3]+':' + params[3].value + '</span>'
|
|||
|
|
+ '<br />' + '<span style="background: #FF0000;height: 5px;width: 5px;display: inline-block;border-radius: 50%;margin-right: 5px"></span>' + '<span style="font-size: 12px">' + this.$t('message.dataBoard.completeStatus')[4]+':' + params[4].value + '</span>'
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
legend: {
|
|||
|
|
show: false,
|
|||
|
|
align: "left",
|
|||
|
|
top: 5,
|
|||
|
|
left: 0,
|
|||
|
|
itemWidth: 13,
|
|||
|
|
itemHeight: 5,
|
|||
|
|
textStyle: {
|
|||
|
|
color: "#9fa2ad",
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
xAxis: [
|
|||
|
|
{
|
|||
|
|
type: "category",
|
|||
|
|
data: xData,
|
|||
|
|
boundaryGap: true,
|
|||
|
|
axisTick: {
|
|||
|
|
show: false,
|
|||
|
|
},
|
|||
|
|
axisLine: {
|
|||
|
|
show: false,
|
|||
|
|
},
|
|||
|
|
axisLabel: {
|
|||
|
|
color: "#9fa2ad",
|
|||
|
|
fontSize: 12,
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
|
|||
|
|
yAxis: {
|
|||
|
|
type: "value",
|
|||
|
|
axisTick: {
|
|||
|
|
show: false,
|
|||
|
|
},
|
|||
|
|
axisLine: {
|
|||
|
|
show: false,
|
|||
|
|
},
|
|||
|
|
splitLine: {
|
|||
|
|
lineStyle: {
|
|||
|
|
type: "dashed",
|
|||
|
|
color: "rgba(231, 233, 243, 0.2)",
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
axisLabel: {
|
|||
|
|
color: "#9fa2ad",
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
series: [
|
|||
|
|
{
|
|||
|
|
name: /* '正常完成', */this.$t('message.dataBoard.completeStatus')[0],
|
|||
|
|
data: yData1,
|
|||
|
|
type: 'bar',
|
|||
|
|
stack:this.$t('message.dataBoard.stack'),/* '堆叠', *///堆叠柱状图在此设置成统一名称即可
|
|||
|
|
color: '#44D7B6'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: /* '提前完成', */this.$t('message.dataBoard.completeStatus')[1],
|
|||
|
|
data: yData2,
|
|||
|
|
type: 'bar',
|
|||
|
|
stack:this.$t('message.dataBoard.stack'),/* '堆叠', *///堆叠柱状图在此设置成统一名称即可
|
|||
|
|
color: '#F7D300'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: /* '逾期完成', */this.$t('message.dataBoard.completeStatus')[2],
|
|||
|
|
data: yData3,
|
|||
|
|
type: 'bar',
|
|||
|
|
stack:this.$t('message.dataBoard.stack'),/* '堆叠', *///堆叠柱状图在此设置成统一名称即可
|
|||
|
|
color: '#FE6C7F'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: /* '进行中', */this.$t('message.dataBoard.completeStatus')[3],
|
|||
|
|
data: yData4,
|
|||
|
|
type: 'bar',
|
|||
|
|
stack:this.$t('message.dataBoard.stack'),/* '堆叠', *///堆叠柱状图在此设置成统一名称即可
|
|||
|
|
color: '#3D6DC3'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: /* '逾期', */this.$t('message.dataBoard.completeStatus')[4],
|
|||
|
|
data: yData5,
|
|||
|
|
type: 'bar',
|
|||
|
|
stack:this.$t('message.dataBoard.stack'),/* '堆叠', *///堆叠柱状图在此设置成统一名称即可
|
|||
|
|
color: '#FF0000'
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
ageChart.setOption(option);
|
|||
|
|
},
|
|||
|
|
//获取项目详情
|
|||
|
|
getDataDateils() {
|
|||
|
|
let data = {
|
|||
|
|
projectSn: this.$store.state.projectSn,
|
|||
|
|
};
|
|||
|
|
getProjectDetail(data).then((res) => {
|
|||
|
|
console.log(res);
|
|||
|
|
if (res.code == 200) {
|
|||
|
|
this.projectData = res.result;
|
|||
|
|
// console.log('this.projectData.constructionStage-4*230',this.projectData.constructionStage-4*230)
|
|||
|
|
if (parseInt(this.projectData.constructionStage) > 4) {
|
|||
|
|
this.$refs["stageScroll"].scrollTo(
|
|||
|
|
{
|
|||
|
|
x: (this.projectData.constructionStage - 4) * 230,
|
|||
|
|
// x:'50%'
|
|||
|
|
},
|
|||
|
|
500
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
getProjectExtendInfoApi(data).then((res) => {
|
|||
|
|
// console.log(res);
|
|||
|
|
this.endDate = res.result.engineeringEndTime;
|
|||
|
|
if(this.endDate){
|
|||
|
|
this.getDaysBetween()
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
</script>
|
|||
|
|
<style lang="less" scoped>
|
|||
|
|
.container{
|
|||
|
|
height: 88%;
|
|||
|
|
width: 100%;
|
|||
|
|
display: flex;
|
|||
|
|
flex-wrap: wrap;
|
|||
|
|
justify-content: center;
|
|||
|
|
margin:10px 1% ;
|
|||
|
|
overflow: auto;
|
|||
|
|
}
|
|||
|
|
.footerContainer{
|
|||
|
|
display: flex;
|
|||
|
|
flex-wrap: wrap;
|
|||
|
|
padding: 30px 30px;
|
|||
|
|
}
|
|||
|
|
.container::-webkit-scrollbar{
|
|||
|
|
width: 6px;
|
|||
|
|
background-color: rgb(134, 133, 133);
|
|||
|
|
border-radius: 10px;
|
|||
|
|
}
|
|||
|
|
.container::-webkit-scrollbar-thumb{
|
|||
|
|
width: 6px;
|
|||
|
|
border-radius: 10px;
|
|||
|
|
background-color: rgb(137, 137, 223);
|
|||
|
|
}
|
|||
|
|
.scrollBox{
|
|||
|
|
display: flex;
|
|||
|
|
flex-wrap:wrap;
|
|||
|
|
|
|||
|
|
.scrollItem{
|
|||
|
|
position: relative;
|
|||
|
|
margin-left: 4px;
|
|||
|
|
margin-bottom: 5px;
|
|||
|
|
box-sizing: border-box;
|
|||
|
|
width: 120px;
|
|||
|
|
height: 51px;
|
|||
|
|
background: #0C222B;
|
|||
|
|
border-radius: 5px;
|
|||
|
|
text-align: center;
|
|||
|
|
padding-top: 10px;
|
|||
|
|
.scrollItemTitle{
|
|||
|
|
width: 96px;
|
|||
|
|
overflow: hidden;
|
|||
|
|
text-overflow:ellipsis;
|
|||
|
|
white-space: nowrap;
|
|||
|
|
font-size: 14px;
|
|||
|
|
margin: 0 auto 3px auto;
|
|||
|
|
}
|
|||
|
|
img{
|
|||
|
|
width: 17px;
|
|||
|
|
height: 17px;
|
|||
|
|
}
|
|||
|
|
.ItemTips{
|
|||
|
|
position: absolute;
|
|||
|
|
left: 80px;
|
|||
|
|
top: 20px;
|
|||
|
|
z-index: 100;
|
|||
|
|
background: rgba(8,24,53,0.7);
|
|||
|
|
/*height: 64px;*/
|
|||
|
|
/*max-width: 190px;*/
|
|||
|
|
text-align: left;
|
|||
|
|
padding: 10px;
|
|||
|
|
box-sizing: border-box;
|
|||
|
|
p{
|
|||
|
|
display: inline-block;
|
|||
|
|
min-width: 100px;
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
.ItemTips2{
|
|||
|
|
left: -80px;
|
|||
|
|
}
|
|||
|
|
.ItemTips3{
|
|||
|
|
left: -4px;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.scrollItem2{
|
|||
|
|
background-color: #80060A;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.dotBox{
|
|||
|
|
display: flex;
|
|||
|
|
.text{
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
margin-left: 15px;
|
|||
|
|
.dot{
|
|||
|
|
display: inline-block;
|
|||
|
|
width: 5px;
|
|||
|
|
height: 5px;
|
|||
|
|
border-radius: 50%;
|
|||
|
|
margin-right: 5px;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.titleItem{
|
|||
|
|
position: absolute;
|
|||
|
|
left: 20px;
|
|||
|
|
top: 25px;
|
|||
|
|
span{
|
|||
|
|
display: inline-block;
|
|||
|
|
width: 10px;
|
|||
|
|
height: 10px;
|
|||
|
|
border-radius: 50%;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.ChartsBox{
|
|||
|
|
width: 33%;
|
|||
|
|
float: left;
|
|||
|
|
text-align: center;
|
|||
|
|
height: 60%;
|
|||
|
|
.Charts{
|
|||
|
|
height: 100%;
|
|||
|
|
width: 100%;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.blockContentTitleBox{
|
|||
|
|
box-sizing: border-box;
|
|||
|
|
width: 100%;
|
|||
|
|
height: 40px;
|
|||
|
|
line-height: 40px;
|
|||
|
|
.TitleBoxSpan{
|
|||
|
|
display: inline-block;
|
|||
|
|
width: 50%;
|
|||
|
|
text-align: center;
|
|||
|
|
font-size: 14px;
|
|||
|
|
}
|
|||
|
|
.TitleBoxSpan1{
|
|||
|
|
background: linear-gradient(to left, #0f2730 , #040d15);
|
|||
|
|
}
|
|||
|
|
.TitleBoxSpan2{
|
|||
|
|
background: linear-gradient(to right, #0f2730 , #040d15);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.numContent {
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
justify-content: space-around;
|
|||
|
|
p{
|
|||
|
|
font-size: 14px;
|
|||
|
|
opacity: 0.88;
|
|||
|
|
margin-top: 10px;
|
|||
|
|
text-align: center;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.companyChart{
|
|||
|
|
width: 100%;
|
|||
|
|
height: 95%;
|
|||
|
|
}
|
|||
|
|
/deep/.alarmTypeBox{
|
|||
|
|
position: absolute;
|
|||
|
|
top: 20px;
|
|||
|
|
right: 10px;
|
|||
|
|
width: 66px;
|
|||
|
|
opacity: 0.8;
|
|||
|
|
z-index: 3;
|
|||
|
|
.el-input__inner{
|
|||
|
|
background-color: transparent;
|
|||
|
|
color: white;
|
|||
|
|
height: 24px;
|
|||
|
|
line-height: 24px;
|
|||
|
|
padding: 0 5px;
|
|||
|
|
}
|
|||
|
|
.el-input__suffix{
|
|||
|
|
right: 0px;
|
|||
|
|
}
|
|||
|
|
.el-input__icon{
|
|||
|
|
color: white;
|
|||
|
|
line-height: 24px;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.configBtn{
|
|||
|
|
position: absolute;
|
|||
|
|
right: 8px;
|
|||
|
|
top: 15px;
|
|||
|
|
font-size: 20px;
|
|||
|
|
cursor: pointer;
|
|||
|
|
z-index: 3;
|
|||
|
|
}
|
|||
|
|
.days{
|
|||
|
|
position: absolute;
|
|||
|
|
top: 50%;
|
|||
|
|
left: 50%;
|
|||
|
|
transform: translate(-50%,-50%);
|
|||
|
|
.num{
|
|||
|
|
font-size: 46px;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.daysBG{
|
|||
|
|
position: absolute;
|
|||
|
|
top: 50%;
|
|||
|
|
left: 50%;
|
|||
|
|
transform: translate(-50%,-50%);
|
|||
|
|
}
|
|||
|
|
.endDate{
|
|||
|
|
position: absolute;
|
|||
|
|
right: 15px;
|
|||
|
|
bottom: 12px;
|
|||
|
|
// font-size: 13px;
|
|||
|
|
}
|
|||
|
|
.Extgantt{
|
|||
|
|
width: 100%;
|
|||
|
|
height: 100% ;
|
|||
|
|
border: none;
|
|||
|
|
}
|
|||
|
|
.optionBox_wrap{
|
|||
|
|
display: flex;
|
|||
|
|
justify-content: flex-end;
|
|||
|
|
}
|
|||
|
|
.optionBox{
|
|||
|
|
text-align: center;
|
|||
|
|
margin-bottom: 10px;
|
|||
|
|
width: calc(77% - 25px);
|
|||
|
|
white-space: nowrap;
|
|||
|
|
.optionBox_item{
|
|||
|
|
cursor:pointer;
|
|||
|
|
z-index: 100;
|
|||
|
|
padding: 4px 15px;
|
|||
|
|
display: inline-block;
|
|||
|
|
/*width: 52px;*/
|
|||
|
|
height: 12px;
|
|||
|
|
font-size: 12px;
|
|||
|
|
line-height: 12px;
|
|||
|
|
margin-right: 10px;
|
|||
|
|
text-align: center;
|
|||
|
|
background: #193B43;
|
|||
|
|
position: relative;
|
|||
|
|
}
|
|||
|
|
.selectOptionBox_item{
|
|||
|
|
background: #393204;
|
|||
|
|
color: #F7D300;
|
|||
|
|
.a{
|
|||
|
|
border-left: 2px solid #F7D300;
|
|||
|
|
border-top: 2px solid #F7D300;
|
|||
|
|
}
|
|||
|
|
.b{
|
|||
|
|
border-right: 2px solid #F7D300;
|
|||
|
|
border-top: 2px solid #F7D300;
|
|||
|
|
}
|
|||
|
|
.c{
|
|||
|
|
border-bottom: 2px solid #F7D300;
|
|||
|
|
border-left: 2px solid #F7D300;
|
|||
|
|
}
|
|||
|
|
.d{
|
|||
|
|
border-right: 2px solid #F7D300;
|
|||
|
|
border-bottom: 2px solid #F7D300;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.a {
|
|||
|
|
width: 3px;
|
|||
|
|
height: 3px;
|
|||
|
|
position: absolute;
|
|||
|
|
top: 0;
|
|||
|
|
left: 0;
|
|||
|
|
border-left: 2px solid #EBEBEB;
|
|||
|
|
border-top: 2px solid #EBEBEB;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.b {
|
|||
|
|
width: 3px;
|
|||
|
|
height: 3px;
|
|||
|
|
position: absolute;
|
|||
|
|
top: 0;
|
|||
|
|
right: 0;
|
|||
|
|
border-right: 2px solid #EBEBEB;
|
|||
|
|
border-top: 2px solid #EBEBEB;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.c {
|
|||
|
|
width: 3px;
|
|||
|
|
height: 3px;
|
|||
|
|
position: absolute;
|
|||
|
|
bottom: 0;
|
|||
|
|
left: 0;
|
|||
|
|
border-bottom: 2px solid #EBEBEB;
|
|||
|
|
border-left: 2px solid #EBEBEB;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.d {
|
|||
|
|
width: 3px;
|
|||
|
|
height: 3px;
|
|||
|
|
position: absolute;
|
|||
|
|
bottom: 0;
|
|||
|
|
right: 0;
|
|||
|
|
border-right: 2px solid #EBEBEB;
|
|||
|
|
border-bottom: 2px solid #EBEBEB;
|
|||
|
|
}
|
|||
|
|
</style>
|