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.
152 lines
4.1 KiB
152 lines
4.1 KiB
<script setup lang="ts">
|
|
import { getDeviceSelfTest } from 'apis/system'
|
|
import FtDialog from 'components/common/FTDialog/index.vue'
|
|
import { FtMessage } from 'libs/message'
|
|
import { socket } from 'libs/socket'
|
|
import { sendControl } from 'libs/utils'
|
|
import { nextTick, onMounted, ref } from 'vue'
|
|
|
|
const emits = defineEmits(['ok', 'cancel'])
|
|
|
|
const okLoading = ref(false)
|
|
const okHandle = () => {
|
|
okLoading.value = true
|
|
|
|
setTimeout(() => {
|
|
okLoading.value = false
|
|
FtMessage.success('保存成功')
|
|
emits('ok')
|
|
}, 300)
|
|
}
|
|
|
|
const list = ['x轴是否在原点', 'y轴是否在原点', 'z轴是否在原点']
|
|
onMounted(async () => {
|
|
let num = 0
|
|
await nextTick(() => {
|
|
buttonCloseRef.value.setLoading(true)
|
|
})
|
|
const res = await getDeviceSelfTest()
|
|
console.log(res)
|
|
|
|
const interval = async () => {
|
|
if (num < list.length) {
|
|
await addTextToCheckList(list[num], num)
|
|
num++
|
|
await interval() // 递归调用 interval 处理下一条数据
|
|
}
|
|
}
|
|
await interval()
|
|
buttonCloseRef.value.setLoading(false)
|
|
closeVisible.value = false
|
|
})
|
|
|
|
const cancel = () => {
|
|
emits('cancel')
|
|
}
|
|
|
|
const motorXYZOrigin = async () => {
|
|
buttonRef.value.setLoading(true)
|
|
const cmdId = Date.now().toString()
|
|
const params = {
|
|
cmdCode: 'device_self_test',
|
|
cmdId,
|
|
params: {},
|
|
}
|
|
socket.init((data: any) => {
|
|
console.log(data)
|
|
if (data.cmdId === cmdId && data.status === 'success') {
|
|
buttonRef.value.setLoading(false)
|
|
closeVisible.value = true
|
|
}
|
|
}, 'cmd_response')
|
|
await sendControl(params, 'debug')
|
|
}
|
|
|
|
const checkList = ref<any>([])
|
|
const buttonRef = ref()
|
|
const buttonCloseRef = ref()
|
|
|
|
const closeVisible = ref(true)
|
|
|
|
const addTextToCheckList = async (text: string, id: number) => {
|
|
// 检查 checkList 中是否存在该 id 的对象,如果不存在则初始化
|
|
if (!checkList.value.some(item => item.id === id)) {
|
|
checkList.value.push({ id, title: '', result: 'padding' })
|
|
}
|
|
|
|
let displayedText = ''
|
|
return new Promise<void>((resolve) => {
|
|
const interval = setInterval(() => {
|
|
if (displayedText.length < text.length) {
|
|
displayedText += text[displayedText.length]
|
|
const itemIndex = checkList.value.findIndex(item => item.id === id)
|
|
if (itemIndex !== -1) {
|
|
checkList.value[itemIndex].title = displayedText
|
|
}
|
|
}
|
|
else {
|
|
clearInterval(interval)
|
|
// 文字显示完毕后,设置 result 为 'success' 或 'failed' 以显示成功或失败图标
|
|
const itemIndex = checkList.value.findIndex(item => item.id === id)
|
|
if (itemIndex !== -1) {
|
|
// 假设通过随机数来决定成功或失败
|
|
setTimeout(() => {
|
|
checkList.value[itemIndex].result = 'failed'
|
|
resolve() // 解析 Promise,表示当前数据已完全展示
|
|
}, Math.random() * 500) // 修改为随机数延时
|
|
}
|
|
}
|
|
}, Math.random() * 200) // 修改为随机数延时
|
|
})
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<FtDialog visible title="自检" width="40%" @ok="okHandle" @cancel="cancel">
|
|
<div v-for="item in checkList" :key="item.id" class="mask-box">
|
|
<el-tag> {{ item.title }}</el-tag>
|
|
<el-icon v-show="item.result === 'success'" color="green">
|
|
<SuccessFilled />
|
|
</el-icon>
|
|
<el-icon v-show="item.result === 'failed'" color="red">
|
|
<CircleCloseFilled />
|
|
</el-icon>
|
|
<el-icon v-show="item.result === 'padding'" color="gray" class="el-icon--loading">
|
|
<Loading />
|
|
</el-icon>
|
|
</div>
|
|
<template #footer>
|
|
<ft-button v-if="closeVisible" ref="buttonCloseRef" @click="cancel">
|
|
关闭
|
|
</ft-button>
|
|
<ft-button v-else ref="buttonRef" type="primary" @click="motorXYZOrigin">
|
|
回原点
|
|
</ft-button>
|
|
</template>
|
|
</FtDialog>
|
|
</template>
|
|
|
|
<style scoped lang="scss">
|
|
.mask-box {
|
|
display: flex;
|
|
font-size: 35px;
|
|
.el-tag {
|
|
margin: 0 20px 10px 0;
|
|
width: 100%;
|
|
}
|
|
}
|
|
|
|
// 添加旋转动画
|
|
@keyframes spin {
|
|
0% {
|
|
transform: rotate(0deg);
|
|
}
|
|
100% {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
|
|
.el-icon.el-icon--loading {
|
|
animation: spin 1s linear infinite; // 确保 Loading 图标应用 spin 动画
|
|
}
|
|
</style>
|