2023-06-01 21:59:46 +08:00

1844 lines
54 KiB
Vue
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 class="fullHeight">
<div v-if="company == 'henan' " id="map" class="fullHeight" style="width:100%;height: 100%"></div>
<vue-scroll v-else>
<div class="top blockBox">
<!-- 人员概况 -->
<div class="whiteBlock">
<div class="blockInner">
<div class="pageTitle">
{{ $t("message.firmProject.leftBlock1.title1") }}
</div>
<div
class="item1"
style="background-color: rgba(81, 129, 246, 0.06)"
>
<div class="numBox">
<img
src="@/assets/images/longguang/1.png"
v-if="company == 'longguang'"
/>
<img src="@/assets/images/companyProject/1.png" v-else />
<div class="dataBox">
<p class="num primaryText">
{{ statisticsCount.workercount.totalPerson }}
</p>
<p class="text">
{{ $t("message.firmProject.leftBlock1.Block1.text1") }}
</p>
</div>
</div>
<div class="todayAdd">
<p class="">
{{ $t("message.firmProject.leftBlock1.Block1.todayAdd") }}
</p>
<p>
{{ $t("message.firmProject.leftBlock1.Block1.labour")
}}{{ statisticsCount.workercount.lwPersonYesterdayAdd
}}{{ $t("message.firmProject.leftBlock1.Block1.people") }}
{{ $t("message.firmProject.leftBlock1.Block1.manage")
}}{{ statisticsCount.workercount.glPersonYesterdayAdd
}}{{ $t("message.firmProject.leftBlock1.Block1.people") }}
{{ $t("message.firmProject.leftBlock1.Block1.RealNameSystem")
}}{{
statisticsCount.workercount.lwPersonYesterdayAdd +
statisticsCount.workercount.glPersonYesterdayAdd
}}{{ $t("message.firmProject.leftBlock1.Block1.people") }}
</p>
</div>
</div>
<div class="item2">
<div class="itemInner">
<div class="numItem">
{{ $t("message.firmProject.leftBlock1.Block2.itemInner1")
}}<span class="primaryText">{{
statisticsCount.workercount.jfGlPersonTotal
}}</span>
</div>
<div class="numItem">
{{ $t("message.firmProject.leftBlock1.Block2.itemInner2")
}}<span class="primaryText">{{
statisticsCount.workercount.jlGlPersonTotal
}}</span>
</div>
</div>
<div class="itemInner">
<div class="numItem">
{{ $t("message.firmProject.leftBlock1.Block2.itemInner3")
}}<span class="primaryText">{{
statisticsCount.workercount.yfGlPersonTotal
}}</span>
</div>
<div class="numItem">
{{ $t("message.firmProject.leftBlock1.Block2.itemInner4")
}}<span class="primaryText">{{
statisticsCount.workercount.lwPersonTotal
}}</span>
</div>
</div>
</div>
<div
class="item1"
style="
background-color: rgba(68, 215, 182, 0.06);
margin-top: 16px;
"
>
<div class="numBox">
<img src="@/assets/images/companyProject/2.png" />
<div class="dataBox">
<p class="num primaryText3">
{{ statisticsCount.presencecount.totalPerson }}
</p>
<p class="text">
{{ $t("message.firmProject.leftBlock1.Block2.text2") }}
</p>
</div>
</div>
</div>
<div class="item2">
<div class="itemInner">
<div class="numItem">
{{ $t("message.firmProject.leftBlock1.Block3.itemInner1")
}}<span class="primaryText">{{
statisticsCount.presencecount.glPersonTotal
}}</span>
</div>
<div class="numItem">
{{ $t("message.firmProject.leftBlock1.Block3.itemInner2")
}}<span class="primaryText">{{
statisticsCount.presencecount.lwPersonTotal
}}</span>
</div>
</div>
<div class="itemInner">
<div class="numItem">
{{ $t("message.firmProject.leftBlock1.Block3.itemInner3")
}}<span class="primaryText">{{
statisticsCount.presencecount.jfGlPersonTotal
}}</span>
</div>
<div class="numItem">
{{ $t("message.firmProject.leftBlock1.Block3.itemInner4")
}}<span class="primaryText">{{
statisticsCount.presencecount.jlGlPersonTotal
}}</span>
</div>
</div>
<div class="itemInner">
<div class="numItem">
{{ $t("message.firmProject.leftBlock1.Block3.itemInner5")
}}<span class="primaryText">{{
statisticsCount.presencecount.yfGlPersonTotal
}}</span>
</div>
<div class="numItem">
在场临时人员<span class="primaryText">{{
statisticsCount.presencecount.lsPersonTotal
}}</span>
</div>
<!-- <div class="numItem">
{{$t('message.firmProject.leftBlock1.Block3.itemInner6')}}<span class="primaryText">{{statisticsCount.presencecount.totalPerson}}</span>
</div> -->
</div>
</div>
<div class="numBoxContainer">
<div class="numBox">
<img src="@/assets/images/companyProject/3.png" />
<div class="dataBox">
<p class="num primaryText">
{{ statisticsCount.workercount.totalPerson }}
</p>
<p class="text">
{{ $t("message.firmProject.leftBlock1.Block3.numBox1") }}
</p>
</div>
</div>
<div class="numBox">
<img src="@/assets/images/companyProject/4.png" />
<div class="dataBox">
<p class="num" style="color: #f67f51">
{{ statisticsCount.workercount.lsPersonTotal }}
</p>
<!-- <p class="text">{{$t('message.firmProject.leftBlock1.Block3.numBox2')}}</p> -->
<p class="text">临时人员数</p>
</div>
</div>
</div>
<div class="numBoxContainer">
<div class="numBox">
<img
src="@/assets/images/longguang/5.png"
v-if="company == 'longguang'"
/>
<img src="@/assets/images/companyProject/5.png" v-else />
<div class="dataBox">
<p class="num primaryText3">
{{
(
(isNaN(
statisticsCount.workercount.manPersonTotal /
(statisticsCount.workercount.womanPersonTotal +
statisticsCount.workercount.manPersonTotal)
)
? 0
: statisticsCount.workercount.manPersonTotal /
(statisticsCount.workercount.womanPersonTotal +
statisticsCount.workercount.manPersonTotal)) * 100
).toFixed(2)
}}%
</p>
<p class="text">
{{ $t("message.firmProject.leftBlock1.Block3.numBox3") }}
</p>
</div>
</div>
<div class="numBox">
<img
src="@/assets/images/longguang/6.png"
v-if="company == 'longguang'"
/>
<img src="@/assets/images/companyProject/6.png" v-else />
<div class="dataBox">
<p class="num" style="color: #7851f6">
{{ statisticsCount.currentMonthEducationPerson }}
</p>
<p class="text">
{{ $t("message.firmProject.leftBlock1.Block3.numBox4") }}
</p>
</div>
</div>
</div>
</div>
</div>
<!-- 分布地图/宣传视频 -->
<div class="whiteBlock centerBlock">
<div class="blockInner">
<div class="tabBox">
<ul>
<li
:class="mapTabIndex ? 'active' : ''"
@click="change(1)"
>
分布地图
</li>
<li
:class="mapTabIndex ? '' : 'active'"
@click="change(0)"
>
宣传视频
</li>
</ul>
</div>
<el-button
v-show="
mapTabIndex == 0 &&
$store.state.userInfo.propagateFile &&
$store.state.userInfo.propagateFile != '-1'
"
type="danger"
size="mini"
class="deleteBtn"
@click="saveOrDeleteVideo(-1)"
>删除视频</el-button
>
<div class="mapContainer" v-show="mapTabIndex===0">
<video
v-if="
$store.state.userInfo.propagateFile &&
$store.state.userInfo.propagateFile != '-1'
"
:src="
$store.state.FILEURL + $store.state.userInfo.propagateFile
"
width="100%"
height="100%"
autoplay
controls
loop
></video>
<div class="placeholderBox" v-else>
<img
src="@/assets/images/longguang/noData.png"
alt=""
srcset=""
v-if="company == 'longguang'"
/>
<img src="@/assets/images/noData.png" alt="" srcset="" v-else />
<p>
{{ $t("message.videoManage.empty") }},
<el-upload
style="display: inline-block"
class="upload-demo"
:action="$store.state.UPLOADURL"
:on-success="(file) => handleSuccess(file, 1)"
:on-error="(file) => handleError(file, 1)"
:beforeUpload="(file) => handleBeforeUpload(file, 1)"
name="files"
:show-file-list="false"
>
<span>点我上传</span>
</el-upload>
</p>
</div>
</div>
<div class="mapContainer" v-show="mapTabIndex===1">
<div class="mapBack" v-if="showMapBack" @click="goBack">
<i class="el-icon-arrow-left"></i>
</div>
<div class="mapTitle" v-if="backArr.length != 0">
{{ backArr[backArr.length - 1].name }}
</div>
<div class="selectContainer">
<div
class="selectBox"
@click="showMapDialog = !showMapDialog"
v-show="backArr.length == 1"
>
城市列表
<i v-show="!showMapDialog" class="el-icon-arrow-up"></i>
<i v-show="showMapDialog" class="el-icon-arrow-down"></i>
</div>
<div
class="selectBox"
@click="showMapDialog = !showMapDialog"
v-show="backArr.length == 2"
>
项目列表
<i v-show="!showMapDialog" class="el-icon-arrow-up"></i>
<i v-show="showMapDialog" class="el-icon-arrow-down"></i>
</div>
<div class="selectContent" v-show="showMapDialog">
<vue-scroll style="height: 100%">
<div
class="selectItem"
@click="mapJumpToNext(index)"
v-for="(item, index) in mapData"
:key="index"
>
<p class="title">{{ item.name }}</p>
<div class="datas">
<div class="numBox2">
<p>{{ item.videoNum }}</p>
<p>视频数</p>
</div>
<div class="numBox2">
<p>{{ item.ufaceDevNum }}</p>
<p>门禁数</p>
</div>
<div class="numBox2" v-show="!item.projectName">
<p>{{ item.projectNum }}</p>
<p>项目数</p>
</div>
</div>
</div>
</vue-scroll>
</div>
</div>
<div id="map" class="fullHeight"></div>
</div>
</div>
</div>
<!-- 项目概况 -->
<div class="whiteBlock">
<div class="blockInner">
<div class="pageTitle">
{{ $t("message.firmProject.rightBlock1.title") }}
</div>
<div class="statictisBox">
<div class="numBox">
<div class="dataBox" v-if="backArr.length < 3">
<p class="num primaryText">
{{ statisticsCount.projectcount.projectNum }}
</p>
<p class="text">
{{ $t("message.firmProject.rightBlock1.numBox1") }}
</p>
</div>
<div class="dataBox" v-else>
<!-- bug100000-->
<p class="num primaryText">{{ mapData[0].households ||0}}</p>
<p class="text">
{{ $t("message.firmProject.rightBlock1.numBox3") }}
</p>
</div>
</div>
<div class="numBox">
<div class="dataBox" v-if="backArr.length < 3">
<p class="num primaryText3">
{{ statisticsCount.projectcount.saleAcreageTotal }}
</p>
<p class="text">销售总面积</p>
</div>
<div class="dataBox" v-else>
<p class="num primaryText3">
{{ mapData[0].projectAcreage }}
</p>
<!-- 在建总面积-->
<p class="text">
{{ $t("message.firmProject.rightBlock1.numBox2") }}
</p>
</div>
</div>
</div>
<div class="chart" ref="projectChart"></div>
</div>
</div>
</div>
<div class="bottom blockBox">
<!-- 年龄结构 -->
<div class="whiteBlock">
<div class="blockInner">
<div class="pageTitle">
{{ $t("message.firmProject.bottomBlock1.title") }}
</div>
<div class="statictisBox">
<div class="numBox">
<div class="dataBox">
<p class="num primaryText">
{{ statisticsCount.presencecount.avgage.toFixed(0) }}
</p>
<p class="text">
{{ $t("message.firmProject.bottomBlock1.numBox1") }}
</p>
</div>
</div>
<div class="numBox">
<div class="dataBox">
<p class="num primaryText3">
{{ statisticsCount.workercount.avgage.toFixed(0) }}
</p>
<p class="text">
{{ $t("message.firmProject.bottomBlock1.numBox2") }}
</p>
</div>
</div>
</div>
<div class="chart" ref="ageChart"></div>
</div>
</div>
<!-- 设备在线统计 -->
<div class="whiteBlock centerBlock">
<div class="blockInner">
<div class="pageTitle">
{{ $t("message.firmProject.bottomBlock2.title") }}
</div>
<div class="statictisBox big">
<div class="numBox">
<div class="dataBox">
<p class="num" style="color: #f67f51">
{{ statisticsCount.devcount.videoNum }}
</p>
<p class="text">
{{ $t("message.firmProject.bottomBlock2.numBox1") }}
</p>
</div>
</div>
<div class="numBox">
<div class="dataBox">
<p class="num primaryText">
{{ statisticsCount.devcount.ufaceDevNum }}
</p>
<p class="text">
{{ $t("message.firmProject.bottomBlock2.numBox2") }}
</p>
</div>
</div>
<div class="numBox">
<div class="dataBox">
<p class="num primaryText3">
{{ statisticsCount.devcount.environmentDevNum }}
</p>
<p class="text">
{{ $t("message.firmProject.bottomBlock2.numBox3") }}
</p>
</div>
</div>
</div>
<div class="chart" ref="devChart"></div>
</div>
</div>
<!-- 安全分析 -->
<div class="whiteBlock">
<div class="blockInner">
<div class="pageTitle">
{{ $t("message.firmProject.bottomBlock3.title") }}
</div>
<div
class="statictisBox"
style="margin: 5px 0 10px; font-size: 14px"
>
<p style="margin-right: 50px">
{{ $t("message.firmProject.bottomBlock3.numBox1") }}<span
class="primaryText"
>{{ eduPersonTotal }}</span
>{{ $t("message.firmProject.bottomBlock3.people") }}
</p>
<p>
{{ $t("message.firmProject.bottomBlock3.numBox2") }}<span
class="primaryText"
>{{
(
(isNaN(
eduPersonTotal / statisticsCount.workercount.totalPerson
)
? 0
: eduPersonTotal /
statisticsCount.workercount.totalPerson) * 100
).toFixed(2)
}}%</span
>
</p>
</div>
<!-- <div class="safeBtns">
<el-button type="primary" size="mini">安全培训统计</el-button>
<el-button type="info" size="mini">安全培训统计</el-button>
</div> -->
<div
class="chart"
ref="safeChart"
style="height: calc(100% - 50px)"
></div>
</div>
</div>
</div>
</vue-scroll>
<areaTree :videoType="0"></areaTree>
</div>
</template>
<script>
import {
getComapnyStatisticsListApi,
getWorkerStatisticsCountApi,
editCompanyBySnApi,
getProjectDevStatisticsCountApi,
selectWorkerSafeEducationStatisticsApi,
selectWorkerBlacklistStatisticsApi,
} from "@/assets/js/api/company/project";
import {
getProjectModuleList,
getAllModuleApi,
} from "@/assets/js/api/jxjadmin.js";
import { getProjectDetail } from "@/assets/js/api/baseInfo.js";
import areaTree from "@/components/areaTree";
import echarts from 'echarts4';;
export default {
components: { areaTree },
data() {
return {
mapObj: null,
mapName: "",
mapData: [],
backArr: [],
searchsn: "",
showMapDialog: false,
showMapBack: false,
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,
},
},
mapTabIndex: 1,
fullscreenLoading: null,
eduPersonTotal: 0,
company: "",
};
},
watch: {
"$store.state.mapBackArr": function () {
this.initData();
},
},
created() {
this.company = COMPANY;
this.$store.commit("setIsShowBackIndex", false);
},
mounted() {
this.initMap();
//获取地图数据
this.initData(true);
// this.getAllModule();
},
methods: {
//地图/视频切换
change(index){
console.log('切换的索引',index);
this.mapTabIndex=index
},
//安全分析
getSafeData() {
selectWorkerSafeEducationStatisticsApi({ sn: this.searchsn }).then(
(res) => {
console.log('培训学校',res)
var xData = [],
yData1 = [],
yData2 = [];
if (res.result) {
this.eduPersonTotal = res.result.totalEducationPerson;
var arr = res.result.list;
arr.forEach((element) => {
xData.push(element.name);
yData1.push(element.num);
});
}
selectWorkerBlacklistStatisticsApi({ sn: this.searchsn }).then(
(res) => {
if (res.result) {
var arr = res.result.list;
arr.forEach((element) => {
if (xData.length == 0) {
xData.push(element.name);
}
yData2.push(element.num);
});
}
this.createdSafeCharts(xData, yData1, yData2);
}
);
}
);
},
//设备在线统计
getDevCountStatictis() {
getProjectDevStatisticsCountApi({ sn: this.searchsn }).then((res) => {
console.log('设备在线统计',res.result.videoList)
if (res.result) {
var arr3 = res.result.environmentList;
var arr2 = res.result.ufaceList;
var arr1 = res.result.videoList;
console.log('arr1数据',arr1);
arr1.forEach((element, index) => {
arr1[index].value1 = (element.devOnlineNum / element.devNum) * 100;
arr1[index].value2 =(arr2[index].devOnlineNum / arr2[index].devNum) * 100;
if(arr1[index].value3){
arr1[index].value3 =(arr3[index].devOnlineNum / arr3[index].devNum) * 100;
}else{
arr1[index].value3=0
}
// setTimeout(()=>{
// arr1[index].value3 =(arr3[index].devOnlineNum / arr3[index].devNum?(arr3[index].devOnlineNum / arr3[index].devNum:0) * 100;
// },2000)
console.log(' arr1[index].value3', arr1[index].value3);
arr1[index].name = element.queryTime;
});
console.log(arr1);
this.createDevChart(arr1);
} else {
this.createDevChart([]);
}
});
},
//统计企业下项目各人员统计
getWorkerStatisticsCount() {
getWorkerStatisticsCountApi({ sn: this.searchsn }).then((res) => {
console.log('统计企业下项目各人员',res);
this.statisticsCount = res.result;
this.createProjectChart();
this.createdAgeCharts();
});
},
//获取所有企业下区域数据
loadData(type) {
//typetrue代表第一调用
// console.log('type,',type)
getComapnyStatisticsListApi({
sn: this.searchsn,
}).then((res) => {
this.mapData = res.result.companyList
? res.result.companyList
: res.result.projectList;
if (type) {
// this.showMapBack=false
this.backArr = [];
// if(this.$store.state.userInfo.accountType==4){
if (res.result.firstCompany) {
this.backArr.push({
name: res.result.firstCompany.companyName,
sn: res.result.firstCompany.companySn,
});
}
if (res.result.parentCompany) {
this.backArr.push({
name: res.result.parentCompany.companyName,
sn: res.result.parentCompany.companySn,
});
}
// }
// if(this.$store.state.userInfo.accountType==3||this.$store.state.userInfo.accountType==4){
if (res.result.companyInfo) {
this.backArr.push({
name: res.result.companyInfo.companyName,
sn: res.result.companyInfo.companySn,
});
}
// }
if (
(this.backArr.length == 0 &&
this.$store.state.userInfo.accountType == 2) ||
(this.backArr.length == 1 &&
this.$store.state.userInfo.accountType == 3) ||
(this.backArr.length == 2 &&
this.$store.state.userInfo.accountType == 4) ||
(this.backArr.length == 3 &&
this.$store.state.userInfo.accountType == 7)
) {
this.showMapBack = false;
} else {
this.showMapBack = true;
}
this.$store.commit("setMapBackArr", this.backArr);
}
if (this.mapData.length > 0) {
this.mapObj.clearMap();
this.setAreaMarker();
} else {
this.$message("该区域下没有数据!");
}
});
},
initData(type) {
console.log('执行',720);
this.backArr = this.$store.state.mapBackArr;
//
if (this.backArr.length > 0) {
this.searchsn = this.backArr[this.backArr.length - 1].sn;
} else {
switch (this.$store.state.userInfo.accountType) {
case 2:
this.searchsn = this.$store.state.userInfo.headquartersSn;
break;
case 3:
this.searchsn = this.$store.state.userInfo.sn;
break;
case 4:
this.searchsn = this.$store.state.userInfo.sn;
break;
case 7:
this.searchsn = this.$store.state.userInfo.sn;
break;
}
}
if (
(this.backArr.length == 0 &&
this.$store.state.userInfo.accountType == 2) ||
(this.backArr.length == 1 &&
this.$store.state.userInfo.accountType == 3) ||
(this.backArr.length == 2 &&
this.$store.state.userInfo.accountType == 4) ||
(this.backArr.length == 3 &&
this.$store.state.userInfo.accountType == 7)
) {
this.showMapBack = false;
} else {
this.showMapBack = true;
}
if (this.backArr.length == 4) {
this.getProjectDetail();
} else {
this.loadData(type);
}
this.getWorkerStatisticsCount();
this.getDevCountStatictis();
this.getSafeData();
},
//获取项目详细
getProjectDetail() {
let data = {
projectSn: this.searchsn,
};
getProjectDetail(data).then((res) => {
if (res.code == 200) {
if (res.result) {
console.log(res.result);
this.mapData = [res.result];
this.mapObj.clearMap();
this.setAreaMarker();
}
}
});
},
initMap() {
//地图加载
this.mapObj = new AMap.Map("map", {
resizeEnable: true,
});
},
goBack() {
//
if (this.backArr.length == 1) {
this.backArr = [];
} else {
this.backArr = this.backArr.splice(0, this.backArr.length - 1);
}
this.$store.commit("setMapBackArr", this.backArr);
// this.initData()
},
setAreaMarker() {
this.mapObj.clearMap();
var _this = this;
this.mapData.forEach((element, index) => {
var marker = new AMap.Marker({
position: [element.longitude, element.latitude],
icon: new AMap.Icon({
image: "https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png",
size: new AMap.Size(230, 43), //图标大小
imageSize: new AMap.Size(230, 43),
}),
});
var htmls = "";
if (!element.projectName) {
htmls = `<div class='datas'>
<p class='num'>${
element.projectNum
}</p><p class='text'>${this.$t(
"message.firmProject.marker.projectsNum"
)}</p>
</div>`;
}
marker.setLabel({
offset: new AMap.Pixel(0, 0), //设置文本标注偏移量
content: `<div class='mapInfo'>
<div class='areaName datas'>${
element.name
}</div>${htmls}
<div class='datas'><p class='num'>${
element.videoNum
}</p>
<p class='text'>${this.$t(
"message.firmProject.marker.videoNum"
)}</p>
</div>
<div class='datas'><p class='num'>${
element.ufaceDevNum
}</p>
<p class='text'>${this.$t(
"message.firmProject.marker.guardNum"
)}</p>
</div>
</div>`,
direction: "center", //设置文本标注方位
});
AMap.event.addListener(marker, "click", function (e) {
_this.mapJumpToNext(index);
//得到的数据
});
marker.setMap(this.mapObj);
this.mapObj.setFitView();
});
// this.$nextTick(() => {
// setTimeout(() => {
// var infoList = document.getElementsByClassName('mapInfo')
// // console.log('添加点击marker事件',infoList)
// infoList.forEach((element, index) => {
// // console.log(element)
// // element.removeEventListener("click",_this.mapJumpToNext(index),false);
// element.addEventListener('click', function () {
// console.log('点击marker',index)
// _this.mapJumpToNext(index)
// })
// // element.addEventListener('click', _this.mapJumpToNext(index))
// });
// }, 1000)
// })
},
// 地图跳转到下一级
mapJumpToNext(index) {
console.log("test1");
var _this = this;
if (_this.mapData[index].list) {
console.log("test2");
var json = {
sn: _this.mapData[index].companySn,
name: _this.mapData[index].name,
};
_this.backArr.forEach(element=>{
if(element.name==json.name){
return
}
})
_this.backArr.push(json);
_this.$store.commit("setMapBackArr", _this.backArr);
_this.showMapDialog = false;
_this.initData()
} else {
console.log("test3");
if (_this.mapData[index].projectName && _this.backArr.length < 3) {
console.log("test4");
var json = {
sn: _this.mapData[index].projectSn,
name: _this.mapData[index].name,
};
_this.backArr.forEach(element=>{
if(element.name==json.name){
return
}
})
_this.backArr.push(json);
_this.$store.commit("setMapBackArr", _this.backArr);
_this.showMapDialog = false;
_this.initData()
} else {
_this.$message("该区域下没有数据!");
}
}
},
createDevChart(echartData) {
let that = this;
let devChart = echarts.init(this.$refs.devChart);
// let bgColor = "#fff";
let color =
that.company == "longguang"
? ["#4378D8", "#1AA388",'#BC5D12',"#FF515A", "#8B5CFF", "#00CA69"]
: ["#5181F6", "#00DBB6", "#F67F51", "#FF515A", "#8B5CFF", "#00CA69"];
var symbolSize = 10;
// let echartData = [{
// name: "10-01",
// value1: 90,
// value2: 85,
// value3: 70
// },
// {
// name: "10-02",
// value1: 92,
// value2: 87,
// value3: 77
// },
// {
// name: "10-03",
// value1: 95,
// value2: 88,
// value3: 74
// },
// {
// name: "10-04",
// value1: 89,
// value2: 83,
// value3: 72
// },
// {
// name: "10-05",
// value1: 88,
// value2: 80,
// value3: 70
// },
// {
// name: "10-06",
// value1: 95,
// value2: 90,
// value3: 80
// },
// {
// name: "10-07",
// value1: 93,
// value2: 84,
// value3: 82
// },
// {
// name: "10-08",
// value1: 93,
// value2: 89,
// value3: 75
// }
// ];
let xAxisData = echartData.map((v) => v.name);
//  ["1", "2", "3", "4", "5", "6", "7", "8"]
let yAxisData1 = echartData.map((v) => v.value1?v.value1:0)
// [100, 138, 350, 173, 180, 150, 180, 230]
let yAxisData2 = echartData.map((v) => v.value2? v.value2:0)
let yAxisData3 = echartData.map((v) => v.value3?v.value3:0)
// [233, 233, 200, 180, 199, 233, 210, 180]
const hexToRgba = (hex, opacity) => {
let rgbaColor = "";
let reg = /^#[\da-f]{6}$/i;
if (reg.test(hex)) {
rgbaColor = `rgba(${parseInt("0x" + hex.slice(1, 3))},${parseInt(
"0x" + hex.slice(3, 5)
)},${parseInt("0x" + hex.slice(5, 7))},${opacity})`;
}
return rgbaColor;
};
var option = {
// backgroundColor: bgColor,
color: color,
legend: {
right: 10,
top: 5,
textStyle: {
color: "#9fa2ad",
},
},
tooltip: {
trigger: "axis",
formatter: function (params) {
let html = "";
params.forEach((v) => {
// console.log(v)
html += `<div style="color: #666;font-size: 14px;line-height: 24px">
<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${
color[v.componentIndex]
};"></span>
${v.seriesName}.${v.name}
<span style="color:${
color[v.componentIndex]
};font-weight:700;font-size: 18px">${v.value}</span>
%`;
});
return html;
},
extraCssText:
"background: #fff; border-radius: 0;box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);color: #333;",
// axisPointer: {
// type: 'shadow',
// shadowStyle: {
// color: '#ffffff',
// shadowColor: 'rgba(225,225,225,1)',
// shadowBlur: 5
// }
// }
},
grid: {
top: 35,
right: 45,
left: 15,
bottom: 0,
containLabel: true,
},
xAxis: [
{
type: "category",
boundaryGap: false,
axisLabel: {
formatter: "{value}",
textStyle: {
color: "#9fa2ad",
},
},
axisTick: {
show: false,
},
axisLine: {
lineStyle: {
color: "#D9D9D9",
},
},
data: xAxisData,
},
],
yAxis: [
{
type: "value",
name: "单位:%",
axisLabel: {
textStyle: {
color: "#9fa2ad",
},
},
nameTextStyle: {
color: "#9fa2ad",
fontSize: 12,
lineHeight: 24,
},
splitLine: {
lineStyle: {
type: "dashed",
color: "rgba(231, 233, 243, 0.5)",
},
},
axisLine: {
show: false,
},
axisTick: {
show: false,
},
},
],
series: [
{
name: "视频设备",
type: "line",
smooth: true,
// showSymbol: false,/
symbolSize: symbolSize,
zlevel: 3,
lineStyle: {
normal: {
color: color[0],
shadowBlur: 3,
shadowColor: hexToRgba(color[0], 0.76),
shadowOffsetY: 8,
},
},
data: yAxisData1,
},
{
name: "人脸设备",
type: "line",
smooth: true,
// showSymbol: false,
symbolSize: symbolSize,
zlevel: 3,
lineStyle: {
normal: {
color: color[1],
shadowBlur: 3,
shadowColor: hexToRgba(color[1], 0.76),
shadowOffsetY: 8,
},
},
data: yAxisData2,
},
{
name: "环境设备",
type: "line",
smooth: true,
// showSymbol: false,
symbolSize: symbolSize,
zlevel: 3,
lineStyle: {
normal: {
color: color[2],
shadowBlur: 3,
shadowColor: hexToRgba(color[2], 0.76),
shadowOffsetY: 8,
},
},
data: yAxisData3,
},
],
};
devChart.setOption(option);
},
//年龄结构---图表
createdAgeCharts() {
var json1 = this.statisticsCount.presencecount;
var json2 = this.statisticsCount.workercount;
var arr1 = [
json1.age18,
json1.age18to25,
json1.age25to35,
json1.age35to45,
json1.age45to60,
json1.age60,
];
var arr2 = [
json2.age18,
json2.age18to25,
json2.age25to35,
json2.age35to45,
json2.age45to60,
json2.age60,
];
let that = this;
let ageChart = echarts.init(this.$refs.ageChart);
// ageChart.clear();
let option = {
grid: {
top: 40,
left: 0,
bottom: 0,
right: 20,
containLabel: true,
},
color:
that.company == "longguang"
? ["#4378D8", "#1AA388"]
: ["#5181F6", "#61D2B9"],
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow",
},
},
legend: {
show: true,
align: "left",
top: 5,
left: 0,
itemWidth: 13,
itemHeight: 5,
textStyle: {
color: "#9fa2ad",
},
},
xAxis: [
{
type: "category",
data: [
"18及以下",
"18-25岁",
"25-35岁",
"35-45岁",
"45-59岁",
"60及以上",
],
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.5)",
},
},
axisLabel: {
color: "#9fa2ad",
},
},
series: [
{
name: "在职人数",
type: "bar",
data: arr2,
barWidth: 14,
barGap: 0.1,
},
{
name: "在场人数",
type: "bar",
data: arr1,
barWidth: 14,
},
],
};
ageChart.setOption(option);
},
//安全分析---图表
createdSafeCharts(xData, yData1, yData2) {
let that = this;
let safeChart = echarts.init(this.$refs.safeChart);
// ageChart.clear();
let option = {
grid: {
top: 40,
left: 0,
bottom: 15,
right: 20,
containLabel: true,
},
legend: {
show: true,
align: "left",
top: 0,
left: 0,
itemWidth: 13,
itemHeight: 5,
selectedMode: "single",
textStyle: {
color: "#9fa2ad",
},
},
color:
that.company == "longguang"
? ["#4378D8", "#1AA388"]
: ["#5181F6", "#61D2B9"],
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow",
},
},
xAxis: [
{
type: "category",
data: xData,
boundaryGap: true,
axisTick: {
show: false,
},
axisLine: {
show: false,
},
axisLabel: {
color: "#9fa2ad",
fontSize: 12,
interval:0,
formatter: function(value){
let valueTxt = ''
if (value.length > 4) {
valueTxt = value.substring(0,4) + '...'
} else {
valueTxt = value
}
return valueTxt
}
},
},
],
yAxis: {
type: "value",
axisTick: {
show: false,
},
axisLine: {
show: false,
},
splitLine: {
lineStyle: {
type: "dashed",
color: "rgba(231, 233, 243, 0.5)",
},
},
axisLabel: {
color: "#9fa2ad",
},
},
series: [
{
name: "安全培训统计",
type: "bar",
data: yData1,
barWidth: 26,
label: {
show: true,
position: "top",
fontSize: 12,
color: "rgba(42, 46, 63, 0.44)",
// formatter:'{c}\n{c}%'
},
},
{
name: "不良人数统计",
type: "bar",
data: yData2,
barWidth: 26,
label: {
show: true,
position: "top",
fontSize: 12,
color: "rgba(42, 46, 63, 0.44)",
// formatter:'{c}\n{c}%'
},
},
],
dataZoom: [{
type: 'slider',
show: true, //flase直接隐藏图形
xAxisIndex: [0],
// left: '9%', //滚动条靠左侧的百分比
bottom: 5,
start: 0,//滚动条的起始位置
end: 20, //滚动条的截止位置按比例分割你的柱状图x轴长度
height:6,
showDetail: false,
showDataShadow: false,
}]
};
safeChart.setOption(option);
},
createProjectChart() {
let that = this;
var arr = [];
if (this.statisticsCount.projectcount) {
var json = this.statisticsCount.projectcount;
arr = [
json.constructionStageCount1,
json.constructionStageCount2,
json.constructionStageCount3,
json.constructionStageCount4,
json.constructionStageCount5,
json.constructionStageCount6,
json.constructionStageCount7,
json.constructionStageCount8,
json.constructionStageCount9,
json.constructionStageCount10,
json.constructionStageCount11,
json.constructionStageCount12,
json.constructionStageCount13,
json.constructionStageCount14,
json.constructionStageCount15,
];
}
let projectChart = echarts.init(this.$refs.projectChart);
var option = {
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
},
color: that.company == "longguang" ? ["#1AA388"] : ["#44D7B6"],
grid: {
left: "0",
right: "20",
bottom: "0",
top: "20",
containLabel: true,
},
xAxis: {
type: "value",
splitLine: {
lineStyle: {
type: "dashed",
color: "rgba(231, 233, 243, 0.5)",
},
},
axisLine: {
lineStyle: {
color: "#D9D9D9",
},
},
axisLabel: {
textStyle: {
color: "#9fa2ad",
},
},
axisTick: {
show: false,
},
},
yAxis: {
axisLabel: {
textStyle: {
color: "#9fa2ad",
},
},
axisLine: {
lineStyle: {
color: "#D9D9D9",
},
},
type: "category",
axisTick: {
show: false,
},
data: [
"施工证获取",
"土方开挖",
"桩基",
"垫层完成",
"正负零",
"工程达到预售条件",
"主体施工",
"主体封顶",
"装饰装修",
"竣工备案完成",
],
},
series: [
{
name: "项目数",
type: "bar",
stack: "总量",
label: {
show: true,
position: "insideRight",
fontSize: 14,
},
barMinHeight: 18,
barMaxWidth: 24,
data: arr,
},
],
};
projectChart.setOption(option);
},
// 文件上传 之前
handleBeforeUpload(file, type) {
console.log(file);
let fileType = file.type.split("/")[0];
if (fileType == "video") {
this.fullscreenLoading = this.$loading({
lock: true,
text: "上传中,请稍等。。。",
spinner: "el-icon-loading",
background: "rgba(0, 0, 0, 0.7)",
});
return true;
} else {
this.$message.error("请选择视频");
return false;
}
},
//上传失败
handleError(file, type) {
this.fullscreenLoading.close();
this.$message.error("上传失败,请重试");
},
//上传成功
handleSuccess(file, type) {
if (file.code == 200 || file.status == "SUCCESS") {
var url = file.data[0].imageUrl;
this.saveOrDeleteVideo(url);
}
this.fullscreenLoading.close();
},
//保存或删除宣传视频
saveOrDeleteVideo(url) {
editCompanyBySnApi({
companySn: this.$store.state.userInfo.headquartersSn,
propagateFile: url,
}).then((res) => {
// this.$message.success("上传成功");
var json = this.$store.state.userInfo;
json.propagateFile = url == "-1" ? "" : url;
this.$store.commit("setUserInfo", json);
});
},
},
};
</script>
<style lang="less" scoped>
.pageTitle {
margin-bottom: 10px;
}
.blockBox {
overflow: hidden;
&.bottom {
height: calc(100% - 550px);
min-height: 230px;
.chart {
// height: 170px;
height: calc(100% - 70px);
}
}
&.top {
margin-bottom: 20px;
height: 530px;
.centerBlock {
height: 100%;
position: relative;
.blockInner {
height: calc(100% - 30px);
}
}
.chart {
height: 423px;
}
}
.whiteBlock {
margin-right: 20px;
width: 400px;
float: left;
height: 100%;
&:last-child {
margin-right: 0;
}
}
.blockInner {
padding: 15px;
position: relative;
height: calc(100% - 30px);
}
.centerBlock {
width: calc(100% - 800px - 40px);
}
}
.mapContainer {
margin-top: 12px;
height: calc(100% - 40px);
position: relative;
}
.item1 {
display: flex;
align-items: center;
padding: 6px;
}
.numBox {
display: flex;
align-items: center;
.dataBox {
margin-left: 12px;
}
.num {
font-size: 20px;
}
.text {
font-size: 14px;
// color: #7C829E;
opacity: 0.7;
}
}
.todayAdd {
text-align: center;
margin-left: 20px;
p:nth-child(1) {
font-size: 17px;
}
p:nth-child(2) {
font-size: 14px;
// color: #7C829E;
opacity: 0.7;
}
}
.item2 {
padding: 15px 10px;
border-bottom: 1px dashed rgba(231, 233, 243, 1);
.itemInner {
display: flex;
margin-bottom: 9px;
&:last-child {
margin-bottom: 0;
}
.numItem {
flex: 1;
// color: rgba(38, 45, 71, 0.6);
opacity: 0.6;
font-size: 14px;
span {
font-size: 15px;
margin-left: 8px;
}
}
}
}
.numBoxContainer {
display: flex;
align-items: center;
margin-top: 15px;
.numBox {
min-width: 170px;
}
}
/deep/ .amap-marker-label {
background-color: @--color-primary;
color: #ffffff;
border: none;
border-radius: 5px;
width: 230px;
.mapInfo {
background-color: @--color-primary;
display: flex;
padding: 5px 0;
cursor: pointer;
.datas {
flex: 1;
text-align: center;
align-self: center;
}
.areaName {
display: flex;
align-items: center;
justify-content: center;
border-right: 1px solid #ddd;
padding: 0 5px;
white-space: normal;
}
}
}
.mapTitle {
top: 5px;
font-size: 14px;
padding: 5px 10px;
background-color: rgba(0, 0, 0, 0.5);
color: rgb(255, 255, 255);
border-radius: 3px;
transform: translate(-50%);
left: 50%;
position: absolute;
z-index: 9999;
}
.mapBack {
width: 30px;
height: 30px;
border-radius: 50%;
font-size: 22px;
color: #ffffff;
margin: 5px;
position: absolute;
background-color: rgba(0, 0, 0, 0.5);
z-index: 9999;
text-align: center;
line-height: 30px;
cursor: pointer;
}
.statictisBox {
display: flex;
align-items: center;
margin: auto;
justify-content: center;
.numBox {
margin-right: 87px;
&:last-child {
margin-right: 0 !important;
}
}
&.big {
.numBox {
margin-right: 0;
flex: auto;
justify-content: center;
}
}
.dataBox {
text-align: center;
}
}
.safeBtns {
position: absolute;
right: 15px;
top: 15px;
}
.selectBox {
position: absolute;
right: 10px;
top: 5px;
color: @--color-primary;
font-size: 12px;
background-color: #fff;
text-align: center;
width: 80px;
height: 30px;
line-height: 30px;
border-radius: 10px;
z-index: 9999;
cursor: pointer;
}
.selectContent {
padding: 10px;
box-sizing: border-box;
font-size: 14px;
background-color: #fff;
width: 230px;
height: calc(100% - 60px);
top: 50px;
right: 10px;
position: absolute;
z-index: 9999;
.selectItem {
cursor: pointer;
}
.title {
margin: 10px 0 5px;
font-weight: 600;
}
.datas {
display: flex;
align-items: center;
justify-content: space-around;
font-size: 12px;
height: 40px;
background-color: #fbfbfb;
.numBox2 {
p:first-child {
color: @--color-primary;
}
}
}
}
.deleteBtn {
position: absolute;
top: 15px;
right: 15px;
}
</style>