579 lines
22 KiB
Vue
579 lines
22 KiB
Vue
<!--总览-->
|
||
<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>
|