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.
329 lines
10 KiB
329 lines
10 KiB
<script lang="ts" setup>
|
|
import { getSelfFinish, getSelfStatus } from 'apis/self'
|
|
import { requireOutTray } from 'apis/system'
|
|
import { ElMessageBox } from 'element-plus'
|
|
import { socket } from 'libs/socket'
|
|
import { useHomeStore } from 'stores/homeStore'
|
|
import { useSystemStore } from 'stores/systemStore'
|
|
import { onMounted, ref, watch } from 'vue'
|
|
|
|
const emits = defineEmits(['close'])
|
|
const homeStore = useHomeStore()
|
|
const systemStore = useSystemStore()
|
|
|
|
const checkMap = ref(new Map([
|
|
['gantryZOrigin', { status: '', name: '龙门架z轴回原点', params: { commandId: '', command: `gantry_z_origin`, params: {} } }],
|
|
['gantryXOrigin', { status: '', name: '龙门架x轴回原点', params: { commandId: '', command: `gantry_x_origin`, params: {} } }],
|
|
['gantryYOrigin', { status: '', name: '龙门架y轴回原点', params: { commandId: '', command: `gantry_y_origin`, params: {} } }],
|
|
['trayLifting01Origin', { status: '', name: 'A-1托盘升降电机回原点', params: { commandId: '', command: `tray_lifting_origin`, params: { heatId: 'heat_module_01' } } }],
|
|
['trayLifting02Origin', { status: '', name: 'A-2托盘升降电机回原点', params: { commandId: '', command: `tray_lifting_origin`, params: { heatId: 'heat_module_02' } } }],
|
|
['trayLifting03Origin', { status: '', name: 'A-3托盘升降电机回原点', params: { commandId: '', command: `tray_lifting_origin`, params: { heatId: 'heat_module_03' } } }],
|
|
['trayLifting04Origin', { status: '', name: 'A-4托盘升降电机回原点', params: { commandId: '', command: `tray_lifting_origin`, params: { heatId: 'heat_module_04' } } }],
|
|
['trayLifting05Origin', { status: '', name: 'A-5托盘升降电机回原点', params: { commandId: '', command: `tray_lifting_origin`, params: { heatId: 'heat_module_05' } } }],
|
|
['trayLifting06Origin', { status: '', name: 'A-6托盘升降电机回原点', params: { commandId: '', command: `tray_lifting_origin`, params: { heatId: 'heat_module_06' } } }],
|
|
['capLiftingOrigin', { status: '', name: '拍子升降电机回原点', params: { commandId: '', command: `cap_lifting_origin` } }],
|
|
['doorOrigin', { status: '', name: '门电机回原点', params: { commandId: '', command: `door_origin`, params: {} } }],
|
|
['shakeOrigin', { status: '', name: '摇匀电机回原点', params: { commandId: '', command: `shake_origin`, params: {} } }],
|
|
['dualRobotOrigin', { status: '', name: '加液机械臂回原点', params: { commandId: '', command: `dual_robot_origin`, params: {} } }],
|
|
]))
|
|
|
|
const checkList = ref<any[]>([])
|
|
|
|
onMounted(async () => {
|
|
socket.init(receiveMessage1, 'cmd_debug')
|
|
socket.init(receiveMessage2, 'cmd_response')
|
|
socket.init(receiveMessageSelfMove, 'self_move_test')
|
|
const res = await getSelfStatus()
|
|
for (const key in res) {
|
|
const entry = checkMap.value.get(key)
|
|
if (entry) {
|
|
entry.status = res[key] ? 'success' : 'error'
|
|
}
|
|
}
|
|
await ElMessageBox.confirm(
|
|
'设备转运机械臂x、y、z需进行初始化,请确认机械臂行进路径无杂物,夹爪没有在夹取物品',
|
|
'提示',
|
|
{
|
|
confirmButtonText: '确认',
|
|
showClose: false,
|
|
showCancelButton: false,
|
|
closeOnClickModal: false,
|
|
closeOnPressEscape: false,
|
|
type: 'warning',
|
|
customClass: 'init-message',
|
|
},
|
|
)
|
|
const keys = [...checkMap.value.keys()]
|
|
checkList.value.push(checkMap.value.get(keys[0]), checkMap.value.get(keys[1]), checkMap.value.get(keys[2]))
|
|
})
|
|
|
|
watch(() => checkList.value, async (newVal) => {
|
|
console.log('checkList', newVal)
|
|
if (newVal.length === 3 && newVal.every(item => item.status === 'success')) {
|
|
await ElMessageBox.confirm(
|
|
'加热模组升降、拍子存放模组升降、电动门升降、摇匀模组、加液机械臂需进行初始化,请确认升降范围无杂物',
|
|
'提示',
|
|
{
|
|
confirmButtonText: '确认',
|
|
showClose: false,
|
|
showCancelButton: false,
|
|
closeOnClickModal: false,
|
|
closeOnPressEscape: false,
|
|
type: 'warning',
|
|
customClass: 'init-message',
|
|
},
|
|
)
|
|
const keys = [...checkMap.value.keys()]
|
|
for (let i = 3; i < keys.length; i++) {
|
|
checkList.value.push(checkMap.value.get(keys[i]))
|
|
}
|
|
}
|
|
}, { deep: true })
|
|
|
|
let currentCommandId = ''
|
|
|
|
const receiveMessage1 = (data: Socket.cmdData) => {
|
|
data.commandId === currentCommandId && systemStore.pushSystemList(data)
|
|
}
|
|
const receiveMessage2 = (data: Socket.cmdData) => {
|
|
data.commandId === currentCommandId && systemStore.pushSystemList(data)
|
|
const item = checkList.value.find(item => item.params.commandId === data.commandId)
|
|
if (item && data.commandId === item.params.commandId && ['success', 'error'].includes(data.status)) {
|
|
item.status = data.status
|
|
}
|
|
|
|
const item1 = heatList.value.find(item => item.params.commandId === data.commandId)
|
|
if (item1 && data.commandId === item1.params.commandId && ['success', 'error'].includes(data.status)) {
|
|
item.status = data.status
|
|
}
|
|
}
|
|
|
|
const commandHandle = async (data: any) => {
|
|
data.params.commandId = currentCommandId = Date.now().toString()
|
|
await homeStore.sendControl(data!.params)
|
|
}
|
|
|
|
const onConfirm = async () => {
|
|
await getSelfFinish(true)
|
|
emits('close')
|
|
}
|
|
|
|
const percentage = ref(0)
|
|
|
|
const checkHandle = async () => {
|
|
activeStep.value = 1
|
|
await ElMessageBox.confirm(
|
|
'设备即将开始自检',
|
|
'提示',
|
|
{
|
|
confirmButtonText: '确认',
|
|
showClose: false,
|
|
showCancelButton: false,
|
|
closeOnClickModal: false,
|
|
closeOnPressEscape: false,
|
|
type: 'warning',
|
|
customClass: 'init-message',
|
|
},
|
|
)
|
|
currentCommandId = Date.now().toString()
|
|
const params = {
|
|
commandId: currentCommandId,
|
|
command: 'move_test',
|
|
params: {},
|
|
}
|
|
await homeStore.sendControl(params)
|
|
}
|
|
|
|
const checkTextList = ref<string[]>([])
|
|
|
|
const receiveMessageSelfMove = (data: any) => {
|
|
checkTextList.value.push(data.title)
|
|
percentage.value = data.schedule
|
|
}
|
|
|
|
const activeStep = ref(0)
|
|
|
|
const heatList = ref([
|
|
{
|
|
name: 'A-1',
|
|
status: 'success',
|
|
command: 'heat_module_01',
|
|
params: { commandId: '', command: `tray_out`, params: { heatId: 'heat_module_01' } },
|
|
},
|
|
{
|
|
name: 'A-2',
|
|
status: 'success',
|
|
command: 'heat_module_02',
|
|
params: { commandId: '', command: `tray_out`, params: { heatId: 'heat_module_02' } },
|
|
},
|
|
{
|
|
name: 'A-3',
|
|
status: 'success',
|
|
command: 'heat_module_03',
|
|
params: { commandId: '', command: `tray_out`, params: { heatId: 'heat_module_03' } },
|
|
},
|
|
{
|
|
name: 'A-4',
|
|
status: 'success',
|
|
command: 'heat_module_04',
|
|
params: { commandId: '', command: `tray_out`, params: { heatId: 'heat_module_04' } },
|
|
},
|
|
{
|
|
name: 'A-5',
|
|
status: 'success',
|
|
command: 'heat_module_05',
|
|
params: { commandId: '', command: `tray_out`, params: { heatId: 'heat_module_05' } },
|
|
},
|
|
{
|
|
name: 'A-6',
|
|
status: 'success',
|
|
command: 'heat_module_06',
|
|
params: { commandId: '', command: `tray_out`, params: { heatId: 'heat_module_06' } },
|
|
},
|
|
])
|
|
|
|
const checkHandle1 = async () => {
|
|
const res = await requireOutTray()
|
|
res.forEach((item) => {
|
|
const heatItem = heatList.value.find(heatItem => heatItem.command === item.moduleCode)
|
|
heatItem!.status = item.trayExist ? 'error' : 'success'
|
|
})
|
|
activeStep.value = 2
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<FtDialog visible title="设备初始化" width="60%">
|
|
<el-steps style="max-width: 600px" :active="activeStep" finish-status="success">
|
|
<el-step title="初始化" />
|
|
<el-step title="自检" />
|
|
<el-step title="设备状态" />
|
|
</el-steps>
|
|
<div v-if="activeStep === 0" class="check-main">
|
|
<div v-for="item in checkList" :key="item.name" class="check-item">
|
|
<el-tag>{{ item.name }}</el-tag>
|
|
<el-icon v-if="item.status === 'success'" color="#26D574">
|
|
<CircleCheckFilled />
|
|
</el-icon>
|
|
<el-icon v-else-if="item.status === 'error'" color="#FE0A0A">
|
|
<CircleCloseFilled />
|
|
</el-icon>
|
|
<el-icon v-else-if="item.status === ''" class="el-icon--loading">
|
|
<Loading />
|
|
</el-icon>
|
|
<ft-button v-if="item.status !== 'success'" size="small" type="primary" :click-handle="() => commandHandle(item)">
|
|
回原点
|
|
</ft-button>
|
|
</div>
|
|
</div>
|
|
<div v-if="activeStep === 1" class="check-box">
|
|
<div class="progress-box">
|
|
<p>自检进度: </p>
|
|
<el-progress
|
|
:stroke-width="20"
|
|
:percentage="percentage"
|
|
/>
|
|
</div>
|
|
<ul>
|
|
<li v-for="item in checkTextList" :key="item">
|
|
{{ item }}
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div v-if="activeStep === 2" class="check-box">
|
|
<div v-for="item in heatList" :key="item.name" class="check-item">
|
|
<el-tag>{{ item.name }}</el-tag>
|
|
<el-icon v-if="item.status === 'success'" color="#26D574">
|
|
<CircleCheckFilled />
|
|
</el-icon>
|
|
<el-icon v-else-if="item.status === 'error'" color="#FE0A0A">
|
|
<CircleCloseFilled />
|
|
</el-icon>
|
|
<el-icon v-else-if="item.status === ''" class="el-icon--loading">
|
|
<Loading />
|
|
</el-icon>
|
|
<ft-button v-if="item.status !== 'success'" size="small" type="primary" :click-handle="() => commandHandle(item)">
|
|
移出托盘
|
|
</ft-button>
|
|
</div>
|
|
</div>
|
|
|
|
<template #footer>
|
|
<div style="height: 40px">
|
|
<FtButton v-if="activeStep === 0 && checkList.length === 13 && checkList.every(item => item.status === 'success')" type="primary" :click-handle="checkHandle">
|
|
下一步
|
|
</FtButton>
|
|
<FtButton v-if="activeStep === 1 && percentage === 100" type="primary" :click-handle="checkHandle1">
|
|
下一步
|
|
</FtButton>
|
|
<FtButton v-if="activeStep === 2" :click-handle="onConfirm">
|
|
关闭
|
|
</FtButton>
|
|
</div>
|
|
</template>
|
|
</FtDialog>
|
|
</template>
|
|
|
|
<style scoped>
|
|
.check-box {
|
|
height: 45vh;
|
|
ul {
|
|
li {
|
|
margin: 3px 0;
|
|
}
|
|
}
|
|
}
|
|
.progress-box {
|
|
width: 100%;
|
|
display: flex;
|
|
align-items: center;
|
|
p {
|
|
margin-right: 10px;
|
|
}
|
|
span {
|
|
margin-left: 10px;
|
|
}
|
|
.el-progress {
|
|
flex: 1;
|
|
}
|
|
}
|
|
.check-main{
|
|
height: 65vh;
|
|
overflow: auto;
|
|
|
|
}
|
|
|
|
.check-item {
|
|
width: 100%;
|
|
display: flex;
|
|
align-items: center;
|
|
margin-bottom: 10px;
|
|
.el-tag {
|
|
flex: 1;
|
|
}
|
|
.el-icon {
|
|
margin: 0 10px;
|
|
font-size: 18px;
|
|
}
|
|
}
|
|
|
|
.check-status{
|
|
display: grid;
|
|
grid-template-columns: 2fr 1fr 1fr;
|
|
margin-top: 5px;
|
|
height: 30px;
|
|
}
|
|
@keyframes spin {
|
|
0% {
|
|
transform: rotate(0deg);
|
|
}
|
|
100% {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
|
|
.el-icon.el-icon--loading {
|
|
animation: spin 1s linear infinite;
|
|
}
|
|
</style>
|