Jelajahi Sumber

华电部署交付7.16版

liujiejie 2 hari lalu
induk
melakukan
08ee87b489

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


+ 53 - 76
downLoadServer/src/server/utils/chartsCom/Radar.js

@@ -1,27 +1,28 @@
+// puppeteer-radar-chart.js
 import puppeteer from "puppeteer";
 import fs from "fs-extra";
 import path from "path";
 import FormData from "form-data";
-import { colorSchemes } from "../colors.js";
 import axios from "axios";
-// 获取 plotly.js 的绝对路径
-const plotlyPath = path.join(
+
+// 获取 echarts.min.js 的路径
+const echartsPath = path.join(
   process.cwd(),
   "src",
   "public",
   "js",
   "echarts.min.js"
 );
-const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
+const echartsScript = await fs.readFile(echartsPath, "utf-8");
 
-// HTML 模板
+// 构造 HTML
 const getHtmlContent = () => `
 <!DOCTYPE html>
 <html lang="en">
 <head>
-  <meta charset="UTF-8" />
+  <meta charset="UTF-8">
   <title>Radar Chart</title>
-  <script>${plotlyContent}</script>
+  <script>${echartsScript}</script>
   <style>
     html, body { margin: 0; padding: 0; width: 600px; height: 600px; }
     #chart { width: 100%; height: 100%; }
@@ -30,49 +31,27 @@ const getHtmlContent = () => `
 <body>
   <div id="chart"></div>
   <script>
-    window.renderChart = function (chartData, itemCsvData,engineTypeCode) {
-     function calcValues(data) {
-  const matrix = data.map((item) => [
-    Number(item.TurbinePowerRate),
-    Number(item.TurbineRunRate),
-    Number(item.WindSpeedAvr),
-    Number(item.Thi),
-    Number(item.Ws),
-  ]);
-
-  if (matrix.length === 0) {
-    return {
-      max: [0, 0, 0, 0, 0],
-      min: [0, 0, 0, 0, 0],
-      median: [0, 0, 0, 0, 0],
-    };
-  }
-
-  const max = matrix[0].map((_, i) =>
-    Math.max(...matrix.map((row) => row[i] ?? 0))
-  );
-
-  const min = matrix[0].map((_, i) =>
-    Math.min(...matrix.map((row) => row[i] ?? 0))
-  );
-
-  const median = matrix[0].map((_, i) => {
-    const sorted = matrix
-      .map((row) => Number(row[i]))
-      .filter((v) => typeof v === "number" && !isNaN(v))
-      .sort((a, b) => a - b);
-    if (sorted.length === 0) return 0;
-    const mid = Math.floor(sorted.length / 2);
-    return sorted.length % 2 === 0
-      ? (sorted[mid - 1] + sorted[mid]) / 2
-      : sorted[mid];
-  });
-
-  return { max, min, median };
-}
-
+    window.renderChart = function(chartData, itemCsvData, engineTypeCode) {
+      function calcStats(data) {
+        const matrix = data.map(item => [
+          Number(item.TurbinePowerRate),
+          Number(item.TurbineRunRate),
+          Number(item.WindSpeedAvr),
+          Number(item.Thi),
+          Number(item.Ws)
+        ]);
+
+        const max = matrix[0].map((_, i) => Math.max(...matrix.map(row => row[i])));
+        const min = matrix[0].map((_, i) => Math.min(...matrix.map(row => row[i])));
+        const median = matrix[0].map((_, i) => {
+          const sorted = matrix.map(row => row[i]).sort((a, b) => a - b);
+          const mid = Math.floor(sorted.length / 2);
+          return sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid];
+        });
+        return { max, min, median };
+      }
 
-      const { max, min, median } = calcValues(itemCsvData);
+      const { max, min, median } = calcStats(itemCsvData);
       const values = [
         chartData.TurbinePowerRate,
         chartData.TurbineRunRate,
@@ -92,7 +71,7 @@ const getHtmlContent = () => `
       const chart = echarts.init(document.getElementById("chart"));
       chart.setOption({
         title: {
-          text:engineTypeCode+'机型'+ chartData.wind_turbine_name + "机组指标",
+          text: engineTypeCode + '机型' + chartData.wind_turbine_name + "机组指标",
           left: "center",
         },
         radar: {
@@ -102,6 +81,7 @@ const getHtmlContent = () => `
         },
         series: [
           {
+            name: chartData.wind_turbine_name,
             type: "radar",
             data: [
               {
@@ -109,6 +89,12 @@ const getHtmlContent = () => `
                 name: chartData.wind_turbine_name,
                 areaStyle: { color: "rgba(99,110,252,0.3)" },
               },
+            ],
+          },
+          {
+            name: "中位值",
+            type: "radar",
+            data: [
               {
                 value: median,
                 name: "中位值",
@@ -121,6 +107,11 @@ const getHtmlContent = () => `
           },
         ],
       });
+
+      // 等待渲染完成
+      chart.on("finished", () => {
+        window.chartFinished = true;
+      });
     };
   </script>
 </body>
@@ -137,26 +128,17 @@ export const getRadarCharts = async (
 ) => {
   const browser = await puppeteer.launch({
     headless: "new",
-    // 根据系统改路径
-    executablePath: `${process.env.CHROME_PATH}`, // 根据系统改路径
-
+    executablePath: process.env.CHROME_PATH,
     args: ["--no-sandbox", "--disable-setuid-sandbox"],
   });
   const page = await browser.newPage();
-  // 创建临时目录
   const tempDir = path.join(process.cwd(), "images");
   await fs.ensureDir(tempDir);
-  const tempFilePath = path.join(
-    tempDir,
-    `temp_scatter_chart_${Date.now()}.jpeg`
-  );
+  const tempFilePath = path.join(tempDir, `radar_chart_${Date.now()}.jpeg`);
 
   await page.setContent(getHtmlContent(), { waitUntil: "load" });
-
-  // 等待 renderChart 被定义
   await page.waitForFunction(() => typeof window.renderChart === "function");
 
-  // 调用渲染函数
   await page.evaluate(
     (chartData, itemCsvData, engineTypeCode) => {
       window.renderChart(chartData, itemCsvData, engineTypeCode);
@@ -166,37 +148,32 @@ export const getRadarCharts = async (
     engineTypeCode
   );
 
-  // 再等待图表渲染完成(给 ECharts 时间)
-  // (await page.waitForTimeout)
-  //   ? page.waitForTimeout(1000)
-  //   : new Promise((res) => setTimeout(res, 1000));
-  (await page.waitForTimeout?.(1000)) ??
-    new Promise((res) => setTimeout(res, 1000));
+  // ✅ 等待 echarts 渲染完成
+  await page.waitForFunction("window.chartFinished === true", {
+    timeout: 3000,
+  });
 
-  // 上传逻辑
-  // 截图并保存到临时文件
   const chartElement = await page.$("#chart");
-  await chartElement.screenshot({
-    path: tempFilePath,
-    type: "jpeg",
-  });
+  await chartElement.screenshot({ path: tempFilePath, type: "jpeg" });
 
   try {
     const newUrl = objectName.substring(0, objectName.lastIndexOf("/"));
-    // 上传图片到服务器
     const formData = new FormData();
     formData.append("file", fs.createReadStream(tempFilePath));
-    // 发送上传请求
+
     const response = await axios.post(
       `${process.env.API_BASE_URL}/examples/upload`,
       {
         filePath: tempFilePath,
         bucketName,
-        objectName: newUrl + "/" + chartData.wind_turbine_name + ".jpg",
+        objectName: `${newUrl}/${chartData.wind_turbine_name}.jpg`,
       }
     );
+
     return response?.data?.url;
   } catch (error) {
     console.error("❌ 上传失败:", error.message);
+  } finally {
+    await browser.close();
   }
 };

TEMPAT SAMPAH
downLoadServer/src/src.zip


+ 2 - 3
src/views/ledger/component/windsiteup.vue

@@ -68,10 +68,11 @@
         </span>
       </div>
       <div v-if="resourceShow">
+        <!-- action="http://192.168.50.235/energy-manage-service/api/check/upload" -->
         <el-upload
           class="uploaddemo2"
           :file-list="resourcefileList"
-          action="http://192.168.50.235/energy-manage-service/api/check/upload"
+          action="http://192.168.0.1/energy-manage-service/api/check/upload"
           :multiple="false"
           :before-upload="resourcebeforeUpload"
           :limit="1"
@@ -284,8 +285,6 @@ export default {
     resourcehandleOnChange(file, fileList) {
       this.globalFileList = file.raw;
       this.succeed = file.response;
-      console.log(this.succeed, "   this.succeed");
-      console.log(this.globalFileList, "   this.globalFileList");
       // 手动触发上传
       if (file.status === "ready") {
         this.$refs.upload.submit();

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

@@ -1,8 +1,8 @@
 <!--
  * @Author: your name
  * @Date: 2025-01-13 13:44:56
- * @LastEditTime: 2025-07-14 10:22:44
- * @LastEditors: bogon
+ * @LastEditTime: 2025-07-16 15:23:29
+ * @LastEditors: milo-MacBook-Pro.local
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/production_indicator_unit/index.vue
 -->
@@ -101,7 +101,7 @@
             <el-table-column
               prop="mean_width"
               label="功率水平平均宽度(m/s)(<=3.5)"
-              width="200"
+              width="250"
               header-align="center"
             >
             </el-table-column>

+ 1 - 2
src/views/performance/components/chartsCom/TwoDMarkersChart1.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2024-09-11 14:32:12
- * @LastEditTime: 2025-07-15 16:46:15
+ * @LastEditTime: 2025-07-15 17:13:00
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/chartsCom/powerMarkers2DCharts.vue
@@ -432,7 +432,6 @@ export default {
         // 初始化颜色和大小数组
         let newColors = [...this.originalColors];
         let newSize = [...this.originalSizes];
-
         // 如果选中的点数大于等于3,进行多边形选择区域的处理
         if (this.selectedPoints.length >= 3) {
           const xv = this.selectedPoints.map((p) => p.x);

+ 5 - 5
src/views/performance/components/chartsCom/powerMarkers2DCharts.vue

@@ -305,11 +305,11 @@ export default {
           tickcolor: "rgb(255,255,255)",
           backgroundcolor: "#e5ecf6",
           showbackground: true, // 显示背景
-          range:
-            this.chartData.xaixs === "发电机转速(r/min)" ||
-            this.chartData.xaixs === "发电机转速(r/min)"
-              ? [1000, 2000]
-              : undefined,
+          // range:
+          //   this.chartData.xaixs === "发电机转速(r/min)" ||
+          //   this.chartData.xaixs === "发电机转速(r/min)"
+          //     ? [1000, 2000]
+          //     : undefined,
         },
         yaxis: {
           title: this.chartData.yaixs,