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.
149 lines
3.8 KiB
149 lines
3.8 KiB
<script lang="ts" setup>
|
|
import * as echarts from 'echarts'
|
|
import { formatDateTime } from 'libs/utils'
|
|
import { onMounted, ref, watch } from 'vue'
|
|
|
|
const props = defineProps<{
|
|
envData: any
|
|
}>()
|
|
|
|
const titles = {
|
|
Internal: '仓内',
|
|
WiredExtSensor: '探头',
|
|
WirelessExtSensor: '探头',
|
|
}
|
|
|
|
watch(
|
|
() => props.envData,
|
|
(newValue) => {
|
|
if (!chartRef.value) {
|
|
return
|
|
}
|
|
let myChart = echarts.getInstanceByDom(chartRef.value)
|
|
if (!myChart) {
|
|
myChart = echarts.init(chartRef.value, null, { renderer: 'svg' })
|
|
}
|
|
const option = {
|
|
title: {
|
|
text: (titles[newValue?.type || ''] || '') + (newValue.type !== 'Internal' ? newValue?.id || '' : ''),
|
|
left: 'center', // 水平居中
|
|
top: 0,
|
|
},
|
|
grid: {
|
|
top: 100,
|
|
},
|
|
tooltip: {
|
|
trigger: 'axis',
|
|
position: [10, 10],
|
|
formatter: (params: any[]) => {
|
|
if (!params || !params.length)
|
|
return ''
|
|
const time = params[0].axisValue
|
|
let html = `<div>${time}</div>`
|
|
|
|
params.forEach((item) => {
|
|
let unit = ''
|
|
switch (item.seriesName) {
|
|
case '温度':
|
|
unit = ' ℃'
|
|
break
|
|
case '相对湿度':
|
|
unit = ' %RH'
|
|
break
|
|
case 'H₂O₂浓度':
|
|
unit = ' ppm'
|
|
break
|
|
case 'H₂O₂相对饱和度':
|
|
unit = ' %RS'
|
|
break
|
|
}
|
|
// item.marker 就是 echarts 自动给你的小彩点
|
|
html += `<div>${item.marker} ${item.seriesName}: ${item.data}${unit}</div>`
|
|
})
|
|
return html
|
|
},
|
|
},
|
|
legend: {
|
|
data: ['温度', '相对湿度', 'H₂O₂浓度', 'H₂O₂相对饱和度'],
|
|
orient: 'horizontal', // 水平布局
|
|
itemWidth: 10, // 图例图形宽度
|
|
itemHeight: 10, // 图例图形高度
|
|
columnWidth: 80, // 每列宽度,可按需调整
|
|
top: '5%', // 距离容器顶部距离
|
|
left: 'center', // 水平居中
|
|
},
|
|
xAxis: {
|
|
type: 'category',
|
|
boundaryGap: false,
|
|
data: newValue.data?.map(item => formatDateTime('HH:mm:ss', item.timestamp)),
|
|
},
|
|
yAxis: {
|
|
type: 'value',
|
|
},
|
|
series: [
|
|
{
|
|
name: '温度',
|
|
type: 'line',
|
|
data: newValue.data?.map(item => item.temp.toFixed(2)),
|
|
symbol: 'circle',
|
|
symbolSize: 2,
|
|
lineStyle: {
|
|
color: '#1e90ff',
|
|
width: 1,
|
|
},
|
|
},
|
|
{
|
|
name: '相对湿度',
|
|
type: 'line',
|
|
data: newValue.data?.map(item => item.rh.toFixed(2)),
|
|
symbol: 'circle',
|
|
symbolSize: 2,
|
|
lineStyle: {
|
|
color: '#32cd32',
|
|
width: 1,
|
|
},
|
|
},
|
|
{
|
|
name: 'H₂O₂浓度',
|
|
type: 'line',
|
|
data: newValue.data?.map(item => item.h2o2.toFixed(2)),
|
|
symbol: 'circle',
|
|
symbolSize: 2,
|
|
lineStyle: {
|
|
color: '#ffd700',
|
|
width: 1,
|
|
},
|
|
},
|
|
{
|
|
name: 'H₂O₂相对饱和度',
|
|
type: 'line',
|
|
data: newValue.data?.map(item => item.rs.toFixed(2)),
|
|
symbol: 'circle',
|
|
symbolSize: 2,
|
|
lineStyle: {
|
|
color: '#ff0000',
|
|
width: 1,
|
|
},
|
|
},
|
|
],
|
|
}
|
|
myChart.setOption(option)
|
|
myChart.resize()
|
|
},
|
|
{
|
|
deep: true,
|
|
},
|
|
)
|
|
|
|
const chartRef = ref<HTMLElement | null>(null)
|
|
|
|
onMounted(() => {
|
|
echarts.init(chartRef.value, null, { renderer: 'svg' })
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<div ref="chartRef" style="height: 100%; width: 50%" />
|
|
</template>
|
|
|
|
<style scoped></style>
|