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

5 months ago
5 months ago
5 months ago
5 months ago
  1. <script setup lang="ts">
  2. import { getDeviceSelfTest } from 'apis/system'
  3. import FtDialog from 'components/common/FTDialog/index.vue'
  4. import { FtMessage } from 'libs/message'
  5. import { socket } from 'libs/socket'
  6. import { sendControl } from 'libs/utils'
  7. import { nextTick, onMounted, ref } from 'vue'
  8. const emits = defineEmits(['ok', 'cancel'])
  9. const okLoading = ref(false)
  10. const okHandle = () => {
  11. okLoading.value = true
  12. setTimeout(() => {
  13. okLoading.value = false
  14. FtMessage.success('保存成功')
  15. emits('ok')
  16. }, 300)
  17. }
  18. const list = ['x轴是否在原点', 'y轴是否在原点', 'z轴是否在原点']
  19. onMounted(async () => {
  20. let num = 0
  21. await nextTick(() => {
  22. buttonCloseRef.value.setLoading(true)
  23. })
  24. const res = await getDeviceSelfTest()
  25. console.log(res)
  26. const interval = async () => {
  27. if (num < list.length) {
  28. await addTextToCheckList(list[num], num)
  29. num++
  30. await interval() // 递归调用 interval 处理下一条数据
  31. }
  32. }
  33. await interval()
  34. buttonCloseRef.value.setLoading(false)
  35. closeVisible.value = false
  36. })
  37. const cancel = () => {
  38. emits('cancel')
  39. }
  40. const motorXYZOrigin = async () => {
  41. buttonRef.value.setLoading(true)
  42. const cmdId = Date.now().toString()
  43. const params = {
  44. cmdCode: 'device_self_test',
  45. cmdId,
  46. params: {},
  47. }
  48. socket.init((data: any) => {
  49. console.log(data)
  50. if (data.cmdId === cmdId && data.status === 'success') {
  51. buttonRef.value.setLoading(false)
  52. closeVisible.value = true
  53. }
  54. }, 'cmd_response')
  55. await sendControl(params, 'debug')
  56. }
  57. const checkList = ref<any>([])
  58. const buttonRef = ref()
  59. const buttonCloseRef = ref()
  60. const closeVisible = ref(true)
  61. const addTextToCheckList = async (text: string, id: number) => {
  62. // 检查 checkList 中是否存在该 id 的对象,如果不存在则初始化
  63. if (!checkList.value.some(item => item.id === id)) {
  64. checkList.value.push({ id, title: '', result: 'padding' })
  65. }
  66. let displayedText = ''
  67. return new Promise<void>((resolve) => {
  68. const interval = setInterval(() => {
  69. if (displayedText.length < text.length) {
  70. displayedText += text[displayedText.length]
  71. const itemIndex = checkList.value.findIndex(item => item.id === id)
  72. if (itemIndex !== -1) {
  73. checkList.value[itemIndex].title = displayedText
  74. }
  75. }
  76. else {
  77. clearInterval(interval)
  78. // 文字显示完毕后,设置 result 为 'success' 或 'failed' 以显示成功或失败图标
  79. const itemIndex = checkList.value.findIndex(item => item.id === id)
  80. if (itemIndex !== -1) {
  81. // 假设通过随机数来决定成功或失败
  82. setTimeout(() => {
  83. checkList.value[itemIndex].result = 'failed'
  84. resolve() // 解析 Promise,表示当前数据已完全展示
  85. }, Math.random() * 500) // 修改为随机数延时
  86. }
  87. }
  88. }, Math.random() * 200) // 修改为随机数延时
  89. })
  90. }
  91. </script>
  92. <template>
  93. <FtDialog visible title="自检" width="40%" @ok="okHandle" @cancel="cancel">
  94. <div v-for="item in checkList" :key="item.id" class="mask-box">
  95. <el-tag> {{ item.title }}</el-tag>
  96. <el-icon v-show="item.result === 'success'" color="green">
  97. <SuccessFilled />
  98. </el-icon>
  99. <el-icon v-show="item.result === 'failed'" color="red">
  100. <CircleCloseFilled />
  101. </el-icon>
  102. <el-icon v-show="item.result === 'padding'" color="gray" class="el-icon--loading">
  103. <Loading />
  104. </el-icon>
  105. </div>
  106. <template #footer>
  107. <ft-button v-if="closeVisible" ref="buttonCloseRef" @click="cancel">
  108. 关闭
  109. </ft-button>
  110. <ft-button v-else ref="buttonRef" type="primary" @click="motorXYZOrigin">
  111. 回原点
  112. </ft-button>
  113. </template>
  114. </FtDialog>
  115. </template>
  116. <style scoped lang="scss">
  117. .mask-box {
  118. display: flex;
  119. font-size: 35px;
  120. .el-tag {
  121. margin: 0 20px 10px 0;
  122. width: 100%;
  123. }
  124. }
  125. // 添加旋转动画
  126. @keyframes spin {
  127. 0% {
  128. transform: rotate(0deg);
  129. }
  130. 100% {
  131. transform: rotate(360deg);
  132. }
  133. }
  134. .el-icon.el-icon--loading {
  135. animation: spin 1s linear infinite; // 确保 Loading 图标应用 spin 动画
  136. }
  137. </style>