497 lines
15 KiB
Vue
497 lines
15 KiB
Vue
<template>
|
||
<!-- 进度管理 -->
|
||
<div v-if="COMPANY != 'longguang'" class="fullHeight">
|
||
<!-- <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.countDown')}}
|
||
<!-- 配置项目竣工日期 -->
|
||
<el-tooltip class="configBtn" effect="dark" :content="$t('message.dataBoard.configProjectCompleteDate')" placement="top">
|
||
<i class="el-icon-s-tools" @click="dialogVisible=true"></i>
|
||
</el-tooltip>
|
||
</div>
|
||
<div class="blockContent">
|
||
<p>
|
||
<!-- 项目整体倒计时: -->
|
||
{{$t('message.dataBoard.projectCountDown')+':'}}
|
||
</p>
|
||
<div class="days">
|
||
<span class="num">{{endDate?leftDays:'--'}}</span><span>
|
||
<!-- 天 -->
|
||
{{$t('message.dataBoard.textList')[0]}}
|
||
</span>
|
||
</div>
|
||
<img src="@/assets/images/daysBG.png" class="daysBG">
|
||
<p class="endDate"><!-- 竣工时间: -->{{$t('message.dataBoard.completeTime')+':'}}{{endDate}}</p>
|
||
<!-- <div class="numContent">
|
||
<div class="numBox">
|
||
<div class="bg1 medium">
|
||
<span class="num">10</span>
|
||
</div>
|
||
<p>完成任务数</p>
|
||
</div>
|
||
<div class="numBox">
|
||
<div class="bg1 medium">
|
||
<span class="num">10</span>
|
||
</div>
|
||
<p>完成率</p>
|
||
</div>
|
||
<div class="numBox">
|
||
<div class="bg1 medium">
|
||
<span class="num">10</span>
|
||
</div>
|
||
<p>延期天数</p>
|
||
</div>
|
||
</div> -->
|
||
|
||
</div>
|
||
</div>
|
||
<div class="blockBox">
|
||
<div class="blockTitle">
|
||
<!-- 状态统计 -->
|
||
{{$t('message.dataBoard.statusStatistics')}}
|
||
</div>
|
||
<div class="blockContent">
|
||
<div class="companyChart" ref="companyChart"></div>
|
||
</div>
|
||
</div>
|
||
<div class="blockBox">
|
||
<div class="blockTitle"><!-- 进度预警 -->{{$t('message.dataBoard.progressAlarm')}}
|
||
<el-select v-model="alarmType" size="mini" class="alarmTypeBox" @change="changeAlarmType">
|
||
<!-- 按人员 -->
|
||
<el-option :value="1" :label="$t('message.dataBoard.accordingtoPeople')"></el-option>
|
||
<!-- 按任务 -->
|
||
<el-option :value="2" :label="$t('message.dataBoard.accordingtoTask')"></el-option>
|
||
</el-select>
|
||
</div>
|
||
<div class="blockContent">
|
||
<vue-scroll>
|
||
<table class="greenTable" v-show="alarmType==1">
|
||
<thead>
|
||
<tr>
|
||
<th>
|
||
<!-- 人员姓名 -->
|
||
{{$t('message.dataBoard.peopleName')}}
|
||
</th>
|
||
<th>
|
||
<!-- 超期任务数 -->
|
||
{{$t('message.dataBoard.extendedTaskNum')}}
|
||
</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr v-for="(item, index) in alarmList" :key="index">
|
||
<td>
|
||
{{ item.personChargeName }}
|
||
</td>
|
||
<td>{{ item.num }}</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<table class="greenTable" v-show="alarmType==2">
|
||
<thead>
|
||
<tr>
|
||
<th>
|
||
<!-- 任务 -->
|
||
{{$t('message.dataBoard.task')}}
|
||
</th>
|
||
<th>
|
||
<!-- 负责人 -->
|
||
{{$t('message.dataBoard.principal')}}
|
||
</th>
|
||
<th>
|
||
<!-- 超期天数 -->
|
||
{{$t('message.dataBoard.extendedDays')}}
|
||
</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr v-for="(item, index) in alarmList" :key="index">
|
||
<td>
|
||
{{ item.subitemProjectName }}
|
||
</td>
|
||
<td>{{ item.personChargeName }}</td>
|
||
<td>{{ item.overdueDayNum }}</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<div
|
||
class="placeholderBox placeholderBox2"
|
||
v-if="alarmList.length == 0"
|
||
>
|
||
<img src="@/assets/images/noData3.png" alt="" srcset="" />
|
||
<p>
|
||
<!-- 暂无数据 -->
|
||
{{$t('message.dataBoard.nodata')}}
|
||
</p>
|
||
</div>
|
||
</vue-scroll>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="right fullHeight">
|
||
<div class="blockBox blockBox3" style="height: calc(66.66% - 25px)">
|
||
<div class="blockTitle">
|
||
<!-- 甘特图 -->
|
||
{{$t('message.dataBoard.ganttChart')}}
|
||
</div>
|
||
<div class="blockContent">
|
||
<iframe :src="'doc/ExtGantt/Ext甘特图.html?url='+baseURL+'&projectSn='+$store.state.projectSn+'&token='+$store.state.userInfo.token" id="iframe" class="Extgantt" > </iframe>
|
||
</div>
|
||
</div>
|
||
<div class="blockBox blockBox2">
|
||
<div class="blockTitle">
|
||
<!-- 多维计划 -->
|
||
{{$t('message.dataBoard.manyDimensionsPlan')}}
|
||
</div>
|
||
<div class="blockContent" style=" display: flex;align-items: center;">
|
||
<div class="stageBox">
|
||
<vue-scroll :ops="ops" ref="stageScroll">
|
||
<div
|
||
class="stageItem"
|
||
v-for="(item, index) in stageList"
|
||
:key="index"
|
||
:class="
|
||
projectData.constructionStage - 1 > index
|
||
? 'finish'
|
||
: projectData.constructionStage - 1 == index
|
||
? 'ongoing'
|
||
: ''
|
||
"
|
||
>
|
||
<div class="statusImg"></div>
|
||
<p>{{ item.name }}</p>
|
||
<div class="line" v-show="stageList.length != index + 1"></div>
|
||
</div>
|
||
</vue-scroll>
|
||
</div>
|
||
</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>
|
||
<PlanTwo v-else></PlanTwo>
|
||
</template>
|
||
<script>
|
||
import echarts from 'echarts4';;
|
||
import { getProjectDetail,getProjectExtendInfoApi,editProjectExtendApi } from "@/assets/js/api/baseInfo.js";
|
||
import {selectProgressItemStatisticsApi,
|
||
selectProgressItemOverdueListApi,selectPersonOverdueProgressItemNumListApi} from "@/assets/js/api/dataBoard.js"
|
||
import {GetDateStr} from "@/assets/js/util"
|
||
import PlanTwo from "./plan4";
|
||
export default {
|
||
data() {
|
||
return {
|
||
ops: {
|
||
vuescroll: {
|
||
// wheelScrollDuration: 0,
|
||
wheelDirectionReverse: true,
|
||
},
|
||
},
|
||
stageList: this.$t("message.companyDiagram.CONSTRUCTIONSTAGE"),
|
||
projectData: {
|
||
constructionStage: 10,
|
||
videoUrl: "",
|
||
},
|
||
alarmList:[],
|
||
alarmType:1,
|
||
endDate:'',
|
||
dialogVisible:false,
|
||
leftDays:0,
|
||
baseURL:'',
|
||
COMPANY:""
|
||
};
|
||
},
|
||
components: {
|
||
PlanTwo,
|
||
},
|
||
created(){
|
||
this.COMPANY = COMPANY
|
||
console.log(COMPANY);
|
||
},
|
||
mounted() {
|
||
this.baseURL = this.$http.defaults.baseURL;
|
||
this.getDataDateils();
|
||
this.getData()
|
||
this.getData3()
|
||
},
|
||
methods: {
|
||
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.$t('message.dataBoard.pieProjectStatus'), [{
|
||
value: data.notStartNum,
|
||
itemStyle: {
|
||
color: '#848484'
|
||
}
|
||
},{
|
||
value: data.executingNum,
|
||
itemStyle: {
|
||
color: '#557DED'
|
||
}
|
||
},{
|
||
value: data.completeNum,
|
||
itemStyle: {
|
||
color: '#44D7B6'
|
||
}
|
||
},{
|
||
value: data.overdueNum,
|
||
itemStyle: {
|
||
color: '#FE6C7F'
|
||
}
|
||
}], 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, el) {
|
||
let that = this;
|
||
let ageChart = echarts.init(el);
|
||
// ageChart.clear();
|
||
let option = {
|
||
grid: {
|
||
top: 20,
|
||
left: 0,
|
||
bottom: 5,
|
||
right: 20,
|
||
containLabel: true,
|
||
},
|
||
color: ["#5CE2F6", "#5181F6"],
|
||
tooltip: {
|
||
trigger: "axis",
|
||
axisPointer: {
|
||
type: "shadow",
|
||
},
|
||
},
|
||
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.taskNum'),
|
||
type: "bar",
|
||
data: yData1,
|
||
barWidth: 36,
|
||
}
|
||
],
|
||
};
|
||
|
||
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>
|
||
.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: 100%;
|
||
}
|
||
/deep/.alarmTypeBox{
|
||
position: absolute;
|
||
top: 20px;
|
||
right: 10px;
|
||
width: 110px;
|
||
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;
|
||
|
||
}
|
||
</style>
|