Browse Source

电子灾害地图样式

Hwf 6 months ago
parent
commit
0bf64c04f7

BIN
src/assets/images/common/btn2.png


BIN
src/assets/images/common/btnPrimary4.png


BIN
src/assets/images/electronicDisasterMapManage/box1.png


BIN
src/assets/images/electronicDisasterMapManage/box3.png


BIN
src/assets/images/electronicDisasterMapManage/box4.png


BIN
src/assets/images/electronicDisasterMapManage/box5.png


BIN
src/assets/images/electronicDisasterMapManage/box6.png


BIN
src/assets/images/electronicDisasterMapManage/close.png


BIN
src/assets/images/electronicDisasterMapManage/decoration3.png


BIN
src/assets/images/electronicDisasterMapManage/decoration4.png


BIN
src/assets/images/electronicDisasterMapManage/down.png


BIN
src/assets/images/electronicDisasterMapManage/icon2.png


BIN
src/assets/images/electronicDisasterMapManage/icon3.png


BIN
src/assets/images/electronicDisasterMapManage/icon4.png


BIN
src/assets/images/electronicDisasterMapManage/position.png


BIN
src/assets/images/electronicDisasterMapManage/position2.png


BIN
src/assets/images/electronicDisasterMapManage/position3.png


+ 24 - 1
src/assets/styles/index.scss

@@ -571,6 +571,18 @@ aside {
   cursor: pointer;
   font-size: 14px;
 }
+.common-btn-primary4 {
+  width: 133px;
+  height: 50px;
+  background: url('@/assets/images/common/btnPrimary4.png') no-repeat;
+  background-size: 100% 100%;
+  color: #ffffff;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  cursor: pointer;
+  font-size: 14px;
+}
 .common-btn-danger{
   width: 119px;
   height: 32px;
@@ -607,7 +619,18 @@ aside {
   cursor: pointer;
   font-size: 14px;
 }
-
+.common-btn3 {
+  width: 112px;
+  height: 28px;
+  background: url('@/assets/images/common/btn2.png') no-repeat;
+  background-size: 100% 100%;
+  color: #ffffff;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  cursor: pointer;
+  font-size: 14px;
+}
 .common-table {
   width: 100%;
   .table-header {

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

@@ -21,14 +21,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']
@@ -38,25 +47,37 @@ 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']
@@ -77,6 +98,7 @@ declare module 'vue' {
     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']

+ 572 - 108
src/views/comprehensiveGuarantee/electronicDisasterMapManage/index.vue

@@ -3,13 +3,19 @@
     <div id="aMap2" class="map"></div>
     <!--左上事件列表-->
     <div class="event-box">
-      <div class="tabs">
-        <div class="tab">事件位置</div>
-        <el-button type="primary" @click="toSelect">定点选取</el-button>
-      </div>
-      <div class="event-list">
-        <div v-for="(item, index) in eventList" :key="index" class="event-item" @click="selectEvent(item)">
-          {{ item.event_title }}
+      <div class="event-box2">
+        <div class="box-header">
+          <div class="header-left">
+            <i class="icon-position" />
+            <div class="text1">事件位置</div>
+          </div>
+          <div class="common-btn-primary3" @click="toSelect">定点选取</div>
+        </div>
+        <div class="event-list">
+          <div v-for="(item, index) in eventList" :key="index" class="event-item" @click="selectEvent(item)">
+            <i :class="!!item.checked ? 'checked2' : 'checked1'" />
+            {{ item.event_title }}
+          </div>
         </div>
       </div>
     </div>
@@ -21,49 +27,105 @@
       </div>
       <div v-show="expand" class="list-content">
         <div v-for="(item, index) in emergency_resource" :key="index" class="list-item" @click="handleClick(item)">
-          <i :class="!!item.checked ? 'checked1' : 'checked2'" />
+          <i :class="!!item.checked ? 'checked2' : 'checked1'" />
           <div>{{ item.label }}</div>
         </div>
       </div>
     </div>
-    <div v-show="!!selectData.longitude && !!selectData.latitude" class="search-box">
-      <div class="search-title">{{ selectData.event_title }}</div>
-      <div class="search-item">
-        <div class="text1">选择救灾资源</div>
-        <el-select
-          v-model="queryParams.dataType"
-          class="custom-select select-box"
-          placeholder="请选择"
-          popper-class="custom-select-popper"
-          :teleported="false"
-        >
-          <el-option v-for="item in disaster_relief_material" :key="item.value" :label="item.label" :value="item.value"></el-option>
-        </el-select>
+    <div class="right-section">
+      <div class="tag-box" @click="showRight = !showRight">
+<!--        <i class="icon" />-->
+        <div class="text1">定点分析>></div>
       </div>
-      <div class="search-item2">
-        <el-input v-model="queryParams.keyword" class="custom-input2" placeholder="请输入关键字搜索" style="width: 200px" />
-        <div class="common-btn-primary" @click="getList">搜索</div>
-      </div>
-      <div class="search-item3">
-        <el-checkbox v-model="checked1">自定义距离</el-checkbox>
-        <el-input v-model="distance" class="custom-input2" placeholder="自定义距离(公里)" style="width: 200px" />
-      </div>
-
-      <div class="list2">
-        <div>总数: {{ total }}个</div>
-        <div class="list-content">
-          <div v-for="(item, index) in dataList" :key="index" class="list-item">
-            <div class="text1">{{ item.name }}</div>
+      <div v-show="showRight" class="right-box">
+        <div class="scroll">
+          <div v-if="!tempState.address" class="search-box">
             <div class="text-box">
-              <div class="text2">{{ item.address }}</div>
-              <div class="text3" @click="handleRoutes(item)">路线</div>
+              <i class="icon-position2" />
+              <div class="text1" :title="selectData.event_title">{{ selectData.event_title }}</div>
+            </div>
+          </div>
+          <div v-else class="search-box">
+            <div class="text-box">
+              <i class="icon-position2" />
+              <div class="text1" :title="tempState.address">{{ tempState.address }}</div>
+            </div>
+            <div class="common-btn-primary4" @click="confirmSelect">确定定位</div>
+          </div>
+          <div class="search-item">
+            <div class="text1">选择救灾资源:</div>
+            <el-select
+              v-model="queryParams.dataType"
+              class="custom-select select-box"
+              placeholder="请选择"
+              popper-class="custom-select-popper"
+              :teleported="false"
+            >
+              <el-option v-for="item in disaster_relief_material" :key="item.value" :label="item.label" :value="item.value"></el-option>
+            </el-select>
+          </div>
+          <div class="search-item2">
+            <el-input v-model="queryParams.keyword" class="custom-input2" placeholder="请输入关键字搜索" />
+            <div class="common-btn-primary4" @click="getList">搜索</div>
+          </div>
+          <div class="search-item3">
+            <el-checkbox v-model="checked1">自定义距离</el-checkbox>
+            <el-input v-model="distance" class="custom-input2" placeholder="自定义距离(公里)" />
+            <div class="common-btn3" @click="getList">确定</div>
+          </div>
+
+          <div class="list2">
+            <div class="text-box1">
+              总数:
+              <div class="gradient-text2">{{ total }}</div>
+              个
+            </div>
+            <div class="list-content">
+              <div v-for="(item, index) in dataList" :key="index" class="list-item">
+                <div class="text-box2">
+                  <div class="text2">{{ item.name }}</div>
+                  <div class="text3">{{ item.address }}</div>
+                </div>
+                <div class="operate" @click="handleRoutes(item)">
+                  <i class="icon2" />
+                  路线
+                </div>
+              </div>
+            </div>
+          </div>
+          <div v-show="!!routeData && routeData.length > 0" class="route-box">
+            <div class="route-item1">
+              <i class="icon-position3" />
+              <div class="text1">路线始点:</div>
+              <div class="text2" :title="routesAddress">{{ routesAddress }}</div>
+              <i class="icon-close2" @click="showAddress = false" />
+            </div>
+            <div class="route-list">
+              <div v-for="(item, index) in routeData" :key="index" class="route-item2" @click="drawRoute(item)">
+                <div class="text-box1">
+                  <div :class="'tag' + index">{{ getTag(index) }}</div>
+                  <div class="text1">{{ item.policy }}</div>
+                </div>
+                <div class="route-info">
+                  <div class="text-box2">
+                    <i class="icon1" />
+                    <div class="gradient-text2">{{ item.date[0] }}</div>
+                    <div class="text2">小时</div>
+                    <div class="gradient-text2">{{ item.date[1] }}</div>
+                    <div class="text2">分钟</div>
+                  </div>
+                  <div class="line"></div>
+                  <div class="text-box2">
+                    <i class="icon2" />
+                    <div class="gradient-text2">{{ item.distance / 1000 }}</div>
+                    <div class="text2">公里</div>
+                  </div>
+                </div>
+              </div>
             </div>
           </div>
         </div>
-      </div>
-      <div class="text2"></div>
-      <div v-for="(item, index) in routeData" :key="index" class="route-item" @click="drawRoute(item)">
-        {{ item.policy }} | {{ item.distance / 1000 }}公里
+
       </div>
     </div>
   </div>
@@ -101,15 +163,18 @@ import {
   getWaterloggedRoadsDetails,
   getYardSitesDetails
 } from '@/api/globalMap/spatialAnalysis';
+import BigNumber from 'bignumber.js';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { emergency_resource, disaster_relief_material } = toRefs<any>(proxy?.useDict('emergency_resource', 'disaster_relief_material'));
 // 应急资源
 let expand = ref(true);
-let AMap, map, driving;
-let end = ref([110.925176, 21.678993]);
+let AMap, map, driving, geocoder;
 let routeData = ref([]);
 let routeLine, startMarker, endMarker;
+let showRight = ref(false);
+let showAddress = ref(true);
+let routesAddress = ref('');
 const { getAMap, getMap, creatMask, switchMap, addMarker, clearMarker, showInfo, hideInfo } = useAMap({
   el: 'aMap2',
   key: '30d3d8448efd68cb0b284549fd41adcf', // 申请好的Web端开发者Key,首次调用 load 时必填
@@ -118,7 +183,7 @@ const { getAMap, getMap, creatMask, switchMap, addMarker, clearMarker, showInfo,
   center: [110.925175, 22],
   dragEnable: true,
   scrollWheel: true,
-  plugins: ['AMap.Driving', 'AMap.DistrictSearch', 'AMap.MarkerCluster'],
+  plugins: ['AMap.Driving', 'AMap.DistrictSearch', 'AMap.MarkerCluster', 'AMap.Geocoder'],
   // layers: 'satellite',
   // 加载完成事件
   onLoadCompleted: () => {
@@ -128,16 +193,22 @@ const { getAMap, getMap, creatMask, switchMap, addMarker, clearMarker, showInfo,
     switchMap('satellite');
     //构造路线导航类
     driving = new AMap.Driving({});
+    geocoder = new AMap.Geocoder({
+      // city 指定进行编码查询的城市,支持传入城市名、adcode 和 citycode
+      city: '010'
+    });
   },
   onMarkerClick: (data) => {
     // 多点位
     if (data.type === '1') {
       let path = [];
-      props.pointType.forEach((item) => {
-        path.push(item.component);
+      emergency_resource.value.forEach((item) => {
+        if (!!item.checked) {
+          path.push(item.value);
+        }
       });
       getPointInfoList({
-        option: path.toString(),
+        option: data.dataType,
         longitude: data.longitude.toString(),
         latitude: data.latitude.toString()
       }).then((res) => {
@@ -163,7 +234,7 @@ const { getAMap, getMap, creatMask, switchMap, addMarker, clearMarker, showInfo,
           const div = document.createElement('div');
           div.className = 'point-item point-item-hover';
           div.innerHTML =
-            '<div class="td4">' + getDictLabel(point_type.value, item.dataType.toString()) + '</div><div class="td4">' + item.name + '</div>';
+            '<div class="td4">' + getDictLabel(emergency_resource.value, item.dataType.toString()) + '</div><div class="td4">' + item.name + '</div>';
           div.addEventListener('click', () => {
             handlePointDetails(item);
           });
@@ -189,6 +260,11 @@ let selectData = ref({
   latitude: ''
 });
 let selectMarker;
+let tempState = reactive({
+  address: '',
+  longitude: '',
+  latitude: ''
+});
 let checked1 = ref(false);
 let distance = ref('');
 let queryParams = reactive({
@@ -202,17 +278,39 @@ const toSelect = () => {
 };
 const handleClickMap = (e) => {
   map.off('click', handleClickMap);
+  tempState.longitude = e.lnglat.getLng();
+  tempState.latitude = e.lnglat.getLat();
+  geocoder.getAddress([tempState.longitude, tempState.latitude], (status, result) => {
+    if (status === 'complete' && result.info === 'OK') {
+      tempState.address = result.regeocode.formattedAddress;
+    }
+  });
+  showRight.value = true;
+};
+const confirmSelect = () => {
   selectEvent(
     {
-      longitude: e.lnglat.getLng(),
-      latitude: e.lnglat.getLat()
+      event_title: tempState.address,
+      longitude: tempState.longitude,
+      latitude: tempState.latitude
     },
     true
   );
 };
 // 选中事件
 const selectEvent = (item, unFitView) => {
+  eventList.value.forEach((item2) => {
+    if (item2.event_id === item.event_id) {
+      item2.checked = true;
+    } else {
+      item2.checked = false;
+    }
+  });
   selectData.value = item;
+  tempState.address = '';
+  tempState.longitude = '';
+  tempState.latitude = '';
+  showRight.value = true;
   if (!!selectMarker) {
     selectMarker.setMap(null);
     selectMarker = null;
@@ -232,9 +330,12 @@ const selectEvent = (item, unFitView) => {
     map.setFitView([selectMarker]);
   }
 };
+
 const handleRoutes = (item) => {
   const start = [item.longitude, item.latitude];
   const end = [selectData.value.longitude, selectData.value.latitude];
+  showAddress.value = true;
+  routesAddress.value = item.address;
   calculateRoutes(start, end, 0);
 };
 // 计算并展示三条路线
@@ -256,6 +357,7 @@ const calculateRoutes = (start, end, index) => {
       if (index === 0) {
         routeData.value = [];
       }
+      route.date = formatDate(route.time);
       routeData.value.push(route);
     }
 
@@ -328,6 +430,35 @@ const parseRouteToPath = (route) => {
 
   return path;
 };
+function formatDate(seconds: number) {
+  // 将秒数转换为BigNumber
+  const secondsBn = new BigNumber(seconds);
+
+  // 计算小时数
+  const hoursBn = secondsBn.dividedBy(3600).integerValue(BigNumber.ROUND_DOWN);
+  // 计算剩余的秒数,然后转换为分钟数
+  const remainingSecondsBn = secondsBn.minus(hoursBn.times(3600));
+  const minutesBn = remainingSecondsBn.dividedBy(60).integerValue();
+
+  // 将BigNumber转换为字符串,并使用padStart添加前导零
+  const hours = hoursBn.toString();
+
+  const minutes = minutesBn.toString();
+
+  // 返回包含小时和分钟的数组
+  return [hours, minutes];
+}
+const getTag = (index) => {
+  let tag = '路线' + index;
+  if (index === 0) {
+    tag = '路线A';
+  } else if (index === 1) {
+    tag = '路线B';
+  } else if (index === 2) {
+    tag = '路线C';
+  }
+  return tag;
+};
 const handlePointDetails = (data) => {
   let methodList = {
     '1': getEmergencyExpertDetails,
@@ -580,6 +711,7 @@ onUnmounted(() => {
   width: 100%;
   height: 100%;
   position: relative;
+  box-sizing: border-box;
   .map {
     width: 100%;
     height: 100%;
@@ -591,75 +723,393 @@ onUnmounted(() => {
     }
   }
   .event-box {
+    box-sizing: border-box;
     position: absolute;
     top: 10px;
     left: 10px;
-    width: 280px;
-    min-height: 200px;
-    background-color: #213567;
     color: #ffffff;
-    .tabs {
-      padding: 10px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    &::before {
+      content: '';
+      display: inline-block;
+      width: 301px;
+      height: 8px;
+      background: url('@/assets/images/electronicDisasterMapManage/decoration3.png') no-repeat;
+      background-size: 100% 100%;
+      margin-bottom: 5px;
+    }
+    &::after {
+      content: '';
+      display: inline-block;
+      width: 300px;
+      height: 8px;
+      background: url('@/assets/images/electronicDisasterMapManage/decoration4.png') no-repeat;
+      background-size: 100% 100%;
+      margin-top: 5px;
+    }
+    .event-box2 {
+      width: 290px;
+      height: 206px;
+      background: url('@/assets/images/electronicDisasterMapManage/box3.png') no-repeat;
+      background-size: 100% 100%;
       display: flex;
-      justify-content: space-between;
-      align-items: center;
-      position: relative;
-      .tab {
-        font-size: 14px;
-      }
-      .btn {
-        position: absolute;
-        top: 0;
-        right: 0;
-        width: 134px;
-        height: 66px;
-        background: url('@/assets/images/common/btnPrimary3.png') no-repeat center center;
-        background-size: 100% 100%;
-        color: #ffffff;
+      flex-direction: column;
+      .box-header {
         display: flex;
+        justify-content: space-between;
         align-items: center;
-        justify-content: center;
-        font-size: 14px;
-        cursor: pointer;
+        position: relative;
+        padding: 0 10px;
+        .header-left {
+          display: flex;
+          align-items: center;
+          .icon-position {
+            display: inline-block;
+            width: 19px;
+            height: 22px;
+            background: url('@/assets/images/electronicDisasterMapManage/position.png') no-repeat;
+            background-size: 100% 100%;
+            margin-right: 5px;
+          }
+          font-size: 14px;
+        }
+        .btn {
+          position: absolute;
+          top: 0;
+          right: 0;
+          width: 134px;
+          height: 66px;
+          background: url('@/assets/images/common/btnPrimary3.png') no-repeat center center;
+          background-size: 100% 100%;
+          color: #ffffff;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          font-size: 14px;
+          cursor: pointer;
+        }
       }
-    }
-    .event-list {
-      display: flex;
-      flex-direction: column;
-      max-height: 250px;
-      overflow-y: auto;
-      .event-item {
-        cursor: pointer;
-        padding: 5px 10px;
-        &:hover {
-          background-color: #335293;
+      .event-list {
+        display: flex;
+        flex-direction: column;
+        overflow-y: auto;
+        .event-item {
+          cursor: pointer;
+          padding: 5px 10px;
+          .checked1 {
+            background: url('@/assets/images/electronicDisasterMapManage/checked1.png') no-repeat;
+          }
+          .checked2 {
+            background: url('@/assets/images/electronicDisasterMapManage/checked2.png') no-repeat;
+          }
+          .checked1,
+          .checked2 {
+            display: inline-block;
+            width: 16px;
+            height: 16px;
+            background-size: 100% 100%;
+            margin-right: 5px;
+          }
+          &:hover {
+            background-color: #335293;
+          }
         }
       }
     }
   }
-  .search-box {
+  .right-section {
     position: absolute;
     right: 10px;
     top: 10px;
-    color: #ffffff;
-    background-color: #17255a;
-    width: 280px;
-    height: 500px;
-    .search-title {
-      font-size: 16px;
-      color: #91ecf3;
+    display: flex;
+    box-sizing: border-box;
+    .tag-box {
+      width: 46px;
+      height: 144px;
+      background: url('@/assets/images/electronicDisasterMapManage/box4.png') no-repeat;
+      background-size: 100% 100%;
+      color: #ffffff;
+      padding: 12px 15px;
+      cursor: pointer;
+    }
+    .right-box {
+      color: #ffffff;
+      width: 407px;
+      height: 602px;
+      background: url('@/assets/images/electronicDisasterMapManage/box5.png') no-repeat;
+      background-size: 100% 100%;
+      padding: 20px 15px;
+      .scroll {
+        width: 100%;
+        height: 562px;
+        overflow-y: auto;
+        overflow-x: hidden;
+      }
+      .search-box {
+        width: 380px;
+        height: 57px;
+        background: url('@/assets/images/electronicDisasterMapManage/box6.png') no-repeat;
+        background-size: 100% 100%;
+        padding: 0 10px;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        .text-box {
+          display: flex;
+          align-items: center;
+          .icon-position2 {
+            flex-shrink: 0;
+            display: inline-block;
+            width: 46px;
+            height: 50px;
+            background: url('@/assets/images/electronicDisasterMapManage/position2.png') no-repeat;
+            background-size: 100% 100%;
+          }
+          .text1 {
+            margin-left: 10px;
+            font-size: 14px;
+            color: #f7f8fb;
+            display: -webkit-box;
+            -webkit-box-orient: vertical;
+            -webkit-line-clamp: 2;
+            overflow: hidden;
+            text-overflow: ellipsis;
+          }
+        }
+        .common-btn-primary4 {
+          flex-shrink: 0;
+        }
+      }
+      .search-item {
+        margin: 6px 0 3px;
+        display: flex;
+        align-items: center;
+        .text1 {
+          font-size: 14px;
+          flex-shrink: 0;
+        }
+        .custom-select {
+          flex: 1;
+        }
+      }
+      .search-item2 {
+        margin: 3px 0;
+        display: flex;
+        align-items: center;
+        .custom-input2 {
+          flex: 1;
+        }
+        .common-btn-primary4 {
+          flex-shrink: 0;
+          margin-right: -12px;
+        }
+      }
+      .search-item3 {
+        margin: 3px 0;
+        display: flex;
+        align-items: center;
+        .el-checkbox {
+          color: #8fa8be;
+          margin-right: 10px;
+          flex-shrink: 0;
+        }
+        .custom-input2 {
+          flex: 1;
+          margin-right: 10px;
+        }
+        .common-btn3 {
+          flex-shrink: 0;
+        }
+      }
+      .list2 {
+        padding: 8px;
+        border-radius: 2px;
+        background: #1c356d;
+        color: #ebf5f7;
+        .text-box1 {
+          font-size: 14px;
+          .gradient-text2 {
+            font-size: 18px;
+            font-family: BEBAS-1;
+          }
+        }
+        .list-content {
+          height: 210px;
+          overflow-y: auto;
+          .list-item {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            padding: 7px 0;
+            border-bottom: 1px solid #4574d5;
+            .text-box2 {
+              .text2 {
+                font-size: 14px;
+                line-height: 28px;
+              }
+              .text3 {
+                font-size: 13px;
+                line-height: 26px;
+              }
+            }
+            .operate {
+              flex-shrink: 0;
+              display: flex;
+              align-items: center;
+              font-size: 14px;
+              color: transparent;
+              background-image: linear-gradient(to bottom, #ffffff 25%, #2b72d6 100%);
+              -webkit-background-clip: text;
+              background-clip: text;
+              cursor: pointer;
+              .icon2 {
+                display: inline-block;
+                width: 33px;
+                height: 33px;
+                background: url('@/assets/images/electronicDisasterMapManage/icon2.png') no-repeat;
+                background-size: 100% 100%;
+              }
+            }
+          }
+        }
+      }
+      .route-box {
+        .route-item1 {
+          display: flex;
+          align-items: center;
+          background-color: #1d366e;
+          padding: 0 5px;
+          margin-top: 6px;
+          .icon-position3 {
+            display: inline-block;
+            width: 23px;
+            height: 26px;
+            background: url('@/assets/images/electronicDisasterMapManage/position3.png') no-repeat;
+            background-size: 100% 100%;
+            flex-shrink: 0;
+          }
+          .text1 {
+            font-size: 14px;
+            color: #cfe4fe;
+            flex-shrink: 0;
+          }
+          .text2 {
+            font-size: 14px;
+            color: #f1fbff;
+            flex: 1;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+          }
+          .icon-close2 {
+            flex-shrink: 0;
+            width: 12px;
+            height: 12px;
+            background: url('@/assets/images/electronicDisasterMapManage/close.png') no-repeat;
+            background-size: 100% 100%;
+            margin-left: 5px;
+          }
+        }
+        .route-item2 {
+          width: 100%;
+          background: #1f2c4e;
+          padding: 5px;
+          margin-top: 6px;
+          .text-box1 {
+            display: flex;
+            .tag0 {
+              color: #fff;
+              background-color: #e65d63;
+              border-radius: 10px;
+              padding: 2px 6px;
+              font-size: 12px;
+            }
+            .tag1 {
+              color: #fff;
+              background-color: #f0b13c;
+              border-radius: 10px;
+              padding: 2px 6px;
+              font-size: 12px;
+            }
+            .tag2 {
+              color: #fff;
+              background-color: #6bc26b;
+              border-radius: 10px;
+              padding: 2px 6px;
+              font-size: 12px;
+            }
+            .text1 {
+              font-size: 14px;
+              margin-left: 5px;
+            }
+          }
+          .route-info {
+            display: flex;
+            background-color: #2b3858;
+            border: 1px solid #2e5174;
+            padding: 3px 5px;
+            margin-top: 10px;
+            display: flex;
+            align-items: center;
+            .text-box2 {
+              display: flex;
+              align-items: center;
+              min-width: 150px;
+              .icon1 {
+                display: inline-block;
+                width: 14px;
+                height: 13px;
+                background: url('@/assets/images/electronicDisasterMapManage/icon3.png') no-repeat;
+                background-size: 100% 100%;
+                margin-right: 5px;
+              }
+              .gradient-text2 {
+                font-size: 16px;
+                font-family: BEBAS-1;
+                margin: 0 3px;
+              }
+              .text2 {
+                font-size: 14px;
+                color: #95a9c1;
+              }
+            }
+            .line {
+              width: 1px;
+              height: 10px;
+              background-color: #5a6885;
+            }
+          }
+        }
+      }
     }
   }
   .list {
     position: absolute;
     bottom: 10px;
     left: 10px;
-    width: 240px;
-    background-color: #213567;
-    //&::after {
-    //  content: '';
-    //  display: inline-block;
-    //}
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    &::before {
+      content: '';
+      display: inline-block;
+      width: 177px;
+      height: 8px;
+      background: url('@/assets/images/electronicDisasterMapManage/decoration2.png') no-repeat;
+      background-size: 100% 100%;
+      margin-bottom: 5px;
+    }
+    &::after {
+      content: '';
+      display: inline-block;
+      width: 177px;
+      height: 8px;
+      background: url('@/assets/images/electronicDisasterMapManage/decoration1.png') no-repeat;
+      background-size: 100% 100%;
+      margin-top: 5px;
+    }
     .list-header {
       display: flex;
       align-items: center;
@@ -667,41 +1117,55 @@ onUnmounted(() => {
       padding: 5px 10px;
       color: #fff;
       cursor: pointer;
+      width: 162px;
+      height: 52px;
+      background: url('@/assets/images/electronicDisasterMapManage/box1.png') no-repeat;
+      background-size: 100% 100%;
       .icon-down {
-        background: url('@/assets/images/menu/down.png') no-repeat;
+        background: url('@/assets/images/electronicDisasterMapManage/down.png') no-repeat;
       }
       .icon-up {
-        background: url('@/assets/images/menu/up.png') no-repeat;
+        background: url('@/assets/images/electronicDisasterMapManage/down.png') no-repeat;
+        transform: rotateX(180deg);
       }
       .icon-down,
       .icon-up {
-        width: 18px;
-        height: 10px;
+        width: 16px;
+        height: 9px;
         background-size: 100% 100%;
       }
     }
     .list-content {
+      width: 161px;
+      height: 314px;
+      background: url('@/assets/images/electronicDisasterMapManage/box2.png') no-repeat;
+      background-size: 100% 100%;
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+      margin-top: 5px;
       .list-item {
         display: flex;
         align-items: center;
         font-size: 14px;
         color: #fff;
         cursor: pointer;
-        padding: 5px 10px;
+        padding: 7.5px 10px;
         &:hover {
-          background-color: #335293;
+          background: url('@/assets/images/electronicDisasterMapManage/active.png') no-repeat;
+          background-size: 100% 100%;
         }
         .checked1 {
-          background: url('@/assets/images/menu/checked-box2.png') no-repeat;
+          background: url('@/assets/images/electronicDisasterMapManage/checked1.png') no-repeat;
         }
         .checked2 {
-          background: url('@/assets/images/menu/checked-box.png') no-repeat;
+          background: url('@/assets/images/electronicDisasterMapManage/checked2.png') no-repeat;
         }
         .checked1,
         .checked2 {
           display: inline-block;
-          width: 20px;
-          height: 20px;
+          width: 16px;
+          height: 16px;
           background-size: 100% 100%;
           margin-right: 5px;
         }

+ 1 - 2
src/views/comprehensiveGuarantee/emergencySpecialistManagement/Map.vue

@@ -123,8 +123,7 @@ const mapUtils = useAMap({
           item.latitude = data.latitude;
           const div = document.createElement('div');
           div.className = 'point-item point-item-hover';
-          div.innerHTML =
-            '<div class="td4">' + getDictLabel(point_type.value, item.dataType.toString()) + '</div><div class="td4">' + item.name + '</div>';
+          div.innerHTML = '<div class="td4">专家</div><div class="td4">' + item.name + '</div>';
           div.addEventListener('click', () => {
             handlePointDetails(item);
           });