Browse Source

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

hmm 6 months ago
parent
commit
8b16377448

+ 32 - 0
src/api/globalMap/rescueTeam.ts

@@ -0,0 +1,32 @@
+import request from '@/utils/request';
+
+// 救援队伍列表
+export const getRescueTeamsList = (data) => {
+  return request({
+    url: '/api/gateway/v2/get_rescue_teams_list',
+    method: 'post',
+    data: data
+  });
+};
+
+// 救援队伍信息
+export const getRescueTeamsInfo = (id) => {
+  return request({
+    url: '/api/gateway/v2/get_rescue_teams_info',
+    method: 'post',
+    data: {
+      query: {
+        id
+      }
+    }
+  });
+};
+
+// 救援队伍人员列表
+export const getRescueTeamsPersonnelList = (data) => {
+  return request({
+    url: '/api/gateway/v2/get_rescue_teams_personnel_list',
+    method: 'post',
+    data: data
+  });
+};

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

@@ -316,3 +316,90 @@ 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
+      }
+    }
+  });
+};
+
+//气象灾害隐患点单位详情
+export const getMDPUnitDetails = (id: string) => {
+  return request({
+    url: '/api/gateway/v2/get_point_info_MDP_units',
+    method: 'post',
+    data: {
+      query: {
+        id: id
+      }
+    }
+  });
+};
+
+// 路网视频
+export const getRoadVideoList = (id: string) => {
+  return request({
+    url: '/api/gateway/v2/get_road_video_list',
+    method: 'post',
+    data: {
+      query: {
+        id: id
+      }
+    }
+  });
+};
+// 江河湖库
+export const getWaterList = (id: string) => {
+  return request({
+    url: '/api/gateway/v2/get_water_list',
+    method: 'post',
+    data: {
+      query: {
+        id: id
+      }
+    }
+  });
+};
+
+// 防溺水
+export const getVideoDrowning = (id: string) => {
+  return request({
+    url: '/api/gateway/v2/get_video_drowning_prevention_list',
+    method: 'post',
+    data: {
+      query: {
+        id: id
+      }
+    }
+  });
+};
+// 森林防火
+export const getVideoForestFire = (id: string) => {
+  return request({
+    url: '/api/gateway/v2/get_video_forest_fire_list',
+    method: 'post',
+    data: {
+      query: {
+        id: id
+      }
+    }
+  });
+};
+// 防灾救援
+export const getVideoDisasterPrevention = (id: string) => {
+  return request({
+    url: '/api/gateway/v2/get_video_disaster_prevention_and_rescue_list',
+    method: 'post',
+    data: {
+      query: {
+        id: id
+      }
+    }
+  });
+};

BIN
src/assets/images/dotIcon/41_rescue_team.png


BIN
src/assets/images/dotIcon/41_rescue_team_hover.png


+ 5 - 5
src/components/Contact/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <Dialog custom-show type="lg" title="通讯录" @close="handleClose" @confirm="handleConfirm">
+  <Dialog custom-show type="lg" title="通讯录" height="720px" @close="handleClose" @confirm="handleConfirm">
     <div class="content">
       <div class="left-content">
         <el-input v-model="queryParams1.deptName" class="custom-input" placeholder="组织架构搜索">
@@ -53,7 +53,7 @@
                 <div class="text1">{{ item.nickName }}</div>
                 <div class="text2">{{ item.duty }}</div>
               </div>
-              <div class="line" style="margin-top: 20px">
+              <div class="line" style="margin-top: 6px">
                 <div class="text2">{{ item.deptName }}</div>
               </div>
             </div>
@@ -254,7 +254,7 @@ onMounted(() => {
           }
         }
         .table-content {
-          height: 858px;
+          height: 520px;
           overflow-y: auto;
         }
         .tr2 {
@@ -298,7 +298,7 @@ onMounted(() => {
     display: flex;
     .tree-box {
       width: 100%;
-      height: 920px;
+      height: 440px;
       overflow-y: auto;
       padding: 15px 8px;
       :deep(.el-tree) {
@@ -350,7 +350,7 @@ onMounted(() => {
       }
     }
     .select-content {
-      height: 858px;
+      height: 520px;
       overflow-y: auto;
       .box-item {
         border-bottom: 1px solid #247dff;

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

@@ -44,11 +44,13 @@ import {
   getMiningOperationsDetails,
   getEmergencyTransportResourcesDetails,
   getEmergencyDisasterInfoOfficerDetails,
-  getMidmapDzzhDetails
+  getMidmapDzzhDetails, getVehicleDetails, getVideoDrowning, getVideoForestFire, getVideoDisasterPrevention
 } from '@/api/globalMap/spatialAnalysis';
 import { pointDetailTemplate } from '@/views/globalMap/data/mapData';
 import ElementResizeDetectorMaker from 'element-resize-detector';
 import useAppStore from '@/store/modules/app';
+import { getWaterList } from '@/api/globalMap/reservoir';
+import { getRescueTeamsInfo } from '@/api/globalMap/rescueTeam';
 
 interface Props {
   activeMap: string;
@@ -68,7 +70,8 @@ const emits = defineEmits([
   'showTextEditBox',
   'onDrawCompleted',
   'handleShowVideo',
-  'handleShowWarehouse'
+  'handleShowWarehouse',
+  'handleShowPeople'
 ]);
 const containerRef = ref();
 const width = ref('100%');
@@ -219,7 +222,13 @@ const handlePointDetails = (data) => {
     '26': getTouristAttractionDetails,
     '27': getConstructionSitesDetails,
     '28': getEmergencyTransportResourcesDetails,
-    '29': getEmergencyDisasterInfoOfficerDetails
+    '29': getEmergencyDisasterInfoOfficerDetails,
+    '30': getVehicleDetails,
+    '31': getWaterList,
+    '32': getVideoDrowning,
+    '33': getVideoForestFire,
+    '34': getVideoDisasterPrevention,
+    '41': getRescueTeamsInfo
   };
   let titleList = {
     '1': '专家信息',
@@ -250,7 +259,13 @@ const handlePointDetails = (data) => {
     '26': '旅游场所',
     '27': '在建工地',
     '28': '运输资源',
-    '29': '灾害信息员'
+    '29': '灾害信息员',
+    '30': '重点车辆信息',
+    '31': '江湖河库',
+    '32': '防溺水',
+    '33': '森林防火',
+    '34': '防灾救援',
+    '41': '救援队伍'
   };
   let method = methodList[data.dataType];
   let title = !!titleList[data.dataType] ? titleList[data.dataType] : '信息';
@@ -286,6 +301,17 @@ const handlePointDetails = (data) => {
         };
         btnBox.appendChild(btn);
         div.appendChild(btnBox);
+      } else if (data.dataType === 41) {
+        let btnBox = document.createElement('div');
+        let btn = document.createElement('div');
+        btnBox.className = 'flex';
+        btn.className = 'btn';
+        btn.innerHTML = '<div class="video-icon"></div><div>人员列表</div>';
+        btn.onclick = () => {
+          emits('handleShowPeople', data);
+        };
+        btnBox.appendChild(btn);
+        div.appendChild(btnBox);
       }
       let icon1 = document.createElement('div');
       icon1.className = 'icon1';

+ 28 - 0
src/types/components.d.ts

@@ -22,14 +22,23 @@ declare module 'vue' {
     DistributionMap: typeof import('./../components/Map/YztMap/DistributionMap.vue')['default']
     DrawMap: typeof import('./../components/Map/YztMap/DrawMap.vue')['default']
     Editor: typeof import('./../components/Editor/index.vue')['default']
+    ElAnchor: typeof import('element-plus/es')['ElAnchor']
+    ElAnchorLink: typeof import('element-plus/es')['ElAnchorLink']
     ElAutocomplete: typeof import('element-plus/es')['ElAutocomplete']
     ElBadge: typeof import('element-plus/es')['ElBadge']
     ElButton: typeof import('element-plus/es')['ElButton']
+    ElCard: typeof import('element-plus/es')['ElCard']
     ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
+    ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
     ElCol: typeof import('element-plus/es')['ElCol']
+    ElCollapse: typeof import('element-plus/es')['ElCollapse']
+    ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
     ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
+    ElContainer: typeof import('element-plus/es')['ElContainer']
     ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
+    ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
+    ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
     ElDialog: typeof import('element-plus/es')['ElDialog']
     ElDivider: typeof import('element-plus/es')['ElDivider']
     ElDrawer: typeof import('element-plus/es')['ElDrawer']
@@ -39,28 +48,44 @@ declare module 'vue' {
     ElEmpty: typeof import('element-plus/es')['ElEmpty']
     ElForm: typeof import('element-plus/es')['ElForm']
     ElFormItem: typeof import('element-plus/es')['ElFormItem']
+    ElHeader: typeof import('element-plus/es')['ElHeader']
     ElIcon: typeof import('element-plus/es')['ElIcon']
     ElImage: typeof import('element-plus/es')['ElImage']
     ElInput: typeof import('element-plus/es')['ElInput']
+    ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
+    ElLink: typeof import('element-plus/es')['ElLink']
+    ElMain: typeof import('element-plus/es')['ElMain']
     ElMenu: typeof import('element-plus/es')['ElMenu']
     ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
     ElOption: typeof import('element-plus/es')['ElOption']
     ElPagination: typeof import('element-plus/es')['ElPagination']
     ElPopover: typeof import('element-plus/es')['ElPopover']
+    ElRadio: typeof import('element-plus/es')['ElRadio']
+    ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
+    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
+    ElSegmented: typeof import('element-plus/es')['ElSegmented']
     ElSelect: typeof import('element-plus/es')['ElSelect']
     ElSkeleton: typeof import('element-plus/es')['ElSkeleton']
     ElSkeletonItem: typeof import('element-plus/es')['ElSkeletonItem']
     ElSlider: typeof import('element-plus/es')['ElSlider']
+    ElSpace: typeof import('element-plus/es')['ElSpace']
+    ElStep: typeof import('element-plus/es')['ElStep']
+    ElSteps: typeof import('element-plus/es')['ElSteps']
     ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
     ElSwitch: typeof import('element-plus/es')['ElSwitch']
+    ElTable: typeof import('element-plus/es')['ElTable']
+    ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
+    ElTabPane: typeof import('element-plus/es')['ElTabPane']
+    ElTabs: typeof import('element-plus/es')['ElTabs']
     ElTag: typeof import('element-plus/es')['ElTag']
     ElText: typeof import('element-plus/es')['ElText']
     ElTimeline: typeof import('element-plus/es')['ElTimeline']
     ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem']
     ElTooltip: typeof import('element-plus/es')['ElTooltip']
     ElTree: typeof import('element-plus/es')['ElTree']
+    ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
     ElUpload: typeof import('element-plus/es')['ElUpload']
     ExcelEditor: typeof import('./../components/ExcelEditor/index.vue')['default']
     FileUpload: typeof import('./../components/FileUpload/index.vue')['default']
@@ -72,6 +97,9 @@ declare module 'vue' {
     HikvisionPlayer: typeof import('./../components/HKVideo/hikvision-player.vue')['default']
     HKVideo: typeof import('./../components/HKVideo/index.vue')['default']
     IconSelect: typeof import('./../components/IconSelect/index.vue')['default']
+    IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default']
+    IEpCaretTop: typeof import('~icons/ep/caret-top')['default']
+    IEpUploadFilled: typeof import('~icons/ep/upload-filled')['default']
     IFrame: typeof import('./../components/iFrame/index.vue')['default']
     ImagePreview: typeof import('./../components/ImagePreview/index.vue')['default']
     ImageUpload: typeof import('./../components/ImageUpload/index.vue')['default']

+ 140 - 0
src/views/globalMap/RightMenu/EmergencyCrew.vue

@@ -0,0 +1,140 @@
+<template>
+  <Dialog custom-show type="md" title="应急人员" height="720px" hide-footer @close="handleClose">
+    <div class="btn-box">
+      <el-input v-model="queryParams.keyword" class="custom-input" placeholder="搜索" @keyup.enter="initData">
+        <template #prefix>
+          <el-icon class="el-input__icon"><search /></el-icon>
+        </template>
+      </el-input>
+      <div class="common-btn-primary" @click="initData">搜索</div>
+    </div>
+    <div class="common-table">
+      <div class="table-header">
+        <div class="td">姓名</div>
+        <div class="td">联系电话</div>
+        <div class="td" style="width: 80px; flex-shrink: 0">性别</div>
+        <div class="td">现在地址</div>
+        <div class="td">职务</div>
+        <div class="td" style="width: 520px; flex-shrink: 0">所属救援人员单位</div>
+      </div>
+      <div v-for="(item, index) in dataList" :key="index" class="tr">
+        <div class="td">{{ item.name }}</div>
+        <div class="td">{{ item.phone_number }}</div>
+        <div class="td" style="width: 80px; flex-shrink: 0">{{ item.gender }}</div>
+        <div class="td">{{ item.current_address }}</div>
+        <div class="td">{{ item.duty }}</div>
+        <div class="td" style="width: 520px; flex-shrink: 0">{{ item.affiliated_team }}</div>
+      </div>
+    </div>
+<!--    <div class="footer">-->
+<!--      <el-pagination-->
+<!--        background-->
+<!--        :hide-on-single-page="true"-->
+<!--        layout="total, prev, pager, next"-->
+<!--        :total="total"-->
+<!--        :page-size="queryParams.pageSize"-->
+<!--        :current-page="queryParams.page"-->
+<!--        @current-change="initData"-->
+<!--      />-->
+<!--    </div>-->
+  </Dialog>
+</template>
+
+<script lang="ts" setup>
+import { Search } from '@element-plus/icons-vue';
+import { getRescueTeamsPersonnelList } from '@/api/globalMap/rescueTeam';
+
+const props = defineProps({
+  modelValue: Boolean,
+  id: String
+});
+const emits = defineEmits(['update:modelValue']);
+const queryParams = reactive({
+  // page: 1,
+  // pageSize: 10,
+  keyword: ''
+});
+// let total = ref(0);
+let dataList = ref([]);
+const initData = () => {
+  getRescueTeamsPersonnelList({
+    query: {
+      id: props.id,
+      keyword: queryParams.keyword
+    }
+  }).then((res) => {
+    dataList.value = res.rows;
+  });
+};
+const handleClose = () => {
+  emits('update:modelValue', false);
+};
+initData();
+</script>
+
+<style lang="scss" scoped>
+.btn-box {
+  display: flex;
+  align-items: center;
+  margin-bottom: 20px;
+  .custom-input {
+    width: 840px;
+  }
+  .common-btn-primary {
+    flex-shrink: 0;
+  }
+}
+.footer {
+  height: 64px;
+  display: flex;
+  justify-content: flex-end;
+  margin: 30px 0;
+  .pagination-container {
+    height: 64px;
+    margin: 0;
+  }
+  :deep(.el-pagination__total) {
+    color: #a7ccdf;
+    font-size: 32px;
+  }
+  :deep(.el-pagination) {
+    .btn-next,
+    .btn-prev {
+      background-color: transparent;
+      border: none;
+      .el-icon {
+        font-size: 22px;
+        color: #a7ccdf;
+      }
+    }
+    .btn-prev:disabled,
+    .btn-next:disabled {
+      background-color: transparent;
+      border: none;
+    }
+    .el-pager li {
+      width: 64px;
+      height: 64px;
+      line-height: 64px;
+      text-align: center;
+      font-size: 38px;
+      color: #a7ccdf;
+      background-color: #0e3064;
+      border: 1px solid #0c57a7;
+      margin: 0 6px;
+      &:hover {
+        background-color: #038dff;
+        border: 1px solid #038dff;
+      }
+    }
+    .el-pager li.is-active {
+      background-color: #038dff;
+      border: 1px solid #038dff;
+    }
+    .el-pagination__goto {
+      font-size: 38px;
+      color: #a7ccdf;
+    }
+  }
+}
+</style>

+ 1 - 0
src/views/globalMap/RightMenu/LayerAnalysis.vue

@@ -263,6 +263,7 @@ const handleClick = (item) => {
     height: 43px;
     background: url('@/assets/images/map/rightMenu/layerAnalysis/tag.png') no-repeat;
     background-size: 100% 100%;
+    margin-left: -4px;
     &:hover {
       background: url('@/assets/images/map/rightMenu/layerAnalysis/tagActive.png') no-repeat;
       background-size: 100% 100%;

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

@@ -38,7 +38,7 @@
           </div>
         </div>
       </div>
-      <Dialog v-if="showDialog" v-model="showDialog" type="md" title="防灾救援" hide-footer>
+      <Dialog v-if="showDialog" v-model="showDialog" type="md" height="720px" title="防灾救援" hide-footer>
         <div style="width: 100%; height: 100%; display: flex; justify-content: center; align-items: center">
           <HKVideo :dot_data="videoMonitorData" />
         </div>

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

@@ -38,7 +38,7 @@
           </div>
         </div>
       </div>
-      <Dialog v-if="showDialog" v-model="showDialog" type="md" title="防溺水" hide-footer>
+      <Dialog v-if="showDialog" v-model="showDialog" type="md" height="720px" title="防溺水" hide-footer>
         <div style="width: 100%; height: 100%; display: flex; justify-content: center; align-items: center">
           <HKVideo :dot_data="videoMonitorData" />
         </div>

+ 165 - 0
src/views/globalMap/RightMenu/RescueTeam.vue

@@ -0,0 +1,165 @@
+<template>
+  <div class="menu-content">
+    <div class="container">
+      <div class="gradient-text common-dialog-title2">救援队伍</div>
+      <div class="box-left">
+        <el-input v-model="queryParams.query.keyword" class="custom-input" placeholder="搜索" @input="initData">
+          <template #prefix>
+            <el-icon class="el-input__icon"><search /></el-icon>
+          </template>
+        </el-input>
+        <div class="btn" @click="handleCancel">取消</div>
+      </div>
+      <div class="custom-table">
+        <div class="th">
+          <div class="td">救援人员单位</div>
+          <div class="td">名称</div>
+          <div class="td" style="width: 150px; flex: unset">操作</div>
+        </div>
+        <div class="table-content">
+          <div v-for="(item, index) in listData" :key="index" class="tr">
+            <div class="td">{{ item.name }}</div>
+            <div class="td">{{ item.team_type }}</div>
+            <div class="td">
+              <div class="btn-text" @click="handleShowDetail(item)">详情</div>
+              <div class="line">|</div>
+              <div class="btn-text" @click="handleShowPeople(item)">人员</div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <EmergencyCrew v-if="showDialog" v-model="showDialog" :id="id" />
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { Search } from '@element-plus/icons-vue';
+import EmergencyCrew from '@/views/globalMap/RightMenu/EmergencyCrew.vue';
+import { getRescueTeamsList } from '@/api/globalMap/rescueTeam';
+
+const queryParams = reactive({
+  query: {
+    keyword: ''
+  }
+});
+
+const showDetail = inject('showDetail');
+const listData = ref([]);
+let id = ref('');
+
+let showDialog = ref(false);
+const handleShowPeople = (item) => {
+  id.value = item.id;
+  showDialog.value = true;
+};
+const handleShowDetail = (item) => {
+  showDetail(
+    {
+      id: item.id,
+      lat: item.latitude,
+      lng: item.longitude
+    },
+    41
+  );
+};
+const initData = () => {
+  getRescueTeamsList(queryParams).then((res) => {
+    listData.value = res.rows;
+  });
+};
+const handleCancel = () => {
+  queryParams.query.keyword = '';
+  initData();
+};
+initData();
+</script>
+
+<style lang="scss" scoped>
+.menu-content {
+  width: 574px;
+  height: 581px;
+  background: url('@/assets/images/map/rightMenu/content.png') no-repeat;
+  background-size: 100% 100%;
+  padding: 60px 10px 10px 15px;
+  font-size: 14px;
+  position: relative;
+  color: #ffffff;
+}
+.custom-table {
+  width: 550px;
+  .table-content {
+    height: 425px;
+    overflow-y: auto;
+    overflow-x: hidden;
+  }
+  .th {
+    background: url('@/assets/images/map/rightMenu/th.png') no-repeat;
+    background-size: 100% 100%;
+    display: flex;
+    padding: 7px 12px;
+    height: 32px;
+  }
+  .tr {
+    background: url('@/assets/images/map/rightMenu/td.png') no-repeat;
+    background-size: 100% 100%;
+    display: flex;
+    padding: 7px 12px;
+    &:hover {
+      background: url('@/assets/images/map/rightMenu/td_checked.png') no-repeat;
+      background-size: 100% 100%;
+    }
+  }
+  .td {
+    flex: 1;
+    color: #edfaff;
+    font-size: 14px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    cursor: pointer;
+  }
+  .td-text {
+    /* 设置字体透明 */
+    color: transparent;
+    /* 使用 -webkit-background-clip 属性将背景剪裁至文本形状 */
+    -webkit-background-clip: text;
+    /* 非Webkit内核浏览器需要使用标准前缀 */
+    background-clip: text;
+    font-family: 'YouSheBiaoTiHei';
+    /* 设置线性渐变,从红色渐变到蓝色 */
+    background-image: linear-gradient(to bottom, #ffffff 50%, #3075d3 100%);
+    font-size: 14px;
+  }
+  .text-green {
+    background-image: linear-gradient(to bottom, #ffffff 50%, #40c75f 100%);
+  }
+  .text-danger {
+    background-image: linear-gradient(to bottom, #ffffff 50%, #ff2f3c 100%);
+  }
+}
+.box-left {
+  display: flex;
+  align-items: center;
+  margin-bottom: 10px;
+  .btn {
+    width: 59px;
+    height: 23px;
+    background: url('@/assets/images/map/rightMenu/potentialFloodHazard/btn.png') no-repeat;
+    background-size: 100% 100%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    cursor: pointer;
+    margin-left: 20px;
+  }
+}
+.btn-text {
+  color: #5983df;
+  cursor: pointer;
+}
+.line {
+  color: #5983df;
+  margin: 0 6px;
+}
+</style>

+ 2 - 1
src/views/globalMap/RightMenu/Reservoir.vue

@@ -38,7 +38,7 @@
           </div>
         </div>
       </div>
-      <Dialog v-if="showDialog" v-model="showDialog" type="md" title="江湖河库" hide-footer>
+      <Dialog v-if="showDialog" v-model="showDialog" type="md" height="720px" title="江湖河库" hide-footer>
         <div style="width: 100%; height: 100%; display: flex; justify-content: center; align-items: center">
           <HKVideo :dot_data="videoMonitorData" />
         </div>
@@ -158,6 +158,7 @@ initData();
 }
 .box-left {
   display: flex;
+  align-items: center;
   margin-bottom: 10px;
   .btn {
     width: 59px;

+ 1 - 0
src/views/globalMap/RightMenu/RoadNetworkVideo.vue

@@ -182,6 +182,7 @@ initData();
 }
 .box-left {
   display: flex;
+  align-items: center;
   margin-bottom: 10px;
   .btn {
     width: 59px;

+ 13 - 4
src/views/globalMap/RightMenu/index.vue

@@ -1,25 +1,31 @@
 <template>
   <div class="right-menu">
     <div class="menu-container">
-      <div style="position: relative; margin-top: 60px; display: inline-block; vertical-align: top;">
+      <div style="position: relative; margin-top: 60px; display: inline-block; vertical-align: top">
         <div ref="scrollListRef" :class="!menuState.showMenu ? 'menu-list' : 'menu-list menu-list-right'">
           <div
             v-for="(item, index) in menuState.menuData"
             :key="index"
             :class="menuState.activeIndex === index ? 'menu-item menu-active' : 'menu-item'"
+            style="pointer-events: auto"
             @click="clickMenu(index)"
           >
             <div :class="item.meta?.icon + ' ' + item.meta?.icon + '_checked'"></div>
             <div class="gradient-text text">{{ item.name }}</div>
           </div>
         </div>
-        <div v-show="menuState.menuData.length > 0" :class="menuState.showMenu ? 'right-btn' : 'left-btn'" @click="clickContractMenu"></div>
-        <div v-show="menuState.menuData.length > 9" class="btn-box">
+        <div
+          v-show="menuState.menuData.length > 0"
+          :class="menuState.showMenu ? 'right-btn' : 'left-btn'"
+          style="pointer-events: auto"
+          @click="clickContractMenu"
+        ></div>
+        <div v-show="menuState.menuData.length > 9" class="btn-box" style="pointer-events: auto">
           <div class="up-btn" @click="clickBtn('up')"></div>
           <div class="down-btn" @click="clickBtn('down')"></div>
         </div>
       </div>
-      <div v-show="menuState.showMenu" style="display: inline-block">
+      <div v-show="menuState.showMenu" style="display: inline-block; pointer-events: auto">
         <!--图层分析-->
         <LayerAnalysis v-if="menuState.showMenu && menuState.menuData[menuState.activeIndex]?.name === '图层分析'" :point-type="pointType" />
         <!--空间分析-->
@@ -81,6 +87,7 @@
         <Helicopter v-if="menuState.showMenu && menuState.menuData[menuState.activeIndex]?.name === '直升机'" @handle-menu="handleMenu" />
         <!--台风视频-->
         <TyphoonVideo v-if="menuState.showMenu && menuState.menuData[menuState.activeIndex]?.name === '台风视频'" @handle-menu="handleMenu" />
+        <RescueTeam v-if="menuState.showMenu && menuState.menuData[menuState.activeIndex]?.name === '救援队伍'" />
       </div>
     </div>
   </div>
@@ -112,6 +119,7 @@ import MobileUnmannedVehicle from './MobileUnmannedVehicle.vue';
 import MobileCommandVehicle from './MobileCommandVehicle.vue';
 import Helicopter from './Helicopter.vue';
 import TyphoonVideo from './TyphoonVideo.vue';
+import RescueTeam from './RescueTeam.vue';
 interface Props {
   pointType: PointType[];
 }
@@ -213,6 +221,7 @@ defineExpose({ handleMenu, showIndexMenu, clickContractMenu, updateMenu, getMenu
   top: 100px;
   right: 0;
   z-index: 20;
+  pointer-events: none;
 }
 .expand-btn {
   width: 70px;

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

@@ -4265,6 +4265,31 @@ export const iconList = {
     imageHover: getImageUrl('29_emergencyofficer_hover.png'),
     size: [60, 60]
   },
+  '30': {
+    image: getImageUrl('29_emergencyofficer.png'),
+    imageHover: getImageUrl('29_emergencyofficer_hover.png'),
+    size: [40, 40]
+  },
+  '31': {
+    image: getImageUrl('31_lakes_video.png'),
+    imageHover: getImageUrl('31_lakes_video_hover.png'),
+    size: [40, 40]
+  },
+  '32': {
+    image: getImageUrl('31_lakes_video.png'),
+    imageHover: getImageUrl('31_lakes_video_hover.png'),
+    size: [40, 40]
+  },
+  '33': {
+    image: getImageUrl('31_lakes_video.png'),
+    imageHover: getImageUrl('31_lakes_video_hover.png'),
+    size: [40, 40]
+  },
+  '34': {
+    image: getImageUrl('31_lakes_video.png'),
+    imageHover: getImageUrl('31_lakes_video_hover.png'),
+    size: [40, 40]
+  },
   '35': {
     image: getImageUrl('35_rescueStation.png'),
     imageHover: getImageUrl('35_rescueStation_hover.png'),
@@ -4284,6 +4309,11 @@ export const iconList = {
     image: getImageUrl('39_rescueStation.png'),
     imageHover: getImageUrl('39_rescueStation_hover.png'),
     size: [60, 60]
+  },
+  '41': {
+    image: getImageUrl('41_rescue_team.png'),
+    imageHover: getImageUrl('41_rescue_team_hover.png'),
+    size: [55, 60]
   }
 };
 
@@ -4882,6 +4912,62 @@ 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: '线路名称'
+  },
+  '41': {
+    name: '救援队伍名称',
+    team_type: '救援队伍类型',
+    professional_category: '队伍专业类别',
+    team_category: '队伍类别',
+    team_attribute: '队伍属性',
+    team_level: '队伍层级',
+    affiliated_unit: '所属单位',
+    leader_name: '负责人姓名',
+    leader_phone: '负责人联系电话',
+    city: '地市',
+    district: '区县',
+    main_equipment: '主要装备',
+    number_of_people: '人数',
+    address: '地址',
+    description: '描述',
+    longitude: '经度',
+    latitude: '纬度'
+  }
 };
 
 export const creatDetailTemplate = (data, type) => {};

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

@@ -15,6 +15,7 @@
         :point-type="pointType"
         @handle-show-video="handleShowVideo"
         @handle-show-warehouse="handleShowWarehouse"
+        @handleShowPeople="handleShowPeople"
       />
       <!--左侧菜单-->
       <LeftMenu
@@ -34,6 +35,7 @@
       <GridPointRainfall v-if="showRainfall" v-model="showRainfall" :location="location" />
       <MaterialDetail v-if="showWarehouse" v-model="showWarehouse" :warehouse-data="warehouseData" />
       <CommunicationSupport v-if="communicationSupport.show" @close="handleHideCommunicationSupport" />
+      <EmergencyCrew v-if="showPeople" v-model="showPeople" :id="teamId" />
     </div>
   </div>
 </template>
@@ -54,6 +56,7 @@ import DrawTools from '@/views/globalMap/RightMenu/DrawTools.vue';
 import CommunicationSupport from '@/views/globalMap/RightMenu/CommunicationSupport.vue';
 import GridPointRainfall from '@/views/globalMap/RightMenu/GridPointRainfall.vue';
 import NearbyVideos from '@/components/NearbyVideos/index.vue';
+import EmergencyCrew from '@/views/globalMap/RightMenu/EmergencyCrew.vue';
 
 const rightMenuRef = ref(null);
 const mapData = reactive(logicalData);
@@ -146,7 +149,21 @@ const clickMenu = (item, dataList) => {
     let checked = item.checked ? '1' : '2';
     // 打点信息
     addMarkers(item);
-    if (['易涝隐患点', '无人机', '铁塔运行监测', '物资与装备', '通讯保障'].includes(item.name)) {
+    if (
+      [
+        '易涝隐患点',
+        '无人机',
+        '铁塔运行监测',
+        '物资与装备',
+        '通讯保障',
+        '路网视频',
+        '江湖河库',
+        '防溺水',
+        '森林防火',
+        '防灾救援',
+        '救援队伍'
+      ].includes(item.name)
+    ) {
       rightMenuRef.value.updateMenu(checked, item);
     } else {
       let index = findChecked(dataList, item.name);
@@ -317,6 +334,13 @@ const handleShowWarehouse = (data) => {
   warehouseData.value = data;
   showWarehouse.value = true;
 };
+// 救援队伍人员列表
+let showPeople = ref(false);
+let teamId = ref('');
+const handleShowPeople = (data) => {
+  teamId.value = data.id;
+  showPeople.value = true;
+};
 // onMounted(() => {
 //   mapRef.value.addEventListener('resize', handleResize);
 // })