Browse Source

fix: 设备状态判断;自检指令修改

feature/three
guoapeng 3 months ago
parent
commit
0305a6787c
  1. 6
      .env.pre
  2. 39
      src/components/check/index.vue
  3. 72
      src/components/home/AddLiquid/index.vue
  4. 25
      src/components/home/Tube/index.vue
  5. 19
      src/layouts/default.vue
  6. 6
      src/libs/utils.ts
  7. 2
      src/stores/systemStore.ts
  8. 80
      src/views/home/index.vue

6
.env.pre

@ -2,6 +2,6 @@
FT_NODE_ENV=pre
FT_WS_URL=ws://127.0.0.1:8080/ws
FT_PROXY=http://192.168.1.140
FT_API_BASE=/api
FT_WS_URL=ws://192.168.8.108:8080/ws
FT_PROXY=http://192.168.8.108
FT_API_BASE=http://192.168.8.108:8080/api

39
src/components/check/index.vue

@ -15,7 +15,7 @@ const props = defineProps({
checking: Boolean,
type: String,
})
const emits = defineEmits(['update:checking'])
defineEmits(['update:checking'])
const homeStore = useHomeStore()
const visible = ref(props.checking)
const chemicalList = ref<Container.ContainerItem[]>([])
@ -187,10 +187,8 @@ const gantry_origin = async (motor: 'x' | 'y' | 'z') => {
const params = {
commandId: currentCommandId,
command: 'gantry_origin',
params: {
[motor]: true,
},
command: `gantry_${motor}_origin`,
params: {},
}
await homeStore.sendControl(params)
}
@ -236,18 +234,18 @@ const onComplete = () => {
})
}
const cancel = () => {
emits('update:checking', false)
visible.value = false
}
// const cancel = () => {
// emits('update:checking', false)
// visible.value = false
// }
</script>
<template>
<FtDialog v-model="visible" title="设备初始化" width="50%">
<div v-loading="loading" class="check-main">
<div v-if="type !== 'cancel'">
<span style="color: red">所有电机回原点后才可操作</span>
</div>
<!-- <div v-if="type !== 'cancel'"> -->
<!-- <span style="color: red">所有电机回原点后才可操作</span> -->
<!-- </div> -->
<div class="check-status">
<h3>名称</h3>
<h3>是否在原点</h3>
@ -268,9 +266,12 @@ const cancel = () => {
</el-icon>
</div>
<div v-if="!item.isOrign" style="text-align: center;">
<el-link type="primary" @click="resetOrign(item)">
<!-- <el-link type="primary" @click="resetOrign(item)"> -->
<!-- 回原点 -->
<!-- </el-link> -->
<ft-button type="primary" :click-handle="() => resetOrign(item)">
回原点
</el-link>
</ft-button>
</div>
</div>
<!-- <div class="check-status">
@ -289,11 +290,11 @@ const cancel = () => {
</div> -->
</div>
<template #footer>
<FtButton v-if="type === 'cancel'" @click="cancel">
取消
</FtButton>
<FtButton v-if="selfStateComplete" @click="onComplete">
自检完成
<!-- <FtButton v-if="type === 'cancel'" @click="cancel"> -->
<!-- 取消 -->
<!-- </FtButton> -->
<FtButton :disabled="!selfStateComplete" :click-handle="onComplete">
关闭
</FtButton>
</template>
</FtDialog>

72
src/components/home/AddLiquid/index.vue

@ -29,7 +29,7 @@ const receiveMessage = (data: Socket.cmdData) => {
}
const form = ref<{
tubeNum: number
tubeNum: string
solutionId: number
volume: number
}>({})
@ -47,10 +47,10 @@ const rules = {
],
}
const addList = ref<{ tubeNum: number, solutionList: { solutionId: number, volume: number }[] }[]>([])
const addList = ref<{ tubeNum: string, solutionList: { solutionId: number, volume: number }[] }[]>([])
const mergeAddList = () => {
const map = new Map<number, { solutionId: number, volume: number }[]>()
const map = new Map<string, { solutionId: number, volume: number }[]>()
addList.value.forEach((item) => {
if (!map.has(item.tubeNum)) {
@ -74,7 +74,7 @@ const addHandle = async () => {
return
}
addList.value!.push({
tubeNum: form.value.tubeNum,
tubeNum: form.value.tubeNum.toString(),
solutionList: [{
solutionId: form.value.solutionId,
volume: form.value.volume,
@ -113,6 +113,24 @@ const getSols = async () => {
const res = await getSolsList()
solsList.value = res.list
}
const mousedownHandle = async (e: Event) => {
let event
if ('touches' in e) {
event = (e.touches as TouchList)[0]
}
else {
event = e
}
if (event.target!.classList!.contains('tube-inner')) {
const num = event.target!.getAttribute('index')
activeTube.value[Number(num) - 1] = !activeTube.value[Number(num) - 1]
form.value.tubeNum = activeTube.value.map((item, index) => index + 1).filter(item => activeTube.value[item - 1])
console.log(form.value.tubeNum)
}
}
const activeTube = ref(Array.from({ length: 16 }).fill(false))
</script>
<template>
@ -121,9 +139,12 @@ const getSols = async () => {
<el-col :span="12">
<el-form ref="formRef" :model="form" :rules="rules" label-width="auto">
<el-form-item label="选择试管" prop="tubeNum">
<el-select v-model="form.tubeNum" placeholder="请选择试管">
<el-option v-for="item in 16" :key="item" :label="`试管${item}`" :value="item" />
</el-select>
<!-- <el-select v-model="form.tubeNum" placeholder="请选择试管"> -->
<!-- <el-option v-for="item in 16" :key="item" :label="`试管${item}`" :value="item" /> -->
<!-- </el-select> -->
<div class="tube-item" @click.prevent="mousedownHandle" @touch.prevent="mousedownHandle">
<span v-for="item in 16" :key="item" class="tube-inner" :class="{ 'tube-inner-active': activeTube[item - 1] }" :index="item" />
</div>
</el-form-item>
<el-form-item label="选择溶液" prop="solutionId">
<el-select v-model="form.solutionId" placeholder="请选择溶液">
@ -150,7 +171,9 @@ const getSols = async () => {
<template v-if="addList.length">
<el-tag v-for="(item, key) in addList" :key>
<div>
<span>试管{{ item.tubeNum }}</span>
<span>试管[</span>
<span>{{ item.tubeNum }}</span>
<span>]</span>
<span>-</span>
<span>{{ solsList.find(i => i.id === item.solutionList[0].solutionId)!.name }}</span>
<span>添加{{ item.solutionList[0].volume }}ml</span>
@ -172,7 +195,7 @@ const getSols = async () => {
margin-right: 5px;
}
.el-row {
height: 200px;
height: 320px;
.el-col {
height: 100%;
overflow: auto;
@ -187,4 +210,35 @@ const getSols = async () => {
}
}
}
.tube-item {
padding: 5px;
background: #384D5D;
border-radius: 10px;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(4, 1fr);
grid-gap: 5px;
position: relative;
.tube-disable {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
background: rgba(255,255,255,0.9);
border-radius: 9px;
}
.tube-inner {
display: inline-block;
width: 25px;
height: 25px;
border-radius: 50%;
background: #fff;
margin: 2px;
transition: background 0.5s;
}
.tube-inner-active {
background: #26D574;
}
}
</style>

25
src/components/home/Tube/index.vue

@ -57,11 +57,11 @@ const hearInfo = computed(() => {
})
const craft = computed(() => {
return systemStore.systemStatus.tray.find(item => item.heatModuleId === props.data.moduleCode)?.crafts
return systemStore.systemStatus.tray?.find(item => item.heatModuleId === props.data.moduleCode)?.crafts
})
const tray = computed(() => {
return systemStore.systemStatus.tray.find(item => item.heatModuleId === props.data.moduleCode)
return systemStore.systemStatus.tray?.find(item => item.heatModuleId === props.data.moduleCode)
})
const setTemperature = () => {
@ -86,25 +86,6 @@ const stopCraftHandle = async () => {
})
}
const tubes = [
{ tubeNum: 13 },
{ tubeNum: 14 },
{ tubeNum: 15 },
{ tubeNum: 16 },
{ tubeNum: 9 },
{ tubeNum: 10 },
{ tubeNum: 11 },
{ tubeNum: 12 },
{ tubeNum: 5 },
{ tubeNum: 6 },
{ tubeNum: 7 },
{ tubeNum: 8 },
{ tubeNum: 1 },
{ tubeNum: 2 },
{ tubeNum: 3 },
{ tubeNum: 4 },
]
defineExpose({
activeTubeBox,
})
@ -151,7 +132,7 @@ defineExpose({
</div>
<div class="tube-item" @click.prevent="mousedownHandle" @touch.prevent="mousedownHandle">
<div v-if="data.trayStatus === 0" class="tube-disable" />
<span v-for="item in tubes" :key="item.tubeNum" class="tube-inner" :class="{ 'tube-inner-active': tray?.tubes.find(tu => tu.tubeNum === item.tubeNum)?.exists }" :index="item.tubeNum" />
<span v-for="item in 16" :key="item" class="tube-inner" :class="{ 'tube-inner-active': tray?.tubes.find(tu => tu.tubeNum === item)?.exists }" :index="item" />
</div>
<div v-if="data.targetTemperature" class="temperature-box" @click="setTemperature">
<span>

19
src/layouts/default.vue

@ -2,7 +2,6 @@
import Check from 'components/check/index.vue'
import Exit from 'components/exit/index.vue'
import Stop from 'components/home/Stop/index.vue'
import { ElMessageBox } from 'element-plus'
import { useActivateDebug } from 'hooks/useActivateDebug'
import { isClose } from 'libs/socket'
import { formatDateTime } from 'libs/utils'
@ -23,8 +22,9 @@ const timeInterval = setInterval(() => {
}, 1000)
onMounted(() => {
//
onSelfTest()
if (!systemStore.systemStatus.selfTest) {
isCheck.value = true
}
})
onUnmounted(() => {
@ -38,19 +38,6 @@ const onExitHandle = () => {
}
const isCheck = ref(false)
const onSelfTest = () => {
ElMessageBox.confirm(
'请确认是否进行设备自检?',
'设备自检',
{
confirmButtonText: '自检',
cancelButtonText: '取消',
type: 'warning',
},
).then(() => {
isCheck.value = true
})
}
</script>
<template>

6
src/libs/utils.ts

@ -44,6 +44,12 @@ export const cmdNameMap = {
tray_down: '降下托盘',
shake_start: '开始摇匀',
shake_stop: '停止摇匀',
dual_robot_joint_origin: '加液机械臂回原点',
gantry_x_origin: '机械臂x轴回原点',
gantry_y_origin: '机械臂y轴回原点',
gantry_z_origin: '机械臂z轴回原点',
cap_lifting_origin: '拍子电机回原点',
tray_lifting_origin: '加热区托盘电机回原点',
}
export const generateColors = (count: number): string[] => {

2
src/stores/systemStore.ts

@ -8,7 +8,7 @@ export const useSystemStore = defineStore('system', {
selfTest: true,
emergencyStop: false,
door: {
status: false,
open: false,
},
gantryArm: {
idle: true,

80
src/views/home/index.vue

@ -1,6 +1,5 @@
<script setup lang="ts">
import { startCraft } from 'apis/crafts'
import { trayIn, trayOut } from 'apis/home'
import AddLiquid from 'components/home/AddLiquid/index.vue'
import SelectCraft from 'components/home/SelectCraft/index.vue'
import SetTemperature from 'components/home/SetTemperature/index.vue'
@ -71,12 +70,23 @@ const setTemperature = (id: string) => {
}
const addLiquidVisible = ref(false)
const addLiquid = () => {
if (!systemStore.systemStatus.solutionModule.trayStatus) {
FtMessage.warning('加液区无托盘')
return
}
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 () => {
@ -91,18 +101,6 @@ const door_open = async () => {
params: { },
}
await homeStore.sendControl(params)
await ElMessageBox.confirm(
'请确认是否取下托盘?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
showClose: false,
closeOnClickModal: false,
type: 'warning',
},
)
await trayOut()
}
const door_close = async () => {
@ -117,8 +115,20 @@ const door_close = async () => {
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: '确认',
@ -128,19 +138,6 @@ const door_close = async () => {
type: 'warning',
},
)
await trayIn()
}
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
}
currentCommandId = Date.now().toString()
const params = {
@ -159,10 +156,21 @@ const move_to_solution_area = async () => {
FtMessage.warning('请选择一个加热区')
return
}
if (systemStore.systemStatus.solutionModule.trayStatus === 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,

Loading…
Cancel
Save