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

579 lines
22 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 class="lgBigScreen-wrap flex">
<div class="left" v-show="checkedTab == 0">
<img src="@/assets/images/longguang/demo/zl_l.png" class="demo"/>
</div>
<div class="center" v-show="checkedTab == 0">
<div class="mapChart" ref="mapChart"></div>
<div class="mapDialog" v-show="showMapDialog">
<div class="flex2">
<div class="dialog_title">项目详细</div>
<i class="el-icon-error" @click="showMapDialog = false"></i>
</div>
<div class="dialog_project_info">
<div class="flex3">
<img :src="projectDetails.layoutImage" class="info_img" />
<div style="width: 70%">
<el-tooltip
class="item"
effect="dark"
:content="projectDetails.projectName"
placement="top-start"
>
<div class="project_name hide">
{{ projectDetails.projectName }}
</div>
</el-tooltip>
<el-tooltip
class="item"
effect="dark"
:content="projectDetails.constructionUnit"
placement="top-start"
>
<div class="subhead hide">
总承包:{{projectDetails.constructionUnit}}
</div>
</el-tooltip>
<el-tooltip
class="item"
effect="dark"
:content="projectDetails.constructionUnit"
placement="top-start"
>
<div class="subhead hide">建筑方:{{projectDetails.constructionUnit}}</div>
</el-tooltip>
</div>
</div>
<div class="flex2 margin_20">
<div class="subhead">
建筑体量 (㎡)<span class="value">{{
projectDetails.projectAcreage
}}</span>
</div>
<div class="subhead">
合同额(万元)<span class="value">{{
projectDetails.contractPrice ? projectDetails.contractPrice : 0
}}</span>
</div>
</div>
<div class="flex2">
<div>
<div>环境</div>
<div class="subhead">
PM2.5<span class="value2">{{
projectEnvironmentData.pm25
}}</span>
</div>
<div class="subhead">
PM10<span class="value2">{{
projectEnvironmentData.pm10
}}</span>
</div>
</div>
<div>
<div>人员</div>
<div class="subhead">
实时人数:<span class="value2">{{
attendancePerson.totalWorker
}}</span>
</div>
<div class="subhead">
今日出勤:<span class="value2">{{
attendancePerson.totalPerson
}}</span>
</div>
</div>
<div>
<div>质量</div>
<div class="subhead">
待整改:<span class="value2">{{
qualityCount.rectificationNum
}}</span>
</div>
<div class="subhead">
整改率:<span class="value2">{{
qualityCount.completeRatio
}}</span>
</div>
</div>
<div>
<div>安全</div>
<div class="subhead">
待整改:<span class="value2">{{
securityCount.rectificationNum
}}</span>
</div>
<div class="subhead">
整改率:<span class="value2">{{
securityCount.completeRatio
}}</span>
</div>
</div>
</div>
<div class="bottom_info">
<div class="flex2">
<div>项目进度</div>
<div>装饰装修阶段</div>
</div>
<el-progress :percentage="20"></el-progress>
<div class="flex2 time">
<div>2020-12-12</div>
<div>2021-08-31</div>
</div>
</div>
</div>
</div>
</div>
<div class="right" v-show="checkedTab == 0">
<img src="@/assets/images/longguang/demo/zl_r.png" class="demo"/>
</div>
<div v-show="checkedTab!=0">
<img :src="showDemo" class="demo"/>
</div>
<div class="btn_wrap flex2">
<div v-for="(tab, index) in tabsList" :key="index" class="tab">
<div
:class="checkedTab == index ? 'checked' : 'noChecked'"
@click="changeTab(index)"
>
<img :src="tab.icon" />
<div>{{ tab.name }}</div>
</div>
</div>
</div>
</div>
</template>
<script>
import echarts from 'echarts4';;
import {
selectAllProjectInfoList,
getRealTimeDustNoiseData,
selectEnterpriseAttendanceCount,
selectProjectWorkAndInspectCount,
getComapnyStatisticsList,
} from "./../../../assets/js/api/companyBigScreen.js";
import {} from "./components"
export default {
data() {
return {
sn: "",
projectSn: "",
tabsList: [
{
name: "总览",
id: 1,
icon: require("../../../assets/images/longguang/icon_zonglan.png"),
},
{
name: "劳务管理",
id: 2,
icon: require("../../../assets/images/longguang/icon_lw.png"),
url: require("../../../assets/images/longguang/demo/lw.png"),
},
{
name: "安全管理",
id: 3,
icon: require("../../../assets/images/longguang/icon_aq.png"),
url: require("../../../assets/images/longguang/demo/aq.png"),
},
{
name: "质量管理",
id: 4,
icon: require("../../../assets/images/longguang/icon_zl.png"),
url: require("../../../assets/images/longguang/demo/zl.png"),
},
{
name: "机械管理",
id: 5,
icon: require("../../../assets/images/longguang/icon_jx.png"),
url: require("../../../assets/images/longguang/demo/jx.png"),
},
{
name: "进度管理",
id: 6,
icon: require("../../../assets/images/longguang/icon_jd.png"),
url: require("../../../assets/images/longguang/demo/jd.png"),
},
{
name: "监控管理",
id: 7,
icon: require("../../../assets/images/longguang/icon_jk.png"),
url: require("../../../assets/images/longguang/demo/jk.png"),
},
{
name: "AI视频管理",
id: 8,
icon: require("../../../assets/images/longguang/icon_ai.png"),
url: require("../../../assets/images/longguang/demo/ai.png"),
},
],
checkedTab: 0,
showMapDialog: false,
allProjectData: [], //数据源
projectEnvironmentData: {}, //环境信息
projectDetails: {}, //项目详细信息
qualityCount: {}, //详情质量
securityCount: {}, //详情安全
attendancePerson: {}, //详情人员
showDemo:'',
};
},
created() {
this.sn = this.$store.state.userInfo.sn;
this.getAllProjectInfoList();
},
mounted() {},
methods: {
//切换tab
changeTab(index) {
if (index != 0) {
this.showDemo = this.tabsList[index].url;
}
this.checkedTab = index;
},
//获取所有项目
getAllProjectInfoList() {
let data = {
sn: this.sn,
};
selectAllProjectInfoList(data).then((res) => {
console.log(res);
if (res.code == 200) {
this.allProjectData = res.result;
this.createdChart();
}
});
},
//获取环境数据
selectRealTimeDustNoiseData(projectSn) {
getRealTimeDustNoiseData({ projectSn: projectSn }).then((res) => {
if (res.code == 200) {
if (res.result) {
this.projectEnvironmentData = res.result;
} else {
this.projectEnvironmentData = {
pm25: 0,
pm10: 0,
noise: 0,
winddirection: 0,
};
}
}
});
},
//获取人员。质量。安全。数据
getProjectWorkAndInspectCount(projectSn) {
selectProjectWorkAndInspectCount({
projectSn: projectSn,
}).then((res) => {
if (res.code == 200) {
this.attendancePerson = res.result.personCount.attendancePerson;
this.attendancePerson.totalWorker = res.result.personCount.totalWorker;
this.qualityCount = res.result.qualityCount;
this.securityCount = res.result.securityCount;
}
});
},
//创建地图
createdChart() {
var uploadedDataURL = "/js/data-1528971808162-BkOXf61WX.json";
var that = this;
let myChart = echarts.init(this.$refs.mapChart);
var data = [];
//获取回显项目位置
if (this.allProjectData.length > 0) {
this.allProjectData.forEach((element, index) => {
let obj = {
name: element.projectName,
value: [element.longitude, element.latitude, 300], //300 回显图标的大小
projectSn: element.projectSn,
detail: element,
};
data.push(obj);
});
}
$.getJSON(uploadedDataURL, function (geoJson) {
echarts.registerMap("china", geoJson);
// tooltip: {}, // hover 回显数据
var option = {
// backgroundColor: "#030609",
grid: {
top: 0,
bottom: 0,
left: 0,
right: 0,
},
//地图显示
geo: {
map: "china",
aspectScale: 0.75, //长宽比
zoom: 1.2,
scaleLimit: {
min: 1.2,
},
roam: true,
label: {
normal: {
formatter: function (params) {
if (params.name.indexOf("_")) {
return params.name.split("_")[0];
}
},
show: false,
textStyle: {
color: "#F4E924",
fontSize: 16,
fontWeight: "bold",
},
},
emphasis: {
show: false,
textStyle: {
color: "white",
},
},
},
itemStyle: {
normal: {
areaColor: "#031525",
borderColor: "#3B5077",
borderWidth: 1,
},
emphasis: {
areaColor: "#0f2c70",
},
},
regions: [
{
name: "南海诸岛",
itemStyle: {
areaColor: "rgba(0, 10, 52, 1)",
borderColor: "rgba(0, 10, 52, 1)",
normal: {
// opacity: 0,
label: {
show: false,
color: "#009cc9",
},
},
},
},
],
},
series: [
{
name: "",
type: "effectScatter",
coordinateSystem: "geo",
data: data,
symbolSize: function (val) {
return val[2] / 20;
},
showEffectOn: "render",
rippleEffect: {
brushType: "stroke",
},
hoverAnimation: true,
label: {
normal: {
formatter: "{b}",
position: "right",
show: true, //回显项目名称
},
},
itemStyle: {
normal: {
color: "#F4E924",
shadowBlur: 10,
shadowColor: "#333",
},
},
zlevel: 1,
},
],
};
myChart.on("click", function (params) {
//点击的是图标
if (params.seriesType) {
that.showMapDialog = true;
that.projectSn = params.data.projectSn;
that.projectDetails = params.data.detail;
console.log(params.data.detail);
//获取环境信息
that.selectRealTimeDustNoiseData(params.data.projectSn);
//获取人员.安全.质量 信息
that.getProjectWorkAndInspectCount(params.data.projectSn);
}
});
myChart.setOption(option, true);
});
},
},
};
</script>
<style lang="less" scoped>
.flex {
display: flex;
}
.flex2 {
display: flex;
justify-content: space-between;
align-items: center;
}
.flex3 {
display: flex;
align-items: center;
}
.lgBigScreen-wrap {
width: 100%;
height: 100%;
background: #030609;
color: #fff;
position: relative;
box-sizing: border-box;
padding: 15px;
.left {
width: 20%;
}
.center {
width: 60%;
height: calc(100% - 2px);
}
.right {
width: 20%;
}
.btn_wrap {
position: absolute;
width: 60%;
height: 100px;
bottom: -2px;
left: 0;
right: 0;
margin: 0 auto;
text-align: center;
padding: 0 50px;
box-sizing: border-box;
.tab {
width: 90px;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: #fff;
.noChecked{
opacity: 0.6;
}
}
}
.checked {
transform: scale(1.1);
color: #ffffff;
opacity: 1;
}
.mapChart {
width: 100%;
height: 100%;
background-image: url("../../../assets/images/longguang/bigScreen_bg.png");
background-repeat: no-repeat;
background-size: auto;
background-position: center;
}
.mapDialog {
position: absolute;
z-index: 100;
left: calc(50% - 242px);
top: calc(50% - 191px);
width: 484px;
// height: 292px;
background-color: rgba(11, 33, 53, 1);
box-shadow: 0px 6px 15px 0px rgba(0, 0, 0, 1);
}
.dialog_title {
width: 120px;
height: 30px;
line-height: 30px;
color: #fff;
box-sizing: border-box;
padding: 0 14px;
font-size: 15px;
background-image: linear-gradient(
to right,
rgba(67, 120, 216, 0.5),
rgba(67, 120, 216, 0)
);
}
.el-icon-error {
color: rgba(67, 120, 216, 1);
font-size: 20px;
margin: 0 10px;
cursor: pointer;
}
.dialog_project_info {
width: 100%;
padding: 20px 26px;
box-sizing: border-box;
.info_img {
width: 103px;
height: 78px;
margin-right: 26px;
}
.project_name {
color: rgba(255, 255, 255, 1);
font-size: 16px;
text-decoration: underline;
margin-bottom: 6px;
}
.subhead {
color: rgba(255, 255, 255, 0.8);
font-size: 13px;
line-height: 26px;
}
.value {
font-size: 16px;
font-weight: 600;
color: rgba(255, 255, 255, 1);
}
.value2 {
font-size: 15px;
color: rgba(255, 255, 255, 0.8);
}
.margin_20 {
margin: 20px 0;
}
.bottom_info {
margin-top: 20px;
.el-progress {
margin: 4px 0;
}
/deep/.el-progress__text {
color: #fff !important;
margin-left: 24px;
}
.time {
opacity: 0.8;
}
}
.hide {
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.demo{
height: 100%;
}
}
</style>