From f55ea1cfc0b5f60b01552e8b96f95e8a33c45bb8 Mon Sep 17 00:00:00 2001
From: linwe <872216996@qq.com>
Date: Fri, 15 Nov 2024 09:12:53 +0800
Subject: [PATCH] Merge branch 'main' of http://139.196.74.78:10010/r/zhyq/bigScreen

---
 /dev/null                                                 |   86 -------
 src/views/pd/index.vue                                    |   50 +++
 src/pages/layout/components/scomponents/layersControl.vue |   12 
 src/views/pd/components/dynamicPanel.vue                  |  373 +++++++++++++++++++++++++++++++++
 src/pages/first/components/mainMenu.vue                   |    2 
 src/styles/base/dc-base.scss                              |  114 ++++++++++
 vite.config.js                                            |    9 
 src/router/index.js                                       |    2 
 8 files changed, 542 insertions(+), 106 deletions(-)

diff --git a/src/pages/first/components/mainMenu.vue b/src/pages/first/components/mainMenu.vue
index 84cd4f8..b289b1a 100644
--- a/src/pages/first/components/mainMenu.vue
+++ b/src/pages/first/components/mainMenu.vue
@@ -44,7 +44,7 @@
       path: '/layout/first/rt'
     },
     {
-      menuName: '污染物处理',
+      menuName: '突发事件模拟',
       path: '/layout/first/pd'
     },
   ]
diff --git a/src/pages/layout/components/scomponents/layersControl.vue b/src/pages/layout/components/scomponents/layersControl.vue
index c0611fa..92c4fc5 100644
--- a/src/pages/layout/components/scomponents/layersControl.vue
+++ b/src/pages/layout/components/scomponents/layersControl.vue
@@ -2,7 +2,7 @@
  * @Author: shuishen 1109946754@qq.com
  * @Date: 2024-10-31 10:47:29
  * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2024-11-12 18:15:54
+ * @LastEditTime: 2024-11-14 18:32:01
  * @FilePath: \bigScreen\src\pages\layout\components\scomponents\layersControl.vue
  * @Description:
  *
@@ -120,6 +120,7 @@
       size: 1000
     },
     backgroundIcon: VITE_APP_BASE + 'img/mapicon/qy.png',
+    className: 'qyfb-box',
     showPanel: false,
     layerName: 'qyfb'
   },
@@ -230,6 +231,7 @@
       size: 1000
     },
     showParams: 'category',
+    className: 'fxy-box',
     backgroundIcon: VITE_APP_BASE + 'img/mapicon/fxy.png',
     showPanel: false,
     layerName: 'fxy'
@@ -418,7 +420,7 @@
 
               let divIcon = new DC.DivIcon(
                 new DC.Position(i.lng, i.lat, 0),
-                `<div class="public-map-popup">
+                `<div class="public-map-popup ${item.className || ''}">
                     ${iconEl}
                   </div>`
               )
@@ -463,9 +465,9 @@
           addTileLayers[item.layerName] = new DC.VectorLayer(item.layerName)
           window.$viewer.addLayer(addTileLayers[item.layerName])
 
-          function computeCircle(radius) {
+          function computeCircle (radius) {
             var positions = []
-            for (var i = 0; i < 1080; i++) {
+            for (var i = 0; i < 360; i++) {
               var radians = DC.Math.toRadians(i)
               positions.push({
                 x: radius * Math.cos(radians),
@@ -506,7 +508,7 @@
   })
 }
 
-function findObjectById(data, id) {
+function findObjectById (data, id) {
   // 遍历数据数组
   for (let i = 0; i < data.length; i++) {
     const item = data[i]
diff --git a/src/router/index.js b/src/router/index.js
index fb0514f..30329ec 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -85,7 +85,7 @@
           {
             path: 'pd',
             meta: {
-              title: '污染物处理'
+              title: '突发事件模拟'
             },
             component: () => import('@/views/pd/index.vue')
           },
diff --git a/src/styles/base/dc-base.scss b/src/styles/base/dc-base.scss
index 902ad74..9b0e8e2 100644
--- a/src/styles/base/dc-base.scss
+++ b/src/styles/base/dc-base.scss
@@ -66,12 +66,122 @@
     box-shadow: 0px 0px 10px rgb(255, 179, 0, 1);
 
     img {
-      width: 24px;
-      height: 24px;
+      width: 20px;
+      height: 20px;
     }
   }
 }
 
+.fxy-box {
+  &::after {
+    background: linear-gradient(to bottom, rgba(255, 0, 0, 0.8), rgba(255, 0, 0, 0.2));
+  }
+
+  .map-name {
+    color: #ff3b3b;
+  }
+
+  .map-icon {
+    background: radial-gradient(circle at center, rgba(255, 255, 255, 0.3) 20%, rgba(255, 0, 0, 0.9) 100%);
+    box-shadow: 0px 0px 10px rgb(255, 0, 0);
+  }
+}
+
+.qyfb-box {
+  &::after {
+    background: linear-gradient(to bottom, rgba(0, 136, 255, 0.8), rgba(0, 136, 255, 0.2));
+  }
+
+  .map-name {
+    color: rgb(66, 165, 252);
+  }
+
+  .map-icon {
+    background: radial-gradient(circle at center, rgba(255, 255, 255, 0.3) 20%, rgba(0, 136, 255, 0.9) 100%);
+    box-shadow: 0px 0px 10px rgba(0, 136, 255, 1);
+  }
+}
+
+@keyframes pulse-glow {
+  0% {
+    box-shadow: 0 0 4px red, inset 0 0 4px red;
+  }
+
+  50% {
+    box-shadow: 0 0 8px red, inset 0 0 8px red;
+  }
+
+  100% {
+    box-shadow: 0 0 4px red, inset 0 0 4px red;
+  }
+}
+
+.dynamic-map-popup {
+  position: absolute;
+  right: 100%;
+  bottom: 0;
+  width: 320px;
+  color: #fff;
+  background: rgba(255, 0, 0, 0.2);
+  font-weight: bold;
+  font-style: italic;
+
+  &::after {
+    content: '';
+    position: absolute;
+    top: -0.8px;
+    /* 调整以匹配所需的发光区域 */
+    left: 0px;
+    /* 同上 */
+    right: 0px;
+    bottom: calc(100% - 0.8px);
+    background: white;
+    box-shadow: 0 0 8px red, inset 0 0 8px red;
+    animation: pulse-glow 3s infinite;
+  }
+
+  &::before {
+    content: '';
+    position: absolute;
+    top: calc(100% - 0.8px);
+    /* 调整以匹配所需的发光区域 */
+    left: 0px;
+    /* 同上 */
+    right: 0px;
+    bottom: -0.8px;
+    background: white;
+    box-shadow: 0 0 8px red, inset 0 0 8px red;
+    animation: pulse-glow 3s infinite;
+  }
+
+  .title {
+    position: relative;
+    height: 30px;
+    line-height: 30px;
+    font-size: 18px;
+
+
+    &::before {
+      content: '';
+      position: absolute;
+      top: calc(100% - 0.8px);
+      /* 调整以匹配所需的发光区域 */
+      left: 0px;
+      /* 同上 */
+      right: 40%;
+      bottom: -0.8px;
+      background: white;
+      box-shadow: 0 0 8px red, inset 0 0 8px red;
+      animation: pulse-glow 3s infinite;
+    }
+  }
+
+  .content {
+    text-indent: 2em;
+    line-height: 28px;
+  }
+}
+
 .widget.location-bar {
   position: absolute;
   left: 620px !important;
diff --git a/src/views/pd/components/box/dataContent.vue b/src/views/pd/components/box/dataContent.vue
deleted file mode 100644
index 1dfeb7c..0000000
--- a/src/views/pd/components/box/dataContent.vue
+++ /dev/null
@@ -1,158 +0,0 @@
-<!--
- * @Author: shuishen 1109946754@qq.com
- * @Date: 2023-03-13 14:54:26
- * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2023-03-13 15:00:55
- * @FilePath: \forest-fire\src\views\statistics\components\box\dataContent.vue
- * @Description: 
- * 
- * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
--->
-<script setup>
-import publicContent from "./publicContent.vue";
-import { getList } from "@/api/rescueTeam/rescueTeam";
-import { reactive } from "vue";
-
-const loading = ref(false);
-
-const tableData = ref([]);
-const pages = {
-  page: 1,
-  pageSize: 13,
-  total: 0,
-};
-
-onMounted(() => {
-  getLists();
-});
-// 表格样式
-const tableCellStyle = ({ row, column }) => {
-  return { background: "#152851", color: "#fff" };
-};
-// 表格表头样式
-const headerCellStyle = ({ }) => {
-  return {
-    background: "#152851",
-    color: "#fff",
-  };
-};
-// 搜索条件
-const formInline = reactive({
-  perInCha: "",
-  type: ''
-});
-
-// 提交查询
-const onSubmit = () => {
-  pages.page = 1
-  pages.pageSize = 13
-  pages.total = 0
-  console.log("submit!");
-  getLists(formInline);
-};
-
-// 分页树改变
-const handleSizeChange = (val) => {
-  pages.pageSize = val;
-  getLists(formInline);
-}
-// 分页改变
-const handleCurrentChange = (val) => {
-  pages.page = val;
-  getLists(formInline);
-}
-// 重置条件
-const clearBtn = () => {
-  formInline.perInCha = ''
-  formInline.type = ''
-  pages.page = 1
-  pages.pageSize = 13
-  pages.total = 0
-  getLists(formInline);
-}
-
-// 查询分页数据
-function getLists(param = {}) {
-  param.current = pages.page;
-  param.size = pages.pageSize;
-  loading.value = true;
-  getList(param)
-    .then((res) => {
-      const data = res.data.data;
-      data.records.forEach((element) => {
-        if (element.type == 1) {
-          element.ownership = "园区";
-        } else {
-          element.ownership = "企业";
-        }
-      });
-      tableData.value = data.records;
-      pages.total = data.total;
-      loading.value = false;
-    })
-    .catch((err) => {
-      loading.value = false;
-      console.log(err);
-    });
-}
-</script>
-
-<template>
-  <public-content>
-    <template #content>
-      <div>
-        <el-form :inline="true" :model="formInline" class="demo-form-inline">
-          <el-form-item label="姓名">
-            <el-input v-model="formInline.perInCha" placeholder="请输入姓名" clearable style="width: 120px" />
-          </el-form-item>
-          <el-form-item label="归属">
-            <el-select v-model="formInline.type" placeholder="请选择" clearable style="width: 120px">
-              <el-option label="园区" value="1" />
-              <el-option label="企业" value="2" />
-            </el-select>
-          </el-form-item>
-          <el-form-item>
-            <el-button type="primary" @click="onSubmit">查询</el-button>
-            <el-button type="" @click="clearBtn">重置</el-button>
-          </el-form-item>
-        </el-form>
-        <el-table :data="tableData" style="width: 100%" :header-cell-style="headerCellStyle" :cell-style="tableCellStyle"
-          v-loading="loading">
-          <el-table-column fixed prop="perInCha" label="责任人姓名" />
-          <el-table-column prop="perInChaPho" label="联系电话" />
-          <!-- <el-table-column prop="firmName" label="单位名称" /> -->
-          <el-table-column prop="ownership" label="归属" width="100" />
-        </el-table>
-        <div class="el-page">
-          <el-pagination background layout="prev, pager, next" :page-size="pages.pageSize" :total="pages.total"
-            @size-change="handleSizeChange" @current-change="handleCurrentChange" />
-        </div>
-      </div>
-    </template>
-  </public-content>
-</template>
-
-<style lang="scss" scoped>
-::v-deep .el-table__body-wrapper {
-  background-color: #152851;
-}
-
-.el-form-item__label {
-  color: #fff !important;
-}
-
-/* 当表格没有数据时,修改表格的背景颜色 */
-.el-table--empty .el-table__body {
-  background-color: rgba(135, 158, 199, 0.3) !important;
-  /* 你想要的背景颜色 */
-}
-
-.el-page {
-  margin-top: 10px;
-  width: 100%;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  // margin-bottom:10px;
-}
-</style>
diff --git a/src/views/pd/components/box/fireContent.vue b/src/views/pd/components/box/fireContent.vue
deleted file mode 100644
index 7152a88..0000000
--- a/src/views/pd/components/box/fireContent.vue
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- * @Author: shuishen 1109946754@qq.com
- * @Date: 2023-03-13 14:54:26
- * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2023-03-13 15:00:55
- * @FilePath: \forest-fire\src\views\statistics\components\box\dataContent.vue
- * @Description: 
- * 
- * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
--->
-<script setup>
-import publicContent from './publicContent.vue'
-</script>
-
-<template>
-    <public-content>
-        <template #content>
-            <div>
-
-            </div>
-        </template>
-    </public-content>
-</template>
-
-<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/src/views/pd/components/box/fireSource.vue b/src/views/pd/components/box/fireSource.vue
deleted file mode 100644
index 7152a88..0000000
--- a/src/views/pd/components/box/fireSource.vue
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- * @Author: shuishen 1109946754@qq.com
- * @Date: 2023-03-13 14:54:26
- * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2023-03-13 15:00:55
- * @FilePath: \forest-fire\src\views\statistics\components\box\dataContent.vue
- * @Description: 
- * 
- * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
--->
-<script setup>
-import publicContent from './publicContent.vue'
-</script>
-
-<template>
-    <public-content>
-        <template #content>
-            <div>
-
-            </div>
-        </template>
-    </public-content>
-</template>
-
-<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/src/views/pd/components/box/fireTrend.vue b/src/views/pd/components/box/fireTrend.vue
deleted file mode 100644
index 7152a88..0000000
--- a/src/views/pd/components/box/fireTrend.vue
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- * @Author: shuishen 1109946754@qq.com
- * @Date: 2023-03-13 14:54:26
- * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2023-03-13 15:00:55
- * @FilePath: \forest-fire\src\views\statistics\components\box\dataContent.vue
- * @Description: 
- * 
- * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
--->
-<script setup>
-import publicContent from './publicContent.vue'
-</script>
-
-<template>
-    <public-content>
-        <template #content>
-            <div>
-
-            </div>
-        </template>
-    </public-content>
-</template>
-
-<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/src/views/pd/components/box/occurStatistics.vue b/src/views/pd/components/box/occurStatistics.vue
deleted file mode 100644
index 7152a88..0000000
--- a/src/views/pd/components/box/occurStatistics.vue
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- * @Author: shuishen 1109946754@qq.com
- * @Date: 2023-03-13 14:54:26
- * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2023-03-13 15:00:55
- * @FilePath: \forest-fire\src\views\statistics\components\box\dataContent.vue
- * @Description: 
- * 
- * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
--->
-<script setup>
-import publicContent from './publicContent.vue'
-</script>
-
-<template>
-    <public-content>
-        <template #content>
-            <div>
-
-            </div>
-        </template>
-    </public-content>
-</template>
-
-<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/src/views/pd/components/box/publicContent.vue b/src/views/pd/components/box/publicContent.vue
deleted file mode 100644
index 2ff1476..0000000
--- a/src/views/pd/components/box/publicContent.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
- * @Author: shuishen 1109946754@qq.com
- * @Date: 2023-03-13 14:54:26
- * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2024-10-25 18:33:46
- * @FilePath: \bigScreen\src\views\statistics\components\box\publicContent.vue
- * @Description: 
- * 
- * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
--->
-<script setup>
-
-</script>
-
-<template>
-  <div class="content">
-    <slot name="content"></slot>
-  </div>
-</template>
-
-<style lang="scss" scoped>
-.content {
-  padding: 20px 0;
-  height: calc(100% - 32px);
-}
-</style>
\ No newline at end of file
diff --git a/src/views/pd/components/box/unitContent.vue b/src/views/pd/components/box/unitContent.vue
deleted file mode 100644
index 7152a88..0000000
--- a/src/views/pd/components/box/unitContent.vue
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- * @Author: shuishen 1109946754@qq.com
- * @Date: 2023-03-13 14:54:26
- * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2023-03-13 15:00:55
- * @FilePath: \forest-fire\src\views\statistics\components\box\dataContent.vue
- * @Description: 
- * 
- * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
--->
-<script setup>
-import publicContent from './publicContent.vue'
-</script>
-
-<template>
-    <public-content>
-        <template #content>
-            <div>
-
-            </div>
-        </template>
-    </public-content>
-</template>
-
-<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/src/views/pd/components/dynamicPanel.vue b/src/views/pd/components/dynamicPanel.vue
new file mode 100644
index 0000000..9e13f8f
--- /dev/null
+++ b/src/views/pd/components/dynamicPanel.vue
@@ -0,0 +1,373 @@
+<!--
+ * @Author: shuishen 1109946754@qq.com
+ * @Date: 2024-11-09 15:41:35
+ * @LastEditors: shuishen 1109946754@qq.com
+ * @LastEditTime: 2024-11-14 16:58:49
+ * @FilePath: \bigScreen\src\views\pd\components\dynamicPanel.vue
+ * @Description: 
+ * 
+ * Copyright (c) 2024 by shuishen, All Rights Reserved. 
+-->
+<script setup>
+const emit = defineEmits(['closePanel'])
+import { onUnmounted } from 'vue'
+
+const panelData = reactive({
+  data: [
+    {
+      key: 1,
+      title: '典型案例1',
+      content: '南片区松节油储罐区泄漏事故: 南片区某企业松节油储罐泄漏,如不采取措施,将造成污染事故,影响到赣江下游水质。',
+      specificPollutantPosition: {
+        lng: 115.10038440,
+        lat: 27.27207956
+      },
+      specificPollutant: '松节油,无色至淡黄色油状液体,具有松香气味。 熔点:/ 沸点:154~170℃相对密度(水=1):0.85~0.87 饱和蒸气压(kPa):2.67(51.4℃)溶解性:不溶于水,溶于乙醇、氯仿、醚等多数有机溶剂。',
+
+      transitPointPosition: {
+        lng: 115.10595711,
+        lat: 27.26963563
+      },
+
+      wastewaterTreatmentPosition: {
+        lng: 115.10815397,
+        lat: 27.27212251
+      },
+      wastewaterTreatment: '事故应急结束后,应急指挥部组织专家评估组指导企业对受污染的废水进入废水处理中站进行处理,对公共应急池的事故废水进行水质监测,分析水质达标情况,并研判处理处置方式,在确保安全的情况下转转输至绿源污水处理厂处理。'
+    },
+    {
+      key: 2,
+      title: '典型案例2',
+      content: '北片区碱类腐蚀性物质泄漏事故: 北片区某企业(位于吉兴路以北)在生产过程中操作失误,大量含碱废水泄漏,如不采取措施,将造成污染事故,影响到赣江下游水质。',
+      specificPollutantPosition: {
+        lng: 115.10038440,
+        lat: 27.27207956
+      },
+      specificPollutant: '液碱,无色透明液体。是重要的化工基础原料,用途极广。化学工业用于制造甲酸、草酸、硼砂、苯酚、氰化钠及肥皂、合成脂肪酸、合成洗涤剂等,呈碱性。',
+
+      transitPointPosition: {
+        lng: 115.10595711,
+        lat: 27.26963563
+      },
+
+      wastewaterTreatmentPosition: {
+        lng: 115.10815397,
+        lat: 27.27212251
+      },
+      wastewaterTreatment: '将拦截废水从应急池中通过北区污水提升泵站转移至绿源污水处理厂进行处置,同时在排口下游展开应急监测,确保废水没有进入周边水系。'
+    },
+    {
+      key: 3,
+      title: '典型案例3',
+      content: '危险化学品运输事故: 化工集中区北区(吉兴路以南)某企业的危化品运输车辆金工大道危化品运专用运输道上发生侧翻,大量盐酸流至路面,如不采取措施,将造成污染事故,影响到赣江下游水质。',
+      specificPollutantPosition: {
+        lng: 115.10038440,
+        lat: 27.27207956
+      },
+      specificPollutant: '盐酸是无色液体(工业用盐酸会因有杂质三价铁盐而略显黄色),为氯化氢的水溶液,具有刺激性气味。',
+
+      transitPointPosition: {
+        lng: 115.10595711,
+        lat: 27.26963563
+      },
+
+      wastewaterTreatmentPosition: {
+        lng: 115.10815397,
+        lat: 27.27212251
+      },
+      wastewaterTreatment: '对转输至企业应急空间的事故废水进行水质监测,分析水质达标情况,并研判处理处置方式,在确保安全的情况下加药处理或者排入企业废水处理站处理'
+    },
+  ]
+})
+let timeO = null
+let timeT = null
+const dynamicVectorLayer = new DC.VectorLayer('dynamicVectorLayer').addTo(window.$viewer)
+const dynamicHtmlLayer = new DC.HtmlLayer('dynamicHtmlLayer').addTo(window.$viewer)
+
+const schemeStart = (item) => {
+  emit('closePanel')
+  clearAll()
+
+  let center = DC.Position.fromObject(item.specificPollutantPosition)
+  let circle = new DC.Circle(center, 20)
+  circle.setStyle({
+    material: new DC.CircleDiffuseMaterialProperty({
+      color: DC.Color.RED.withAlpha(0.2),
+      speed: 2.0
+    })
+  })
+  dynamicVectorLayer.addOverlay(circle)
+
+
+
+  window.$viewer.flyToPosition(new DC.Position(item.specificPollutantPosition.lng, item.specificPollutantPosition.lat, 400, 0, -90, 0), () => { }, 3)
+
+  let divIcon = new DC.DivIcon(
+    new DC.Position(item.specificPollutantPosition.lng, item.specificPollutantPosition.lat, 0),
+    `<div class="dynamic-map-popup">
+          <div class="title">特征污染物</div>
+          <div class="content">
+            ${item.specificPollutant}
+          </div>
+      </div>`
+  )
+  dynamicHtmlLayer.addOverlay(divIcon)
+
+  timeO = setTimeout(() => {
+    window.$viewer.flyToPosition(new DC.Position(item.transitPointPosition.lng, item.transitPointPosition.lat, 400, 0, -90, 0), () => {
+
+      let centerT = DC.Position.fromObject(item.transitPointPosition)
+      let circleT = new DC.Circle(centerT, 20)
+      circleT.setStyle({
+        material: new DC.CircleWaveMaterialProperty({
+          color: DC.Color.fromRandom(),
+          speed: 20,
+          count: 5,
+          gradient: 0.5
+        })
+      })
+      dynamicVectorLayer.addOverlay(circleT)
+
+    }, 3)
+  }, 5000)
+
+  timeT = setTimeout(() => {
+    window.$viewer.flyToPosition(new DC.Position(item.wastewaterTreatmentPosition.lng, item.wastewaterTreatmentPosition.lat, 400, 0, -90, 0), () => {
+      let centerThree = DC.Position.fromObject(item.wastewaterTreatmentPosition)
+      let circleThree = new DC.Circle(centerThree, 30)
+      circleThree.setStyle({
+        classificationType: 0,
+        material: new DC.CircleSpiralMaterialProperty({
+          color: DC.Color.BLUE.withAlpha(0.2),
+          speed: 8.0
+        })
+      })
+      dynamicVectorLayer.addOverlay(circleThree)
+
+      let divIconT = new DC.DivIcon(
+        new DC.Position(item.wastewaterTreatmentPosition.lng, item.wastewaterTreatmentPosition.lat, 0),
+        `<div class="dynamic-map-popup">
+              <div class="title">绿源进水口</div>
+              <div class="content">
+                ${item.wastewaterTreatment}
+              </div>
+          </div>`
+      )
+      dynamicHtmlLayer.addOverlay(divIconT)
+    }, 3)
+  }, 10000)
+}
+
+const clearAll = () => {
+  clearTimeout(timeO)
+  clearTimeout(timeT)
+  dynamicVectorLayer.clear()
+  dynamicHtmlLayer.clear()
+}
+
+onUnmounted(() => {
+  clearAll()
+
+  window.$viewer.removeLayer(dynamicVectorLayer)
+  window.$viewer.removeLayer(dynamicHtmlLayer)
+})
+</script>
+
+<template>
+  <div class="panel-container no-select">
+    <el-carousel :autoplay="false" :interval="4000" type="card" height="360px">
+      <el-carousel-item v-for="item, index in panelData.data" :key="index">
+        <template #>
+          <div class="content-box flex f-d-c">
+            <div class="title">
+              {{ item.title }}
+            </div>
+            <div class="content h0 flex-1">
+              <div class="bg-box">
+
+              </div>
+
+              <div class="describe-box">
+                {{ item.content }}
+              </div>
+            </div>
+
+            <div class="footer-btn">
+              <div class="start-btn" @click="schemeStart(item)">
+                开始模拟
+              </div>
+            </div>
+          </div>
+        </template>
+      </el-carousel-item>
+    </el-carousel>
+  </div>
+</template>
+
+<style scoped lang="scss">
+.panel-container {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  margin: auto;
+  width: 960px;
+  height: 440px;
+  pointer-events: all;
+
+  ::v-deep(.el-carousel) {
+    .el-carousel__item {
+      background: #2E4274;
+
+      .content-box {
+        padding: 10px 0;
+        width: 100%;
+        height: 100%;
+        color: #fff;
+
+        .title {
+          padding-left: 40px;
+          height: 80px;
+          line-height: 80px;
+          font-size: 44px;
+          font-weight: bold;
+          font-style: initial;
+          background: #3a7bd5;
+          /* fallback for old browsers */
+          background: -webkit-linear-gradient(to right, #3a7bd5, rgba(255, 255, 255, 0.1));
+          /* Chrome 10-25, Safari 5.1-6 */
+          background: linear-gradient(to right, #3a7bd5, rgba(255, 255, 255, 0.1));
+          /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
+        }
+
+        .content {
+          margin-top: 20px;
+          padding: 0 20px;
+
+          .describe-box {
+            line-height: 36px;
+          }
+        }
+
+        .footer-btn {
+          margin-bottom: 40px;
+          height: 40px;
+          line-height: 40px;
+          text-align: center;
+        }
+      }
+    }
+  }
+}
+
+.no-select {
+  user-select: none;
+  /* Standard syntax */
+  -webkit-user-select: none;
+  /* Safari/Chrome */
+  -moz-user-select: none;
+  /* Firefox */
+  -ms-user-select: none;
+  /* Internet Explorer/Edge */
+}
+
+.start-btn,
+.start-btn:focus,
+.start-btn:hover {
+  display: inline-block;
+  position: relative;
+  min-width: 96px;
+  border: none;
+  border-radius: 8px;
+  background: #491cc5;
+  /* fallback for old browsers */
+  background: -webkit-linear-gradient(to bottom, #491cc5, #5f80f5);
+  /* Chrome 10-25, Safari 5.1-6 */
+  background: linear-gradient(to bottom, #491cc5, #5f80f5);
+  /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
+
+  color: #fff;
+  font-size: 1rem;
+  font-weight: bold;
+  text-align: center;
+  text-decoration: none;
+  text-transform: uppercase;
+  box-shadow: 0 0 10px rgba(255, 255, 255, 0.5);
+  transition: transform ease-in 0.1s, box-shadow ease-in 0.25s;
+  transform: skewX(8deg);
+}
+
+.start-btn:before,
+.start-btn:after {
+  content: "";
+  display: block;
+  position: absolute;
+  width: 140%;
+  height: 100%;
+  left: -20%;
+  z-index: -1000;
+  transition: all ease-in-out 0.5s;
+  background-repeat: no-repeat;
+}
+
+.start-btn:before {
+  display: none;
+  top: -75%;
+  background-image: radial-gradient(circle, #3E56B2 20%, transparent 20%), radial-gradient(circle, transparent 20%, #3E56B2 20%, transparent 30%), radial-gradient(circle, #3E56B2 20%, transparent 20%), radial-gradient(circle, #3E56B2 20%, transparent 20%), radial-gradient(circle, transparent 10%, #3E56B2 15%, transparent 20%), radial-gradient(circle, #3E56B2 20%, transparent 20%), radial-gradient(circle, #3E56B2 20%, transparent 20%), radial-gradient(circle, #3E56B2 20%, transparent 20%), radial-gradient(circle, #3E56B2 20%, transparent 20%);
+  background-size: 10% 10%, 20% 20%, 15% 15%, 20% 20%, 18% 18%, 10% 10%, 15% 15%, 10% 10%, 18% 18%;
+}
+
+.start-btn:after {
+  display: none;
+  bottom: -75%;
+  background-image: radial-gradient(circle, #3E56B2 20%, transparent 20%), radial-gradient(circle, #3E56B2 20%, transparent 20%), radial-gradient(circle, transparent 10%, #3E56B2 15%, transparent 20%), radial-gradient(circle, #3E56B2 20%, transparent 20%), radial-gradient(circle, #3E56B2 20%, transparent 20%), radial-gradient(circle, #3E56B2 20%, transparent 20%), radial-gradient(circle, #3E56B2 20%, transparent 20%);
+  background-size: 15% 15%, 20% 20%, 18% 18%, 20% 20%, 15% 15%, 10% 10%, 20% 20%;
+}
+
+.start-btn:active {
+  transform: scale(0.9);
+  background-color: #5e7ae9;
+  box-shadow: 0 2px 25px rgba(94, 122, 233, .2);
+}
+
+.start-btn:active:before {
+  display: block;
+  animation: anim-top ease-in-out 0.75s forwards;
+}
+
+.start-btn:active:after {
+  display: block;
+  animation: anim-bottom ease-in-out 0.75s forwards;
+}
+
+@keyframes anim-top {
+  0% {
+    background-position: 5% 90%, 10% 90%, 10% 90%, 15% 90%, 25% 90%, 25% 90%, 40% 90%, 55% 90%, 70% 90%;
+  }
+
+  50% {
+    background-position: 0% 80%, 0% 20%, 10% 40%, 20% 0%, 30% 30%, 22% 50%, 50% 50%, 65% 20%, 90% 30%;
+  }
+
+  100% {
+    background-position: 0% 70%, 0% 10%, 10% 30%, 20% -10%, 30% 20%, 22% 40%, 50% 40%, 65% 10%, 90% 20%;
+    background-size: 0% 0%, 0% 0%, 0% 0%, 0% 0%, 0% 0%, 0% 0%;
+  }
+}
+
+@keyframes anim-bottom {
+  0% {
+    background-position: 10% -10%, 30% 10%, 55% -10%, 70% -10%, 85% -10%, 70% -10%, 70% 0%;
+  }
+
+  50% {
+    background-position: 0% 80%, 20% 80%, 45% 60%, 60% 100%, 75% 70%, 95% 60%, 105% 0%;
+  }
+
+  100% {
+    background-position: 0% 90%, 20% 90%, 45% 70%, 60% 110%, 75% 80%, 95% 70%, 110% 10%;
+    background-size: 0% 0%, 0% 0%, 0% 0%, 0% 0%, 0% 0%, 0% 0%;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/views/pd/components/leftContainer.vue b/src/views/pd/components/leftContainer.vue
deleted file mode 100644
index a679a60..0000000
--- a/src/views/pd/components/leftContainer.vue
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
- * @Author: shuishen 1109946754@qq.com
- * @Date: 2023-03-10 15:27:59
- * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2024-11-08 11:39:11
- * @FilePath: \bigScreen\src\views\rt\components\leftContainer.vue
- * @Description: 
- * 
- * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
--->
-<script setup>
-import dataContent from './box/dataContent.vue'
-import unitContent from './box/unitContent.vue'
-import fireContent from './box/fireContent.vue'
-</script>
-
-<template>
-  <div class="left-container">
-    <div class="data box">
-      <data-content></data-content>
-    </div>
-
-    <!-- <div class="unit box">
-      <title-box>
-        <template #titleName>
-          入住单位统计
-        </template>
-</title-box>
-<unit-content></unit-content>
-</div>
-
-<div class="fire box">
-  <title-box>
-    <template #titleName>
-          实时火警事件
-        </template>
-  </title-box>
-  <fire-content></fire-content>
-</div> -->
-  </div>
-</template>
-
-<style lang="scss" scoped>
-.left-container {
-  width: 100%;
-}
-</style>
\ No newline at end of file
diff --git a/src/views/pd/components/rightContainer.vue b/src/views/pd/components/rightContainer.vue
deleted file mode 100644
index 67eb54e..0000000
--- a/src/views/pd/components/rightContainer.vue
+++ /dev/null
@@ -1,86 +0,0 @@
-<!--
- * @Author: shuishen 1109946754@qq.com
- * @Date: 2023-03-10 15:27:59
- * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2024-10-26 14:49:05
- * @FilePath: \bigScreen\src\views\survey\components\rightContainer.vue
- * @Description: 
- * 
- * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
--->
-<script setup>
-import fireSource from './box/fireSource.vue'
-import fireTrend from './box/fireTrend.vue'
-import occurStatistics from './box/occurStatistics.vue'
-import publicContent from './box/publicContent.vue'
-</script>
-
-<template>
-  <div class="right-container">
-    <div class="fire-source box">
-      <title-box>
-        <template #titleName>
-          火警事件来源
-        </template>
-      </title-box>
-      <fire-source></fire-source>
-    </div>
-
-    <div class="occur-statistics box">
-      <title-box>
-        <template #titleName>
-          易发区统计
-        </template>
-      </title-box>
-      <fire-trend></fire-trend>
-    </div>
-
-    <div class="fire-trend box">
-      <title-box>
-        <template #titleName>
-          火警上报趋势
-        </template>
-      </title-box>
-      <occur-statistics></occur-statistics>
-    </div>
-  </div>
-</template>
-
-<style lang="scss" scoped>
-.right-container {
-  display: flex;
-  flex-direction: column;
-  padding: 20px;
-  position: absolute;
-  top: 0;
-  right: 0;
-  width: 440px;
-  height: 100%;
-  pointer-events: auto;
-
-  .box {
-    margin-top: 20px;
-
-    .header {
-      height: 32px;
-      background: url(/img/bg/sub-title.png) no-repeat;
-    }
-  }
-
-  .fire-source {
-    flex: 3;
-  }
-
-  .occur-statistics {
-    flex: 3;
-  }
-
-  .fire-trend {
-    flex: 4;
-  }
-
-  .box:first-child {
-    margin-top: 0;
-  }
-}
-</style>
\ No newline at end of file
diff --git a/src/views/pd/index.vue b/src/views/pd/index.vue
index 039387e..efc3edd 100644
--- a/src/views/pd/index.vue
+++ b/src/views/pd/index.vue
@@ -2,29 +2,59 @@
  * @Author: shuishen 1109946754@qq.com
  * @Date: 2023-03-10 15:27:59
  * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2023-03-13 16:02:07
- * @FilePath: \forest-fire\src\views\statistics\index.vue
+ * @LastEditTime: 2024-11-12 20:02:05
+ * @FilePath: \bigScreen\src\views\pd\index.vue
  * @Description: 综合设计
  * 
  * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
 -->
 <script setup>
-import leftContainer from './components/leftContainer.vue'
-import rightContainer from './components/rightContainer.vue'
+import dynamicPanel from './components/dynamicPanel.vue'
+import { CaretLeft, CaretRight } from '@element-plus/icons-vue'
+
+const showPanel = ref(true)
+
+const showPanelChange = () => {
+  showPanel.value = !showPanel.value
+}
 </script>
 
 <template>
-    <div class="container page-container">
-        <left-container></left-container>
-
-        <!-- <right-container></right-container> -->
+  <div class="container page-container">
+    <div class="telescopic-panel" @click="showPanelChange">
+      <el-icon v-show="showPanel">
+        <CaretLeft />
+      </el-icon>
+      <el-icon v-show="!showPanel">
+        <CaretRight />
+      </el-icon>
     </div>
+
+    <dynamic-panel v-show="showPanel" @closePanel="showPanelChange"></dynamic-panel>
+  </div>
 </template>
 
 <style lang="scss" scoped>
 .container {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+
+  .telescopic-panel {
+    display: flex;
+    align-items: center;
+    justify-content: center;
     position: absolute;
-    width: 100%;
-    height: 100%;
+    top: 50%;
+    left: 0;
+    width: 20px;
+    height: 60px;
+    border-radius: 0 6px 6px 0;
+    box-shadow: inset 0 0 40px #409eff;
+    pointer-events: all;
+    color: #fff;
+    transform: translate(0, -50%);
+    cursor: pointer;
+  }
 }
 </style>
\ No newline at end of file
diff --git a/vite.config.js b/vite.config.js
index 774b4b6..ee27ecf 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -2,7 +2,7 @@
  * @Author: shuishen 1109946754@qq.com
  * @Date: 2024-10-25 10:56:27
  * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2024-11-12 14:02:19
+ * @LastEditTime: 2024-11-13 19:15:01
  * @FilePath: \bigScreen\vite.config.js
  * @Description: 
  * 
@@ -85,6 +85,13 @@
       //   overlay:false
       // },
       proxy: {
+        '/zhyq3Dtile': {
+          // target: 'http://localhost',
+          target: 'https://wrj.shuixiongit.com/zhyq3Dtile',
+          changeOrigin: true,
+          rewrite: path => path.replace(/^\/zhyq3Dtile/, ''),
+        },
+
         '/panorama': {
           // target: 'http://localhost',
           target: 'http://vr.jxpskj.com:180',

--
Gitblit v1.9.3