楼宇能效监测控制系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

628 lines
18 KiB

<template>
<div class="energy_content">
<div class="sys_charts" ref="sys_charts"></div>
<div class="eer">
<div>用电量:{{ energyMes.totalEle }}kw/h</div>
<div>用水量:{{ energyMes.totalWater }}</div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
import { eventBus } from "@/utils/evenBus";
import { overView } from "@/api/bigScreen";
import { getDay, getMonth, getYear } from "@/utils/datetime";
export default {
data() {
return {
chartInstance: null,
option: {},
isShowModule: false,
energyCostText: "eer数据",
dateUse: "",
useForm: {
useData: 5,
maxData: 10, //最大的刻度值
},
queryType: "day", //默认页面为day
dataTime: "",
energyMes: {},
};
},
created() {
eventBus.$on("data-sent-queryType", (data) => {
this.queryType = data;
console.log("得到的queryType为", this.queryType);
this.getChartsData();
});
},
mounted() {
this.initChart();
this.screenAdapter();
window.addEventListener("resize", this.screenAdapter);
this.getChartsData();
},
destroyed() {
//与mounted中的监听对应,在组件销毁的时候,需要将监听器取消掉
window.removeEventListener("resize", this.screenAdapter);
},
methods: {
// 计算颜色设置的函数
getAxisLineColor(useData, maxData) {
// 计算阈值
// 真实值大于最大值的0.75才使用颜色渐变
const threshold = maxData * 0.75;
// 判断实际值是否超过阈值
if (useData > threshold) {
return [
[
useData / maxData,
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{ offset: 0, color: "rgba(0,127,208,1)" },
{ offset: 0.6, color: "rgba(0,127,208,1)" },
{ offset: 1, color: "rgba(69, 235, 167,0.5)" },
]),
],
[1, "rgba(28,128,245,.0)"],
];
} else {
return [
[
useData / maxData,
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{ offset: 0, color: "rgba(0,127,208,1)" },
{ offset: 0.5, color: "rgba(0,127,208,1)" },
{ offset: 1, color: "rgba(0,127,208,1)" },
]),
],
[1, "rgba(28,128,245,.0)"],
];
}
},
//初始化chartInstance2对象 折线图
initChart() {
// 使用配置函数
const axisLineColor = this.getAxisLineColor(
this.useForm.useData,
this.useForm.maxData
);
this.chartInstance = echarts.init(this.$refs.sys_charts);
// var dataArr = 80;
this.option = {
backgroundColor: "transparent",
tooltip: {
formatter: "{a} <br/>{b} : {c}",
},
series: [
{
name: "内部动态阴影",
type: "gauge",
center: ["50%", "100%"],
startAngle: 180,
endAngle: -0,
radius: "155%",
z: 1,
splitNumber: 10,
axisLine: {
lineStyle: {
color: axisLineColor,
// 相当于阴影部分的直径
// width: 80,
},
},
axisLabel: {
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: false,
},
itemStyle: {
show: false,
},
textStyle: {
formatter: function (value) {
if (value !== 0) {
return parseInt(value);
} else {
return 0;
}
},
offsetCenter: [0, 5],
detail: {
padding: [0, 0, 0, 0],
// fontSize: titleFontSize * 1.2,
color: "#EDFFFD",
},
},
title: {
//标题
show: false,
},
pointer: {
show: false,
},
},
{
// 新增的蓝色背景
name: "蓝色背景",
type: "gauge",
center: ["50%", "100%"],
// 自定义起始角度
startAngle: 200,
// 自定义结束角度
endAngle: -20,
radius: "155%",
z: 0, // 确保它在最底层
splitNumber: 10,
axisLine: {
lineStyle: {
color: [
[1, "#01366d"], // 设置背景颜色为蓝色
],
},
},
axisLabel: {
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: false,
},
itemStyle: {
show: false,
},
textStyle: {
show: false,
},
title: {
show: false,
},
pointer: {
show: false,
},
},
{
name: "内部大边框",
type: "gauge",
z: 2,
min: 0,
max: this.useForm.maxData,
splitNumber: 10,
radius: "180%",
center: ["50%", "100%"],
startAngle: 180,
endAngle: -0,
axisLine: {
lineStyle: {
color: [[1, "#023B80"]],
width: 3,
// 阴影
shadowColor: "rgba(14,31,73)",
shadowBlur: 6,
shadowOffsetX: 0,
},
},
tooltip: {
show: false,
},
axisLabel: {
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: false,
},
itemStyle: {
show: false,
},
detail: {
show: false,
},
title: {
//标题
show: false,
},
pointer: {
show: false,
},
},
{
name: "指针上的圆",
//指针上的圆
type: "pie",
tooltip: {
show: false,
},
emphasis: {
scale: false, // 新版的配置
},
legendHoverLink: false,
radius: ["0%", "70%"],
center: ["50%", "100%"],
startAngle: 120,
endAngle: -0,
labelLine: {
show: false,
},
axisLine: {
lineStyle: {
color: [[1, "#F2BF59"]],
width: 3,
// 阴影
shadowColor: "rgba(14,31,73)",
shadowBlur: 60,
shadowOffsetX: 0,
},
},
label: {
show: false,
},
data: [
{
value: 120,
itemStyle: {
color: "#00223a",
},
},
],
z: 4,
},
{
name: "指针上的渐变圆",
//指针上的圆-渐变
type: "pie",
tooltip: {
show: false,
},
emphasis: {
scale: false, // 新版的配置
},
legendHoverLink: false,
radius: ["0%", "70%"],
center: ["50%", "100%"],
startAngle: 120,
endAngle: 0,
labelLine: {
show: false,
},
axisLine: {
lineStyle: {
color: [[1, "#F2BF59"]],
width: 3,
// 阴影
shadowColor: "rgba(14,31,73)",
shadowBlur: 60,
shadowOffsetX: 0,
},
},
z: 5,
},
{
// 指针 数据
name: this.energyCostText,
type: "gauge",
radius: "175%",
center: ["50%", "100%"],
min: 0, //最小刻度
max: this.useForm.maxData, //最大刻度
splitNumber: 0, //刻度数量
startAngle: 180,
endAngle: -0,
axisLine: {
show: false,
}, //仪表盘轴线
axisLabel: {
show: true,
color: "rgba(4,112,212,1)",
// distance: 16,
// fontSize: 12,
formatter: (value) => {
// 仅显示 0 和最大值
if (value === 0 || value == this.useForm.maxData) {
// 替换 100 为你的最大值
return value;
}
return "";
},
}, //刻度标签-数字。
axisTick: {
show: true,
// splitNumber: 5,
lineStyle: {
color: "rgba(4,112,212,1)", //用颜色渐变函数不起作用
// width: 3,
},
// length: 6,
}, //刻度样式
splitLine: {
show: true,
// length: 6,
lineStyle: {
color: "rgba(106, 104, 228, 0.5)", //用颜色渐变函数不起作用
},
}, //分隔线样式
itemStyle: {
show: false,
},
detail: {
show: false,
},
title: {
//标题
show: false,
},
data: [
{
name: this.dateUse,
value: this.useForm.useData,
},
],
itemStyle: {
color: "#EDF85B",
},
pointer: {
show: true,
length: "60%",
radius: "30%",
shape: "triangle", // 使用内置的箭头形状
// width: 15, //指针粗细
itemStyle: {
color: "rgb(3, 105, 206,0.5)", // 指针的颜色
// shadowColor: "rgb(104, 194, 247, 1)", // 朦胧光的颜色
shadowBlur: 20, // 朦胧光的模糊度
},
},
animationDuration: 4000,
z: 2,
},
],
};
//把配置项给实例对象
this.chartInstance.setOption(this.option, true);
},
screenAdapter() {
const titleFontSize = this.$refs.sys_charts.offsetWidth / 18;
const adapterOption = {
series: [
{
name: "内部动态阴影",
type: "gauge",
axisLine: {
lineStyle: {
width: titleFontSize * 1,
},
},
},
{
name: "蓝色背景",
type: "gauge",
axisLine: {
lineStyle: {
width: titleFontSize * 1,
},
},
},
{
// 指针 数据
name: this.energyCostText,
axisLabel: {
distance: titleFontSize,
fontSize: titleFontSize / 4,
},
axisTick: {
distance: -(titleFontSize / 70),
lineStyle: {
width: titleFontSize / 20,
},
length: titleFontSize / 5,
}, //刻度样式
splitLine: {
distance: -(titleFontSize / 70),
lineStyle: {
width: titleFontSize / 20,
},
length: titleFontSize / 3.6,
}, //分隔线样式
pointer: {
width: titleFontSize / 2, //指针粗细
},
},
],
};
this.chartInstance.setOption(adapterOption);
this.chartInstance.resize();
},
// 请求的数据
getChartsData() {
if (this.queryType === "day") {
this.dataTime = getDay(0);
} else if (this.queryType === "month") {
this.dataTime = getMonth(0);
} else if (this.queryType === "year") {
this.dataTime = getYear(0);
}
let data = {
timeType: this.queryType,
startTime: this.dataTime,
endTime: this.dataTime,
systemType: "1",
};
overView(data).then((res) => {
console.log("两个系统参数返回", res);
if (res.code == 200) {
this.energyMes = res.rows[0];
this.useForm.maxData = 50; //最大值
const { totalEle, totalWater } = res.rows[0];
if (totalEle === 0 || totalWater === 0) {
this.useForm.useData = 0;
} else {
const result = totalEle / totalWater;
if (Number.isInteger(result)) {
this.useForm.useData = result;
} else {
this.useForm.useData = parseFloat(result.toFixed(2));
}
}
console.log("热水的eer", this.useForm.useData);
let that = this;
// 使用配置函数
const axisLineColor = this.getAxisLineColor(
this.useForm.useData,
this.useForm.maxData
);
const titleFontSize = this.$refs.sys_charts.offsetWidth / 25;
const adapterOption = {
series: [
{
name: "内部动态阴影",
axisLine: {
lineStyle: {
color: axisLineColor,
// 相当于阴影部分的直径
// width: 80,
},
},
},
{
name: "内部大边框",
min: 0,
max: this.useForm.maxData,
},
{
name: "指针上的圆",
data: [
{
value: 5,
},
],
},
{
name: "指针上的渐变圆",
label: {
show: true,
position: "center", // 文字显示在中心位置
offset: [0, -25], // 向上偏移 10 个单位
formatter: function () {
// 返回 HTML 标签,使用 rich 里定义的样式
return `{line1|${that.useForm.useData}}\n{line2| kwh/吨}`;
},
rich: {
line1: {
color: "#39dd4f", // 第一行文字颜色
fontSize: 20, // 第一行文字大小
lineHeight: 34, // 行高,实现间距
},
line2: {
color: "#fff", // 第二行文字颜色
fontSize: 14, // 第二行文字大小
lineHeight: 24, // 行高,实现间距
},
},
},
data: [
{
value: 0,
itemStyle: {
// 设置渐变颜色
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "rgb(4,112,212)", // 顶部颜色
},
{
offset: 0.3,
color: "rgba(0, 46, 93)", // 底部透明
},
],
global: false, // 缺省为 false
},
},
},
],
},
{
// 指针 数据
name: this.energyCostText,
max: this.useForm.maxData, //最大刻度
axisLabel: {
formatter: (value) => {
// 仅显示 0 和最大值
if (value === 0 || value == this.useForm.maxData) {
// 替换 100 为你的最大值
return value;
}
return "";
},
},
data: [
{
name: this.dateUse,
value: this.useForm.useData,
},
],
},
],
};
this.chartInstance.setOption(adapterOption);
//手动的调用图标对象的resize才能产生效果
this.chartInstance.resize();
}
});
},
},
};
</script>
<style lang="scss" scoped>
.energy_content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100% !important;
height: 100%;
padding: 10px 0;
.sys_charts {
width: 100%;
height: 160px;
}
.eer {
width: 80%;
color: #fff;
font-size: 18px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
margin: 10px 0;
}
}
// 媒体查询,适配大于2000px分辨率的大屏样式
@media (min-width: 2000px) {
.energy_content {
padding: 0.1rem 0 !important;
.sys_charts {
height: 1.6rem !important;
}
.eer {
font-size: 0.18rem !important;
margin: 0.2rem 0 !important;
}
}
}
</style>