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.
349 lines
9.5 KiB
349 lines
9.5 KiB
<script lang="ts" setup>
|
|
import { getDeviceStatus } from '@/libs/deviceComm'
|
|
import { FtMessage } from '@/libs/message'
|
|
import { FtMessageBox } from '@/libs/messageBox'
|
|
import { useHomeStore } from '@/stores/homeStore'
|
|
import { useLiquidStore } from '@/stores/liquidStore'
|
|
import { useSealStore } from '@/stores/sealStore'
|
|
import { useSystemStore } from '@/stores/systemStore'
|
|
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 SoftKeyboard from 'components/common/SoftKeyboard/index.vue'
|
|
import LiquidLevel from 'components/liquid/LiquidLevel.vue'
|
|
import { ElMessage } from 'element-plus'
|
|
import { roundNumber } from 'libs/utils'
|
|
import { computed, onMounted, ref, watchEffect } from 'vue'
|
|
|
|
const liquidStore = useLiquidStore()
|
|
const homeStore = useHomeStore()
|
|
const sealStore = useSealStore()
|
|
const systemStore = useSystemStore()
|
|
const stopatg = ref()
|
|
const inputValue = ref('')
|
|
const keyboardVisible = ref(false)
|
|
const keyboardType = ref<'text' | 'number'>('number')
|
|
const softKeyboardRef = ref()
|
|
const liquidStateData = ref(liquidStore.liquidStateData)
|
|
const addWorkState = ref(liquidStore.liquidStateData)// 加液状态
|
|
const drainWorkState = ref(liquidStore.liquidStateData)// 排液状态
|
|
const liquidTotoal = ref(liquidStore.liquidTotal)// 总容量
|
|
const disinfectionState = ref(homeStore.disinfectionState)
|
|
const sealInfo = ref(sealStore.sealInfo)
|
|
const loading = ref(false)
|
|
const btnStyle = {
|
|
width: '27vw',
|
|
height: '7vh',
|
|
textSize: '24px',
|
|
borderRadius: '12px',
|
|
textColor: '#FFFFFF',
|
|
}
|
|
|
|
onMounted(() => {
|
|
subScribeLiquid()
|
|
})
|
|
|
|
watchEffect(() => {
|
|
stopatg.value = inputValue.value
|
|
addWorkState.value = liquidStore.liquidAddWorkState
|
|
drainWorkState.value = liquidStore.liquidDrainWorkState
|
|
liquidTotoal.value = liquidStore.liquidTotal
|
|
liquidStateData.value = liquidStore.liquidStateData
|
|
disinfectionState.value = homeStore.disinfectionState
|
|
sealInfo.value = sealStore.sealInfo
|
|
loading.value = systemStore.loading
|
|
})
|
|
|
|
const subScribeLiquid = () => { // 事件订阅
|
|
subscribeEvent('stateUpdate', (data: Socket.WebSocketResponse<Liquid.LiquidData>) => {
|
|
if (data.fromClass === 'AddLiquidService') {
|
|
liquidStore.updateAddLiquidWorkState(data.rely)
|
|
}
|
|
|
|
if (data.fromClass === 'DrainLiquidService') {
|
|
liquidStore.updateDrainLiquidWorkState(data.rely)
|
|
}
|
|
})
|
|
}
|
|
|
|
const openKeyboard = () => {
|
|
keyboardVisible.value = true
|
|
}
|
|
|
|
const nowLiquid = computed(() => {
|
|
return roundNumber(liquidStateData.value.nowLiquid, 0)
|
|
})
|
|
|
|
const handleConfirm = (value: string) => {
|
|
console.log('确认输入:', value)
|
|
}
|
|
|
|
const onStartAddLiquid = async () => {
|
|
const statusName = getDeviceStatus()
|
|
if (statusName) {
|
|
FtMessageBox.error(statusName)
|
|
return
|
|
}
|
|
if (!stopatg.value || stopatg.value < 0) {
|
|
FtMessage.warning('请输入加液容量')
|
|
return
|
|
}
|
|
if (stopatg.value > liquidTotoal.value) {
|
|
FtMessage.warning('加液容量不能大于总容量')
|
|
return
|
|
}
|
|
const params = {
|
|
className: 'AddLiquidService',
|
|
fnName: 'start',
|
|
params: {
|
|
stopatg: Number(stopatg.value),
|
|
},
|
|
}
|
|
systemStore.updateLoading(true)
|
|
syncSendCmd(params)
|
|
// 发起订阅
|
|
const subParams = {
|
|
className: 'AddLiquidService',
|
|
fnName: 'startStateReport',
|
|
params: {},
|
|
}
|
|
syncSendCmd(subParams)
|
|
}
|
|
|
|
const onStopAddLiquid = () => {
|
|
const params = {
|
|
className: 'AddLiquidService',
|
|
fnName: 'stop',
|
|
params: {},
|
|
}
|
|
systemStore.updateLoading(true)
|
|
syncSendCmd(params)
|
|
}
|
|
|
|
// 开始排液
|
|
const onStartDrainLiquid = async () => {
|
|
const statusName = getDeviceStatus()
|
|
if (statusName) {
|
|
FtMessageBox.error(statusName)
|
|
return
|
|
}
|
|
const params = {
|
|
className: 'DrainLiquidService',
|
|
fnName: 'start',
|
|
params: {},
|
|
}
|
|
systemStore.updateLoading(true)
|
|
await sendCmd(params)
|
|
// 发起订阅
|
|
const subParams = {
|
|
className: 'DrainLiquidService',
|
|
fnName: 'startStateReport',
|
|
params: {},
|
|
}
|
|
syncSendCmd(subParams)
|
|
}
|
|
|
|
const onStopDrainLiquid = async () => {
|
|
if (drainWorkState.value.workState === 'idle') {
|
|
ElMessage.warning('正在加液中,不可进行排液操作')
|
|
return
|
|
}
|
|
const params = {
|
|
className: 'DrainLiquidService',
|
|
fnName: 'stop',
|
|
params: {},
|
|
}
|
|
systemStore.updateLoading(true)
|
|
await syncSendCmd(params)
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<div v-loading="loading">
|
|
<main class="main-content">
|
|
<div class="liquid-left">
|
|
<LiquidLevel />
|
|
</div>
|
|
<div class="liquid-right">
|
|
<!-- 当前液位 -->
|
|
<div class="liquid-surplus-title">
|
|
<div>当前液位:</div>
|
|
<div class="liquid-title-g">
|
|
{{ nowLiquid }}g
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 输入加液/排液量 -->
|
|
<div class="liquid-input">
|
|
<el-input
|
|
v-model="stopatg"
|
|
v-prevent-keyboard
|
|
class="input"
|
|
name="nowLiquid"
|
|
placeholder="请输入"
|
|
style="height: 4rem"
|
|
@focus="openKeyboard"
|
|
>
|
|
<template #append>
|
|
<bt-button
|
|
type="primary"
|
|
:button-text="`${liquidTotoal}g`"
|
|
bg-color="#2892F3"
|
|
text-color="#ffffff"
|
|
height="4rem"
|
|
text-size="24px"
|
|
/>
|
|
</template>
|
|
</el-input>
|
|
</div>
|
|
|
|
<!-- 操作区 -->
|
|
<div class="liquid-opt">
|
|
<div>
|
|
<div class="liquid-add-btn">
|
|
<bt-button
|
|
v-if="addWorkState.workState === 'idle'"
|
|
button-text="开始加液"
|
|
bg-color="#31CB7A"
|
|
:text-color="btnStyle.textColor"
|
|
:width="btnStyle.width"
|
|
:height="btnStyle.height"
|
|
:text-size="btnStyle.textSize"
|
|
:border-radius="btnStyle.borderRadius"
|
|
@click="onStartAddLiquid"
|
|
>
|
|
<template #icon>
|
|
<img :src="homeStart" alt="">
|
|
</template>
|
|
</bt-button>
|
|
<bt-button
|
|
v-else
|
|
button-text="停止加液"
|
|
bg-color="#FF6767"
|
|
:text-color="btnStyle.textColor"
|
|
:width="btnStyle.width"
|
|
:height="btnStyle.height"
|
|
:text-size="btnStyle.textSize"
|
|
:border-radius="btnStyle.borderRadius"
|
|
@click="onStopAddLiquid"
|
|
>
|
|
<template #icon>
|
|
<img :src="homeFinish" alt="">
|
|
</template>
|
|
</bt-button>
|
|
</div>
|
|
<div class="liquid-drain">
|
|
<bt-button
|
|
v-if="drainWorkState.workState === 'idle'"
|
|
button-text="开始排液"
|
|
bg-color="#2892F3"
|
|
:text-color="btnStyle.textColor"
|
|
:width="btnStyle.width"
|
|
:height="btnStyle.height"
|
|
:text-size="btnStyle.textSize"
|
|
:border-radius="btnStyle.borderRadius"
|
|
@click="onStartDrainLiquid"
|
|
>
|
|
<template #icon>
|
|
<img :src="homeStart" alt="">
|
|
</template>
|
|
</bt-button>
|
|
<bt-button
|
|
v-else
|
|
button-text="停止排液"
|
|
bg-color="#FF6767"
|
|
:text-color="btnStyle.textColor"
|
|
:width="btnStyle.width"
|
|
:height="btnStyle.height"
|
|
:text-size="btnStyle.textSize"
|
|
:border-radius="btnStyle.borderRadius"
|
|
@click="onStopDrainLiquid"
|
|
>
|
|
<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) => 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;
|
|
overflow: hidden;
|
|
.liquid-left{
|
|
background: #FFFFFF;
|
|
grid-column: 1 / 3;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
box-shadow: 0px 1px 5px 0px rgba(9, 39, 62, 0.15);
|
|
background: $gradient-color;
|
|
}
|
|
.liquid-right{
|
|
background:#FFFFFF;
|
|
box-shadow: 0px 1px 5px 0px rgba(9, 39, 62, 0.15);
|
|
padding-top: 15vh;
|
|
width: 100%;
|
|
background: $gradient-color;
|
|
.liquid-surplus-title{
|
|
height: 10vh;
|
|
display: flex;
|
|
padding-left: 2rem;
|
|
align-items: center;
|
|
font-size: 24px;
|
|
font-weight: 400;
|
|
|
|
.liquid-title-g{
|
|
color: #2892F3;
|
|
font-weight: bold;
|
|
}
|
|
}
|
|
.liquid-input{
|
|
display: flex;
|
|
padding-left: 2rem;
|
|
align-items: center;
|
|
.input{
|
|
width: 25vw;
|
|
}
|
|
}
|
|
|
|
.liquid-opt{
|
|
display: flex;
|
|
justify-content: center;
|
|
margin-top: 5vh;
|
|
}
|
|
.liquid-add-btn{
|
|
width: 27vw;
|
|
height: 8vh;
|
|
border-radius: 12px;
|
|
color: #FFFFFF;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 24px;
|
|
gap: 10px;
|
|
}
|
|
|
|
.liquid-drain{
|
|
margin-top: 1.5rem;
|
|
}
|
|
}
|
|
}
|
|
</style>
|