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.
 
 
 
 
 

221 lines
5.6 KiB

<script setup lang="ts">
import { getDeviceStatus } from 'apis/system'
import FtStream from 'components/common/FTStream/index.vue'
import Check from 'components/home/Check/index.vue'
import Stop from 'components/home/stop/index.vue'
import { ElMessageBox } from 'element-plus'
import { isClose, socket } from 'libs/socket'
import { sendControl } from 'libs/utils'
import { useSystemStore } from 'stores/useSystemStore' // 引入 systemStore
import { computed, ref } from 'vue'
import { useRoute, useRouter } from 'vue-router'
const route = useRoute()
const router = useRouter()
const systemStore = useSystemStore() // 使用 systemStore
const checkVisible = ref(false)
getDeviceStatus().then((res: any) => {
systemStore.updateSystemStatus(res)
if (!systemStore.systemStatus.selfTestCompleted) {
ElMessageBox.confirm('检测到您还未完成自检,是否开始自检?', '提示', {
type: 'warning',
confirmButtonText: '确定',
showCancelButton: false,
showClose: false,
closeOnClickModal: false,
closeOnPressEscape: false,
closeOnHashChange: false,
}).then(() => {
checkVisible.value = true
})
}
})
const ok = () => {
checkVisible.value = false
}
const statusMessage = (data: any) => {
// 更新 systemStore 的 systemStatus
console.log(data)
systemStore.updateSystemStatus(data)
}
const sensorMessage = (data: any) => {
// 更新 systemStore 的 systemInfo
systemStore.updateSystemSensor(data)
}
socket.init(statusMessage, 'device_status_change')
socket.init(sensorMessage, 'sensor')
socket.init(() => {}, 'pong')
const ingObj = {
idle: '空闲',
spraying: '正在喷涂中',
paused: '喷涂暂停中',
cleaningSyringePipeline: '正在清洗注射器管路',
cleaningNozzlePipeline: '正在清洗喷嘴管路',
prefilling: '正在预充中',
dehumidifierRunning: '正在除湿中',
stopPressed: '急停中',
}
const status = computed(() => {
const keys = Object.keys(systemStore.systemStatus).filter((key) => {
return !['paused', 'suspendable', 'selfTestCompleted'].includes(key)
})
let str = ''
keys.forEach((key) => {
if (systemStore.systemStatus[key as keyof typeof systemStore.systemStatus]) {
str += `${ingObj[key as keyof typeof ingObj]} | `
}
})
if (str === '') {
return '空闲'
}
else {
return str.slice(0, -2)
}
})
const logoClickCount = ref(0)
let clickTimeout: NodeJS.Timeout | null = null
const handleLogoClick = () => {
if (clickTimeout) {
clearTimeout(clickTimeout)
}
logoClickCount.value++
if (logoClickCount.value === 10) {
systemStore.updateDebug()
logoClickCount.value = 0 // 重置计数器
}
clickTimeout = setTimeout(() => {
logoClickCount.value = 0 // 重置计数器
}, 1000)
}
const slideTrayIn = async () => {
const params = {
cmdCode: 'slide_tray_in',
cmdId: '',
}
await sendControl(params)
}
const slideTrayOut = async () => {
const params = {
cmdCode: 'slide_tray_out',
cmdId: '',
}
await sendControl(params)
}
</script>
<template>
<el-container>
<el-header>
<div class="logo" @click="handleLogoClick">
<div style="display: flex;align-items: center">
<img src="@/assets/images/logo.svg" alt="">
</div>
<div v-if="route.path !== '/'">
<el-divider direction="vertical" />
<span class="router-name">{{ route.meta.tagName }}</span>
</div>
</div>
<div style="display: flex">
<img v-show="!isClose" class="wifi-icon" src="../../assets/images/icon_wifi.svg" alt="">
<img v-show="isClose" class="wifi-icon" src="../../assets/images/icon_wifi_red.svg" alt="">
<ft-button v-if="systemStore.isDebug" @click="router.push('/debug')">
调试
</ft-button>
<ft-button v-if="route.path !== '/'" @click="router.push('/')">
返回
</ft-button>
</div>
</el-header>
<el-main>
<router-view v-slot="{ Component }" class="main-container">
<Transition mode="out-in">
<component :is="Component" :key="route.fullPath" />
</Transition>
</router-view>
</el-main>
<el-footer>
<div>
<ft-button type="info">
当前湿度: {{ systemStore.systemSensor.humidity }}%RH
</ft-button>
<ft-button type="info">
设备状态: {{ status }}
</ft-button>
</div>
<div>
<ft-button :click-handle="slideTrayIn">
推入托盘
</ft-button>
<ft-button :click-handle="slideTrayOut">
推出托盘
</ft-button>
</div>
</el-footer>
<FtStream :visible="systemStore.streamVisible" />
<Stop v-if="systemStore.systemStatus.stopPressed" />
<Check v-if="checkVisible" @ok="ok" @cancel="checkVisible = false" />
</el-container>
</template>
<style scoped lang="scss">
.el-container {
background: #26509C;
overflow: hidden;
.el-header {
height: 120px;
display: flex;
align-items: center;
justify-content: space-between;
padding:0 65px;
.logo {
margin-left: 35px;
display: flex;
img {
width: 250px;
}
}
.el-divider {
margin: 0 60px;
height: 62px;
}
}
.el-main {
padding:0 65px;
.main-container {
width: 100%;
height: 100%;
background: #EEF3FB;
border-radius: 60px;
padding: 60px;
overflow: auto;
}
}
.el-footer {
padding:0 65px;
height: 120px;
display: flex;
justify-content: space-between;
align-items: center;
}
}
.router-name {
font-size: 50px;
color: #fff;
}
.wifi-icon {
width: 50px;
margin: 0 30px;
}
</style>