From 89380e6260a75d1d3b94de687ebcc2f50d50659d Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Tue, 03 Feb 2026 15:44:33 +0800
Subject: [PATCH] feat:环境变量配置调整

---
 applications/drone-command/src/views/dataCockpit/index.vue |  164 +++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 141 insertions(+), 23 deletions(-)

diff --git a/applications/drone-command/src/views/dataCockpit/index.vue b/applications/drone-command/src/views/dataCockpit/index.vue
index 5226ea0..1224bd5 100644
--- a/applications/drone-command/src/views/dataCockpit/index.vue
+++ b/applications/drone-command/src/views/dataCockpit/index.vue
@@ -2,7 +2,7 @@
  * @Author       : yuan
  * @Date         : 2026-01-06 16:35:50
  * @LastEditors  : yuan
- * @LastEditTime : 2026-01-09 16:34:39
+ * @LastEditTime : 2026-01-31 15:40:15
  * @FilePath     : \applications\drone-command\src\views\dataCockpit\index.vue
  * @Description  : 
  * Copyright 2026 OBKoro1, All Rights Reserved. 
@@ -10,24 +10,55 @@
 -->
 <template>
   <div class="page-container">
-    <MapContainer :online-devices="onlineDevices" :left-collapsed="leftCollapsed" />  
-    <LeftContainer class="left-container" v-model:activeId="leftActiveId" v-model:collapsed="leftCollapsed" />  
-    <RightContainer class="right-container" v-model:collapsed="rightCollapsed" v-model:onlineDevices="onlineDevices" />  
+    <DeviceMapContainer
+      :all-devices="allDevices"
+      :alarm-drones="realWarningData"
+      :left-collapsed="leftCollapsed"
+      container-id="data-cockpit-map"
+      @drone-signal="handleAlarmAction('signal', $event)"
+      @drone-counter="handleAlarmAction('counter', $event)"
+      @drone-favorite="handleAlarmFavorite"
+    />  
+    <LeftContainer
+      class="left-container"
+      v-model:activeId="leftActiveId"
+      v-model:collapsed="leftCollapsed"
+      :real-warning-data="realWarningData"
+      :real-warning-loading="realWarningLoading"
+      @real-warning-signal="handleAlarmAction('signal', $event)"
+      @real-warning-counter="handleAlarmAction('counter', $event)"
+      @real-warning-favorite="handleAlarmFavorite"
+    />  
+    <RightContainer class="right-container" v-model:collapsed="rightCollapsed" 
+      v-model:allDevices="allDevices" />  
     <CenterContainer @select-warning="onSelectWarning" @select-equipment="onSelectEquipment" />  
+    <LegendBar class="legend-container" />
   </div>
 </template>
 
 <script setup>
-  import MapContainer from './components/MapContainer.vue';
+  import DeviceMapContainer from '@/components/map-container/device-map-container.vue';
   import LeftContainer from './components/LeftContainer.vue';
   import RightContainer from './components/RightContainer.vue';
   import CenterContainer from './components/CenterContainer.vue';
+  import LegendBar from './components/LegendBar.vue';
+  import {
+    alarmLogApi,
+    alarmFavoriteRemoveApi,
+    alarmFavoriteSaveApi,
+    interferenceAndExpulsionApi
+  } from '@/api/dataCockpit';
+  import { ElMessage } from 'element-plus';
+  import { onMounted, ref } from 'vue';
 
   const leftActiveId = ref(1);
   const leftCollapsed = ref(false);
 
   const rightCollapsed = ref(false);
-  const onlineDevices = ref([]);
+  const allDevices = ref([]);
+  const realWarningData = ref([]);
+  const realWarningLoading = ref(true);
+  const minLoadingMs = 400;
 
   const onSelectWarning = (type) => {
     leftActiveId.value = type;
@@ -37,6 +68,93 @@
   const onSelectEquipment = () => {
     rightCollapsed.value = false;
   };
+
+  const actionTextMap = {
+    signal: '信号干扰',
+    counter: '诱导驱离'
+  };
+
+  const getAlarmRecordId = (item) => item?.alarmRecordId ?? item?.id;
+  const getFavoriteId = (item) =>
+    item?.favoriteId ??
+    item?.alarmFavoriteId ??
+    item?.fwAlarmFavoriteId ??
+    item?.favoriteRecordId ??
+    getAlarmRecordId(item);
+
+  const isFavorited = (item) => {
+    const value = item?.favorited ?? item?.isFavorite;
+    return value === 1 || value === '1' || value === true;
+  };
+
+  const buildPayload = (type, item) => ({
+    counterWay: type === 'signal' ? 1 : type === 'counter' ? 2 : '',
+    alarmRecordId: getAlarmRecordId(item)
+  });
+
+  const handleAlarmAction = async (type, item) => {
+    const actionText = actionTextMap[type] || '操作';
+    try {
+      const res = await interferenceAndExpulsionApi(buildPayload(type, item));
+      if (res?.data?.success) {
+        ElMessage({ type: 'success', message: actionText + '成功' });
+        await fetchRealWarning();
+      } else {
+        ElMessage({ type: 'error', message: res?.data?.msg || actionText + '失败' });
+      }
+    } catch (error) {
+      ElMessage({ type: 'error', message: actionText + '失败' });
+    }
+  };
+
+  const handleAlarmFavorite = async (item) => {
+    const alarmRecordId = getAlarmRecordId(item);
+    if (!alarmRecordId) {
+      ElMessage({ type: 'warning', message: '缺少告警记录ID' });
+      return;
+    }
+    const favorite = isFavorited(item);
+    const actionText = favorite ? '取消关注' : '关注';
+    try {
+      const res = favorite
+        ? await alarmFavoriteRemoveApi(getFavoriteId(item))
+        : await alarmFavoriteSaveApi({ alarmRecordId });
+      if (res?.data?.success) {
+        ElMessage({ type: 'success', message: actionText + '成功' });
+        await fetchRealWarning();
+      } else {
+        ElMessage({ type: 'error', message: res?.data?.msg || actionText + '失败' });
+      }
+    } catch (error) {
+      ElMessage({ type: 'error', message: actionText + '失败' });
+    }
+  };
+
+  const fetchRealWarning = async () => {
+    const startAt = Date.now();
+    realWarningLoading.value = true;
+    try {
+      const params = { current: 1, size: 9999, alarmType: '1' };
+      const res = await alarmLogApi(params);
+      const records = res?.data?.data?.records ?? [];
+      realWarningData.value = records.map((record) => ({
+        ...record,
+        isFavorite:
+          record?.isFavorite ??
+          (record?.favorited === 1 || record?.favorited === '1')
+      }));
+    } finally {
+      const elapsed = Date.now() - startAt;
+      if (elapsed < minLoadingMs) {
+        await new Promise((resolve) => setTimeout(resolve, minLoadingMs - elapsed));
+      }
+      realWarningLoading.value = false;
+    }
+  };
+
+  onMounted(() => {
+    fetchRealWarning();
+  });
 </script>
 
 <style scoped lang="scss">
@@ -49,44 +167,44 @@
   .left-container,
   .right-container {
     position: absolute;
-    top: 96px;
-    bottom: 0;
-    width: 401px;
+    bottom: 20px;
+    width: 300px;
     z-index: 9;
     backdrop-filter: blur(2px);
+    border-radius: 10px 10px 10px 10px;
 
     ::v-deep(.wrapper) {
       display: flex;
       flex-direction: column;
       position: absolute;
-      top: 17px;
-      bottom: 20px;
+      top: 0;
+      bottom: 0;
       padding: 20px;
       width: 300px;
       background: rgba(0,0,0,0.3);
       backdrop-filter: blur(16px);
       border-radius: 10px 10px 10px 10px;
+      box-sizing: border-box;
     }
   }
 
   .left-container {
-    top: 96px;
-    left: 0;
+    top: 113px;
+    left: 17px;
     background: linear-gradient( 270deg, rgba(17,23,34,0) 0%, rgba(17,23,34,0.56) 50%, rgba(17,23,34,0.96) 100%);
-
-    ::v-deep(.wrapper) {
-      left: 17px;
-    }
   }
 
   .right-container {
-    top: 54px;
-    right: 0;
+    top: 75px;
+    right: 17px;
     background: linear-gradient( 270deg, rgba(17,23,34,0.96) 0.16%, rgba(17,23,34,0.56) 57.57%, rgba(4,30,37,0) 100%);
+  }
 
-    ::v-deep(.wrapper) {
-      top: 21px;
-      right: 17px;
-    }
+  .legend-container {
+    position: absolute;
+    left: 50%;
+    bottom: 22px;
+    transform: translateX(-50%);
+    z-index: 9;
   }
 </style>

--
Gitblit v1.9.3