Browse Source

feat: poll monitor device status every 5s

main
xiaosi 2 weeks ago
parent
commit
cc92ad5ef9
  1. 77
      src/views/MonitorView/MonitorView.vue

77
src/views/MonitorView/MonitorView.vue

@ -137,6 +137,7 @@ const {
}) })
function onPageHide() { function onPageHide() {
stopDevicePolling()
disposeLive({ keepalive: true }) disposeLive({ keepalive: true })
} }
@ -146,6 +147,62 @@ const controlExpanded = ref(false)
const dockStatusOpen = ref(false) const dockStatusOpen = ref(false)
const selectedDockIds = reactive(new Set()) const selectedDockIds = reactive(new Set())
const DEVICE_POLL_MS = 5000
let devicePollTimer = null
let devicePollInflight = null
let devicePollGen = 0
let monitorDisposed = false
function clearDevicePollTimer() {
window.clearInterval(devicePollTimer)
devicePollTimer = null
}
async function pollDevices({ toastOnSuccess = false } = {}) {
if (monitorDisposed) return
if (devicePollInflight) return
const gen = devicePollGen
devicePollInflight = devices.load()
try {
await devicePollInflight
if (monitorDisposed || gen !== devicePollGen) return
if (selectedId.value && !devices.record(selectedId.value)) clearSelection()
selectedDockIds.forEach((id) => {
if (!devices.docks.some((dock) => dock.id === id)) selectedDockIds.delete(id)
})
syncMarkers()
if (toastOnSuccess) ui.toast('设备状态已刷新')
} catch (e) {
if (monitorDisposed || gen !== devicePollGen) return
if (toastOnSuccess) ui.toast(e.message || '刷新设备状态失败')
else console.warn('[monitor] device poll failed', e)
} finally {
devicePollInflight = null
}
}
function startDevicePolling() {
clearDevicePollTimer()
if (monitorDisposed || document.visibilityState === 'hidden') return
devicePollTimer = window.setInterval(() => {
void pollDevices()
}, DEVICE_POLL_MS)
}
function stopDevicePolling() {
clearDevicePollTimer()
}
function onDevicePollVisibility() {
if (monitorDisposed) return
if (document.visibilityState === 'hidden') {
stopDevicePolling()
return
}
void pollDevices()
startDevicePolling()
}
let mapInstance = null let mapInstance = null
let layersReady = false let layersReady = false
let pendingLoadHandler = null let pendingLoadHandler = null
@ -660,8 +717,10 @@ function teardownMap() {
} }
onMounted(async () => { onMounted(async () => {
monitorDisposed = false
window.addEventListener('pagehide', onPageHide) window.addEventListener('pagehide', onPageHide)
window.addEventListener('keydown', onGlobalKeydown) window.addEventListener('keydown', onGlobalKeydown)
document.addEventListener('visibilitychange', onDevicePollVisibility)
try { try {
await devices.load() await devices.load()
if (route.query.deviceId && devices.record(route.query.deviceId)) selectedId.value = String(route.query.deviceId) if (route.query.deviceId && devices.record(route.query.deviceId)) selectedId.value = String(route.query.deviceId)
@ -670,6 +729,7 @@ onMounted(async () => {
} catch (e) { } catch (e) {
ui.toast(e.message || '加载设备失败') ui.toast(e.message || '加载设备失败')
} }
startDevicePolling()
try { try {
await setupMap() await setupMap()
} catch (e) { } catch (e) {
@ -678,6 +738,10 @@ onMounted(async () => {
}) })
onUnmounted(() => { onUnmounted(() => {
monitorDisposed = true
devicePollGen += 1
stopDevicePolling()
document.removeEventListener('visibilitychange', onDevicePollVisibility)
window.removeEventListener('pagehide', onPageHide) window.removeEventListener('pagehide', onPageHide)
window.removeEventListener('keydown', onGlobalKeydown) window.removeEventListener('keydown', onGlobalKeydown)
closeCommandProgress() closeCommandProgress()
@ -1042,19 +1106,10 @@ function onGlobalKeydown(event) {
async function reload() { async function reload() {
try {
await devices.load()
if (selectedId.value && !devices.record(selectedId.value)) clearSelection()
selectedDockIds.forEach((id) => {
if (!devices.docks.some((dock) => dock.id === id)) selectedDockIds.delete(id)
})
syncMarkers()
await pollDevices({ toastOnSuccess: true })
if (monitorDisposed) return
if (selectedId.value) flyToSelected() if (selectedId.value) flyToSelected()
else resetOverviewCamera() else resetOverviewCamera()
ui.toast('设备状态已刷新')
} catch (e) {
ui.toast(e.message || '刷新设备状态失败')
}
} }
const groupedDocks = computed(() => const groupedDocks = computed(() =>

Loading…
Cancel
Save