rui.jiang hai 7 meses
pai
achega
c96bba261a

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 22295 - 20
package-lock.json


+ 1 - 0
package.json

@@ -32,6 +32,7 @@
     "plotly.js-with-locales": "^1.31.2",
     "qs": "^6.12.0",
     "quill": "^2.0.2",
+    "screenfull": "^6.0.2",
     "svg-sprite-loader": "^6.0.11",
     "terser-webpack-plugin": "^5.3.10",
     "vue": "^2.6.14",

BIN=BIN
src/assets/analyse/dataList.png


BIN=BIN
src/assets/analyse/dataList1.png


BIN=BIN
src/assets/analyse/exitFullScreen.png


BIN=BIN
src/assets/analyse/fullScreen.png


+ 216 - 77
src/assets/js/constants/color.js

@@ -1,7 +1,7 @@
 /*
  * @Author: your name
  * @Date: 2024-11-27 14:40:15
- * @LastEditTime: 2024-11-27 15:12:50
+ * @LastEditTime: 2024-12-10 09:58:45
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/assets/js/constants/color.js
@@ -135,81 +135,220 @@
 //   "#468b8e",
 // ];
 //蓝紫色
+// export const colorPalette = [
+//   "#5167a2",
+//   "#687db0",
+//   "#8597c0",
+//   "#ccd5e3", // 给定的基础颜色
+//   "#3e4d76",
+//   "#7f98b5",
+//   "#9da9b8",
+//   "#b3c1d1", // 更深、稍带灰色的蓝色系列
+//   "#4f5f8d",
+//   "#5c73a0",
+//   "#728ab8",
+//   "#92a9c7", // 增加深浅对比的蓝色系列
+//   "#3c4f78",
+//   "#556e96",
+//   "#6b88b0",
+//   "#7b9fc3", // 增加对比度的蓝色系列
+//   "#2e3b5c",
+//   "#3e5376",
+//   "#4e6a90",
+//   "#6e8bb1", // 深蓝色系列和淡蓝色过渡
+//   "#1f2b47",
+//   "#2f3c61",
+//   "#406a8d",
+//   "#5a84a8", // 更加深沉的蓝色系列
+//   "#547d94",
+//   "#6c96b1",
+//   "#8fa7c2",
+//   "#c0d0e0", // 从深到浅的渐变系列
+//   "#4b5e7c",
+//   "#6f8099",
+//   "#8a9bb4",
+//   "#b8c7d9", // 更加鲜明的蓝色系列
+//   "#40618d",
+//   "#537ba3",
+//   "#6a92b9",
+//   "#90adc7", // 饱和度提高的蓝色系列
+//   "#305079",
+//   "#417f98",
+//   "#5b98b3",
+//   "#76adc6", // 淡蓝色与深蓝色相结合
+//   "#274c68",
+//   "#3c6481",
+//   "#558ea3",
+//   "#6db4c7", // 更加突出的对比
+//   "#3e4e7b",
+//   "#547b98",
+//   "#748da9",
+//   "#a1bbd4", // 深蓝至淡蓝的渐变
+//   "#2c3b5a",
+//   "#3d4d73",
+//   "#54798d",
+//   "#7498b6", // 深浅变化的蓝色
+//   "#2f3f65",
+//   "#41597f",
+//   "#5b799a",
+//   "#7f9fc7", // 不同深度的蓝色
+//   "#35476a",
+//   "#487f9e",
+//   "#5f9bb6",
+//   "#84b7d2", // 蓝色渐变系列
+//   "#1a2b43",
+//   "#2b3f5a",
+//   "#3e5779",
+//   "#51768f", // 更加沉稳的蓝色系
+//   "#263d56",
+//   "#3b5079",
+//   "#4c6c97",
+//   "#6885b4", // 中性蓝系列
+//   "#1e2e4b",
+//   "#2f3f62",
+//   "#41567b",
+//   "#567b9e", // 清晰的蓝色渐变
+//   "#283c54",
+//   "#3a4f73",
+//   "#4c698f",
+//   "#6486b0", // 蓝色的温暖渐变
+// ];
+//亮色
+// export const colorPalette = [
+//   "#ff0000",
+//   "#00ff00",
+//   "#0000ff",
+//   "#ffff00",
+//   "#ff00ff",
+//   "#00ffff",
+//   "#800000",
+//   "#808000",
+//   "#008000",
+//   "#800080",
+//   "#008080",
+//   "#000080",
+//   "#ff4500",
+//   "#2e8b57",
+//   "#6a5acd",
+//   "#ff6347",
+//   "#4682b4",
+//   "#9acd32",
+//   "#ffa07a",
+//   "#7b68ee",
+//   "#8b0000",
+//   "#32cd32",
+//   "#00008b",
+//   "#ffd700",
+//   "#adff2f",
+//   "#20b2aa",
+//   "#f08080",
+//   "#9370db",
+//   "#ff1493",
+//   "#40e0d0",
+// ];
+//紫色-黄色
+// export const colorPalette = [
+//   "#3D1150",
+//   "#412575",
+//   "#3F4687",
+//   "#3D678B",
+//   "#40808C",
+//   "#4A9D8A",
+//   "#5EB67E",
+//   "#85CB66",
+//   "#BFDE50",
+//   "#FAE654",
+//   "#6A1E66",
+//   "#5E317F",
+//   "#525898",
+//   "#5177A4",
+//   "#54A4A8",
+//   "#60B396",
+//   "#75C988",
+//   "#A6D970",
+//   "#E7ED60",
+//   "#FDEB87",
+//   "#320D46",
+//   "#35145D",
+//   "#332F74",
+//   "#315E7C",
+//   "#327D84",
+//   "#3C9882",
+//   "#52AD73",
+//   "#7DC061",
+//   "#B2D54B",
+//   "#E1DE40",
+//   "#2A093B",
+//   "#2C0F53",
+//   "#2A245A",
+//   "#293E6A",
+//   "#2B5F75",
+//   "#326E79",
+//   "#3F9171",
+//   "#65A960",
+//   "#94BD4C",
+//   "#CCCB39",
+//   "#230833",
+//   "#250D4B",
+//   "#231F50",
+//   "#223B5D",
+//   "#255C68",
+//   "#2B746C",
+//   "#367E64",
+//   "#568B58",
+//   "#7FA348",
+//   "#B3B72E",
+// ];
+//蓝色-青色
 export const colorPalette = [
-  "#5167a2",
-  "#687db0",
-  "#8597c0",
-  "#ccd5e3", // 给定的基础颜色
-  "#3e4d76",
-  "#7f98b5",
-  "#9da9b8",
-  "#b3c1d1", // 更深、稍带灰色的蓝色系列
-  "#4f5f8d",
-  "#5c73a0",
-  "#728ab8",
-  "#92a9c7", // 增加深浅对比的蓝色系列
-  "#3c4f78",
-  "#556e96",
-  "#6b88b0",
-  "#7b9fc3", // 增加对比度的蓝色系列
-  "#2e3b5c",
-  "#3e5376",
-  "#4e6a90",
-  "#6e8bb1", // 深蓝色系列和淡蓝色过渡
-  "#1f2b47",
-  "#2f3c61",
-  "#406a8d",
-  "#5a84a8", // 更加深沉的蓝色系列
-  "#547d94",
-  "#6c96b1",
-  "#8fa7c2",
-  "#c0d0e0", // 从深到浅的渐变系列
-  "#4b5e7c",
-  "#6f8099",
-  "#8a9bb4",
-  "#b8c7d9", // 更加鲜明的蓝色系列
-  "#40618d",
-  "#537ba3",
-  "#6a92b9",
-  "#90adc7", // 饱和度提高的蓝色系列
-  "#305079",
-  "#417f98",
-  "#5b98b3",
-  "#76adc6", // 淡蓝色与深蓝色相结合
-  "#274c68",
-  "#3c6481",
-  "#558ea3",
-  "#6db4c7", // 更加突出的对比
-  "#3e4e7b",
-  "#547b98",
-  "#748da9",
-  "#a1bbd4", // 深蓝至淡蓝的渐变
-  "#2c3b5a",
-  "#3d4d73",
-  "#54798d",
-  "#7498b6", // 深浅变化的蓝色
-  "#2f3f65",
-  "#41597f",
-  "#5b799a",
-  "#7f9fc7", // 不同深度的蓝色
-  "#35476a",
-  "#487f9e",
-  "#5f9bb6",
-  "#84b7d2", // 蓝色渐变系列
-  "#1a2b43",
-  "#2b3f5a",
-  "#3e5779",
-  "#51768f", // 更加沉稳的蓝色系
-  "#263d56",
-  "#3b5079",
-  "#4c6c97",
-  "#6885b4", // 中性蓝系列
-  "#1e2e4b",
-  "#2f3f62",
-  "#41567b",
-  "#567b9e", // 清晰的蓝色渐变
-  "#283c54",
-  "#3a4f73",
-  "#4c698f",
-  "#6486b0", // 蓝色的温暖渐变
+  "#6296E2",
+  "#69C5C8",
+  "#4A90E2",
+  "#1D3C73",
+  "#2F6BB8",
+  "#3F8DAB",
+  "#5C9FBB",
+  "#1A6A84",
+  "#6A8EAE",
+  "#3C7C92",
+  "#1D5479",
+  "#4896D1",
+  "#3B9CB5",
+  "#51A8D2",
+  "#287DAC",
+  "#5F8A99",
+  "#3D84A4",
+  "#67C4D7",
+  "#4F9FC8",
+  "#6B94BD",
+  "#2C7E9A",
+  "#64A9CC",
+  "#3A86B1",
+  "#478F9B",
+  "#5C88B9",
+  "#367F9E",
+  "#4C89B2",
+  "#61A2D5",
+  "#5698B5",
+  "#82B9D5",
+  "#5B7E92",
+  "#6C8E9B",
+  "#4395C0",
+  "#67C1B9",
+  "#5B87A8",
+  "#5189D1",
+  "#5C7B92",
+  "#4E9DB4",
+  "#63A7C3",
+  "#55739A",
+  "#6D88A2",
+  "#3B7CA2",
+  "#6289BD",
+  "#4779A8",
+  "#5B9EBC",
+  "#4C7E9B",
+  "#6B7D98",
+  "#587C9B",
+  "#466690",
+  "#8B94B8",
 ];

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
src/icons/svg/dataList.svg


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
src/icons/svg/dataList1.svg


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
src/icons/svg/laserRangeFinder.svg


+ 1 - 1
src/utils/vuexIndexedDBPlugin.js

@@ -1,5 +1,5 @@
 import { saveData, getData, openDB } from "@/utils/indexedDb";
-import { stringify, parse } from "flatted"; // 用于处理循环引用
+import { stringify, parse } from "flatted"; // 用于处理循环引用 压缩数据处理
 import pako from "pako";
 import { Message } from "element-ui";
 // 通用分片函数

+ 38 - 44
src/views/health/vibration.vue

@@ -28,34 +28,24 @@
     <div class="searchbox">
       <p>
         单位:
-        <selecttree
-          style="width: 220px"
-          placeholder="请选择上级单位"
-          :list="parentOpt"
-          type="1"
-          v-model="companyCode"
-          @change="parentChange"
-          :defaultParentProps="{
-            children: 'children',
-            label: 'companyName',
-            value: 'codeNumber',
-          }"
-        >
-        </selecttree>
+        <el-select v-model="company" size="small" placeholder="请选择">
+          <el-option
+            v-for="item in companyoptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
       </p>
       <p>
         风机:
-        <el-select
-          v-model="unitvalue"
-          @change="getchedian"
-          size="small"
-          placeholder="请选择"
-        >
+        <el-select v-model="unitvalue" size="small" placeholder="请选择">
           <el-option
             v-for="item in unitoptions"
-            :key="item.engineCode"
-            :label="item.engineName"
-            :value="item.engineCode"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
           >
           </el-option>
         </el-select>
@@ -70,9 +60,9 @@
         >
           <el-option
             v-for="item in monitoringoptions"
-            :key="item.detectionPointEn"
-            :label="item.detectionPointCn"
-            :value="item.detectionPointEn"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
           >
           </el-option>
         </el-select>
@@ -89,9 +79,7 @@
         >
         </el-date-picker>
       </p>
-      <el-button type="primary" size="small" @click="conditions"
-        >查询</el-button
-      >
+      <el-button type="primary" size="small">查询</el-button>
       <el-button size="small">导出</el-button>
     </div>
     <div class="main-body">
@@ -134,7 +122,8 @@
             >
             <div v-if="item.name === '时域图'">
               <timedomaincharts
-                :timeList="timeList"
+                :chartData="chartData"
+                :chartLabels="chartLabels"
                 :currentIndex="currentIndex"
                 :tableDataList="tableDataList"
                 @update:currentIndex="handleCurrentIndexUpdate"
@@ -172,7 +161,7 @@
       <div class="data-origin">
         <el-table
           ref="singleTable"
-          :data="tableDataList"
+          :data="tableData"
           :current-row-key="currentIndex"
           @current-change="handleCurrentChange"
           highlight-current-row
@@ -195,27 +184,18 @@
 </template>
 
 <script>
-import {
-  getSysOrganizationAuthTreeByRoleId,
-  windEngineGrouPage,
-  queryDetectionDic,
-  getMesureData,
-} from "@/api/ledger.js";
-import selecttree from "../../components/selecttree.vue";
-
 import * as echarts from "echarts";
 import envelopecharts from "./components/envelopecharts.vue";
 import spectrogramcharts from "./components/spectrogramcharts.vue";
 import tendencycharts from "./components/tendencycharts.vue";
 import timedomaincharts from "./components/timedomaincharts.vue";
-import axios from "axios";
+
 export default {
   components: {
     envelopecharts,
     spectrogramcharts,
     tendencycharts,
     timedomaincharts,
-    selecttree,
   },
   data() {
     return {
@@ -471,9 +451,14 @@ export default {
     },
     // 当前所在行高亮提示
     setCurrent(row) {
-      this.$refs.singleTable.setCurrentRow(row);
+      this.$nextTick(() => {
+        if (this.$refs.singleTable) {
+          this.$refs.singleTable.setCurrentRow(row); // 设置当前行
+        } else {
+          console.warn("Cannot access $refs.singleTable: it's undefined.");
+        }
+      });
     },
-    // 当前单选
     handleCurrentChange(val) {
       this.currentRow = val;
 
@@ -728,4 +713,13 @@ export default {
   height: 0px; /* Adjust height when minimized */
   overflow: hidden;
 }
-</style>
+
+#main {
+  width: 100%;
+  height: 280px;
+}
+
+// .line-chart {
+//   position: relative;
+// }
+</style>

+ 7 - 1
src/views/home/components/Menu.vue

@@ -80,9 +80,15 @@
           @click="handleChangeMenuUrl(item, `${item.path}?id=${item.id}`)"
         >
           <i v-if="isElPrefix(item.iconName)" class="el-icon-menu"></i>
-          <i v-else class="svnIcon">
+          <i v-else-if="item.iconName" class="svnIcon">
             <svg-icon :icon-class="item.iconName" />
           </i>
+          <i class="svnIcon" v-else-if="item.path === '/home/laserRangeFinder'">
+            <svg-icon
+              style="width: 22px; height: 22px"
+              icon-class="laserRangeFinder"
+            />
+          </i>
           <span>{{ item.name }}</span>
         </el-menu-item>
       </template>

+ 252 - 0
src/views/laserRangeFinder/components/CylinderOfTower.vue

@@ -0,0 +1,252 @@
+<template>
+  <div class="chartsContent">
+    <el-card shadow="never" v-if="type === 'Waveformdiagram'">
+      <div slot="header" class="clearfix">
+        <h4 style="color: black; font-size: 16px; font-weight: 700">
+          塔筒振动波形图
+        </h4>
+        <div style="font-size: 12px; color: #666">
+          测点路径:江西大唐国际新能源有限公司\、金华山风电场\01#风机\塔筒振动
+        </div>
+        <div style="font-size: 12px; color: #666">
+          采样频率(Hz):2560 有效值(m/s2):8.32 叶轮转速(r/min):15.3
+          采样时间:2024//3/10 12:34:33
+        </div>
+      </div>
+      <div class="line-chart" ref="chart"></div>
+    </el-card>
+    <el-card shadow="never" v-else-if="type === 'spectrogram'">
+      <div slot="header" class="clearfix">
+        <h4 style="color: black; font-size: 16px; font-weight: 700">
+          塔筒振动频谱图
+        </h4>
+      </div>
+      <div class="line-chart" ref="chart"></div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import * as echarts from "echarts"; // 导入 echarts 库
+import screenfull from "screenfull";
+
+export default {
+  props: {
+    type: {
+      default: "",
+    },
+  },
+  data() {
+    return {
+      currentIndex: 0, // 默认索引
+      tableData: [], // 数据
+      originalChartStyle: {}, // 用于存储原始样式
+    };
+  },
+  mounted() {
+    this.initializeChart();
+    // 监听键盘事件
+    window.addEventListener("keydown", this.handleKeyDown);
+  },
+  destroyed() {
+    // 移除键盘事件监听
+    window.removeEventListener("keydown", this.handleKeyDown);
+  },
+  methods: {
+    // 初始化图表
+    initializeChart() {
+      const chartDom = this.$refs.chart;
+      this.chartInstance = echarts.init(chartDom);
+      const defaultData = [
+        Math.floor(Math.random() * 300),
+        Math.floor(Math.random() * 300),
+        Math.floor(Math.random() * 300),
+      ];
+      const defaultLabels = ["2024/1/1", "2024/1/2", "2024/1/3"];
+      this.updateChart(defaultData, defaultLabels);
+
+      // 保存初始样式
+      this.originalChartStyle = {
+        width: chartDom.style.width,
+        height: chartDom.style.height,
+        backgroundColor: chartDom.style.backgroundColor,
+      };
+    },
+    // 更新图表数据
+    updateChart(data, labels) {
+      const defaultData = Array.from({ length: 5000 }, () =>
+        Math.floor(Math.random() * 300)
+      );
+      const defaultLabels = Array.from(
+        { length: 5000 },
+        (_, index) => `2024/1/${index + 1}`
+      );
+      const option = {
+        toolbox: {
+          feature: {
+            dataZoom: { yAxisIndex: "none" },
+            restore: {},
+            saveAsImage: {},
+            myCustomTool: {
+              show: true,
+              title: "上一条",
+              icon: `image://${require("@/assets/analyse/08.png")}`,
+              onclick: () => this.previousRow(),
+            },
+            myCustomTool2: {
+              show: true,
+              title: "下一条",
+              icon: `image://${require("@/assets/analyse/09.png")}`,
+              onclick: () => this.nextRow(),
+            },
+            myCustomTool3: {
+              show: true,
+              title: "全屏",
+              icon: `image://${require("@/assets/analyse/fullScreen.png")}`,
+              onclick: () => this.fullScreen(),
+            },
+            myCustomTool4: {
+              show: true,
+              title: "退出全屏",
+              icon: `image://${require("@/assets/analyse/exitFullScreen.png")}`, // 替换为你自己的图标路径
+              onclick: () => this.exitFullScreen(),
+            },
+          },
+        },
+        xAxis: {
+          type: "category",
+          boundaryGap: false,
+          data: defaultLabels,
+        },
+        yAxis: {
+          type: "value",
+          boundaryGap: [0, "100%"],
+        },
+        tooltip: {
+          trigger: "axis",
+          position: function (pt) {
+            return [pt[0], "10%"];
+          },
+        },
+        series: [
+          {
+            name: "",
+            type: "line",
+            symbol: "none",
+            sampling: "lttb",
+            itemStyle: {
+              normal: {
+                color: "#3070B7",
+                lineStyle: {
+                  color: "#3070B7",
+                  width: 1,
+                },
+              },
+            },
+            data: defaultData,
+          },
+        ],
+      };
+      this.chartInstance.setOption(option);
+    },
+    previousRow() {
+      let newIndex =
+        this.currentIndex > 0
+          ? this.currentIndex - 1
+          : this.tableData.length - 1;
+      this.$emit("update:currentIndex", newIndex);
+    },
+    nextRow() {
+      console.log("下一条");
+      let newIndex =
+        this.currentIndex < this.tableData.length - 1
+          ? this.currentIndex + 1
+          : 0;
+      this.$emit("update:currentIndex", newIndex);
+    },
+    toggleFullScreen() {
+      const chartDom = this.$refs.chart;
+      if (screenfull.isEnabled) {
+        screenfull.toggle(chartDom);
+      }
+    },
+    fullScreen() {
+      const chartDom = this.$refs.chart;
+      if (screenfull.isEnabled) {
+        // 设置全屏样式
+        chartDom.style.position = "absolute";
+        chartDom.style.top = 0;
+        chartDom.style.left = 0;
+        chartDom.style.width = "100vw";
+        chartDom.style.height = "100vh";
+        chartDom.style.backgroundColor = "#ffffff";
+
+        // 进入全屏
+        screenfull.request(chartDom);
+        this.chartInstance.resize();
+
+        // 监听全屏变化
+        screenfull.on("change", this.handleFullScreenChange);
+      }
+    },
+    exitFullScreen() {
+      const chartDom = this.$refs.chart;
+      if (screenfull.isEnabled) {
+        screenfull.exit();
+        // 监听全屏变化
+        screenfull.on("change", this.handleFullScreenChange);
+      }
+    },
+    // 处理全屏变化的回调
+    handleFullScreenChange() {
+      const chartDom = this.$refs.chart;
+      if (!screenfull.isFullscreen) {
+        // 退出全屏时恢复样式
+        chartDom.style.position = this.originalChartStyle.position || "";
+        chartDom.style.top = this.originalChartStyle.top || "";
+        chartDom.style.left = this.originalChartStyle.left || "";
+        chartDom.style.width = this.originalChartStyle.width || "100%";
+        chartDom.style.height = this.originalChartStyle.height || "250px";
+        chartDom.style.backgroundColor =
+          this.originalChartStyle.backgroundColor || "#fff";
+
+        // 调整图表尺寸
+        this.chartInstance.resize();
+
+        // 可选:移除事件监听(如果不再需要)
+        screenfull.off("change", this.handleFullScreenChange);
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-card__body {
+  width: 100%;
+  height: 250px;
+  position: relative;
+}
+.line-chart {
+  width: 100%;
+  height: 250px;
+  background-color: #fff;
+  position: relative;
+}
+
+.eigenvalue {
+  position: absolute;
+  top: 0;
+  right: 0;
+  font-size: 10px;
+  width: 100px;
+  border: 1px solid black;
+  padding: 5px;
+  background: #fff;
+  z-index: 99;
+  h5 {
+    line-height: 16px;
+    height: 16px;
+  }
+}
+</style>

+ 108 - 0
src/views/laserRangeFinder/components/MultilevelTable.vue

@@ -0,0 +1,108 @@
+<!--
+ * @Author: your name
+ * @Date: 2024-12-09 16:41:31
+ * @LastEditTime: 2024-12-09 16:51:10
+ * @LastEditors: bogon
+ * @Description: In User Settings Edit
+ * @FilePath: /performance-test/src/views/laserRangeFinder/components/MultilevelTable.vue
+-->
+<template>
+  <el-table :data="tableData">
+    <el-table-column prop="date" label="序号"> </el-table-column>
+    <el-table-column prop="date" label="时间" min-width="120">
+    </el-table-column>
+    <el-table-column prop="date" label="场站"> </el-table-column>
+    <el-table-column prop="date" label="风机"> </el-table-column>
+    <el-table-column label="叶片角度偏差(°)">
+      <el-table-column prop="name" label="叶片1"> </el-table-column>
+      <el-table-column label="叶片2"> </el-table-column>
+      <el-table-column prop="zip" label="叶片3"> </el-table-column>
+      <el-table-column prop="zip" label="相对偏差"> </el-table-column>
+    </el-table-column>
+    <el-table-column label="叶片净空值(m)">
+      <el-table-column prop="name" label="叶片1"> </el-table-column>
+      <el-table-column label="叶片2"> </el-table-column>
+      <el-table-column prop="zip" label="叶片3"> </el-table-column>
+      <el-table-column prop="zip" label="平均"> </el-table-column>
+    </el-table-column>
+    <el-table-column label="叶片扭转变形(°)">
+      <el-table-column prop="name" label="叶片1"> </el-table-column>
+      <el-table-column label="叶片2"> </el-table-column>
+      <el-table-column prop="zip" label="叶片3"> </el-table-column>
+      <el-table-column prop="zip" label="平均"> </el-table-column>
+    </el-table-column>
+    <el-table-column label="塔筒晃动">
+      <el-table-column prop="name" label="晃动幅值(mm)"> </el-table-column>
+      <el-table-column label="晃动主频(Hz)"> </el-table-column>
+    </el-table-column>
+    <el-table-column prop="date" label="叶片采集频率(Hz)"> </el-table-column>
+    <el-table-column prop="date" label="塔筒采集频率(Hz)"> </el-table-column>
+  </el-table>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      tableData: [
+        {
+          date: "2016-05-03",
+          name: "王小虎",
+          province: "上海",
+          city: "普陀区",
+          address: "上海市普陀区金沙江路 1518 弄",
+          zip: 200333,
+        },
+        {
+          date: "2016-05-02",
+          name: "王小虎",
+          province: "上海",
+          city: "普陀区",
+          address: "上海市普陀区金沙江路 1518 弄",
+          zip: 200333,
+        },
+        {
+          date: "2016-05-04",
+          name: "王小虎",
+          province: "上海",
+          city: "普陀区",
+          address: "上海市普陀区金沙江路 1518 弄",
+          zip: 200333,
+        },
+        {
+          date: "2016-05-01",
+          name: "王小虎",
+          province: "上海",
+          city: "普陀区",
+          address: "上海市普陀区金沙江路 1518 弄",
+          zip: 200333,
+        },
+        {
+          date: "2016-05-08",
+          name: "王小虎",
+          province: "上海",
+          city: "普陀区",
+          address: "上海市普陀区金沙江路 1518 弄",
+          zip: 200333,
+        },
+        {
+          date: "2016-05-06",
+          name: "王小虎",
+          province: "上海",
+          city: "普陀区",
+          address: "上海市普陀区金沙江路 1518 弄",
+          zip: 200333,
+        },
+        {
+          date: "2016-05-07",
+          name: "王小虎",
+          province: "上海",
+          city: "普陀区",
+          address: "上海市普陀区金沙江路 1518 弄",
+          zip: 200333,
+        },
+      ],
+    };
+  },
+};
+</script>

+ 398 - 0
src/views/laserRangeFinder/components/PlotOfFit.vue

@@ -0,0 +1,398 @@
+<template>
+  <div class="chartsContent">
+    <el-card shadow="never" v-if="type === 'LeafRootOutline'">
+      <div slot="header" class="clearfix">
+        <h4 style="color: black; font-size: 16px; font-weight: 700">
+          叶根轮廓拟合图
+        </h4>
+        <div style="font-size: 12px; color: #666">
+          江西大唐国际新能源有限公司\金华山风电场\01#风机 2024/3/1 11:00:00
+        </div>
+      </div>
+      <div class="line-chart" ref="chart"></div>
+    </el-card>
+    <el-card shadow="never" v-else-if="type === 'LeafRootRelativeOutline'">
+      <div slot="header" class="clearfix">
+        <h4 style="color: black; font-size: 16px; font-weight: 700">
+          叶根相对平均轮廓拟合图
+        </h4>
+        <div style="font-size: 12px; color: #666">
+          江西大唐国际新能源有限公司\金华山风电场\01#风机 2024/3/1 11:00:00
+        </div>
+      </div>
+      <div class="line-chart" ref="chart"></div>
+    </el-card>
+    <el-card shadow="never" v-else-if="type === 'LeafTipProfile'">
+      <div slot="header" class="clearfix">
+        <h4 style="color: black; font-size: 16px; font-weight: 700">
+          叶尖轮廓拟合图
+        </h4>
+        <div style="font-size: 12px; color: #666">
+          江西大唐国际新能源有限公司\金华山风电场\01#风机 2024/3/1 11:00:00
+        </div>
+      </div>
+      <div class="line-chart" ref="chart"></div>
+    </el-card>
+    <el-card shadow="never" v-else-if="type === 'LeafTipRelativeProfile'">
+      <div slot="header" class="clearfix">
+        <h4 style="color: black; font-size: 16px; font-weight: 700">
+          叶尖相对平均轮廓拟合图
+        </h4>
+        <div style="font-size: 12px; color: #666">
+          江西大唐国际新能源有限公司\金华山风电场\01#风机 2024/3/1 11:00:00
+        </div>
+      </div>
+      <div class="line-chart" ref="chart"></div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import * as echarts from "echarts"; // 导入 echarts 库
+import screenfull from "screenfull";
+
+export default {
+  props: {
+    type: {
+      default: "",
+    },
+  },
+  data() {
+    return {
+      currentIndex: 0, // 默认索引
+      tableData: [], // 数据
+      originalChartStyle: {}, // 用于存储原始样式
+    };
+  },
+  mounted() {
+    this.initializeChart();
+    // 监听键盘事件
+    window.addEventListener("keydown", this.handleKeyDown);
+  },
+  destroyed() {
+    // 移除键盘事件监听
+    window.removeEventListener("keydown", this.handleKeyDown);
+  },
+  methods: {
+    // 初始化图表
+    initializeChart() {
+      const chartDom = this.$refs.chart;
+      this.chartInstance = echarts.init(chartDom);
+      const defaultData = [
+        Math.floor(Math.random() * 300),
+        Math.floor(Math.random() * 300),
+        Math.floor(Math.random() * 300),
+      ];
+      const defaultLabels = ["2024/1/1", "2024/1/2", "2024/1/3"];
+      this.updateChart(defaultData, defaultLabels);
+
+      // 保存初始样式
+      this.originalChartStyle = {
+        width: chartDom.style.width,
+        height: chartDom.style.height,
+        backgroundColor: chartDom.style.backgroundColor,
+      };
+    },
+    // 更新图表数据
+    updateChart(data, labels) {
+      const defaultData = Array.from({ length: 5000 }, () =>
+        Math.floor(Math.random() * 300)
+      );
+      const defaultLabels = Array.from(
+        { length: 5000 },
+        (_, index) => `2024/1/${index + 1}`
+      );
+      const option = {
+        color: ["#9CC5AF", "#C9866B", "#709EA6", "#344453", "#B34138"],
+        // title: [
+        //   {
+        //     text: "",
+        //     left: "center",
+        //     // subtext: '纯属虚构'
+        //   },
+        //   {
+        //     text: "",
+        //     // subtext:'实线',
+        //     textStyle: {
+        //       color: "#c23531",
+        //       // }
+        //     },
+        //     right: 35,
+        //     top: 275,
+        //     // subtext: '纯属虚构'
+        //   },
+        //   {
+        //     text: "",
+        //     right: 3,
+        //     top: 280,
+        //     textStyle: {
+        //       color: "#c23531",
+        //       fontSize: 12,
+        //     },
+        //   },
+
+        //   {
+        //     text: "",
+        //     textStyle: {
+        //       color: "#2f4554",
+        //     },
+        //     right: 35,
+        //     top: 295,
+        //     // subtext: '纯属虚构'
+        //   },
+        //   {
+        //     text: "",
+        //     textStyle: {
+        //       // fontSize:12,
+        //       color: "#d48265",
+        //     },
+        //     right: 0,
+        //     top: 219,
+        //     // subtext: '纯属虚构'
+        //   },
+        //   {
+        //     text: "",
+        //     textStyle: {
+        //       color: "#61a0a8",
+        //     },
+        //     right: 35,
+        //     top: 410,
+        //     // subtext: '纯属虚构'
+        //   },
+        //   {
+        //     top: 510,
+        //     left: 50,
+        //     subtextStyle: {
+        //       fontWeight: "bold",
+        //     },
+        //   },
+        // ],
+        toolbox: {
+          feature: {
+            dataZoom: { yAxisIndex: "none" },
+            restore: {},
+            saveAsImage: {},
+            myCustomTool: {
+              show: true,
+              title: "上一条",
+              icon: `image://${require("@/assets/analyse/08.png")}`,
+              onclick: () => this.previousRow(),
+            },
+            myCustomTool2: {
+              show: true,
+              title: "下一条",
+              icon: `image://${require("@/assets/analyse/09.png")}`,
+              onclick: () => this.nextRow(),
+            },
+            myCustomTool3: {
+              show: true,
+              title: "全屏",
+              icon: `image://${require("@/assets/analyse/fullScreen.png")}`,
+              onclick: () => this.fullScreen(),
+            },
+            myCustomTool4: {
+              show: true,
+              title: "退出全屏",
+              icon: `image://${require("@/assets/analyse/exitFullScreen.png")}`, // 替换为你自己的图标路径
+              onclick: () => this.exitFullScreen(),
+            },
+          },
+        },
+        xAxis: {
+          type: "category",
+          boundaryGap: false,
+          data: [
+            1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+            2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
+            2012, 2013, 2014, 2015, 2016,
+          ],
+        },
+        yAxis: {
+          type: "value",
+          boundaryGap: [0, "100%"],
+        },
+        tooltip: {
+          trigger: "axis",
+          position: function (pt) {
+            return [pt[0], "10%"];
+          },
+        },
+        series: [
+          {
+            name: "叶片1根部轮廓",
+            type: "line",
+            showSymbol: false,
+            data: [
+              1.63, 1.9, 2.16, 2.55, 2.7, 2.69, 2.65, 2.87, 2.9, 3.1, 3.47,
+              3.89, 4.54, 5.33, 5.95, 6.44, 6.94, 7.45, 7.61, 8.44, 9.35, 9.58,
+              10.06, 10.6, 10.94, 11.49, 11.03, 11.11,
+            ],
+          },
+          {
+            name: "叶片2根部轮廓",
+            type: "line",
+            showSymbol: false,
+            lineStyle: {
+              //   type: "dashed",
+            },
+            data: [
+              12.84, 13.03, 13.05, 13.89, 13.72, 12.97, 13.21, 14.02, 14.54,
+              15.07, 14.94, 14.55, 13.84, 12.7, 12.06, 11.93, 11.6, 10.84,
+              10.26, 10.18, 10.21, 9.86, 10.1, 9.96, 10.25, 11.1, 11.08, 10.7,
+            ],
+          },
+
+          {
+            name: "叶片3根部轮廓",
+            showSymbol: false,
+            lineStyle: {
+              //   type: "dotted",
+            },
+            type: "line",
+
+            data: [
+              7.38, 7.73, 7.46, 7.85, 7.68, 7.45, 6.94, 6.7, 5.98, 6.25, 6.28,
+              5.74, 5.51, 5.35, 5.25, 5.03, 4.83, 4.57, 4.58, 4.33, 4.6, 4.42,
+              4.38, 3.95, 3.82, 3.7, 3.75, 3.71,
+            ],
+          },
+          {
+            name: "平均轮廓",
+            showSymbol: false,
+            type: "line",
+            data: [
+              "-",
+              "-",
+              23.55,
+              21.24,
+              21.26,
+              21.32,
+              20.88,
+              20.23,
+              21.2,
+              20.36,
+              18.28,
+              18.93,
+              18.85,
+              19.19,
+              18.79,
+              18.1,
+              18.06,
+              17.88,
+              17.38,
+              17.06,
+              16.04,
+              15.98,
+              15.17,
+              15.17,
+              15.16,
+              14.77,
+              14.91,
+              14.76,
+            ],
+          },
+        ],
+      };
+      this.chartInstance.setOption(option);
+    },
+    previousRow() {
+      let newIndex =
+        this.currentIndex > 0
+          ? this.currentIndex - 1
+          : this.tableData.length - 1;
+      this.$emit("update:currentIndex", newIndex);
+    },
+    nextRow() {
+      console.log("下一条");
+      let newIndex =
+        this.currentIndex < this.tableData.length - 1
+          ? this.currentIndex + 1
+          : 0;
+      this.$emit("update:currentIndex", newIndex);
+    },
+    toggleFullScreen() {
+      const chartDom = this.$refs.chart;
+      if (screenfull.isEnabled) {
+        screenfull.toggle(chartDom);
+      }
+    },
+    fullScreen() {
+      const chartDom = this.$refs.chart;
+      if (screenfull.isEnabled) {
+        // 设置全屏样式
+        chartDom.style.position = "absolute";
+        chartDom.style.top = 0;
+        chartDom.style.left = 0;
+        chartDom.style.width = "100vw";
+        chartDom.style.height = "100vh";
+        chartDom.style.backgroundColor = "#ffffff";
+
+        // 进入全屏
+        screenfull.request(chartDom);
+        this.chartInstance.resize();
+
+        // 监听全屏变化
+        screenfull.on("change", this.handleFullScreenChange);
+      }
+    },
+    exitFullScreen() {
+      const chartDom = this.$refs.chart;
+      if (screenfull.isEnabled) {
+        screenfull.exit();
+        // 监听全屏变化
+        screenfull.on("change", this.handleFullScreenChange);
+      }
+    },
+    // 处理全屏变化的回调
+    handleFullScreenChange() {
+      const chartDom = this.$refs.chart;
+      if (!screenfull.isFullscreen) {
+        // 退出全屏时恢复样式
+        chartDom.style.position = this.originalChartStyle.position || "";
+        chartDom.style.top = this.originalChartStyle.top || "";
+        chartDom.style.left = this.originalChartStyle.left || "";
+        chartDom.style.width = this.originalChartStyle.width || "100%";
+        chartDom.style.height = this.originalChartStyle.height || "250px";
+        chartDom.style.backgroundColor =
+          this.originalChartStyle.backgroundColor || "#fff";
+
+        // 调整图表尺寸
+        this.chartInstance.resize();
+
+        // 可选:移除事件监听(如果不再需要)
+        screenfull.off("change", this.handleFullScreenChange);
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-card__body {
+  width: 100%;
+  height: 250px;
+  position: relative;
+}
+.line-chart {
+  width: 100%;
+  height: 250px;
+  background-color: #fff;
+  position: relative;
+}
+
+.eigenvalue {
+  position: absolute;
+  top: 0;
+  right: 0;
+  font-size: 10px;
+  width: 100px;
+  border: 1px solid black;
+  padding: 5px;
+  background: #fff;
+  z-index: 99;
+  h5 {
+    line-height: 16px;
+    height: 16px;
+  }
+}
+</style>

+ 8 - 0
src/views/laserRangeFinder/components/copyCharts.vue

@@ -0,0 +1,8 @@
+<!--
+ * @Author: your name
+ * @Date: 2024-12-10 11:10:08
+ * @LastEditTime: 2024-12-10 11:10:10
+ * @LastEditors: bogon
+ * @Description: In User Settings Edit
+ * @FilePath: /performance-test/src/views/laserRangeFinder/components/copyCharts.vue
+-->

+ 265 - 0
src/views/laserRangeFinder/components/descrBox.vue

@@ -0,0 +1,265 @@
+<!--
+ * @Author: your name
+ * @Date: 2024-12-09 16:24:28
+ * @LastEditTime: 2024-12-10 16:19:15
+ * @LastEditors: bogon
+ * @Description: In User Settings Edit
+ * @FilePath: /performance-test/src/views/laserRangeFinder/components/descrBox.vue
+-->
+<template>
+  <div class="data-origin">
+    <div class="descrBox">
+      <el-descriptions
+        class="margin-top"
+        title="叶片角度偏差"
+        :column="4"
+        size="small"
+        border
+      >
+        <el-descriptions-item label="叶片1">
+          <template slot="label">
+            <div>叶片1</div>
+            <div>角度偏差°</div>
+          </template>
+          0
+        </el-descriptions-item>
+        <el-descriptions-item label="叶片2">
+          <template slot="label">
+            <div>叶片2</div>
+            <div>角度偏差°</div>
+          </template>
+          0
+        </el-descriptions-item>
+        <el-descriptions-item label="叶片3">
+          <template slot="label">
+            <div>叶片3</div>
+            <div>角度偏差°</div>
+          </template>
+          0
+        </el-descriptions-item>
+        <el-descriptions-item label="相对">
+          <template slot="label">
+            <div>相对</div>
+            <div>角度偏差°</div>
+          </template>
+          0
+        </el-descriptions-item>
+      </el-descriptions>
+      <el-descriptions
+        class="margin-top"
+        title="叶片净空值"
+        :column="4"
+        size="small"
+        border
+      >
+        <el-descriptions-item label="叶片1">
+          <template slot="label">
+            <div>叶片1</div>
+            <div>净空值m</div>
+          </template>
+          0
+        </el-descriptions-item>
+        <el-descriptions-item label="叶片2">
+          <template slot="label">
+            <div>叶片2</div>
+            <div>净空值m</div>
+          </template>
+          0
+        </el-descriptions-item>
+        <el-descriptions-item label="叶片3">
+          <template slot="label">
+            <div>叶片3</div>
+            <div>净空值m</div>
+          </template>
+          0
+        </el-descriptions-item>
+        <el-descriptions-item label="平均">
+          <template slot="label">
+            <div>平均</div>
+            <div>净空值m</div>
+          </template>
+          0
+        </el-descriptions-item>
+      </el-descriptions>
+      <el-descriptions
+        class="margin-top"
+        title="叶片扭转变形"
+        :column="4"
+        size="small"
+        border
+      >
+        <el-descriptions-item label="叶片1">
+          <template slot="label">
+            <div>叶片1</div>
+            <div>扭转角°</div>
+          </template>
+          0
+        </el-descriptions-item>
+        <el-descriptions-item label="叶片2">
+          <template slot="label">
+            <div>叶片2</div>
+            <div>扭转角°</div>
+          </template>
+          0
+        </el-descriptions-item>
+        <el-descriptions-item label="叶片3">
+          <template slot="label">
+            <div>叶片3</div>
+            <div>扭转角°</div>
+          </template>
+          0
+        </el-descriptions-item>
+        <el-descriptions-item label="平均">
+          <template slot="label">
+            <div>平均</div>
+            <div>扭转角°</div>
+          </template>
+          0
+        </el-descriptions-item>
+      </el-descriptions>
+      <el-descriptions
+        class="margin-top"
+        title="塔筒晃动"
+        :column="3"
+        size="small"
+        border
+      >
+        <el-descriptions-item label="塔筒">
+          <template slot="label">
+            <div>塔筒</div>
+            <div>晃动幅值mm</div>
+          </template>
+          0
+        </el-descriptions-item>
+        <el-descriptions-item label="叶片2">
+          <template slot="label">
+            <div>塔筒</div>
+            <div>晃动主频Hz</div>
+          </template>
+          0
+        </el-descriptions-item>
+      </el-descriptions>
+    </div>
+    <el-table
+      ref="singleTable"
+      :data="tableData"
+      :current-row-key="currentIndex"
+      @current-change="handleCurrentChange"
+      highlight-current-row
+      style="width: 100%"
+      :max-height="type === 'init' ? '570' : '900'"
+    >
+      <el-table-column type="index" label="排序"> </el-table-column>
+      <el-table-column prop="address" label="场站"> </el-table-column>
+      <el-table-column prop="address" label="风机"> </el-table-column>
+      <el-table-column prop="name" label="时间"> </el-table-column>
+      <el-table-column prop="address" label="叶片采集频率Hz"> </el-table-column>
+      <el-table-column prop="address" label="塔筒采集频率Hz"> </el-table-column>
+    </el-table>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    type: "",
+  },
+  data() {
+    return {
+      currentIndex: 0,
+      tableData: [
+        {
+          date: "2016-05-02",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1518 弄",
+        },
+        {
+          date: "2016-05-04",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1517 弄",
+        },
+        {
+          date: "2016-05-01",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1519 弄",
+        },
+        {
+          date: "2016-05-03",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1516 弄",
+        },
+        {
+          date: "2016-05-02",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1518 弄",
+        },
+        {
+          date: "2016-05-04",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1517 弄",
+        },
+        {
+          date: "2016-05-01",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1519 弄",
+        },
+        {
+          date: "2016-05-03",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1516 弄",
+        },
+        {
+          date: "2016-05-04",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1517 弄",
+        },
+        {
+          date: "2016-05-01",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1519 弄",
+        },
+        {
+          date: "2016-05-03",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1516 弄",
+        },
+      ],
+      currentRow: null, // 用于存储当前选中的行
+      currentIndex: 0,
+    };
+  },
+
+  methods: {
+    setCurrent(row) {
+      this.$nextTick(() => {
+        if (this.$refs.singleTable) {
+          this.$refs.singleTable.setCurrentRow(row); // 设置当前行
+        } else {
+          console.warn("Cannot access $refs.singleTable: it's undefined.");
+        }
+      });
+    },
+    handleCurrentChange(val) {
+      this.currentRow = val; // 处理当前选中行
+      const index = this.tableData.indexOf(val); // 获取当前选中行的索引
+      this.currentIndex = index; // 更新当前索引
+      this.$emit("handleCurrentChange", val);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.data-origin {
+  width: 100%;
+  //   box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
+  .descrBox {
+    margin: 20px;
+    ::v-deep .el-descriptions__header {
+      margin: 10px !important;
+    }
+    ::v-deep .el-descriptions-item__cell {
+      color: #666 !important;
+    }
+  }
+}
+</style>

+ 275 - 0
src/views/laserRangeFinder/components/initCharts.vue

@@ -0,0 +1,275 @@
+<template>
+  <div class="chartsContent">
+    <el-card shadow="never">
+      <div slot="header" class="clearfix">
+        <h4 style="color: black; font-size: 16px; font-weight: 700">
+          叶片轮廓图
+        </h4>
+        <div style="font-size: 12px; color: #666">
+          测点路径:XX公司\XX电场\XX风机 &nbsp; 采样时间:2024/3/10 12:23:33
+        </div>
+      </div>
+      <div class="line-chart" ref="chart"></div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import * as echarts from "echarts"; // 导入 echarts 库
+import screenfull from "screenfull";
+
+export default {
+  data() {
+    return {
+      currentIndex: 0, // 默认索引
+      tableData: [], // 数据
+      originalChartStyle: {}, // 用于存储原始样式
+    };
+  },
+  mounted() {
+    this.initializeChart();
+    // 监听键盘事件
+    window.addEventListener("keydown", this.handleKeyDown);
+  },
+  destroyed() {
+    // 移除键盘事件监听
+    window.removeEventListener("keydown", this.handleKeyDown);
+  },
+  methods: {
+    // 初始化图表
+    initializeChart() {
+      const chartDom = this.$refs.chart;
+      this.chartInstance = echarts.init(chartDom);
+      const defaultData = [
+        Math.floor(Math.random() * 300),
+        Math.floor(Math.random() * 300),
+        Math.floor(Math.random() * 300),
+      ];
+      const defaultLabels = Array.from(
+        { length: 100 },
+        (_, index) => `5:${index + 1}`
+      );
+      this.updateChart(defaultData, defaultLabels);
+
+      // 保存初始样式
+      this.originalChartStyle = {
+        width: chartDom.style.width,
+        height: chartDom.style.height,
+        backgroundColor: chartDom.style.backgroundColor,
+      };
+    },
+    // 更新图表数据
+    updateChart(data, labels) {
+      const option = {
+        toolbox: {
+          feature: {
+            dataZoom: { yAxisIndex: "none" },
+            restore: {},
+            saveAsImage: {},
+            myCustomTool: {
+              show: true,
+              title: "上一条",
+              icon: `image://${require("@/assets/analyse/08.png")}`,
+              onclick: () => this.previousRow(),
+            },
+            myCustomTool2: {
+              show: true,
+              title: "下一条",
+              icon: `image://${require("@/assets/analyse/09.png")}`,
+              onclick: () => this.nextRow(),
+            },
+            myCustomTool3: {
+              show: true,
+              title: "全屏",
+              icon: `image://${require("@/assets/analyse/fullScreen.png")}`,
+              onclick: () => this.fullScreen(),
+            },
+            myCustomTool4: {
+              show: true,
+              title: "退出全屏",
+              icon: `image://${require("@/assets/analyse/exitFullScreen.png")}`, // 替换为你自己的图标路径
+              onclick: () => this.exitFullScreen(),
+            },
+          },
+        },
+        xAxis: {
+          type: "category",
+          boundaryGap: false,
+          data: labels,
+        },
+        yAxis: {
+          type: "value",
+          boundaryGap: [0, "100%"],
+        },
+        tooltip: {
+          trigger: "axis",
+          position: function (pt) {
+            return [pt[0], "10%"];
+          },
+        },
+        series: [
+          {
+            name: "叶根轮廓",
+            type: "line",
+            symbol: "none",
+            sampling: "lttb",
+            itemStyle: {
+              normal: {
+                color: "#3A84FF",
+                lineStyle: {
+                  color: "#3A84FF",
+                  width: 1,
+                },
+                areaStyle: {
+                  color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
+                    {
+                      offset: 0,
+                      color: "rgba(58,132,255,0)",
+                    },
+                    {
+                      offset: 1,
+                      color: "rgba(58,132,255,0.35)",
+                    },
+                  ]),
+                },
+              },
+            },
+            data: Array.from({ length: 100 }, () =>
+              Math.floor(Math.random() * 300)
+            ),
+          },
+          {
+            name: "叶尖轮廓",
+            type: "line",
+            symbol: "none",
+            sampling: "lttb",
+            itemStyle: {
+              normal: {
+                color: "rgba(255,80,124,1)",
+                lineStyle: {
+                  color: "rgba(255,80,124,1)",
+                  width: 1,
+                },
+                areaStyle: {
+                  color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
+                    {
+                      offset: 0,
+                      color: "rgba(255,80,124,0)",
+                    },
+                    {
+                      offset: 1,
+                      color: "rgba(255,80,124,0.35)",
+                    },
+                  ]),
+                },
+              },
+            },
+            data: Array.from({ length: 100 }, () =>
+              Math.floor(Math.random() * 300)
+            ),
+          },
+        ],
+      };
+      this.chartInstance.setOption(option);
+    },
+    previousRow() {
+      let newIndex =
+        this.currentIndex > 0
+          ? this.currentIndex - 1
+          : this.tableData.length - 1;
+      this.$emit("update:currentIndex", newIndex);
+    },
+    nextRow() {
+      console.log("下一条");
+      let newIndex =
+        this.currentIndex < this.tableData.length - 1
+          ? this.currentIndex + 1
+          : 0;
+      this.$emit("update:currentIndex", newIndex);
+    },
+    toggleFullScreen() {
+      const chartDom = this.$refs.chart;
+      if (screenfull.isEnabled) {
+        screenfull.toggle(chartDom);
+      }
+    },
+    fullScreen() {
+      const chartDom = this.$refs.chart;
+      if (screenfull.isEnabled) {
+        // 设置全屏样式
+        chartDom.style.position = "absolute";
+        chartDom.style.top = 0;
+        chartDom.style.left = 0;
+        chartDom.style.width = "100vw";
+        chartDom.style.height = "100vh";
+        chartDom.style.backgroundColor = "#ffffff";
+
+        // 进入全屏
+        screenfull.request(chartDom);
+        this.chartInstance.resize();
+
+        // 监听全屏变化
+        screenfull.on("change", this.handleFullScreenChange);
+      }
+    },
+    exitFullScreen() {
+      const chartDom = this.$refs.chart;
+      if (screenfull.isEnabled) {
+        screenfull.exit();
+        // 监听全屏变化
+        screenfull.on("change", this.handleFullScreenChange);
+      }
+    },
+    // 处理全屏变化的回调
+    handleFullScreenChange() {
+      const chartDom = this.$refs.chart;
+      if (!screenfull.isFullscreen) {
+        // 退出全屏时恢复样式
+        chartDom.style.position = this.originalChartStyle.position || "";
+        chartDom.style.top = this.originalChartStyle.top || "";
+        chartDom.style.left = this.originalChartStyle.left || "";
+        chartDom.style.width = this.originalChartStyle.width || "100%";
+        chartDom.style.height = this.originalChartStyle.height || "250px";
+        chartDom.style.backgroundColor =
+          this.originalChartStyle.backgroundColor || "#fff";
+
+        // 调整图表尺寸
+        this.chartInstance.resize();
+
+        // 可选:移除事件监听(如果不再需要)
+        screenfull.off("change", this.handleFullScreenChange);
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-card__body {
+  width: 100%;
+  height: 250px;
+  position: relative;
+}
+.line-chart {
+  width: 100%;
+  height: 250px;
+  background-color: #fff;
+  position: relative;
+}
+
+.eigenvalue {
+  position: absolute;
+  top: 0;
+  right: 0;
+  font-size: 10px;
+  width: 100px;
+  border: 1px solid black;
+  padding: 5px;
+  background: #fff;
+  z-index: 99;
+  h5 {
+    line-height: 16px;
+    height: 16px;
+  }
+}
+</style>

+ 460 - 0
src/views/laserRangeFinder/index.vue

@@ -0,0 +1,460 @@
+<template>
+  <div class="global-variable">
+    <div class="searchbox">
+      <el-collapse v-model="activeNames">
+        <el-collapse-item title="数据筛选" name="1">
+          <template slot="title">
+            <div class="titleLeft">数据筛选</div>
+            <div class="titleRight">
+              <el-button type="primary" @click.stop="onSubmit" size="small">
+                查询
+              </el-button>
+              <el-button
+                v-if="tabActiveName === 'list'"
+                type="primary"
+                @click.stop="onSubmit"
+                size="small"
+              >
+                导出
+              </el-button>
+            </div>
+          </template>
+          <el-form :inline="true" :model="formInline" class="demo-form-inline">
+            <el-row :gutter="10">
+              <el-col :xs="16" :sm="8" :md="7" :lg="6" :xl="4">
+                <el-form-item label="单位">
+                  <selecttree
+                    style="width: 220px"
+                    placeholder="请选择上级单位"
+                    :list="parentOpt"
+                    type="1"
+                    v-model="formInline.companyCode"
+                    @change="parentChange"
+                    :defaultParentProps="{
+                      children: 'children',
+                      label: 'companyName',
+                      value: 'codeNumber',
+                    }"
+                  >
+                  </selecttree>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="16" :sm="8" :md="7" :lg="6" :xl="4">
+                <el-form-item label="风机">
+                  <el-select
+                    v-model="formInline.unitvalue"
+                    @change="getchedian"
+                    size="small"
+                    placeholder="请选择"
+                  >
+                    <el-option
+                      v-for="item in unitoptions"
+                      :key="item.engineCode"
+                      :label="item.engineName"
+                      :value="item.engineCode"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="14" :md="12" :lg="10" :xl="6">
+                <el-form-item label="时间">
+                  <el-date-picker
+                    size="small"
+                    v-model="formInline.timevalue"
+                    type="daterange"
+                    range-separator="至"
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+                  >
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+        </el-collapse-item>
+      </el-collapse>
+    </div>
+    <div class="main-body">
+      <div class="data-map">
+        <el-tabs type="border-card" v-model="tabActiveName">
+          <el-tab-pane label="原始图" name="init">
+            <span slot="label">
+              <img
+                style="width: 30px; height: 20px; display: inline-block"
+                src="@/assets/analyse/04.png"
+                alt=""
+              />
+              原始图
+            </span>
+            <div class="boxContent">
+              <div class="left" v-if="tabActiveName === 'init'">
+                <el-empty
+                  :image-size="200"
+                  v-if="currentRow === null"
+                ></el-empty>
+                <div v-else>
+                  <InitCharts></InitCharts>
+                  <CylinderOfTower type="Waveformdiagram"></CylinderOfTower>
+                  <CylinderOfTower type="spectrogram"></CylinderOfTower>
+                </div>
+              </div>
+              <div class="right">
+                <DescrBox
+                  type="init"
+                  ref="initTable"
+                  @handleCurrentChange="handleCurrentChange"
+                ></DescrBox>
+              </div>
+            </div>
+          </el-tab-pane>
+          <el-tab-pane label="拟合图" name="copy">
+            <span slot="label">
+              <img
+                style="width: 25px; height: 20px; display: inline-block"
+                src="@/assets/analyse/01.png"
+                alt=""
+              />
+              拟合图
+            </span>
+            <div class="boxContent" v-if="tabActiveName === 'copy'">
+              <div class="left">
+                <el-empty
+                  :image-size="200"
+                  v-if="currentRow === null"
+                ></el-empty>
+                <div v-else>
+                  <PlotOfFit type="LeafRootOutline"></PlotOfFit>
+                  <PlotOfFit type="LeafRootRelativeOutline"></PlotOfFit>
+                  <PlotOfFit type="LeafTipProfile"></PlotOfFit>
+                  <PlotOfFit type="LeafTipRelativeProfile"></PlotOfFit>
+                </div>
+              </div>
+              <div class="right">
+                <DescrBox
+                  type="copy"
+                  ref="copyTable"
+                  @handleCurrentChange="handleCurrentChange"
+                ></DescrBox>
+              </div>
+            </div>
+          </el-tab-pane>
+          <el-tab-pane label="数据列表" name="list">
+            <span slot="label">
+              <img
+                style="width: 20px; height: 20px; display: inline-block"
+                src="@/assets/analyse/dataList1.png"
+                alt=""
+              />
+              数据列表
+            </span>
+            <div>
+              <MultilevelTable></MultilevelTable>
+            </div>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import * as echarts from "echarts";
+import {
+  getSysOrganizationAuthTreeByRoleId,
+  windEngineGrouPage,
+  queryDetectionDic,
+} from "@/api/ledger.js";
+import DescrBox from "./components/descrBox.vue";
+import selecttree from "../../components/selecttree.vue";
+import MultilevelTable from "./components/MultilevelTable.vue";
+import InitCharts from "./components/initCharts.vue";
+import CylinderOfTower from "./components/CylinderOfTower.vue";
+import PlotOfFit from "./components/PlotOfFit.vue";
+export default {
+  data() {
+    return {
+      activeNames: ["1"],
+      tabActiveName: "init",
+      formInline: {
+        companyCode: "", //单位
+        unitvalue: "", //风机
+        timevalue: "", //时间
+      },
+      companyCode: "", //单位表格中展示
+      parentOpt: [],
+      chartData: [],
+      chartLabels: [],
+      tableData: [],
+      data: [10, 20, 30, 40], // 假设是图表的数据
+      labels: ["2024/1/1", "2024/1/2", "2024/1/3", "2024/1/4"], // 假设是时间轴数据
+      currentIndex: 0,
+      tableData: [], // 假设是来自父组件的数据
+
+      company: "",
+      companyoptions: [],
+      unitvalue: "",
+      unitoptions: [],
+      monitoringvalue: "",
+      monitoringoptions: [],
+      timevalue: "",
+      tableData: [],
+      fourList: [],
+      currentRow: null, // 用于存储当前选中的行
+      currentIndex: 0,
+      isChartVisible: false,
+    };
+  },
+  components: {
+    DescrBox,
+    PlotOfFit,
+    MultilevelTable,
+    selecttree,
+    InitCharts,
+    CylinderOfTower,
+  },
+  created() {
+    this.GETtree();
+  },
+  methods: {
+    // 获取风场
+    async GETtree() {
+      try {
+        const res = await getSysOrganizationAuthTreeByRoleId();
+        const treedata = res.data;
+        const processedData = this.processTreeData(treedata);
+        this.parentOpt = processedData;
+        this.defaultdata = res.data[0];
+      } catch (err) {
+        this.$message.error(err);
+      }
+    },
+    processTreeData(treeData) {
+      const processedData = [];
+      function processNode(node) {
+        if (node.codeType === "field") {
+          node.companyName = node.fieldName;
+        }
+        if (node.children && node.children.length > 0) {
+          node.children.forEach((child) => {
+            processNode(child);
+          });
+        }
+      }
+      treeData.forEach((root) => {
+        processNode(root);
+        processedData.push(root);
+      });
+      return processedData;
+    },
+    parentChange(data) {
+      this.maplist = data;
+      this.maplistArr = data;
+      let paramsData = {
+        fieldCode: this.maplist.codeNumber,
+        pageNum: 1,
+        pageSize: 99,
+      };
+      this.unitvalue = "";
+      // 获取风机
+      windEngineGrouPage(paramsData).then((res) => {
+        this.unitoptions = res.data.list;
+      });
+      if (data.codeType === "field") {
+        if (this.parseCoordinates(data.longitudeAndLatitudeString).length > 0) {
+          return;
+        }
+      } else {
+        const dataMapList = data.children;
+        dataMapList.forEach((element) => {
+          console.log(element);
+          if (
+            this.parseCoordinates(element.longitudeAndLatitudeString).length >
+              0 &&
+            element.codeType === "field"
+          ) {
+            return;
+          }
+        });
+      }
+    },
+    parseCoordinates(input) {
+      if (input && typeof input === "string") {
+        return input.split(",").map(Number);
+      }
+      // debugger;
+      return [];
+    },
+    // 获取测点
+    getchedian(value) {
+      queryDetectionDic({ engineCodes: value }).then((res) => {
+        this.monitoringoptions = res.data;
+      });
+    },
+    handleCurrentIndexUpdate(newIndex) {
+      this.currentIndex = newIndex;
+    },
+    setCurrent(row) {
+      this.$nextTick(() => {
+        if (this.$refs.singleTable) {
+          this.$refs.singleTable.setCurrentRow(row); // 设置当前行
+        } else {
+          console.warn("Cannot access $refs.singleTable: it's undefined.");
+        }
+      });
+    },
+    handleCurrentChange(val) {
+      this.currentRow = val; // 处理当前选中行
+      const index = this.tableData.indexOf(val); // 获取当前选中行的索引
+      this.currentIndex = index; // 更新当前索引
+    },
+
+    generate(type) {
+      if (!this.currentRow) {
+        this.$message.warning("请先选择数据");
+        return;
+      }
+    },
+
+    // 缩小
+    lessen(index) {
+      if (!this.fourList[index].isMinimized) {
+        this.fourList[index].isMinimized = true;
+      }
+      console.log("1");
+    },
+    // 放大
+    amplifier(index) {
+      const item = this.fourList[index];
+      if (item.isMinimized) {
+        item.isMinimized = false;
+      }
+      console.log("2");
+    },
+    // 关闭
+    close(index) {
+      this.fourList.splice(index, 1);
+      console.log("3");
+    },
+    zhankai() {
+      this.fourList.forEach((item) => {
+        item.isMinimized = false;
+      });
+    },
+    suoxiao() {
+      this.fourList.forEach((item) => {
+        item.isMinimized = true;
+      });
+    },
+    guanbi() {
+      this.fourList = [];
+    },
+    onSubmit() {
+      console.log("事件触发了");
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.head {
+  // border-top: 5px solid #088080;
+  // border-bottom: 5px solid #088080;
+  padding: 5px 0;
+  display: flex;
+  justify-content: space-between;
+  .headleft {
+    display: flex;
+  }
+  .headright {
+    img {
+      width: 20px;
+      height: 20px;
+      margin: 0 10px;
+      cursor: pointer;
+    }
+  }
+}
+.searchbox {
+  // display: flex;
+  margin: 20px 0 0 0;
+  p {
+    margin-right: 20px;
+  }
+  .el-select {
+    width: 180px;
+  }
+
+  .titleLeft {
+  }
+  .titleRight {
+    display: flex;
+    position: absolute;
+    right: 100px;
+  }
+}
+.dialog-actions {
+  text-align: right;
+  padding: 0 10px;
+  display: flex;
+  justify-content: space-between;
+  position: relative;
+}
+
+.subject {
+  height: 280px;
+  transition: all 0.3s ease;
+  padding: 0 10px;
+  p {
+    font-size: 10px;
+  }
+}
+
+.main-body {
+  display: flex;
+  justify-content: space-between;
+  .data-map {
+    width: 100%;
+    // height: 620px;
+    overflow-y: auto;
+    .chart-area {
+      margin-bottom: 10px;
+      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
+    }
+    .boxContent {
+      display: flex;
+      justify-content: space-between;
+      .left {
+        width: 60%;
+      }
+      .right {
+        width: 39%;
+        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
+      }
+    }
+    .el-tabs--border-card {
+      height: 100%;
+    }
+    ::v-deep .el-tabs--border-card > .el-tabs__content {
+      padding: 0 !important;
+    }
+  }
+  .data-map::-webkit-scrollbar {
+    display: none; /* 隐藏滚动条 */
+  }
+}
+
+.subject.minimized {
+  height: 0px; /* Adjust height when minimized */
+  overflow: hidden;
+}
+
+#main {
+  width: 100%;
+  height: 280px;
+}
+
+// .line-chart {
+//   position: relative;
+// }
+</style>

+ 0 - 5
src/views/ledger/modules.vue

@@ -2,7 +2,6 @@
   <div class="global-variable">
     <h2 class="TitleH2">主轴</h2>
     <zhuzhou
-      v-if="bearingBrandOptions.length > 0 && lubricantBrandOptions.length > 0"
       :rhyPP="lubricantBrandOptions"
       :rhyZC="bearingBrandOptions"
       :unitBearingsVo="unitBearingsVo"
@@ -11,9 +10,6 @@
     <div v-if="clxShow">
       <h2 class="TitleH2">齿轮箱</h2>
       <Chilunxiang
-        v-if="
-          bearingBrandOptions.length > 0 && lubricantBrandOptions.length > 0
-        "
         :clxPP="lubricantBrandOptions"
         :clxZC="bearingBrandOptions"
         :unitGearDto="unitGearDto"
@@ -23,7 +19,6 @@
 
     <h2 class="TitleH2">发电机</h2>
     <Fadianji
-      v-if="bearingBrandOptions.length > 0 && lubricantBrandOptions.length > 0"
       :fdjPP="lubricantBrandOptions"
       :fdjZC="bearingBrandOptions"
       :unitDynamoDto="unitDynamoDto"

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio