|
|
|
|
@ -29,25 +29,64 @@
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
|
import { ref, onMounted, onUnmounted } from 'vue'
|
|
|
|
|
import { DeviceWarningRecordApi, DeviceWarningRecordVO } from '@/api/iot/deviceWarningRecord'
|
|
|
|
|
|
|
|
|
|
const alarms = ref([
|
|
|
|
|
{ time: '08:12:03', level: '严重', type: 'danger', msg: '产线B-包装工位异常停机' },
|
|
|
|
|
{ time: '08:15:27', level: '严重', type: 'danger', msg: '产线C-温控传感器漂移' },
|
|
|
|
|
{ time: '08:20:10', level: '警告', type: 'warn', msg: '产线A-物料待料' },
|
|
|
|
|
{ time: '08:35:42', level: '提示', type: 'safe', msg: '产线E-设备保养提醒' },
|
|
|
|
|
{ time: '08:40:18', level: '提示', type: 'safe', msg: '产线F-成品抽检合格' },
|
|
|
|
|
{ time: '09:02:56', level: '严重', type: 'danger', msg: '产线D-站点扫码失败' },
|
|
|
|
|
{ time: '09:15:12', level: '警告', type: 'warn', msg: '产线H-人员到岗不足' },
|
|
|
|
|
{ time: '09:26:33', level: '警告', type: 'warn', msg: '产线I-实时能耗升高' },
|
|
|
|
|
{ time: '09:37:05', level: '严重', type: 'danger', msg: '产线G-夹具寿命告警' },
|
|
|
|
|
{ time: '09:45:21', level: '警告', type: 'warn', msg: '产线J-物流滞后' }
|
|
|
|
|
])
|
|
|
|
|
const alarms = ref<any[]>([])
|
|
|
|
|
|
|
|
|
|
const isAnimating = ref(false)
|
|
|
|
|
const listRef = ref<HTMLElement | null>(null)
|
|
|
|
|
let timer: ReturnType<typeof setInterval> | null = null
|
|
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
const getAlarms = async () => {
|
|
|
|
|
try {
|
|
|
|
|
const data = await DeviceWarningRecordApi.getList() || []
|
|
|
|
|
console.log('data',data)
|
|
|
|
|
|
|
|
|
|
alarms.value = data.map((item: DeviceWarningRecordVO) => {
|
|
|
|
|
// 格式化时间
|
|
|
|
|
let timeStr = ''
|
|
|
|
|
if (item.createTime) {
|
|
|
|
|
const d = new Date(item.createTime)
|
|
|
|
|
timeStr = d.toTimeString().slice(0, 8)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 映射等级
|
|
|
|
|
let type = 'safe'
|
|
|
|
|
let levelText = item.alarmLevel
|
|
|
|
|
|
|
|
|
|
if (item.alarmLevel === '2') {
|
|
|
|
|
type = 'danger'
|
|
|
|
|
levelText = '严重'
|
|
|
|
|
} else if (item.alarmLevel === '1') {
|
|
|
|
|
type = 'warn'
|
|
|
|
|
levelText = '警告'
|
|
|
|
|
} else if (item.alarmLevel === '0') {
|
|
|
|
|
type = 'safe'
|
|
|
|
|
levelText = '提示'
|
|
|
|
|
} else {
|
|
|
|
|
// 兼容旧数据或文本
|
|
|
|
|
if (item.alarmLevel === '严重') type = 'danger'
|
|
|
|
|
else if (item.alarmLevel === '警告') type = 'warn'
|
|
|
|
|
else if (item.alarmLevel === '提示') type = 'safe'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
time: timeStr,
|
|
|
|
|
level: levelText,
|
|
|
|
|
type: type,
|
|
|
|
|
msg: `${item.deviceName}-${item.ruleName}`
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
startAnimation()
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('Failed to fetch alarms:', error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const startAnimation = () => {
|
|
|
|
|
if (timer) clearInterval(timer)
|
|
|
|
|
if (alarms.value.length === 0) return
|
|
|
|
|
|
|
|
|
|
timer = setInterval(() => {
|
|
|
|
|
isAnimating.value = true
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
@ -58,6 +97,10 @@ onMounted(() => {
|
|
|
|
|
isAnimating.value = false
|
|
|
|
|
}, 360)
|
|
|
|
|
}, 3000)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
getAlarms()
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
onUnmounted(() => {
|
|
|
|
|
|