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.
 
 
 
 
 

479 lines
14 KiB

<script setup lang="ts">
import AddLiquid from 'components/home/AddLiquid/index.vue'
import SelectCraft from 'components/home/SelectCraft/index.vue'
import SetTemperature from 'components/home/SetTemperature/index.vue'
import StartExperiment from 'components/home/StartExperiment/index.vue'
import Tube from 'components/home/Tube/index.vue'
import { ElMessageBox } from 'element-plus'
import { FtMessage } from 'libs/message'
import { socket } from 'libs/socket'
import { useHomeStore } from 'stores/homeStore'
import { useSystemStore } from 'stores/systemStore'
import { onMounted, onUnmounted, ref } from 'vue'
const homeStore = useHomeStore()
const systemStore = useSystemStore()
onMounted(() => {
socket.init(receiveMessage, 'cmd_debug')
socket.init(receiveMessage, 'cmd_response')
})
onUnmounted(() => {
socket.unregisterCallback(receiveMessage, 'cmd_debug')
socket.unregisterCallback(receiveMessage, 'cmd_response')
})
let currentCommandId = ''
const receiveMessage = (data: Socket.cmdData) => {
data.commandId === currentCommandId && systemStore.pushSystemList(data)
}
const startVisible = ref(false)
// const startExperimentHandle = () => {
// // TODO 需要判断有没有进行中的实验
// startVisible.value = true
// }
// const selectCraftVisible = ref(false)
// const selectCraft = () => {
// const count = homeStore.heatAreaList.filter(item => item.selected).length
// if (!count) {
// FtMessage.warning('请选择加热区')
// return
// }
// selectCraftVisible.value = true
// }
//
// const executeCraftHandle = async () => {
// const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
// if (!selectedHeatAreas.length) {
// FtMessage.warning('请选择加热区')
// return
// }
// // TODO 需要判断有没有选择工艺
// for (let i = 0; i < selectedHeatAreas.length; i++) {
// await startCraft({
// heatId: selectedHeatAreas[i].value,
// })
// }
// FtMessage.success('工艺已开始执行')
// }
const setTemperatureVisible = ref(false)
const currentTemperatureId = ref('')
const setTemperature = (id: string) => {
currentTemperatureId.value = id
setTemperatureVisible.value = true
}
const addLiquidVisible = ref(false)
const addLiquid = async () => {
await ElMessageBox.confirm(
'请确认加液区是否有托盘?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
showClose: false,
closeOnClickModal: false,
type: 'warning',
},
)
addLiquidVisible.value = true
// if (!systemStore.systemStatus.solutionModule.trayStatus) {
// FtMessage.warning('加液区无托盘')
// return
// }
}
const door_open = async () => {
if (systemStore.systemStatus.door.open) {
FtMessage.warning('门已经是开启状态了')
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'door_open',
params: { },
}
await homeStore.sendControl(params)
}
const door_close = async () => {
if (!systemStore.systemStatus.door.open) {
FtMessage.warning('门已经是关闭状态了')
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'door_close',
params: { },
}
await homeStore.sendControl(params)
}
const move_to_heat_area = async () => {
// if (systemStore.systemStatus.solutionModule.trayStatus === 0) {
// FtMessage.warning('加液区无托盘')
// return
// }
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length || selectedHeatAreas.length > 1) {
FtMessage.warning('请选择一个加热区')
return
}
await ElMessageBox.confirm(
'请确认加液区是否有托盘?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
showClose: false,
closeOnClickModal: false,
type: 'warning',
},
)
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'move_to_heat_area',
params: {
heatId: selectedHeatAreas[0].value,
},
}
await homeStore.sendControl(params)
}
const move_to_solution_area = async () => {
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length || selectedHeatAreas.length > 1) {
FtMessage.warning('请选择一个加热区')
return
}
await ElMessageBox.confirm(
'请确认加液区无托盘?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
showClose: false,
closeOnClickModal: false,
type: 'warning',
},
)
// if (systemStore.systemStatus.solutionModule.trayStatus === 1) {
// FtMessage.warning('加液区有托盘')
// return
// }
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'move_to_solution_area',
params: {
heatId: selectedHeatAreas[0].value,
},
}
await homeStore.sendControl(params)
}
const heat_start = async () => {
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length || selectedHeatAreas.length > 1) {
FtMessage.warning('请选择一个加热区')
return
}
if (systemStore.systemStatus.heatModule.find(item => item.moduleCode === selectedHeatAreas[0].value)?.targetTemperature) {
FtMessage.warning('请先设置温度')
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'heat_start',
params: {
heatId: selectedHeatAreas[0].value,
temperature: systemStore.systemStatus.heatModule.find(item => item.moduleCode === selectedHeatAreas[0].value)?.targetTemperature,
},
}
await homeStore.sendControl(params)
}
const heat_stop = async () => {
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length || selectedHeatAreas.length > 1) {
FtMessage.warning('请选择一个加热区')
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'heat_stop',
params: {
heatId: selectedHeatAreas[0].value,
},
}
await homeStore.sendControl(params)
}
const tray_up = async () => {
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length || selectedHeatAreas.length > 1) {
FtMessage.warning('请选择一个加热区')
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'tray_up',
params: {
heatId: selectedHeatAreas[0].value,
},
}
await homeStore.sendControl(params)
}
const tray_down = async () => {
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length || selectedHeatAreas.length > 1) {
FtMessage.warning('请选择一个加热区')
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'tray_down',
params: {
heatId: selectedHeatAreas[0].value,
},
}
await homeStore.sendControl(params)
}
const shake_start = async () => {
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'shake_start',
params: {
},
}
await homeStore.sendControl(params)
}
const shake_stop = async () => {
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'shake_stop',
params: {
},
}
await homeStore.sendControl(params)
}
const take_photo = async () => {
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'take_photo',
params: {
},
}
await homeStore.sendControl(params)
}
</script>
<template>
<div class="home-page">
<el-row :gutter="10">
<el-col :span="15">
<div class="page-left">
<Tube v-for="(item, index) in systemStore.systemStatus.heatModule" :key="item.moduleCode" :data="item" @select-change="homeStore.selectChange(index)" @set-temperature="setTemperature" />
</div>
</el-col>
<el-col :span="9">
<div class="page-right">
<div class="top">
<div class="photo" @click="take_photo">
<el-icon><Camera /></el-icon>
<span>拍照</span>
</div>
</div>
<div class="button-box">
<el-row :gutter="10">
<el-col :span="12">
<ft-button :click-handle="door_open">
开门
</ft-button>
</el-col>
<el-col :span="12">
<ft-button :click-handle="door_close">
关门
</ft-button>
</el-col>
</el-row>
<!-- <el-row :gutter="10"> -->
<!-- <el-col :span="12"> -->
<!-- <ft-button @click="startExperimentHandle"> -->
<!-- 开始实验 -->
<!-- </ft-button> -->
<!-- </el-col> -->
<!-- <el-col :span="12"> -->
<!-- <ft-button disabled> -->
<!-- 停止实验 -->
<!-- </ft-button> -->
<!-- </el-col> -->
<!-- </el-row> -->
<!-- <el-row :gutter="10"> -->
<!-- <el-col :span="12"> -->
<!-- <ft-button @click="selectCraft"> -->
<!-- 选择工艺 -->
<!-- </ft-button> -->
<!-- </el-col> -->
<!-- <el-col :span="12"> -->
<!-- <ft-button :click-handle="executeCraftHandle"> -->
<!-- 执行工艺 -->
<!-- </ft-button> -->
<!-- </el-col> -->
<!-- </el-row> -->
<el-row :gutter="10">
<el-col :span="24">
<ft-button @click="addLiquid">
添加溶液
</ft-button>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<ft-button :click-handle="shake_start">
开始摇匀
</ft-button>
</el-col>
<el-col :span="12">
<ft-button :click-handle="shake_stop">
停止摇匀
</ft-button>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<ft-button :click-handle="move_to_heat_area">
移至加热
</ft-button>
</el-col>
<el-col :span="12">
<ft-button :click-handle="move_to_solution_area">
移至加液
</ft-button>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<ft-button :click-handle="heat_start">
开始加热
</ft-button>
</el-col>
<el-col :span="12">
<ft-button :click-handle="heat_stop">
停止加热
</ft-button>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<ft-button :click-handle="tray_up">
抬起托盘
</ft-button>
</el-col>
<el-col :span="12">
<ft-button :click-handle="tray_down">
降下托盘
</ft-button>
</el-col>
</el-row>
</div>
</div>
</el-col>
</el-row>
<StartExperiment v-if="startVisible" @ok="startVisible = false" @cancel="startVisible = false" />
<SelectCraft v-if="selectCraftVisible" @ok="selectCraftVisible = false" @cancel="selectCraftVisible = false" />
<SetTemperature v-if="setTemperatureVisible" :id="currentTemperatureId" @ok="setTemperatureVisible = false" @cancel="setTemperatureVisible = false" />
<AddLiquid v-if="addLiquidVisible" @ok="addLiquidVisible = false" @cancel="addLiquidVisible = false" />
</div>
</template>
<style scoped lang="scss">
.home-page {
background: rgba(0, 0, 0, 0) !important;
padding: 0 !important;
.el-row {
height: 100%;
.el-col {
height: 100%;
.page-left, .page-right {
height: 100%;
background: #fff;
border-radius: 8px;
padding: 10px;
}
.page-left {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 创建3列等宽轨道 */
grid-template-rows: repeat(2, auto); /* 创建2行自动高度 */
gap: 10px;
justify-content: center; /* 水平居中 */
align-items: center;
}
.page-right {
display: flex;
flex-direction: column;
height: 100%;
.top {
height: 50%;
background: #4D6882;
position: relative;
border-radius: 8px;
overflow: hidden;
.photo {
width: 100%;
height: 40px;
background: rgba(0, 0, 0, 0.3);
position: absolute;
bottom: 0;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
font-size: 15px;
}
}
.button-box {
height: 50%;
display: flex;
flex-direction: column;
justify-content: flex-end;
.el-row {
height: fit-content;
margin-bottom: 5px;
}
}
}
}
}
}
.el-col {
.ft-button {
width: 100%;
.my-button {
padding: 0 !important;
}
}
}
</style>