|
|
@ -38,13 +38,17 @@ |
|
|
|
</div> |
|
|
|
<!--操作区--> |
|
|
|
<div class="graphite_btn_container"> |
|
|
|
<van-button size="large" class="btn_size op_open_door" @click="onOPen" |
|
|
|
<van-button v-if="doorStatus" size="large" class="btn_size op_open_door" @click="onCloseDoor" |
|
|
|
>关门</van-button |
|
|
|
> |
|
|
|
<van-button v-else size="large" class="btn_size op_open_door" @click="onOPenDoor" |
|
|
|
>开门</van-button |
|
|
|
> |
|
|
|
|
|
|
|
<van-button size="large" class="btn_size op_start_task" @click="taskNameVisible = true" |
|
|
|
>开始实验</van-button |
|
|
|
> |
|
|
|
<van-button size="large" class="btn_size op_stop_task" |
|
|
|
<van-button size="large" class="btn_size op_stop_task" @click="onEndTask" |
|
|
|
>结束实验</van-button |
|
|
|
> |
|
|
|
<van-button |
|
|
@ -62,7 +66,8 @@ |
|
|
|
@click="onAddLiquid" |
|
|
|
>添加溶液</van-button |
|
|
|
> |
|
|
|
<van-button size="large" class="btn_size op_shake_up">摇匀</van-button> |
|
|
|
<van-button v-if="!isSharking" size="large" class="btn_size op_shake_up" @click="onStartShakingTube">摇匀</van-button> |
|
|
|
<van-button v-else size="large" class="btn_size op_shake_up" @click="onStopShakingTube">结束摇匀</van-button> |
|
|
|
<van-button |
|
|
|
size="large" |
|
|
|
class="btn_size op_move_heat" |
|
|
@ -75,10 +80,14 @@ |
|
|
|
<van-button size="large" class="btn_size op_move_exception" @click="onMoveToSpecial" |
|
|
|
>移至特殊</van-button |
|
|
|
> |
|
|
|
<van-button size="large" class="btn_size op_start_heat" @click="onStartHeat" |
|
|
|
<van-button v-if="!isHeating" size="large" class="btn_size op_start_heat" @click="onStartHeat" |
|
|
|
>开始加热</van-button |
|
|
|
> |
|
|
|
<van-button size="large" class="btn_size op_up_tray" |
|
|
|
<van-button v-else size="large" class="btn_size op_start_heat" @click="onStopHeat" |
|
|
|
>停止加热</van-button |
|
|
|
> |
|
|
|
|
|
|
|
<van-button size="large" class="btn_size op_up_tray" @click="onUpTray" |
|
|
|
>抬起托盘</van-button |
|
|
|
> |
|
|
|
</div> |
|
|
@ -105,20 +114,25 @@ |
|
|
|
开始新实验 |
|
|
|
</div> |
|
|
|
<div class="task_name_content"> |
|
|
|
实验名称:<input v-model="taskName" class="task_input"> |
|
|
|
<div class='mt-3'>实验名称:</div> |
|
|
|
<div class="task_auto"> |
|
|
|
<input v-model="taskName" placeholder="实验名称" class="task_input" /> |
|
|
|
<div v-if="!taskName" style="color:red;font-size: 1rem;">请输入实验名称</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<br/> |
|
|
|
<footer class="task_button"> |
|
|
|
<button class="btn-dark px-2 py-1 min-w-20" @click="onSave">保存</button> |
|
|
|
<button class="px-4 py-1 min-w-20" @click="onCancel">取消</button> |
|
|
|
<button class="cancel_btn" @click="onCancel">取消</button> |
|
|
|
</footer> |
|
|
|
</div> |
|
|
|
</OverlayModal> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
<script lang="ts" setup> |
|
|
|
import { ref, reactive, onMounted, onUnmounted, watch } from "vue"; |
|
|
|
import { ref, reactive, onMounted, onUnmounted, effect } from "vue"; |
|
|
|
//@ts-ignore |
|
|
|
import { ElMessage } from "element-plus"; |
|
|
|
import { createWebSocket, sharedWsUrl } from "@/services/socket"; |
|
|
@ -127,7 +141,7 @@ import OverlayModal from "@/components/OverlayModal.vue"; |
|
|
|
import CraftList from "@/views/graphite/components/CraftList.vue"; |
|
|
|
import { graphiteMock } from "./components/mock"; |
|
|
|
import { useStatusStore } from "@/stores/status"; |
|
|
|
import { saveTaskName } from '@/services/task/task'; |
|
|
|
import { saveTaskName, stopTask } from '@/services/task/task'; |
|
|
|
import { |
|
|
|
CmdDescMap, |
|
|
|
taskCmd, |
|
|
@ -141,6 +155,7 @@ const settingStore = useSettingStore(); |
|
|
|
|
|
|
|
//设备的全局状态 |
|
|
|
const statusStore = useStatusStore(); |
|
|
|
const heatAearStatusList = ref(statusStore.status?.heater || []) |
|
|
|
const heatList: any = ref([]); |
|
|
|
const craftVisible = ref(false); |
|
|
|
const switchModule = ref(false); |
|
|
@ -149,6 +164,7 @@ const selectedColor = "#4F85FB"; |
|
|
|
const emptyColor = "#FFFFFF"; |
|
|
|
const defaultColor = "#189952"; |
|
|
|
const taskName = ref('') |
|
|
|
|
|
|
|
onMounted(() => { |
|
|
|
//6个加热区数据 |
|
|
|
heatList.value = settingStore.heatAreaConfig.map((item:any) => { |
|
|
@ -162,6 +178,7 @@ onMounted(() => { |
|
|
|
const wsClient = createWebSocket(sharedWsUrl); |
|
|
|
const subscription = wsClient.dataOb.subscribe((data) => { |
|
|
|
if (data.type === "cmd") { |
|
|
|
console.log('data--首页上报的事件--', data) |
|
|
|
const cmdInfo = getTxnRecord(data.data.commandId, "task"); |
|
|
|
if (cmdInfo) { |
|
|
|
const cmdName = CmdDescMap[cmdInfo.command]; |
|
|
@ -221,7 +238,6 @@ const onSelectCraft = (item:any, craftInfo:any) => { |
|
|
|
item.isSelect = true; |
|
|
|
item.craftInfo = craftInfo |
|
|
|
onSelectedTray(item,'isMove') |
|
|
|
console.log('加热区选择的工艺===', item,craftInfo) |
|
|
|
} |
|
|
|
//开始执行工艺 |
|
|
|
const onCraftStart = () => { |
|
|
@ -229,19 +245,36 @@ const onCraftStart = () => { |
|
|
|
ElMessage.error("请选择目标加热区"); |
|
|
|
return; |
|
|
|
} |
|
|
|
//判断是否选择了工艺 |
|
|
|
|
|
|
|
|
|
|
|
//可能会选择多个加热区执行工艺, 批量发送指令 |
|
|
|
selectedTrayList.value.forEach((item:any) => { |
|
|
|
let hasCraft = true; |
|
|
|
let len = selectedTrayList.value.length; |
|
|
|
for(let i = 0; i < len; i++){ |
|
|
|
let item = selectedTrayList.value[i] |
|
|
|
if(!item.craftInfo){ |
|
|
|
hasCraft = false; |
|
|
|
ElMessage.error('选择的加热区未选择工艺') |
|
|
|
break; |
|
|
|
} |
|
|
|
const params = { |
|
|
|
craftId: item.craftInfo.id, |
|
|
|
heatId: item.id |
|
|
|
} |
|
|
|
craftStart(params).then(res => { |
|
|
|
ElMessage.success('执行工艺的指令已发送') |
|
|
|
ElMessage.success('已执行工艺的指令') |
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
if(hasCraft){ |
|
|
|
//给选择加热区heatList加一个正在执行工艺的标识 |
|
|
|
const selectedIds = selectedTrayList.value.map((item:any) => item.id) |
|
|
|
heatList.value.forEach((item:any) => { |
|
|
|
if(selectedIds.includes(item.id)){ |
|
|
|
item.executing_craft = true; |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
const tubeBaseConfig = () => { |
|
|
@ -262,8 +295,14 @@ const onAddLiquid = () => { |
|
|
|
}; |
|
|
|
|
|
|
|
//选择的工艺 |
|
|
|
const onHandleSelectedCraft = (craftData:any) => { |
|
|
|
changeVisible(); |
|
|
|
const onHandleSelectedCraft = (craftInfo:any) => { |
|
|
|
if(selectedTrayList.value.length == 1){ |
|
|
|
let item = selectedTrayList.value[0] |
|
|
|
item.isSelect = true; |
|
|
|
item.craftInfo = craftInfo |
|
|
|
onSelectedTray(item,'isMove') |
|
|
|
changeVisible(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
const onAddSolution = (data: any) => { |
|
|
@ -287,6 +326,16 @@ const changeVisible = () => { |
|
|
|
|
|
|
|
//选择工艺 |
|
|
|
const onChooseCaft = () => { |
|
|
|
//1、是否选择了加热区 |
|
|
|
if (!selectedTrayList.value.length) { |
|
|
|
ElMessage.error("请选择目标加热区"); |
|
|
|
return; |
|
|
|
} |
|
|
|
//2、只能选择一个加热区 |
|
|
|
if (selectedTrayList.value.length != 1) { |
|
|
|
ElMessage.error("只能选择一个加热区"); |
|
|
|
return; |
|
|
|
} |
|
|
|
craftVisible.value = true; |
|
|
|
}; |
|
|
|
|
|
|
@ -321,9 +370,10 @@ const onMoveToHeat = () => { |
|
|
|
} |
|
|
|
|
|
|
|
let selectedDataItem = selectedTrayList.value[0]; |
|
|
|
//2、判断选择的加热区是否已经有了试管架, 加热区是否有试管是通过设备上报的数据获取的。此处为mock的数据。 TODO |
|
|
|
let heatAearStatus: any = statusStore.status?.heater ? statusStore.status?.heater[selectedDataItem.index].trayStatus : graphiteMock.heatAreaStatus; |
|
|
|
if (!heatAearStatus[selectedDataItem.index]) { |
|
|
|
//2、判断选择的加热区是否已经有了试管架, 加热区是否有试管是通过设备上报的数据获取的 |
|
|
|
let trayStatus = heatAearStatusList.value[selectedDataItem.index].trayStatus; |
|
|
|
// trayStatus: 0为无托盘,1为有托盘,2为托盘抬起 |
|
|
|
if (trayStatus == 0) { |
|
|
|
ElMessage.error("选择的加热区已有试管架,重新选择加热区"); |
|
|
|
return; |
|
|
|
} |
|
|
@ -433,12 +483,15 @@ const onMoveToSpecial = () => { |
|
|
|
|
|
|
|
//开始实验 |
|
|
|
const taskNameVisible = ref(false) |
|
|
|
const taskId = ref() |
|
|
|
const onSave = ()=> { |
|
|
|
if(!taskName.value)return; |
|
|
|
const params = { |
|
|
|
name: taskName.value |
|
|
|
} |
|
|
|
saveTaskName(params).then(res => { |
|
|
|
if(res.success){ |
|
|
|
taskId.value = res.data.id; |
|
|
|
ElMessage.success('保存成功') |
|
|
|
onCancel() |
|
|
|
}else{ |
|
|
@ -447,25 +500,60 @@ const onSave = ()=> { |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
//结束实验 |
|
|
|
const onEndTask = () => { |
|
|
|
const params = { |
|
|
|
taskId: taskId.value |
|
|
|
} |
|
|
|
stopTask(params).then(res=> { |
|
|
|
heatList.value.forEach((item:any) => { |
|
|
|
item.executing_craft = false; |
|
|
|
}); |
|
|
|
if(res.success){ |
|
|
|
ElMessage.success('实验已停止') |
|
|
|
}else{ |
|
|
|
ElMessage.error('实验停止失败') |
|
|
|
} |
|
|
|
}).catch(e=>{ |
|
|
|
ElMessage.error(e) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
const onCancel = ()=> { |
|
|
|
taskNameVisible.value = false; |
|
|
|
} |
|
|
|
|
|
|
|
//开门 |
|
|
|
const onOPen = () => { |
|
|
|
const doorStatus = ref(false)//开门状态 。true: 门已打开, false: 门未打开 |
|
|
|
const onOPenDoor = () => { |
|
|
|
const params = {}; |
|
|
|
const command: OperationCmd = "openDoor"; |
|
|
|
taskCmd({ command, params }).then((res) => { |
|
|
|
if (res.success) { |
|
|
|
ElMessage.success("指令已发送,请稍等"); |
|
|
|
doorStatus.value = true; |
|
|
|
} else { |
|
|
|
ElMessage.error(res.msg); |
|
|
|
} |
|
|
|
}); |
|
|
|
}; |
|
|
|
|
|
|
|
//关门 |
|
|
|
const onCloseDoor = () => { |
|
|
|
const params = {}; |
|
|
|
const command: OperationCmd = "closeDoor"; |
|
|
|
taskCmd({ command, params }).then((res) => { |
|
|
|
if (res.success) { |
|
|
|
ElMessage.success("指令已发送,请稍等"); |
|
|
|
doorStatus.value = false; |
|
|
|
} else { |
|
|
|
ElMessage.error(res.msg); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
//开始加热 |
|
|
|
const isHeating = ref(false) |
|
|
|
const onStartHeat = () => { |
|
|
|
//选择的加热区 |
|
|
|
if (!selectedTrayList.value.length) { |
|
|
@ -496,19 +584,116 @@ const onStartHeat = () => { |
|
|
|
} |
|
|
|
|
|
|
|
//后台批量发送指令 |
|
|
|
|
|
|
|
const cmdList:any = [] |
|
|
|
selectedTrayList.value.forEach((heatArea:any) => { |
|
|
|
cmdList.push({ |
|
|
|
command:'startHeat', |
|
|
|
params:{ |
|
|
|
areaId : heatArea.id |
|
|
|
} |
|
|
|
}) |
|
|
|
const params = { |
|
|
|
areaId : heatArea.id, |
|
|
|
temperature: heatArea.temperature |
|
|
|
} |
|
|
|
taskCmd({ command: 'startHeat', params }).then((res) => { |
|
|
|
if (res.success) { |
|
|
|
ElMessage.success("指令已发送,请稍等"); |
|
|
|
isHeating.value = true; |
|
|
|
} else { |
|
|
|
ElMessage.error(res.msg); |
|
|
|
} |
|
|
|
}); |
|
|
|
}) |
|
|
|
// onSendCmd("startHeat", cmdList) |
|
|
|
} |
|
|
|
|
|
|
|
//停止加热 |
|
|
|
const onStopHeat = () => { |
|
|
|
//选择的加热区 |
|
|
|
if (!selectedTrayList.value.length) { |
|
|
|
ElMessage.error("请选择目标加热区"); |
|
|
|
return; |
|
|
|
} |
|
|
|
selectedTrayList.value.forEach((heatArea:any) => { |
|
|
|
const params = { |
|
|
|
areaId : heatArea.id, |
|
|
|
} |
|
|
|
taskCmd({ command: 'stopHeat', params }).then((res) => { |
|
|
|
if (res.success) { |
|
|
|
ElMessage.success("指令已发送,请稍等"); |
|
|
|
isHeating.value = false; |
|
|
|
} else { |
|
|
|
ElMessage.error(res.msg); |
|
|
|
} |
|
|
|
}); |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
//开始摇匀 |
|
|
|
const isSharking = ref(false) |
|
|
|
const onStartShakingTube = () => { |
|
|
|
const params = {} |
|
|
|
taskCmd({ command:'startShakeUp', params}).then((res) => { |
|
|
|
if (res.success) { |
|
|
|
ElMessage.success("指令已发送,请稍等"); |
|
|
|
isSharking.value = true; |
|
|
|
} else { |
|
|
|
ElMessage.error(res.msg); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
//结束摇匀 |
|
|
|
const onStopShakingTube = () => { |
|
|
|
const params = {} |
|
|
|
taskCmd({ command:'stopShakeUp', params}).then((res) => { |
|
|
|
if (res.success) { |
|
|
|
ElMessage.success("指令已发送,请稍等"); |
|
|
|
isSharking.value = false; |
|
|
|
} else { |
|
|
|
ElMessage.error(res.msg); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
//抬起托盘 |
|
|
|
const onUpTray = () => { |
|
|
|
if (!selectedTrayList.value.length) { |
|
|
|
ElMessage.error("请选择目标加热区"); |
|
|
|
return; |
|
|
|
} |
|
|
|
//选择了多个加热区,可托起多个加热区试管加 |
|
|
|
selectedTrayList.value.forEach((heatAreaItem:any) => { |
|
|
|
const params = { |
|
|
|
areaId: heatAreaItem.id |
|
|
|
} |
|
|
|
|
|
|
|
taskCmd({ command:'upTray', params }).then((res) => { |
|
|
|
if (res.success) { |
|
|
|
ElMessage.success("指令已发送,请稍等"); |
|
|
|
} else { |
|
|
|
ElMessage.error(res.msg); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
//修改加热区状态 selectedValue: 0 | 1 | 2; // 0为无托盘,1为有托盘,2为托盘抬起 |
|
|
|
const updateheatAearStatus = (selectedValue:any, areaId:string) => { |
|
|
|
let heaterList = statusStore.status?.heater |
|
|
|
if(heaterList){ |
|
|
|
heaterList.forEach(item => { |
|
|
|
if(item.heaterId == areaId){ |
|
|
|
item.trayStatus = selectedValue |
|
|
|
} |
|
|
|
}) |
|
|
|
const data:any = { |
|
|
|
...statusStore.status, |
|
|
|
heater:[...heaterList] |
|
|
|
} |
|
|
|
statusStore.setStatus(data) |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
const onSendCmd = (command:OperationCmd,params:any)=> { |
|
|
|
//发送加热指令 |
|
|
|
taskCmd({ command, params }).then((res) => { |
|
|
@ -717,6 +902,7 @@ const onSendCmd = (command:OperationCmd,params:any)=> { |
|
|
|
margin-left: 1.5rem; |
|
|
|
font-size: 1.25rem; |
|
|
|
color: #40474E; |
|
|
|
display: flex; |
|
|
|
.task_input{ |
|
|
|
border: 1px solid #dcdcdc; |
|
|
|
border-radius: 8px; |
|
|
@ -729,4 +915,9 @@ const onSendCmd = (command:OperationCmd,params:any)=> { |
|
|
|
justify-content: center; |
|
|
|
} |
|
|
|
} |
|
|
|
.cancel_btn{ |
|
|
|
border: 1px solid rgb(226, 226, 226); |
|
|
|
width: 5rem; |
|
|
|
margin-left: 2rem; |
|
|
|
} |
|
|
|
</style> |