新型管道消毒机前端代码
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.
 
 
 
 

590 lines
15 KiB

<template>
<div class="seal_test_container">
<div class="left_container">
<div class="title_wrap">
<img class="icon" :src="SealPng" alt="" />
<div class="title">实时压力表</div>
</div>
<div class="echarts_box" id="seal_echarts"></div>
<div class="oper_box">
<div class="air_box">
<p class="box"></p>
<p class="tit">测试前气压</p>
<p class="num">
{{
sealStore.oldAirPressure != null
? sealStore.oldAirPressure
: '--'
}}KPa
</p>
</div>
<img
class="air_img"
v-if="!sealStore.isStartTest"
@click="newStartTest(1)"
:src="StartTest"
alt=""
/>
<img
class="air_img"
@click="newStartTest(2)"
v-if="sealStore.isStartTest"
:src="StopTest"
alt=""
/>
<!-- <input
type="number"
placeholder="第一次"
v-model="sleepVal1"
style="width: 100px; height: 100px"
/>
<input
type="number"
placeholder="第二次"
v-model="sleepVal2"
style="width: 100px; height: 100px"
/> -->
</div>
</div>
<div class="right_container">
<div class="header">
<div class="left">
<img :src="TestIcon" class="icon" alt="" />
<p class="title">密封测试</p>
</div>
<p class="en">SEAL</p>
</div>
<div class="oper_box">
<div class="emp_box">
<div class="title">测试时间</div>
<div class="num">
{{ resultTime ? resultTime : '未开始' }}
</div>
</div>
<div class="emp_box">
<div class="title">气压差值</div>
<div class="num">
{{
sealStore.differenceValue != null
? `${sealStore.differenceValue}KPa`
: '未开始'
}}
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import * as echarts from 'echarts'
import { ref, onMounted, onBeforeUnmount, watch } from 'vue'
import SealPng from '@/assets/img/seal/seal.png'
import TestIcon from '@/assets/img/seal/test.png'
import StartTest from '@/assets/img/seal/starttest.png'
import StopTest from '@/assets/img/seal/stoptest.png'
import {
someAirSwitchJSON,
airCompressor_setStateJSON,
airCompressorGetPressureDirectIntervalJSON,
airCompressor_channelCtrlJSON,
AirInletProportionalValve_setStateJSON,
AirOutletProportionalValve_setStateJSON,
airCompressorGetPressureDirectJSON,
airCompressorSetValve1JSON,
airCompressorSetValve2JSON,
airCompressorChannelSelectJSON,
AirOutletProportionalValve_getStateJSON,
airInletProportionalValve_getStateJSON,
} from '@/mock/command'
import { useSealStore, useTestStore, useWebSocketStore } from '@/store'
import { storeToRefs } from 'pinia'
const sealStore = useSealStore()
const testStore = useTestStore()
const websocketStore = useWebSocketStore()
const { airInletProportionalInitVal, airOutletProportionalInitVal } =
storeToRefs(sealStore)
const sealCharts = ref(null)
const sealOptions = ref({
series: [
{
type: 'gauge',
min: 0,
max: 800,
progress: {
show: true,
width: 18,
itemStyle: {
color: '#3442aa',
},
},
pointer: {
itemStyle: {
color: '#3442aa',
},
},
axisLine: {
lineStyle: {
width: 18,
},
},
axisTick: {
show: false,
},
splitLine: {
length: 15,
lineStyle: {
width: 2,
color: '#999',
},
},
axisLabel: {
distance: 25,
color: '#999',
fontSize: 20,
},
anchor: {
show: true,
showAbove: true,
size: 25,
itemStyle: {
borderWidth: 10,
borderColor: '#3442aa',
},
},
title: {
show: false,
},
detail: {
valueAnimation: true,
fontSize: 40,
color: '#3442aa',
formatter: '{value} KPa',
offsetCenter: [0, '70%'],
},
data: [
{
value: sealStore.currentAirPressure,
},
],
},
],
})
const n_sec = ref(0) // 秒
const n_min = ref(0) // 分
const n_hour = ref(0) // 时
const resultTime = ref('')
const timerStart = ref(null)
const timerReal = () => {
var str_sec = n_sec.value
var str_min = n_min.value
var str_hour = n_hour.value
if (n_sec.value < 10) {
str_sec = '0' + n_sec.value
}
if (n_min.value < 10) {
str_min = '0' + n_min.value
}
if (n_hour.value < 10) {
str_hour = '0' + n_hour.value
}
resultTime.value = str_hour + ':' + str_min + ':' + str_sec
n_sec.value = n_sec.value + 1
if (n_sec.value > 59) {
n_sec.value = 0
n_min.value = n_min.value + 1
}
if (n_min.value > 59) {
n_min.value = 0
n_hour.value = n_hour.value + 1
}
}
watch(
() => sealStore.isStartTest,
(newValue, oldValue) => {
if (!newValue) {
stopTimer()
}
},
)
const stopTimer = () => {
// 改变测试前oldAirPressure为null
sealStore.updateOldAirPressure(null)
// 结束测试时将时间重置null
clearInterval(timerStart.value)
timerStart.value = null
resultTime.value = null
n_sec.value = 0
n_min.value = 0
n_hour.value = 0
sealStore.updateIsStartTest(false)
}
const timerFunc = () => {
timerReal()
timerStart.value = setInterval(() => {
timerReal()
}, 1000)
}
const wait = async ms => {
await new Promise(resolve => setTimeout(resolve, ms))
}
const sleepVal1 = ref(1)
const sleepVal2 = ref(5)
const newStartTest = async flag => {
if (flag == 1) {
// 开始测试
// 启动计时器
timerFunc()
sealStore.updateIsStartTest(true)
// 空压机选通阀切换到通道2(空气)
websocketStore.sendCommandMsg(airCompressorChannelSelectJSON([2]))
// 空压机电子阀1打开 空压机电子阀2打开
websocketStore.sendCommandMsg(airCompressorSetValve1JSON([1]))
websocketStore.sendCommandMsg(airCompressorSetValve2JSON([1]))
// 风机入口比例阀闭合 风机出口比例阀闭合
websocketStore.sendCommandMsg(AirInletProportionalValve_setStateJSON([0]))
websocketStore.sendCommandMsg(AirOutletProportionalValve_setStateJSON([0]))
// 空压机打开
websocketStore.sendCommandMsg(airCompressor_setStateJSON([1]))
// 等待1s
await wait(sleepVal1.value * 1000)
// 空压机关闭
websocketStore.sendCommandMsg(airCompressor_setStateJSON([0]))
// 空压机电子阀1关闭 空压机电子阀2关闭
websocketStore.sendCommandMsg(airCompressorSetValve1JSON([0]))
websocketStore.sendCommandMsg(airCompressorSetValve2JSON([0]))
// 空压机选通阀切换到通道1 (入气口)
websocketStore.sendCommandMsg(airCompressorChannelSelectJSON([1]))
// 等待5s
await wait(sleepVal2.value * 1000)
// 记录当前压力数值作为初始压力值
websocketStore.sendCommandMsg(airCompressorGetPressureDirectJSON)
}
if (flag == 2) {
// 停止测试
/**
* 空压机电子阀1打开
* 空压机电子阀2打开
* 空压机选通阀切换到通道1
* 风机入口比例阀恢复
* 风机出口比例阀恢复
*/
websocketStore.sendCommandMsg(airCompressorSetValve1JSON([1]))
websocketStore.sendCommandMsg(airCompressorSetValve2JSON([1]))
websocketStore.sendCommandMsg(airCompressorChannelSelectJSON([1]))
// 数值为刚开始记录的数值
websocketStore.sendCommandMsg(
AirInletProportionalValve_setStateJSON([
airInletProportionalInitVal.value[0],
]),
)
websocketStore.sendCommandMsg(
AirOutletProportionalValve_setStateJSON([
airOutletProportionalInitVal.value[0],
]),
)
// 停止计时器
stopTimer()
}
}
const timer = ref(null)
const timerData = ref(null)
onBeforeUnmount(() => {
clearInterval(timerData.value)
clearInterval(timer.value)
clearInterval(timerStart.value)
})
onMounted(() => {
// 需要记录当前的风机入口出口比例阀数值
sealCharts.value = echarts.init(document.getElementById('seal_echarts'))
sealCharts.value.setOption(sealOptions.value)
timer.value = setInterval(() => {
sealCharts.value.setOption({
series: [
{
type: 'gauge',
min: 0,
max: 800,
progress: {
show: true,
width: 18,
itemStyle: {
color: '#3442aa',
},
},
pointer: {
itemStyle: {
color: '#3442aa',
},
},
axisLine: {
lineStyle: {
width: 18,
},
},
axisTick: {
show: false,
},
splitLine: {
length: 15,
lineStyle: {
width: 2,
color: '#999',
},
},
axisLabel: {
distance: 25,
color: '#999',
fontSize: 20,
},
anchor: {
show: true,
showAbove: true,
size: 25,
itemStyle: {
borderWidth: 10,
borderColor: '#3442aa',
},
},
title: {
show: false,
},
detail: {
valueAnimation: true,
fontSize: 40,
color: '#3442aa',
formatter: '{value} KPa',
offsetCenter: [0, '70%'],
},
data: [
{
value: sealStore.currentAirPressure,
},
],
},
],
})
}, 1000)
websocketStore.sendCommandMsg(airInletProportionalValve_getStateJSON)
websocketStore.sendCommandMsg(AirOutletProportionalValve_getStateJSON)
timerData.value = setInterval(() => {
websocketStore.sendCommandMsg(airCompressorGetPressureDirectIntervalJSON)
}, 100)
})
</script>
<style lang="scss" scoped>
.seal_test_container {
margin-bottom: 19px;
height: 580px;
box-sizing: border-box;
border-radius: 16px;
display: flex;
align-items: center;
.left_container {
margin-right: 30px;
width: 766px;
height: 580px;
box-sizing: border-box;
border-radius: 16px;
background: #ffffff;
position: relative;
.title_wrap {
position: absolute;
left: 28px;
top: 28px;
width: 141px;
height: 31px;
box-sizing: border-box;
display: flex;
align-items: center;
.title {
font-family: 思源黑体;
font-size: 20px;
font-weight: bold;
line-height: normal;
letter-spacing: 0.02em;
font-feature-settings: 'kern' on;
color: #000000;
margin-left: 9px;
}
.icon {
width: 30px;
height: 30px;
}
}
.oper_box {
position: absolute;
left: 28px;
bottom: 28px;
width: 710px;
height: 110px;
display: flex;
align-items: center;
justify-content: space-between;
.air_img {
width: 341px;
height: 110px;
}
.air_box {
width: 341px;
height: 110px;
border-radius: 16px;
background: #f6f6f6;
display: flex;
align-items: center;
justify-content: center;
.box {
width: 16px;
height: 16px;
background: #4359b9;
margin-right: 6px;
}
.tit {
font-family: 思源黑体;
font-size: 20px;
font-weight: normal;
line-height: normal;
letter-spacing: 0.06em;
font-feature-settings: 'kern' on;
color: #3d3d3d;
margin-right: 8px;
}
.num {
font-family: Source Han Sans;
font-size: 30px;
font-weight: bold;
line-height: normal;
letter-spacing: 0.06em;
font-feature-settings: 'kern' on;
color: #4359b9;
}
}
}
.echarts_box {
height: 580px;
position: absolute;
left: 0;
top: -36px;
width: 100%;
}
}
.right_container {
height: 580px;
box-sizing: border-box;
border-radius: 16px;
background: #ffffff;
flex: 1;
padding: 32px 42px;
.header {
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
width: 340px;
height: 45px;
border-radius: 245px;
background: #06518b;
padding-left: 17px;
padding-right: 24px;
margin-bottom: 20px;
.left {
display: flex;
align-items: center;
.icon {
width: 16px;
height: 16px;
}
.title {
font-family: 思源黑体;
font-size: 14px;
font-weight: normal;
line-height: normal;
letter-spacing: 0.1em;
margin-left: 9px;
color: #ffffff;
}
}
.en {
font-family: 思源黑体;
font-size: 12px;
font-weight: normal;
line-height: normal;
letter-spacing: 0.1em;
color: #ffffff;
}
}
.oper_box {
width: 340px;
height: 455px;
border-radius: 16px;
background: #f6f6f6;
box-sizing: border-box;
padding: 20px;
.emp_box {
width: 300px;
height: 198px;
border-radius: 12px;
background: #fff;
margin-bottom: 20px;
box-sizing: border-box;
padding-top: 16px;
padding-left: 27px;
padding-right: 27px;
padding-bottom: 20px;
display: flex;
flex-direction: column;
.title {
font-family: Source Han Sans;
font-size: 16px;
font-weight: 500;
line-height: normal;
letter-spacing: 0.06em;
font-feature-settings: 'kern' on;
color: #06518b;
}
.num {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
font-family: 思源黑体;
font-size: 30px;
font-weight: bold;
line-height: normal;
letter-spacing: 0.1em;
color: #000000;
border-radius: 12px;
background: #fafafa;
box-sizing: border-box;
}
}
.test_png {
width: 300px;
height: 50px;
}
}
}
}
// input[type='number']::-webkit-inner-spin-button,
// input[type='number']::-webkit-outer-spin-button,
// input[type='datetime']::-webkit-inner-spin-button,
// input[type='datetime']::-webkit-outer-spin-button {
// /* 设置箭头按钮的宽度和高度 */
// width: 50px;
// height: 100px;
// }
</style>