Bladeren bron

修改下载报告各环境配置

liujiejie 3 weken geleden
bovenliggende
commit
96fceca017
49 gewijzigde bestanden met toevoegingen van 1057 en 333 verwijderingen
  1. 30 25
      .env.demo
  2. 5 3
      .env.dev
  3. 45 0
      .env.dt
  4. 29 28
      .env.hd
  5. 5 3
      .env.jl
  6. BIN
      dist.zip
  7. 15 5
      downLoadServer/.env
  8. 2 0
      downLoadServer/package.json
  9. BIN
      downLoadServer/src.zip
  10. 65 30
      downLoadServer/src/server/controllers/chartController.js
  11. 35 3
      downLoadServer/src/server/controllers/uploadController.js
  12. 3 1
      downLoadServer/src/server/routes/chartRoutes.js
  13. 2 0
      downLoadServer/src/server/routes/exampleRoutes.js
  14. 11 7
      downLoadServer/src/server/utils/chartsCom/3DDrawingChart.js
  15. 11 4
      downLoadServer/src/server/utils/chartsCom/BarChart.js
  16. 14 7
      downLoadServer/src/server/utils/chartsCom/BoxLineCharts.js
  17. 17 8
      downLoadServer/src/server/utils/chartsCom/BoxMarkersCharts.js
  18. 15 8
      downLoadServer/src/server/utils/chartsCom/ColorbarInitTwoDmarkersChart.js
  19. 16 9
      downLoadServer/src/server/utils/chartsCom/FaultAll.js
  20. 16 7
      downLoadServer/src/server/utils/chartsCom/FaultUnit.js
  21. 15 8
      downLoadServer/src/server/utils/chartsCom/GeneratorTemperature.js
  22. 15 8
      downLoadServer/src/server/utils/chartsCom/HeatmapCharts.js
  23. 17 8
      downLoadServer/src/server/utils/chartsCom/PlotlyCharts.js
  24. 15 10
      downLoadServer/src/server/utils/chartsCom/PlotlyChartsFen.js
  25. 28 14
      downLoadServer/src/server/utils/chartsCom/Radar.js
  26. 15 8
      downLoadServer/src/server/utils/chartsCom/Time3DChart.js
  27. 15 8
      downLoadServer/src/server/utils/chartsCom/TwoDMarkersChart.js
  28. 16 9
      downLoadServer/src/server/utils/chartsCom/TwoDMarkersChart1.js
  29. 17 8
      downLoadServer/src/server/utils/chartsCom/WindRoseChart.js
  30. 16 7
      downLoadServer/src/server/utils/chartsCom/YewErrorBarChart.js
  31. 12 7
      downLoadServer/src/server/utils/chartsCom/lineAndChildLine.js
  32. 12 7
      downLoadServer/src/server/utils/chartsCom/lineChartsFen.js
  33. 17 10
      downLoadServer/src/server/utils/chartsCom/powerMarkers2DCharts.js
  34. 16 7
      downLoadServer/src/server/utils/chartsCom/yawErrorBarSum.js
  35. 18 9
      downLoadServer/src/server/utils/chartsCom/yawErrorLine.js
  36. 172 0
      downLoadServer/src/server/utils/copyFileImage.js
  37. 3 3
      downLoadServer/src/server/utils/minioService.js
  38. 3 3
      downLoadServer/src/test.mjs
  39. BIN
      downLoadServer/temp-images/image_1773380356597_0.webp
  40. BIN
      downLoadServer/temp-images/image_1773380356597_1.webp
  41. BIN
      downLoadServer/temp-images/image_1773380356604_0.webp
  42. BIN
      downLoadServer/temp-images/image_1773381971053_0.webp
  43. BIN
      downLoadServer/temp-images/image_1773381971053_1.webp
  44. BIN
      downLoadServer/temp-images/image_1773381971056_0.webp
  45. BIN
      downLoadServer/temp-images/images_1773380356605.zip
  46. 3 1
      package.json
  47. 9 8
      src/views/overview/components/temperature_large_components_low/index.vue
  48. 8 8
      src/views/overview/components/temperature_large_components_mid/index.vue
  49. 279 34
      src/views/performance/assetssMag.vue

+ 30 - 25
.env.demo

@@ -1,41 +1,46 @@
 ###
  # @Author: your name
  # @Date: 2025-07-17 15:36:25
- # @LastEditTime: 2025-07-30 10:14:45
- # @LastEditors: bogon
+ # @LastEditTime: 2026-03-14 11:08:56
+ # @LastEditors: milo-MacBook-Pro.local
  # @Description: In User Settings Edit
  # @FilePath: /performance-test/.env.demo
 ### 
 
 #这里需要在router/index.js 文件中进行判断cockpitComponent;
-#VUE_APP_HOME_COM="../views/admin/cockpitManage/Index.vue"
+VUE_APP_HOME_COM="../views/admin/cockpitManage/Index.vue"
 VUE_APP_THEM="green"
 VUE_APP_ISSHOWHD='default'
 VUE_APP_Helath='demo'
 VUE_APP_TITLE='机组功率曲线异常检测数据分析系统'
+VUE_APP_PROJECT='ys'
 #外网
-# # VUE_APP_MAPVIEW=http://106.120.102.238:18998/tiles/{z}/{x}/{y}.png
-# VUE_APP_MAPVIEW=/tiles/{z}/{x}/{y}.png
-# VUE_APP_MAP=http://106.120.102.238:18998
-# VUE_APP_UPLOAD="http://106.120.102.238:18998/api/energy-manage-service/api/check/upload"
-# VUE_APP_APIPROXY='http://106.120.102.238:18998/api'
-# VUE_APP_WZLAPIPROXY='http://106.120.102.238:18998/transDataWeb'
-# VUE_APP_ETLAPIPROXY='http://106.120.102.238:18998/transDataWeb'
-# VUE_APP_AnalysisMultiAPIPROXY='http://106.120.102.238:18998/AnalysisMulti'
-# #自定义算法文佳 目前无法使用,可能是服务未启动
-# VUE_APP_sAlgorithmAPIPROXY='http://106.120.102.238:18998/sAlgorithm'
-# VUE_APP_databaseApiAPIPROXY='http://106.120.102.238:18998/databaseApi'
+# VUE_APP_MAPVIEW=http://106.120.102.238:18998/tiles/{z}/{x}/{y}.png # 地图废除
+VUE_APP_MAPVIEW=/tiles/{z}/{x}/{y}.png
+VUE_APP_MAP=http://106.120.102.238:18998
+VUE_APP_UPLOAD="http://106.120.102.238:18998/api/energy-manage-service/api/check/upload"
+VUE_APP_APIPROXY='http://106.120.102.238:18998/api'
+VUE_APP_WZLAPIPROXY='http://106.120.102.238:18998/transDataWeb'
+VUE_APP_ETLAPIPROXY='http://106.120.102.238:18998/transDataWeb'
+VUE_APP_AnalysisMultiAPIPROXY='http://106.120.102.238:18998/AnalysisMulti'
+#自定义算法文佳 目前无法使用,可能是服务未启动
+VUE_APP_sAlgorithmAPIPROXY='http://106.120.102.238:18998/sAlgorithm'
+VUE_APP_databaseApiAPIPROXY='http://106.120.102.238:18998/databaseApi'
 # VUE_APP_downLoadChartAPIPROXY='http://106.120.102.238:18998/downLoadChart'
+VUE_APP_downLoadChartAPIPROXY='http://0.0.0.0:3001'
 
 #内网
-VUE_APP_UPLOAD="http://192.168.50.235/energy-manage-service/api/check/upload"
-VUE_APP_MAP="http://192.168.50.235:8998"
-VUE_APP_MAPVIEW="http://192.168.50.235/tiles/{z}/{x}/{y}.png"
-VUE_APP_APIPROXY='http://192.168.50.235:16600'
-VUE_APP_WZLAPIPROXY='http://192.168.50.235:8998/transDataWeb'
-VUE_APP_ETLAPIPROXY='http://192.168.50.235:8998/transDataWeb'
-VUE_APP_AnalysisMultiAPIPROXY='http://192.168.50.235:8998/AnalysisMulti'
-# #自定义算法文佳 目前无法使用,可能是服务未启动
-VUE_APP_sAlgorithmAPIPROXY='http://192.168.50.235:8998/sAlgorithm'
-VUE_APP_databaseApiAPIPROXY='http://192.168.50.234:3002'
-VUE_APP_downLoadChartAPIPROXY='http://192.168.50.235:8998/downLoadChart'
+# VUE_APP_UPLOAD="http://192.168.50.235/energy-manage-service/api/check/upload"
+# VUE_APP_MAP="http://192.168.50.235"
+# # VUE_APP_MAPVIEW="http://192.168.50.235/tiles/{z}/{x}/{y}.png" # 地图废除
+# VUE_APP_MAPVIEW=/tiles/{z}/{x}/{y}.png
+# VUE_APP_APIPROXY='http://192.168.50.235:16600' #后端接口
+# VUE_APP_WZLAPIPROXY='http://192.168.50.235:8998/transDataWeb' #魏知亮数据接口
+# VUE_APP_ETLAPIPROXY='http://192.168.50.235:8998/transDataWeb' #ETL数据接口
+# VUE_APP_AnalysisMultiAPIPROXY='http://192.168.50.235:8998/AnalysisMulti' #王娇娇健康评估
+# # #自定义算法文佳 目前无法使用,可能是服务未启动
+# VUE_APP_sAlgorithmAPIPROXY='http://192.168.50.235:8998/sAlgorithm'
+# VUE_APP_databaseApiAPIPROXY='http://192.168.50.234:3002' #自定义分析 nodejs访问数据库
+# VUE_APP_downLoadChartAPIPROXY='http://192.168.50.235:8998/downLoadChart' #nodejs下载报告
+
+# VUE_APP_downLoadChartAPIPROXY='http://192.168.50.235:8999/downLoadChart' #nodejs下载报告

+ 5 - 3
.env.dev

@@ -1,7 +1,7 @@
 ###
  # @Author: your name
  # @Date: 2025-07-17 14:14:27
- # @LastEditTime: 2025-08-12 09:23:49
+ # @LastEditTime: 2026-03-17 11:03:04
  # @LastEditors: bogon
  # @Description: In User Settings Edit
  # @FilePath: /performance-test/.env.dev
@@ -30,7 +30,7 @@ VUE_APP_TITLE='机组功率曲线异常检测数据分析系统'
 VUE_APP_UPLOAD="http://192.168.50.235/energy-manage-service/api/check/upload"
 VUE_APP_MAPVIEW=/tiles/{z}/{x}/{y}.png
 VUE_APP_MAP=http://192.168.50.235
-VUE_APP_APIPROXY='http://192.168.50.235:16200'
+VUE_APP_APIPROXY='http://192.168.50.235:16300'
 VUE_APP_WZLAPIPROXY='http://192.168.50.241:9002'
 # VUE_APP_ETLAPIPROXY='http://192.168.50.241:9002'
 VUE_APP_ETLAPIPROXY='http://192.168.50.241:9000/transDataWebProd/'
@@ -40,4 +40,6 @@ VUE_APP_databaseApiAPIPROXY='http://192.168.50.234:3002'
 #暂时不知健康评估内网dev 环境地址
 VUE_APP_AnalysisMultiAPIPROXY='http://192.168.50.235:8998/AnalysisMulti'
 #暂时不知下载报告内网dev 环境地址
-VUE_APP_downLoadChartAPIPROXY='http://106.120.102.238:58880'
+# VUE_APP_downLoadChartAPIPROXY='http://106.120.102.238:58880'
+# VUE_APP_downLoadChartAPIPROXY='http://192.168.50.234:3001'
+VUE_APP_downLoadChartAPIPROXY='http://0.0.0.0:3001'

+ 45 - 0
.env.dt

@@ -0,0 +1,45 @@
+###
+ # @Author: your name
+ # @Date: 2026-03-06 11:19:04
+ # @LastEditTime: 2026-03-06 11:19:28
+ # @LastEditors: bogon
+ # @Description: In User Settings Edit
+ # @FilePath: /performance-test/.env.dt
+### 
+#这里需要在router/index.js 文件中进行判断cockpitComponent;
+VUE_APP_HOME_COM="../views/admin/cockpitManage/Index.vue"
+VUE_APP_THEM="green"
+VUE_APP_ISSHOWHD='default'
+VUE_APP_Helath='dev'
+VUE_APP_TITLE='机组功率曲线异常检测数据分析系统'
+VUE_APP_PROJECT='dt'
+#外网
+# VUE_APP_MAPVIEW=/tiles/{z}/{x}/{y}.png
+# # VUE_APP_MAPVIEW= "http://106.120.102.238:18000/tiles/{z}/{x}/{y}.png" # 地图废除
+# VUE_APP_UPLOAD="http://106.120.102.238:16700/energy-manage-service/api/check/upload"
+# VUE_APP_APIPROXY='http://106.120.102.238:16700'
+# VUE_APP_MAP=http://106.120.102.238:18080
+# VUE_APP_WZLAPIPROXY='http://106.120.102.238:18080/WindTransDev'
+# VUE_APP_ETLAPIPROXY='http://106.120.102.238:18080/WindTransDev'
+# VUE_APP_AnalysisMultiAPIPROXY='http://106.120.102.238:28999/AnalysisMulti'
+# #自定义算法文佳 目前无法使用,可能是服务未启动
+# VUE_APP_sAlgorithmAPIPROXY='http://106.120.102.238:58880'
+# VUE_APP_databaseApiAPIPROXY='http://106.120.102.238:58880'
+# # #暂时不知下载报告内网dev 环境地址
+# VUE_APP_downLoadChartAPIPROXY='http://106.120.102.238:58880/downLoadChart'
+
+#内网
+VUE_APP_UPLOAD="http://192.168.50.235/energy-manage-service/api/check/upload"
+VUE_APP_MAPVIEW=/tiles/{z}/{x}/{y}.png
+VUE_APP_MAP=http://192.168.50.235
+VUE_APP_APIPROXY='http://192.168.50.235:16200'
+VUE_APP_WZLAPIPROXY='http://192.168.50.241:9002'
+# VUE_APP_ETLAPIPROXY='http://192.168.50.241:9002'
+VUE_APP_ETLAPIPROXY='http://192.168.50.241:9000/transDataWebProd/'
+# #自定义算法文佳 目前无法使用,可能是服务未启动
+VUE_APP_sAlgorithmAPIPROXY='http://192.168.50.235:8998/AnalysisMulti'
+VUE_APP_databaseApiAPIPROXY='http://192.168.50.234:3002'
+#暂时不知健康评估内网dev 环境地址
+VUE_APP_AnalysisMultiAPIPROXY='http://192.168.50.235:8998/AnalysisMulti'
+#暂时不知下载报告内网dev 环境地址
+VUE_APP_downLoadChartAPIPROXY='http://192.168.50.235:8998/downLoadChart'

+ 29 - 28
.env.hd

@@ -2,34 +2,35 @@ VUE_APP_THEM="blue"
 VUE_APP_ISSHOWHD='HD'
 VUE_APP_TITLE='风电机组健康诊断平台'
 VUE_APP_Helath='hd'
-
+VUE_APP_PROJECT='hd'
 #外网
-VUE_APP_MAPVIEW="http://106.120.102.238:18000/tiles/{z}/{x}/{y}.png"
-# VUE_APP_UPLOAD="http://192.168.0.1/energy-manage-service/api/check/upload"
-VUE_APP_UPLOAD="http://106.120.102.238:16700/energy-manage-service/api/check/upload"
-VUE_APP_APIPROXY='http://106.120.102.238:16700'
-VUE_APP_MAP=http://106.120.102.238:18080
-VUE_APP_WZLAPIPROXY='http://106.120.102.238:18080/WindTransDev'
-VUE_APP_ETLAPIPROXY='http://106.120.102.238:18080/WindTransDev'
-VUE_APP_AnalysisMultiAPIPROXY='http://106.120.102.238:28999/AnalysisMulti'
-#自定义算法文佳 目前无法使用,可能是服务未启动
-VUE_APP_sAlgorithmAPIPROXY='http://106.120.102.238:58880'
-VUE_APP_databaseApiAPIPROXY='http://106.120.102.238:58880'
-# #暂时不知下载报告内网dev 环境地址
-VUE_APP_downLoadChartAPIPROXY='http://106.120.102.238:58880'
+# #http://106.120.102.238:18997/
+# # VUE_APP_MAPVIEW="http://106.120.102.238:18000/tiles/{z}/{x}/{y}.png" # 地图废除
+# VUE_APP_MAPVIEW=/tiles/{z}/{x}/{y}.png
+# VUE_APP_UPLOAD="http://106.120.102.238:16700/energy-manage-service/api/check/upload"
+# VUE_APP_APIPROXY='http://106.120.102.238:18997'
+# VUE_APP_MAP=http://106.120.102.238:18080
+# VUE_APP_WZLAPIPROXY='http://106.120.102.238:18080/WindTransDev'
+# VUE_APP_ETLAPIPROXY='http://106.120.102.238:18080/WindTransDev'
+# VUE_APP_AnalysisMultiAPIPROXY='http://106.120.102.238:28999/AnalysisMulti'
+# #自定义算法文佳 目前无法使用,可能是服务未启动
+# VUE_APP_sAlgorithmAPIPROXY='http://106.120.102.238:58880'
+# VUE_APP_databaseApiAPIPROXY='http://106.120.102.238:58880'
+# # #暂时不知下载报告内网dev 环境地址
+# VUE_APP_downLoadChartAPIPROXY='http://106.120.102.238:58880'
 
 #内网
-# # VUE_APP_UPLOAD="http://192.168.0.1/energy-manage-service/api/check/upload"
-# VUE_APP_UPLOAD="http://192.168.50.235/energy-manage-service/api/check/upload"
-# VUE_APP_MAPVIEW=/tiles/{z}/{x}/{y}.png
-# VUE_APP_MAP=http://192.168.50.235
-# VUE_APP_APIPROXY='http://192.168.50.235:16200'
-# VUE_APP_WZLAPIPROXY='http://192.168.50.241:9001'
-# VUE_APP_ETLAPIPROXY='http://192.168.50.241:9001'
-# # #自定义算法文佳 目前无法使用,可能是服务未启动
-# VUE_APP_sAlgorithmAPIPROXY='http://192.168.50.235:8998/AnalysisMulti'
-# VUE_APP_databaseApiAPIPROXY='http://192.168.50.234:3002'
-# #暂时不知健康评估内网dev 环境地址
-# VUE_APP_AnalysisMultiAPIPROXY='http://192.168.50.235:8998/AnalysisMulti'
-# #暂时不知下载报告内网dev 环境地址
-# VUE_APP_downLoadChartAPIPROXY='http://192.168.50.235:8998/downLoadChart'
+# VUE_APP_UPLOAD="http://192.168.0.1/energy-manage-service/api/check/upload"
+VUE_APP_UPLOAD="http://192.168.50.235/energy-manage-service/api/check/upload"
+VUE_APP_MAPVIEW=/tiles/{z}/{x}/{y}.png
+VUE_APP_MAP=http://192.168.50.235
+VUE_APP_APIPROXY='http://192.168.50.235:16200'
+VUE_APP_WZLAPIPROXY='http://192.168.50.241:9001'
+VUE_APP_ETLAPIPROXY='http://192.168.50.241:9001'
+# #自定义算法文佳 目前无法使用,可能是服务未启动
+VUE_APP_sAlgorithmAPIPROXY='http://192.168.50.235:8998/AnalysisMulti'
+VUE_APP_databaseApiAPIPROXY='http://192.168.50.234:3002'
+#暂时不知健康评估内网dev 环境地址
+VUE_APP_AnalysisMultiAPIPROXY='http://192.168.50.235:8998/AnalysisMulti'
+#暂时不知下载报告内网dev 环境地址
+VUE_APP_downLoadChartAPIPROXY='http://192.168.50.235:8998/downLoadChart'

+ 5 - 3
.env.jl

@@ -2,9 +2,10 @@ VUE_APP_THEM="green"
 VUE_APP_ISSHOWHD='default'
 VUE_APP_Helath='dev'
 VUE_APP_TITLE='机组功率曲线异常检测数据分析系统'
-
+VUE_APP_PROJECT='jl'
 #吉林外网
-VUE_APP_MAPVIEW="http://127.0.0.1:8080/tiles/{z}/{x}/{y}.png"
+# # VUE_APP_MAPVIEW="http://127.0.0.1:8080/tiles/{z}/{x}/{y}.png"
+VUE_APP_MAPVIEW=/tiles/{z}/{x}/{y}.png
 VUE_APP_UPLOAD="http://127.0.0.1:8080/energy-manage-service/api/check/upload"
 VUE_APP_UPLOAD="http://127.0.0.1:8080/energy-manage-service/api/check/upload"
 VUE_APP_APIPROXY='http://127.0.0.1:8080'
@@ -19,7 +20,8 @@ VUE_APP_databaseApiAPIPROXY='http://127.0.0.1:8080'
 VUE_APP_downLoadChartAPIPROXY='http://127.0.0.1:8080'
 
 #公司
-# VUE_APP_MAPVIEW= "http://106.120.102.238:18000/tiles/{z}/{x}/{y}.png"
+# # VUE_APP_MAPVIEW= "http://106.120.102.238:18000/tiles/{z}/{x}/{y}.png"
+# VUE_APP_MAPVIEW=/tiles/{z}/{x}/{y}.png
 # VUE_APP_UPLOAD="http://106.120.102.238:16700/energy-manage-service/api/check/upload"
 # VUE_APP_APIPROXY='http://106.120.102.238:16700'
 # VUE_APP_MAP='http://106.120.102.238:18080'

BIN
dist.zip


+ 15 - 5
downLoadServer/.env

@@ -1,9 +1,19 @@
 API_BASE_URL=http://0.0.0.0:3001
-MINIO_ENDPOINT=192.168.50.233
-MINIO_PORT=6900
-MINIO_ACCESS_KEY=haH1vePq7unSp4TG1One
-MINIO_SECRET_KEY=idxO5SAjboUYERpDICgHgBoHX7bcYv355lMQANt6
-CHROME_PATH=/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
+#   MINIO_ENDPOINT=192.168.50.233 ##minio 演示
+#   MINIO_PORT=6900 #minio 演示
+# MINIO_ENDPOINT=106.120.102.238 #minio 外网演示
+# MINIO_PORT=26900 #minio 外网演示
+# MINIO_ACCESS_KEY=haH1vePq7unSp4TG1One
+# MINIO_SECRET_KEY=idxO5SAjboUYERpDICgHgBoHX7bcYv355lMQANt6
+# CHROME_PATH=/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
+
+MINIO_ENDPOINT=192.168.50.234 #minio 生产
+MINIO_PORT=6900 #minio 生产
+MINIO_ACCESS_KEY=6VkF2ul6X7udr7RLsG2W,
+MINIO_SECRET_KEY=jtBuqZ80biRWQf6sbwzDQJwHtEBicPjkZBtvjTrA,
+# MINIO_ACCESS_KEY=haH1vePq7unSp4TG1One
+# MINIO_SECRET_KEY=idxO5SAjboUYERpDICgHgBoHX7bcYv355lMQANt6
+# CHROME_PATH=/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
 #   nginx 配置 minio
 #   env MINIO_ENDPOINT=192.168.50.233;
 #   env MINIO_PORT=6900;

+ 2 - 0
downLoadServer/package.json

@@ -12,6 +12,7 @@
   "author": "",
   "license": "ISC",
   "dependencies": {
+    "archiver": "^7.0.1",
     "axios": "^1.9.0",
     "cors": "^2.8.5",
     "docx": "^9.5.0",
@@ -26,6 +27,7 @@
     "minio": "^8.0.5",
     "multer": "^1.4.5-lts.2",
     "node-plotly.js": "^0.0.1",
+    "p-limit": "^7.3.0",
     "papaparse": "^5.5.2",
     "pizzip": "^3.2.0",
     "plotly.js": "^3.0.1",

BIN
downLoadServer/src/src.zip → downLoadServer/src.zip


+ 65 - 30
downLoadServer/src/server/controllers/chartController.js

@@ -23,6 +23,7 @@ import { generatePlotlyCharts } from "../utils/chartsCom/PlotlyCharts.js";
 import { generatePlotlyChartsFen } from "../utils/chartsCom/PlotlyChartsFen.js";
 // import { getProductionIndicatorTotal } from "../utils/chartsCom/productionIndicatorTotal.js";
 import { copyFileDocx } from "../utils/copyFileCsv.js";
+import { processChartsImages } from "../utils/copyFileImage.js";
 import axios from "axios";
 import Papa from "papaparse";
 import fs from "fs-extra";
@@ -35,7 +36,7 @@ const handleChartGeneration = async (
   res,
   generateChartFn,
   successMessage,
-  additionalParams = {}
+  additionalParams = {},
 ) => {
   try {
     const { fileAddr, bucketName, objectName, fieldInfo, fieldEngineCode } =
@@ -44,7 +45,17 @@ const handleChartGeneration = async (
       return errorResponse(res, "缺少数据URL", 400);
     }
     // 从URL获取数据
-    const response = await axios.get(fileAddr);
+    //    const response = await axios.get(fileAddr);
+    // 从URL获取数据
+    const path = fileAddr.replace(/^https?:\/\/[^/]+/, "");
+    console.log(
+      `http://${process.env.MINIO_ENDPOINT}:${process.env.MINIO_PORT}${path}`,
+      "链接",
+    );
+
+    const response = await axios.get(
+      `http://${process.env.MINIO_ENDPOINT}:${process.env.MINIO_PORT}${path}`,
+    );
     let data = [];
     // console.log("获取到的数据:", data);/
     if (typeof response.data === "string") {
@@ -79,7 +90,7 @@ const handleChartGeneration = async (
       objectName,
       fieldEngineCode,
       fieldInfo,
-      ...Object.values(additionalParams)
+      ...Object.values(additionalParams),
     );
     // console.log(imageUrl, "imageUrl");
     successResponse(
@@ -87,7 +98,7 @@ const handleChartGeneration = async (
       {
         imageUrl,
       },
-      successMessage
+      successMessage,
     );
   } catch (error) {
     console.error(`${successMessage.replace("生成成功", "生成失败")}:`, error);
@@ -95,13 +106,13 @@ const handleChartGeneration = async (
       errorResponse(
         res,
         `获取数据失败: ${error.response.status}`,
-        error.response.status
+        error.response.status,
       );
     } else {
       errorResponse(
         res,
         `${successMessage.replace("生成成功", "生成失败")}`,
-        500
+        500,
       );
     }
   }
@@ -119,7 +130,7 @@ const fetchCsvAndParse = async (
   onParsed,
   onError,
   successMessage,
-  additionalParams = {}
+  additionalParams = {},
 ) => {
   try {
     const {
@@ -153,7 +164,7 @@ const fetchCsvAndParse = async (
           fieldInfo,
           chartType,
           engineTypeCode,
-          additionalParams
+          additionalParams,
         );
       },
       error: (error) => {
@@ -168,7 +179,7 @@ const fetchCsvAndParse = async (
       errorResponse(
         res,
         `获取数据失败: ${error.response.status}`,
-        error.response.status
+        error.response.status,
       );
     } else {
       errorResponse(res, "获取 CSV 失败", 500);
@@ -187,7 +198,7 @@ const handleParsedResult = async (
   fieldInfo,
   chartType,
   engineTypeCode,
-  additionalParams
+  additionalParams,
 ) => {
   // chartType==="faultUnitChart"?
   const data =
@@ -232,12 +243,12 @@ const handleParsedResult = async (
               objectName,
               fieldInfo,
               engineTypeCode,
-              additionalParams
+              additionalParams,
             ).catch((err) => {
               console.error("getRadarCharts failed:", err);
               return null;
-            })
-          )
+            }),
+          ),
         );
         imageUrls.push(...results);
         // console.log(imageUrls, "img");
@@ -247,7 +258,7 @@ const handleParsedResult = async (
           bucketName,
           objectName,
           fieldInfo,
-          additionalParams
+          additionalParams,
         );
       }
     }
@@ -275,7 +286,7 @@ export const createLineAndChildLine = async (req, res) => {
     req,
     res,
     generateLineAndChildLine,
-    "折线图生成成功"
+    "折线图生成成功",
   );
 };
 //createPlotlyChartsFen
@@ -288,7 +299,7 @@ export const createPlotlyChartsFen = async (req, res) => {
     "折线图生成成功",
     {
       fieldEngineCode,
-    }
+    },
   );
 };
 
@@ -309,7 +320,7 @@ export const createTwoDMarkersChart = async (req, res) => {
     req,
     res,
     generateTwoDMarkersChart,
-    "2D 分图生成成功"
+    "2D 分图生成成功",
   );
 };
 export const createTwoDMarkersChart1 = async (req, res) => {
@@ -317,7 +328,7 @@ export const createTwoDMarkersChart1 = async (req, res) => {
     req,
     res,
     generateTwoDMarkersChart1,
-    "2D 分图生成成功"
+    "2D 分图生成成功",
   );
 };
 export const createColorbarInitTwoDmarkersChart = async (req, res) => {
@@ -325,7 +336,7 @@ export const createColorbarInitTwoDmarkersChart = async (req, res) => {
     req,
     res,
     generateColorbarInitTwoDmarkersChart,
-    "2D 分图生成成功"
+    "2D 分图生成成功",
   );
 };
 export const createpowerMarkers2DCharts = async (req, res) => {
@@ -333,7 +344,7 @@ export const createpowerMarkers2DCharts = async (req, res) => {
     req,
     res,
     generatepowerMarkers2DCharts,
-    "2D 分图生成成功"
+    "2D 分图生成成功",
   );
 };
 
@@ -345,7 +356,7 @@ export const createBoxMarkersCharts = async (req, res) => {
     req,
     res,
     generateBoxMarkersCharts,
-    "箱线图生成成功"
+    "箱线图生成成功",
   );
 };
 
@@ -354,7 +365,7 @@ export const createGeneratorTemperature = async (req, res) => {
     req,
     res,
     generateGeneratorTemperature,
-    "发电温度"
+    "发电温度",
   );
 };
 
@@ -379,7 +390,7 @@ export const createyawErrorCharts = async (req, res) => {
     req,
     res,
     getYawErrorBarSumCharts,
-    "静态偏航误差的绝对值机组台数分布情况"
+    "静态偏航误差的绝对值机组台数分布情况",
   );
 };
 export const createyawErrorBarSumCharts = async (req, res) => {
@@ -422,7 +433,7 @@ export const createCopyFileCsv = async (req, res) => {
     // 检查文件大小
     if (stats.size > MAX_FILE_SIZE) {
       throw new Error(
-        `生成的文件超过大小限制 (${MAX_FILE_SIZE / 1024 / 1024}MB)`
+        `生成的文件超过大小限制 (${MAX_FILE_SIZE / 1024 / 1024}MB)`,
       );
     }
 
@@ -434,7 +445,7 @@ export const createCopyFileCsv = async (req, res) => {
         filePath: tempFilePath,
         bucketName,
         objectName: `${objectName}/${path.basename(tempFilePath)}`,
-      }
+      },
     );
 
     if (!response?.data?.url) {
@@ -442,11 +453,6 @@ export const createCopyFileCsv = async (req, res) => {
     }
 
     console.log("文件上传成功");
-
-    // 4. 清理临时文件
-    // await fs.unlink(tempFilePath).catch(console.error);
-    // console.log("临时文件已清理");
-
     // 5. 返回成功响应
     res.json({
       success: true,
@@ -490,3 +496,32 @@ export const createCopyFileCsv = async (req, res) => {
     });
   }
 };
+export const createCopyFileImage = async (req, res) => {
+  try {
+    const { fieldInfo, bucketName, objectName } = req.body;
+
+    if (!fieldInfo || !bucketName || !objectName) {
+      return res.status(400).json({
+        success: false,
+        message: "缺少必要的参数",
+      });
+    }
+
+    const result = await processChartsImages(req.body);
+
+    res.json({
+      success: true,
+      data: {
+        downloadId: result.downloadId,
+        url: result.url,
+      },
+    });
+  } catch (error) {
+    console.error("文件处理失败:", error);
+
+    res.status(500).json({
+      success: false,
+      message: error.message,
+    });
+  }
+};

+ 35 - 3
downLoadServer/src/server/controllers/uploadController.js

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-04-28 14:46:54
- * @LastEditTime: 2025-05-26 16:19:14
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-14 10:15:41
+ * @LastEditors: milo-MacBook-Pro.local
  * @Description: In User Settings Edit
  * @FilePath: /downLoadServer/src/server/controllers/uploadController.js
  */
@@ -12,7 +12,7 @@ import { uploadFileToMinIO } from "../utils/minioService.js";
 import path from "path";
 import fs from "fs-extra";
 import { fileURLToPath } from "url";
-
+import { minioClient } from "../utils/minioService.js";
 // 获取 __dirname
 const __filename = fileURLToPath(import.meta.url);
 const __dirname = path.dirname(__filename);
@@ -67,3 +67,35 @@ export const downloadFile = async (req, res) => {
   const url = `http://${process.env.MINIO_ENDPOINT}:${process.env.MINIO_PORT}/${bucketName}/${objectName}`;
   res.status(200).json({ url, message: "File downloaded successfully" });
 };
+export const uploadStream = async (req, res) => {
+  try {
+    const bucketName = req.headers["bucketname"];
+    const objectName = req.headers["objectname"];
+
+    console.log("bucketName:", bucketName);
+    console.log("objectName:", objectName);
+
+    if (!bucketName || !objectName) {
+      return res.status(400).json({
+        success: false,
+        message: "缺少 bucketName 或 objectName",
+      });
+    }
+
+    await minioClient.putObject(bucketName, objectName, req);
+
+    const fileUrl = `http://${process.env.MINIO_ENDPOINT}:${process.env.MINIO_PORT}/${bucketName}/${objectName}`;
+
+    res.json({
+      success: true,
+      url: fileUrl,
+    });
+  } catch (error) {
+    console.error("上传失败:", error);
+
+    res.status(500).json({
+      success: false,
+      message: error.message,
+    });
+  }
+};

+ 3 - 1
downLoadServer/src/server/routes/chartRoutes.js

@@ -22,6 +22,7 @@ import {
   createyawErrorBarSumCharts,
   createProductionIndicatorTotal,
   createCopyFileCsv,
+  createCopyFileImage,
   createPlotlyChartsFen,
   createPlotlyCharts,
 } from "../controllers/chartController.js";
@@ -38,7 +39,7 @@ router.post("/TwoDMarkersChart", createTwoDMarkersChart);
 router.post("/TwoDMarkersChart1", createTwoDMarkersChart1);
 router.post(
   "/ColorbarInitTwoDmarkersChart",
-  createColorbarInitTwoDmarkersChart
+  createColorbarInitTwoDmarkersChart,
 );
 router.post("/powerMarkers2DCharts", createpowerMarkers2DCharts);
 
@@ -54,6 +55,7 @@ router.post("/yawErrorBarSumChart", createyawErrorBarSumCharts);
 router.post("/productionIndicatorTotal", createProductionIndicatorTotal);
 router.post("/radarChart", createRadarCharts);
 router.post("/CopyFileCsv", createCopyFileCsv);
+router.post("/CopyFileImage", createCopyFileImage);
 router.post("/PlotlyChartsFen", createPlotlyChartsFen);
 router.post("/PlotlyCharts", createPlotlyCharts);
 

+ 2 - 0
downLoadServer/src/server/routes/exampleRoutes.js

@@ -4,6 +4,7 @@ import {
   uploadFile,
   uploadMiddleware,
   downloadFile,
+  uploadStream,
 } from "../controllers/uploadController.js"; // 导入上传控制器
 
 const router = express.Router();
@@ -11,5 +12,6 @@ const router = express.Router();
 router.get("/", getExample);
 router.post("/", createExample);
 router.post("/upload", uploadMiddleware, uploadFile); // 添加上传路由
+router.post("/uploadStream", uploadStream); // 添加上传路由
 router.post("/downLoadCsv", downloadFile);
 export default router;

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

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-04-14 16:09:13
- * @LastEditTime: 2025-07-14 15:00:16
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-17 09:30:20
+ * @LastEditors: MacBookPro
  * @Description: In User Settings Edit
  * @FilePath: /downLoadServer/src/server/utils/chartsCom/3DDrawingChart.js
  */
@@ -20,7 +20,7 @@ export const generate3DDrawingChart = async (data, bucketName, objectName) => {
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_heatmap_chart_${Date.now()}.jpeg`
+      `temp_heatmap_chart_${Date.now()}.jpeg`,
     );
     // 获取 plotly.js 的绝对路径
     const plotlyPath = path.join(
@@ -28,7 +28,7 @@ export const generate3DDrawingChart = async (data, bucketName, objectName) => {
       "src",
       "public",
       "js",
-      "plotly-3.0.1.min.js"
+      "plotly-3.0.1.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -180,7 +180,8 @@ export const generate3DDrawingChart = async (data, bucketName, objectName) => {
           <script>
             const traces = ${JSON.stringify(traces)};
             const layout = ${JSON.stringify(layout)};
-            Plotly.newPlot('chart', traces, layout, { responsive: true }).then(() => {
+            Plotly.newPlot('chart', traces, layout, { responsive: true,displayModeBar: false,
+  staticPlot: true }).then(() => {
               window.chartRendered = true; // 确保在图表渲染完成后设置
               
             }).catch((error) => {
@@ -192,9 +193,12 @@ export const generate3DDrawingChart = async (data, bucketName, objectName) => {
         `;
       // 设置页面内容
       await page.setContent(htmlContent, {
-        waitUntil: "networkidle0",
+        waitUntil: "domcontentloaded",
+        timeout: 0,
       });
 
+      await page.waitForTimeout(1000);
+
       // 等待图表渲染完成,延长超时时间
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 150000, // 延长到 120 秒
@@ -213,7 +217,7 @@ export const generate3DDrawingChart = async (data, bucketName, objectName) => {
       // 发送上传请求
       const response = await axios.post(
         `${process.env.API_BASE_URL}/examples/upload`,
-        { filePath: tempFilePath, bucketName, objectName }
+        { filePath: tempFilePath, bucketName, objectName },
       );
       return response?.data?.url;
     } catch (error) {

+ 11 - 4
downLoadServer/src/server/utils/chartsCom/BarChart.js

@@ -23,7 +23,7 @@ export const generateBarChart = async (data, bucketName, objectName) => {
       "src",
       "public",
       "js",
-      "plotly-latest.min.js"
+      "plotly-latest.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -159,7 +159,11 @@ export const generateBarChart = async (data, bucketName, objectName) => {
               window.onload = function() {
                 const trace = ${JSON.stringify(trace)};
                 const layout = ${JSON.stringify(layout)};
-                Plotly.newPlot('chart', [trace], layout).then(() => {
+                Plotly.newPlot('chart', [trace], layout,{
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                   window.chartRendered = true;
                 });
               };
@@ -170,9 +174,12 @@ export const generateBarChart = async (data, bucketName, objectName) => {
 
       // 设置页面内容
       await page.setContent(htmlContent, {
-        waitUntil: "networkidle0",
+        waitUntil: "domcontentloaded",
+        timeout: 0,
       });
 
+      await page.waitForTimeout(1000);
+
       // 等待图表渲染完成
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 60000,
@@ -195,7 +202,7 @@ export const generateBarChart = async (data, bucketName, objectName) => {
       // 发送上传请求
       const response = await axios.post(
         `${process.env.API_BASE_URL}/examples/upload`,
-        { filePath: tempFilePath, bucketName, objectName }
+        { filePath: tempFilePath, bucketName, objectName },
       );
       return response?.data?.url;
     } finally {

+ 14 - 7
downLoadServer/src/server/utils/chartsCom/BoxLineCharts.js

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-05-12 17:40:10
- * @LastEditTime: 2025-07-10 13:57:37
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-17 09:31:19
+ * @LastEditors: MacBookPro
  * @Description: In User Settings Edit
  * @FilePath: /downLoadServer/src/server/utils/chartsCom/BoxLineCharts.js
  */
@@ -32,7 +32,7 @@ export const generateBoxLineChart = async (data, bucketName, objectName) => {
       "src",
       "public",
       "js",
-      "plotly-latest.min.js"
+      "plotly-latest.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -132,8 +132,12 @@ export const generateBoxLineChart = async (data, bucketName, objectName) => {
                   const trace = ${JSON.stringify(trace)};
                   const layout = ${JSON.stringify(layout)};
                   Plotly.newPlot('chart', [trace, ${JSON.stringify(
-                    trace2
-                  )}], layout).then(() => {
+                    trace2,
+                  )}], layout,{
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                     window.chartRendered = true;
                   });
                 };
@@ -144,9 +148,12 @@ export const generateBoxLineChart = async (data, bucketName, objectName) => {
 
       // 设置页面内容
       await page.setContent(htmlContent, {
-        waitUntil: "networkidle0",
+        waitUntil: "domcontentloaded",
+        timeout: 0,
       });
 
+      await page.waitForTimeout(1000);
+
       // 等待图表渲染完成
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 60000,
@@ -164,7 +171,7 @@ export const generateBoxLineChart = async (data, bucketName, objectName) => {
       formData.append("file", fs.createReadStream(tempFilePath));
       const response = await axios.post(
         `${process.env.API_BASE_URL}/examples/upload`,
-        { filePath: tempFilePath, bucketName, objectName }
+        { filePath: tempFilePath, bucketName, objectName },
       );
       return response?.data?.url;
     } finally {

+ 17 - 8
downLoadServer/src/server/utils/chartsCom/BoxMarkersCharts.js

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-05-13 11:02:32
- * @LastEditTime: 2025-07-10 13:59:24
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-17 09:31:26
+ * @LastEditors: MacBookPro
  * @Description: In User Settings Edit
  * @FilePath: /downLoadServer/src/server/utils/chartsCom/BoxMarkersCharts.js
  */
@@ -53,7 +53,7 @@ const filterData = (group) => {
 export const generateBoxMarkersCharts = async (
   data,
   bucketName,
-  objectName
+  objectName,
 ) => {
   const { data: chartData, xaixs, yaixs, analysisTypeCode } = data;
 
@@ -67,7 +67,7 @@ export const generateBoxMarkersCharts = async (
     "src",
     "public",
     "js",
-    "plotly-3.0.1.min.js"
+    "plotly-3.0.1.min.js",
   );
   const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -156,7 +156,11 @@ export const generateBoxMarkersCharts = async (
               window.onload = function() {
                 const traces = ${JSON.stringify([...traces, ...medianMarkers])};
                 const layout = ${JSON.stringify(layout)};
-                Plotly.newPlot('chart', traces, layout).then(() => {
+                Plotly.newPlot('chart', traces, layout,{
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                   window.chartRendered = true;
                 });
               };
@@ -165,7 +169,12 @@ export const generateBoxMarkersCharts = async (
         </html>
       `;
 
-    await page.setContent(htmlContent, { waitUntil: "networkidle0" });
+    await page.setContent(htmlContent, {
+      waitUntil: "domcontentloaded",
+      timeout: 0,
+    });
+
+    await page.waitForTimeout(1000);
     await page.waitForFunction(() => window.chartRendered === true, {
       timeout: 60000,
     });
@@ -174,7 +183,7 @@ export const generateBoxMarkersCharts = async (
     const tempFilePath = path.join(
       process.cwd(),
       "images",
-      `chart_${Date.now()}.jpeg`
+      `chart_${Date.now()}.jpeg`,
     );
     const chartElement = await page.$("#chart");
     await chartElement.screenshot({ path: tempFilePath, type: "jpeg" });
@@ -188,7 +197,7 @@ export const generateBoxMarkersCharts = async (
         filePath: tempFilePath,
         bucketName,
         objectName,
-      }
+      },
     );
 
     return response?.data?.url;

+ 15 - 8
downLoadServer/src/server/utils/chartsCom/ColorbarInitTwoDmarkersChart.js

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-04-28 10:27:00
- * @LastEditTime: 2025-07-09 14:30:16
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-17 09:31:41
+ * @LastEditors: MacBookPro
  * @Description: In User Settings Edit
  * @FilePath: /downLoadServer/src/server/utils/chartsCom/ColorbarInitTwoDmarkersChart.js
  */
@@ -16,7 +16,7 @@ import axios from "axios";
 export const generateColorbarInitTwoDmarkersChart = async (
   data,
   bucketName,
-  objectName
+  objectName,
 ) => {
   try {
     const colorsBar = colorSchemes[4].colors;
@@ -25,7 +25,7 @@ export const generateColorbarInitTwoDmarkersChart = async (
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_scatter_chart_${Date.now()}.jpeg`
+      `temp_scatter_chart_${Date.now()}.jpeg`,
     );
 
     // 获取 plotly.js 的绝对路径
@@ -34,7 +34,7 @@ export const generateColorbarInitTwoDmarkersChart = async (
       "src",
       "public",
       "js",
-      "plotly-3.0.1.min.js"
+      "plotly-3.0.1.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -173,7 +173,11 @@ export const generateColorbarInitTwoDmarkersChart = async (
           <script>
             const traces = [${JSON.stringify(trace)}];
             const layout = ${JSON.stringify(layout)};
-            Plotly.newPlot('chart', traces, layout, { responsive: true }).then(() => {
+            Plotly.newPlot('chart', traces, layout, {
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
               window.chartRendered = true; // 确保在图表渲染完成后设置
               console.log("图表渲染完成");
             }).catch((error) => {
@@ -186,9 +190,12 @@ export const generateColorbarInitTwoDmarkersChart = async (
 
       // 设置页面内容
       await page.setContent(htmlContent, {
-        waitUntil: "networkidle0",
+        waitUntil: "domcontentloaded",
+        timeout: 0,
       });
 
+      await page.waitForTimeout(1000);
+
       // 等待图表渲染完成,延长超时时间
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 150000, // 延长到 150 秒
@@ -208,7 +215,7 @@ export const generateColorbarInitTwoDmarkersChart = async (
       // 发送上传请求
       const response = await axios.post(
         `${process.env.API_BASE_URL}/examples/upload`,
-        { filePath: tempFilePath, bucketName, objectName }
+        { filePath: tempFilePath, bucketName, objectName },
       );
       return response?.data?.url;
     } catch (error) {

+ 16 - 9
downLoadServer/src/server/utils/chartsCom/FaultAll.js

@@ -9,7 +9,7 @@ export const getFaultAllCharts = async (
   data,
   bucketName,
   objectName,
-  analysisTypeCode
+  analysisTypeCode,
 ) => {
   // 获取 plotly.js 的绝对路径
   const plotlyPath = path.join(
@@ -17,7 +17,7 @@ export const getFaultAllCharts = async (
     "src",
     "public",
     "js",
-    "plotly-3.0.1.min.js"
+    "plotly-3.0.1.min.js",
   );
   const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
   // console.log(data, "全场故障数据");
@@ -112,7 +112,7 @@ export const getFaultAllCharts = async (
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_fault_all_chart_${Date.now()}.jpeg`
+      `temp_fault_all_chart_${Date.now()}.jpeg`,
     );
 
     // 使用 Puppeteer 生成图表的截图
@@ -142,10 +142,12 @@ export const getFaultAllCharts = async (
             <script>
               window.onload = function() {
                 Plotly.newPlot('chart', [${JSON.stringify(
-                  barTrace
-                )}, ${JSON.stringify(lineTrace)}], ${JSON.stringify(
-        layout
-      )}).then(() => {
+                  barTrace,
+                )}, ${JSON.stringify(lineTrace)}], ${JSON.stringify(layout)},{
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                   window.chartRendered = true;
                 });
               };
@@ -153,7 +155,12 @@ export const getFaultAllCharts = async (
           </body>
         </html>
       `;
-      await page.setContent(htmlContent, { waitUntil: "networkidle0" });
+      await page.setContent(htmlContent, {
+        waitUntil: "domcontentloaded",
+        timeout: 0,
+      });
+
+      await page.waitForTimeout(1000);
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 60000,
       });
@@ -169,7 +176,7 @@ export const getFaultAllCharts = async (
           filePath: tempFilePath,
           bucketName,
           objectName,
-        }
+        },
       );
       return response?.data?.url;
     } catch (error) {

+ 16 - 7
downLoadServer/src/server/utils/chartsCom/FaultUnit.js

@@ -8,7 +8,7 @@ export const getFaultUnitCharts = async (
   data,
   bucketName,
   objectName,
-  analysisTypeCode
+  analysisTypeCode,
 ) => {
   try {
     // 获取 plotly.js 的绝对路径
@@ -17,7 +17,7 @@ export const getFaultUnitCharts = async (
       "src",
       "public",
       "js",
-      "plotly-3.0.1.min.js"
+      "plotly-3.0.1.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -101,7 +101,7 @@ export const getFaultUnitCharts = async (
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_fault_unit_chart_${Date.now()}.jpeg`
+      `temp_fault_unit_chart_${Date.now()}.jpeg`,
     );
 
     // 使用 Puppeteer 生成图表的截图
@@ -129,8 +129,12 @@ export const getFaultUnitCharts = async (
             <script>
               window.onload = function() {
                 Plotly.newPlot('chart', ${JSON.stringify(
-                  bubbleData
-                )}, ${JSON.stringify(layout)}).then(() => {
+                  bubbleData,
+                )}, ${JSON.stringify(layout)},{
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                   window.chartRendered = true;
                 });
               };
@@ -138,7 +142,12 @@ export const getFaultUnitCharts = async (
           </body>
         </html>
       `;
-      await page.setContent(htmlContent, { waitUntil: "networkidle0" });
+      await page.setContent(htmlContent, {
+        waitUntil: "domcontentloaded",
+        timeout: 0,
+      });
+
+      await page.waitForTimeout(1000);
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 60000,
       });
@@ -154,7 +163,7 @@ export const getFaultUnitCharts = async (
           filePath: tempFilePath,
           bucketName,
           objectName,
-        }
+        },
       );
       // console.log("上传成功:", response.data);
       return response?.data?.url;

+ 15 - 8
downLoadServer/src/server/utils/chartsCom/GeneratorTemperature.js

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-05-13 14:33:50
- * @LastEditTime: 2025-07-10 13:59:10
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-17 09:32:38
+ * @LastEditors: MacBookPro
  * @Description: In User Settings Edit
  * @FilePath: /downLoadServer/src/server/utils/chartsCom/GeneratorTemperature.js
  */
@@ -16,7 +16,7 @@ import axios from "axios";
 export const generateGeneratorTemperature = async (
   data,
   bucketName,
-  objectName
+  objectName,
 ) => {
   try {
     const typeLine = ["solid", "solid", "dot", "dot", "dash", "solid"];
@@ -31,7 +31,7 @@ export const generateGeneratorTemperature = async (
       "src",
       "public",
       "js",
-      "plotly-latest.min.js"
+      "plotly-latest.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
     const colorDefault = [
@@ -210,8 +210,12 @@ export const generateGeneratorTemperature = async (
                 <script>
                   window.onload = function() {
                     Plotly.newPlot('chart', ${JSON.stringify(
-                      chartData
-                    )}, ${JSON.stringify(layout)}).then(() => {
+                      chartData,
+                    )}, ${JSON.stringify(layout)},{
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                       window.chartRendered = true;
                     });
                   };
@@ -222,9 +226,12 @@ export const generateGeneratorTemperature = async (
 
       // 设置页面内容
       await page.setContent(htmlContent, {
-        waitUntil: "networkidle0",
+        waitUntil: "domcontentloaded",
+        timeout: 0,
       });
 
+      await page.waitForTimeout(1000);
+
       // 等待图表渲染完成
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 60000,
@@ -242,7 +249,7 @@ export const generateGeneratorTemperature = async (
       formData.append("file", fs.createReadStream(tempFilePath));
       const response = await axios.post(
         `${process.env.API_BASE_URL}/examples/upload`,
-        { filePath: tempFilePath, bucketName, objectName }
+        { filePath: tempFilePath, bucketName, objectName },
       );
       return response?.data?.url;
     } finally {

+ 15 - 8
downLoadServer/src/server/utils/chartsCom/HeatmapCharts.js

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-04-14 11:15:35
- * @LastEditTime: 2025-07-09 14:31:02
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-17 09:32:48
+ * @LastEditors: MacBookPro
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/downLoadServer/src/server/utils/chartsCom/HeatmapCharts.js
  */
@@ -20,7 +20,7 @@ export const generateHeatmapChart = async (data, bucketName, objectName) => {
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_heatmap_chart_${Date.now()}.jpeg`
+      `temp_heatmap_chart_${Date.now()}.jpeg`,
     );
 
     // 获取 plotly.js 的绝对路径
@@ -29,7 +29,7 @@ export const generateHeatmapChart = async (data, bucketName, objectName) => {
       "src",
       "public",
       "js",
-      "plotly-3.0.1.min.js"
+      "plotly-3.0.1.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -64,7 +64,7 @@ export const generateHeatmapChart = async (data, bucketName, objectName) => {
           [1, "#5783B3"], // 100%
         ],
         text: chartDataset.ZData.map((row) =>
-          row.map((value) => value.toString())
+          row.map((value) => value.toString()),
         ),
         hoverinfo: "text", // Hover时显示文本
         showscale: true, // 显示颜色条
@@ -121,7 +121,11 @@ export const generateHeatmapChart = async (data, bucketName, objectName) => {
             window.chartRendered = false;
             const trace = ${JSON.stringify(trace)};
             const layout = ${JSON.stringify(layout)};
-            Plotly.newPlot('chart', [trace], layout, { responsive: true }).then(() => {
+            Plotly.newPlot('chart', [trace], layout, {
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
               window.chartRendered = true;
             }); 
           </script>
@@ -130,9 +134,12 @@ export const generateHeatmapChart = async (data, bucketName, objectName) => {
       `;
       // 设置页面内容
       await page.setContent(htmlContent, {
-        waitUntil: "networkidle0",
+        waitUntil: "domcontentloaded",
+        timeout: 0,
       });
 
+      await page.waitForTimeout(1000);
+
       // 等待图表渲染完成,延长超时时间
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 120000, // 延长到 120 秒
@@ -164,7 +171,7 @@ export const generateHeatmapChart = async (data, bucketName, objectName) => {
       // 发送上传请求
       const response = await axios.post(
         `${process.env.API_BASE_URL}/examples/upload`,
-        { filePath: tempFilePath, bucketName, objectName }
+        { filePath: tempFilePath, bucketName, objectName },
       );
       return response?.data?.url;
     } catch (error) {

+ 17 - 8
downLoadServer/src/server/utils/chartsCom/PlotlyCharts.js

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-05-15 15:22:19
- * @LastEditTime: 2025-07-09 14:31:43
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-17 09:33:25
+ * @LastEditors: MacBookPro
  * @Description: In User Settings Edit
  * @FilePath: /downLoadServer/src/server/utils/chartsCom/PlotlyCharts.js
  */
@@ -26,7 +26,7 @@ import { text } from "stream/consumers";
 export const generatePlotlyCharts = async (
   chartData,
   bucketName,
-  objectName
+  objectName,
 ) => {
   const colorSchemesItem = colorSchemes[0].colors;
   const tempDir = path.join(process.cwd(), "images");
@@ -37,7 +37,7 @@ export const generatePlotlyCharts = async (
     // 构建数据
     const data = [];
     const newData = chartData.data.filter(
-      (item) => item.enginName !== "合同功率曲线"
+      (item) => item.enginName !== "合同功率曲线",
     );
 
     newData.forEach((turbine, index) => {
@@ -96,7 +96,7 @@ export const generatePlotlyCharts = async (
       "src",
       "public",
       "js",
-      "plotly-latest.min.js"
+      "plotly-latest.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -123,7 +123,11 @@ export const generatePlotlyCharts = async (
             window.onload = function () {
               const data = ${JSON.stringify(data)};
               const layout = ${JSON.stringify(layout)};
-              Plotly.newPlot('chart', data, layout, { responsive: true }).then(() => {
+              Plotly.newPlot('chart', data, layout, {
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                 window.chartRendered = true;
               });
             };
@@ -131,7 +135,12 @@ export const generatePlotlyCharts = async (
         </body>
       </html>`;
 
-    await page.setContent(htmlContent, { waitUntil: "networkidle0" });
+    await page.setContent(htmlContent, {
+      waitUntil: "domcontentloaded",
+      timeout: 0,
+    });
+
+    await page.waitForTimeout(1000);
 
     await page.waitForFunction(() => window.chartRendered === true, {
       timeout: 60000,
@@ -153,7 +162,7 @@ export const generatePlotlyCharts = async (
           filePath: tempFilePath,
           bucketName,
           objectName,
-        }
+        },
       );
 
       const imageUrl = response?.data?.url;

+ 15 - 10
downLoadServer/src/server/utils/chartsCom/PlotlyChartsFen.js

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-05-23 17:19:20
- * @LastEditTime: 2025-07-09 14:31:54
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-17 09:33:54
+ * @LastEditors: MacBookPro
  * @Description: In User Settings Edit
  * @FilePath: /downLoadServer/src/server/utils/chartsCom/PlotlyChartsFen.js
  */
@@ -22,7 +22,7 @@ export const generatePlotlyChartsFen = async (
   data,
   bucketName,
   objectName,
-  fieldEngineCode
+  fieldEngineCode,
 ) => {
   try {
     // 创建临时目录
@@ -30,7 +30,7 @@ export const generatePlotlyChartsFen = async (
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_heatmap_chart_${Date.now()}.jpeg`
+      `temp_heatmap_chart_${Date.now()}.jpeg`,
     );
 
     // 获取 plotly.js 的绝对路径
@@ -39,7 +39,7 @@ export const generatePlotlyChartsFen = async (
       "src",
       "public",
       "js",
-      "plotly-latest.min.js"
+      "plotly-latest.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -94,7 +94,7 @@ export const generatePlotlyChartsFen = async (
           finalData.push(chartConfig);
         });
       const filterData = data.data.filter(
-        (item) => item.enginName === "合同功率曲线"
+        (item) => item.enginName === "合同功率曲线",
       );
       // 添加合同功率曲线
       if (filterData && filterData[0].enginName === "合同功率曲线") {
@@ -169,8 +169,10 @@ export const generatePlotlyChartsFen = async (
                 const data = ${JSON.stringify(finalData)};
                 const layout = ${JSON.stringify(layout)};
                 Plotly.newPlot('chart', data, layout, {
-                  responsive: true
-                }).then(() => {
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                   window.chartRendered = true;
                 });
               };
@@ -181,9 +183,12 @@ export const generatePlotlyChartsFen = async (
 
       // 设置页面内容
       await page.setContent(htmlContent, {
-        waitUntil: "networkidle0",
+        waitUntil: "domcontentloaded",
+        timeout: 0,
       });
 
+      await page.waitForTimeout(1000);
+
       // 等待图表渲染完成
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 60000,
@@ -204,7 +209,7 @@ export const generatePlotlyChartsFen = async (
       // 发送上传请求
       const response = await axios.post(
         `${process.env.API_BASE_URL}/examples/upload`,
-        { filePath: tempFilePath, bucketName, objectName }
+        { filePath: tempFilePath, bucketName, objectName },
       );
       return response?.data?.url;
     } finally {

+ 28 - 14
downLoadServer/src/server/utils/chartsCom/Radar.js

@@ -11,7 +11,7 @@ const echartsPath = path.join(
   "src",
   "public",
   "js",
-  "echarts.min.js"
+  "echarts.min.js",
 );
 const echartsScript = await fs.readFile(echartsPath, "utf-8");
 
@@ -79,6 +79,7 @@ const getHtmlContent = () => `
           center: ["50%", "50%"],
           radius: "60%",
         },
+        toolbox: { show: false },
         series: [
           {
             name: chartData.wind_turbine_name,
@@ -124,20 +125,30 @@ export const getRadarCharts = async (
   bucketName,
   objectName,
   fieldInfo,
-  engineTypeCode
+  engineTypeCode,
 ) => {
   const browser = await puppeteer.launch({
     headless: "new",
     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, `radar_chart_${Date.now()}.jpeg`);
 
-  await page.setContent(getHtmlContent(), { waitUntil: "load" });
-  await page.waitForFunction(() => typeof window.renderChart === "function");
+  await page.setViewport({
+    width: 600,
+    height: 600,
+    deviceScaleFactor: 2,
+  });
+
+  await page.setContent(getHtmlContent(), {
+    waitUntil: "domcontentloaded",
+    timeout: 0,
+  });
+
+  await page.waitForFunction(() => typeof window.renderChart === "function", {
+    timeout: 10000,
+  });
 
   await page.evaluate(
     (chartData, itemCsvData, engineTypeCode) => {
@@ -145,17 +156,20 @@ export const getRadarCharts = async (
     },
     chartData,
     itemCsvData,
-    engineTypeCode
+    engineTypeCode,
   );
 
-  // ✅ 等待 echarts 渲染完成
-  await page.waitForFunction("window.chartFinished === true", {
-    timeout: 3000,
+  await page.waitForFunction(() => window.chartFinished === true, {
+    timeout: 15000,
   });
 
-  const chartElement = await page.$("#chart");
-  await chartElement.screenshot({ path: tempFilePath, type: "jpeg" });
+  const chartElement = await page.waitForSelector("#chart");
 
+  await chartElement.screenshot({
+    path: tempFilePath,
+    type: "jpeg",
+    quality: 100,
+  });
   try {
     const newUrl = objectName.substring(0, objectName.lastIndexOf("/"));
     const formData = new FormData();
@@ -167,7 +181,7 @@ export const getRadarCharts = async (
         filePath: tempFilePath,
         bucketName,
         objectName: `${newUrl}/${chartData.wind_turbine_name}.jpg`,
-      }
+      },
     );
 
     return response?.data?.url;

+ 15 - 8
downLoadServer/src/server/utils/chartsCom/Time3DChart.js

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-04-14 17:49:33
- * @LastEditTime: 2025-07-14 17:24:27
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-17 09:34:32
+ * @LastEditors: MacBookPro
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/downLoadServer/src/server/utils/chartsCom/Time3DChart.js
  */
@@ -26,7 +26,7 @@ export const generateTime3DChart = async (data, bucketName, objectName) => {
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_heatmap_chart_${Date.now()}.jpeg`
+      `temp_heatmap_chart_${Date.now()}.jpeg`,
     );
 
     // 获取 plotly.js 的绝对路径
@@ -35,7 +35,7 @@ export const generateTime3DChart = async (data, bucketName, objectName) => {
       "src",
       "public",
       "js",
-      "plotly-3.0.1.min.js"
+      "plotly-3.0.1.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
     // 创建浏览器实例
@@ -55,7 +55,7 @@ export const generateTime3DChart = async (data, bucketName, objectName) => {
       const page = await browser.newPage();
       // 准备图表数据
       const uniqueMonths = Array.from(
-        new Set(data.data[0].yData.map((date) => formatDate(date)))
+        new Set(data.data[0].yData.map((date) => formatDate(date))),
       );
       // 设置每个月份对应的颜色
       const monthColors = colorSchemes[0].colors;
@@ -195,7 +195,11 @@ export const generateTime3DChart = async (data, bucketName, objectName) => {
           <script>
             const traces = ${JSON.stringify(traces)};
             const layout = ${JSON.stringify(layout)};
-            Plotly.newPlot('chart', traces, layout, { responsive: true }).then(() => {
+            Plotly.newPlot('chart', traces, layout, {
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
               window.chartRendered = true; // 确保在图表渲染完成后设置
               
             }).catch((error) => {
@@ -207,9 +211,12 @@ export const generateTime3DChart = async (data, bucketName, objectName) => {
         `;
       // 设置页面内容
       await page.setContent(htmlContent, {
-        waitUntil: "networkidle0",
+        waitUntil: "domcontentloaded",
+        timeout: 0,
       });
 
+      await page.waitForTimeout(1000);
+
       // 等待图表渲染完成,延长超时时间
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 150000, // 延长到 120 秒
@@ -229,7 +236,7 @@ export const generateTime3DChart = async (data, bucketName, objectName) => {
       // 发送上传请求
       const response = await axios.post(
         `${process.env.API_BASE_URL}/examples/upload`,
-        { filePath: tempFilePath, bucketName, objectName }
+        { filePath: tempFilePath, bucketName, objectName },
       );
       return response?.data?.url;
     } catch (error) {

+ 15 - 8
downLoadServer/src/server/utils/chartsCom/TwoDMarkersChart.js

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-04-25 16:19:33
- * @LastEditTime: 2025-07-08 14:40:29
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-17 09:34:40
+ * @LastEditors: MacBookPro
  * @Description: In User Settings Edit
  * @FilePath: /downLoadServer/src/server/utils/chartsCom/TwoDMarkersChart.js
  */
@@ -17,7 +17,7 @@ import axios from "axios";
 export const generateTwoDMarkersChart = async (
   data,
   bucketName,
-  objectName
+  objectName,
 ) => {
   try {
     // 创建临时目录
@@ -25,7 +25,7 @@ export const generateTwoDMarkersChart = async (
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_scatter_chart_${Date.now()}.jpeg`
+      `temp_scatter_chart_${Date.now()}.jpeg`,
     );
 
     // 获取 plotly.js 的绝对路径
@@ -34,7 +34,7 @@ export const generateTwoDMarkersChart = async (
       "src",
       "public",
       "js",
-      "plotly-3.0.1.min.js"
+      "plotly-3.0.1.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -160,7 +160,11 @@ export const generateTwoDMarkersChart = async (
           <script>
             const traces = [${JSON.stringify(trace)}];
             const layout = ${JSON.stringify(layout)};
-            Plotly.newPlot('chart', traces, layout, { responsive: true }).then(() => {
+            Plotly.newPlot('chart', traces, layout, {
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
               window.chartRendered = true; // 确保在图表渲染完成后设置
               console.log("图表渲染完成");
             }).catch((error) => {
@@ -173,9 +177,12 @@ export const generateTwoDMarkersChart = async (
 
       // 设置页面内容
       await page.setContent(htmlContent, {
-        waitUntil: "networkidle0",
+        waitUntil: "domcontentloaded",
+        timeout: 0,
       });
 
+      await page.waitForTimeout(1000);
+
       // 等待图表渲染完成,延长超时时间
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 150000, // 延长到 150 秒
@@ -195,7 +202,7 @@ export const generateTwoDMarkersChart = async (
       // 发送上传请求
       const response = await axios.post(
         `${process.env.API_BASE_URL}/examples/upload`,
-        { filePath: tempFilePath, bucketName, objectName }
+        { filePath: tempFilePath, bucketName, objectName },
       );
       return response?.data?.url;
     } catch (error) {

+ 16 - 9
downLoadServer/src/server/utils/chartsCom/TwoDMarkersChart1.js

@@ -8,7 +8,7 @@ import axios from "axios";
 export const generateTwoDMarkersChart1 = async (
   data,
   bucketName,
-  objectName
+  objectName,
 ) => {
   try {
     // 创建临时目录
@@ -16,7 +16,7 @@ export const generateTwoDMarkersChart1 = async (
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_scatter_chart_${Date.now()}.jpeg`
+      `temp_scatter_chart_${Date.now()}.jpeg`,
     );
 
     // 获取 plotly.js 的绝对路径
@@ -25,7 +25,7 @@ export const generateTwoDMarkersChart1 = async (
       "src",
       "public",
       "js",
-      "plotly-3.0.1.min.js"
+      "plotly-3.0.1.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -43,13 +43,13 @@ export const generateTwoDMarkersChart1 = async (
 
       // 提取散点数据和线数据
       const scatterData = data.data.filter(
-        (item) => item.engineName !== "合同功率曲线"
+        (item) => item.engineName !== "合同功率曲线",
       )[0]; // 点数据
 
       const lineData = data.data.filter(
         (item) =>
           item.engineName === "合同功率曲线" ||
-          item.enginName === "合同功率曲线"
+          item.enginName === "合同功率曲线",
       )[0]; // 线数据
 
       // 提取唯一时间标签,并计算 tickvals 和 ticktext
@@ -74,7 +74,7 @@ export const generateTwoDMarkersChart1 = async (
       let colorValues = scatterData.colorbar
         ? scatterData.colorbar.map((date) => timeMapping[date])
         : scatterData.color.map((date) => timeMapping[date]);
-     
+
       // 绘制散点图
       const scatterTrace = {
         x: scatterData.xData,
@@ -162,7 +162,11 @@ export const generateTwoDMarkersChart1 = async (
         lineTrace ? `, ${JSON.stringify(lineTrace)}` : ""
       }];
             const layout = ${JSON.stringify(layout)};
-            Plotly.newPlot('chart', traces, layout, { responsive: true }).then(() => {
+            Plotly.newPlot('chart', traces, layout, {
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
               window.chartRendered = true; // 确保在图表渲染完成后设置
               console.log("图表渲染完成");
             }).catch((error) => {
@@ -175,9 +179,12 @@ export const generateTwoDMarkersChart1 = async (
 
       // 设置页面内容
       await page.setContent(htmlContent, {
-        waitUntil: "networkidle0",
+        waitUntil: "domcontentloaded",
+        timeout: 0,
       });
 
+      await page.waitForTimeout(1000);
+
       // 等待图表渲染完成,延长超时时间
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 150000, // 延长到 150 秒
@@ -197,7 +204,7 @@ export const generateTwoDMarkersChart1 = async (
       // 发送上传请求
       const response = await axios.post(
         `${process.env.API_BASE_URL}/examples/upload`,
-        { filePath: tempFilePath, bucketName, objectName }
+        { filePath: tempFilePath, bucketName, objectName },
       );
       return response?.data?.url;
     } catch (error) {

+ 17 - 8
downLoadServer/src/server/utils/chartsCom/WindRoseChart.js

@@ -9,7 +9,7 @@ export const getWindRoseChart = async (
   data,
   bucketName,
   objectName,
-  analysisTypeCode
+  analysisTypeCode,
 ) => {
   try {
     // 获取 plotly.js 的绝对路径
@@ -18,7 +18,7 @@ export const getWindRoseChart = async (
       "src",
       "public",
       "js",
-      "plotly-3.0.1.min.js"
+      "plotly-3.0.1.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -28,7 +28,7 @@ export const getWindRoseChart = async (
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_wind_rose_chart_${Date.now()}.jpeg`
+      `temp_wind_rose_chart_${Date.now()}.jpeg`,
     );
 
     // 定义风向的 16 等分
@@ -61,7 +61,7 @@ export const getWindRoseChart = async (
         const { windDirection, windSpeedRange } = item;
         const index = windDirections.findIndex(
           (dir, i) =>
-            windDirection >= dir && windDirection < windDirections[i + 1]
+            windDirection >= dir && windDirection < windDirections[i + 1],
         );
 
         if (index !== -1 && counts[windSpeedRange]) {
@@ -148,8 +148,12 @@ export const getWindRoseChart = async (
             <script>
               window.onload = function() {
                 Plotly.newPlot('chart', ${JSON.stringify(
-                  traces
-                )}, ${JSON.stringify(layout)}).then(() => {
+                  traces,
+                )}, ${JSON.stringify(layout)},{
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                   window.chartRendered = true;
                 });
               };
@@ -157,7 +161,12 @@ export const getWindRoseChart = async (
           </body>
         </html>
       `;
-      await page.setContent(htmlContent, { waitUntil: "networkidle0" });
+      await page.setContent(htmlContent, {
+        waitUntil: "domcontentloaded",
+        timeout: 0,
+      });
+
+      await page.waitForTimeout(1000);
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 60000,
       });
@@ -173,7 +182,7 @@ export const getWindRoseChart = async (
           filePath: tempFilePath,
           bucketName,
           objectName,
-        }
+        },
       );
       return response?.data?.url;
     } catch (error) {

+ 16 - 7
downLoadServer/src/server/utils/chartsCom/YewErrorBarChart.js

@@ -9,7 +9,7 @@ export const getYewErrorBarChart = async (
   data,
   bucketName,
   objectName,
-  analysisTypeCode
+  analysisTypeCode,
 ) => {
   try {
     // 提取机组编号和偏航误差值
@@ -103,7 +103,7 @@ export const getYewErrorBarChart = async (
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_yew_error_bar_chart_${Date.now()}.jpeg`
+      `temp_yew_error_bar_chart_${Date.now()}.jpeg`,
     );
 
     // 获取 plotly.js 的绝对路径
@@ -112,7 +112,7 @@ export const getYewErrorBarChart = async (
       "src",
       "public",
       "js",
-      "plotly-3.0.1.min.js"
+      "plotly-3.0.1.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -144,8 +144,12 @@ export const getYewErrorBarChart = async (
             <script>
               window.onload = function() {
                 Plotly.newPlot('chart', ${JSON.stringify(
-                  traces
-                )}, ${JSON.stringify(layout)}).then(() => {
+                  traces,
+                )}, ${JSON.stringify(layout)},{
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                   window.chartRendered = true;
                 });
               };
@@ -153,7 +157,12 @@ export const getYewErrorBarChart = async (
           </body>
         </html>
       `;
-      await page.setContent(htmlContent, { waitUntil: "networkidle0" });
+      await page.setContent(htmlContent, {
+        waitUntil: "domcontentloaded",
+        timeout: 0,
+      });
+
+      await page.waitForTimeout(1000);
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 60000,
       });
@@ -169,7 +178,7 @@ export const getYewErrorBarChart = async (
           filePath: tempFilePath,
           bucketName,
           objectName,
-        }
+        },
       );
       return response?.data?.url;
     } catch (error) {

+ 12 - 7
downLoadServer/src/server/utils/chartsCom/lineAndChildLine.js

@@ -16,7 +16,7 @@ import axios from "axios";
 export const generateLineAndChildLine = async (
   chartData,
   bucketName,
-  objectName
+  objectName,
 ) => {
   try {
     const colorSchemesItem = colorSchemes[0].colors;
@@ -112,7 +112,7 @@ export const generateLineAndChildLine = async (
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_line_chart_${Date.now()}.jpeg`
+      `temp_line_chart_${Date.now()}.jpeg`,
     );
 
     // 获取 plotly.js 的绝对路径
@@ -121,7 +121,7 @@ export const generateLineAndChildLine = async (
       "src",
       "public",
       "js",
-      "plotly-latest.min.js"
+      "plotly-latest.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -155,8 +155,10 @@ export const generateLineAndChildLine = async (
                         const data = ${JSON.stringify(data)};
                         const layout = ${JSON.stringify(layout)};
                         Plotly.newPlot('chart', data, layout, {
-                          responsive: true
-                        }).then(() => {
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                           window.chartRendered = true;
                         });
                       };
@@ -167,9 +169,12 @@ export const generateLineAndChildLine = async (
 
       // 设置页面内容
       await page.setContent(htmlContent, {
-        waitUntil: "networkidle0",
+        waitUntil: "domcontentloaded",
+        timeout: 0,
       });
 
+      await page.waitForTimeout(1000);
+
       // 等待图表渲染完成
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 60000,
@@ -193,7 +198,7 @@ export const generateLineAndChildLine = async (
       // 发送上传请求
       const response = await axios.post(
         `${process.env.API_BASE_URL}/examples/upload`,
-        { filePath: tempFilePath, bucketName, objectName }
+        { filePath: tempFilePath, bucketName, objectName },
       );
       return response?.data?.url;
     } finally {

+ 12 - 7
downLoadServer/src/server/utils/chartsCom/lineChartsFen.js

@@ -14,7 +14,7 @@ export const generateLineChart = async (
   data,
   bucketName,
   objectName,
-  fieldEngineCode
+  fieldEngineCode,
 ) => {
   try {
     // 创建临时目录
@@ -22,7 +22,7 @@ export const generateLineChart = async (
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_line_chart_${Date.now()}.jpeg`
+      `temp_line_chart_${Date.now()}.jpeg`,
     );
 
     // 获取 plotly.js 的绝对路径
@@ -31,7 +31,7 @@ export const generateLineChart = async (
       "src",
       "public",
       "js",
-      "plotly-latest.min.js"
+      "plotly-latest.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -144,8 +144,10 @@ export const generateLineChart = async (
                 const data = ${JSON.stringify(finalData)};
                 const layout = ${JSON.stringify(layout)};
                 Plotly.newPlot('chart', data, layout, {
-                  responsive: true
-                }).then(() => {
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                   window.chartRendered = true;
                 });
               };
@@ -156,9 +158,12 @@ export const generateLineChart = async (
 
       // 设置页面内容
       await page.setContent(htmlContent, {
-        waitUntil: "networkidle0",
+        waitUntil: "domcontentloaded",
+        timeout: 0,
       });
 
+      await page.waitForTimeout(1000);
+
       // 等待图表渲染完成
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 60000,
@@ -187,7 +192,7 @@ export const generateLineChart = async (
       // 发送上传请求
       const response = await axios.post(
         `${process.env.API_BASE_URL}/examples/upload`,
-        { filePath: tempFilePath, bucketName, objectName }
+        { filePath: tempFilePath, bucketName, objectName },
       );
       return response?.data?.url;
     } finally {

+ 17 - 10
downLoadServer/src/server/utils/chartsCom/powerMarkers2DCharts.js

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-04-28 14:15:23
- * @LastEditTime: 2025-07-09 14:32:04
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-17 09:34:08
+ * @LastEditors: MacBookPro
  * @Description: In User Settings Edit
  * @FilePath: /downLoadServer/src/server/utils/chartsCom/powerMarkers2DCharts.js
  */
@@ -16,7 +16,7 @@ import axios from "axios"; // 导入 axios
 export const generatepowerMarkers2DCharts = async (
   data,
   bucketName,
-  objectName
+  objectName,
 ) => {
   try {
     const colorsBar = colorSchemes[0].colors;
@@ -25,7 +25,7 @@ export const generatepowerMarkers2DCharts = async (
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_scatter_chart_${Date.now()}.jpeg`
+      `temp_scatter_chart_${Date.now()}.jpeg`,
     );
 
     // 获取 plotly.js 的绝对路径
@@ -34,7 +34,7 @@ export const generatepowerMarkers2DCharts = async (
       "src",
       "public",
       "js",
-      "plotly-3.0.1.min.js"
+      "plotly-3.0.1.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -52,11 +52,11 @@ export const generatepowerMarkers2DCharts = async (
 
       // 提取散点数据和线数据
       const scatterData = data.data.filter(
-        (item) => item.engineName !== "合同功率曲线"
+        (item) => item.engineName !== "合同功率曲线",
       )[0]; // 点数据
 
       const lineData = data.data.filter(
-        (item) => item.engineName === "合同功率曲线"
+        (item) => item.engineName === "合同功率曲线",
       )[0]; // 线数据
 
       // 保存原始颜色和大小
@@ -222,7 +222,11 @@ export const generatepowerMarkers2DCharts = async (
         lineTrace ? `, ${JSON.stringify(lineTrace)}` : ""
       }];
             const layout = ${JSON.stringify(layout)};
-            Plotly.newPlot('chart', traces, layout, { responsive: true }).then(() => {
+            Plotly.newPlot('chart', traces, layout, {
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
               window.chartRendered = true; // 确保在图表渲染完成后设置
               
             }).catch((error) => {
@@ -235,9 +239,12 @@ export const generatepowerMarkers2DCharts = async (
 
       // 设置页面内容
       await page.setContent(htmlContent, {
-        waitUntil: "networkidle0",
+        waitUntil: "domcontentloaded",
+        timeout: 0,
       });
 
+      await page.waitForTimeout(1000);
+
       // 等待图表渲染完成,延长超时时间
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 150000, // 延长到 150 秒
@@ -261,7 +268,7 @@ export const generatepowerMarkers2DCharts = async (
           filePath: tempFilePath,
           bucketName, //桶名称
           objectName, //在 MinIO 中的文件名
-        }
+        },
       );
       // return response.data; // 返回上传结果
       return response?.data?.url;

+ 16 - 7
downLoadServer/src/server/utils/chartsCom/yawErrorBarSum.js

@@ -10,7 +10,7 @@ export const getYawErrorBarSumCharts = async (
   data,
   bucketName,
   objectName,
-  analysisTypeCode
+  analysisTypeCode,
 ) => {
   try {
     // 提取静态偏航误差值和机组数量
@@ -90,7 +90,7 @@ export const getYawErrorBarSumCharts = async (
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_yaw_error_bar_sum_chart_${Date.now()}.jpeg`
+      `temp_yaw_error_bar_sum_chart_${Date.now()}.jpeg`,
     );
     // 获取 plotly.js 的绝对路径
     const plotlyPath = path.join(
@@ -98,7 +98,7 @@ export const getYawErrorBarSumCharts = async (
       "src",
       "public",
       "js",
-      "plotly-3.0.1.min.js"
+      "plotly-3.0.1.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -129,8 +129,12 @@ export const getYawErrorBarSumCharts = async (
             <script>
               window.onload = function() {
                 Plotly.newPlot('chart', [${JSON.stringify(
-                  trace
-                )}], ${JSON.stringify(layout)}).then(() => {
+                  trace,
+                )}], ${JSON.stringify(layout)},{
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                   window.chartRendered = true;
                 });
               };
@@ -138,7 +142,12 @@ export const getYawErrorBarSumCharts = async (
           </body>
         </html>
       `;
-      await page.setContent(htmlContent, { waitUntil: "networkidle0" });
+      await page.setContent(htmlContent, {
+        waitUntil: "domcontentloaded",
+        timeout: 0,
+      });
+
+      await page.waitForTimeout(1000);
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 60000,
       });
@@ -154,7 +163,7 @@ export const getYawErrorBarSumCharts = async (
           filePath: tempFilePath,
           bucketName,
           objectName,
-        }
+        },
       );
       return response.data.url;
     } catch (error) {

+ 18 - 9
downLoadServer/src/server/utils/chartsCom/yawErrorLine.js

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-05-14 10:49:00
- * @LastEditTime: 2025-07-09 14:33:10
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-17 09:35:08
+ * @LastEditors: MacBookPro
  * @Description: In User Settings Edit
  * @FilePath: /downLoadServer/src/server/utils/chartsCom/yawErrorLine.js
  */
@@ -16,7 +16,7 @@ import axios from "axios";
 export const generateYawErrorLine = async (
   chartData,
   bucketName,
-  objectName
+  objectName,
 ) => {
   try {
     const data = [];
@@ -27,7 +27,7 @@ export const generateYawErrorLine = async (
       "src",
       "public",
       "js",
-      "plotly-3.0.1.min.js"
+      "plotly-3.0.1.min.js",
     );
     const plotlyContent = await fs.readFile(plotlyPath, "utf-8");
 
@@ -125,7 +125,7 @@ export const generateYawErrorLine = async (
     await fs.ensureDir(tempDir);
     const tempFilePath = path.join(
       tempDir,
-      `temp_yaw_error_chart_${Date.now()}.jpeg`
+      `temp_yaw_error_chart_${Date.now()}.jpeg`,
     );
 
     try {
@@ -147,8 +147,12 @@ export const generateYawErrorLine = async (
             <script>
               window.onload = function() {
                 Plotly.newPlot('chart', ${JSON.stringify(
-                  data
-                )}, ${JSON.stringify(layout)}).then(() => {
+                  data,
+                )}, ${JSON.stringify(layout)},{
+  responsive: true,
+  displayModeBar: false,
+  staticPlot: true
+}).then(() => {
                   window.chartRendered = true;
                 });
               };
@@ -157,7 +161,12 @@ export const generateYawErrorLine = async (
         </html>
       `;
 
-      await page.setContent(htmlContent, { waitUntil: "networkidle0" });
+      await page.setContent(htmlContent, {
+        waitUntil: "domcontentloaded",
+        timeout: 0,
+      });
+
+      await page.waitForTimeout(1000);
       await page.waitForFunction(() => window.chartRendered === true, {
         timeout: 60000,
       });
@@ -175,7 +184,7 @@ export const generateYawErrorLine = async (
           filePath: tempFilePath,
           bucketName,
           objectName,
-        }
+        },
       );
 
       return response?.data?.url;

+ 172 - 0
downLoadServer/src/server/utils/copyFileImage.js

@@ -0,0 +1,172 @@
+import axios from "axios";
+// import sharp from "sharp";
+import pLimit from "p-limit";
+import archiver from "archiver";
+import { PassThrough } from "stream";
+
+const limit = pLimit(6);
+const imageCache = new Map();
+const MAX_RETRY = 3;
+
+/**
+ * 下载图片
+ */
+async function downloadImage(url) {
+  const safeUrl = url.replace(/#/g, "%23");
+
+  const res = await axios.get(safeUrl, {
+    responseType: "arraybuffer",
+    timeout: 20000,
+  });
+
+  return Buffer.from(res.data);
+}
+
+/**
+ * 压缩图片
+ */
+// async function compressImage(buffer) {
+//   return sharp(buffer)
+//     .resize({
+//       width: 1200,
+//       withoutEnlargement: true,
+//     })
+//     .webp({
+//       quality: 70,
+//     })
+//     .toBuffer();
+// }
+
+/**
+ * 处理单张图片
+ */
+async function processImage(url) {
+  if (!url) return null;
+
+  if (imageCache.has(url)) {
+    return imageCache.get(url);
+  }
+
+  for (let i = 0; i < MAX_RETRY; i++) {
+    try {
+      const buffer = await downloadImage(url);
+      //   const compressed = await compressImage(buffer);
+
+      imageCache.set(url, buffer);
+
+      return compressed;
+    } catch (err) {
+      if (i === MAX_RETRY - 1) {
+        console.warn("图片处理失败:", url);
+        return null;
+      }
+    }
+  }
+}
+
+/**
+ * 主处理函数
+ */
+export async function processChartsImages({
+  chartsImages,
+  bucketName,
+  objectName,
+}) {
+  console.log(chartsImages, "chartsImages");
+  console.log(bucketName, "bucketName");
+  console.log(objectName, "objectName");
+  if (!chartsImages) {
+    throw new Error("chartsImages不能为空");
+  }
+
+  const tasks = [];
+
+  for (const urls of Object.values(chartsImages)) {
+    if (!Array.isArray(urls)) continue;
+
+    urls.forEach((url) => {
+      tasks.push(limit(() => processImage(url)));
+    });
+  }
+
+  const images = (await Promise.all(tasks)).filter(Boolean);
+
+  if (!images.length) {
+    throw new Error("没有成功处理的图片");
+  }
+
+  const { downloadId, minioUrl } = await createZipStream(
+    images,
+    bucketName,
+    objectName,
+  );
+
+  return {
+    downloadId,
+    url: minioUrl,
+  };
+}
+
+/**
+ * 创建zip并上传MinIO
+ */
+async function createZipStream(images, bucketName, objectName) {
+  const downloadId = `images`;
+  const zipName = `${downloadId}.zip`;
+
+  const archive = archiver("zip", {
+    zlib: { level: 9 },
+  });
+
+  const zipStream = new PassThrough();
+
+  archive.pipe(zipStream);
+
+  images.forEach((buffer, index) => {
+    archive.append(buffer, {
+      name: `image_${index + 1}.webp`,
+    });
+  });
+
+  archive.finalize();
+
+  const minioUrl = await uploadStreamToMinio(
+    zipStream,
+    bucketName,
+    `${objectName}/${zipName}`,
+  );
+
+  return {
+    downloadId,
+    minioUrl,
+  };
+}
+
+/**
+ * 上传流到MinIO
+ */
+async function uploadStreamToMinio(stream, bucketName, objectName) {
+  console.log("开始上传ZIP到 MinIO...");
+
+  const response = await axios.post(
+    `${process.env.API_BASE_URL}/examples/uploadStream`,
+    stream,
+    {
+      headers: {
+        "Content-Type": "application/zip",
+        bucketName,
+        objectName,
+      },
+      maxContentLength: Infinity,
+      maxBodyLength: Infinity,
+    },
+  );
+
+  if (!response?.data?.url) {
+    throw new Error("MinIO 上传失败");
+  }
+
+  console.log("MinIO 上传成功");
+
+  return response.data.url;
+}

+ 3 - 3
downLoadServer/src/server/utils/minioService.js

@@ -1,8 +1,8 @@
 /*
  * @Author: your name
  * @Date: 2025-04-28 14:43:09
- * @LastEditTime: 2025-05-14 13:42:40
- * @LastEditors: bogon
+ * @LastEditTime: 2026-03-13 14:54:29
+ * @LastEditors: milo-MacBook-Pro.local
  * @Description: In User Settings Edit
  * @FilePath: /downLoadServer/src/server/utils/minioService.js
  */
@@ -10,7 +10,7 @@
 import { Client } from "minio";
 
 // 创建 MinIO 客户端
-const minioClient = new Client({
+export const minioClient = new Client({
   endPoint: process.env.MINIO_ENDPOINT, // 从环境变量中获取 MinIO 服务器地址
   port: parseInt(process.env.MINIO_PORT, 10), // 从环境变量中获取 MinIO 端口
   useSSL: false, // 如果使用 HTTPS,请设置为 true

+ 3 - 3
downLoadServer/src/test.mjs

@@ -17,15 +17,15 @@ const testChartGeneration = async () => {
     console.log("响应数据:", response.data);
     console.log(
       "图表URL:",
-      `http://127.0.0.1:3000${response.data.data.imageUrl}`
+      `http://127.0.0.1:3000${response.data.data.imageUrl}`,
     );
   } catch (error) {
     console.error(
       "测试失败:",
-      error.response ? error.response.data : error.message
+      error.response ? error.response.data : error.message,
     );
   }
 };
 
 // 运行测试
-testChartGeneration();
+// testChartGeneration();

BIN
downLoadServer/temp-images/image_1773380356597_0.webp


BIN
downLoadServer/temp-images/image_1773380356597_1.webp


BIN
downLoadServer/temp-images/image_1773380356604_0.webp


BIN
downLoadServer/temp-images/image_1773381971053_0.webp


BIN
downLoadServer/temp-images/image_1773381971053_1.webp


BIN
downLoadServer/temp-images/image_1773381971056_0.webp


BIN
downLoadServer/temp-images/images_1773380356605.zip


+ 3 - 1
package.json

@@ -5,10 +5,12 @@
   "scripts": {
     "serve:dev": "vue-cli-service serve --mode dev",
     "serve:hd": "vue-cli-service serve --mode hd",
+    "serve:dt": "vue-cli-service serve --mode dt",
     "serve:demo": "vue-cli-service serve --mode demo",
     "serve:jl": "vue-cli-service serve --mode jl",
     "build:dev": "vue-cli-service build --mode dev",
     "build:hd": "vue-cli-service build --mode hd",
+    "build:dt": "vue-cli-service build --mode dt",
     "build:demo": "vue-cli-service build --mode demo",
     "build:jl": "vue-cli-service build --mode jl"
   },
@@ -79,4 +81,4 @@
     "last 2 versions",
     "not dead"
   ]
-}
+}

+ 9 - 8
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-06-06 16:47:28
+ * @LastEditTime: 2026-03-04 09:22:34
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/temperature_large_components_low/index.vue
@@ -9,6 +9,7 @@
 
 <template>
   <div class="type-variable">
+    <!-- 齿轮箱-低速轴温度  -->
     <!-- 齿轮箱-低速轴温度分析 -->
     <div class="left scroller">
       <FilterChart
@@ -272,7 +273,7 @@ export default {
         // 获取风机列表
         await this.getWindEnfineList(
           this.initBatchCode,
-          "temperature_large_components"
+          "temperature_large_components",
         );
       } catch (err) {
         console.error("Failed to fetch data:", err);
@@ -315,8 +316,8 @@ export default {
               .filter((item) => item.fileAddr.endsWith(".json"))
               .filter((item) =>
                 item.fileAddr.includes(
-                  "gearbox_low_speed_shaft_bearing_temperature"
-                )
+                  "gearbox_low_speed_shaft_bearing_temperature",
+                ),
               )) ||
           []; //总图数据
         this.diagramRelationsDatas =
@@ -327,8 +328,8 @@ export default {
               .filter((item) => item.fileAddr.endsWith(".json"))
               .filter((item) =>
                 item.fileAddr.includes(
-                  "gearbox_low_speed_shaft_bearing_temperature"
-                )
+                  "gearbox_low_speed_shaft_bearing_temperature",
+                ),
               )) ||
           [];
       } catch (err) {
@@ -358,7 +359,7 @@ export default {
     //下一条
     handleNext() {
       const index = this.batchCodeList.findIndex(
-        (item) => item === this.initBatchCode
+        (item) => item === this.initBatchCode,
       );
       if (index === this.batchCodeList.length - 1) {
         this.$message.warning("已经是最后一个分析结果了");
@@ -369,7 +370,7 @@ export default {
     //上一条
     handlePrevious() {
       const index = this.batchCodeList.findIndex(
-        (item) => item === this.initBatchCode
+        (item) => item === this.initBatchCode,
       );
       if (index === 0) {
         this.$message.warning("没有上一条了");

+ 8 - 8
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-06-06 16:51:03
+ * @LastEditTime: 2026-03-04 09:22:27
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/overview/components/temperature_large_components_mid/index.vue
@@ -275,7 +275,7 @@ export default {
         // 获取风机列表
         await this.getWindEnfineList(
           this.initBatchCode,
-          "temperature_large_components"
+          "temperature_large_components",
         );
       } catch (err) {
         console.error("Failed to fetch data:", err);
@@ -318,8 +318,8 @@ export default {
               .filter((item) => item.fileAddr.endsWith(".json"))
               .filter((item) =>
                 item.fileAddr.includes(
-                  "gearboxmedium_speed_shaftbearing_temperature"
-                )
+                  "gearboxmedium_speed_shaftbearing_temperature",
+                ),
               )) ||
           []; //总图数据
         this.diagramRelationsDatas =
@@ -330,8 +330,8 @@ export default {
               .filter((item) => item.fileAddr.endsWith(".json"))
               .filter((item) =>
                 item.fileAddr.includes(
-                  "gearboxmedium_speed_shaftbearing_temperature"
-                )
+                  "gearboxmedium_speed_shaftbearing_temperature",
+                ),
               )) ||
           [];
       } catch (err) {
@@ -361,7 +361,7 @@ export default {
     //下一条
     handleNext() {
       const index = this.batchCodeList.findIndex(
-        (item) => item === this.initBatchCode
+        (item) => item === this.initBatchCode,
       );
       if (index === this.batchCodeList.length - 1) {
         this.$message.warning("已经是最后一个分析结果了");
@@ -372,7 +372,7 @@ export default {
     //上一条
     handlePrevious() {
       const index = this.batchCodeList.findIndex(
-        (item) => item === this.initBatchCode
+        (item) => item === this.initBatchCode,
       );
       if (index === 0) {
         this.$message.warning("没有上一条了");

+ 279 - 34
src/views/performance/assetssMag.vue

@@ -309,6 +309,18 @@
           min-width="300"
         >
           <template slot-scope="scope">
+            <!-- <el-button
+              @click="handleDownLoadChartImage(scope.row)"
+              type="text"
+              size="small"
+              :disabled="downloadDisabled"
+              v-if="
+                (scope.row.errState == 1 && scope.row.analysisState == 30) ||
+                scope.row.analysisState == 30
+              "
+            >
+              下载图表
+            </el-button> -->
             <el-button
               @click="handleDownLoadChart(scope.row)"
               type="text"
@@ -593,7 +605,7 @@ export default {
       itemAnalysis,
       itemField,
       filterAnalysis,
-      typeChart
+      typeChart,
     ) {
       try {
         if (itemField.analysisTypeName === "环境温度传感器") {
@@ -625,18 +637,18 @@ export default {
               filterAnalysis.typeDocxName === "production_indicator_unit"
                 ? "radar"
                 : urlType,
-          }
+          },
         );
         // 每完成 10% 提示一次(可调)
         const percent = Math.floor(
-          (this.progress.current / this.progress.total) * 100
+          (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} 张图表`
+            `📈 已完成 ${percent}%/${this.progress.current}张,共 ${this.progress.total} 张图表`,
           );
         }
         let key = `zn-techcn-replace-tags-${filterAnalysis.typeDocxName}-${typeChart}`;
@@ -685,6 +697,231 @@ export default {
         console.error("生成失败:", err);
       }
     },
+    async handleDownLoadChartImage(row) {
+      this.progress.current = 0;
+      this.progress.total = 0;
+      this.fileDataList = {};
+      this.setDownloadDisabled(true);
+      try {
+        await this.getAllAnalysis(row.batchCode);
+        await this.getFieldDetail(row.batchCode);
+        this.$message.info("开始下载图片");
+        const limit = pLimit(5); // 限制同时并发的请求数量为 5
+        const tasks = [];
+        for (const itemAnalysis of this.allAnalysis) {
+          const filterAnalysis = allAnalysisType.filter(
+            (itemType) => itemType.typeName === itemAnalysis.analysisTypeName,
+          )[0];
+          console.log(filterAnalysis, "filterAnalysis");
+          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("✅ 图表全部生成完成,开始下载图片...");
+        const wordFilePath = await axios.post(
+          "/downLoadChart/chartServer/charts/CopyFileImage",
+          {
+            fieldInfo: this.fieldInfo,
+            dataTime: `${this.analysisInfo.dataStartTime}-${this.analysisInfo.dataEndTime}`,
+            bucketName: "bucket-zhzn",
+            objectName: `charts/${row.fieldCode}/${row.batchCode}`,
+            engineTypeList: engineTypeList,
+            chartsImages: {
+              ...this.fileDataList,
+              // "zn-techcn-replace-tags-data_integrity_minute-generalFiles": [
+              //   "http://106.120.102.238:26900/bucket-zhzn/charts/WOF039800012/WOF039800012-WOB000002/temperature_environment/bartotal_Mid.jpg",
+              // ],
+
+              // "zn-techcn-replace-tags-data_integrity_second-generalFiles": [
+              //   "http://106.120.102.238:26900/bucket-zhzn/charts/WOF039800012/WOF039800012-WOB000002/temperature_large_components/gearbox_low_speed_shaft_bearing_temperature/%2302.jpg",
+              //   "http://106.120.102.238:26900/bucket-zhzn/charts/WOF039800012/WOF039800012-WOB000002/temperature_environment/bartotal_Mid.jpg",
+              // ],
+            },
+          },
+        );
+
+        // //下载minio 文件
+        this.downloadZip(wordFilePath.data.data.url);
+        // downloadDocx(
+        //   wordFilePath.data.data.url,
+        //   wordFilePath.data.data.fileName,
+        // );
+        this.$notify.success("🎉 图片已下载!");
+        this.setDownloadDisabled(false);
+      } catch (error) {
+        console.log(error, "error");
+        this.$notify.error("🎉 图片下载失败!");
+        this.setDownloadDisabled(false);
+      }
+    },
+    async downloadZip(url) {
+      const res = await axios.get(url, {
+        responseType: "blob",
+      });
+      const blob = new Blob([res.data], {
+        type: "application/zip",
+      });
+
+      const link = document.createElement("a");
+      link.href = URL.createObjectURL(blob);
+      link.download = "charts_images.zip";
+
+      document.body.appendChild(link);
+      link.click();
+      link.remove();
+    },
     async handleDownLoadChart(row) {
       this.progress.current = 0;
       this.progress.total = 0;
@@ -697,20 +934,21 @@ export default {
         this.$message.info("开始生成word文档");
         const limit = pLimit(5); // 限制同时并发的请求数量为 5
         const tasks = [];
+        let minioUrl = "";
         for (const itemAnalysis of this.allAnalysis) {
           const filterAnalysis = allAnalysisType.filter(
-            (itemType) => itemType.typeName === itemAnalysis.analysisTypeName
+            (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)
+                    item.fileAddr.includes(filterAnalysis.filterFileAddr),
                   ) || []
               : itemAnalysis.generalFiles) {
+              minioUrl = new URL(itemField.fileAddr);
               //静态偏航误差 --通过allAnalysisType.js文件配置实现需求
               if (Array.isArray(filterAnalysis.generalFiles.urlType)) {
                 filterAnalysis.generalFiles.urlType.map(
@@ -723,12 +961,12 @@ export default {
                           itemAnalysis,
                           itemField,
                           filterAnalysis,
-                          "generalFiles"
+                          "generalFiles",
                         );
                         this.progress.current++;
-                      })
+                      }),
                     );
-                  }
+                  },
                 );
               } else if (filterAnalysis.typeCode === "fault") {
                 if (itemField.fileAddr.includes("turbine_fault_result")) {
@@ -741,10 +979,10 @@ export default {
                           itemAnalysis,
                           itemField,
                           filterAnalysis,
-                          "generalFiles"
+                          "generalFiles",
                         );
                         this.progress.current++;
-                      })
+                      }),
                     );
                   }
                 } else {
@@ -757,10 +995,10 @@ export default {
                           itemAnalysis,
                           itemField,
                           filterAnalysis,
-                          "generalFiles"
+                          "generalFiles",
                         );
                         this.progress.current++;
-                      })
+                      }),
                     );
                   }
                 }
@@ -768,7 +1006,7 @@ export default {
                 //总图全场
                 if (
                   itemField.fileAddr.includes(
-                    filterAnalysis.generalFiles.FileTypeFromUrl
+                    filterAnalysis.generalFiles.FileTypeFromUrl,
                   )
                 ) {
                   tasks.push(
@@ -779,11 +1017,11 @@ export default {
                         itemAnalysis,
                         itemField,
                         filterAnalysis,
-                        "generalFiles"
+                        "generalFiles",
                       );
                       this.progress.current++;
                       // 每完成 10% 提示一次(可调)
-                    })
+                    }),
                   );
                 } else {
                   tasks.push(
@@ -794,10 +1032,10 @@ export default {
                         itemAnalysis,
                         itemField,
                         filterAnalysis,
-                        "generalFiles"
+                        "generalFiles",
                       );
                       this.progress.current++;
-                    })
+                    }),
                   );
                 }
               } else {
@@ -809,10 +1047,10 @@ export default {
                       itemAnalysis,
                       itemField,
                       filterAnalysis,
-                      "generalFiles"
+                      "generalFiles",
                     );
                     this.progress.current++;
-                  })
+                  }),
                 );
               }
             }
@@ -822,15 +1060,16 @@ export default {
               ? itemAnalysis.diagramRelations
                   .filter((item) => item.fileAddr.endsWith(".json"))
                   .filter((item) =>
-                    item.fileAddr.includes(filterAnalysis.filterFileAddr)
+                    item.fileAddr.includes(filterAnalysis.filterFileAddr),
                   ) || []
               : itemAnalysis.diagramRelations) {
+              minioUrl = new URL(itemField.fileAddr);
               const urlType = Array.isArray(
-                filterAnalysis.diagramRelations.urlType
+                filterAnalysis.diagramRelations.urlType,
               )
                 ? this.getFileTypeFromUrl(
                     itemField.fileAddr,
-                    filterAnalysis.diagramRelations.FileTypeFromUrl
+                    filterAnalysis.diagramRelations.FileTypeFromUrl,
                   ) === filterAnalysis.diagramRelations.FileTypeFromUrl
                   ? filterAnalysis.diagramRelations.urlType[0]
                   : filterAnalysis.diagramRelations.urlType[1]
@@ -843,10 +1082,10 @@ export default {
                     itemAnalysis,
                     itemField,
                     filterAnalysis,
-                    "diagramRelations"
+                    "diagramRelations",
                   );
                   this.progress.current++;
-                })
+                }),
               );
             }
           }
@@ -856,7 +1095,7 @@ export default {
 
         const engineTypeList = await this.getEngineTypeList(
           this.fieldInfo.engineMillTypes,
-          row.batchCode
+          row.batchCode,
         );
         this.$notify.success("✅ 图表全部生成完成,开始生成 Word 文档...");
         const wordFilePath = await axios.post(
@@ -868,12 +1107,18 @@ export default {
             objectName: `charts/${row.fieldCode}/${row.batchCode}`,
             engineTypeList: engineTypeList,
             ...this.fileDataList,
-          }
+          },
         );
+        const path = wordFilePath.data.data.url.replace(
+          /^https?:\/\/[^/]+/,
+          "",
+        );
+
         // //下载minio 文件
         downloadDocx(
-          wordFilePath.data.data.url,
-          wordFilePath.data.data.fileName
+          `${minioUrl.origin}${path}`,
+          // wordFilePath.data.data.url,
+          wordFilePath.data.data.fileName,
         );
         this.$notify.success("🎉 Word 文档生成并已下载!");
         this.setDownloadDisabled(false);
@@ -885,7 +1130,7 @@ export default {
     },
     async getEngineTypeList(typeList, batchCode) {
       return await Promise.all(
-        typeList.map((item) => this.getEngineMillList(item, batchCode))
+        typeList.map((item) => this.getEngineMillList(item, batchCode)),
       );
     },
     // 查询
@@ -912,7 +1157,7 @@ export default {
       this.loading = true;
       const res = await windEngineMillPage(paramsData);
       const filterMill = uniqueList.filter(
-        (item) => item.millTypeCode === res.data.list[0].millTypeCode
+        (item) => item.millTypeCode === res.data.list[0].millTypeCode,
       );
       return { ...res.data.list[0], ratedPower: filterMill[0].ratedCapacity };
     },
@@ -935,7 +1180,7 @@ export default {
     handleAutoAsstessList() {
       window.open(
         this.$router.resolve({ path: "/home/performance/autoAssetss" }).href,
-        "_blank"
+        "_blank",
       );
     },
     // 创建分析时请求
@@ -1061,7 +1306,7 @@ export default {
       if (state === "0") {
         // 分析状态为分析中
         this.$confirm(
-          "当前查看的分析记录为历史分析结果,最新分析记录还未分析完成不展示!"
+          "当前查看的分析记录为历史分析结果,最新分析记录还未分析完成不展示!",
         )
           .then(() => {
             navigateToDetails();