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
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>
|