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

1581 lines
50 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>
<!-- <vue-scroll> -->
<div class="projectSummary">
<closePage></closePage>
<div class="title_wrap">
<img v-if="LOGO_white" :src="'./img/logo/'+LOGO_white+'.png'" class="logo" />
<img src="@/assets/images/overview2/headerBG.png" class="headerBG" />
<div class="flex title_content">
<div>
<!-- 安全施工1456天14小时53分钟49秒 -->
</div>
<div
class="projectName"
>{{projectData.projectName}}
<!-- - {{$t('message.projectSummary.overview')}} -->
</div>
<div>
<!-- {{$t('message.projectSummary.timeRemaining')}}789 {{$t('message.projectSummary.sky')}} -->
</div>
</div>
</div>
<div class="content flex4">
<div class="content_l">
<div class="content_height">
<div class="flex3 content_title">
<img src="@/assets/images/overview2/titleBG.png" class="title_img_bg" />
<div class="flex title_r">
<div class="title_name">{{showServicesData.showTitle}}</div>
<div>
<img
src="@/assets/images/overview2/config.png"
style="margin-right:18px;cursor: pointer;"
@click="configurationBrief=true"
/>
<img
src="@/assets/images/overview2/refresh.png"
style="cursor: pointer;"
@click="getSingleData(1)"
/>
</div>
</div>
</div>
<div class="content_content" v-if="!noServicesData">
<img class="proImg" :src="showServicesData.printUrl" />
<div v-if="!showServicesData.switchScroll" class="text">
<vue-scroll>
<pre>{{showServicesData.text}}</pre>
</vue-scroll>
</div>
<marquee
class="text"
v-else
id="affiche"
align="left"
direction="up"
height="60%"
width="100%"
hspace="10"
vspace="20"
loop="-1"
scrollamount="5"
scrolldelay="100"
onmouseover="this.stop()"
onmouseout="this.start()"
behavior="alternate"
>
<div>
<pre>{{showServicesData.text}}</pre>
</div>
</marquee>
</div>
<div class="content_content noData" v-else>
<img src="@/assets/images/noData.png" style="margin-top:50%" />
<div style="color:#224289">{{$t('message.projectSummary.noData')}}</div>
</div>
</div>
<div class="content_bottom">
<div class="flex3 content_title">
<img src="@/assets/images/overview2/titleBG.png" class="title_img_bg" />
<div class="flex title_r">
<div class="title_name">{{$t('message.projectSummary.statistics')}}</div>
<div>
<!-- <img src="@/assets/images/overview2/config.png" style="margin-right:18px" />
<img src="@/assets/images/overview2/refresh.png" />-->
</div>
</div>
</div>
<div class="content_content" style="padding:0">
<div class="device_wrap flex3">
<devNumChart :title='$t("message.projectSummary.ufaceDevNum")' :num="statisticsCount.devcount.ufaceDevNum" :totalDevNum="totalDevNum"></devNumChart>
<!-- <div ref="device1" class="device1"></div> -->
<!-- <div ref="device2" class="device2"></div> -->
<devNumChart :title='$t("message.projectSummary.environmentDevNum")' :num="statisticsCount.devcount.environmentDevNum" :totalDevNum="totalDevNum"></devNumChart>
</div>
</div>
</div>
</div>
<div class="content_c">
<div class="content_height">
<div class="flex3 content_title">
<img src="@/assets/images/overview2/titleBG.png" class="title_img_bg" />
<div class="flex title_r" v-if="COMPANY=='hezhan'">
<div class="title_name">
{{$t(message.projectInfo.bimModel)}}
<!-- BIM模型 -->
</div>
</div>
<div class="flex title_r" v-else>
<div class="title_name">{{showVideoTitle}}</div>
<div>
<img
src="@/assets/images/overview2/config.png"
style="margin-right:18px;cursor: pointer;"
@click="configurationVideo=true"
/>
<img
src="@/assets/images/overview2/refresh.png"
style="cursor: pointer;"
@click="getSingleData(2)"
/>
</div>
</div>
</div>
<div
class="content_content"
v-if="!noVideoData&&COMPANY!='hezhan'"
style="padding-left:8px;padding-right:8px"
>
<!-- 视频插件 -->
<!-- <videoModule :value="showVideoData[0]" ></videoModule> -->
<el-carousel
style="width:100%;height:100%"
indicator-position="none"
arrow="always"
:autoplay="false"
@change="changeCarousel"
>
<el-carousel-item
v-for="(item,index) in showVideoData"
:key="index"
style="height:100%"
>
<videoModule
:value="videoList"
:displayBottomMod="false"
:winNumBer="1"
v-show="showVideoData[videoIndex].videoType!=4"
:autoplay="true"
></videoModule>
<video
v-show="showVideoData[videoIndex].videoType==4"
width="100%"
height="100%"
:autoplay="showVideoData[videoIndex].videoType==4&&'autoplay'"
muted="muted"
loop="loop"
class="videoClass"
controls="controls"
:src="showVideoData[videoIndex].videoType==4&&item.videoUrl"
id="videoDOM"
:poster="item.coverUrl"
></video>
</el-carousel-item>
</el-carousel>
</div>
<div v-else-if="COMPANY=='hezhan'" class="content_content2">
<bimCenter></bimCenter>
</div>
<div class="content_content noData" v-else>
<img src="@/assets/images/noData.png" style="margin-top:20%" />
<div style="color:#224289">{{$t('message.projectSummary.noData')}}</div>
</div>
</div>
<div class="content_bottom">
<div class="flex3 content_title">
<img src="@/assets/images/overview2/titleBG.png" class="title_img_bg" />
<div class="flex title_r">
<div class="title_name">{{showEffectTitle}}</div>
<div>
<img
src="@/assets/images/overview2/config.png"
style="margin-right:18px;cursor: pointer;"
@click="effectPicture = true"
/>
<img
src="@/assets/images/overview2/refresh.png"
style="cursor: pointer;"
@click="getSingleData(3)"
/>
</div>
</div>
</div>
<div class="content_content" style="padding:23px 15px 18px" v-if="!noEffectData">
<div class="effect_wrap flex3">
<el-carousel
:interval="5000"
style="width:100%;height:100%"
indicator-position="none"
arrow="hover"
>
<el-carousel-item
v-for="(pageData,index) in showEffectData"
:key="index"
style="height:100%"
class="flex3"
>
<div class="effect_img_content" v-for="(item,index2) in pageData" :key="index2">
<!-- <div :preview="item.effectUrl"
:style="{'background-image':'url('+ item.effectUrl +')'}"
class="effectImg"
></div>-->
<img :preview="item.effectUrl" :src="item.effectUrl" class="effectImg" />
<div>{{item.effectName}}</div>
<div class="dot"></div>
</div>
</el-carousel-item>
</el-carousel>
</div>
</div>
<div class="content_content noData" v-else>
<img src="@/assets/images/noData.png" style="margin-top:5%" />
<div style="color:#224289">{{$t('message.projectSummary.noData')}}</div>
</div>
</div>
</div>
<div class="content_r">
<div class="content_title" style="height:50%">
<div class="flex3 content_title">
<img src="@/assets/images/overview2/titleBG.png" class="title_img_bg" />
<div class="flex title_r">
<div class="title_name">{{$t('message.projectSummary.schedule')}}</div>
<div></div>
</div>
</div>
<div class="content_content" style="padding:0; ">
<div ref="projectSchedule" class="projectSchedule"></div>
</div>
</div>
<div class="content_bottom personnel" @click="goPerson">
<div class="flex3 content_title">
<img src="@/assets/images/overview2/titleBG.png" class="title_img_bg" />
<div class="flex title_r">
<div class="title_name">{{$t('message.projectSummary.management')}}</div>
<div></div>
</div>
</div>
<div class="content_content" style="padding:23px 0px 18px">
<div class="people_wrap">
<!-- <img src="@/assets/images/overview2/blockBG.png" /> -->
<div class="realTime_num">
<div class="number">
<!-- statisticsCount.currentMonthEducationPerson -->
<countTo :startVal="0" :endVal="statisticsCount.presencecount.totalPerson" :duration="5000"></countTo>
</div>
<!-- {{$t('message.firmProject.leftBlock1.Block3.numBox4')}} -->
<div>{{$t('message.projectSummary.realtimeNumber')}}</div>
</div>
<div class="attendance_num">
<div class="number">
<countTo :startVal="0" :endVal="statisticsCount.presencecount.totalPerson" :duration="5000"></countTo>
</div>
<div>{{$t('message.projectSummary.attendance')}}</div>
</div>
<div class="headcount">
<div class="number">
<countTo :startVal="0" :endVal="statisticsCount.workercount.totalPerson" :duration="5000"></countTo>
</div>
<div>{{$t('message.projectSummary.headcount')}}</div>
</div>
</div>
</div>
</div>
<div class="content_bottom" @click="goEnvir">
<div class="flex3 content_title">
<img src="@/assets/images/overview2/titleBG.png" class="title_img_bg" />
<div class="flex title_r">
<div class="title_name">{{$t('message.projectSummary.monitoring')}}</div>
<div></div>
</div>
</div>
<div class="content_content" style="padding:0;">
<airQulityChart></airQulityChart>
<!-- <div ref="monitor" style="width:100%;height:100%"></div>
<div class="colour flex5">
<div class="colour_content">
<div
class="bg"
style="background:#1FCCC6; border-top-left-radius: 8px; border-bottom-left-radius: 8px;"
></div>
<div class="size">{{$t('message.projectSummary.actor')}}</div>
</div>
<div class="colour_content">
<div class="bg" style="background:#FFBB38"></div>
<div class="size">{{$t('message.projectSummary.fine')}}</div>
</div>
<div class="colour_content">
<div class="bg" style="background:#FE7A18"></div>
<div class="size">{{$t('message.projectSummary.mildContamination')}}</div>
</div>
<div class="colour_content">
<div class="bg" style="background:#7718FE"></div>
<div class="size">{{$t('message.projectSummary.middleLevelPollution')}}</div>
</div>
<div class="colour_content">
<div class="bg" style="background:#890EA1"></div>
<div class="size">{{$t('message.projectSummary.actheavyPollutionor')}}</div>
</div>
<div class="colour_content">
<div
class="bg"
style="background:#970C0C; border-top-right-radius: 8px; border-bottom-right-radius: 8px;"
></div>
<div class="size">{{$t('message.projectSummary.severeContamination')}}</div>
</div>
</div> -->
</div>
</div>
</div>
</div>
<!-- //项目简介 -->
<div class="configuration_wrap" v-if="configurationBrief">
<div class="configuration_content">
<div class="content_wrap">
<div class="title">{{$t('message.projectSummary.projectIntro')}}</div>
<img
src="@/assets/images/overview2/shut_icon.png"
class="shut_icon"
@click="configurationBrief=false"
/>
<el-form label-width="180px" class="form" size="small" style="width:80%;margin-top:40px">
<el-form-item :label="$t('message.projectSummary.title')">
<el-input
style="background: #06173F;"
v-model="services.showTitle"
:placeholder="$t('message.projectSummary.pleaseEnter')"
></el-input>
</el-form-item>
<el-form-item :label="$t('message.projectSummary.picture')">
<el-input
:placeholder="$t('message.projectSummary.pleaseEnterTheImageURL')"
v-model="services.printUrl"
></el-input>
<el-upload
class="upload-demo"
:action="uploadUrl"
name="files"
:on-success="(file)=>handleAvatarSuccess(file,1)"
:on-error="handleAvatarError"
:show-file-list="false"
>
<el-button
style="color:#33D4F1; font-size:14px"
type="text"
>{{$t('message.projectSummary.upload')}}</el-button>
</el-upload>
</el-form-item>
<el-form-item :label="$t('message.projectSummary.text')">
<el-input type="textarea" v-model="services.text"></el-input>
</el-form-item>
<el-form-item :label="$t('message.projectSummary.roll')">
<div style="text-align:left">
<el-switch
v-model="services.switchScroll"
active-color="#41BAE2"
inactive-color="#C4C4C4"
></el-switch>
</div>
</el-form-item>
</el-form>
<el-button
size="small"
class="save"
@click="saveServices"
>{{$t('message.projectSummary.save')}}</el-button>
</div>
</div>
</div>
<!-- 宣传视频 -->
<div class="configuration_wrap" v-if="configurationVideo">
<div class="configuration_content">
<div class="content_wrap" style="padding:0 100px">
<div class="title">{{$t('message.projectSummary.allocationVideo')}}</div>
<img
src="@/assets/images/overview2/shut_icon.png"
class="shut_icon"
@click="configurationVideo=false"
/>
<el-form label-width="180px" class="form" size="small" style="width:80%;margin-top:40px">
<el-form-item :label="$t('message.projectSummary.title')">
<el-input
style="background: #06173F;"
v-model="videoTitle"
:placeholder="$t('message.projectSummary.pleaseEnter')"
></el-input>
</el-form-item>
</el-form>
<div style="text-align:left;">{{$t('message.projectSummary.video')}}</div>
<div class="video_type_wrap" style="background:none;margin-bottom:0">
<div
class="video_type"
v-if="videoData.length>0"
v-for="(item, index) in videoData"
:key="index"
>
<img
src="@/assets/images/overview2/delete.png"
class="delete_img"
v-if="videoData.length>1 || (videoData.length<=1 && index!=0)"
@click="removeVideoData(index)"
/>
<el-form label-width="180px" class="form" size="small" style="width:80%;">
<el-form-item :label="$t('message.projectSummary.videoFile')">
<el-input
:placeholder="$t('message.projectSummary.playAddress')"
v-model="item.videoUrl"
></el-input>
<el-upload
class="upload-demo"
:action="uploadUrl"
:on-success="(file)=>handleAvatarSuccess(file,2,index)"
:on-error="handleAvatarError"
name="files"
:show-file-list="false"
>
<el-button
size="small"
style="color:#33D4F1"
type="text"
>{{$t('message.projectSummary.upload')}}</el-button>
</el-upload>
</el-form-item>
<!-- 视频格式: -->
<el-form-item :label="$t('message.projectInfo.videoType')+':'">
<el-radio-group v-model="item.videoType">
<el-radio :label="1">flv</el-radio>
<el-radio :label="2">m3u8</el-radio>
<el-radio :label="3">rtmp</el-radio>
<el-radio :label="4">mp4</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="$t('message.projectSummary.coverPicture')">
<el-input
:placeholder="$t('message.projectSummary.pleaseEnterTheImageURL')"
v-model="item.coverUrl"
></el-input>
<el-upload
class="upload-demo"
:action="uploadUrl"
:on-success="(file)=>handleAvatarSuccess(file,3,index)"
:on-error="handleAvatarError"
name="files"
:show-file-list="false"
>
<el-button
size="small"
style="color:#33D4F1"
type="text"
>{{$t('message.projectSummary.upload')}}</el-button>
</el-upload>
</el-form-item>
</el-form>
</div>
</div>
<div class="flex3" @click="addVideoData" style="cursor: pointer; width:100px">
<img
src="@/assets/images/overview2/add.png"
style="width:30px;height:30px;margin-top:10px"
/>
<div>{{$t('message.projectSummary.addVideo')}}</div>
</div>
<el-button
size="small"
class="save"
@click="saveVideo"
>{{$t('message.projectSummary.save')}}</el-button>
</div>
</div>
</div>
<!-- 效果图 -->
<div class="configuration_wrap" v-if="effectPicture">
<div class="configuration_content">
<div class="content_wrap" style="padding:0 100px">
<div class="title">{{$t('message.projectSummary.configurationRenderings')}}</div>
<img
src="@/assets/images/overview2/shut_icon.png"
class="shut_icon"
@click="effectPicture=false"
/>
<el-form label-width="180px" class="form" size="small" style="width:80%;margin-top:40px">
<el-form-item :label="$t('message.projectSummary.title')">
<el-input
style="background: #06173F;"
v-model="effectTitle"
:placeholder="$t('message.projectSummary.pleaseEnter')"
></el-input>
</el-form-item>
</el-form>
<div style="text-align:left; font-size:17px">{{$t('message.projectSummary.picture')}}</div>
<div class="video_type_wrap" style="background:none;margin-bottom:0">
<div
class="video_type"
v-if="effectData.length>0"
v-for="(item,index) in effectData"
:key="index"
>
<img
src="@/assets/images/overview2/delete.png"
class="delete_img"
v-if="effectData.length>1 || (effectData.length<=1 && index!=0)"
@click="removeEffectData(index)"
/>
<el-form label-width="180px" class="form" size="small" style="width:80%;">
<el-form-item :label="$t('message.projectSummary.imageName')">
<el-input
:placeholder="$t('message.projectSummary.pleaseEnter')"
v-model="item.effectName"
></el-input>
</el-form-item>
<el-form-item :label="$t('message.projectSummary.imageFile')">
<el-input
:placeholder="$t('message.projectSummary.pleaseEnterTheImageURL')"
v-model="item.effectUrl"
></el-input>
<el-upload
class="upload-demo"
:action="uploadUrl"
:on-success="(file)=>handleAvatarSuccess(file,4,index)"
:on-error="handleAvatarError"
name="files"
:show-file-list="false"
>
<el-button
size="small"
style="color:#33D4F1"
type="text"
>{{$t('message.projectSummary.upload')}}</el-button>
</el-upload>
</el-form-item>
</el-form>
</div>
</div>
<div class="flex3" style="cursor: pointer; width:100px" @click="addEffectImg">
<img
src="@/assets/images/overview2/add.png"
style="width:30px;height:30px;margin-top:10px"
/>
<div>{{$t('message.projectSummary.addImage')}}</div>
</div>
<el-button
size="small"
class="save"
@click="saveEffectData"
>{{$t('message.projectSummary.save')}}</el-button>
</div>
</div>
</div>
</div>
<!-- </vue-scroll> -->
</template>
<script>
import echarts from 'echarts4';;
import {
getPageDetail,
eidtProjectShowConfig,
queryBySnData
} from "@/assets/js/api/projectSummary.js";
import scroll from "vue-seamless-scroll";
import countTo from "vue-count-to";
import videoModule from "@/components/videoModule/videoModule";
import devNumChart from "@/components/chart/devNumChart";
import airQulityChart from "@/components/chart/airQulityChart";
import bimCenter from "../BIMCenter/overview";
import { getWorkerStatisticsCountApi } from "@/assets/js/api/company/project";
import closePage from "@/components/closePage"
export default {
name: "projectSummary",
components: {
scroll,
countTo,
videoModule,
devNumChart,
airQulityChart,
bimCenter,closePage
},
data() {
return {
LOGO_white:LOGO_white,
COMPANY:COMPANY,
uploadUrl: "",
fileUrl: "",
projectSn: "",
projectData: {},
configurationBrief: false, //简介弹窗
//简介数据 新增 || 修改
services: {
showTitle: "",
switchScroll: false,
printUrl: "",
text: "",
},
//显示的简介 数据
showServicesData: {
showTitle: this.$t("message.projectSummary.projectBrief"),
switchScroll: false,
printUrl: "",
text: "",
},
noServicesData: true,
noVideoData: true,
noEffectData: true,
scroll: false, // 简介是否滚动
synopsisText: "", // 显示的简介
configurationVideo: false, // 宣传视频
videoTitle: "",
// 新增 || 编辑
videoData: [
{
videoUrl: "",
videoType: "",
coverUrl: "",
},
],
showVideoTitle: this.$t("message.projectSummary.promotionVedio"),
showVideoData: [
{
videoUrl: "",
videoType: "",
coverUrl: "",
},
],
videoList: [],
videoIndex: 0,
effectPicture: false, // 效果图弹窗
// 新增 || 修改 效果图
effectTitle: "",
effectData: [
{
effectName: "",
effectUrl: "",
},
],
showEffectTitle: this.$t("message.projectSummary.effectPicture"),
showEffectData: [],
statisticsCount:{currentMonthEducationPerson:0,"projectcount":
{"constructionStageCount14":0,"constructionStageCount13":0,"constructionStageCount15":0,
"constructionStageCount10":0,"constructionStageCount12":0,"constructionStageCount11":0,
"constructionStageCount1":0,"saleAcreageTotal":0,"constructionStageCount9":0,
"constructionStageCount8":0,"constructionStageCount7":0,"constructionStageCount6":0,
"constructionStageCount5":0,"constructionStageCount4":0,"constructionStageCount3":0,
"constructionStageCount2":0,"projectNum":0},"workercount":{"lwPersonYesterdayAdd":0,eduPersonTotal:0,
"jfGlPersonTotal":0,"age18":0,"age18to25":0,"womanPersonTotal":0,"lsPersonTotal":0,
"jlGlPersonTotal":0,"age45to60":0,"lwPersonTotal":0,"manPersonTotal":0,
"totalPerson":0,"age25to35":0,"glPersonTotal":0,"yfGlPersonTotal":0,
"avgage":0,"age35to45":0,"glPersonYesterdayAdd":0,"age60":0},
"devcount":{"ufaceDevNum":0,"videoNum":0,"environmentDevNum":0},
"presencecount":{"jfGlPersonTotal":0,"age18":0,"age18to25":0,
"womanPersonTotal":0,"lsPersonTotal":0,
"jlGlPersonTotal":0,"age45to60":0,"lwPersonTotal":0,
"manPersonTotal":0,"totalPerson":0,"age25to35":0,"glPersonTotal":0,
"yfGlPersonTotal":0,
"avgage":0,"age35to45":0,"age60":0}},
totalDevNum:0
};
},
created() {
this.projectSn = this.$store.state.projectSn;
this.uploadUrl = this.$store.state.UPLOADURL;
this.fileUrl = this.$store.state.FILEURL;
this.getPageDetails();
this.getWorkerStatisticsCount()
// this.getDevCountStatictis()
},
mounted() {
},
methods: {
goPerson(){
var arr = this.$store.state.userInfo.menuAuthority.moduleList
arr.forEach(element => {
if(element.moduleName=='劳务管理'){
this.$store.commit("setMoudle", element);
var arr2=element.menuList,arr3=[]
arr2.forEach(item => {
if(item.menuEquipment==0){
arr3.push(item)
}
});
this.$store.commit("setMenuList", arr3);
}
});
let routeUrl = this.$router.resolve({
path: "/project/labor/personnelOverview",
});
window.open(routeUrl.href, "_blank");
},
goEnvir(){
let routeUrl = this.$router.resolve({
path: "/project/environmentalOverview",
});
window.open(routeUrl.href, "_blank");
},
//统计企业下项目各人员统计
getWorkerStatisticsCount(){
getWorkerStatisticsCountApi({sn:this.projectSn}).then(res=>{
this.statisticsCount = res.result
this.totalDevNum=this.statisticsCount.devcount.ufaceDevNum+
this.statisticsCount.devcount.videoNum+this.statisticsCount.devcount.environmentDevNum
})
},
//获取页面数据详情
getPageDetails() {
let data = {
projectSn: this.projectSn,
};
getPageDetail(data).then((res) => {
//showType==1 项目简介; 2 视频; 3 效果图
if (res.code == 200) {
this.videoList = [];
this.projectData = res.result.project;
if (res.result.list.length > 0) {
for (let i in res.result.list) {
let value = JSON.parse(res.result.list[i].configValue);
if (res.result.list[i].showType == 1) {
this.noServicesData = false;
this.showServicesData = value;
this.services = JSON.parse(JSON.stringify(value));
}
if (res.result.list[i].showType == 2) {
this.noVideoData = false;
this.showVideoTitle = res.result.list[i].showTitle;
this.showVideoData = value;
//获取到视频地址 传值到 插件
for (let v = 0; v < value.length; v++) {
if(value[v].videoType!=4){
let data = {
winNum: 0,
value: "video" + (v+1),
url: value[v].videoUrl,
};
this.videoList.push(data);
}
}
this.videoData = JSON.parse(JSON.stringify(value));
this.videoTitle = JSON.parse(
JSON.stringify(res.result.list[i].showTitle)
);
}
if (res.result.list[i].showType == 3) {
let index = 0;
let newArr = [];
while (index < value.length) {
newArr.push(value.slice(index, (index += 5)));
}
this.effectData = JSON.parse(JSON.stringify(value));
this.effectTitle = JSON.parse(
JSON.stringify(res.result.list[i].showTitle)
);
this.noEffectData = false;
this.showEffectData = newArr;
this.showEffectTitle = res.result.list[i].showTitle;
}
setTimeout(() => {
this.$previewRefresh();
}, 100);
}
} else {
}
this.createdEcharts2();
} else {
this.$message.error(res.message);
}
});
},
// 查询单条数据
getSingleData(type) {
// type == 1项目简介2宣传视频3效果图
let data = {
projectSn: this.projectSn,
showType: type,
};
queryBySnData(data).then((res) => {
if (res.code == 200 && res.result) {
let value = JSON.parse(res.result.configValue);
if (res.result.showType == 1) {
this.showServicesData = value;
this.services = JSON.parse(JSON.stringify(value));
this.noServicesData = false;
} else if (res.result.showType == 2) {
this.showVideoTitle = res.result.showTitle;
this.showVideoData = JSON.parse(JSON.stringify(value));
this.videoData = JSON.parse(JSON.stringify(value));
this.videoTitle = JSON.parse(JSON.stringify(res.result.showTitle));
this.noVideoData = false;
} else if (res.result.showType == 3) {
let index = 0;
let newArr = [];
while (index < value.length) {
newArr.push(value.slice(index, (index += 5)));
}
this.effectData = JSON.parse(JSON.stringify(value));
this.effectTitle = JSON.parse(JSON.stringify(res.result.showTitle));
this.noEffectData = false;
this.showEffectData = newArr;
this.showEffectTitle = res.result.showTitle;
}
} else {
this.noServicesData = true;
this.noVideoData = true;
this.noEffectData = true;
}
});
},
//上传文件成功
handleAvatarSuccess(file, type, index) {
this.$message.success(this.$t("message.projectSummary.uploadSuccessful"));
//1 项目简介图片; 2 视频文件; 3 封面图片; 4 效果图
if (file.status == "SUCCESS") {
if (type == 1) {
this.services.printUrl = this.fileUrl + file.data[0].imageUrl;
} else if (type == 2) {
this.videoData[index].videoUrl = this.fileUrl + file.data[0].imageUrl;
} else if (type == 3) {
this.videoData[index].coverUrl = this.fileUrl + file.data[0].imageUrl;
} else if (type == 4) {
this.effectData[index].effectUrl =
this.fileUrl + file.data[0].imageUrl;
}
}
},
//上传文件失败
handleAvatarError(file) {
this.$message.error(file.message);
},
//保存项目简介
saveServices() {
let configValue = JSON.stringify(this.services);
let data = {
projectSn: this.projectSn,
showType: 1,
showTitle: this.services.showTitle,
configValue: configValue,
};
eidtProjectShowConfig(data).then((res) => {
if (res.code == 200) {
this.configurationBrief = false;
this.getSingleData(1);
}
});
},
//新增 视频 按钮
addVideoData() {
let data = {
videoUrl: "",
videoType: "",
coverUrl: "",
};
this.$message.success(this.$t("message.projectSummary.newSuccess"));
this.videoData.push(data);
},
//删除视频按钮
removeVideoData(index) {
let data = this.videoData;
for (let i in data) {
if (i == index) {
data.splice(index, 1);
}
}
this.videoData = data;
},
// 保存 视频 按钮
saveVideo() {
let configValue = JSON.stringify(this.videoData);
let data = {
projectSn: this.projectSn,
showType: 2,
showTitle: this.videoTitle,
configValue: configValue,
};
eidtProjectShowConfig(data).then((res) => {
if (res.code == 200) {
this.configurationVideo = false;
this.getSingleData(2);
}
});
},
// 切换视频
changeCarousel(index) {
this.videoIndex = index;
document.getElementById("videoDOM").currentTime = 0;
},
//新增效果图按钮
addEffectImg() {
this.$message.success(this.$t("message.projectSummary.newSuccess"));
let data = {
effectName: "",
effectUrl: "",
};
this.effectData.push(data);
},
//删除效果图
removeEffectData(index) {
let data = this.effectData;
for (let i in data) {
if (i == index) {
data.splice(index, 1);
}
}
this.effectData = data;
},
//效果图 保存
saveEffectData() {
let configValue = JSON.stringify(this.effectData);
let data = {
projectSn: this.projectSn,
showType: 3,
showTitle: this.effectTitle,
configValue: configValue,
};
eidtProjectShowConfig(data).then((res) => {
if (res.code == 200) {
this.effectPicture = false;
this.getSingleData(3);
}
});
},
//获取圆上面某点的坐标(x0,y0表示坐标r半径angle角度)
getCirlPoint(x0, y0, r, angle) {
let x1 = x0 + r * Math.cos((angle * Math.PI) / 180);
let y1 = y0 + r * Math.sin((angle * Math.PI) / 180);
return {
x: x1,
y: y1,
};
},
// 项目进度 计算
_dashed() {
let dataArr = [];
for (var i = 0; i < 100; i++) {
if (i % 2 === 0) {
dataArr.push({
name: (i + 1).toString(),
value: 20,
itemStyle: {
normal: {
color: "rgb(0,255,255,.3)",
},
},
});
} else {
dataArr.push({
name: (i + 1).toString(),
value: 20,
itemStyle: {
normal: {
color: "rgb(0,0,0,0)",
borderWidth: 1,
borderColor: "rgba(0,255,255,1)",
},
},
});
}
}
return dataArr;
},
//创建图表 --- 项目进度
createdEcharts2() {
let that = this;
//项目进度
let projectSchedule = echarts.init(this.$refs.projectSchedule);
projectSchedule.clear();
let option = {
title: {
text:
"{a|" +
this.$t('message.companyDiagram.CONSTRUCTIONSTAGE')[this.projectData.constructionStage-1].name +
"}\n{c|" +
this.$t("message.projectSummary.stage") +
"}",
x: "center",
y: "center",
textStyle: {
rich: {
a: {
fontSize: 15,
color: " rgba(255, 255, 254, 1)",
fontWeight: "600",
lineHeight: 25,
},
c: {
fontSize: 15,
color: " rgba(255, 255, 254, 1)",
lineHeight: 20,
},
},
},
},
series: [
{
type: "gauge",
radius: "80%",
clockwise: false,
startAngle: "90",
endAngle: "-269.9999",
splitNumber: 30,
detail: {
offsetCenter: [0, -20],
formatter: " ",
},
pointer: {
show: false,
},
axisLine: {
show: true,
lineStyle: {
color: [
[0, "#2CFAFC"],
[36.7 / 100, "#0EF6F8"],
[1, "#061740"],
],
width: 20,
},
},
axisTick: {
show: false,
},
splitLine: {
show: true,
length: 55,
lineStyle: {
shadowBlur: 10,
shadowColor: "rgba(0, 255, 255, 1)",
shadowOffsetY: "0",
color: "#042B3E",
width: 2,
},
},
axisLabel: {
show: false,
},
},
{
type: "pie",
radius: ["54%", "55%"],
hoverAnimation: false,
clockWise: false,
itemStyle: {
normal: {
color: "#0C355E",
},
},
label: {
show: false,
},
data: that._dashed(),
},
{
type: "pie",
radius: [0, "40%"],
hoverAnimation: false,
clockWise: false,
itemStyle: {
normal: {
shadowBlur: 20,
shadowColor: "#000",
color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [
{
offset: 0,
color: "#0FF",
},
{
offset: 1,
color: "#060f20",
},
]),
},
},
label: {
show: false,
},
data: [100],
},
{
type: "pie",
radius: ["84%", "85.5%"],
hoverAnimation: false,
clockWise: false,
itemStyle: {
normal: {
shadowBlur: 20,
shadowColor: "rgba(0, 255, 255,.6)",
color: "#0f232e",
},
},
label: {
show: false,
},
data: [100],
},
{
type: "pie",
radius: ["88%", "89.5%"],
hoverAnimation: false,
clockWise: false,
itemStyle: {
normal: {
shadowBlur: 20,
shadowColor: "rgba(0, 255, 255,.6)",
color: "rgba(15, 35, 46,.6)",
},
},
label: {
show: false,
},
data: [100],
},
],
};
projectSchedule.setOption(option);
setInterval(() => {
let option = projectSchedule.getOption();
option.series[1].startAngle = option.series[1].startAngle - 1;
projectSchedule.setOption(option);
}, 100);
},
},
};
</script>
<style lang="less" scoped>
body,
html,
#app {
overflow: hidden;
}
.logo{
position: absolute;
left: 40px;
top: 8px;
height: 16px;
}
.flex {
display: flex;
align-items: center;
justify-content: space-between;
}
.flex2 {
display: flex;
align-items: center;
justify-content: space-around;
}
.flex3 {
display: flex;
align-items: center;
}
.flex4 {
display: flex;
justify-content: space-between;
}
.flex5 {
display: flex;
align-items: center;
justify-content: center;
}
.projectSummary {
width: 100%;
height: 100%;
background: #061740;
.title_wrap {
width: 100%;
height: 8%;
position: relative;
color: rgba(255, 255, 254, 1);
font-size: 15px;
text-align: center;
font-family: PingFangSC-Regular;
.headerBG {
width: 100%;
height: 76px;
}
.title_content {
position: absolute;
top: 8px;
width: 100%;
box-sizing: border-box;
padding: 0 20.2%;
.projectName {
color: rgba(14, 246, 248, 1);
font-size: 31px;
text-align: center;
font-family: AlibabaPuHuiTiH;
font-weight: 600;
// margin-left: -123px;
}
}
}
.content {
width: 100%;
background: #061740;
box-sizing: border-box;
padding: 10px 30px 0;
color: rgba(255, 255, 255, 1);
height: 92%;
.content_l,
.content_r {
width: 22%;
height: 68%;
}
.content_c {
width: 54.5%;
height: 68%;
}
.content_title {
width: 100%;
.title_img_bg {
width: 81px;
height: 21px;
}
.title_r {
width: calc(100% - 81px);
height: 21px;
margin-top: -6px;
padding: 0 4px 4px;
border-bottom: 2px solid #245f89;
color: rgba(65, 186, 226, 1);
font-size: 17px;
text-align: center;
font-family: PingFangSC-Medium;
img {
width: 15px;
height: 15px;
}
}
}
.content_height {
height: 100%;
}
.content_content2{
border-radius: 2px;
background-image: linear-gradient(#0b2453, #061740);
border: 2px solid #18426c;
width: 100%;
height: calc(100% - 26px);
}
.content_content {
margin-top: -1px;
height: calc(100% - 21px);
padding: 23px 23px 18px;
box-sizing: border-box;
border: 2px solid #18426c;
border-top: none;
font-size: 14px;
line-height: 25px;
border-radius: 2px;
background-image: linear-gradient(#0b2453, #061740);
.proImg {
max-width: 100%;
max-height: 230px;
width: auto;
height: auto;
display: block;
margin: auto;
}
.text {
margin-top: 20px;
overflow-y: auto;
height: calc(100% - 250px);
// pre{
// white-space: normal;
// }
}
}
.content_bottom {
margin-top: 21px;
width: 100%;
height: 41%;
}
.personnel {
margin-bottom: 0 !important;
height: calc(100% - 50% - 21px);
}
}
.projectSchedule {
width: 100%;
height: 100%;
}
.people_wrap {
width: 100%;
height: 100%;
position: relative;
text-align: center;
// background-image: url("../../../assets/images/overview2/blockBG.png");
background-image: url("../../../assets/images/overview2/blockBG.gif");
background-repeat: no-repeat;
// background-size: contain;
background-size: auto;
background-position: center center;
color: rgba(255, 255, 254, 0.8);
font-size: 14px;
img {
width: 95%;
height: auto;
margin-top: 4.6%;
}
.realTime_num,
.attendance_num,
.headcount {
position: absolute;
top: 50%;
left: 50%;
width: 56px;
height: 55px;
}
.realTime_num {
transform: translate(-30px, -68px);
}
.attendance_num {
transform: translate(-142px, 18px);
}
.headcount {
transform: translate(80px, 18px);
}
// .realTime_num {
// position: absolute;
// top: 17.8%;
// left: 50%;
// width: 56px;
// height: 55px;
// margin-left: -30px;
// }
// .attendance_num {
// position: absolute;
// top: 57.8%;
// left: 13%;
// width: 56px;
// height: 55px;
// }
// .headcount {
// position: absolute;
// top: 57.8%;
// left: 70%;
// width: 56px;
// height: 55px;
// }
.number {
color: rgba(0, 229, 232, 1);
font-size: 28px;
font-family: PingFangSC-Medium;
margin-bottom: 5px;
}
}
.device_wrap {
width: 100%;
height: 100%;
div {
height: 100%;
width: 50%;
background-image: linear-gradient(#0b2453, #061740) !important;
}
}
//弹窗
.configuration_wrap {
position: fixed;
top: 0;
left: 0;
bottom: 0;
right: 0;
color: #fff;
z-index: 1000;
background: rgba(0, 0, 0, 0.4);
.configuration_content {
width: 882px;
height: 557px;
position: relative;
margin: 180px auto 0;
box-sizing: border-box;
padding: 26px 30px;
background-image: url("../../../assets/images/overview2/dialogBG.png");
background-repeat: no-repeat;
background-size: 100%;
text-align: center;
}
.content_wrap {
z-index: 10000;
.title {
color: rgba(14, 246, 248, 1);
font-size: 18px;
text-align: center;
font-family: AliHYAiHei;
font-weight: 700;
}
.shut_icon {
position: absolute;
right: 28px;
top: 36px;
z-index: 2000;
margin: 10px;
cursor: pointer;
}
}
/deep/ .el-form .el-form-item__label {
color: #fff;
}
/deep/ .el-input__inner {
background: #06173f;
font-size: 14px;
border-color: #1d5181;
color: rgba(161, 164, 176, 1);
}
/deep/ .el-textarea__inner {
min-height: 188px !important;
background: #06173f;
font-size: 14px;
color: rgba(161, 164, 176, 1);
border-color: #1d5181;
}
/*定义滚动条宽高及背景,宽高分别对应横竖滚动条的尺寸*/
/deep/ .el-textarea__inner::-webkit-scrollbar {
width: 5px; /*对垂直流动条有效*/
height: 10px; /*对水平流动条有效*/
}
/*定义滚动条的轨道颜色、内阴影及圆角*/
/deep/ .el-textarea__inner::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
background-color: none;
border-radius: 3px;
}
/*定义滑块颜色、内阴影及圆角*/
/deep/ .el-textarea__inner::-webkit-scrollbar-thumb {
border-radius: 7px;
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
background-color: #666d7e;
}
.upload-demo {
position: absolute;
top: 0;
right: -68px;
color: #33d4f1;
font-size: 14px;
}
.save {
color: #fff;
background: #41bae2;
border-color: #41bae2;
position: absolute;
bottom: 40px;
left: 50%;
margin-left: -26px;
}
}
/deep/ .el-radio {
color: rgba(161, 164, 176, 1);
}
/deep/ .el-radio__label {
font-size: 16px;
}
/deep/ .el-radio__inner {
background: #102757;
border-color: rgba(161, 164, 176, 1);
}
.video_type_wrap {
width: 100%;
background: #102757;
margin: 12px 0;
max-height: 250px;
overflow-y: auto;
}
/*定义滚动条宽高及背景,宽高分别对应横竖滚动条的尺寸*/
.video_type_wrap::-webkit-scrollbar {
width: 5px; /*对垂直流动条有效*/
height: 10px; /*对水平流动条有效*/
}
/*定义滚动条的轨道颜色、内阴影及圆角*/
.video_type_wrap::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
background-color: none;
border-radius: 3px;
}
/*定义滑块颜色、内阴影及圆角*/
.video_type_wrap::-webkit-scrollbar-thumb {
border-radius: 7px;
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
background-color: #666d7e;
}
.video_type {
position: relative;
.delete_img {
position: absolute;
right: 0;
top: 0;
margin: 10px;
cursor: pointer;
z-index: 2010;
}
width: 100%;
background: #102757;
padding: 12px 0;
margin-bottom: 10px;
}
.video_type:last-child {
margin-bottom: 0;
}
.effect_wrap {
width: 100%;
height: 100%;
flex-wrap: wrap;
overflow: hidden;
.effect_img_content {
width: 20%;
padding-bottom: 10px;
border-bottom: 1px solid #15254b;
position: relative;
text-align: center;
font-size: 14px;
color: #04ffff;
.effectImg {
background-size: contain;
background-repeat: no-repeat;
height: 95px;
background-position: 50%;
margin: 15px auto;
}
.dot {
position: absolute;
bottom: -5px;
left: 50%;
margin-left: -5px;
height: 10px;
width: 10px;
background-color: #04ffff;
border-radius: 50%;
}
}
}
/deep/ .el-carousel__container {
height: 100%;
}
.noData {
text-align: center;
}
}
</style>