long_IslandOcean/src/views/lighting/index.vue

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

<script setup>
import {onMounted, ref} from "vue"
import getPath from "@/utils/getPath.js";
import * as echarts from "echarts";
import dialogBox from './components/dialog.vue'
// 照明监测
const lightingNumList = ref([
{
name:"照明四路数量",
num:1130,
pic:getPath.lightTotal,
},
{
name:"照明四路灭灯数量",
num:1130,
pic:getPath.noLightNum,
},
{
name:"照明四路亮灯数量",
num:1130,
pic:getPath.lightingNum,
},
{
name:"离线数量",
num:1130,
pic:getPath.offlineNum,
}
])
// 照明回路详情
const lightDetail = ref([
{
name:'照明1',
address:"西大厅",
state:false
},
{
name:'照明2',
address:"西大厅",
state:false
},
{
name:'照明3',
address:"西大厅",
state:false
},
{
name:'照明4',
address:"西大厅",
state:true
},
{
name:'照明5',
address:"西大厅",
state:true
}
])
// 照明控制
const lightControl = ref([
{
name:'控制箱名称1'
},
{
name:'控制箱名称2'
},
{
name:'控制箱名称3'
},
{
name:'控制箱名称4'
},
{
name:'控制箱名称5'
}
])
// 照明负荷的时间切换
const lightLoadDate = ref('day')
const toggleLightLoad = (event) =>{
lightLoadDate.value = event.srcElement.className
}
// 照明控制
const controlBtn = ref('')
const toggleControl = (event) =>{
controlBtn.value = event.srcElement.className
}
// 弹窗
const dialogShow = ref(false)
const box = ref("")
const dialogTitle = ref("")
const openDialog = (name) =>{
dialogShow.value = true
dialogTitle.value = name
}
const closeDialog = (val) =>{
dialogShow.value = val
}
// 故障情况
const drawFaultConditionsChart = () =>{
let trafficWay = [
{
name: "正常",
value: 1260,
},
{
name: "故障",
value: 80,
},
];
var total = 0;
for (var i = 0; i < trafficWay.length; i++) {
total += trafficWay[i].value;
}
var data = [];
var color = [
'rgba(1, 246, 139, 1)',
'rgba(255, 221, 0, 1)'
];
for (var i = 0; i < trafficWay.length; i++) {
data.push(
{
value: trafficWay[i].value,
name: trafficWay[i].name,
itemStyle: {
borderWidth: 5,
// shadowBlur: 20,
borderRadius: 10,
borderColor: color[i],
shadowColor: color[i],
},
},
{
value: total * 0.04,
name: "",
itemStyle: {
label: {
show: false,
},
labelLine: {
show: false,
},
color: "rgba(0, 0, 0, 0)",
borderWidth: 0,
},
},
);
}
var img = "/src/assets/images/energyMonitoring/loadClassification.png";
let myChart = echarts.init(document.getElementById("faultConditions"));
let option = {
graphic: {
elements: [
{
type: "image",
z: 3,
style: {
image: img,
width: 175,
height: 175,
},
left: "center",
top: "center",
},
],
},
color: color,
title: [
{
text: total,
x: "47%",
y: "42%",
textAlign: "center",
textStyle: {
fontFamily: "Verdana-Bold",
fontSize: "20",
fontWeight: "bold",
color: "#FFF",
},
},
{
text: "个",
x: "58%",
y: "45%",
textAlign: "center",
textStyle: {
fontSize: "13",
fontWeight: "100",
color: "#FFF",
},
},
{
text: "照明四路数量",
left: "49%",
top: "55%",
textAlign: "center",
textStyle: {
fontFamily: "MicrosoftYaHei",
fontSize: "12",
fontWeight: "100",
color: "#fff",
},
},
],
tooltip: {
show: true,
},
series: [
{
name: "",
type: "pie",
clockWise: true,
radius: [50, 56],
hoverAnimation: false,
itemStyle: {
normal: {
label: {
show: true,
position: "outside",
color: "#FFFFFF",
fontSize: 13,
formatter: function (params) {
var percent = 0;
// var total = 0
// for (var i = 0; i < trafficWay.length; i++) {
// total += trafficWay[i].value
// }
percent = params.percent;
let unit = "个";
// percent = ((params.value / total) * 100).toFixed(0)
if (params.name !== "") {
return (
`{a${params.dataIndex / 2}|` +
params.value +
"}" +
`{s0|` +
unit +
"}" +
"\n" +
params.name
);
} else {
return "";
}
},
padding: [60, -50],
textStyle: {
rich: {
a0: {
color: "rgba(1, 246, 139, 1)",
padding: [0, 0, 10, 0],
fontSize: 15,
},
a1: {
color: color[1],
padding: [0, 0, 10, 0],
fontSize: 15,
},
s0: {
color: "#fff",
padding: [0, 0, 10, 5],
fontSize: 12,
},
},
},
},
labelLine: {
length: 20,
length2: 100,
show: true,
showAbove:true,
color: "#00ffff",
},
},
},
data: data,
},
],
};
myChart.setOption(option);
}
// 展馆照明
const drawHallLightingChart =()=>{
const offsetX = 10; //bar宽
const offsetY = 5; //倾斜角度
// 绘制左侧面
const CubeLeft = echarts.graphic.extendShape({
shape: {
x: 0,
y: 0,
},
buildPath: function (ctx, shape) {
const xAxisPoint = shape.xAxisPoint;
const c0 = [shape.x - 7, shape.y];
const c1 = [shape.x + 7, shape.y];
const c2 = [xAxisPoint[0] + 7, xAxisPoint[1]];
const c3 = [xAxisPoint[0] - 7, xAxisPoint[1]];
ctx
.moveTo(c0[0], c0[1])
.lineTo(c1[0], c1[1])
.lineTo(c2[0], c2[1])
.lineTo(c3[0], c3[1])
.closePath();
ctx.stroke();
},
});
// 绘制右侧面
const CubeRight = echarts.graphic.extendShape({
shape: {
x: 0,
y: 0,
},
buildPath: function (ctx, shape) {
const xAxisPoint = shape.xAxisPoint;
const c1 = [shape.x + 7, shape.y];
const c2 = [xAxisPoint[0] + 7, xAxisPoint[1]];
const c3 = [xAxisPoint[0] + 7 + 7, xAxisPoint[1] - 10];
const c4 = [shape.x + 7 + 7, shape.y - 5];
ctx
.moveTo(c1[0], c1[1])
.lineTo(c2[0], c2[1])
.lineTo(c3[0], c3[1])
.lineTo(c4[0], c4[1])
.closePath();
ctx.stroke();
},
});
// 绘制顶面
const CubeTop = echarts.graphic.extendShape({
shape: {
x: 0,
y: 0,
},
buildPath: function (ctx, shape) {
const c1 = [shape.x - 7, shape.y];
const c2 = [shape.x + 8, shape.y];
const c3 = [shape.x + 15, shape.y - 5];
const c4 = [shape.x - 2, shape.y - 5];
ctx
.moveTo(c1[0], c1[1])
.lineTo(c2[0], c2[1])
.lineTo(c3[0], c3[1])
.lineTo(c4[0], c4[1])
.closePath();
ctx.stroke();
},
});
// 注册三个面图形
echarts.graphic.registerShape("CubeLeft", CubeLeft);
echarts.graphic.registerShape("CubeRight", CubeRight);
echarts.graphic.registerShape("CubeTop", CubeTop);
let intAxisData = ['室内','户外'];
let intSeriesData = [100,200];
// 绿色渐变
// let colorArr = [["#12D5AF"], ["#0BC19D", "rgba(13,8,16,0)"], ["#68EFD4", "rgba(14,185,151,0)"]]
let colorArr;
let myChart = echarts.init(
document.getElementById("hallLighting")
);
const option = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow",
},
formatter: function (params, ticket, callback) {
const item = params[1];
return item.name + " : " + item.value;
},
},
grid: {
left: "4%",
right: "5%",
top: "18%",
bottom: "5%",
containLabel: true,
},
xAxis: {
type: "category",
data: intAxisData,
axisLine: {
show: true,
lineStyle: {
width: 1,
type: "solid",
color: "rgba(255, 255, 255, 0.20)",
},
},
axisTick: {
show: false,
},
axisLabel: {
color: "rgba(221, 255, 253, 1)",
fontSize: 14,
interval: 0,
// 使用函数模板,函数参数分别为刻度数值(类目),刻度的索引
// formatter: function (value) {
// const length = value.length;
// if (length > 3) {
// const start = Math.floor(length / 2);
// const str =
// value.slice(0, start) + "\n" + value.slice(start, length);
// return str;
// }
// return value;
// },
},
},
yAxis: {
type: "value",
name: "单位:kW",
nameTextStyle: {
color: "#DDFFFD",
padding:[0,20,0,0]
},
// minInterval: 1,
// y轴竖直线
axisLine: {
show: false,
},
// y轴横向 标线
splitLine: {
show: true,
lineStyle: {
type: "dashed",
color: "rgba(1, 39, 37, 0.30)",
},
},
// y轴刻度线
axisTick: {
show: false,
},
// y轴文字
axisLabel: {
fontSize: 14,
color: "#DDFFFD",
},
},
series: [
{
type: "custom",
renderItem: (params, api) => {
const location = api.coord([api.value(0), api.value(1)]);
colorArr = params.dataIndex===0?[
// 蓝色渐变
["rgba(0, 170, 193, 1)"],
["rgba(0, 224, 255, 1)", "rgba(0, 224, 255,0)"],
]:[
// 绿色渐变
["rgba(0, 193, 113, 1)"],
["rgba(0, 255, 140, 1)", "rgba(0, 255, 140,0)"],
]
return {
type: "group",
children: [
// 左侧面
{
type: "CubeLeft",
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0]),
},
style: {
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: colorArr[1][0],
},
{
offset: 1,
color: colorArr[1][1],
},
]),
},
},
// 右侧面
{
type: "CubeRight",
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0]),
},
style: {
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: colorArr[1][0],
},
{
offset: 1,
color: colorArr[1][1],
},
]),
},
},
// 顶部
{
type: "CubeTop",
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0]),
},
style: {
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: colorArr[0][0],
},
{
offset: 1,
color: colorArr[0][0],
},
]),
},
},
],
};
},
data: intSeriesData,
},
{
type: "bar",
label: {
normal: {
show: false,
position: "top",
formatter: (e) => {
return e.value;
},
fontSize: 16,
color: "#43C4F1",
offset: [0, -5],
},
},
itemStyle: {
color: "transparent",
},
tooltip: {},
data: intSeriesData,
},
],
};
myChart.setOption(option);
}
// 照明负荷
const drawLightLoadChart = () =>{
let myChart = echarts.init(document.getElementById("lightLoad"));
let option = {
grid: {
top: '18%',
left: '3%',
right: '5%',
bottom: '7%',
containLabel: true
},
tooltip: {
trigger: 'axis',
borderWidth: 1,
// axisPointer: {
// type: 'shadow'
// },
// extraCssText: 'z-index:2'
},
legend: [{
icon: 'rect',
top: 5,
left: 'right',
orient: 'horizontal',
// data: ['进水量', '出水量'],
borderRadius: 20,
itemHeight:10,
itemWidth:15,
textStyle: {
color: '#DDFFFD',
fontSize: 12,
// fontWeight: 400
}
}],
xAxis: {
type: 'category',
data: ['13:00', '14:00', '15:00', '16:00', '17:00'],
axisLine: {
//坐标轴轴线相关设置。数学上的x轴
show: true,
lineStyle: {
// type:'dashed',
color: "#557775"
// color: "#233e64",
},
},
axisTick: {
show: false
},
axisLabel: {
show: true,
textStyle: {
color: "#DDFFFD",//X轴文字颜色
}
}
},
yAxis: [
{
min:0,
max:500,
type: 'value',
name: '单位/kW',
nameTextStyle: {
color: "#DDFFFD",
fontSize: 12,
padding: [0, 10, 0, 0], // 四个数字分别为上右下左与原位置距离
},
axisTick: {
show: false
},
axisLabel: {
color: "#DDFFFD",
fontSize: 12
},
splitLine: {
show: true,
lineStyle: {
type:'dashed',
color: "rgba(1, 39, 37, 0.30)",
},
}
}
],
series: [
{
name: '昨日',
type: 'line',
//显示所有图形。
//标记的图形为实心圆
symbol: "none",
itemStyle: {
//折线拐点标志的样式
color: 'white',
borderWidth: '2',
borderColor: 'rgba(91, 250, 241, 1)',
normal: {
color: 'rgba(91, 250, 241, 1)'//拐点颜色
}
},
lineStyle: {
color: 'rgba(91, 250, 241, 1)'
},
data: [400, 320, 100, 320, 100]
},
{
name: '今日',
type: 'line',
symbol: "none",
itemStyle: {
//折线拐点标志的样式
color: 'white',
borderWidth: '2',
borderColor: '#91cc75',
normal: {
color: '#91cc75'//拐点颜色
}
},
lineStyle: {
color: '#91cc75'
},
data: [100, 320, 400,420, 500]
}
]
}
myChart.setOption(option)
}
onMounted(()=>{
// 故障情况
drawFaultConditionsChart()
// 展馆照明
drawHallLightingChart()
// 照明负荷
drawLightLoadChart()
})
</script>
<template>
<div class="page m100">
<dialogBox ref="box" :show="dialogShow" @update="closeDialog" :name="dialogTitle"/>
<div class="page-left-box">
<!-- 照明监测-->
<div class="title">
<span>照明监测</span>
</div>
<div class="margin10 box-bg" id="light">
<div class="light-item" v-for="(item,index) in lightingNumList">
<img :src="item.pic" alt="">
<p>
<span class="name">{{item.name}}</span>
<span class="num">{{item.num}}<span class="unit">个</span></span>
</p>
</div>
</div>
<!-- 当日累计用电量-->
<div class="title margin10">
<span>照明回路详情</span>
</div>
<div class="margin10 box-bg">
<div class="runningState">
<div class="tableTitle">
<span>名称</span>
<span>位置</span>
<span>状态</span>
</div>
<div class="tableContent">
<div class="tableBoby"
v-for="(item, index) in lightDetail"
:key="index"
>
<span class="name">{{ item.name }}</span>
<span>{{item.address}}</span>
<span ><i :class="item.state?'state1':'state0'"></i></span>
</div>
</div>
</div>
</div>
<!-- 照明负荷-->
<div class="title margin10">
<span>照明负荷</span>
<p>
<span class="year" :class="lightLoadDate === 'year'?'selectYear':''" @click="toggleLightLoad">年</span>
<span class="month" :class="lightLoadDate === 'month'?'selectMonth':''" @click="toggleLightLoad">月</span>
<span class="day" :class="lightLoadDate === 'day'?'selectDay':''" @click="toggleLightLoad">日</span>
</p>
</div>
<div class="margin10 box-bg" id="lightLoad"></div>
</div>
<div class="page-right-box">
<!-- 展馆照明 -->
<div class="title">
<span>展馆照明</span>
</div>
<div class="margin10 box-bg" id="hallLighting"></div>
<!-- 照明控制-->
<div class="title margin10">
<span>照明控制</span>
<p class="control-btn">
<span class="on" :class="controlBtn==='on'?'select':''" @click="toggleControl">全开</span>
<span style="margin-left: .7rem" class="off" :class="controlBtn==='off'?'select':''" @click="toggleControl">全关</span>
</p>
</div>
<div class="margin10 box-bg" >
<div class="runningState">
<div class="tableTitle">
<span>控制箱名称</span>
<span>操作</span>
</div>
<div class="tableContent">
<div class="tableBoby"
v-for="(item, index) in lightControl"
:key="index"
>
<span class="name">{{ item.name }}</span>
<span class="control" @click="openDialog(item.name)">照明控制</span>
</div>
</div>
</div>
</div>
<!-- 故障情况-->
<div class="title margin10">
<span>故障情况</span>
</div>
<div class="margin10 box-bg" id="faultConditions"></div>
</div>
</div>
</template>
<style scoped lang="scss">
//照明监测
#light{
display: flex;
flex-wrap: wrap;
align-content: space-evenly;
//padding: 2% 10%;
box-sizing: border-box;
img{
width: 3.875rem;
height: 4.375rem;
}
}
.light-item{
display: flex;
flex-basis: 50%;
padding-left: 2rem;
box-sizing: border-box;
p{
margin-left: .5rem;
.name{
margin-top: 1.3rem;
margin-bottom: .5rem;
}
.num {
color: rgba(1, 246, 139, 1);
font-weight: 700;
font-size: 1.25rem !important;
}
.unit{
margin-left: .2rem;
}
.name,.num{
display: block;
font-size: .75rem;
}
}
}
//照明回路详情
.state0,.state1{
width: 1.1rem;
height: 1.1rem;
display: block;
background-size: 100% 100%;
margin: 0 auto;
}
.state0{
background-image: url('@/assets/images/lighting/state0.png');
}
.state1{
background-image: url('@/assets/images/lighting/state1.png');
}
//照明控制
.control{
color:rgba(61, 255, 244, 1);
cursor: pointer;
}
.control-btn{
display: flex;
.select{
background-image: url("@/assets/images/air-tab-select.png") !important;
}
span{
background-image: url("@/assets/images/air-tab.png");
cursor: pointer;
font-family: normal;
color: rgba(221, 255, 253, 1);
background-size: 100% 100%;
font-size: 0.8rem;
padding: 0.2rem 1.1rem;
}
}
//弹窗
.dialog{
}
</style>