index.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <template>
  2. <div class="check-body">
  3. <div class="site-content">
  4. <div class="site-row">
  5. <div class="site-progress" :style="`width: ${currentProgress}%`"></div>
  6. <div class="site-label">
  7. <div class="site-node" v-for="(item,index) in checkList" :key="item.modelId">
  8. <div :class="['site',index<=cIndex && cIndex!=null?'normal':'un-info ']" />
  9. <div :class="['site-name',{'active-site-name':index<=cIndex && cIndex!=null}]">{{item.modelName}}</div>
  10. </div>
  11. </div>
  12. </div>
  13. </div>
  14. <div class="site-content mt10">
  15. <div class="check-status">
  16. <el-button type="primary" :loading="cLoading" @click="handleNowCheck(checkList.length)" style="padding:16px 22px;">
  17. 立即巡检
  18. </el-button>
  19. <span class="check-progress">
  20. <span class="t-span">巡检进度:</span>
  21. <el-progress type="circle" :percentage="currentProgress" width="50" stroke-width="4" :color="colors">
  22. <template #default="{ percentage }">
  23. <span class="percentage-value">{{ percentage }}%</span>
  24. </template>
  25. </el-progress>
  26. </span>
  27. <span>
  28. <span v-show="checkTime" class="check-time">
  29. <span class="t-span">巡检时间:</span>
  30. <span class="check-time">{{parseTime(checkTime, '{y}-{m}-{d} {h}:{mi}:{s}')}}</span>
  31. </span>
  32. </span>
  33. </div>
  34. <div class="progress-bar">
  35. <div class="progress-bar-inner" :style="`width: ${currentProgress}%`"/>
  36. </div>
  37. <div class="check-info">
  38. <div class="sub-col">
  39. <el-icon :size="46" color="#409EFF"><Timer /></el-icon>
  40. <div class="s-c-text">
  41. {{cIndex!=null?cIndex+1:0}}/{{checkList.length}}<br/>已检测模型</div>
  42. </div>
  43. <div class="sub-col">
  44. <el-icon :size="46" color="#409EFF"><Compass /></el-icon>
  45. <div class="s-c-text">{{cIndex!=null?Math.ceil((314/checkList.length)*(cIndex+1)):0}}/314<br/>已检测指标</div>
  46. </div>
  47. <div class="sub-col">
  48. <el-icon :size="46" color="#409EFF"><Warning /></el-icon>
  49. <div class="s-c-text">
  50. <span class="s-c-num">{{totalError}}</span>
  51. <br/>已发现问题</div>
  52. </div>
  53. </div>
  54. <el-table :data="listData" style="width: 100%" border class="mt20">
  55. <el-table-column prop="class" label="分类" width="180" />
  56. <el-table-column prop="option" label="巡检项" />
  57. <el-table-column label="巡检进度" align="center" width="180">
  58. <template #default="{row}">
  59. <span v-if="checkTime">
  60. <el-icon size="25" color="#90a4ae" class="rotate" v-if="row.checkProess!=='done'"><Loading /></el-icon>
  61. <el-icon size="25" color="#388e3c" v-else><CircleCheck /></el-icon>
  62. </span>
  63. <span v-else>-</span>
  64. </template>
  65. </el-table-column>
  66. <el-table-column label="巡检结果" align="center" width="180">
  67. <template #default="{row}">
  68. <span v-if="checkTime">
  69. <el-icon size="25" color="#90a4ae" class="rotate" v-if="!row.checkResult"><Loading /></el-icon>
  70. <span v-else class="check-result">
  71. <el-icon size="20" color="#e43"><WarnTriangleFilled /></el-icon>
  72. <span class="res-text">{{row.checkResult}} 项</span>
  73. </span>
  74. </span>
  75. <span v-else>-</span>
  76. </template>
  77. </el-table-column>
  78. </el-table>
  79. </div>
  80. </div>
  81. </template>
  82. <script setup lang="ts">
  83. import {getCheckList,getCheckModel} from "@/api/hl/bm"
  84. import {onMounted} from "vue";
  85. import {Timer,Compass,Warning,Loading,CircleCheck,WarnTriangleFilled} from "@element-plus/icons-vue"
  86. const checkList = ref([])
  87. const cLoading = ref(false)
  88. const currentProgress = ref(0)
  89. const cIndex=ref(null)
  90. const listData = ref([])
  91. const checkTime = ref(null)
  92. const totalError=ref(0)
  93. const colors = [
  94. { color: '#bbdefb', percentage: 20 },
  95. { color: '#90caf9', percentage: 40 },
  96. { color: '#64b5f6', percentage: 60 },
  97. { color: '#2196f3', percentage: 80 },
  98. { color: '#1e88e5', percentage: 100 },
  99. ]
  100. onMounted(async ()=>{
  101. const res = await getCheckList();
  102. checkList.value = res.data
  103. listData.value = res.data[0].classList
  104. })
  105. function convertTime(milliseconds) {
  106. // 将毫秒转换为秒
  107. let seconds = Math.floor(milliseconds / 1000);
  108. // 计算小时、分钟和秒
  109. let hours = Math.floor(seconds / 3600);
  110. let minutes = Math.floor((seconds % 3600) / 60);
  111. let remainingSeconds = seconds % 60;
  112. // 格式化为00:00:00的形式
  113. return padZero(hours) + ":" + padZero(minutes) + ":" + padZero(remainingSeconds);
  114. }
  115. // 在数字前面补零,确保两位数的格式
  116. function padZero(number) {
  117. return (number < 10 ? "0" : "") + number;
  118. }
  119. function getRandomInt(min, max) {
  120. // Math.random() 生成一个 0 到 1 之间的随机数
  121. // max - min + 1 是生成随机数的范围
  122. // Math.floor() 向下取整,确保生成的是整数
  123. return Math.floor(Math.random() * (max - min + 1)) + min;
  124. }
  125. function handleNowCheck(sub){
  126. if(!cLoading.value){
  127. cLoading.value = true
  128. cIndex.value = null;
  129. checkTime.value = new Date()
  130. }
  131. let index = checkList.value.length-sub
  132. currentProgress.value = Number(Number(index / checkList.value.length * 100).toFixed(2))
  133. if(index > checkList.value.length-1) {
  134. return cLoading.value = false
  135. }
  136. setTimeout(async ()=>{
  137. const res = await getCheckModel(checkList.value[index].modelId)
  138. console.log(res)
  139. listData.value[index].checkProess = 'done'
  140. let e = Math.ceil(Math.random()*100)
  141. totalError.value += e
  142. listData.value[index].checkResult = e
  143. cIndex.value = index
  144. handleNowCheck(sub-1)
  145. }, getRandomInt(500, 500))
  146. }
  147. </script>
  148. <style scoped lang="scss">
  149. @import "./css/style.scss";
  150. </style>