From d4682ff6a18f39ace9100b160e6450abc63d9394 Mon Sep 17 00:00:00 2001 From: xiaosi <2652281683@qq.com> Date: Wed, 26 Aug 2026 17:13:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=9B=91=E6=8E=A7=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E6=94=B9=E4=B8=BA=E6=9C=BA=E5=B7=A2=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 运行状态旁打开 dock 状态弹窗,header 最大化仍进入设备详情页。 --- src/views/MonitorView/MonitorView.vue | 173 +++++++++++++++++++++++++- 1 file changed, 171 insertions(+), 2 deletions(-) diff --git a/src/views/MonitorView/MonitorView.vue b/src/views/MonitorView/MonitorView.vue index cd15a61..1809279 100644 --- a/src/views/MonitorView/MonitorView.vue +++ b/src/views/MonitorView/MonitorView.vue @@ -60,7 +60,101 @@ 最后在线 {{ dock.updated }}网络中断 - + + + +
暂无匹配设备
@@ -131,7 +225,7 @@

运行状态

- +
无人机电量{{ selectedDrone?.battery || '--' }}
@@ -279,6 +373,7 @@ const livePlayerRef = ref(null) const filter = ref('all') const search = ref('') const controlExpanded = ref(false) +const dockStatusOpen = ref(false) const selectedDockIds = reactive(new Set()) let mapInstance = null @@ -461,6 +556,7 @@ function teardownMap() { } onMounted(async () => { + window.addEventListener('keydown', onGlobalKeydown) try { await devices.load() if (route.query.deviceId && devices.record(route.query.deviceId)) selectedId.value = String(route.query.deviceId) @@ -473,6 +569,7 @@ onMounted(async () => { }) onUnmounted(() => { + window.removeEventListener('keydown', onGlobalKeydown) closeLive() teardownMap() }) @@ -633,6 +730,18 @@ function isClosed(value) { return value === 'closed' || value === 'close' } +function centeringValue(key) { + return rtObj('centering')[key] +} + +function isTight(value) { + return value === 'tight' +} + +function isTrue(value) { + return value === true || value === 'true' || value === '1' || value === 1 +} + function chargeText(value) { const key = String(value || '').toLowerCase() if (key === 'charging') return '充电中' @@ -654,6 +763,66 @@ const doorSummary = computed(() => { const dockControlMode = computed(() => record.value?.mode || displayValue(rt('controlMode'))) +const isAutoMode = computed(() => { + const mode = String(rt('controlMode') || record.value?.mode || '').toLowerCase() + return mode === 'auto' || mode === 'automatic' || mode.includes('自动') +}) + +const dockStatusTitle = computed(() => { + if (!isDrone.value) return selectedAsset.value?.name || '机巢' + return selectedDock.value?.name || selectedDroneParentName.value || '机巢' +}) + +const dockStatusSummary = computed(() => { + const dock = selectedDock.value + const drone = selectedDrone.value + const online = !!dock?.online + const alarms = Array.isArray(dock?.alarms) ? dock.alarms : [] + const alarmCount = alarms.length + const left = doorValue('left') + const right = doorValue('right') + let doorHint = '门状态未知' + if (isClosed(left) && isClosed(right)) doorHint = '左门、右门反馈正常' + else if (left === 'open' || right === 'open') doorHint = '存在开启舱门' + const droneLabel = drone + ? (drone.statusClass === 'mission' ? (drone.status || '任务中') : (drone.status || '在巢待命')) + : '未绑定' + const droneHint = drone + ? `${drone.name || drone.code || '--'}${drone.battery && drone.battery !== '--' ? ` · 电量 ${drone.battery}` : ''}` + : '暂无绑定无人机' + return { + online, + connection: online ? '在线' : (dock?.status || '离线'), + connectionHint: online ? `心跳正常 · ${dock?.updated || '刚刚'}` : (dock?.updated ? `最后在线 ${dock.updated}` : '设备离线'), + drone: droneLabel, + droneHint, + door: doorSummary.value, + doorHint, + charge: chargeText(rt('chargingState')), + chargeHint: isTrue(rt('dronePresent')) ? '电池在位' : '在位状态未知', + mode: dockControlMode.value, + modeHint: `手自动切换:${dockControlMode.value}`, + alarmCount, + alarm: alarmCount ? `${alarmCount} 条` : '无告警', + alarmHint: alarmCount ? alarms.slice(0, 2).join('、') : '急停未触发 · 报警总信号正常' + } +}) + +function openDockStatus() { + if (!selectedId.value) return + dockStatusOpen.value = true +} + +function closeDockStatus() { + dockStatusOpen.value = false +} + +function onGlobalKeydown(event) { + if (event.key === 'Escape' && dockStatusOpen.value) closeDockStatus() +} + + + async function reload() { try { await devices.load()