消毒机设备
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.
 
 
 
 
 

380 lines
9.6 KiB

<script lang="ts" setup>
import { sendCmd, subscribeEvent, syncSendCmd } from 'apis/system'
import homeFinish from 'assets/images/home/home-finish.svg'
import homeStart from 'assets/images/home/home-start.svg'
import SealInstrumentSvg from 'assets/images/seal/seal-instrument.svg'
import SoftKeyboard from 'components/common/SoftKeyboard/index.vue'
import DashboardChart from 'components/seal/DashboardChart.vue'
import { startPosityveTimer, stopPosityveTimer } from 'libs/timer'
import { computed, onMounted, ref, watch, watchEffect } from 'vue'
import { getDeviceStatus } from '@/libs/deviceComm'
import { FtMessage } from '@/libs/message'
import { FtMessageBox } from '@/libs/messageBox'
import { useSealStore } from '@/stores/sealStore'
import { useSystemStore } from '@/stores/systemStore'
defineOptions({
name: 'Seal',
})
const sealStore = useSealStore()
const systemStore = useSystemStore()
const sealInfo = ref(sealStore.sealInfo)
const inputValue = ref('')
const keyboardVisible = ref(false)
const keyboardType = ref<'text' | 'number'>('number')
const softKeyboardRef = ref()
const inflationTime = ref()
const sealRemainTimeS = ref<string>()
const currentPressure = ref(sealStore.sealInfo.pressure)
const realTimePressure = ref(sealStore.sealInfo.pressure)
const loading = ref(false)
onMounted(() => {
// initData()
systemStore.subscribeSealEvent()
subscribeSealState()
initAirLeakConfig()
})
const getFirstPressure = () => {
// 当前气压是开始测试后,状态变为leakTesting后,6秒后获取的压力值为初始值。 由赵贺确认
if (sealInfo.value.workState === 'leakTesting') {
// 开始计时
startPosityveTimer((time) => {
sealRemainTimeS.value = time
})
loading.value = false
if (!currentPressure.value) {
currentPressure.value = realTimePressure.value
}
}
}
watchEffect(() => {
sealInfo.value = sealStore.sealInfo
realTimePressure.value = sealStore.sealInfo.pressure
getFirstPressure()
})
watch(inputValue, (newVal: string | number) => {
if (Number(newVal) < 1000) {
inflationTime.value = newVal
}
// else {
// inputValue.value = inflationTime.value
// }
})
/**
* @function 初始化打压配置
* @desc 获取打压配置
*/
const initAirLeakConfig = async () => {
const params = {
className: 'AirLeakDetectTest',
fnName: 'getServiceConfig',
}
const res = await sendCmd(params)
inflationTime.value = res.inflationTimeMs
}
const subscribeSealState = () => {
// 订阅测试状态
subscribeEvent('stateUpdate', (data: Socket.WebSocketResponse<Seal.SealStateItem>) => {
if (data.fromClass === 'AirLeakDetectTest') {
// 更新测试状态
sealStore.updateSealInfo(data.rely)
}
})
}
const stopText = computed(() => {
return sealInfo.value.workState === 'stopping' ? '停止中...' : '停止测试'
})
// const pressure = ref()
const onStartTest = () => {
const statusName = getDeviceStatus()
if (statusName) {
FtMessageBox.error(statusName)
return
}
const params = {
className: 'AirLeakDetectTest',
fnName: 'start',
params: {
inflationTimeMs: 0,
},
}
loading.value = true
syncSendCmd(params).then((res) => {
if (res.ackcode === 0) {
FtMessage.success('开始执行密封测试')
}
else {
FtMessage.error('指令发送失败,请稍候再试')
}
}).catch(() => {
FtMessage.error('指令发送失败,请稍候再试')
})
}
const onFinishTest = () => {
const stopParams = {
className: 'AirLeakDetectTest',
fnName: 'stop',
params: {},
}
loading.value = true
syncSendCmd(stopParams).then((res) => {
if (res.ackcode === 0) {
// 停止倒计时
stopPosityveTimer()
FtMessage.success('测试已停止')
sealRemainTimeS.value = ''
}
loading.value = false
}).finally(() => {
loading.value = false
})
}
const handleConfirm = (value: string) => {
console.log('确认输入:', value)
}
const stopDisabled = computed(() => {
return sealInfo.value.workState === 'stopping' || sealInfo.value.workState === 'idle'
})
const diffPressure = computed(() => {
return Number(currentPressure.value) - Number(realTimePressure.value)
})
</script>
<template>
<div v-loading="loading" class="dashboard-container">
<main class="main-content">
<div class="seal-left">
<!-- 仪表盘 -->
<div class="seal-chart">
<div class="chart-ml">
<DashboardChart />
</div>
<div class="seal-opt">
<div class="seal-status">
<div class="seal-time-text">
测试时间:
</div>
<div v-if="sealInfo.workState === 'idle'" class="seal-time-statue seal-time-text">
未开始
</div>
<div v-else class="seal-test-time">
{{ sealRemainTimeS }}
</div>
</div>
<div class="seal-status">
<div class="seal-diff-text">
测试前气压:
</div>
<div v-if="sealInfo.workState === 'idle'" class="seal-diff-statue seal-diff-text">
未开始
</div>
<div v-else class="seal-test-time">
{{ currentPressure }}
</div>
</div>
</div>
</div>
</div>
<div class="seal-right">
<div class="left-title">
<div class="title-text-test">
<img :src="SealInstrumentSvg" alt="仪表盘">
<div class="title-text">
气压差值
</div>
<div class="title-text title-text-kpa">
<span>{{ diffPressure }}</span>
<span class="title-kpa-pl">Kp</span>
</div>
</div>
</div>
<div class="seal-right-btn">
<div>
<div class="seal-add-btn">
<bt-button
button-text="启动测试"
bg-color="#31CB7A"
text-color="#FFFFFF"
width="27vw"
height="7vh"
text-size="24px"
border-radius="12px"
:disabled="sealInfo.workState !== 'idle'"
min-height="4rem"
@click="onStartTest"
>
<template #icon>
<img :src="homeStart" alt="">
</template>
</bt-button>
</div>
<div class="seal-add-btn">
<bt-button
:button-text="stopText"
bg-color="#FF6767"
text-color="#FFFFFF"
width="27vw"
height="7vh"
text-size="24px"
border-radius="12px"
:disabled="stopDisabled"
min-height="4rem"
@click="onFinishTest"
>
<template #icon>
<img :src="homeFinish" alt="">
</template>
</bt-button>
</div>
</div>
</div>
</div>
</main>
<SoftKeyboard
ref="softKeyboardRef"
v-model="inputValue"
:is-visible="keyboardVisible"
:keyboard-type="keyboardType"
@update-keyboard-visible="(visible: boolean) => keyboardVisible = visible"
@confirm="handleConfirm"
@close="keyboardVisible = false"
/>
</div>
</template>
<style lang="scss" scoped>
.main-content{
display: grid;
grid-template-columns: repeat(3,1fr);
height: $main-container-height;
gap: 10px;
.seal-left{
background: #FFFFFF;
grid-column: 1 / 3;
box-shadow: 0px 1px 5px 0px rgba(9, 39, 62, 0.15);
background: $gradient-color;
.seal-chart{
}
.chart-ml{
margin: 2rem;
height: 32rem;
}
}
}
.seal-opt{
display: flex;
gap: 2rem;
margin-left: 9rem;
margin-top: -2rem;
.seal-status{
display: flex;
justify-content: center;
align-items: center;
background: #F6FAFE;
width: 16rem;
height: 5rem;
border-radius: 15px;
}
.seal-time-text{
font-size: 1.5rem;
font-weight: 500;
padding-left: 0.5rem;
}
.seal-test-time{
font-size: 24px;
color: #2892F3;
}
.seal-time-statue{
height: 3rem;
width: 5rem;
display: flex;
justify-content: center;
align-items: center;
font-weight: 600;
}
.seal-diff-text{
font-size: 1.5rem;
font-weight: 500;
padding-left: 0.5rem;
}
.seal-diff-statue{
height: 3rem;
width: 5rem;
display: flex;
justify-content: center;
align-items: center;
font-weight: 600;
}
}
.seal-right{
background: $gradient-color;
display: grid;
grid-template-rows: repeat(2, 1fr);
.left-title{
//padding-top: 3.5vw;
padding-left: 2.5vw;
display: flex;
.title-text-test{
display: flex;
justify-content: center;
align-items: center;
gap: 1rem;
.title-text{
font-size: 20px;
}
.title-text-kpa{
color: #409EFF;
}
.title-kpa-pl{
padding-left: 5px;
font-weight: bold;
}
}
}
.seal-right-btn{
height: 30vh;
grid-row: 2 / 4;
margin-top: -6rem;
.seal-input{
padding-left: 2rem;
height: 8rem;
font-size: 2.143vw;
font-weight: 400;
.inflation-time{
height: 4rem;
}
.seal-diff-text{
height: 4rem;
}
.input{
width: 25vw;
}
}
.seal-add-btn{
width: 25vw;
height: 12vh;
border-radius: 12px;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
gap: 10px;
margin: 2rem;
}
}
}
</style>