From 3f8204c31b44ca186f2d5d1f96682f8c46ad2996 Mon Sep 17 00:00:00 2001
From: zhanghua <314079846@qq.com>
Date: 星期六, 23 十一月 2024 16:23:01 +0800
Subject: [PATCH] map组件

---
 src/views/index.vue                      |  580 ++++++++++++++--------------
 src/views/components/noticeTable.vue     |    4 
 src/views/components/Map/index.vue       |  585 +++++++++++++++++++++++++++++
 src/views/components/tidingsTable.vue    |    4 
 src/assets/images/file1.png              |    0 
 src/views/components/projectOverview.vue |    4 
 6 files changed, 881 insertions(+), 296 deletions(-)

diff --git a/src/assets/images/file1.png b/src/assets/images/file1.png
new file mode 100644
index 0000000..3e4c568
--- /dev/null
+++ b/src/assets/images/file1.png
Binary files differ
diff --git a/src/views/components/Map/index.vue b/src/views/components/Map/index.vue
new file mode 100644
index 0000000..8a2312c
--- /dev/null
+++ b/src/views/components/Map/index.vue
@@ -0,0 +1,585 @@
+<template>
+  <div>
+    <div :id="id" ref="contentRef" class="w-full h-full">
+      <div
+        v-if="isShowControl"
+        :class="controlPosition"
+        class="control-container bottom-right"
+      >
+        <div
+          v-for="item in controlMapping"
+          :key="item.id"
+          class="control-content"
+        >
+          <template v-if="item.children">
+            <div
+              v-for="child in item.children"
+              :key="child.id"
+              class="control-item"
+              @click="child.event"
+            >
+              <img :src="child.img" />
+            </div>
+          </template>
+          <template v-else>
+            <div class="control-item" @click="item.event">
+              <img :src="item.img" />
+            </div>
+          </template>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup>
+import Location from "@/assets/images/location.png";
+import FileImg from "@/assets/images/file1.png";
+import MinusImg from "@/assets/images/minus.png";
+import PlusImg from "@/assets/images/plus.png";
+import FullScreenImg from "@/assets/images/fullScreen.png";
+import PositionImg from "@/assets/images/position.png";
+export default {
+  data() {
+    return {
+      zoom: 15,
+      map: null,
+      contentRef: {},
+      infoWin: {},
+      defaultMaskInfo: {},
+      mapKey: "ffb871cd7ca48883db3b04cfd00d469f",
+      controlMapping: [
+        {
+          id: "瀹氫綅",
+          img: PositionImg,
+          event: this.getCurrentPosition,
+        },
+        {
+          id: "缂╂斁",
+          children: [
+            {
+              id: "鏀惧ぇ",
+              img: PlusImg,
+              event: this.zoomIn,
+            },
+            {
+              id: "缂╁皬",
+              img: MinusImg,
+              event: this.zoomOut,
+            },
+          ],
+        },
+        {
+          id: "鍏ㄥ睆",
+          img: FullScreenImg,
+          event: this.fullScreen,
+        },
+      ],
+    };
+  },
+  props: {
+    id: String,
+    mapList: Array,
+    listType: Boolean,
+    isShowControl: Boolean,
+    controlPosition: Object,
+    isImmediateLoad: { type: Boolean, default: true },
+    mapType: Boolean,
+  },
+
+  created() {
+    this.defaultMaskInfo = {
+      lon: this.$props.mapList[0]?.lon
+        ? this.$props.mapList[0].lon
+        : "105.37281",
+      lat: this.$props.mapList[0]?.lat
+        ? this.$props.mapList[0].lat
+        : "30.87145",
+      name: this.$props.mapList[0]?.name ? this.$props.mapList[0].name : "鍒涘缓",
+    };
+    if (this.$props.isImmediateLoad) this.onLoad();
+  },
+  methods: {
+    async onLoad() {
+      const scripts = document.body.querySelectorAll("script");
+      if (!this.mapKey) {
+        // const res = await getDicts('map_key')
+        // mapKey = res[0].dictLabel
+        this.mapKey = "ffb871cd7ca48883db3b04cfd00d469f";
+      }
+
+      const scriptSrc = `http://api.tianditu.gov.cn/api?v=4.0&tk=${this.mapKey}`;
+      const mapScript = Array.from(scripts).find((item) => {
+        return item.getAttribute("src") === scriptSrc;
+      });
+
+      if (!mapScript) {
+        // 鍒涘缓script鏍囩
+        const script = document.createElement("script");
+        // 璁剧疆API鐨刄RL
+        script.src = scriptSrc;
+        script.type = "text/javascript";
+        // 灏唖cript鏍囩娣诲姞鍒癏TML涓�
+        document.body.appendChild(script);
+        script.onload = () => {
+          this.initTianMap();
+        };
+      } else {
+        this.initTianMap();
+      }
+    },
+
+    initTianMap() {
+      var T = window.T;
+      setTimeout(async () => {
+        this.map = new T.Map(this.id, {
+          projection: "EPSG:4326",
+        });
+        this.map.centerAndZoom(
+          new T.LngLat(this.defaultMaskInfo.lon, this.defaultMaskInfo.lat),
+          this.zoom
+        );
+        if (!this.$props.listType) {
+          // 娓呴櫎涔嬪墠鐨勬爣璁�
+          // map && map.clearOverLays()
+          //form琛ㄥ崟涓槸鍚︽湁鍧愭爣锛屾湁鍒欏畾浣嶅埌瀵瑰簲浣嶇疆锛屾病鏈夊垯浣跨敤榛樿鐨�
+          // 104.65417 28.75572 娴嬭瘯鏁版嵁
+          // 鍥涘窛鐪佸疁瀹惧競缈犲睆鍖哄ぇ瑙傛ゼ琛楅亾澶栧崡琛�71
+          if (this.$props.mapList[0].addr) {
+            const { lng: lon, lat } = await this.getGeocode(
+              this.$props.mapList[0].addr
+            );
+            this.defaultMaskInfo.lon = String(lon);
+            this.defaultMaskInfo.lat = String(lat);
+          }
+
+          this.map && this.makeDefaultMask(this.defaultMaskInfo);
+          this.addEvent(this.map, "click", (e) => this.mapClick(e));
+        } else {
+          this.$props.mapList.length && this.makeAllMask(this.$props.mapList);
+        }
+      }, 0);
+    },
+
+    zoomIn() {
+      this.map && this.map.zoomIn();
+    },
+
+    zoomOut() {
+      this.map && this.map.zoomOut();
+    },
+
+    fullScreen() {
+      this.map && this.contentRef?.requestFullscreen();
+    },
+
+    getCurrentPosition() {
+      if (navigator.geolocation) {
+        ElMessage.warning("璇ュ姛鑳芥殏鏈紑鍙�");
+        // TODO 鍦板浘瀹氫綅
+        // navigator.geolocation.getCurrentPosition(function (position) {
+        //   var latitude = position.coords.latitude
+        //   var longitude = position.coords.longitude
+        //
+        //   moveTo(String(longitude), String(latitude))
+        // })
+      } else {
+        ElMessage.warning("褰撳墠娴忚鍣ㄤ笉鏀寔瀹氫綅鍔熻兘");
+      }
+    },
+
+    moveTo(lon, lat) {
+      this.map && this.map.panTo(new T.LngLat(lon, lat));
+    },
+
+    // 榛樿鐨勭偣鏍囪
+    makeDefaultMask(mapInfo) {
+      const { name, lon, lat } = mapInfo
+      const option = {
+        text: name,
+        offset: [-35, -45],
+        labelBg: "#3369FF",
+        labelColor: "#fff",
+        labelClick,
+      };
+      // 娓呴櫎涔嬪墠鐨勬爣璁�
+      this.map && this.map.clearOverLays();
+      this.map.panTo(new T.LngLat(lon, lat));
+      this.makeMask(lon, lat, { labelOptions: option });
+    },
+
+    // 鍦板浘鐐瑰嚮浜嬩欢
+    mapClick(e) {
+      e.originalEvent.stopPropagation();
+
+      const { lat, lng: lon } = e.lnglat;
+
+      this.makeDefaultMask({
+        ...defaultMaskInfo,
+        lon: String(lon),
+        lat: String(lat),
+      });
+      this.getReverseGeocode(e).then((addr) => {
+        this.$emit("mapClick", { e, addr });
+      });
+      console.log("鐐瑰嚮浜嬩欢", e);
+    },
+
+    // 閫嗗湴鐞嗙紪鐮� 鑾峰彇鍦板潃
+    getReverseGeocode(e) {
+      return new Promise((resolve) => {
+        const geocode = new T.Geocoder();
+        geocode.getLocation(e.lnglat, (result) => {
+          if (result.status === "0") {
+            resolve(result.getAddress());
+          }
+        });
+      });
+    },
+
+    // 鍦扮悊缂栫爜
+    getGeocode(addr) {
+      return new Promise((resolve) => {
+        const geocoder = new T.Geocoder();
+        geocoder.getPoint(addr, (result) => {
+          if (result.status === "0") {
+            resolve(result.getLocationPoint());
+          }
+        });
+      });
+    },
+
+    // 鐢熸垚鐐逛綅鍐呭
+    // 鐢熸垚鐐逛綅鍐呭
+    generateContent(row, random) {
+      if (row) {
+        return `
+    <div class="map-window-info">
+      <div class='title-block'>
+        <div class="title truncate-content">
+          ${row.projectName ?? "鏆傛棤鏁版嵁"}
+        </div>
+        <div class='close-btn close-btn-${random}'>
+          脳
+        </div>
+      </div>
+      <div class="detail-info">
+        <span class="truncate-content">鎬绘姇璧勶細${
+          row.totalMoney ?? "鏆傛棤鏁版嵁"
+        }</span>
+        <span class="truncate-content">
+          椤圭洰鐘舵�侊細
+        </span>
+         <span class="truncate-content">
+          椤圭洰鍦板潃锛�${row.projectAddr ?? "鏆傛棤鏁版嵁"}
+        </span>
+      </div>
+    </div>`;
+      } else {
+        return `<div style="display: flex; justify-content:center; align-items:center; opacity: 0;">
+
+    </div>`;
+      }
+    },
+
+    // 鍞竴鏍囪瘑
+    getUniqueId() {
+      return Math.random().toString(36).substr(2) + Date.now();
+    },
+
+    markerMouseover(_e, infoWin, info, random) {
+      // 鐐逛綅鏍囪绉诲叆鏄剧ず涓嶅悓鍐呭
+      if (this.$props.isShowControl) {
+        infoWin.setContent(this.generateContent(info, random));
+        const contentWrapper = document.querySelector(
+          ".tdt-infowindow-content-wrapper"
+        );
+        if (contentWrapper) {
+          contentWrapper.style.opacity = "1";
+        }
+        // 鏌ユ壘鍒伴偅涓猧nfo 鐣岄潰
+        // const allCloseBtn = document.querySelectorAll(`.close-btn-${random}`);
+        // allCloseBtn[allCloseBtn.length - 1].onclick = (_e) => {
+        //   infoWin.setContent(generateContent());
+        // };
+      }
+    },
+
+    markerMouseout(_e, infoWin) {
+      infoWin.setContent(this.generateContent());
+      const contentWrapper = document.querySelector(
+        ".tdt-infowindow-content-wrapper"
+      );
+      if (contentWrapper) {
+        contentWrapper.style.opacity = "0";
+      }
+    },
+
+    // 鎵撴爣璁�
+    makeMask(lon, lat, options) {
+      const { markerOptions, labelOptions } = options;
+      console.log("options", markerOptions, labelOptions);
+      const icon = new T.Icon({
+        iconUrl: Location,
+        iconSize: new T.Point(19, 27),
+        iconAnchor: new T.Point(10, 25),
+      });
+      var marker = new T.Marker(new T.LngLat(lon, lat), {
+        icon,
+        id: markerOptions?.id,
+      });
+      this.map && this.map.addOverLay(marker);
+      const label = new T.Label({
+        text: labelOptions.text,
+        position: new T.LngLat(lon, lat),
+        offset: new T.Point(...labelOptions.offset),
+        id: labelOptions?.id,
+      });
+
+      labelOptions.labelBg && label.setBackgroundColor(labelOptions.labelBg);
+      labelOptions.labelColor && label.setFontColor(labelOptions.labelColor);
+      //鍒涘缓鍦板浘鏂囨湰瀵硅薄
+      if (!this.$props.mapType) {
+        this.map && this.map.addOverLay(label);
+      }
+      markerOptions?.markerClick &&
+        this.addEvent(marker, "click", (e) => markerOptions.markerClick(label, e));
+      labelOptions?.labelClick &&
+      this.addEvent(label, "click", (e) => labelOptions.labelClick(label, e));
+
+      const lnglat = new T.LngLat(lon, lat);
+      const infoWin = new T.InfoWindow(this.generateContent(), {
+        id: markerOptions?.id,
+        offset: new T.Point(0, -15),
+        closeButton: false,
+      });
+
+      infoWin.setLngLat(lnglat);
+      // 鍚戝湴鍥句笂娣诲姞淇℃伅绐楀彛
+      if (this.$props.mapType) {
+        this.map && this.map.addOverLay(infoWin);
+      }
+
+      this.addEvent(marker, "mouseover", (e) =>
+        markerMouseover(e, infoWin, labelOptions, getUniqueId())
+      );
+      this.addEvent(marker, "mouseout", (e) => markerMouseout(e, infoWin));
+    },
+
+    // 鏍囪鎵�鏈夌偣
+    makeAllMask(mapList) {
+      var _this = this;
+      this.mapList.map((item) => {
+        const config = {
+          markerOptions: {
+            id: item.id,
+            markerClick: _this.markerClick,
+          },
+          labelOptions: {
+            text: item.name,
+            offset: [-45, -45],
+            id: item.id,
+            markerClick: _this.labelClick,
+          },
+        };
+        _this.makeMask(item.lon, item.lat, config);
+      });
+    },
+
+    // 閫氱敤娣诲姞浜嬩欢鐨勬柟娉�
+    addEvent(component, name, func) {
+      // 绉诲嚭浜嬩欢
+      this.removeEvent(component, name, func);
+      // 娣诲姞浜嬩欢
+      component.addEventListener(name, func);
+    },
+
+    // 閫氱敤绉诲嚭浜嬩欢鐨勬柟娉�
+    removeEvent(component, name, func) {
+      component.removeEventListener(name, func);
+    },
+
+    //鏍囪鐐瑰嚮浜嬩欢
+    markerClick(currentLabel, e) {
+      const id = e.target.options.id;
+      currentLabelStyleChange(currentLabel);
+      console.log("鐐瑰嚮浜嬩欢", e, currentLabel);
+      this.getReverseGeocode(e).then((addr) => {
+        this.$emit(
+          "markClick",
+          id
+            ? this.$props.mapList?.find((item) => item.id === id)
+            : { e, addr: addr }
+        );
+      });
+    },
+
+    // label鐐瑰嚮浜嬩欢
+    labelClick(currentLabel, e) {
+      const id = e.target.options.id;
+      currentLabelStyleChange(currentLabel);
+      getReverseGeocode(e).then((addr) => {
+        this.$emit(
+          "labelClick",
+          id
+            ? this.$props.mapList?.find((item) => {
+                return String(item.id) === String(id);
+              })
+            : { e, addr: addr }
+        );
+      });
+    },
+
+    currentLabelStyleChange(currentLabel) {
+      this.$emit("currentLabelStyleChange", currentLabel);
+    },
+
+    resizeMap() {
+      this.map.checkResize();
+    },
+  },
+  watch: {
+    listType: {
+      handler(val) {
+        if (val) {
+          this.map && this.map.clearOverLays();
+          if (this.$props.mapList.length && T) {
+            this.makeAllMask(this.$props.mapList);
+          }
+        }
+      },
+    },
+  },
+  beforeUnmount() {
+    this.map = null;
+  },
+};
+
+// const emits = defineEmits<{
+//   (e: 'labelClick', value: any): void;
+//   (e: 'markClick', value: any): void;
+//   (e: 'mapClick', value: any): void;
+//   (e: 'currentLabelStyleChange', value: any): void;
+// }>();
+</script>
+<style lang="scss" scoped>
+:deep(.tdt-label) {
+  border-radius: 15px;
+  color: var(--el-color-primary);
+  cursor: pointer;
+}
+
+// #53547f
+:deep(.tdt-bar a, .tdt-bar a:hover) {
+  border-bottom: 0;
+  color: #53547f;
+}
+
+:deep(.tdt-touch .tdt-control-zoom-in) {
+  font-size: 18px;
+}
+
+:deep(.tdt-bar) {
+  border-radius: 3px;
+  box-shadow: 5px 0px 12px 0px rgb(0 0 0 / 0.03);
+}
+
+.tdt-bar a.tdt-disabled,
+.tdt-bar a:hover {
+  background-color: #f4f4f4;
+}
+
+.control-container {
+  position: absolute;
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+  z-index: 999;
+}
+
+.top-left {
+  top: 10px;
+  left: 10px;
+}
+
+.top-right {
+  top: 10px;
+  right: 10px;
+}
+
+.bottom-left {
+  bottom: 10px;
+  left: 10px;
+}
+
+.bottom-right {
+  bottom: 10px;
+  right: 10px;
+}
+
+.control-content {
+  border-radius: 3px;
+  box-shadow: 5px 0px 12px 0px rgb(0 0 0 / 0.03);
+  background-color: #fff;
+}
+
+.control-item {
+  box-sizing: border-box;
+  width: 30px;
+  height: 30px;
+  line-height: 28px;
+  padding: 0 9px;
+
+  img {
+    display: inline-block;
+  }
+}
+
+.control-item:hover {
+  background-color: #f4f4f4;
+}
+</style>
+<style lang="scss">
+.map-window-info {
+  padding: 0 20px;
+  width: 300px;
+  cursor: default;
+
+  .title {
+    color: #3369ff;
+    font-size: 18px;
+    margin-bottom: 13px;
+  }
+
+  .detail-info {
+    display: flex;
+    flex-direction: column;
+    color: #7e809c;
+    font-size: 12px;
+    gap: 8px;
+  }
+}
+
+.title-block {
+  display: flex;
+  justify-content: space-between;
+
+  .close-btn {
+    font-size: 18px;
+    color: #d8dde6;
+    cursor: pointer;
+    z-index: 999999;
+  }
+}
+
+//.tdt-control-copyright {
+//  display: none;
+//}
+
+.tdt-infowindow-tip-container {
+  opacity: 0;
+}
+
+.tdt-infowindow-content-wrapper {
+  opacity: 0;
+}
+</style>
diff --git a/src/views/components/noticeTable.vue b/src/views/components/noticeTable.vue
index ca39d0e..099f0ac 100644
--- a/src/views/components/noticeTable.vue
+++ b/src/views/components/noticeTable.vue
@@ -97,8 +97,8 @@
         }
     },
     props: {
-        calculation: [],
-        countExceptionProjectData: {},
+        calculation: Array,
+        countExceptionProjectData:Object,
     },
     created() {
         this.getList();
diff --git a/src/views/components/projectOverview.vue b/src/views/components/projectOverview.vue
index 9bac571..0cb5697 100644
--- a/src/views/components/projectOverview.vue
+++ b/src/views/components/projectOverview.vue
@@ -145,8 +145,8 @@
         return {}
     },
     props: {
-        calculation: [],
-        countExceptionProjectData: {},
+        calculation: Array,
+        countExceptionProjectData:Object,
     },
     methods: {
         setTextStyle(text) {
diff --git a/src/views/components/tidingsTable.vue b/src/views/components/tidingsTable.vue
index 358cd14..8d2d659 100644
--- a/src/views/components/tidingsTable.vue
+++ b/src/views/components/tidingsTable.vue
@@ -115,8 +115,8 @@
         }
     },
     props: {
-        calculation: [],
-        countExceptionProjectData: {},
+        calculation: Array,
+        countExceptionProjectData:Object,
     },
     created() {
         this.currentTabId = this.tabs[0].id; // 榛樿閫変腑鐨則ab鐨刬d
diff --git a/src/views/index.vue b/src/views/index.vue
index 82171b7..614cabe 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -1,348 +1,348 @@
 <template>
-    <div class="home">
-        <div class="overview">
-            <div class="overview-top">
-                <div class="title">椤圭洰鎬昏</div>
-                <div class="qurey">
-                    <el-form ref="queryFormRef" :model="queryParams">
-                        <div class="search_from">
-                            <el-form-item label="鏃ユ湡">
-                                <el-date-picker
-                                    style="width: 300px"
-                                    v-model="timeMerge"
-                                    clearable
-                                    end-placeholder="缁撴潫鏃堕棿"
-                                    format="YYYY-MM-DD"
-                                    placeholder="璇烽�夋嫨鏃ユ湡"
-                                    size="default"
-                                    start-placeholder="寮�濮嬫椂闂�"
-                                    type="daterange"
-                                    value-format="YYYY-MM-DD"
-                                    @change="dataPickerChange"
-                                />
-                            </el-form-item>
-                            <el-form-item label="琛屾斂鍖哄垝">
-                                <el-select
-                                    v-model="queryParams.area"
-                                    clearable
-                                    placeholder="璇烽�夋嫨鍖哄垝"
-                                    style="width: 180px"
-                                >
-                                    <el-option
-                                        v-for="item in sys_administrative_divisions"
-                                        :key="item.value"
-                                        :label="item.label"
-                                        :value="item.value"
-                                    />
-                                </el-select>
-                            </el-form-item>
-                            <el-form-item
-                                label="鎶曡祫閲戦"
-                                style="margin-right: 50px"
-                            >
-                                <div class="from_input">
-                                    <el-input
-                                        v-model="queryParams.start"
-                                        clearable
-                                        placeholder="璇疯緭鍏�"
-                                        style="width: 100px"
-                                        type="number"
-                                    />
-                                    鑷�
-                                    <el-input
-                                        v-model="queryParams.end"
-                                        clearable
-                                        placeholder="璇疯緭鍏�"
-                                        style="width: 100px"
-                                        type="number"
-                                    />
-                                </div>
-                            </el-form-item>
-                            <el-form-item style="margin-right: 20px">
-                                <el-button
-                                    icon="Search"
-                                    type="primary"
-                                    @click="handleQuery"
-                                    >鎼滅储</el-button
-                                >
-                                <el-button icon="Refresh" @click="resetQuery"
-                                    >閲嶇疆</el-button
-                                >
-                            </el-form-item>
-                        </div>
-                    </el-form>
+  <div class="home">
+    <div class="overview">
+      <div class="overview-top">
+        <div class="title">椤圭洰鎬昏</div>
+        <div class="qurey">
+          <el-form ref="queryFormRef" :model="queryParams">
+            <div class="search_from">
+              <el-form-item label="鏃ユ湡">
+                <el-date-picker
+                  style="width: 300px"
+                  v-model="timeMerge"
+                  clearable
+                  end-placeholder="缁撴潫鏃堕棿"
+                  format="YYYY-MM-DD"
+                  placeholder="璇烽�夋嫨鏃ユ湡"
+                  size="default"
+                  start-placeholder="寮�濮嬫椂闂�"
+                  type="daterange"
+                  value-format="YYYY-MM-DD"
+                  @change="dataPickerChange"
+                />
+              </el-form-item>
+              <el-form-item label="琛屾斂鍖哄垝">
+                <el-select
+                  v-model="queryParams.area"
+                  clearable
+                  placeholder="璇烽�夋嫨鍖哄垝"
+                  style="width: 180px"
+                >
+                  <el-option
+                    v-for="item in sys_administrative_divisions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鎶曡祫閲戦" style="margin-right: 50px">
+                <div class="from_input">
+                  <el-input
+                    v-model="queryParams.start"
+                    clearable
+                    placeholder="璇疯緭鍏�"
+                    style="width: 100px"
+                    type="number"
+                  />
+                  鑷�
+                  <el-input
+                    v-model="queryParams.end"
+                    clearable
+                    placeholder="璇疯緭鍏�"
+                    style="width: 100px"
+                    type="number"
+                  />
                 </div>
+              </el-form-item>
+              <el-form-item style="margin-right: 20px">
+                <el-button icon="Search" type="primary" @click="handleQuery"
+                  >鎼滅储</el-button
+                >
+                <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+              </el-form-item>
             </div>
-            <!-- 缁熻鎯呭喌 -->
-            <ProjectOverview
-                :calculation="calculation"
-                :countExceptionProjectData="countExceptionProjectData"
-            />
+          </el-form>
         </div>
-        <!-- 浠e姙浜嬮」 -->
-        <div class="flex">
-            <div class="flex_card">
-                <el-card>
-                    <NoticeTable style="height: 360px" />
-                </el-card>
-            </div>
-            <!-- 娑堟伅閫氱煡 -->
-            <div class="flex_card">
-                <el-card>
-                    <TidingsTable style="height: 360px" />
-                </el-card>
-            </div>
-            <!-- 鍦板浘 -->
-        </div>
-        <div class="mt-[10px] min-w-[1600px]">
-            <el-card>
-                <div>
-                    <div class="search-form">
-                        <el-form :model="searchForm" inline>
-                            <el-form-item label=" ">
-                                <el-input
-                                    v-model="searchForm.name"
-                                    clearable
-                                    placeholder="璇疯緭鍏ラ」鐩悕绉版垨椤圭洰浠g爜"
-                                    style="width: 180px"
-                                />
-                            </el-form-item>
-                            <el-form-item style="margin-right: 0px">
-                                <el-button
-                                    icon="Search"
-                                    type="primary"
-                                    @click="searchList"
-                                    >鎼滅储</el-button
-                                >
-                                <el-button icon="Refresh" @click="mapQuery"
-                                    >閲嶇疆</el-button
-                                >
-                            </el-form-item>
-                        </el-form>
-                    </div>
-                    <div class="flex w-full h-[500px] border border-[#DBDEEA]">
-                        <!-- <Map
-                            id="DangerSourceId"
-                            ref="mapRef"
-                            :is-show-control="true"
-                            :list-type="true"
-                            :map-list="tableDatas"
-                            :map-type="true"
-                            class="w-full h-full border-r border-[#DBDEEA]"
-                            @label-click="showDetails"
-                            @mark-click="showDetails"
-                            @current-label-style-change="labelStyleChange"
-                        /> -->
-                    </div>
-                </div>
-            </el-card>
-        </div>
+      </div>
+      <!-- 缁熻鎯呭喌 -->
+      <ProjectOverview
+        :calculation="calculation"
+        :countExceptionProjectData="countExceptionProjectData"
+      />
     </div>
+    <!-- 浠e姙浜嬮」 -->
+    <div class="flex">
+      <div class="flex_card">
+        <el-card>
+          <NoticeTable style="height: 360px" />
+        </el-card>
+      </div>
+      <!-- 娑堟伅閫氱煡 -->
+      <div class="flex_card">
+        <el-card>
+          <TidingsTable style="height: 360px" />
+        </el-card>
+      </div>
+      <!-- 鍦板浘 -->
+    </div>
+    <div class="mt-[10px] min-w-[1600px]">
+      <el-card>
+        <div>
+          <div class="search-form">
+            <el-form :model="searchForm" inline>
+              <el-form-item label=" ">
+                <el-input
+                  v-model="searchForm.name"
+                  clearable
+                  placeholder="璇疯緭鍏ラ」鐩悕绉版垨椤圭洰浠g爜"
+                  style="width: 180px"
+                />
+              </el-form-item>
+              <el-form-item style="margin-right: 0px">
+                <el-button icon="Search" type="primary" @click="searchList"
+                  >鎼滅储</el-button
+                >
+                <el-button icon="Refresh" @click="mapQuery">閲嶇疆</el-button>
+              </el-form-item>
+            </el-form>
+          </div>
+          <div class="flex w-full h-[500px] border border-[#DBDEEA]">
+            <Map
+              id="DangerSourceId"
+              ref="mapRef"
+              :is-show-control="true"
+              :list-type="true"
+              :map-list="tableDatas"
+              :map-type="true"
+              class="w-full h-full border-r border-[#DBDEEA]"
+              @label-click="showDetails"
+              @mark-click="showDetails"
+              @current-label-style-change="labelStyleChange"
+            />
+          </div>
+        </div>
+      </el-card>
+    </div>
+  </div>
 </template>
 
 <script>
-import SvgIcon from '@/components/SvgIcon/index.vue';
-import ProjectOverview from './components/projectOverview.vue';
-import NoticeTable from './components/noticeTable.vue';
-import TidingsTable from './components/tidingsTable.vue';
-// import Map from './components/Map/index.vue';
+import SvgIcon from "@/components/SvgIcon/index.vue";
+import ProjectOverview from "./components/projectOverview.vue";
+import NoticeTable from "./components/noticeTable.vue";
+import TidingsTable from "./components/tidingsTable.vue";
+import Map from "./components/Map/index.vue";
 export default {
-    name: "Index",
-    data() {
-        return {
-            queryParams: {},
-            timeMerge: [],
-            sys_administrative_divisions: [],
-            calculation: [],
-            countExceptionProjectData: {},
-            searchForm: {},
-            tableDatas: []
-        };
+  name: "Index",
+  data() {
+    return {
+      queryParams: {},
+      timeMerge: [],
+      sys_administrative_divisions: [],
+      calculation: [],
+      countExceptionProjectData: {},
+      searchForm: {},
+      tableDatas: [
+        {
+          name: "灏勬椽甯�",
+          value: 105.37281,
+          lat: 30.87145,
+          lon: 105.37281,
+          id: "222222222",
+        },
+        {
+          name: "xxxx",
+          value: 105.22332,
+          lat: 31.52421,
+          lon: 106.22332,
+          id: "11112",
+        },
+      ],
+    };
+  },
+  components: {
+    SvgIcon,
+    ProjectOverview,
+    NoticeTable,
+    TidingsTable,
+    Map,
+  },
+  methods: {
+    dataPickerChange(val) {
+      if (!val) {
+        this.queryParams.startTime = "";
+        this.queryParams.endTime = "";
+        return;
+      }
+
+      this.queryParams.startTime = timeMerge[0];
+      this.queryParams.endTime = timeMerge[1];
     },
-    components: {
-        SvgIcon,
-        ProjectOverview,
-        NoticeTable,
-        TidingsTable
+    handleQuery() {
+      console.log(queryParams);
+      const obj = {
+        startDate: queryParams.startTime,
+        endDate: queryParams.endTime,
+        areaCode: queryParams.area,
+        minInvestment: queryParams.start,
+        maxInvestment: queryParams.end,
+      };
+
+      this.getCalculatioln(obj).then((res) => {
+        const arr = res.data.proPhaseCountVO?.concat(res.data.impTypeCountVO);
+        const newArr = arr.map((item) => ({
+          text: item.text,
+          mun: item.count,
+          statistics: item.type,
+          statisticsMun: item.amount,
+        }));
+
+        // 鍒涘缓涓�涓璞★紝浠ヤ究鏍规嵁 text 灞炴�у揩閫熸煡鎵� newArr 涓殑瀵硅薄
+        const newArrLookup = newArr.reduce((lookup, item) => {
+          lookup[item.text] = item;
+          return lookup;
+        }, {});
+
+        // 鏇存柊 calculation 鏁扮粍锛屼繚鎸佸叾鍘熷椤哄簭
+        calculation.value = calculation.value.map((item) => {
+          const newItem = newArrLookup[item.text];
+          return newItem ? newItem : item; // 濡傛灉 newItem 瀛樺湪锛屽垯杩斿洖 newItem锛屽惁鍒欒繑鍥炲師濮� item
+        });
+      });
+
+      abnormalData(obj);
     },
-    methods: {
 
-        dataPickerChange(val) {
-            if (!val) {
-                this.queryParams.startTime = '';
-                this.queryParams.endTime = '';
-                return;
-            }
+    // 鑾峰彇寮傚父鏁版嵁
+    async abnormalData(obj) {
+      const res = await getAbnormalData(obj);
+      this.countExceptionProjectData = res.data;
+    },
 
-            this.queryParams.startTime = timeMerge[0];
-            this.queryParams.endTime = timeMerge[1];
-        },
-        handleQuery() {
-            console.log(queryParams);
-            const obj = {
-                startDate: queryParams.startTime,
-                endDate: queryParams.endTime,
-                areaCode: queryParams.area,
-                minInvestment: queryParams.start,
-                maxInvestment: queryParams.end
-            };
+    //鍦板浘璇︽儏
+    showDetails(row) {
+      console.log(row);
+    },
 
-            this.getCalculatioln(obj).then((res) => {
-                const arr = res.data.proPhaseCountVO?.concat(res.data.impTypeCountVO);
-                const newArr = arr.map((item) => ({
-                    text: item.text,
-                    mun: item.count,
-                    statistics: item.type,
-                    statisticsMun: item.amount
-                }));
+    labelStyleChange(currentLabel) {
+      if (lastLabel) {
+        lastLabel.setBackgroundColor("#fff");
+        lastLabel.setFontColor("var(--el-color-primary)");
+      }
+      currentLabel.setBackgroundColor("var(--el-color-primary)");
+      currentLabel.setFontColor("#fff");
+      lastLabel = currentLabel;
+    },
+    resetQuery() {
+      this.queryParams = {
+        area: "",
+        start: "",
+        end: "",
+        startTime: "",
+        endTime: "",
+      };
+      this.timeMerge = [];
+      this.handleQuery();
+    },
 
-                // 鍒涘缓涓�涓璞★紝浠ヤ究鏍规嵁 text 灞炴�у揩閫熸煡鎵� newArr 涓殑瀵硅薄
-                const newArrLookup = newArr.reduce((lookup, item) => {
-                    lookup[item.text] = item;
-                    return lookup;
-                }, {});
-
-                // 鏇存柊 calculation 鏁扮粍锛屼繚鎸佸叾鍘熷椤哄簭
-                calculation.value = calculation.value.map((item) => {
-                    const newItem = newArrLookup[item.text];
-                    return newItem ? newItem : item; // 濡傛灉 newItem 瀛樺湪锛屽垯杩斿洖 newItem锛屽惁鍒欒繑鍥炲師濮� item
-                });
-            });
-
-            abnormalData(obj);
-        },
-
-        // 鑾峰彇寮傚父鏁版嵁
-        async abnormalData(obj) {
-            const res = await getAbnormalData(obj);
-            this.countExceptionProjectData = res.data;
-        },
-
-        //鍦板浘璇︽儏
-        showDetails(row) {
-            console.log(row);
-        },
-
-        labelStyleChange(currentLabel) {
-            if (lastLabel) {
-                lastLabel.setBackgroundColor('#fff');
-                lastLabel.setFontColor('var(--el-color-primary)');
-            }
-            currentLabel.setBackgroundColor('var(--el-color-primary)');
-            currentLabel.setFontColor('#fff');
-            lastLabel = currentLabel;
-        },
-        resetQuery() {
-            this.queryParams = {
-                area: '',
-                start: '',
-                end: '',
-                startTime: '',
-                endTime: ''
-            };
-            this.timeMerge = [];
-            this.handleQuery();
-        },
-
-        // 鍦板浘鎼滅储
-        async searchList() {
-            // await search()
-            this.mapRef.moveTo(105.37281, 30.87145);
-        },
-        mapQuery() {
-
-        }
-    }
-}
+    // 鍦板浘鎼滅储
+    async searchList() {
+      // await search()
+      this.mapRef.moveTo(105.37281, 30.87145);
+    },
+    mapQuery() {},
+  },
+};
 </script>
 
 <style scoped lang="scss">
 .home {
-    padding: 10px;
-    background-color: #f3f7fc;
-    min-height: calc(100vh - 85px);
-    overflow-x: auto;
+  padding: 10px;
+  background-color: #f3f7fc;
+  min-height: calc(100vh - 85px);
+  overflow-x: auto;
 
-    .overview {
-        padding: 10px 0 0 10px;
-        height: 280px;
-        min-width: 1600px;
-        background-color: #fff;
-        border-radius: 6px;
+  .overview {
+    padding: 10px 0 0 10px;
+    height: 280px;
+    min-width: 1600px;
+    background-color: #fff;
+    border-radius: 6px;
 
-        .overview-top {
-            display: flex;
-            justify-content: space-between;
+    .overview-top {
+      display: flex;
+      justify-content: space-between;
 
-            .title {
-                font-size: 16px;
-            }
+      .title {
+        font-size: 16px;
+      }
 
-            .qurey {
-                font-size: 12px;
-                font-weight: 100;
-            }
-        }
+      .qurey {
+        font-size: 12px;
+        font-weight: 100;
+      }
     }
+  }
 
-    .search-form {
-        display: flex;
-        justify-content: flex-end;
-    }
+  .search-form {
+    display: flex;
+    justify-content: flex-end;
+  }
 }
 // ::v-deep .el-form-item {
 //     display: inline-block !important;
 //     margin-right: 10px;
 // }
 ::v-deep .el-form-item--medium .el-form-item__content {
-    display: inline-block !important;
+  display: inline-block !important;
 }
 ::v-deep .el-form-item__label {
-    font-size: 12px;
-    font-weight: 400;
+  font-size: 12px;
+  font-weight: 400;
 }
 
 ::v-deep .el-button {
-    font-size: 12px;
+  font-size: 12px;
 }
 
 ::v-deep.el-input__inner {
-    font-size: 12px;
-    height: 32px;
+  font-size: 12px;
+  height: 32px;
 }
 
 ::v-deep.el-range-input {
-    font-size: 12px;
+  font-size: 12px;
 }
 
 ::v-deep.el-select__placeholder {
-    font-size: 12px;
+  font-size: 12px;
 }
-::v-deep input[type='number']::-webkit-inner-spin-button,
-input[type='number']::-webkit-outer-spin-button {
-    -webkit-appearance: none;
-    margin: 0;
+::v-deep input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  -webkit-appearance: none;
+  margin: 0;
 }
-input[type='number'] {
-    -moz-appearance: textfield;
+input[type="number"] {
+  -moz-appearance: textfield;
 }
 .search_from {
-    display: flex;
-    justify-self: justify-end;
-    gap: 10px;
+  display: flex;
+  justify-self: justify-end;
+  gap: 10px;
 }
 .flex {
-    display: flex;
-    gap: 2%;
+  display: flex;
+  gap: 2%;
 }
 .flex_card {
-    width: 49%;
-    margin: 10px 0px;
+  width: 49%;
+  margin: 10px 0px;
 }
 .from_input {
-    display: flex;
-    gap: 10px;
-    font-size: 12px;
+  display: flex;
+  gap: 10px;
+  font-size: 12px;
 }
 </style>
 

--
Gitblit v1.8.0