Browse Source

绘制散点图去除色带

liujiejie 4 months ago
parent
commit
48b984dd30

+ 2 - 2
src/components/map/index.vue

@@ -196,8 +196,8 @@ export default {
         new TileLayer({
           source: new XYZ({
             // url: "http://127.0.0.1:8010/tiles/{z}/{x}/{y}.png", //本地
-            url: "http://192.168.50.235/tiles/{z}/{x}/{y}.png", //内网
-            // url: "http://106.120.102.238:18000/tiles/{z}/{x}/{y}.png", //外网
+            // url: "http://192.168.50.235/tiles/{z}/{x}/{y}.png", //内网
+            url: "http://106.120.102.238:18000/tiles/{z}/{x}/{y}.png", //外网
             // url: "http://10.96.137.5:9080/tiles/{z}/{x}/{y}.png", //大~#@唐
           }),
         }),

+ 1 - 0
src/utils/request.js

@@ -21,6 +21,7 @@ service.interceptors.request.use(
       if (token) {
         config.headers.token = token;
       }
+      // config.headers.showIp = "http://106.120.102.238";
     }
     return config;
   },

+ 3 - 3
src/views/overview/components/cp_trend/index.vue

@@ -1,8 +1,8 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-09 18:06:09
- * @LastEditTime: 2025-01-17 09:23:02
- * @LastEditors: bogon
+ * @LastEditTime: 2025-01-17 18:01:52
+ * @LastEditors: milo-MacBook-Pro.local
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/cp_trend/index.vue
 -->
@@ -84,7 +84,7 @@ import FilterChart from "@/views/overview/components/filterChart/index.vue";
 import BoxLineCharts from "@/views/performance/components/chartsCom/BoxLineCharts.vue";
 import TinymceEditor from "@/components/Tinymce.vue";
 import { analysisDetail, queryAnalysisedEngine } from "@/api/performance";
-
+import axios from "axios";
 export default {
   name: "cpTrend",
   components: {

+ 293 - 4
src/views/overview/components/tsr_cp_power_scatter/index.vue

@@ -1,19 +1,308 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-10 09:22:59
- * @LastEditTime: 2025-01-10 09:23:45
+ * @LastEditTime: 2025-01-17 17:26:48
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/index.vue
 -->
+
 <template>
-  <div>叶尖速比-Cp-功率散点分析</div>
+  <div class="type-variable">
+    <!-- 叶尖速比-Cp-功率散点分析--只有分图不存在总图 -->
+    <div class="left">
+      <FilterChart
+        :windList="windEngineGroupList"
+        @getEnfineList="getEnfineList"
+        @handlePrevious="handlePrevious"
+        @handleNext="handleNext"
+      ></FilterChart>
+      <el-alert type="info" :closable="false">
+        <template v-slot:title>
+          <div style="display: flex; align-items: center">
+            <i
+              class="el-icon-info"
+              style="font-size: 20px; margin-right: 5px"
+            ></i>
+            <h3>分析说明:</h3>
+          </div>
+        </template>
+        <div style="font-size: 12px; margin-top: 10px">
+          动态偏航误差分析是对机组偏航对风角度的分布情况进行统计及可视化展示,对风角度分布对称性较差的机组需要关注其偏航系统对风异常原因。
+        </div>
+      </el-alert>
+      <div class="charts" v-if="diagramRelationsDatas">
+        <template v-for="(itemChart, indChart) in diagramRelationsDatas">
+          <NoColourBandTwoDMarkerChart
+            :key="itemChart.fieldEngineCode"
+            @getResult="getResult"
+            @changeRequestNum="changeRequestNum"
+            :result="requestResult"
+            :index="indChart"
+            :ref="itemChart.fieldEngineCode"
+            :fileAddr="itemChart.fileAddr"
+          >
+          </NoColourBandTwoDMarkerChart>
+        </template>
+      </div>
+      <el-empty description="暂无分析记录" v-else></el-empty>
+      <el-tabs value="first">
+        <el-tab-pane label="意见描述" name="first">
+          <TinymceEditor
+            ref="editor"
+            v-model="comment"
+            @input="handleEditorInput($event)"
+            @onClick="onClick"
+          >
+          </TinymceEditor>
+        </el-tab-pane>
+      </el-tabs>
+      <el-row type="flex" class="row-bg" justify="end">
+        <el-col :span="2" style="margin: 20px">
+          <el-button type="primary" size="small" @click="handleComment"
+            >提交评论</el-button
+          >
+        </el-col>
+      </el-row>
+    </div>
+    <div class="right">
+      <DicCard
+        :batchCode="initBatchCode"
+        :analysisTypeCode="analysisTypeCode"
+        :commentDescriptionVos="commentDescriptionVos"
+      >
+      </DicCard>
+    </div>
+  </div>
 </template>
 <script>
+import DicCard from "@/views/overview/components/dicCard/index.vue";
+import FilterChart from "@/views/overview/components/filterChart/index.vue";
+import NoColourBandTwoDMarkerChart from "@/views/performance/components/chartsCom/NoColourBandTwoDMarkerChart.vue";
+import TinymceEditor from "@/components/Tinymce.vue";
+import { analysisDetail, queryAnalysisedEngine } from "@/api/performance";
+
 export default {
+  name: "tsr_cp_power_scatter",
   components: {
-    name: "tsr_cp_power_scatter",
+    DicCard,
+    FilterChart,
+    NoColourBandTwoDMarkerChart,
+    TinymceEditor,
+  },
+  props: {
+    initBatchCode: {
+      default: "",
+      type: String,
+    },
+    analysisTypeCode: {
+      default: "",
+      type: String,
+    },
+    batchCodeList: {
+      default: "",
+      type: Array,
+    },
+  },
+  data() {
+    return {
+      form: {
+        value2: "",
+      },
+      windEngineGroupList: [], //批次风机列表
+      fieldEngineCodes: [], //选中风机
+      comment: "",
+      options: [],
+      generalFilesDatas: [], //总图
+      diagramRelationsDatas: [], //分图,
+      requestResult: [], // 请求结果
+      requestRecord: [],
+      commentDescriptionVos: [], //评论列表
+      editableTabs: [],
+    };
+  },
+  watch: {
+    initBatchCode(newVal) {
+      if (newVal) {
+        this.fetchData(); // 调用合并后的函数
+      }
+    },
+    analysisTypeCode(newVal) {
+      if (newVal) {
+        this.fetchData(); // 调用合并后的函数
+      }
+    },
+  },
+  mounted() {
+    if (this.initBatchCode && this.analysisTypeCode) {
+      this.fetchData(); // 调用合并后的函数
+    }
+  },
+  methods: {
+    async handleComment() {
+      try {
+        await analysisCommentEdit({
+          batchCode: this.initBatchCode,
+          analysisTypeCode: this.analysisTypeCode,
+          commentList: this.editableTabs.map((item) => {
+            return {
+              commentTypeCode: item.commentTypeCode,
+              comment: item.commentTypeName === "分析评论" ? this.comment : "",
+            };
+          }),
+        });
+        this.$message({
+          type: "success",
+          message: "保存成功",
+        });
+        this.comment = "";
+        this.getAnalysisDetail();
+      } catch (e) {
+        console.error(e);
+        this.loading = false;
+      }
+    },
+    getResult({ index, result }) {
+      console.log(index, result);
+      this.$set(this.requestResult, index, result);
+      // this.requestResult[index] = result
+      this.requestRecord[index] = result;
+    },
+    changeRequestNum(index) {
+      if (index <= 1) {
+        this.$set(this.requestRecord, index, "start");
+        return;
+      }
+      if (index > 1) {
+        if (
+          this.requestRecord.every((item) =>
+            ["success", "error"].includes(item)
+          )
+        ) {
+          this.$set(this.requestRecord, index, "start");
+          this.$set(this.requestResult, index, "start");
+        } else {
+          this.$set(this.requestRecord, index, "start");
+        }
+      }
+    },
+    onSubmit() {
+      console.log("submit!");
+    },
+    // 合并后的函数,处理数据请求
+    async fetchData() {
+      try {
+        console.log(
+          this.initBatchCode,
+          this.analysisTypeCode,
+          "请求详情 分钟级"
+        );
+        // 获取分析详情
+        await this.getAnalysisDetail();
+
+        // 获取风机列表
+        await this.getWindEnfineList(this.initBatchCode, this.analysisTypeCode);
+      } catch (err) {
+        console.error("Failed to fetch data:", err);
+      }
+    },
+    // 获取分析详情接口
+    async getAnalysisDetail() {
+      try {
+        const result = await analysisDetail({
+          batchCode: this.initBatchCode,
+          analysisTypeCode: this.analysisTypeCode,
+          fieldEngineCodes:
+            this.fieldEngineCodes.length === 0
+              ? undefined
+              : this.fieldEngineCodes.join(","),
+        });
+        if (
+          result.data &&
+          result.data[0] &&
+          result.data[0].commentTypeRelations
+        ) {
+          this.editableTabs = result.data[0].commentTypeRelations;
+        }
+        //当前评论展示获取
+        if (
+          result.data &&
+          result.data[0] &&
+          result.data[0].commentDescriptionVos
+        ) {
+          this.commentDescriptionVos = result.data[0].commentDescriptionVos;
+        }
+        this.generalFilesDatas =
+          result.data && result.data[0] && result.data[0].generalFiles; //总图数据
+        this.diagramRelationsDatas =
+          result.data && result.data[0] && result.data[0].diagramRelations;
+      } catch (err) {
+        console.error("Failed to fetch analysis details:", err);
+      }
+    },
+
+    // 请求风机列表
+    async getWindEnfineList(batchCode, analysisTypeCode) {
+      // console.log("请求风机列表 分钟级");
+      const resEngineList = await queryAnalysisedEngine({
+        batchCode: batchCode,
+        analysisTypeCode,
+      });
+      this.windEngineGroupList = resEngineList.data;
+    },
+    handleEditorInput(index, newVal) {
+      // 更新对应的 comment 值
+      // 如果该功能没有实现,可以删除这个方法
+    },
+    //获取选中风机list
+    getEnfineList(data) {
+      this.fieldEngineCodes = data;
+      this.getAnalysisDetail();
+    },
+    //下一条
+    handleNext() {
+      const index = this.batchCodeList.findIndex(
+        (item) => item === this.initBatchCode
+      );
+      if (index === this.batchCodeList.length - 1) {
+        this.$message.warning("已经是最后一个分析结果了");
+        return;
+      }
+      this.$emit("setInitBathCode", this.batchCodeList[index + 1]);
+    },
+    //上一条
+    handlePrevious() {
+      const index = this.batchCodeList.findIndex(
+        (item) => item === this.initBatchCode
+      );
+      if (index === 0) {
+        this.$message.warning("没有上一条了");
+        return;
+      }
+      this.$emit("setInitBathCode", this.batchCodeList[index - 1]);
+    },
+    onClick() {},
   },
 };
 </script>
-<style scoped lang="scss"></style>
+<style scoped lang="scss">
+.type-variable {
+  display: flex;
+  height: 90%;
+  overflow: hidden;
+
+  .left {
+    width: 30%;
+    height: 100%;
+    overflow: auto;
+    padding: 20px;
+    flex: 1;
+  }
+
+  .right {
+    width: 250px;
+    height: 100%;
+    overflow: hidden;
+  }
+}
+</style>

+ 1 - 2
src/views/overview/components/wind_speed_frequency/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-10 09:11:34
- * @LastEditTime: 2025-01-17 16:57:19
+ * @LastEditTime: 2025-01-17 17:19:47
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/wind_speed_frequency/index.vue
@@ -30,7 +30,6 @@
           风向玫瑰图是一种表示某地不同风向出现频率分布的图表。
         </div>
       </el-alert>
-
       <div class="titleCharts">分析分图 :</div>
       <div
         class="charts"

+ 1 - 1
src/views/performance/assetssMag.vue

@@ -711,7 +711,7 @@ export default {
     },
     examine() {
       this.$router.push({
-        path: "/home/transition",
+        path: "/transition",
       });
     },
   },

+ 1 - 1
src/views/performance/components/chartsCom/BoxLineCharts.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2024-09-11 14:32:51
- * @LastEditTime: 2025-01-16 18:29:08
+ * @LastEditTime: 2025-01-17 18:54:17
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/chartsCom/BoxLineCharts.vue

+ 358 - 0
src/views/performance/components/chartsCom/NoColourBandTwoDMarkerChart.vue

@@ -0,0 +1,358 @@
+<!--
+ * @Author: your name
+ * @Date: 2025-01-17 17:22:04
+ * @LastEditTime: 2025-01-17 17:23:46
+ * @LastEditors: bogon
+ * @Description: In User Settings Edit
+ * @FilePath: /performance-test/src/views/performance/components/chartsCom/NoColourBandTwoDMarkerChart.vue
+-->
+<template>
+  <div style="min-height: 300px">
+    <div v-inview="handleDomInView"></div>
+    <!-- 2D散点图 没色带 -->
+    <template v-if="isShow === true">
+      <div style="display: flex; align-items: center; margin-top: 20px">
+        <div style="margin-right: 20px; display: flex; align-items: center">
+          <el-color-picker
+            size="small"
+            v-model="color1"
+            show-alpha
+            @change="updateChartColor"
+          ></el-color-picker>
+          <span style="margin-left: 10px">自定义颜色</span>
+        </div>
+        <!-- 图表类型切换按钮 -->
+        <div>
+          <el-button size="small" @click="setChartType('scatter')"
+            >散点图</el-button
+          >
+          <el-button size="small" @click="setChartType('line')"
+            >折线图</el-button
+          >
+        </div>
+      </div>
+      <div v-loading="$parent.requestRecord[index] === 'start'">
+        <el-empty
+          v-if="result[index] === 'error'"
+          description="请求失败"
+        ></el-empty>
+        <div v-else ref="plotlyChart" style="height: 400px"></div>
+      </div>
+    </template>
+  </div>
+</template>
+
+<script>
+import Plotly from "plotly.js-dist";
+import axios from "axios";
+export default {
+  props: {
+    fileAddr: {
+      default: "",
+      type: String,
+    },
+    index: {
+      type: Number,
+    },
+    result: {
+      type: Array,
+      default: [],
+    },
+  },
+  data() {
+    return {
+      chartData: {},
+      chartType: "scatter", // 初始化为散点图 (scatter)
+      color1: "", // 默认颜色
+      selectedPoints: [],
+      originalColors: [],
+      originalSizes: [],
+      isShow: undefined,
+    };
+  },
+  watch: {
+    result: {
+      deep: true,
+      handler(v) {
+        console.log("-----------------------", v);
+        const startIndex = this.$parent.requestRecord.findIndex(
+          (item) => item === "start"
+        );
+        if (startIndex > -1) {
+          if (startIndex === this.index) {
+            this.getData();
+          }
+        }
+      },
+    },
+  },
+  async mounted() {
+    if (this.index === 0) {
+      this.getData();
+    }
+  },
+  methods: {
+    handleDomInView(isInView) {
+      if (isInView && this.isShow === undefined) {
+        this.isShow = isInView;
+        this.$emit("changeRequestNum", this.index);
+      }
+      console.log(this.isShow);
+    },
+    async getData() {
+      if (this.fileAddr !== "") {
+        try {
+          const resultChartsData = await axios.get(this.fileAddr);
+          this.chartData = resultChartsData.data;
+          this.drawChart();
+          this.$emit("getResult", { index: this.index, result: "success" });
+        } catch (error) {
+          this.$emit("getResult", { index: this.index, result: "error" });
+        }
+      }
+    },
+    drawChart() {
+      const data = this.chartData.data && this.chartData.data[0];
+      let trace = {};
+      // 保存原始颜色和大小
+      this.originalColors = [...data.yData];
+      this.originalSizes = new Array(data.xData.length).fill(6); // 初始点大小
+      if (this.chartType === "scatter") {
+        // 绘制 2D 散点图
+        console.log("重新绘制图表", this.color1);
+        trace = {
+          x: data.xData,
+          y: data.yData,
+          mode: "markers",
+          type: "scattergl", // 这里改为 scattergl
+          text: data.engineName, // 提示文本
+          marker: {
+            color: data.yData, // 根据 yData 的值设置颜色
+            // colorscale: "Viridis", // 使用的颜色区间
+            colorscale: this.color1
+              ? [
+                  [0, "#F9FDD2"], // 颜色从 this.color1 开始
+                  [1, this.color1], // 结束颜色为其他颜色
+                ]
+              : [
+                  [0, "#F9FDD2"],
+                  [0.15, "#E9F6BD"],
+                  [0.3, "#C2E3B9"],
+                  [0.45, "#8AC8BE"],
+                  [0.6, "#5CA8BF"],
+                  [0.75, "#407DB3"],
+                  [0.9, "#2E4C9A"],
+                  [1, "#1B2973"],
+                ],
+            // colorbar: {
+            //   title: data.colorbartitle, // 色标标题
+            // },
+            size: new Array(data.xData.length).fill(6), // 初始点大小
+          },
+        };
+      } else if (this.chartType === "line") {
+        // 折线图
+        trace = {
+          x: data.xData,
+          y: data.yData,
+          mode: "lines",
+          type: "scattergl", // 折线图
+          text: data.engineName,
+          line: {
+            color: this.color1, // 使用自定义颜色
+          },
+        };
+      } else if (this.chartType === "bar") {
+        // 柱状图
+        trace = {
+          x: data.xData,
+          y: data.yData,
+          type: "bar", // 柱状图
+          marker: {
+            color: this.color1, // 使用自定义颜色
+          },
+        };
+      }
+      // 图表布局;
+      const layout = {
+        title: data.title,
+        xaxis: {
+          title: this.chartData.xaixs,
+        },
+        yaxis: {
+          title: this.chartData.yaixs,
+        },
+        showlegend: false,
+      };
+      const config = {
+        modeBarButtonsToAdd: [
+          {
+            name: "选择",
+            icon: Plotly.Icons.pencil,
+            click: (gd) => this.handleSelectClick(gd),
+          },
+          {
+            name: "清除选中",
+            icon: Plotly.Icons.undo,
+            click: (gd) => this.handleClearSelect(gd),
+          },
+          {
+            name: "下载CSV文件",
+            icon: Plotly.Icons.disk,
+            click: (gd) => this.handleDownloadCSV(gd),
+          },
+        ],
+        modeBarButtonsToRemove: [
+          // 移除不需要的工具按钮
+          "lasso2d",
+        ],
+        displaylogo: false,
+        editable: true,
+        scrollZoom: false,
+      };
+      // 使用 Plotly 绘制图表
+      Plotly.react(this.$refs.plotlyChart, [trace], layout, config).then(() => {
+        // 确保在图表加载完成后设置工具栏按钮
+        const plotElement = this.$refs.plotlyChart;
+        Plotly.relayout(plotElement, layout); // 使用 relayout 来确保自定义按钮应用
+      });
+    },
+
+    handleSelectClick(gd) {
+      // 绑定 plotly_click 事件
+      gd.on("plotly_click", (data) => {
+        const pointIndex = data.points[0].pointIndex;
+        const xClick = data.points[0].x;
+        const yClick = data.points[0].y;
+
+        // 将点击的点添加到选中的点数组
+        this.selectedPoints.push({
+          x: xClick, // 点击点的 x 坐标
+          y: yClick, // 点击点的 y 坐标
+          index: pointIndex, // 点击点的索引
+          time: data.points[0].text, // 点击点的时间信息
+        });
+
+        // 初始化颜色和大小数组
+        let newColors = [...this.originalColors];
+        let newSize = [...this.originalSizes];
+
+        // 如果选中的点数大于等于3,进行多边形选择区域的处理
+        if (this.selectedPoints.length >= 3) {
+          const xv = this.selectedPoints.map((p) => p.x);
+          const yv = this.selectedPoints.map((p) => p.y);
+
+          // 判断点是否在多边形内
+          function inPolygon(x, y, xv, yv) {
+            let inside = false;
+            for (let i = 0, j = xv.length - 1; i < xv.length; j = i++) {
+              const intersect =
+                yv[i] > y !== yv[j] > y &&
+                x < ((xv[j] - xv[i]) * (y - yv[i])) / (yv[j] - yv[i]) + xv[i];
+              if (intersect) inside = !inside;
+            }
+            return inside;
+          }
+
+          // 用于跟踪已添加的 (x, y) 组合
+          const addedPoints = {};
+
+          // 遍历图表数据中的所有点,检查是否在多边形内
+          gd.data[0].x.forEach((xVal, i) => {
+            const yVal = gd.data[0].y[i];
+            if (inPolygon(xVal, yVal, xv, yv)) {
+              const pointKey = `${xVal}-${yVal}`;
+              if (!addedPoints[pointKey]) {
+                this.selectedPoints.push({
+                  x: gd.data[0].x[i],
+                  y: gd.data[0].y[i],
+                  time: gd.data[0].text[i],
+                });
+
+                newColors[i] = "red"; // 高亮选择的点
+                newSize[i] = 10; // 设置点的大小
+                addedPoints[pointKey] = true;
+              }
+            }
+          });
+        }
+
+        // 更新选中点的颜色和大小
+        this.selectedPoints.forEach((point) => {
+          newColors[point.index] = "red";
+          newSize[point.index] = 10;
+        });
+
+        // 使用 Plotly.restyle 更新颜色和大小
+        Plotly.restyle(gd, {
+          "marker.color": [newColors],
+          "marker.size": [newSize],
+        });
+
+        // 处理选中的数据
+        this.getSelectData(this.selectedPoints, gd.layout);
+      });
+    },
+
+    handleClearSelect(gd) {
+      this.selectedPoints = [];
+      Plotly.restyle(gd, {
+        "marker.color": [this.originalColors],
+        "marker.size": [this.originalSizes],
+      });
+    },
+    getSelectData(selectedPoints, layout) {
+      // 在这里处理选中的数据,您可以将其展示或导出等
+      console.log("选中的点数据:", selectedPoints);
+      console.log("布局信息:", layout);
+    },
+    handleDownloadCSV(gd) {
+      if (this.selectedPoints.length === 0) {
+        alert("没有选中的数据");
+        return;
+      }
+      this.downloadCSV();
+    },
+
+    downloadCSV() {
+      const headers = [this.chartData.xaixs, this.chartData.yaixs];
+      const csvRows = [headers]; // 保存标头
+      // 使用 Set 或 Map 去重
+      const uniquePoints = [];
+      this.selectedPoints.forEach((point) => {
+        if (!uniquePoints.some((p) => p.x === point.x && p.y === point.y)) {
+          uniquePoints.push(point);
+        }
+      });
+
+      // 将去重后的点加入 CSV 数据
+      uniquePoints.forEach((point) => {
+        csvRows.push(`${point.x},${point.y}`);
+      });
+
+      const csvString = csvRows.join("\n");
+      const blob = new Blob([csvString], { type: "text/csv; charset=utf-8" });
+      const url = URL.createObjectURL(blob);
+      const a = document.createElement("a");
+      a.href = url;
+      a.download = "selected_data.csv";
+      a.click();
+      URL.revokeObjectURL(url);
+    },
+    setChartType(type) {
+      // 切换图表类型
+      this.chartType = type;
+      this.drawChart(); // 重新绘制图表
+    },
+
+    updateChartColor(color) {
+      // 更新图表颜色
+      this.color1 = color;
+      console.log(this.color1, "this.color1");
+      this.drawChart();
+    },
+  },
+};
+</script>
+
+<style scoped></style>

+ 2 - 2
vue.config.js

@@ -66,8 +66,8 @@ module.exports = {
         // target: "http://192.168.5.4:16200", // 石月
         // target: "http://192.168.50.235:16200", // 内网
         // target: "http://192.168.5.15:16200",
-        target: "http://192.168.50.235:16500", //演示环境
-        // target: "http://106.120.102.238:", //外网演示环境
+        // target: "http://192.168.50.235:16500", //演示环境
+        target: "http://106.120.102.238:26500", //外网演示环境
         // target: "http://106.120.102.238:16700", // 外网16700  生产16600
         // target: "http://10.96.137.5",
         changeOrigin: true,

+ 0 - 167
zzzz.json

@@ -1,167 +0,0 @@
-{
-  "analysisTypeCode": "叶尖速比时序分析",
-  "engineCode": "WEM00026",
-  "engineTypeName": "",
-  "xaixs": "时间",
-  "yaixs": "叶尖速比",
-  "data": [
-    {
-      "engineName": "#01",
-      "engineCode": "WOG00935",
-      "title": "机组-#01",
-      "xData": [
-        "2023-10-01",
-        "2023-10-01",
-        "2023-10-01",
-        "2023-10-02",
-        "2023-10-02",
-        "2023-10-02",
-        "2023-10-02",
-        "2023-10-02",
-        "2023-12-06",
-        "2023-12-06",
-        "2023-12-06",
-        "2023-12-06",
-        "2023-12-06",
-        "2023-12-31",
-        "2023-12-31",
-        "2023-12-31",
-        "2023-12-31",
-        "2023-12-31",
-        "2023-12-31"
-      ],
-      "yData": [
-        15.543049499999999, 13.862719824324321, 13.497911407894735,
-        14.247794979227915, 14.967381000000001, 12.827075038461539,
-        13.432265000000001
-      ],
-      "color": "lightgray",
-      "width": 2,
-      "type": "box_plot",
-      "medians": {
-        "x": [
-          "2023-10-01",
-          "2023-10-02",
-          "2023-10-03",
-          "2023-10-04",
-          "2023-10-05",
-          "2023-10-06",
-          "2023-10-07",
-          "2023-10-08",
-          "2023-10-09",
-          "2023-10-10",
-          "2023-10-11",
-          "2023-10-12",
-          "2023-10-13",
-          "2023-10-14",
-          "2023-10-15",
-          "2023-10-16",
-          "2023-10-17",
-          "2023-10-18",
-          "2023-10-19",
-          "2023-10-20",
-          "2023-10-21",
-          "2023-10-22",
-          "2023-10-23",
-          "2023-10-24",
-          "2023-10-25",
-          "2023-10-26",
-          "2023-10-27",
-          "2023-10-28",
-          "2023-10-29",
-          "2023-10-30",
-          "2023-10-31",
-          "2023-11-01",
-          "2023-11-02",
-          "2023-11-03",
-          "2023-11-04",
-          "2023-11-05",
-          "2023-11-06",
-          "2023-11-07",
-          "2023-11-08",
-          "2023-11-09",
-          "2023-11-10",
-          "2023-11-11",
-          "2023-11-12",
-          "2023-11-13",
-          "2023-11-14",
-          "2023-11-15",
-          "2023-11-16",
-          "2023-11-17",
-          "2023-11-18",
-          "2023-11-19",
-          "2023-11-20",
-          "2023-11-21",
-          "2023-11-22",
-          "2023-11-23",
-          "2023-11-24",
-          "2023-11-25",
-          "2023-11-26",
-          "2023-11-27",
-          "2023-11-28",
-          "2023-11-29",
-          "2023-11-30",
-          "2023-12-01",
-          "2023-12-02",
-          "2023-12-03",
-          "2023-12-04",
-          "2023-12-05",
-          "2023-12-06",
-          "2023-12-07",
-          "2023-12-08",
-          "2023-12-09",
-          "2023-12-10",
-          "2023-12-11",
-          "2023-12-12",
-          "2023-12-13",
-          "2023-12-14",
-          "2023-12-15",
-          "2023-12-16",
-          "2023-12-18",
-          "2023-12-19",
-          "2023-12-24",
-          "2023-12-25",
-          "2023-12-26",
-          "2023-12-27",
-          "2023-12-28",
-          "2023-12-29",
-          "2023-12-30",
-          "2023-12-31"
-        ],
-        "y": [
-          12.061625714285714, 12.395244357750359, 11.442673266175094,
-          10.36922885625, 11.26786431617647, 12.788870794117651,
-          11.760086202205983, 12.355811707317073, 11.887048926997425,
-          11.56872207295834, 12.827075038461539, 12.827075038461539,
-          11.671397888696765, 11.369452874999999, 11.667242439889808,
-          12.20136406097561, 11.633858755813954, 12.664707, 12.5063981625,
-          9.904450346153844, 11.961112166666664, 14.713409602941177,
-          13.520430445945946, 13.520430445945946, 13.164629644736843,
-          11.945121375, 13.164629644736843, 13.164629644736843,
-          12.536452761102844, 13.314179153846153, 12.827075038461539,
-          11.369452874999999, 13.164629644736843, 14.293026471428572,
-          13.520430445945946, 11.420851848214285, 10.97608045539225,
-          11.746974608695654, 12.08018303574669, 12.20136406097561,
-          13.520430445945946, 11.910854542081818, 11.209977141891892,
-          11.772826225352112, 12.26579435260202, 11.850547264285714,
-          8.194810411764706, 9.570488812499999, 11.45028304109589,
-          13.520430445945946, 13.324327156249998, 11.683638147887326,
-          11.547232852941178, 11.690498094778956, 11.8731628125,
-          11.50377658039225, 12.559168830392247, 11.814091821757081,
-          11.182666105361738, 12.199092772058824, 10.883732578125,
-          11.209977141891892, 13.691575135135134, 13.895997572333401,
-          13.164629644736843, 13.520430445945946, 11.418212162100799,
-          10.782115418918918, 10.472739292609424, 10.116320835365855,
-          10.659461724999998, 10.421998468750001, 9.713248529513232,
-          10.232523066441793, 8.379173986952123, 8.798638547368421,
-          6.52254407794278, 10.26608825, 10.1317656, 9.950841214285715,
-          10.403152178571428, 10.310370442307692, 12.5063981625, 12.5063981625,
-          11.116798366666666, 11.167968899999998, 10.4579787094475
-        ],
-        "mode": "markers",
-        "color": "orange",
-        "size": 3
-      }
-    }
-  ]
-}

BIN
归档.zip