大空间消毒机
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.
 
 
 
 

721 lines
19 KiB

<template>
<div class="progress_container">
<div class="header_wrap">
<div class="left_time">
<p class="time">
{{
operatorStore.estimatedRemainingTimeS == 0
? '已结束'
: `${time_To_hhmmss(operatorStore.estimatedRemainingTimeS)}`
}}
</p>
</div>
<svg
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
fill="none"
version="1.1"
width="181"
height="52"
viewBox="0 0 181 52"
>
<g>
<g>
<g>
<path
d="M82.64,13.3438C81.84,15.7875,80.28,18.9925,79.12,21.0362L83.28,22.5987C84.52000000000001,20.6756,86,17.8306,87.28,15.0263L82.64,13.3438ZM62.72,15.4269C64.28,17.7506,65.84,20.8756,66.36,22.8794L70.72,20.8356C70.08,18.7925,68.4,15.8275,66.8,13.6244L62.72,15.4269ZM52,16.1481C54.480000000000004,17.4706,57.56,19.5537,59,21.0762L61.96,17.35C60.4,15.8675,57.24,13.9444,54.8,12.7825L52,16.1481ZM50.12,26.76C52.68,28.08,55.88,30.2,57.32,31.72L60.24,27.96C58.6,26.48,55.36,24.56,52.84,23.36L50.12,26.76ZM51.24,46.76L55.480000000000004,49.84C57.6,45.8,59.84,41.12,61.68,36.84L58.16,33.92C55.96,38.64,53.2,43.68,51.24,46.76ZM68.68,35.08L80.88,35.08L80.88,38.08L68.68,38.08L68.68,35.08ZM68.68,31.04L68.68,28.08L80.88,28.08L80.88,31.04L68.68,31.04ZM72.48,12.4225L72.48,23.64L64,23.64L64,49.9606L68.68,49.9606L68.68,42.12L80.88,42.12L80.88,44.76C80.88,45.28,80.68,45.48,80.03999999999999,45.52C79.44,45.52,77.32,45.52,75.48,45.4C76.12,46.64,76.76,48.64,76.92,49.92C79.96000000000001,49.92,82.08,49.88,83.6,49.12C85.12,48.4,85.56,47.12,85.56,44.84L85.56,23.64L77.32,23.64L77.32,12.4225L72.48,12.4225ZM121.2,33.76L121.08,35.92L114.16,35.92L115.16,35.36C115,34.88,114.64,34.32,114.16,33.76L121.2,33.76ZM100.72,30.32C100.6,32.08,100.44,34,100.24000000000001,35.92L94.28,35.92L94.28,39.44L99.88,39.44C99.6,41.56,99.36,43.52,99.08,45.12L119.96,45.12C119.8,45.6,119.64,45.88,119.48,46.08C119.12,46.52,118.76,46.6,118.08,46.6C117.36,46.64,115.8,46.6,114.08,46.44C114.6,47.36,115.08,48.84,115.12,49.8C117.2,49.8812,119.2,49.9219,120.44,49.72C121.72,49.6,122.8,49.28,123.68,48.2C124.12,47.64,124.52,46.68,124.84,45.12L129.44,45.12L129.44,41.68L125.36,41.68L125.56,39.44L131.72,39.44L131.72,35.92L125.84,35.92L126.04,32.16C126.08,31.6,126.12,30.32,126.12,30.32L100.72,30.32ZM110.08,34.24C110.56,34.72,111,35.32,111.4,35.92L104.96000000000001,35.92L105.16,33.76L111,33.76L110.08,34.24ZM120.84,39.44L120.6,41.68L113.68,41.68L114.96,41C114.76,40.52,114.4,39.96,113.96,39.44L120.84,39.44ZM109.75999999999999,39.88C110.28,40.4,110.8,41.04,111.16,41.68L104.32,41.68L104.6,39.44L110.6,39.44L109.75999999999999,39.88ZM110.52000000000001,12.4262L110.52000000000001,15.36L97.2,15.36L97.2,18.72L110.52000000000001,18.72L110.52000000000001,20.36L99.88,20.36L99.88,23.68L110.52000000000001,23.68L110.52000000000001,25.4L95.36,25.4L95.36,28.88L130.64,28.88L130.64,25.4L115.44,25.4L115.44,23.68L126.64,23.68L126.64,20.36L115.44,20.36L115.44,18.72L129.36,18.72L129.36,15.36L115.44,15.36L115.44,12.4262L110.52000000000001,12.4262ZM154.36,12.4231L154.36,19.4L140.51999999999998,19.4L140.51999999999998,39.6838L145.32,39.6838L145.32,37.48L154.36,37.48L154.36,50.0187L159.44,50.0187L159.44,37.48L168.51999999999998,37.48L168.51999999999998,39.4831L173.56,39.4831L173.56,19.4L159.44,19.4L159.44,12.4231L154.36,12.4231ZM145.32,32.76L145.32,24.12L154.36,24.12L154.36,32.76L145.32,32.76ZM168.51999999999998,32.76L159.44,32.76L159.44,24.12L168.51999999999998,24.12L168.51999999999998,32.76Z"
fill="#17F179"
fill-opacity="1"
/>
</g>
<g transform="matrix(0,1,-1,0,52,-22)">
<path
d="M61.3114,50.5847L56.491,45.7322C62.778400000000005,44.923500000000004,67.8084,39.8689,67.8084,33.8033C67.8084,27.9399,63.1976,22.88525,57.1198,21.87432L52.7186,17.62841L54.6048,17.62841C64.24549999999999,17.62841,72,24.9071,72,33.8033C72,39.8689,68.2276,45.3279,62.988,47.9563L62.988,52L61.3114,50.5847ZM56.7006,49.776C56.0719,49.776,55.2335,49.9781,54.3952,49.9781C44.75449,49.9781,37,42.6995,37,33.8033C37,27.7377,40.77246,22.27869,46.01198,19.650280000000002L46.01198,15L48.7365,17.62842L52.9281,21.67213C46.43114,22.27869,41.4012,27.5355,41.4012,33.8033C41.4012,39.8689,46.22156,44.923500000000004,52.509,45.7322L56.7006,49.776Z"
fill="#17F179"
fill-opacity="1"
/>
</g>
</g>
</g>
</svg>
<div
class="btn"
v-if="[1, 2].includes(operatorStore.disinfectStatus)"
@click="stopDisinfect"
>
结束消毒
</div>
<div
class="btn"
v-if="operatorStore.disinfectStatus == 0"
@click="showDetail"
>
返回
</div>
</div>
<div class="echarts_wrap">
<div class="single_wrap">
<p class="title">设备温度/湿度/过氧化氢浓度</p>
<div
class="echarts_box"
id="bin"
v-if="operatorStore.disinfectStatus != 0 || binLocal"
></div>
</div>
<div class="single_wrap">
<p class="title">环境1/湿度/过氧化氢浓度</p>
<div
class="echarts_box"
id="envir1"
v-if="operatorStore.disinfectStatus != 0 || envir1Local"
></div>
</div>
<div class="single_wrap">
<p class="title">环境2/湿度/过氧化氢浓度</p>
<div
class="echarts_box"
id="envir2"
v-if="operatorStore.disinfectStatus != 0 || envir2Local"
></div>
</div>
</div>
<div class="detail_wrap">
<div class="detail" @click="showDetail">详情</div>
</div>
</div>
</template>
<script setup>
import { useOperatorStore, useWebSocketStore, useEchartsStore } from '@/store'
import { time_To_hhmmss } from '@/utils'
import {
stopDisinfectionJSON,
getStateJSON,
continueDisinfectionJSON,
pauseDisinfectionJSON,
} from '@/mock/command'
import { onMounted, onUnmounted, ref, computed, watch } from 'vue'
import * as echarts from 'echarts'
import { storeToRefs } from 'pinia'
const echartsStore = useEchartsStore()
const binLocal = computed(() => {
return echartsStore?.binCharts || localStorage.getItem('bin')
})
const envir1Local = computed(() => {
return echartsStore?.envir1Charts || localStorage.getItem('envir1')
})
const envir2Local = computed(() => {
return echartsStore?.envir2Charts || localStorage.getItem('envir2')
})
const binOption = ref({
tooltip: {
trigger: 'axis',
},
legend: {
data: ['温度', '湿度', 'H2O2浓度', 'H2O2饱和度'],
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: echartsStore.abscissaFormater,
},
yAxis: {
type: 'value',
},
series: [
{
name: '温度',
type: 'line',
stack: 'binTemp',
data: echartsStore.binTemp,
},
{
name: '湿度',
type: 'line',
stack: 'binHumidity',
data: echartsStore.binHumidity,
},
{
name: 'H2O2浓度',
type: 'line',
stack: 'binHP',
data: echartsStore.binHP,
},
{
name: 'H2O2饱和度',
type: 'line',
stack: 'binSaturation',
data: echartsStore.binSaturation,
},
],
})
const envir1Option = ref({
tooltip: {
trigger: 'axis',
},
legend: {
data: ['温度', '湿度', 'H2O2浓度', 'H2O2饱和度'],
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: echartsStore.abscissaFormater,
},
yAxis: {
type: 'value',
},
series: [
{
name: '温度',
type: 'line',
stack: '1',
data: [],
},
{
name: '湿度',
type: 'line',
stack: '2',
data: [],
},
{
name: 'H2O2浓度',
type: 'line',
stack: '3',
data: [],
},
{
name: 'H2O2饱和度',
type: 'line',
stack: '4',
data: [],
},
],
})
const envir2Option = ref({
tooltip: {
trigger: 'axis',
},
legend: {
data: ['温度', '湿度', 'H2O2浓度', 'H2O2饱和度'],
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: echartsStore.abscissaFormater,
},
yAxis: {
type: 'value',
},
series: [
{
name: '温度',
type: 'line',
stack: '1',
data: [],
},
{
name: '湿度',
type: 'line',
stack: '2',
data: [],
},
{
name: 'H2O2浓度',
type: 'line',
stack: '3',
data: [],
},
{
name: 'H2O2饱和度',
type: 'line',
stack: '4',
data: [],
},
],
})
const operatorStore = useOperatorStore()
const webSocketStore = useWebSocketStore()
const props = defineProps({
changeShowOperator: {
type: Function,
},
})
const showDetail = () => {
props.changeShowOperator(true)
}
const timer = ref(null)
const binCharts = ref(null)
const envir1Charts = ref(null)
const envir2Charts = ref(null)
const time1 = ref(null)
const time2 = ref(null)
onMounted(() => {
timer.value = setInterval(() => {
webSocketStore.sendCommandMsg(getStateJSON)
}, 1000)
let a = echarts.getInstanceByDom(document.getElementById('bin'))
if (a == undefined) {
binCharts.value = echarts.init(document.getElementById('bin'))
binCharts.value.setOption(binOption.value)
}
let b = echarts.getInstanceByDom(document.getElementById('envir1'))
if (b == undefined) {
envir1Charts.value = echarts.init(document.getElementById('envir1'))
envir1Charts.value.setOption(envir1Option.value)
}
let c = echarts.getInstanceByDom(document.getElementById('envir2'))
if (c == undefined) {
envir2Charts.value = echarts.init(document.getElementById('envir2'))
envir2Charts.value.setOption(envir2Option.value)
}
time1.value = setInterval(() => {
binCharts.value?.setOption({
tooltip: {
trigger: 'axis',
},
legend: {
data: ['温度', '湿度', 'H2O2浓度', 'H2O2饱和度'],
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: echartsStore.abscissaFormater,
},
yAxis: {
type: 'value',
},
series: [
{
name: '温度',
type: 'line',
stack: 'binTemp',
data: echartsStore.binTemp,
},
{
name: '湿度',
type: 'line',
stack: 'binHumidity',
data: echartsStore.binHumidity,
},
{
name: 'H2O2浓度',
type: 'line',
stack: 'binHP',
data: echartsStore.binHP,
},
{
name: 'H2O2饱和度',
type: 'line',
stack: 'binSaturation',
data: echartsStore.binSaturation,
},
],
})
envir1Charts.value?.setOption({
tooltip: {
trigger: 'axis',
},
legend: {
data: ['温度', '湿度', 'H2O2浓度', 'H2O2饱和度'],
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: echartsStore.abscissaFormater,
},
yAxis: {
type: 'value',
},
series: [
{
name: '温度',
type: 'line',
stack: '1',
data: [],
},
{
name: '湿度',
type: 'line',
stack: '2',
data: [],
},
{
name: 'H2O2浓度',
type: 'line',
stack: '3',
data: [],
},
{
name: 'H2O2饱和度',
type: 'line',
stack: '4',
data: [],
},
],
})
envir2Charts.value?.setOption({
tooltip: {
trigger: 'axis',
},
legend: {
data: ['温度', '湿度', 'H2O2浓度', 'H2O2饱和度'],
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: echartsStore.abscissaFormater,
},
yAxis: {
type: 'value',
},
series: [
{
name: '温度',
type: 'line',
stack: '1',
data: [],
},
{
name: '湿度',
type: 'line',
stack: '2',
data: [],
},
{
name: 'H2O2浓度',
type: 'line',
stack: '3',
data: [],
},
{
name: 'H2O2饱和度',
type: 'line',
stack: '4',
data: [],
},
],
})
}, 1000 * 20)
time1.value = setInterval(() => {
binCharts.value?.setOption({
tooltip: {
trigger: 'axis',
},
legend: {
data: ['温度', '湿度', 'H2O2浓度', 'H2O2饱和度'],
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: echartsStore.abscissaFormater,
},
yAxis: {
type: 'value',
},
series: [
{
name: '温度',
type: 'line',
stack: 'binTemp',
data: echartsStore.binTemp,
},
{
name: '湿度',
type: 'line',
stack: 'binHumidity',
data: echartsStore.binHumidity,
},
{
name: 'H2O2浓度',
type: 'line',
stack: 'binHP',
data: echartsStore.binHP,
},
{
name: 'H2O2饱和度',
type: 'line',
stack: 'binSaturation',
data: echartsStore.binSaturation,
},
],
})
envir1Charts.value?.setOption({
tooltip: {
trigger: 'axis',
},
legend: {
data: ['温度', '湿度', 'H2O2浓度', 'H2O2饱和度'],
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: echartsStore.abscissaFormater,
},
yAxis: {
type: 'value',
},
series: [
{
name: '温度',
type: 'line',
stack: '1',
data: [],
},
{
name: '湿度',
type: 'line',
stack: '2',
data: [],
},
{
name: 'H2O2浓度',
type: 'line',
stack: '3',
data: [],
},
{
name: 'H2O2饱和度',
type: 'line',
stack: '4',
data: [],
},
],
})
envir2Charts.value?.setOption({
tooltip: {
trigger: 'axis',
},
legend: {
data: ['温度', '湿度', 'H2O2浓度', 'H2O2饱和度'],
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: echartsStore.abscissaFormater,
},
yAxis: {
type: 'value',
},
series: [
{
name: '温度',
type: 'line',
stack: '1',
data: [],
},
{
name: '湿度',
type: 'line',
stack: '2',
data: [],
},
{
name: 'H2O2浓度',
type: 'line',
stack: '3',
data: [],
},
{
name: 'H2O2饱和度',
type: 'line',
stack: '4',
data: [],
},
],
})
}, 1000)
})
// 监听到store中的数据变化动态更改options
onUnmounted(() => {
timer.value = null
time1.value = null
time2.value = null
})
const pauseDisinfect = () => {
if (operatorStore.disinfectStatus == 1) {
webSocketStore.sendCommandMsg(pauseDisinfectionJSON)
}
}
const stopDisinfect = () => {
if ([1, 2].includes(operatorStore.disinfectStatus)) {
webSocketStore.sendCommandMsg(stopDisinfectionJSON)
}
}
const continueDisinfect = () => {
if (operatorStore.disinfectStatus == 2) {
webSocketStore.sendCommandMsg(continueDisinfectionJSON)
}
}
</script>
<style lang="scss" scoped>
.progress_container {
margin-bottom: 19px;
height: 580px;
box-sizing: border-box;
background: #ffffff;
border-radius: 16px;
padding-bottom: 30px;
.header_wrap {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 34px;
height: 107px;
box-sizing: border-box;
padding: 13px 36px 13px 20px;
background: #f6f6f6;
border-radius: 16px 16px 0 0;
.left_time {
position: relative;
width: 377px;
height: 61px;
background: url(../assets/img/operator/time.png) no-repeat;
background-size: 100% 100%;
.time {
font-family: Source Han Sans CN;
font-size: 28px;
font-weight: bold;
line-height: normal;
letter-spacing: 0.1em;
color: #ffffff;
position: absolute;
left: 165px;
top: 9px;
width: 178px;
height: 41px;
text-align: center;
}
}
.btn {
padding: 12px 28px;
box-sizing: border-box;
width: 140px;
height: 50px;
border-radius: 25px;
background: #06518b;
display: flex;
align-items: center;
justify-content: center;
font-family: Source Han Sans CN;
font-size: 20px;
font-weight: 500;
line-height: normal;
letter-spacing: 0.07em;
color: #ffffff;
}
}
.echarts_wrap {
height: 351px;
display: flex;
align-items: center;
margin-bottom: 19px;
.single_wrap {
flex: 1;
height: 351px;
.title {
font-family: Source Han Sans CN;
font-size: 14px;
font-weight: 500;
letter-spacing: 0.1em;
color: #000000;
margin-bottom: 24px;
padding-left: 11px;
}
.echarts_box {
width: 380px;
height: 308px;
}
}
}
.detail_wrap {
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 16px;
.detail {
width: 105px;
height: 40px;
border-radius: 20px;
background: #06518b;
display: flex;
align-items: center;
justify-content: center;
font-family: Source Han Sans CN;
font-size: 18px;
font-weight: normal;
letter-spacing: 0.1em;
color: #ffffff;
}
}
}
</style>