283 lines
6.1 KiB
Vue
283 lines
6.1 KiB
Vue
<!--
|
||
filename: GasChart.vue
|
||
author: liubin
|
||
date: 2023-12-12 10:53:49
|
||
description:
|
||
-->
|
||
|
||
<template>
|
||
<div class="gas-chart"></div>
|
||
</template>
|
||
|
||
<script>
|
||
import * as echarts from 'echarts';
|
||
import resize from './../mixins/resize'
|
||
|
||
export default {
|
||
name: 'GasChart',
|
||
mixins: [resize],
|
||
components: {},
|
||
props: {
|
||
chartType: '', // 能源类型
|
||
chartTime: ''
|
||
},
|
||
data() {
|
||
const colors = [
|
||
'#12FFF5',
|
||
'#2760FF',
|
||
'#FFD160',
|
||
'#E80091',
|
||
'#8064ff',
|
||
'#ff8a3b',
|
||
'#8cd26d',
|
||
'#2aa1ff',
|
||
];
|
||
return {
|
||
chart: null
|
||
};
|
||
},
|
||
computed: {
|
||
gasChartMsg() {
|
||
return this.$store.state.websocket.sumGasInfo
|
||
},
|
||
energyWeekTrend() {
|
||
return this.$store.state.websocket.energyWeekTrend
|
||
},
|
||
energyMonthTrend() {
|
||
return this.$store.state.websocket.energyMonthTrend
|
||
},
|
||
energyYearTrend() {
|
||
return this.$store.state.websocket.energyYearTrend
|
||
}
|
||
},
|
||
watch: {
|
||
energyWeekTrend: {// 监听周电能,更新图
|
||
handler(newVal, oldVal) {
|
||
if (this.chartTime === '周' && this.chartType === '电耗能') {
|
||
this.updateChart()
|
||
}
|
||
}
|
||
},
|
||
energyMonthTrend: {// 监听月电能,更新图
|
||
handler(newVal, oldVal) {
|
||
if (this.chartTime === '月' && this.chartType === '电耗能') {
|
||
this.updateChart()
|
||
}
|
||
}
|
||
},
|
||
energyYearTrend: {// 监听年电能,更新图
|
||
handler(newVal, oldVal) {
|
||
if (this.chartTime === '年' && this.chartType === '电耗能') {
|
||
this.updateChart()
|
||
}
|
||
}
|
||
},
|
||
gasChartMsg: {// 监听天然气,更新图
|
||
handler(newVal, oldVal) {
|
||
if (this.chartType === '天然气I' || this.chartType === '天然气II') {
|
||
this.updateChart()
|
||
}
|
||
}
|
||
},
|
||
chartTime: {// 监听时间变化,更新图
|
||
handler(newVal, oldVal) {
|
||
this.updateChart()
|
||
}
|
||
},
|
||
chartType: {// 监听能源类型变化,更新图
|
||
handler(newVal, oldVal) {
|
||
this.updateChart()
|
||
}
|
||
}
|
||
},
|
||
mounted() {
|
||
this.$el.addEventListener('resize', () => {
|
||
console.log('resziing.....');
|
||
});
|
||
this.updateChart()
|
||
},
|
||
methods: {
|
||
updateChart() {
|
||
let gasName = ''
|
||
const colors = ['#FFCB59'];
|
||
let temp = []
|
||
let seriesData = []
|
||
let xData = []
|
||
let yData = []
|
||
switch (this.chartType) {
|
||
case '电耗能':{
|
||
gasName = '电耗能'
|
||
if (this.chartTime === '周') {
|
||
temp = this.energyWeekTrend || []
|
||
}else if(this.chartTime === '月') {
|
||
temp = this.energyMonthTrend || []
|
||
}else{
|
||
temp = this.energyYearTrend || []
|
||
}
|
||
temp && temp.map(i => {
|
||
xData.push(i.time)
|
||
yData.push(i.qty)
|
||
})
|
||
break;
|
||
}
|
||
case '天然气I':{
|
||
if (this.chartTime === '周') {
|
||
yData = this.gasChartMsg.hisSumGas1For7Day || []
|
||
}else if(this.chartTime === '月') {
|
||
yData = this.gasChartMsg.sumGas1ForMonth || []
|
||
}else{
|
||
yData = this.gasChartMsg.sumGas1ForYear || []
|
||
}
|
||
gasName = '天然气I'
|
||
xData = this.getXdata()
|
||
break;
|
||
}
|
||
default:
|
||
gasName = '天然气II'
|
||
if (this.chartTime === '周') {
|
||
yData = this.gasChartMsg.hisSumGas2For7Day || []
|
||
}else if(this.chartTime === '月') {
|
||
yData = this.gasChartMsg.sumGas2ForMonth || []
|
||
}else{
|
||
yData = this.gasChartMsg.sumGas2ForYear || []
|
||
}
|
||
xData = this.getXdata()
|
||
}
|
||
if (yData.length == 0) {
|
||
seriesData = []
|
||
}else {
|
||
seriesData = [{
|
||
name: gasName,
|
||
data: yData,
|
||
type: "line",
|
||
areaStyle: {
|
||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||
{ offset: 0, color: '#FFCB59' + "40" },
|
||
{ offset: 0.5, color: '#FFCB59' + "20" },
|
||
{ offset: 1, color: '#FFCB59' + "00" },
|
||
]),
|
||
},
|
||
lineStyle: {
|
||
width: 1
|
||
},
|
||
symbolSize: 1,
|
||
emphasis: {
|
||
focus: 'series'
|
||
}
|
||
}]
|
||
|
||
}
|
||
// 绘图
|
||
if (
|
||
this.chart !== null &&
|
||
this.chart !== '' &&
|
||
this.chart !== undefined
|
||
) {
|
||
this.chart.dispose() // 页面多次刷新会出现警告,Dom已经初始化了一个实例,这是销毁实例
|
||
}
|
||
this.chart = echarts.init(this.$el);
|
||
var option = {
|
||
color: colors,
|
||
grid: { top: 32, right: 12, bottom: 20, left: 60 },
|
||
xAxis: {
|
||
type: 'category',
|
||
data: xData,
|
||
axisLabel: {
|
||
color: '#fff',
|
||
fontSize: 12,
|
||
},
|
||
axisTick: { show: false },
|
||
axisLine: {
|
||
lineStyle: {
|
||
width: 1,
|
||
color: '#213259',
|
||
},
|
||
},
|
||
},
|
||
yAxis: {
|
||
name: '单位m³/h',
|
||
nameTextStyle: {
|
||
color: '#fff',
|
||
fontSize: 10,
|
||
align: 'right',
|
||
},
|
||
type: 'value',
|
||
axisLabel: {
|
||
color: '#fff',
|
||
fontSize: 12,
|
||
},
|
||
axisLine: {
|
||
show: true,
|
||
lineStyle: {
|
||
color: '#213259',
|
||
},
|
||
},
|
||
splitLine: {
|
||
lineStyle: {
|
||
color: '#213259a0',
|
||
},
|
||
},
|
||
},
|
||
series: seriesData,
|
||
tooltip: {
|
||
trigger: 'axis',
|
||
className: "gas-tooltip"
|
||
},
|
||
}
|
||
option && this.chart.setOption(option)
|
||
},
|
||
getXdata() {
|
||
const today = new Date();
|
||
const currentYear = today.getFullYear();
|
||
const currentMonth = today.getMonth() + 1;
|
||
let days = 30;
|
||
if (this.chartTime === '周') {
|
||
return Array(7)
|
||
.fill(1)
|
||
.map((_, index) => {
|
||
const today = new Date();
|
||
const dtimestamp = today - (index+1) * 24 * 60 * 60 * 1000;
|
||
return `${new Date(dtimestamp).getMonth() + 1}.${new Date(
|
||
dtimestamp
|
||
).getDate()}`;}).reverse()
|
||
}else if (this.chartTime == "月") {
|
||
if (currentMonth in [1, 3, 5, 7, 8, 10, 12]) {
|
||
days = 31;
|
||
} else if (currentMonth == 2) {
|
||
days = this.isLeapYear(currentYear) ? 29 : 28;
|
||
}
|
||
return Array(days)
|
||
.fill(1)
|
||
.map((_, index) => {
|
||
return `${currentMonth}.${days - index}`;}).reverse()
|
||
} else {
|
||
return Array(12)
|
||
.fill(1)
|
||
.map((_, index) => {
|
||
return `${currentYear}.${12 - index}`;}).reverse()
|
||
}
|
||
},
|
||
isLeapYear(year) {
|
||
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
|
||
}
|
||
},
|
||
};
|
||
</script>
|
||
|
||
<style scoped lang="scss">
|
||
.gas-chart {
|
||
width: 100%;
|
||
height: 100%;
|
||
}
|
||
</style>
|
||
<style>
|
||
.gas-tooltip {
|
||
background: #0a2b4f77 !important;
|
||
border: none !important;
|
||
backdrop-filter: blur(12px);
|
||
}
|
||
.gas-tooltip * {
|
||
color: #fff !important;
|
||
}
|
||
</style>
|