2022-06-08 14:51:11 +08:00

497 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>