瀏覽代碼

健康 合并提交

rui.jiang 1 月之前
父節點
當前提交
e2590a7218
共有 28 個文件被更改,包括 1134 次插入642 次删除
  1. 二進制
      downLoadServer/src/public/file/副本XXX风电场可靠性和能效双提升数据分析报告(模板).docx
  2. 二進制
      downLoadServer/src/public/file/副本XXX风电场可靠性和能效双提升数据分析报告(模板)副.docx
  3. 189 56
      downLoadServer/src/server/controllers/chartController.js
  4. 4 4
      downLoadServer/src/server/utils/chartsCom/3DDrawingChart.js
  5. 9 6
      downLoadServer/src/server/utils/chartsCom/Radar.js
  6. 1 1
      downLoadServer/src/server/utils/chartsCom/lineAndChildLine.js
  7. 146 4
      downLoadServer/src/server/utils/copyFileCsv.js
  8. 17 4
      src/App.vue
  9. 5 0
      src/store/settings.js
  10. 37 20
      src/views/overview/components/cp/index.vue
  11. 38 20
      src/views/overview/components/cp_windspeed/index.vue
  12. 5 2
      src/views/overview/components/data_integrity_minute/index.vue
  13. 9 34
      src/views/overview/components/temperature_environment/index.vue
  14. 37 19
      src/views/overview/components/temperature_large_components_Winding_tem/index.vue
  15. 37 20
      src/views/overview/components/temperature_large_components_adriven/index.vue
  16. 39 19
      src/views/overview/components/temperature_large_components_hig/index.vue
  17. 37 20
      src/views/overview/components/temperature_large_components_low/index.vue
  18. 38 19
      src/views/overview/components/temperature_large_components_mid/index.vue
  19. 39 19
      src/views/overview/components/temperature_large_components_min/index.vue
  20. 39 19
      src/views/overview/components/temperature_large_components_undriven/index.vue
  21. 32 17
      src/views/overview/components/tsr/index.vue
  22. 31 17
      src/views/overview/components/tsr_cp_power/index.vue
  23. 32 17
      src/views/overview/components/tsr_windspeed/index.vue
  24. 298 294
      src/views/performance/assetssMag.vue
  25. 3 3
      src/views/performance/components/chartsCom/3DDrawingChart.vue
  26. 7 3
      src/views/performance/components/chartsCom/BarChart.vue
  27. 2 2
      src/views/performance/components/chartsCom/lineAndChildLine.vue
  28. 3 3
      vue.config.js

二進制
downLoadServer/src/public/file/副本XXX风电场可靠性和能效双提升数据分析报告(模板).docx


二進制
downLoadServer/src/public/file/副本XXX风电场可靠性和能效双提升数据分析报告(模板)副.docx


+ 189 - 56
downLoadServer/src/server/controllers/chartController.js

@@ -60,7 +60,7 @@ const handleChartGeneration = async (
     } else {
       data = response.data;
     }
-    console.log(data, "  data");
+    // console.log(data, "  data");
 
     // 验证数据格式
     if (
@@ -81,7 +81,7 @@ const handleChartGeneration = async (
       fieldInfo,
       ...Object.values(additionalParams)
     );
-    console.log(imageUrl, "imageUrl");
+    // console.log(imageUrl, "imageUrl");
     successResponse(
       res,
       {
@@ -112,6 +112,102 @@ const handleChartGeneration = async (
  * @param {function} onParsed - 解析成功回调,返回解析后的数据
  * @param {function} onError - 出错时的回调
  */
+// const fetchCsvAndParse = async (
+//   req,
+//   res,
+//   onParsed,
+//   onError,
+//   successMessage,
+//   additionalParams = {}
+// ) => {
+//   try {
+//     const {
+//       fileAddr,
+//       bucketName,
+//       objectName,
+//       fieldInfo,
+//       chartType,
+//       engineTypeCode,
+//     } = req.body;
+//     if (!fileAddr) {
+//       return errorResponse(res, "缺少数据URL", 400);
+//     }
+
+//     const response = await axios.get(fileAddr, { responseType: "text" });
+//     const csvText = response.data;
+//     console.log(req.body, "req.body");
+//     Papa.parse(csvText, {
+//       header: true,
+//       complete: async (result) => {
+//         const data = result.data
+//           .filter((row) => Object.keys(row).length)
+//           .slice(0, result.data.length - 1);
+//         console.log(data, "csv data 数据");
+//         // 调用 onParsed 函数并确保只发送一次响应
+//         try {
+//           let imageUrl = "";
+//           let imageUrls = [];
+//           if (typeof onParsed === "function") {
+//             if (chartType === "radar") {
+//               const results = await Promise.all(
+//                 data &&
+//                   data.map((val) =>
+//                     onParsed(
+//                       val,
+//                       data,
+//                       bucketName,
+//                       objectName,
+//                       fieldInfo,
+//                       engineTypeCode,
+//                       additionalParams
+//                     ).catch((err) => {
+//                       console.error("getRadarCharts failed:", err);
+//                       return null;
+//                     })
+//                   )
+//               );
+//               imageUrls.push(...results); // 如果你还需要存入 imageUrls
+//               console.log(imageUrls, "img");
+//             } else {
+//               imageUrl = await onParsed(
+//                 data,
+//                 bucketName,
+//                 objectName,
+//                 fieldInfo,
+//                 additionalParams
+//               );
+//             }
+//           }
+//           successResponse(res, { data, imageUrl, imageUrls }, successMessage);
+//         } catch (error) {
+//           console.error("处理解析数据时出错:", error);
+//           errorResponse(res, "处理数据失败", 500);
+//         }
+//       },
+//       error: (error) => {
+//         console.error("CSV 解析错误:", error);
+//         if (onError) {
+//           onError(error);
+//         }
+//         errorResponse(res, "CSV 解析失败", 500); // 发送错误响应
+//       },
+//     });
+//   } catch (error) {
+//     console.error("获取 CSV 错误:", error);
+
+//     if (error.response) {
+//       errorResponse(
+//         res,
+//         `获取数据失败: ${error.response.status}`,
+//         error.response.status
+//       );
+//     } else {
+//       errorResponse(res, "获取 CSV 失败", 500);
+//     }
+//   }
+// };
+
+const text = () => {};
 const fetchCsvAndParse = async (
   req,
   res,
@@ -121,72 +217,48 @@ const fetchCsvAndParse = async (
   additionalParams = {}
 ) => {
   try {
-    const { fileAddr, bucketName, objectName, fieldInfo, chartType } = req.body;
+    const {
+      fileAddr,
+      bucketName,
+      objectName,
+      fieldInfo,
+      chartType,
+      engineTypeCode,
+    } = req.body;
     if (!fileAddr) {
       return errorResponse(res, "缺少数据URL", 400);
     }
 
     const response = await axios.get(fileAddr, { responseType: "text" });
     const csvText = response.data;
-    console.log(req.body, "req.body");
+
+    // ✅ 1. 调用 Papa.parse,complete 里只调用封装的 async 函数
     Papa.parse(csvText, {
       header: true,
-      complete: async (result) => {
-        const data = result.data
-          .filter((row) => Object.keys(row).length)
-          .slice(0, result.data.length - 1);
-        console.log(data, "csv data 数据");
-        // 调用 onParsed 函数并确保只发送一次响应
-        try {
-          let imageUrl = "";
-          let imageUrls = [];
-          if (typeof onParsed === "function") {
-            if (chartType === "radar") {
-              const results = await Promise.all(
-                data &&
-                  data.map((val) =>
-                    onParsed(
-                      val,
-                      data,
-                      bucketName,
-                      objectName,
-                      fieldInfo,
-                      additionalParams
-                    ).catch((err) => {
-                      console.error("getRadarCharts failed:", err);
-                      return null;
-                    })
-                  )
-              );
-              imageUrls.push(...results); // 如果你还需要存入 imageUrls
-              console.log(imageUrls, "img");
-            } else {
-              imageUrl = await onParsed(
-                data,
-                bucketName,
-                objectName,
-                fieldInfo,
-                additionalParams
-              );
-            }
-          }
-          successResponse(res, { data, imageUrl, imageUrls }, successMessage);
-        } catch (error) {
-          console.error("处理解析数据时出错:", error);
-          errorResponse(res, "处理数据失败", 500);
-        }
+      complete: (result) => {
+        // ⚠️ Papa 不会等待 async,这里显式处理异步
+        handleParsedResult(
+          result,
+          res,
+          onParsed,
+          onError,
+          successMessage,
+          bucketName,
+          objectName,
+          fieldInfo,
+          chartType,
+          engineTypeCode,
+          additionalParams
+        );
       },
       error: (error) => {
         console.error("CSV 解析错误:", error);
-        if (onError) {
-          onError(error);
-        }
-        errorResponse(res, "CSV 解析失败", 500); // 发送错误响应
+        if (onError) onError(error);
+        errorResponse(res, "CSV 解析失败", 500);
       },
     });
   } catch (error) {
     console.error("获取 CSV 错误:", error);
-
     if (error.response) {
       errorResponse(
         res,
@@ -198,6 +270,67 @@ const fetchCsvAndParse = async (
     }
   }
 };
+// ✅ 2. 封装为 async 函数,处理完再统一 successResponse
+const handleParsedResult = async (
+  result,
+  res,
+  onParsed,
+  onError,
+  successMessage,
+  bucketName,
+  objectName,
+  fieldInfo,
+  chartType,
+  engineTypeCode,
+  additionalParams
+) => {
+  const data = result.data
+    .filter((row) => Object.keys(row).length)
+    .slice(0, result.data.length - 1);
+
+  // console.log(data, "csv data 数据");
+
+  try {
+    let imageUrl = "";
+    let imageUrls = [];
+
+    if (typeof onParsed === "function") {
+      if (chartType === "radar") {
+        const results = await Promise.all(
+          data.map((val) =>
+            onParsed(
+              val,
+              data,
+              bucketName,
+              objectName,
+              fieldInfo,
+              engineTypeCode,
+              additionalParams
+            ).catch((err) => {
+              console.error("getRadarCharts failed:", err);
+              return null;
+            })
+          )
+        );
+        imageUrls.push(...results);
+        // console.log(imageUrls, "img");
+      } else {
+        imageUrl = await onParsed(
+          data,
+          bucketName,
+          objectName,
+          fieldInfo,
+          additionalParams
+        );
+      }
+    }
+
+    successResponse(res, { data, imageUrl, imageUrls }, successMessage);
+  } catch (error) {
+    console.error("处理解析数据时出错:", error);
+    errorResponse(res, "处理数据失败", 500);
+  }
+};
 
 export const createBarChart = async (req, res) => {
   await handleChartGeneration(req, res, generateBarChart, "柱状图生成成功");
@@ -342,7 +475,7 @@ export const createCopyFileCsv = async (req, res) => {
   let tempFilePath = null;
 
   try {
-    const { fieldInfo, bucketName, objectName } = req.body;
+    const { fieldInfo, bucketName, objectName, dataTime } = req.body;
 
     // 1. 参数验证
     if (!fieldInfo || !bucketName || !objectName) {
@@ -384,8 +517,8 @@ export const createCopyFileCsv = async (req, res) => {
     console.log("文件上传成功");
 
     // 4. 清理临时文件
-    await fs.unlink(tempFilePath).catch(console.error);
-    console.log("临时文件已清理");
+    // await fs.unlink(tempFilePath).catch(console.error);
+    // console.log("临时文件已清理");
 
     // 5. 返回成功响应
     res.json({

+ 4 - 4
downLoadServer/src/server/utils/chartsCom/3DDrawingChart.js

@@ -1,7 +1,7 @@
 /*
  * @Author: your name
  * @Date: 2025-04-14 16:09:13
- * @LastEditTime: 2025-05-26 10:55:37
+ * @LastEditTime: 2025-05-29 15:30:40
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /downLoadServer/src/server/utils/chartsCom/3DDrawingChart.js
@@ -78,7 +78,7 @@ export const generate3DDrawingChart = async (data, bucketName, objectName) => {
           xaxis: {
             gridcolor: "rgb(255,255,255)",
             tickcolor: "rgb(255,255,255)",
-            backgroundcolor: "#CFD4DC",
+            backgroundcolor: "#e0e7f1",
             showbackground: true,
             linecolor: "black", // 轴线颜色
             ticks: "outside", // 设置刻度线在轴线外
@@ -98,7 +98,7 @@ export const generate3DDrawingChart = async (data, bucketName, objectName) => {
             ticks: "outside",
             gridcolor: "rgb(255,255,255)",
             tickcolor: "rgb(255,255,255)",
-            backgroundcolor: "#CFD4DC",
+            backgroundcolor: "#e0e7f1",
             showbackground: true,
             tickcolor: "black",
             tickangle: 25,
@@ -109,7 +109,7 @@ export const generate3DDrawingChart = async (data, bucketName, objectName) => {
           zaxis: {
             gridcolor: "rgb(255,255,255)",
             tickcolor: "rgb(255,255,255)",
-            backgroundcolor: "#CFD4DC",
+            backgroundcolor: "#e0e7f1",
             showbackground: true,
             fixedrange: true, // 防止缩放
             linecolor: "black", // 轴线颜色

+ 9 - 6
downLoadServer/src/server/utils/chartsCom/Radar.js

@@ -30,7 +30,7 @@ const getHtmlContent = () => `
 <body>
   <div id="chart"></div>
   <script>
-    window.renderChart = function (chartData, itemCsvData) {
+    window.renderChart = function (chartData, itemCsvData,engineTypeCode) {
       function calcValues(data) {
         const matrix = data.map((item) => [
           item.TurbinePowerRate,
@@ -71,7 +71,7 @@ const getHtmlContent = () => `
       const chart = echarts.init(document.getElementById("chart"));
       chart.setOption({
         title: {
-          text: chartData.wind_turbine_name + "机组指标",
+          text:engineTypeCode+'机型'+ chartData.wind_turbine_name + "机组指标",
           left: "center",
         },
         radar: {
@@ -110,7 +110,9 @@ export const getRadarCharts = async (
   chartData,
   itemCsvData,
   bucketName,
-  objectName
+  objectName,
+  fieldInfo,
+  engineTypeCode
 ) => {
   const browser = await puppeteer.launch();
   const page = await browser.newPage();
@@ -129,11 +131,12 @@ export const getRadarCharts = async (
 
   // 调用渲染函数
   await page.evaluate(
-    (chartData, itemCsvData) => {
-      window.renderChart(chartData, itemCsvData);
+    (chartData, itemCsvData, engineTypeCode) => {
+      window.renderChart(chartData, itemCsvData, engineTypeCode);
     },
     chartData,
-    itemCsvData
+    itemCsvData,
+    engineTypeCode
   );
 
   // 再等待图表渲染完成(给 ECharts 时间)

+ 1 - 1
downLoadServer/src/server/utils/chartsCom/lineAndChildLine.js

@@ -51,7 +51,7 @@ export const generateLineAndChildLine = async (
     // 准备布局配置
     const layout = {
       title: {
-        text: chartData.title,
+        text: chartData.title || chartData.data[0].title,
         font: {
           size: 16,
           weight: "bold",

+ 146 - 4
downLoadServer/src/server/utils/copyFileCsv.js

@@ -4,7 +4,9 @@ import PizZip from "pizzip";
 import Docxtemplater from "docxtemplater";
 import { fileURLToPath } from "url";
 import ImageModule from "docxtemplater-image-module-free";
+import { exec } from "child_process";
 import axios from "axios";
+import { pathToFileURL } from "url";
 import sizeOf from "image-size";
 
 const __filename = fileURLToPath(import.meta.url);
@@ -15,7 +17,6 @@ const getImageFromUrl = async (url) => {
   if (typeof url !== "string") {
     throw new TypeError(`图片 URL 应为字符串,但实际是 ${typeof url}`);
   }
-
   if (url.startsWith("http")) {
     const safeUrl = url.replace(/#/g, "%23"); // 处理 URL 中的 #
     const response = await axios.get(safeUrl, { responseType: "arraybuffer" });
@@ -129,8 +130,6 @@ export const copyFileDocx = async (fieldInfo, chartsImages) => {
         imageTagData[tag] = []; // 或 throw error
       }
     }
-    console.log(chartsImages.rows, "chartsImages");
-
     const renderData = {
       Year_now: year,
       Month_now: month,
@@ -151,6 +150,134 @@ export const copyFileDocx = async (fieldInfo, chartsImages) => {
       windTurbineRows: chartsImages.windTurbineRows,
       faultRows: chartsImages.faultRows,
       yawErrorRows: chartsImages.yawErrorRows,
+      engineTypeList: chartsImages.engineTypeList,
+      dataTime: chartsImages.dataTime,
+      "show-zn-techcn-replace-tags-data_integrity_minute-generalFiles":
+        imageTagData[
+          "zn-techcn-replace-tags-data_integrity_minute-generalFiles"
+        ]
+          ? true
+          : false,
+      "show-zn-techcn-replace-tags-data_integrity_second-generalFiles":
+        imageTagData[
+          "zn-techcn-replace-tags-data_integrity_second-generalFiles"
+        ]
+          ? true
+          : false,
+      "show-zn-techcn-replace-tags-production_indicator_unit-generalFiles":
+        imageTagData[
+          "zn-techcn-replace-tags-production_indicator_unit-generalFiles"
+        ]
+          ? true
+          : false,
+      "show-zn-techcn-replace-tags-yaw_error-generalFiles1": imageTagData[
+        "zn-techcn-replace-tags-yaw_error-generalFiles1"
+      ]
+        ? true
+        : false,
+      "show-zn-techcn-replace-tags-yaw_error-diagramRelations": imageTagData[
+        "zn-techcn-replace-tags-yaw_error-diagramRelations"
+      ]
+        ? true
+        : false,
+      "show-zn-techcn-replace-tags-fault_all-generalFiles": imageTagData[
+        "zn-techcn-replace-tags-fault_all-generalFiles"
+      ]
+        ? true
+        : false,
+      "show-zn-techcn-replace-tags-temperature_large_components_hig-generalFiles":
+        imageTagData[
+          "zn-techcn-replace-tags-temperature_large_components_hig-generalFiles"
+        ]
+          ? true
+          : false,
+      "show-zn-techcn-replace-tags-temperature_large_components_low-generalFiles":
+        imageTagData[
+          "zn-techcn-replace-tags-temperature_large_components_low-generalFiles"
+        ]
+          ? true
+          : false,
+      "show-zn-techcn-replace-tags-temperature_large_components_adriven-generalFiles":
+        imageTagData[
+          "zn-techcn-replace-tags-temperature_large_components_adriven-generalFiles"
+        ]
+          ? true
+          : false,
+      "show-zn-techcn-replace-tags-temperature_large_components_undriven-generalFiles":
+        imageTagData[
+          "zn-techcn-replace-tags-temperature_large_components_undriven-generalFiles"
+        ]
+          ? true
+          : false,
+      "show-zn-techcn-replace-tags-temperature_large_components_tem_deviation-diagramRelations":
+        imageTagData[
+          "zn-techcn-replace-tags-temperature_large_components_tem_deviation-diagramRelations"
+        ]
+          ? true
+          : false,
+      "show-zn-techcn-replace-tags-pitch_generator_speed-diagramRelations":
+        imageTagData[
+          "zn-techcn-replace-tags-pitch_generator_speed-diagramRelations"
+        ]
+          ? true
+          : false,
+      "show-zn-techcn-replace-tags-power_curve-generalFiles": imageTagData[
+        "zn-techcn-replace-tags-power_curve-generalFiles"
+      ]
+        ? true
+        : false,
+      "show-zn-techcn-replace-tags-power_scatter_2D-diagramRelations":
+        imageTagData["zn-techcn-replace-tags-power_scatter_2D-diagramRelations"]
+          ? true
+          : false,
+      "show-zn-techcn-replace-tags-cp-generalFiles": imageTagData[
+        "zn-techcn-replace-tags-cp-generalFiles"
+      ]
+        ? true
+        : false,
+      "show-zn-techcn-replace-tags-cp_trend-diagramRelations": imageTagData[
+        "zn-techcn-replace-tags-cp_trend-diagramRelations"
+      ]
+        ? true
+        : false,
+      "show-zn-techcn-replace-tags-tsr-generalFiles": imageTagData[
+        "zn-techcn-replace-tags-tsr-generalFiles"
+      ]
+        ? true
+        : false,
+      "show-zn-techcn-replace-tags-tsr_trend-diagramRelations": imageTagData[
+        "zn-techcn-replace-tags-tsr_trend-diagramRelations"
+      ]
+        ? true
+        : false,
+      "show-zn-techcn-replace-tags-min_pitch-diagramRelations": imageTagData[
+        "zn-techcn-replace-tags-min_pitch-diagramRelations"
+      ]
+        ? true
+        : false,
+      "show-zn-techcn-replace-tags-power_curve-generalFiles": imageTagData[
+        "zn-techcn-replace-tags-power_curve-generalFiles"
+      ]
+        ? true
+        : false,
+      "show-zn-techcn-replace-tags-power_scatter_2D-diagramRelations":
+        imageTagData["zn-techcn-replace-tags-power_scatter_2D-diagramRelations"]
+          ? true
+          : false,
+      // "": imageTagData[""] ? true : false,
+      "show-zn-techcn-replace-tags-fault_all-generalFiles&show-zn-techcn-replace-tags-temperature_large_components_hig-generalFiles":
+        imageTagData["zn-techcn-replace-tags-fault_all-generalFiles"] &&
+        imageTagData[
+          "zn-techcn-replace-tags-temperature_large_components_hig-generalFiles"
+        ]
+          ? true
+          : false,
+      "show-zn-techcn-replace-tags-yaw_error_density-diagramRelations":
+        imageTagData[
+          "zn-techcn-replace-tags-yaw_error_density-diagramRelations"
+        ]
+          ? true
+          : false,
     };
 
     // 渲染 Word 模板
@@ -159,7 +286,7 @@ export const copyFileDocx = async (fieldInfo, chartsImages) => {
     // 保存生成的文档
     const buffer = doc.getZip().generate({ type: "nodebuffer" });
     await fs.writeFile(targetFilePath, buffer);
-
+    // const newFilePath = await updateTOCWithLibreOffice(targetFilePath);
     return {
       url: targetFilePath,
       message: `✅ 文档生成成功:${targetFilePath}`,
@@ -169,3 +296,18 @@ export const copyFileDocx = async (fieldInfo, chartsImages) => {
     throw error;
   }
 };
+export function updateTOCWithLibreOffice(docxPath) {
+  return new Promise((resolve, reject) => {
+    const fileUrl = pathToFileURL(docxPath).href;
+    const macroPath = `macro:///Standard.UpdateTOCModule.UpdateIndexes(\\"${fileUrl}\\")`;
+    const command = `soffice --headless "${macroPath}"`;
+
+    exec(command, (error, stdout, stderr) => {
+      if (error) {
+        reject(new Error(`宏执行失败: ${stderr || error.message}`));
+      } else {
+        resolve(docxPath); // 不附加 ✅ 文字,返回原始路径
+      }
+    });
+  });
+}

+ 17 - 4
src/App.vue

@@ -7,7 +7,7 @@
 </template>
 <script>
 // import "@/assets/style/index.css";
-
+import { mapMutations } from "vuex";
 export default {
   created() {},
 
@@ -16,7 +16,19 @@ export default {
       return this.$store.state.settings.loading;
     },
   },
-  methods: {},
+  mounted() {
+    const navType = window.performance?.navigation?.type;
+    if (navType === 1) {
+      console.log("🔄 用户刷新了页面");
+      this.setDownloadDisabled(false);
+      // 你可以执行你想要的逻辑,比如记录日志、恢复状态等
+    } else {
+      console.log("✅ 正常进入页面(非刷新)");
+    }
+  },
+  methods: {
+    ...mapMutations("settings", ["setDownloadDisabled"]),
+  },
 };
 </script>
 <style lang="scss">
@@ -43,7 +55,9 @@ body {
   display: none;
 }
 
-html, body, #app {
+html,
+body,
+#app {
   height: 100%;
   overflow: hidden;
   overflow-y: auto;
@@ -60,5 +74,4 @@ body::-webkit-scrollbar,
   width: 0;
   height: 0;
 }
-
 </style>

+ 5 - 0
src/store/settings.js

@@ -3,6 +3,7 @@ const state = {
   title: "",
   theme: storageSetting.theme || "#409EFF",
   loading: false,
+  downloadDisabled: false,
 };
 const mutations = {
   CHANGE_SETTING: (state, { key, value }) => {
@@ -13,6 +14,10 @@ const mutations = {
   changeLoading(state, { key, value }) {
     state.loading = value;
   },
+  setDownloadDisabled(state, value) {
+    console.log("调用disabled 设置", value);
+    state.downloadDisabled = value;
+  },
 };
 
 const actions = {

+ 37 - 20
src/views/overview/components/cp/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-09 18:05:58
- * @LastEditTime: 2025-03-21 14:38:49
+ * @LastEditTime: 2025-06-06 16:17:37
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/cp/index.vue
@@ -35,16 +35,25 @@
           Cp的分析也是监测风机性能的重要手段。如果Cp值出现异常下降,可能预示着机械故障、叶片磨损或其他维护需求。
         </div>
       </el-alert>
-
-      <div
-        class="titleCharts"
-        v-if="generalFilesDatas && generalFilesDatas.length > 0"
+      <VirtualList
+        :list="[...generalFilesDatas, ...diagramRelationsDatas]"
+        keyField="fileAddr"
+        :itemSize="500"
+        v-slot="{ item, index }"
       >
-        分析总图 :
-      </div>
-      <el-empty description="暂无分析记录" v-else></el-empty>
-      <div v-for="(item, index) in generalFilesDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            generalFilesDatas &&
+            generalFilesDatas.length > 0 &&
+            item.engineTypeCode &&
+            generalFilesDatas[0].engineTypeCode === item.engineTypeCode
+          "
+        >
+          分析总图 :
+        </div>
         <lineAndChildLine
+          v-if="item.batchCode && !item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="`${new Date().getTime()}` + item.batchCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -52,16 +61,19 @@
           :fileAddr="item.fileAddr"
         >
         </lineAndChildLine>
-      </div>
-      <div
-        class="titleCharts"
-        v-if="diagramRelationsDatas && diagramRelationsDatas.length > 0"
-      >
-        分析分图 :
-      </div>
-      <el-empty description="暂无分析记录" v-else></el-empty>
-      <div v-for="(item, index) in diagramRelationsDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            diagramRelationsDatas &&
+            diagramRelationsDatas.length > 0 &&
+            item.fieldEngineCode &&
+            diagramRelationsDatas[0].fieldEngineCode === item.fieldEngineCode
+          "
+        >
+          分析分图 :
+        </div>
         <lineChartsFen
+          v-if="item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="`${new Date().getTime()}` + item.fieldEngineCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -70,8 +82,13 @@
           :fileAddr="item.fileAddr"
         >
         </lineChartsFen>
-      </div>
-
+      </VirtualList>
+      <el-empty
+        description="暂无分析记录"
+        v-if="
+          generalFilesDatas.length === 0 && diagramRelationsDatas.length === 0
+        "
+      ></el-empty>
       <el-dialog
         v-if="isShowDescription"
         title="添加评论"

+ 38 - 20
src/views/overview/components/cp_windspeed/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-09 18:08:00
- * @LastEditTime: 2025-03-21 14:39:04
+ * @LastEditTime: 2025-06-06 16:16:55
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/cp_windspeed/index.vue
@@ -35,16 +35,25 @@
           Cp的分析也是监测风机性能的重要手段。如果Cp值出现异常下降,可能预示着机械故障、叶片磨损或其他维护需求。
         </div>
       </el-alert>
-
-      <div
-        class="titleCharts"
-        v-if="generalFilesDatas && generalFilesDatas.length > 0"
+      <VirtualList
+        :list="[...generalFilesDatas, ...diagramRelationsDatas]"
+        keyField="fileAddr"
+        :itemSize="500"
+        v-slot="{ item, index }"
       >
-        分析总图 :
-      </div>
-      <el-empty description="暂无分析记录" v-else></el-empty>
-      <div v-for="(item, index) in generalFilesDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            generalFilesDatas &&
+            generalFilesDatas.length > 0 &&
+            item.engineTypeCode &&
+            generalFilesDatas[0].engineTypeCode === item.engineTypeCode
+          "
+        >
+          分析总图 :
+        </div>
         <lineAndChildLine
+          v-if="item.batchCode && !item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.batchCode + index"
           :index="`${new Date().getTime()}` + index + item.batchCode"
@@ -52,16 +61,20 @@
           :fileAddr="item.fileAddr"
         >
         </lineAndChildLine>
-      </div>
-      <div
-        class="titleCharts"
-        v-if="diagramRelationsDatas && diagramRelationsDatas.length > 0"
-      >
-        分析分图 :
-      </div>
-      <el-empty description="暂无分析记录" v-else></el-empty>
-      <div v-for="(item, index) in diagramRelationsDatas">
+
+        <div
+          class="titleCharts"
+          v-if="
+            diagramRelationsDatas &&
+            diagramRelationsDatas.length > 0 &&
+            item.fieldEngineCode &&
+            diagramRelationsDatas[0].fieldEngineCode === item.fieldEngineCode
+          "
+        >
+          分析分图 :
+        </div>
         <lineChartsFen
+          v-if="item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.fieldEngineCode + index"
           :index="`${new Date().getTime()}` + index + item.fieldEngineCode"
@@ -70,8 +83,13 @@
           :fileAddr="item.fileAddr"
         >
         </lineChartsFen>
-      </div>
-
+      </VirtualList>
+      <el-empty
+        description="暂无分析记录"
+        v-if="
+          generalFilesDatas.length === 0 && diagramRelationsDatas.length === 0
+        "
+      ></el-empty>
       <el-dialog
         v-if="isShowDescription"
         title="添加评论"

+ 5 - 2
src/views/overview/components/data_integrity_minute/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-09 17:54:02
- * @LastEditTime: 2025-04-11 16:48:19
+ * @LastEditTime: 2025-06-06 16:18:38
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/data_integrity_minute/index.vue
@@ -48,7 +48,10 @@
           ></HeatmapCharts>
         </div>
       </template>
-      <el-empty description="暂无分析记录" v-else></el-empty>
+      <el-empty
+        description="暂无分析记录"
+        v-if="generalFilesDatas.length === 0"
+      ></el-empty>
       <el-dialog
         v-if="isShowDescription"
         title="添加评论"

+ 9 - 34
src/views/overview/components/temperature_environment/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-10 09:09:46
- * @LastEditTime: 2025-02-26 11:21:52
+ * @LastEditTime: 2025-06-06 16:31:24
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/temperature_environment/index.vue
@@ -32,7 +32,6 @@
           将温度传感器的性能与绝对温度以及相对于风场其他传感器的变化进行比较,以检测机组环境温度传感器的性能。主要检查机组温度值的平均值,并比较每台机组的温度值和周围机组(10倍叶轮直径范围内)的温度均值,输出每台机组和其周围机组的温度差值,正常范围设定为±5℃。如下图所示。
         </div>
       </el-alert>
-
       <div
         class="titleCharts"
         v-if="generalFilesDatas && generalFilesDatas.length > 0"
@@ -40,7 +39,12 @@
         分析总图 :
       </div>
       <el-empty description="暂无分图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in generalFilesDatas">
+      <VirtualList
+        :list="[...generalFilesDatas]"
+        keyField="fileAddr"
+        :itemSize="500"
+        v-slot="{ item, index }"
+      >
         <BarChart
           :setUpImgData="setUpImgData"
           :key="`${new Date().getTime()}` + item.batchCode + index"
@@ -49,37 +53,8 @@
           :fileAddr="item.fileAddr"
         >
         </BarChart>
-      </div>
-      <!-- <VirtualList
-        :list="generalFilesDatas"
-        keyField="batchCode"
-        :itemSize="452"
-        v-slot="{ item, index }"
-      >
-      </VirtualList> -->
-      <!-- <div
-        class="titleCharts"
-        v-if="diagramRelationsDatas && diagramRelationsDatas.length > 0"
-      >
-        分析分图 :
-      </div>
-      <el-empty description="暂无分图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in diagramRelationsDatas">
-        <BarChart
-          :key="item.fieldEngineCode + index"
-          :inds="index"
-          :ref="item.fieldEngineCode"
-          :fileAddr="item.fileAddr"
-        >
-        </BarChart>
-      </div> -->
-      <!-- <VirtualList
-        :list="diagramRelationsDatas"
-        keyField="fieldEngineCode"
-        :itemSize="452"
-        v-slot="{ item, index }"
-      >
-      </VirtualList> -->
+      </VirtualList>
+
       <el-dialog
         v-if="isShowDescription"
         title="添加评论"

+ 37 - 19
src/views/overview/components/temperature_large_components_Winding_tem/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-21 10:04:11
- * @LastEditTime: 2025-02-26 11:23:49
+ * @LastEditTime: 2025-06-06 17:06:39
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/temperature_large_components_Winding_tem/index.vue
@@ -44,16 +44,25 @@
           温度分析是实现预测性维护的关键。通过持续监测温度变化和趋势,可以预测何时部件可能会出现问题,从而在故障发生前进行维修或更换,减少意外停机。
         </div>
       </el-alert>
-
-      <div
-        class="titleCharts"
-        v-if="generalFilesDatas && generalFilesDatas.length > 0"
+      <VirtualList
+        :list="[...generalFilesDatas, ...diagramRelationsDatas]"
+        keyField="fileAddr"
+        :itemSize="500"
+        v-slot="{ item, index }"
       >
-        分析总图 :
-      </div>
-      <el-empty description="暂无总图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in generalFilesDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            generalFilesDatas &&
+            generalFilesDatas.length > 0 &&
+            item.engineTypeCode &&
+            generalFilesDatas[0].engineTypeCode === item.engineTypeCode
+          "
+        >
+          分析总图 :
+        </div>
         <lineAndChildLine
+          v-if="item.batchCode && !item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.batchCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -61,16 +70,19 @@
           :fileAddr="item.fileAddr"
         >
         </lineAndChildLine>
-      </div>
-      <div
-        class="titleCharts"
-        v-if="diagramRelationsDatas && diagramRelationsDatas.length > 0"
-      >
-        分析分图 :
-      </div>
-      <el-empty description="暂无分图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in diagramRelationsDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            diagramRelationsDatas &&
+            diagramRelationsDatas.length > 0 &&
+            item.fieldEngineCode &&
+            diagramRelationsDatas[0].fieldEngineCode === item.fieldEngineCode
+          "
+        >
+          分析分图 :
+        </div>
         <lineChartsFen
+          v-if="item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.fieldEngineCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -79,7 +91,13 @@
           :fileAddr="item.fileAddr"
         >
         </lineChartsFen>
-      </div>
+      </VirtualList>
+      <el-empty
+        description="暂无分析记录"
+        v-if="
+          generalFilesDatas.length === 0 && diagramRelationsDatas.length === 0
+        "
+      ></el-empty>
       <el-dialog
         v-if="isShowDescription"
         title="添加评论"

+ 37 - 20
src/views/overview/components/temperature_large_components_adriven/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-21 10:01:52
- * @LastEditTime: 2025-03-21 14:40:48
+ * @LastEditTime: 2025-06-06 16:41:12
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/temperature_large_components_adriven/index.vue
@@ -44,16 +44,25 @@
           温度分析是实现预测性维护的关键。通过持续监测温度变化和趋势,可以预测何时部件可能会出现问题,从而在故障发生前进行维修或更换,减少意外停机。
         </div>
       </el-alert>
-
-      <div
-        class="titleCharts"
-        v-if="generalFilesDatas && generalFilesDatas.length > 0"
+      <VirtualList
+        :list="[...generalFilesDatas, ...diagramRelationsDatas]"
+        keyField="fileAddr"
+        :itemSize="500"
+        v-slot="{ item, index }"
       >
-        分析总图 :
-      </div>
-      <el-empty description="暂无总图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in generalFilesDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            generalFilesDatas &&
+            generalFilesDatas.length > 0 &&
+            item.engineTypeCode &&
+            generalFilesDatas[0].engineTypeCode === item.engineTypeCode
+          "
+        >
+          分析总图 :
+        </div>
         <lineAndChildLine
+          v-if="item.batchCode && !item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.batchCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -61,17 +70,19 @@
           :fileAddr="item.fileAddr"
         >
         </lineAndChildLine>
-      </div>
-
-      <div
-        class="titleCharts"
-        v-if="diagramRelationsDatas && diagramRelationsDatas.length > 0"
-      >
-        分析分图 :
-      </div>
-      <el-empty description="暂无分图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in diagramRelationsDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            diagramRelationsDatas &&
+            diagramRelationsDatas.length > 0 &&
+            item.fieldEngineCode &&
+            diagramRelationsDatas[0].fieldEngineCode === item.fieldEngineCode
+          "
+        >
+          分析分图 :
+        </div>
         <lineChartsFen
+          v-if="item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.fieldEngineCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -80,7 +91,13 @@
           :fileAddr="item.fileAddr"
         >
         </lineChartsFen>
-      </div>
+      </VirtualList>
+      <el-empty
+        description="暂无分析记录"
+        v-if="
+          generalFilesDatas.length === 0 && diagramRelationsDatas.length === 0
+        "
+      ></el-empty>
       <el-dialog
         v-if="isShowDescription"
         title="添加评论"

+ 39 - 19
src/views/overview/components/temperature_large_components_hig/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-21 09:58:32
- * @LastEditTime: 2025-02-26 11:22:30
+ * @LastEditTime: 2025-06-06 16:44:37
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/temperature_large_components_hig/index.vue
@@ -44,16 +44,26 @@
           温度分析是实现预测性维护的关键。通过持续监测温度变化和趋势,可以预测何时部件可能会出现问题,从而在故障发生前进行维修或更换,减少意外停机。
         </div>
       </el-alert>
-
-      <div
-        class="titleCharts"
-        v-if="generalFilesDatas && generalFilesDatas.length > 0"
+      <VirtualList
+        :list="[...generalFilesDatas, ...diagramRelationsDatas]"
+        keyField="fileAddr"
+        :itemSize="500"
+        v-slot="{ item, index }"
       >
-        分析总图 :
-      </div>
-      <el-empty description="暂无总图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in generalFilesDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            generalFilesDatas &&
+            generalFilesDatas.length > 0 &&
+            item.engineTypeCode &&
+            generalFilesDatas[0].engineTypeCode === item.engineTypeCode
+          "
+        >
+          分析总图 :
+        </div>
+
         <lineAndChildLine
+          v-if="item.batchCode && !item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.batchCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -61,17 +71,21 @@
           :fileAddr="item.fileAddr"
         >
         </lineAndChildLine>
-      </div>
 
-      <div
-        class="titleCharts"
-        v-if="diagramRelationsDatas && diagramRelationsDatas.length > 0"
-      >
-        分析分图 :
-      </div>
-      <el-empty description="暂无分图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in diagramRelationsDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            diagramRelationsDatas &&
+            diagramRelationsDatas.length > 0 &&
+            item.fieldEngineCode &&
+            diagramRelationsDatas[0].fieldEngineCode === item.fieldEngineCode
+          "
+        >
+          分析分图 :
+        </div>
+
         <lineChartsFen
+          v-if="item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.fieldEngineCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -80,7 +94,13 @@
           :fileAddr="item.fileAddr"
         >
         </lineChartsFen>
-      </div>
+      </VirtualList>
+      <el-empty
+        description="暂无分析记录"
+        v-if="
+          generalFilesDatas.length === 0 && diagramRelationsDatas.length === 0
+        "
+      ></el-empty>
       <el-dialog
         v-if="isShowDescription"
         title="添加评论"

+ 37 - 20
src/views/overview/components/temperature_large_components_low/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-21 10:00:25
- * @LastEditTime: 2025-03-21 14:40:59
+ * @LastEditTime: 2025-06-06 16:47:28
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/temperature_large_components_low/index.vue
@@ -44,16 +44,25 @@
           温度分析是实现预测性维护的关键。通过持续监测温度变化和趋势,可以预测何时部件可能会出现问题,从而在故障发生前进行维修或更换,减少意外停机。
         </div>
       </el-alert>
-
-      <div
-        class="titleCharts"
-        v-if="generalFilesDatas && generalFilesDatas.length > 0"
+      <VirtualList
+        :list="[...generalFilesDatas, ...diagramRelationsDatas]"
+        keyField="fileAddr"
+        :itemSize="500"
+        v-slot="{ item, index }"
       >
-        分析总图 :
-      </div>
-      <el-empty description="暂无总图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in generalFilesDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            generalFilesDatas &&
+            generalFilesDatas.length > 0 &&
+            item.engineTypeCode &&
+            generalFilesDatas[0].engineTypeCode === item.engineTypeCode
+          "
+        >
+          分析总图 :
+        </div>
         <lineAndChildLine
+          v-if="item.batchCode && !item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.batchCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -61,17 +70,19 @@
           :fileAddr="item.fileAddr"
         >
         </lineAndChildLine>
-      </div>
-
-      <div
-        class="titleCharts"
-        v-if="diagramRelationsDatas && diagramRelationsDatas.length > 0"
-      >
-        分析分图 :
-      </div>
-      <el-empty description="暂无分图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in diagramRelationsDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            diagramRelationsDatas &&
+            diagramRelationsDatas.length > 0 &&
+            item.fieldEngineCode &&
+            diagramRelationsDatas[0].fieldEngineCode === item.fieldEngineCode
+          "
+        >
+          分析分图 :
+        </div>
         <lineChartsFen
+          v-if="item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.fieldEngineCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -80,7 +91,13 @@
           :fileAddr="item.fileAddr"
         >
         </lineChartsFen>
-      </div>
+      </VirtualList>
+      <el-empty
+        description="暂无分析记录"
+        v-if="
+          generalFilesDatas.length === 0 && diagramRelationsDatas.length === 0
+        "
+      ></el-empty>
       <el-dialog
         v-if="isShowDescription"
         title="添加评论"

+ 38 - 19
src/views/overview/components/temperature_large_components_mid/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-21 09:59:43
- * @LastEditTime: 2025-04-11 16:52:48
+ * @LastEditTime: 2025-06-06 16:51:03
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/temperature_large_components_mid/index.vue
@@ -44,16 +44,25 @@
           温度分析是实现预测性维护的关键。通过持续监测温度变化和趋势,可以预测何时部件可能会出现问题,从而在故障发生前进行维修或更换,减少意外停机。
         </div>
       </el-alert>
-
-      <div
-        class="titleCharts"
-        v-if="generalFilesDatas && generalFilesDatas.length > 0"
+      <VirtualList
+        :list="[...generalFilesDatas, ...diagramRelationsDatas]"
+        keyField="fileAddr"
+        :itemSize="500"
+        v-slot="{ item, index }"
       >
-        分析总图 :
-      </div>
-      <el-empty description="暂无总图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in generalFilesDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            generalFilesDatas &&
+            generalFilesDatas.length > 0 &&
+            item.engineTypeCode &&
+            generalFilesDatas[0].engineTypeCode === item.engineTypeCode
+          "
+        >
+          分析总图 :
+        </div>
         <lineAndChildLine
+          v-if="item.batchCode && !item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.batchCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -61,17 +70,21 @@
           :fileAddr="item.fileAddr"
         >
         </lineAndChildLine>
-      </div>
 
-      <div
-        class="titleCharts"
-        v-if="diagramRelationsDatas && diagramRelationsDatas.length > 0"
-      >
-        分析分图 :
-      </div>
-      <el-empty description="暂无分图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in diagramRelationsDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            diagramRelationsDatas &&
+            diagramRelationsDatas.length > 0 &&
+            item.fieldEngineCode &&
+            diagramRelationsDatas[0].fieldEngineCode === item.fieldEngineCode
+          "
+        >
+          分析分图 :
+        </div>
+
         <lineChartsFen
+          v-if="item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.fieldEngineCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -80,7 +93,13 @@
           :fileAddr="item.fileAddr"
         >
         </lineChartsFen>
-      </div>
+      </VirtualList>
+      <el-empty
+        description="暂无分析记录"
+        v-if="
+          generalFilesDatas.length === 0 && diagramRelationsDatas.length === 0
+        "
+      ></el-empty>
       <el-dialog
         v-if="isShowDescription"
         title="添加评论"

+ 39 - 19
src/views/overview/components/temperature_large_components_min/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-21 10:01:06
- * @LastEditTime: 2025-03-21 14:41:08
+ * @LastEditTime: 2025-06-06 16:56:38
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/temperature_large_components_min/index.vue
@@ -44,16 +44,26 @@
           温度分析是实现预测性维护的关键。通过持续监测温度变化和趋势,可以预测何时部件可能会出现问题,从而在故障发生前进行维修或更换,减少意外停机。
         </div>
       </el-alert>
-
-      <div
-        class="titleCharts"
-        v-if="generalFilesDatas && generalFilesDatas.length > 0"
+      <VirtualList
+        :list="[...generalFilesDatas, ...diagramRelationsDatas]"
+        keyField="fileAddr"
+        :itemSize="500"
+        v-slot="{ item, index }"
       >
-        分析总图 :
-      </div>
-      <el-empty description="暂无总图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in generalFilesDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            generalFilesDatas &&
+            generalFilesDatas.length > 0 &&
+            item.engineTypeCode &&
+            generalFilesDatas[0].engineTypeCode === item.engineTypeCode
+          "
+        >
+          分析总图 :
+        </div>
+
         <lineAndChildLine
+          v-if="item.batchCode && !item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.batchCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -61,17 +71,21 @@
           :fileAddr="item.fileAddr"
         >
         </lineAndChildLine>
-      </div>
 
-      <div
-        class="titleCharts"
-        v-if="diagramRelationsDatas && diagramRelationsDatas.length > 0"
-      >
-        分析分图 :
-      </div>
-      <el-empty description="暂无分图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in diagramRelationsDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            diagramRelationsDatas &&
+            diagramRelationsDatas.length > 0 &&
+            item.fieldEngineCode &&
+            diagramRelationsDatas[0].fieldEngineCode === item.fieldEngineCode
+          "
+        >
+          分析分图 :
+        </div>
+
         <lineChartsFen
+          v-if="item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.fieldEngineCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -80,7 +94,13 @@
           :fileAddr="item.fileAddr"
         >
         </lineChartsFen>
-      </div>
+      </VirtualList>
+      <el-empty
+        description="暂无分析记录"
+        v-if="
+          generalFilesDatas.length === 0 && diagramRelationsDatas.length === 0
+        "
+      ></el-empty>
       <el-dialog
         v-if="isShowDescription"
         title="添加评论"

+ 39 - 19
src/views/overview/components/temperature_large_components_undriven/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-21 10:02:36
- * @LastEditTime: 2025-03-21 14:41:17
+ * @LastEditTime: 2025-06-06 17:02:14
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/temperature_large_components_undriven/index.vue
@@ -44,16 +44,26 @@
           温度分析是实现预测性维护的关键。通过持续监测温度变化和趋势,可以预测何时部件可能会出现问题,从而在故障发生前进行维修或更换,减少意外停机。
         </div>
       </el-alert>
-
-      <div
-        class="titleCharts"
-        v-if="generalFilesDatas && generalFilesDatas.length > 0"
+      <VirtualList
+        :list="[...generalFilesDatas, ...diagramRelationsDatas]"
+        keyField="fileAddr"
+        :itemSize="500"
+        v-slot="{ item, index }"
       >
-        分析总图 :
-      </div>
-      <el-empty description="暂无总图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in generalFilesDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            generalFilesDatas &&
+            generalFilesDatas.length > 0 &&
+            item.engineTypeCode &&
+            generalFilesDatas[0].engineTypeCode === item.engineTypeCode
+          "
+        >
+          分析总图 :
+        </div>
+
         <lineAndChildLine
+          v-if="item.batchCode && !item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.batchCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -61,17 +71,21 @@
           :fileAddr="item.fileAddr"
         >
         </lineAndChildLine>
-      </div>
 
-      <div
-        class="titleCharts"
-        v-if="diagramRelationsDatas && diagramRelationsDatas.length > 0"
-      >
-        分析分图 :
-      </div>
-      <el-empty description="暂无分图分析记录" v-else></el-empty>
-      <div v-for="(item, index) in diagramRelationsDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            diagramRelationsDatas &&
+            diagramRelationsDatas.length > 0 &&
+            item.fieldEngineCode &&
+            diagramRelationsDatas[0].fieldEngineCode === item.fieldEngineCode
+          "
+        >
+          分析分图 :
+        </div>
+
         <lineChartsFen
+          v-if="item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.fieldEngineCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -80,7 +94,13 @@
           :fileAddr="item.fileAddr"
         >
         </lineChartsFen>
-      </div>
+      </VirtualList>
+      <el-empty
+        description="暂无分析记录"
+        v-if="
+          generalFilesDatas.length === 0 && diagramRelationsDatas.length === 0
+        "
+      ></el-empty>
       <el-dialog
         v-if="isShowDescription"
         title="添加评论"

+ 32 - 17
src/views/overview/components/tsr/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-10 09:10:11
- * @LastEditTime: 2025-03-21 14:41:29
+ * @LastEditTime: 2025-06-06 17:10:03
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/tsr/index.vue
@@ -32,15 +32,25 @@
           叶尖速比的分析对于理解和优化风力发电机组的性能至关重要:叶尖速比直接影响风轮的空气动力学效率。一个合适的叶尖速比可以确保风轮以最高效率捕获风能。过高的叶尖速比可能会导致叶片承受过大的离心力和动态压力,从而增加机械负荷。通过监测和调整叶尖速比,可以防止过度磨损和损坏。
         </div>
       </el-alert>
-
-      <div
-        class="titleCharts"
-        v-if="generalFilesDatas && generalFilesDatas.length > 0"
+      <VirtualList
+        :list="[...generalFilesDatas, ...diagramRelationsDatas]"
+        keyField="fileAddr"
+        :itemSize="500"
+        v-slot="{ item, index }"
       >
-        分析总图 :
-      </div>
-      <div v-for="(item, index) in generalFilesDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            generalFilesDatas &&
+            generalFilesDatas.length > 0 &&
+            item.engineTypeCode &&
+            generalFilesDatas[0].engineTypeCode === item.engineTypeCode
+          "
+        >
+          分析总图 :
+        </div>
         <lineAndChildLine
+          v-if="item.batchCode && !item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.batchCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -48,15 +58,19 @@
           :fileAddr="item.fileAddr"
         >
         </lineAndChildLine>
-      </div>
-      <div
-        class="titleCharts"
-        v-if="diagramRelationsDatas && diagramRelationsDatas.length > 0"
-      >
-        分析分图 :
-      </div>
-      <div v-for="(item, index) in diagramRelationsDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            diagramRelationsDatas &&
+            diagramRelationsDatas.length > 0 &&
+            item.fieldEngineCode &&
+            diagramRelationsDatas[0].fieldEngineCode === item.fieldEngineCode
+          "
+        >
+          分析分图 :
+        </div>
         <lineChartsFen
+          v-if="item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.fieldEngineCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -65,13 +79,14 @@
           :fileAddr="item.fileAddr"
         >
         </lineChartsFen>
-      </div>
+      </VirtualList>
       <el-empty
         description="暂无分析记录"
         v-if="
           generalFilesDatas.length === 0 && diagramRelationsDatas.length === 0
         "
       ></el-empty>
+
       <el-dialog
         v-if="isShowDescription"
         title="添加评论"

+ 31 - 17
src/views/overview/components/tsr_cp_power/index.vue

@@ -1,12 +1,11 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-10 09:10:24
- * @LastEditTime: 2025-03-19 15:57:47
+ * @LastEditTime: 2025-06-06 16:03:20
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/tsr_cp_power/index.vue
 -->
-
 <template>
   <div class="type-variable">
     <!-- 叶尖速比-风能利用系数-功率分析 -->
@@ -34,14 +33,25 @@
         </div>
       </el-alert>
 
-      <div
-        class="titleCharts"
-        v-if="generalFilesDatas && generalFilesDatas.length > 0"
+      <VirtualList
+        :list="[...generalFilesDatas, ...diagramRelationsDatas]"
+        keyField="fileAddr"
+        :itemSize="500"
+        v-slot="{ item, index }"
       >
-        分析总图 :
-      </div>
-      <div v-for="(item, index) in generalFilesDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            generalFilesDatas &&
+            generalFilesDatas.length > 0 &&
+            item.engineTypeCode &&
+            generalFilesDatas[0].engineTypeCode === item.engineTypeCode
+          "
+        >
+          分析总图 :
+        </div>
         <lineAndChildLine
+          v-if="item.batchCode && !item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.batchCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -49,15 +59,19 @@
           :fileAddr="item.fileAddr"
         >
         </lineAndChildLine>
-      </div>
-      <div
-        class="titleCharts"
-        v-if="diagramRelationsDatas && diagramRelationsDatas.length > 0"
-      >
-        分析分图 :
-      </div>
-      <div v-for="(item, index) in diagramRelationsDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            diagramRelationsDatas &&
+            diagramRelationsDatas.length > 0 &&
+            item.fieldEngineCode &&
+            diagramRelationsDatas[0].fieldEngineCode === item.fieldEngineCode
+          "
+        >
+          分析分图 :
+        </div>
         <lineChartsFen
+          v-if="item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.fieldEngineCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -66,7 +80,7 @@
           :fileAddr="item.fileAddr"
         >
         </lineChartsFen>
-      </div>
+      </VirtualList>
       <el-empty
         description="暂无分析记录"
         v-if="

+ 32 - 17
src/views/overview/components/tsr_windspeed/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-10 09:10:59
- * @LastEditTime: 2025-03-21 14:41:49
+ * @LastEditTime: 2025-06-06 16:06:26
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/tsr_windspeed/index.vue
@@ -32,15 +32,25 @@
           叶尖速比的分析对于理解和优化风力发电机组的性能至关重要:叶尖速比直接影响风轮的空气动力学效率。一个合适的叶尖速比可以确保风轮以最高效率捕获风能。过高的叶尖速比可能会导致叶片承受过大的离心力和动态压力,从而增加机械负荷。通过监测和调整叶尖速比,可以防止过度磨损和损坏。
         </div>
       </el-alert>
-
-      <div
-        class="titleCharts"
-        v-if="generalFilesDatas && generalFilesDatas.length > 0"
+      <VirtualList
+        :list="[...generalFilesDatas, ...diagramRelationsDatas]"
+        keyField="fileAddr"
+        :itemSize="500"
+        v-slot="{ item, index }"
       >
-        分析总图 :
-      </div>
-      <div v-for="(item, index) in generalFilesDatas">
+        <div
+          class="titleCharts"
+          v-if="
+            generalFilesDatas &&
+            generalFilesDatas.length > 0 &&
+            item.engineTypeCode &&
+            generalFilesDatas[0].engineTypeCode === item.engineTypeCode
+          "
+        >
+          分析总图 :
+        </div>
         <lineAndChildLine
+          v-if="item.batchCode && !item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.batchCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -48,15 +58,20 @@
           :fileAddr="item.fileAddr"
         >
         </lineAndChildLine>
-      </div>
-      <div
-        class="titleCharts"
-        v-if="diagramRelationsDatas && diagramRelationsDatas.length > 0"
-      >
-        分析分图 :
-      </div>
-      <div v-for="(item, index) in diagramRelationsDatas">
+
+        <div
+          class="titleCharts"
+          v-if="
+            diagramRelationsDatas &&
+            diagramRelationsDatas.length > 0 &&
+            item.fieldEngineCode &&
+            diagramRelationsDatas[0].fieldEngineCode === item.fieldEngineCode
+          "
+        >
+          分析分图 :
+        </div>
         <lineChartsFen
+          v-if="item.fieldEngineCode"
           :setUpImgData="setUpImgData"
           :key="item.fieldEngineCode + index"
           :index="`${new Date().getTime()}` + index"
@@ -65,7 +80,7 @@
           :fileAddr="item.fileAddr"
         >
         </lineChartsFen>
-      </div>
+      </VirtualList>
       <el-empty
         description="暂无分析记录"
         v-if="

+ 298 - 294
src/views/performance/assetssMag.vue

@@ -63,9 +63,17 @@
             v-hasPermi="['home:performance:autoAssetss']"
             >查看自动分析列表</el-button
           >
+
           <!-- <el-button @click="handleDownLoadChart" size="small">下载</el-button> -->
         </el-form-item>
       </el-form>
+      <!-- <div class="progress" v-if="downloadDisabled">
+        <div class="progressText">文档生成进度:</div>
+        <el-progress
+          :percentage="progressPercent"
+          :color="colors"
+        ></el-progress>
+      </div> -->
     </div>
     <div class="list-page">
       <el-table
@@ -306,6 +314,11 @@
               @click="handleDownLoadChart(scope.row)"
               type="text"
               size="small"
+              :disabled="downloadDisabled"
+              v-if="
+                (scope.row.errState == 1 && scope.row.analysisState == 30) ||
+                scope.row.analysisState == 30
+              "
             >
               下载报告
             </el-button>
@@ -471,12 +484,29 @@ import { getFieldInfo } from "@/api/overview";
 import axios from "axios";
 import pLimit from "p-limit";
 import { allAnalysisType } from "./js/allAnalysisType";
+import { mapMutations, mapState } from "vuex";
+import {
+  windEngineMillPage,
+  getWindEngineGroupByFieldCode,
+} from "@/api/ledger.js";
+
 export default {
   components: {
     MyDialog,
   },
   data() {
     return {
+      progress: {
+        current: 0,
+        total: 0,
+      },
+      colors: [
+        { color: "#f56c6c", percentage: 20 },
+        { color: "#e6a23c", percentage: 40 },
+        { color: "#5cb87a", percentage: 60 },
+        { color: "#1989fa", percentage: 80 },
+        { color: "#6f7ad3", percentage: 100 },
+      ],
       fileDataList: {},
       fieldInfo: {}, //风场信息
       firstLoad: false, // 是否是第一次加载
@@ -546,288 +576,17 @@ export default {
     window.addEventListener("message", this.handleMessage); //江
     this.fetchData();
   },
-  methods: {
-    // async handleDownLoadChart(row) {
-    //   console.log(row.fieldCode, "row");
-    //   await this.getAllAnalysis(row.batchCode);
-    //   await this.getFieldDetail(row.batchCode);
-
-    //   const diagramRelations = [
-    //     {
-    //       batchCode: "WOF039800012-WOB000001",
-    //       fieldEngineCode: "WOG00604",
-    //       fieldEngineName: "#01",
-    //       analysisTypeCode: "power_curve",
-    //       analysisTypeName: null,
-    //       fileAddr:
-    //         "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/power_curve/manual/power_curve-%2301.json",
-    //       autoAnalysis: null,
-    //       createTime: "2025-05-23 16:57:26",
-    //     },
-    //     {
-    //       batchCode: "WOF039800012-WOB000001",
-    //       fieldEngineCode: "WOG00604",
-    //       fieldEngineName: "#01",
-    //       analysisTypeCode: "power_curve",
-    //       analysisTypeName: null,
-    //       fileAddr:
-    //         "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/power_curve/manual/power_curve-%2301.json",
-    //       autoAnalysis: null,
-    //       createTime: "2025-05-23 16:57:26",
-    //     },
-    //     {
-    //       batchCode: "WOF039800012-WOB000001",
-    //       fieldEngineCode: "WOG00608",
-    //       fieldEngineName: "#05",
-    //       analysisTypeCode: "power_curve",
-    //       analysisTypeName: null,
-    //       fileAddr:
-    //         "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/power_curve/manual/power_curve-%2305.json",
-    //       autoAnalysis: null,
-    //       createTime: "2025-05-23 16:57:26",
-    //     },
-    //     {
-    //       batchCode: "WOF039800012-WOB000001",
-    //       fieldEngineCode: "WOG00613",
-    //       fieldEngineName: "#10",
-    //       analysisTypeCode: "power_curve",
-    //       analysisTypeName: null,
-    //       fileAddr:
-    //         "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/power_curve/manual/power_curve-%2310.json",
-    //       autoAnalysis: null,
-    //       createTime: "2025-05-23 16:57:26",
-    //     },
-    //   ];
-    //   diagramRelations.map(async (item) => {
-    //     const res = await axios.post(
-    //       "/downLoadChart/chartServer/charts/PlotlyChartsFen",
-    //       {
-    //         fieldEngineCode: item.fieldEngineCode ? item.fieldEngineCode : "", //lineChartFen
-    //         bucketName: "bucket-zhzn",
-    //         // row.fieldCode + "/" + row.batchCode + "/" + item.analysisTypeCode, //桶名称
-    //         objectName: "charts/111.jpg", //在 MinIO 中的文件名
-    //         fieldInfo: this.fieldInfo,
-    //         fileAddr: item.fileAddr,
-    //         // chartType: "radar",
-    //         chartType: "",
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/wind_speed_frequency/manual/wind_Speed_Frequency%2302.json", //barChart  url:bar
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/cp_windspeed/manual/%2319.json", //lineChartFen  url:line
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/cp/manual/WEM00013.json", //lineAndChartLine  url:lineAndChildLine
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/data_integrity_second/manual/Data_Integrity_Of_Second_Analyst.json", //HeatmapCharts  url:heatmap
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/speed_torque/manual/total_3D_WEM00012.json", //3DDrawingChart  url:3DDrawingChart
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/speed_torque/manual/3D_%2301.json", //Time3DChart  url:Time3DChart
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/tsr_cp_power_scatter/manual/%2301.json", //TwoDMarkersChart  url:TwoDMarkersChart
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/power_scatter_2D/manual/%2301-scatter.json", //TwoDMarkersChart1  url:TwoDMarkersChart1 2D有功功率散点图
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/min_pitch/manual/min_pitch%2301.json",
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/yaw_error_density/manual/%2304.json", //ColorbarInitTwoDmarkersChart  url:ColorbarInitTwoDmarkersChart 最小桨距角 、动态偏航误差
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/pitch_generator_speed/manual/pitch_GeneratorSpeed_Analyst%2301.json", //powerMarkers2DCharts url:powerMarkers2DCharts
-    //         // "", //radarChart url:radarChart
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/rated_power_windspeed/manual/total_less_25.json", //boxLineCharts
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/tsr_trend/manual/%2302.json", //boxMarkersCharts
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/temperature_large_components/manual/GeneratorTemperature/%2321.json", //generatorTemperature
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/wind_direction_frequency/manual/wind_direction_frequency%2318.json", //windRoseChart
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/yaw_error/manual/%2320.json", //yawErrorLine
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/fault/manual/total_fault_result.csv", //faultAllChart //全场故障
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/fault/manual/turbine_fault_result.csv", //faultUnitChart //机组故障
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/yaw_error/manual/yaw_error_result.csv", //静态偏航总图 //yawErrorBarSumChart
-    //         // "http://192.168.50.233:6900/wof039800012/WOF039800012-WOB000001/production_indicator/manual/production_indicator_total.csv", //全场指标 productionIndicatorTotal
-    //       }
-    //     );
-    //   });
-
-    //   // await axios.post("/downLoadChart/chartServer/charts/CopyFileCsv", {
-    //   //   fieldInfo: this.fieldInfo,
-    //   //   rows: [
-    //   //     {
-    //   //       Qdr: "-70352582.72",
-    //   //       Qp: "70352582.72",
-    //   //       Rdr: "0",
-    //   //       Thc: "1675.06",
-    //   //     },
-    //   //   ],
-    //   //   "zn-techcn-replace-tags-production_indicator_unit-generalFiles": [
-    //   //     "http://192.168.50.233:6900/bucket-zhzn/charts/#03.jpg",
-    //   //     "http://192.168.50.233:6900/bucket-zhzn/charts/#05.jpg",
-    //   //     "http://192.168.50.233:6900/bucket-zhzn/charts/#06.jpg",
-    //   //     "http://192.168.50.233:6900/bucket-zhzn/charts/#08.jpg",
-    //   //     "http://192.168.50.233:6900/bucket-zhzn/charts/#09.jpg",
-    //   //     "http://192.168.50.233:6900/bucket-zhzn/charts/#14.jpg",
-    //   //     "http://192.168.50.233:6900/bucket-zhzn/charts/#17.jpg",
-    //   //   ],
-    //   // });
-    // },
-
-    // 获取 风机信息
-
-    async handleDownLoadChart(row) {
-      await this.getAllAnalysis(row.batchCode);
-      await this.getFieldDetail(row.batchCode);
-      this.$message.info("开始生成word文档");
-      const limit = pLimit(5); // 限制同时并发的请求数量为 5
-      const tasks = [];
-      for (const itemAnalysis of this.allAnalysis) {
-        const filterAnalysis = allAnalysisType.filter(
-          (itemType) => itemType.typeName === itemAnalysis.analysisTypeName
-        )[0];
-        if (itemAnalysis.generalFiles) {
-          //这里过滤的是发电机温度的类型 在url 中是否能找到filterFileAddr
-          for (const itemField of filterAnalysis.filterFileAddr
-            ? itemAnalysis.generalFiles
-                .filter((item) => item.fileAddr.endsWith(".json"))
-                .filter((item) =>
-                  item.fileAddr.includes(filterAnalysis.filterFileAddr)
-                ) || []
-            : itemAnalysis.generalFiles) {
-            //静态偏航误差 --通过allAnalysisType.js文件配置实现需求
-            if (Array.isArray(filterAnalysis.generalFiles.urlType)) {
-              filterAnalysis.generalFiles.urlType.map(
-                (itemUrlType, indUrlType) => {
-                  tasks.push(
-                    limit(() =>
-                      this.postChartData(
-                        itemUrlType,
-                        row,
-                        itemAnalysis,
-                        itemField,
-                        filterAnalysis,
-                        "generalFiles"
-                      )
-                    )
-                  );
-                }
-              );
-            } else if (filterAnalysis.typeCode === "fault") {
-              if (itemField.fileAddr.includes("turbine_fault_result")) {
-                if (itemField.engineTypeCode === "turbine_fault_result") {
-                  tasks.push(
-                    limit(() =>
-                      this.postChartData(
-                        "faultUnitChart",
-                        row,
-                        itemAnalysis,
-                        itemField,
-                        filterAnalysis,
-                        "generalFiles"
-                      )
-                    )
-                  );
-                }
-              } else {
-                if (itemField.engineTypeCode === "total_fault_result") {
-                  tasks.push(
-                    limit(() =>
-                      this.postChartData(
-                        "faultAllChart",
-                        row,
-                        itemAnalysis,
-                        itemField,
-                        filterAnalysis,
-                        "generalFiles"
-                      )
-                    )
-                  );
-                }
-              }
-            } else if (filterAnalysis.typeCode === "production_indicator") {
-              //总图全场
-              if (
-                itemField.fileAddr.includes(
-                  filterAnalysis.generalFiles.FileTypeFromUrl
-                )
-              ) {
-                tasks.push(
-                  limit(() =>
-                    this.postChartData(
-                      filterAnalysis.generalFiles.urlType,
-                      row,
-                      itemAnalysis,
-                      itemField,
-                      filterAnalysis,
-                      "generalFiles"
-                    )
-                  )
-                );
-              } else {
-                tasks.push(
-                  limit(() =>
-                    this.postChartData(
-                      "radarChart",
-                      row,
-                      itemAnalysis,
-                      itemField,
-                      filterAnalysis,
-                      "generalFiles"
-                    )
-                  )
-                );
-              }
-            } else {
-              tasks.push(
-                limit(() =>
-                  this.postChartData(
-                    filterAnalysis.generalFiles.urlType,
-                    row,
-                    itemAnalysis,
-                    itemField,
-                    filterAnalysis,
-                    "generalFiles"
-                  )
-                )
-              );
-            }
-          }
-        }
-        if (itemAnalysis.diagramRelations) {
-          for (const itemField of filterAnalysis.filterFileAddr
-            ? itemAnalysis.diagramRelations
-                .filter((item) => item.fileAddr.endsWith(".json"))
-                .filter((item) =>
-                  item.fileAddr.includes(filterAnalysis.filterFileAddr)
-                ) || []
-            : itemAnalysis.diagramRelations) {
-            const urlType = Array.isArray(
-              filterAnalysis.diagramRelations.urlType
-            )
-              ? this.getFileTypeFromUrl(
-                  itemField.fileAddr,
-                  filterAnalysis.diagramRelations.FileTypeFromUrl
-                ) === filterAnalysis.diagramRelations.FileTypeFromUrl
-                ? filterAnalysis.diagramRelations.urlType[0]
-                : filterAnalysis.diagramRelations.urlType[1]
-              : filterAnalysis.diagramRelations.urlType;
-            // console.log("urlType", filterAnalysis.typeName, urlType);
-            tasks.push(
-              limit(() =>
-                this.postChartData(
-                  urlType,
-                  row,
-                  itemAnalysis,
-                  itemField,
-                  filterAnalysis,
-                  "diagramRelations"
-                )
-              )
-            );
-          }
-        }
-      }
-      await Promise.all(tasks);
-
-      const wordFilePath = await axios.post(
-        "/downLoadChart/chartServer/charts/CopyFileCsv",
-        {
-          fieldInfo: this.fieldInfo,
-          bucketName: "bucket-zhzn",
-          objectName: `charts/${row.fieldCode}/${row.batchCode}`,
-          ...this.fileDataList,
-        }
-      );
-      // //下载minio 文件
-      downloadDocx(wordFilePath.data.data.url, wordFilePath.data.data.fileName);
-
-      console.log("生成成功:", this.fileDataList);
-      console.log("全部图表生成请求已完成");
+  computed: {
+    ...mapState("settings", {
+      downloadDisabled: "downloadDisabled",
+    }),
+    progressPercent() {
+      if (this.progress.total === 0) return 0;
+      return Math.round((this.progress.current / this.progress.total) * 100);
     },
+  },
+  methods: {
+    ...mapMutations("settings", ["setDownloadDisabled"]),
 
     async postChartData(
       urlType,
@@ -846,11 +605,13 @@ export default {
               ".jpg"
             : urlType + itemField.fieldEngineName + ".jpg" ||
               urlType + itemField.engineTypeCode + ".jpg";
+
         const res = await axios.post(
           `/downLoadChart/chartServer/charts/${urlType}`,
           {
             fieldEngineCode: itemField.fieldEngineCode,
             bucketName: "bucket-zhzn",
+            engineTypeCode: itemField.machineTypeCode,
             objectName:
               `charts/${row.fieldCode}/${row.batchCode}/${itemAnalysis.analysisTypeCode}/` +
               objectname,
@@ -862,6 +623,18 @@ export default {
                 : urlType,
           }
         );
+        // 每完成 10% 提示一次(可调)
+        const percent = Math.floor(
+          (this.progress.current / this.progress.total) * 100
+        );
+        if (percent % 5 === 0 && !this._shownPercents?.includes(percent)) {
+          this._shownPercents = this._shownPercents || [];
+          this._shownPercents.push(percent);
+
+          this.$notify.info(
+            `📈 已完成 ${percent}%/${this.progress.current}张,共 ${this.progress.total} 张图表`
+          );
+        }
         let key = `zn-techcn-replace-tags-${filterAnalysis.typeDocxName}-${typeChart}`;
         if (urlType === "yawErrorBarSumChart") {
           key = `zn-techcn-replace-tags-${filterAnalysis.typeDocxName}-generalFiles2`;
@@ -879,7 +652,6 @@ export default {
           }
           this.fileDataList["rows"] = res?.data?.data?.data;
         }
-        //
         if (itemField.engineTypeCode === "total_fault_result") {
           if (!this.fileDataList["faultRows"]) {
             this.$set(this.fileDataList, "faultRows", []); // Vue 2 中响应式设置对象属性
@@ -909,17 +681,246 @@ export default {
         console.error("生成失败:", err);
       }
     },
+    async handleDownLoadChart(row) {
+      this.fileDataList = {};
+      this.setDownloadDisabled(true);
+      this.$notify.warning("开始生成 Word 文档...");
+      try {
+        await this.getAllAnalysis(row.batchCode);
+        await this.getFieldDetail(row.batchCode);
+        this.$message.info("开始生成word文档");
+        const limit = pLimit(5); // 限制同时并发的请求数量为 5
+        const tasks = [];
+        for (const itemAnalysis of this.allAnalysis) {
+          const filterAnalysis = allAnalysisType.filter(
+            (itemType) => itemType.typeName === itemAnalysis.analysisTypeName
+          )[0];
+          if (itemAnalysis.generalFiles) {
+            //这里过滤的是发电机温度的类型 在url 中是否能找到filterFileAddr
+            for (const itemField of filterAnalysis.filterFileAddr
+              ? itemAnalysis.generalFiles
+                  .filter((item) => item.fileAddr.endsWith(".json"))
+                  .filter((item) =>
+                    item.fileAddr.includes(filterAnalysis.filterFileAddr)
+                  ) || []
+              : itemAnalysis.generalFiles) {
+              //静态偏航误差 --通过allAnalysisType.js文件配置实现需求
+              if (Array.isArray(filterAnalysis.generalFiles.urlType)) {
+                filterAnalysis.generalFiles.urlType.map(
+                  (itemUrlType, indUrlType) => {
+                    tasks.push(
+                      limit(async () => {
+                        await this.postChartData(
+                          itemUrlType,
+                          row,
+                          itemAnalysis,
+                          itemField,
+                          filterAnalysis,
+                          "generalFiles"
+                        );
+                        this.progress.current++;
+                      })
+                    );
+                  }
+                );
+              } else if (filterAnalysis.typeCode === "fault") {
+                if (itemField.fileAddr.includes("turbine_fault_result")) {
+                  if (itemField.engineTypeCode === "turbine_fault_result") {
+                    tasks.push(
+                      limit(async () => {
+                        await this.postChartData(
+                          "faultUnitChart",
+                          row,
+                          itemAnalysis,
+                          itemField,
+                          filterAnalysis,
+                          "generalFiles"
+                        );
+                        this.progress.current++;
+                      })
+                    );
+                  }
+                } else {
+                  if (itemField.engineTypeCode === "total_fault_result") {
+                    tasks.push(
+                      limit(async () => {
+                        await this.postChartData(
+                          "faultAllChart",
+                          row,
+                          itemAnalysis,
+                          itemField,
+                          filterAnalysis,
+                          "generalFiles"
+                        );
+                        this.progress.current++;
+                      })
+                    );
+                  }
+                }
+              } else if (filterAnalysis.typeCode === "production_indicator") {
+                //总图全场
+                if (
+                  itemField.fileAddr.includes(
+                    filterAnalysis.generalFiles.FileTypeFromUrl
+                  )
+                ) {
+                  tasks.push(
+                    limit(async () => {
+                      await this.postChartData(
+                        filterAnalysis.generalFiles.urlType,
+                        row,
+                        itemAnalysis,
+                        itemField,
+                        filterAnalysis,
+                        "generalFiles"
+                      );
+                      this.progress.current++;
+                      // 每完成 10% 提示一次(可调)
+                    })
+                  );
+                } else {
+                  tasks.push(
+                    limit(async () => {
+                      await this.postChartData(
+                        "radarChart",
+                        row,
+                        itemAnalysis,
+                        itemField,
+                        filterAnalysis,
+                        "generalFiles"
+                      );
+                      this.progress.current++;
+                    })
+                  );
+                }
+              } else {
+                tasks.push(
+                  limit(async () => {
+                    await this.postChartData(
+                      filterAnalysis.generalFiles.urlType,
+                      row,
+                      itemAnalysis,
+                      itemField,
+                      filterAnalysis,
+                      "generalFiles"
+                    );
+                    this.progress.current++;
+                  })
+                );
+              }
+            }
+          }
+          if (itemAnalysis.diagramRelations) {
+            for (const itemField of filterAnalysis.filterFileAddr
+              ? itemAnalysis.diagramRelations
+                  .filter((item) => item.fileAddr.endsWith(".json"))
+                  .filter((item) =>
+                    item.fileAddr.includes(filterAnalysis.filterFileAddr)
+                  ) || []
+              : itemAnalysis.diagramRelations) {
+              const urlType = Array.isArray(
+                filterAnalysis.diagramRelations.urlType
+              )
+                ? this.getFileTypeFromUrl(
+                    itemField.fileAddr,
+                    filterAnalysis.diagramRelations.FileTypeFromUrl
+                  ) === filterAnalysis.diagramRelations.FileTypeFromUrl
+                  ? filterAnalysis.diagramRelations.urlType[0]
+                  : filterAnalysis.diagramRelations.urlType[1]
+                : filterAnalysis.diagramRelations.urlType;
+              tasks.push(
+                limit(async () => {
+                  await this.postChartData(
+                    urlType,
+                    row,
+                    itemAnalysis,
+                    itemField,
+                    filterAnalysis,
+                    "diagramRelations"
+                  );
+                  this.progress.current++;
+                })
+              );
+            }
+          }
+        }
+        this.progress.total = tasks.length;
+        await Promise.all(tasks);
+
+        const engineTypeList = await this.getEngineTypeList(
+          this.fieldInfo.engineMillTypes,
+          row.batchCode
+        );
+        this.$notify.success("✅ 图表全部生成完成,开始生成 Word 文档...");
+        const wordFilePath = await axios.post(
+          "/downLoadChart/chartServer/charts/CopyFileCsv",
+          {
+            fieldInfo: this.fieldInfo,
+            dataTime: `${this.analysisInfo.dataStartTime}-${this.analysisInfo.dataEndTime}`,
+            bucketName: "bucket-zhzn",
+            objectName: `charts/${row.fieldCode}/${row.batchCode}`,
+            engineTypeList: engineTypeList,
+            ...this.fileDataList,
+          }
+        );
+        // //下载minio 文件
+        downloadDocx(
+          wordFilePath.data.data.url,
+          wordFilePath.data.data.fileName
+        );
+        this.$notify.success("🎉 Word 文档生成并已下载!");
+        this.setDownloadDisabled(false);
+      } catch (error) {
+        this.$notify.error("🎉 Word 文档生成并下载失败!");
+        this.setDownloadDisabled(false);
+      }
+    },
+    async getEngineTypeList(typeList, batchCode) {
+      return await Promise.all(
+        typeList.map((item) => this.getEngineMillList(item, batchCode))
+      );
+    },
+    // 查询
+    async getEngineMillList(machineTypeCode, batchCode) {
+      let dataArr = {
+        fieldCode: this.fieldInfo.fieldCode,
+        batchCode: batchCode,
+      };
+      const fieldRes = await getWindEngineGroupByFieldCode(dataArr);
+      const map = new Map();
+      const uniqueList = [];
+
+      for (const item of fieldRes.data.windEngineGroupVoList) {
+        if (!map.has(item.millTypeCode)) {
+          map.set(item.millTypeCode, true);
+          uniqueList.push(item);
+        }
+      }
+      let paramsData = {
+        machineTypeCode: machineTypeCode || undefined,
+        pageNum: 1,
+        pageSize: 10,
+      };
+      this.loading = true;
+      const res = await windEngineMillPage(paramsData);
+      const filterMill = uniqueList.filter(
+        (item) => item.millTypeCode === res.data.list[0].millTypeCode
+      );
+      return { ...res.data.list[0], ratedPower: filterMill[0].ratedCapacity };
+    },
+
     getFileTypeFromUrl(url, keyword) {
       return url.includes(keyword) ? keyword : "Unknown";
     },
     async getFieldDetail(batchCode) {
       const res = await getFieldInfo({ batchCode });
       this.fieldInfo = res.data.fieldInfo; //风场信息
+      this.analysisInfo = res.data.analysisInfo;
     },
     //获取所有分析类型,分析结果接口
     async getAllAnalysis(batchCode) {
       const res = await analysisDetail({ batchCode });
-      console.log(res.data, "分析全部结果");
+      // console.log(res.data, "分析全部结果");
       this.allAnalysis = res.data;
     },
     //自动分析列表页面跳转
@@ -1131,13 +1132,6 @@ export default {
         this.formInline.errState = errState;
       }
       if (!this.loading) {
-        console.log(
-          "handleMessage",
-          this.firstLoad,
-          analysisState,
-          errState,
-          fieldName
-        );
         if (this.firstLoad && (analysisState || errState || fieldName)) {
           // this.getTableList();
           this.startPolling();
@@ -1168,15 +1162,12 @@ export default {
       ) {
         this.firstLoad = false;
       }
-      console.log("this.formInline");
       try {
         const result = await analysisResultList({
           ...this.formInline,
           totalSize: undefined,
         });
-        console.log(result, "result");
         this.tableData = result.data.list;
-        console.log(this.tableData, "this.tableData");
         this.formInline.totalSize = result.data.totalSize;
       } catch (error) {
         this.$message({
@@ -1271,7 +1262,20 @@ export default {
     }
   }
 }
-
+.progress {
+  display: flex;
+  align-items: center;
+  position: fixed;
+  top: 25px;
+  right: 300px;
+  .progressText {
+    font-size: 14px;
+    color: #606266;
+  }
+  .el-progress {
+    width: 300px;
+  }
+}
 .attachment {
   display: flex;
   padding-top: 10px;

+ 3 - 3
src/views/performance/components/chartsCom/3DDrawingChart.vue

@@ -244,7 +244,7 @@ export default {
             title: this.chartData.xaixs,
             gridcolor: "rgb(255,255,255)",
             tickcolor: "rgb(255,255,255)",
-            backgroundcolor: "#CFD4DC",
+            backgroundcolor: "#e0e7f1",
             showbackground: true,
             // linewidth: 2, // 轴线宽度
             linecolor: "black", // 轴线颜色
@@ -263,7 +263,7 @@ export default {
             ticktext: ticktext,
             gridcolor: "rgb(255,255,255)",
             tickcolor: "rgb(255,255,255)",
-            backgroundcolor: "#CFD4DC",
+            backgroundcolor: "#e0e7f1",
             showbackground: true,
             // linewidth: 2, // 轴线宽度
             linecolor: "black", // 轴线颜色
@@ -276,7 +276,7 @@ export default {
             title: this.chartData.zaixs,
             gridcolor: "rgb(255,255,255)",
             tickcolor: "rgb(255,255,255)",
-            backgroundcolor: "#CFD4DC",
+            backgroundcolor: "#e0e7f1",
             showbackground: true,
             fixedrange: true, // 防止缩放
             // linewidth: 2, // 轴线宽度

+ 7 - 3
src/views/performance/components/chartsCom/BarChart.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2024-09-11 14:30:17
- * @LastEditTime: 2025-04-08 09:45:01
+ * @LastEditTime: 2025-06-06 16:28:29
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/chartsCom/BarChart.vue
@@ -82,6 +82,7 @@ export default {
       if (this.fileAddr !== "") {
         try {
           this.loading = true;
+          this.isError = false;
           this.cancelToken = axios.CancelToken.source();
           const resultChartsData = await axios.get(this.fileAddr, {
             cancelToken: this.cancelToken.token,
@@ -94,9 +95,12 @@ export default {
             this.loading = false;
           });
         } catch (error) {
-          console.error("Error loading data:", error);
+          if (axios.isCancel(error)) {
+            console.warn("请求被取消:", error.message);
+            return; // 不设置 isError
+          }
+          console.error("请求错误:", error);
           this.isError = true;
-          this.loading = false;
         }
       }
     },

+ 2 - 2
src/views/performance/components/chartsCom/lineAndChildLine.vue

@@ -178,10 +178,10 @@ export default {
 
           data.push(chartConfig);
         });
-
+      console.log(this.chartData, "图表title");
       const layout = {
         title: {
-          text: this.chartData.title,
+          text: this.chartData.title || this.chartData.data[0].title,
           font: {
             size: 16, // 设置标题字体大小(默认 16)
             weight: "bold",

+ 3 - 3
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:26500", //外网演示环境
+        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,
@@ -140,7 +140,7 @@ module.exports = {
       //自定义算法文佳
       "/sAlgorithm": {
         // target: "http://192.168.50.235:8666", // 目标地址
-        target: "http://106.120.102.238:58880",//这个代理会走两次代理转发
+        target: "http://106.120.102.238:58880", //这个代理会走两次代理转发
         changeOrigin: true,
         pathRewrite: {
           "^/sAlgorithm": "", // 如果后端需要 `/api` 前缀