Quellcode durchsuchen

Merge remote-tracking branch 'origin/dev' into dev

Hwf vor 7 Monaten
Ursprung
Commit
c1fbf523d9

+ 4 - 4
src/api/globalMap/Helicopter.ts

@@ -2,18 +2,18 @@
 
 import request from '@/utils/request';
 // 列表信息
-export const getDroneResourcesList = (data) => {
+export const getHelicopterList = (data) => {
   return request({
-    url: '/api/gateway/v2/get_drone_resources_info',
+    url: '/api/gateway/v2/get_helicopter_info',
     method: 'post',
     data: data
   });
 };
 
 // 轨迹信息
-export const getDroneResourcesTrajectory = (id) => {
+export const getHelicopterTrajectory = (id) => {
   return request({
-    url: '/api/gateway/v2/get_drone_resources_trajectory',
+    url: '/api/gateway/v2/get_helicopter_trajectory',
     method: 'post',
     data: {
       query: {

+ 2 - 2
src/api/globalMap/KeyVehicles.ts

@@ -10,13 +10,13 @@ export const getVehicleList = (data) => {
 };
 
 // 轨迹信息
-export const getVehicleTrajectory = (id) => {
+export const getVehicleTrajectory = (vehicle_no) => {
   return request({
     url: '/api/gateway/v2/get_vehicle_trajectory',
     method: 'post',
     data: {
       query: {
-        id: id
+        vehicle_no: vehicle_no
       }
     }
   });

+ 19 - 5
src/api/globalMap/MobileCommandVehicle.ts

@@ -1,19 +1,19 @@
-//移动指挥车 目前接口是用了无人机的,后续需要后端补充更换移动指挥车的接口
+//直升机 调用了无人机的接口,待后端接口确定后修改
 
 import request from '@/utils/request';
 // 列表信息
-export const getDroneResourcesList = (data) => {
+export const getMobileCommandVehicleList = (data) => {
   return request({
-    url: '/api/gateway/v2/get_drone_resources_info',
+    url: '/api/gateway/v2/get_mobile_command_vehicle_list_info',
     method: 'post',
     data: data
   });
 };
 
 // 轨迹信息
-export const getDroneResourcesTrajectory = (id) => {
+export const getMobileCommandVehicleTrajectory = (id) => {
   return request({
-    url: '/api/gateway/v2/get_drone_resources_trajectory',
+    url: '/api/gateway/v2/get_mobile_command_vehicle_trajectory',
     method: 'post',
     data: {
       query: {
@@ -22,3 +22,17 @@ export const getDroneResourcesTrajectory = (id) => {
     }
   });
 };
+
+// 车辆信息
+export const getMobileCarInfo = (id) => {
+  return request({
+    url: '/api/gateway/v2/get_mobile_command_vehicle_info',
+    method: 'post',
+    data: {
+      query: {
+        id: id
+      }
+    }
+  });
+};
+

+ 14 - 0
src/api/globalMap/MobileUnmannedVehicle.ts

@@ -22,3 +22,17 @@ export const getDroneResourcesTrajectory = (id) => {
     }
   });
 };
+
+// 视频列表
+export const getDroneResourcesVideo = (id) => {
+  return request({
+    url: '/api/gateway/v2/get_drone_resources_video',
+    method: 'post',
+    data: {
+      query: {
+        id: id
+      }
+    }
+  });
+};
+

+ 12 - 0
src/api/globalMap/spatialAnalysis.ts

@@ -316,3 +316,15 @@ export const getMidmapDzzhDetails = (id: string) => {
   });
 };
 
+//重点车辆详情
+export const getVehicleDetails = (id: string) => {
+  return request({
+    url: '/api/gateway/v2/get_vehicle_info',
+    method: 'post',
+    data: {
+      query: {
+        id: id
+      }
+    }
+  });
+};

+ 6 - 4
src/components/Map/index.vue

@@ -44,8 +44,8 @@ import {
   getMiningOperationsDetails,
   getEmergencyTransportResourcesDetails,
   getEmergencyDisasterInfoOfficerDetails,
-  getMidmapDzzhDetails
-} from '@/api/globalMap/spatialAnalysis';
+  getMidmapDzzhDetails, getVehicleDetails
+} from "@/api/globalMap/spatialAnalysis";
 import { pointDetailTemplate } from '@/views/globalMap/data/mapData';
 import ElementResizeDetectorMaker from 'element-resize-detector';
 import useAppStore from '@/store/modules/app';
@@ -212,7 +212,8 @@ const handlePointDetails = (data) => {
     '26': getTouristAttractionDetails,
     '27': getConstructionSitesDetails,
     '28': getEmergencyTransportResourcesDetails,
-    '29': getEmergencyDisasterInfoOfficerDetails
+    '29': getEmergencyDisasterInfoOfficerDetails,
+    '30': getVehicleDetails
   };
   let titleList = {
     '1': '专家信息',
@@ -243,7 +244,8 @@ const handlePointDetails = (data) => {
     '26': '旅游场所',
     '27': '在建工地',
     '28': '运输资源',
-    '29': '灾害信息员'
+    '29': '灾害信息员',
+    '30': '重点车辆信息'
   };
   let method = methodList[data.dataType];
   let title = !!titleList[data.dataType] ? titleList[data.dataType] : '信息';

+ 4 - 4
src/views/globalMap/RightMenu/Helicopter.vue

@@ -23,7 +23,7 @@
       </div>
       <div class="table-content">
         <div v-for="(item, index) in dataList" :key="item.id" class="tr">
-          <div class="td">{{ item.drone_name }}</div>
+          <div class="td">{{ item.helicopter_name }}</div>
           <div class="td">{{ item.position }}</div>
           <div class="td">
             <div class="text" @click="handleConnect(index, item)">连线</div>
@@ -39,7 +39,7 @@
 <script setup lang="ts">
 import { Search } from '@element-plus/icons-vue';
 import { onMounted, reactive } from 'vue';
-import { getDroneResourcesList, getDroneResourcesTrajectory } from '@/api/globalMap/MobileCommandVehicle';
+import { getHelicopterList, getHelicopterTrajectory } from "@/api/globalMap/Helicopter";
 const trackPlayback = inject('trackPlayback');
 // 数据列表,直接定义为数组
 const dataList = reactive([]);
@@ -49,7 +49,7 @@ const queryParams = reactive({
 });
 //调接口
 const initData = () => {
-  getDroneResourcesList({
+  getHelicopterList({
     query: {
       keywords: queryParams.keywords
     }
@@ -73,7 +73,7 @@ const handleConnect = () => {};
 const handleCollaborate = () => {};
 // 轨迹
 const handleTrack = (item) => {
-  getDroneResourcesTrajectory(item.id).then((res) => {
+  getHelicopterTrajectory(item.id).then((res) => {
     const trajectory = [];
     res.rows.forEach((item) => {
       trajectory.push([item.longitude, item.latitude]);

+ 15 - 5
src/views/globalMap/RightMenu/KeyVehicles.vue

@@ -21,8 +21,9 @@
       </div>
       <div class="table-content">
         <div v-for="(item, index) in dataList" :key="item.id" class="tr">
-          <div class="td">{{ item.name }}</div>
-          <div class="td">{{ item.work_unit }}</div>
+          <div class="td">{{ item.vehicle_no }}</div>
+          <div class="td">{{ item.alarm_flag }}</div>
+          <div class="td">{{ item.vehicle_type }}</div>
           <div class="td">{{ item.position }}</div>
           <div class="td">
             <div class="text" @click="handleConnect(index, item)">连线</div>
@@ -38,7 +39,8 @@
 <script setup lang="ts">
 import { Search } from '@element-plus/icons-vue';
 import { getVehicleList, getVehicleTrajectory } from "@/api/globalMap/KeyVehicles";
-import { onMounted, reactive } from 'vue';
+import { onMounted, reactive, inject } from 'vue';
+// const getMap = inject('getMap');
 const trackPlayback = inject('trackPlayback');
 // 数据列表,直接定义为数组
 const dataList = reactive([]);
@@ -46,6 +48,7 @@ const dataList = reactive([]);
 const queryParams = reactive({
   keywords: ''
 });
+
 //调接口
 const initData = () => {
   getVehicleList({
@@ -71,14 +74,21 @@ const handleCancel = () => {
 
 const handleConnect = () => {};
 const handleCollaborate = () => {};
+
+// const showDetail = inject('showDetail');
+// const handleShowDialog = (item) => {
+//   location.value = [item.lng, item.lat];
+//   showDetail(item, 30);
+// };
 // 轨迹
 const handleTrack = (item) => {
-  getVehicleTrajectory(item.id).then((res) => {
+  getVehicleTrajectory(item.vehicle_no).then((res) => {
     const trajectory = [];
     res.rows.forEach((item) => {
-      trajectory.push([item.longitude, item.latitude]);
+      trajectory.push([item.lng, item.lat]);
     });
     trackPlayback(trajectory);
+    // handleShowDialog(trajectory);
   });
 };
 //调用函数

+ 4 - 4
src/views/globalMap/RightMenu/MobileCommandVehicle.vue

@@ -23,7 +23,7 @@
       </div>
       <div class="table-content">
         <div v-for="(item, index) in dataList" :key="item.id" class="tr">
-          <div class="td">{{ item.drone_name }}</div>
+          <div class="td">{{ item.name }}</div>
           <div class="td">{{ item.position }}</div>
           <div class="td">
             <div class="text" @click="handleConnect(index, item)">连线</div>
@@ -39,7 +39,7 @@
 <script setup lang="ts">
 import { Search } from '@element-plus/icons-vue';
 import { onMounted, reactive } from 'vue';
-import { getDroneResourcesList, getDroneResourcesTrajectory } from '@/api/globalMap/Helicopter';
+import { getMobileCommandVehicleList, getMobileCommandVehicleTrajectory } from "@/api/globalMap/MobileCommandVehicle";
 const trackPlayback = inject('trackPlayback');
 // 数据列表,直接定义为数组
 const dataList = reactive([]);
@@ -49,7 +49,7 @@ const queryParams = reactive({
 });
 //调接口
 const initData = () => {
-  getDroneResourcesList({
+  getMobileCommandVehicleList({
     query: {
       keywords: queryParams.keywords
     }
@@ -73,7 +73,7 @@ const handleConnect = () => {};
 const handleCollaborate = () => {};
 // 轨迹
 const handleTrack = (item) => {
-  getDroneResourcesTrajectory(item.id).then((res) => {
+  getMobileCommandVehicleTrajectory(item.id).then((res) => {
     const trajectory = [];
     res.rows.forEach((item) => {
       trajectory.push([item.longitude, item.latitude]);

+ 12 - 2
src/views/globalMap/RightMenu/MobileUnmannedVehicle.vue

@@ -14,7 +14,7 @@
     </div>
     <div class="flex-container">
       <div class="text-item">机动无人机</div>
-      <div class="button-item common-btn-primary2 edit-icon" style="margin-top: -20px">全部播放</div>
+      <div class="button-item common-btn-primary2 edit-icon" style="margin-top: -20px" @click="showMoreVideos">全部播放</div>
     </div>
     <div class="custom-table">
       <div class="th">
@@ -39,7 +39,17 @@
 <script setup lang="ts">
 import { Search } from '@element-plus/icons-vue';
 import { onMounted, reactive } from 'vue';
-import { getDroneResourcesList, getDroneResourcesTrajectory } from '@/api/globalMap/MobileUnmannedVehicle';
+import {
+  getDroneResourcesList,
+  getDroneResourcesTrajectory,
+  getDroneResourcesVideo
+} from "@/api/globalMap/MobileUnmannedVehicle";
+const getDataMethod = ref(null);
+const showMoreVideos = () => {
+  getDataMethod.value = () => getDroneResourcesVideo(id);
+};
+
+
 const trackPlayback = inject('trackPlayback');
 // 数据列表,直接定义为数组
 const dataList = reactive([]);

+ 135 - 56
src/views/globalMap/RightMenu/TyphoonVideo.vue

@@ -11,32 +11,34 @@
         <el-button class="btn" @click="handleCancel">取消</el-button>
       </div>
     </div>
-    <div class="section-box">
-      <div class="title2">路径列表</div>
-      <div style="display: flex; align-content: center">
-        <span style="margin-right: 10px; white-space: nowrap; font-size: 40px; height: 100px">选择台风:</span>
-        <el-select
-          v-model="selectedYear"
-          placeholder="请选择年份"
-          class="custom-select"
-          popper-class="custom-select-popper"
-          :teleported="false"
-          style="width: 1200px; margin-left: 30px"
-        >
-          <el-option v-for="year in yearList" :key="year" :label="year" :value="year"></el-option>
-        </el-select>
-        <el-select
-          v-model="selectedTyphoon"
-          placeholder="请选择台风名称"
-          class="custom-select"
-          popper-class="custom-select-popper"
-          :teleported="false"
-          style="width: 1200px; margin-left: 30px"
-        >
-          <el-option v-for="typhoon in availableTyphoons" :key="typhoon.id" :label="typhoon.name" :value="typhoon.id"></el-option>
-        </el-select>
-      </div>
+    <!--    <div class="section-box">-->
+    <div class="title2">路径列表</div>
+    <div style="display: flex; align-content: center; justify-content: flex-start">
+      <span style="margin-right: 15px; white-space: nowrap; font-size: 38px; height: 100px">选择台风:</span>
+      <el-select
+        v-model="selectedYear"
+        placeholder="请选择年份"
+        class="custom-select"
+        popper-class="custom-select-popper"
+        :teleported="false"
+        style="width: 1200px; margin-left: 30px"
+        @change="handleYearChange"
+      >
+        <el-option v-for="year in yearList" :key="year" :label="year" :value="year"></el-option>
+      </el-select>
+      <el-select
+        v-model="selectedTyphoon"
+        placeholder="请选择台风名称"
+        class="custom-select"
+        popper-class="custom-select-popper"
+        :teleported="false"
+        style="width: 1200px; margin-left: 30px"
+        @change="handleTyphoonChange"
+      >
+        <el-option v-for="typhoon in TyphoonList" :key="typhoon.id" :label="typhoon.typhoon_name" :value="typhoon.typhoon_name"></el-option>
+      </el-select>
     </div>
+
     <div class="custom-table">
       <div class="th">
         <div class="td">过去时间</div>
@@ -46,9 +48,9 @@
       </div>
       <div class="table-content">
         <div v-for="(item, index) in dataList" :key="item.id" class="tr">
-          <div class="td">{{ item.name }}</div>
-          <div class="td">{{ item.work_unit }}</div>
-          <div class="td">{{ item.position }}</div>
+          <div class="td">{{ item.record_time }}</div>
+          <div class="td">{{ item.longitude }},{{ item.latitude }}</div>
+          <div class="td">{{ item.record_address }}</div>
           <div class="td">
             <div class="text" @click="handleConnect(index, item)">周边视频</div>
           </div>
@@ -57,48 +59,109 @@
     </div>
   </div>
 </template>
+
 <script setup lang="ts">
-import { ref, reactive, onMounted, watch } from 'vue';
-import { getTyphoonTrajectory, getTyphoonYearList } from '@/api/globalMap/TyphoonVideo';
+import { ref, reactive, onMounted } from 'vue';
+import { getTyphoonList, getTyphoonTrajectory, getTyphoonYearList } from '@/api/globalMap/TyphoonVideo';
 
-const selectedYear = ref(''); //selectedYear 用于存储用户选择的年份
+const selectedYear = ref(''); // selectedYear 用于存储用户选择的年份
 const yearList = ref([]); // yearList 用于存储从 getTyphoonYearList 获取的年份列表
-//入参
+const TyphoonList = ref([]);
+const selectedTyphoon = ref('');
+const dataList = reactive([]); // 数据列表
 const queryParams = reactive({
-  typhoon_code: ''
+  typhoon_code: '',
+  year_n: ''
 });
 
-//调用函数
+// 调用函数
 onMounted(() => {
   initData();
 });
 
-//调接口在 initData 函数中,首先调用 getTyphoonYearList 并处理返回的数据,将其赋值给 yearList。
-const initData = () => {
-  getTyphoonYearList().then((res) => {
-    if (res.code === 0) {
-      yearList.value.splice(0, yearList.value.length, ...res.rows.map(item => item.year_n));  // 更新年份列表
-    } else {
-      console.error('Failed to fetch typhoon year list:', res);
+const handleYearChange = async () => {
+  if (selectedYear.value) {
+    try {
+      const typhoons = await getTyphoonList({ query: { year_n: selectedYear.value } });
+      if (typhoons.code === 0) {
+        TyphoonList.value = typhoons.rows;
+        selectedTyphoon.value = typhoons.rows[0]?.typhoon_name || '';
+        initDataByTyphoon();
+      } else {
+        console.error('Failed to fetch typhoon list:', typhoons);
+      }
+    } catch (error) {
+      console.error('Error fetching typhoon list:', error);
+    }
+  }
+};
+
+const handleTyphoonChange = async () => {
+  if (selectedTyphoon.value && selectedYear.value) {
+    initDataByTyphoon();
+  }
+};
+
+const initDataByTyphoon = async () => {
+  const typhoonCode = TyphoonList.value.find((t) => t.typhoon_name === selectedTyphoon.value)?.typhoon_code;
+  if (typhoonCode) {
+    try {
+      const trajectory = await getTyphoonTrajectory({ query: { typhoon_code: typhoonCode } });
+      if (trajectory.code === 0 && Array.isArray(trajectory.rows)) {
+        dataList.splice(0, dataList.length, ...trajectory.rows);
+      } else {
+        console.error('Invalid response from server:', trajectory);
+        dataList.splice(0, dataList.length); // 清空数据列表
+      }
+    } catch (error) {
+      console.error('Error fetching typhoon trajectory:', error);
     }
-  });
-  getTyphoonTrajectory({
-    query: {
-      typhoon_code: queryParams.typhoon_code
+  } else {
+    console.error('No typhoon code found for selected typhoon name');
+  }
+};
+
+const fetchData = async (apiFunction, params) => {
+  try {
+    const response = await apiFunction(params);
+    if (response.code !== 0) {
+      throw new Error('Invalid response from server');
     }
-  }).then((res) => {
-    if (res.code === 0 && Array.isArray(res.rows)) {
-      dataList.splice(0, dataList.length, ...res.rows); // 使用 splice 替换数组内容,保持响应性
+    return response.rows;
+  } catch (error) {
+    console.error('Error fetching data:', error);
+    return [];
+  }
+};
+
+const initData = async () => {
+  try {
+    const years = await fetchData(getTyphoonYearList, {});
+    yearList.value = years.map((item) => item.year_n);
+    const year = years[0]?.year_n;
+    if (year) {
+      const typhoons = await fetchData(getTyphoonList, { query: { year_n: year } });
+      TyphoonList.value = typhoons;
+      const typhoonCode = typhoons[0]?.typhoon_code;
+      if (typhoonCode) {
+        const trajectory = await fetchData(getTyphoonTrajectory, { query: { typhoon_code: typhoonCode } });
+        dataList.splice(0, dataList.length, ...trajectory);
+      } else {
+        console.error('No typhoon code found in the list');
+      }
     } else {
-      console.error('Invalid response from server:', res);
-      // 可以选择清空数据列表或显示错误消息
-      dataList.splice(0, dataList.length); // 清空数据列表
+      console.error('No year found in the list');
     }
-  });
+  } catch (error) {
+    console.error('Error initializing data:', error);
+  }
 };
 
-// 数据列表,直接定义为数组
-const dataList = reactive([]);
+const handleCancel = () => {
+  queryParams.typhoon_code = '';
+  queryParams.year_n = '';
+  initData();
+};
 </script>
 
 <style lang="scss" scoped>
@@ -112,6 +175,11 @@ const dataList = reactive([]);
   color: #ffffff;
 }
 
+.custom-input {
+  height: 60px;
+  line-height: 40px;
+}
+
 .box-left {
   display: flex;
   margin-top: 30px;
@@ -190,7 +258,18 @@ const dataList = reactive([]);
 }
 
 .title2 {
-  font-size: 48px;
-  height: 100px;
+  font-size: 36px;
+  height: 80px;
+}
+
+.title {
+  font-size: 60px;
+  position: absolute;
+  top: 30px;
+  left: 160px;
+}
+
+.text {
+  cursor: pointer;
 }
 </style>

+ 1 - 1
src/views/globalMap/RightMenu/index.vue

@@ -70,7 +70,7 @@
           v-if="menuState.showMenu && menuState.menuData[menuState.activeIndex]?.name === '机动无人机'"
           @handle-menu="handleMenu"
         />
-        <!--移动无人机-->
+        <!--移动指挥车-->
         <MobileCommandVehicle
           v-if="menuState.showMenu && menuState.menuData[menuState.activeIndex]?.name === '移动指挥车'"
           @handle-menu="handleMenu"

+ 37 - 0
src/views/globalMap/data/mapData.ts

@@ -4869,6 +4869,43 @@ export const pointDetailTemplate = {
     longitude: '经度',
     latitude: '纬度'
   },
+  '30': {
+    engine_number: '发动机编号',
+    bnscope: '经营范围',
+    eldtype: '燃料',
+    is_delete: '是否删除',
+    registration_date: '行驶证登记日期',
+    vehicle_no: '车牌号',
+    update_time: '修改时间',
+    vin: '车架号',
+    owner_id: '业户ID',
+    annual_result: '年审结果',
+    device_type: '车载终端型号',
+    vehicle_id: '车辆ID',
+    jt_add_time: '新增时间',
+    facilitator_id: '服务商ID',
+    facilitator: '卫星定位运营商名称',
+    source: '来源',
+    lidcardno: '标志牌号码',
+    vehicle_type: '车辆类型',
+    service_result: '营运状态',
+    chenum: '座位数',
+    create_time: '创建时间',
+    jt_cd_time: '增量时间',
+    jt_cd_batch: '更新批次号',
+    factype: '厂牌',
+    record_status: '档案状态',
+    remark: '备注',
+    model: '型号',
+    third_party_id: '第三方监控机构ID',
+    status: '状态',
+    examine_date: '审验有效期',
+    access_time: '接入时间',
+    chelodmass: '核定吨位',
+    vehicle_color: '车牌颜色',
+    jt_cd_operation: '增量标识',
+    line_name: '线路名称'
+  },
 };
 
 export const creatDetailTemplate = (data, type) => {};

+ 1 - 1
src/views/globalMap/index.vue

@@ -140,7 +140,7 @@ const clickMenu = (item, dataList) => {
     if (item.checked || (!item.checked && index === 0)) {
       rightMenuRef.value.updateMenu(
         checked,
-        ['易涝隐患点', '无人机', '铁塔运行监测', '物资与装备', '通讯保障', '手机工作台', '机动无人机'].includes(item.name)
+        ['易涝隐患点', '无人机', '铁塔运行监测', '物资与装备', '通讯保障'].includes(item.name)
           ? item
           : { name: '图层分析', meta: { icon: 'icon1' } }
       );