From 50ee7232f3c98fe24a1f2e31dba9508cfec14887 Mon Sep 17 00:00:00 2001
From: gjj <Ganjj@probim.com.cn>
Date: Fri, 21 Feb 2025 17:35:39 +0800
Subject: [PATCH] 模型预览

---
 src/components/V2Echarts.vue |  176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 176 insertions(+), 0 deletions(-)

diff --git a/src/components/V2Echarts.vue b/src/components/V2Echarts.vue
new file mode 100644
index 0000000..037b6e5
--- /dev/null
+++ b/src/components/V2Echarts.vue
@@ -0,0 +1,176 @@
+<template>
+  <div
+    :id="idName"
+    :style="`margin-top:${top}px`"
+    class="echarts w-full h-full"
+  >
+  </div>
+</template>
+
+<script>
+import * as echarts from 'echarts'
+export default {
+  name: 'V2Echarts',
+  props: {
+    options: {
+      type: Object,
+      default: () => {},
+      require: true
+    },
+    // 传入id名称
+    idName: {
+      type: String,
+      default: () => {
+        return ''
+      },
+      require: true
+    },
+    width: {
+      type: String,
+      default: () => {
+        return '410'
+      }
+    },
+    height: {
+      type: String,
+      default: () => {
+        return '290'
+      }
+    },
+    top: {
+      type: String,
+      default: () => {
+        return '0'
+      }
+    }
+  },
+  data () {
+    return {
+      myChart: null,
+      resizeObserver: null,
+    }
+  },
+
+  watch: {
+    options: {
+      handler (newVal) {
+        this.setChartEvents(newVal)
+      },
+      deep: true,
+      immediate: true
+    }
+  },
+  created() {
+    this.$nextTick(this.initTheChart)
+  },
+  methods: {
+    // 初始化图表
+    initTheChart() {
+      this.myChart = echarts.init(document.getElementById(this.idName))
+      this.myChart.setOption(this.options, true)
+      
+      // 鼠标移入图表时,不为第一条时就取消第一条的高亮效果
+      this.myChart.on('mouseover', v => {
+        if (v.dataIndex !== 0) {
+          this.myChart.dispatchAction({
+            type: 'downplay',
+            seriesIndex: 0,
+            dataIndex: 0
+          })
+        }
+        if (this.idName === 'jinzhanqushi' || this.idName === 'dailogjinzhanqushi') {
+          this.myChart.setOption({
+            tooltip: {
+              // 鼠标在折线上,系列内横向比对,显示系列名称
+              formatter: function(p) {
+                const ynames = ['年度计划完成', '预计年度完成', '预计年度TBM', '预计年度钻爆']
+                if (ynames.indexOf(p[v.seriesIndex].seriesName) !== -1) {
+                  return p[v.seriesIndex].marker +
+                  ' ' + p[v.seriesIndex].seriesName + ':' + p[v.seriesIndex].value + 'm'
+                } else {
+                  let dataStr = ''
+                  const valMap = {};
+                  p.forEach(element => {
+                      const seriesName = element.seriesName; // 图例名称
+                      const value = element.value; // y轴值
+
+                      // 过滤无效值
+                      if (value === '-') {
+                          return
+                      }
+                      // 过滤重叠值
+                      if (valMap[seriesName] === value) {
+                          return
+                      }
+                      if (ynames.indexOf(seriesName) === -1) {
+                        dataStr += `<span style="display:inline-block;margin-right:5px;width:10px;height:10px;background-color:${element.color};"></span>`
+                        dataStr += `${element.seriesName}: <span style="font-size:16px;font-weight:600;">${element.data ? element.data : 0}m</span> <br>`
+                        valMap[seriesName] = value;
+                      }
+                  });
+                  return dataStr
+                }
+              }
+            }
+          })
+        }
+      })
+      // 鼠标图表时默认显示第一条
+      this.myChart.on('mouseout', v => {
+        this.myChart.dispatchAction({
+          type: 'highlight',
+          seriesIndex: 0,
+          dataIndex: 0
+        })
+      })
+      // this.myChart.on('click', function (param) {
+      //   console.log('param', param)
+      // })
+      // 监听窗口变化 - 只刷新最后一个图表
+      window.onresize = () => {
+        this.myChart.resize()
+      }
+      // 监听窗口变化 - 多个图表同时刷新
+      window.addEventListener('resize', () => {
+        this.myChart.resize()
+      })
+    },
+    // 设置图表的事件
+    setChartEvents (options) {
+      // console.log(options, this.idName)
+      if (!this.myChart) return
+      this.myChart.setOption(options, true)
+      // 刷新时默认显示第一条
+      this.myChart.dispatchAction({
+        type: 'highlight',
+        seriesIndex: 0,
+        dataIndex: 0
+      })
+    },
+    setResize() {
+      this.$nextTick(() => {
+        // 使echarts尺寸重置
+        if (this.myChart) {
+          this.myChart.resize()
+        }
+      })
+    }
+  },
+  mounted() {
+    // 当屏幕改变,图表重新动态改变并渲染
+    const self = this;
+    const viewElem = document.body;
+    // 调用实例对象的observe方法,监听整个body节点的变化,当改变窗口大小或者某个DOM节点出现或隐藏时时,就会触发回调
+    this.resizeObserver = new ResizeObserver(() => {
+      if (!self.myChart) return
+      self.myChart.resize();
+    });
+    this.resizeObserver.observe(viewElem);
+  },
+  beforeDestroy() {
+    if (this.resizeObserver) {
+      this.resizeObserver.unobserve(document.body)
+    }
+  }
+}
+</script>

--
Gitblit v1.9.3