Jelajahi Sumber

光伏曲线分析、光照曲线分析、矩阵文字溢出,指标页面单位错误

baiyanting 1 tahun lalu
induk
melakukan
e9fb16f4a6
23 mengubah file dengan 3958 tambahan dan 935 penghapusan
  1. 3 2
      .env.development
  2. 48 0
      public/static/iframe.html
  3. 52 1
      src/api/powerAnalyse.js
  4. 25 691
      src/router/index.js
  5. 5 5
      src/views/HealthControl/energyEfficAnalyse/healthPowerCurve/components/current-scatter-chart.vue
  6. 65 21
      src/views/HealthControl/energyEfficAnalyse/healthPowerCurve/index.vue
  7. 398 0
      src/views/HealthControl/energyEfficAnalyse/powerAnalyse/components/current-scatter-chart.json
  8. 360 0
      src/views/HealthControl/energyEfficAnalyse/powerAnalyse/components/current-scatter-chart.vue
  9. 72 0
      src/views/HealthControl/energyEfficAnalyse/powerAnalyse/components/table.vue
  10. 751 0
      src/views/HealthControl/energyEfficAnalyse/powerAnalyse/index.vue
  11. 398 0
      src/views/HealthControl/energyEfficAnalyse/powerHotAnalyse/components/current-scatter-chart.json
  12. 403 0
      src/views/HealthControl/energyEfficAnalyse/powerHotAnalyse/components/current-scatter-chart.vue
  13. 72 0
      src/views/HealthControl/energyEfficAnalyse/powerHotAnalyse/components/table.vue
  14. 966 0
      src/views/HealthControl/energyEfficAnalyse/powerHotAnalyse/index.vue
  15. 0 5
      src/views/layout/Header.vue
  16. 37 0
      src/views/report/index copy.vue
  17. 1 1
      src/views/stateMonitor/DetailMatrix/index.vue
  18. 2 2
      src/views/stateMonitor/LightMatrix/index.vue
  19. 34 4
      src/views/stateMonitor/factoryMonitor/photovoltaic/lightDataTarget/index.vue
  20. 187 189
      src/views/stateMonitor/factoryMonitor/photovoltaic/lightMatrix/index.vue
  21. 13 8
      src/views/stateMonitor/factoryMonitor/photovoltaic/lightMatrixMonitor/index.vue
  22. 32 2
      src/views/stateMonitor/factoryMonitor/windPowerPlant/DataTarget/index.vue
  23. 34 4
      src/views/stateMonitor/zhzb/zhzb.vue

+ 3 - 2
.env.development

@@ -1,10 +1,11 @@
 
-VUE_APP_TEST=http://10.81.3.155:9002
+# VUE_APP_TEST=http://10.81.3.155:9002
+VUE_APP_TEST=http://192.168.1.106:9002
 
 
 # VUE_APP_API=http://192.168.1.110:6060
 VUE_APP_API=http://10.81.3.153:6060
-# VUE_APP_API=http://192.168.1.106:6060
+# VUE_APP_API=http://192.168.1.102:6060
 
 
 VUE_APP_ADAPTERURL=http://10.81.3.155:8011

+ 48 - 0
public/static/iframe.html

@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html lang="">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=10" />
+    <script type="text/javascript">
+      function doSubmit() {
+        var username = document.getElementById("username").value; //获取输入的用户名
+        var password = document.getElementById("password").value; //获取输入的参数
+        var scr = document.createElement("iframe"); //创建iframe
+        scr.src =
+          "https://202.99.219.114:28888/qjny/report/login/cross/domain?fine_username=" +
+          encodeURIComponent(username) +
+          "&fine_password=" +
+          encodeURIComponent(password) +
+          "&validity=" +
+          -1 +
+          "&callback=callback"; //将报表验证用户名密码的地址指向此iframe
+        if (scr.attachEvent) {
+          //判断是否为ie浏览器
+          scr.attachEvent("onload", function () {
+            //如果为ie浏览器则页面加载完成后立即执行
+            window.location = "https://202.99.219.114:28888/qjny/report"; //直接跳转到数据决策系统
+          });
+        } else {
+          scr.onload = function () {
+            //其他浏览器则重新加载onload事件
+            /*跳转到指定登录成功页面,index.jsp  
+                    var f = document.getElementById("login");  
+                    f.submit();  */
+            window.location = "https://202.99.219.114:28888/qjny/report"; //直接跳转到数据决策系统
+          };
+        }
+
+        document.getElementsByTagName("head")[0].appendChild(scr); //将iframe标签嵌入到head中
+      }
+      doSubmit();
+    </script>
+  </head>
+  <body>
+    <!-- <p>请登录</p>
+    <form id="login" name="login" method="POST" action="">
+      <p>用户名:<input id="username" type="text" name="username" /></p>
+      <p>密 码:<input id="password" type="password" name="password" /></p>
+      <input type="button" value="登录" onClick="doSubmit()" />
+    </form> -->
+  </body>
+</html>

+ 52 - 1
src/api/powerAnalyse.js

@@ -10,12 +10,13 @@ export function getPowerFittingId(data) {
   });
 }
 
-//获取拟合id
+//获取拟合曲线
 export function getPowerFittingChart(data) {
   return request({
     baseURL: process.env.VUE_APP_TEST,
     url: `new/power/fitting/curve?id=${data.id}`,
     method: "get",
+    timeout: 15000,
   });
 }
 //获取表格数据
@@ -34,3 +35,53 @@ export function getPowerFittingSelectedChart(data) {
     method: "get",
   });
 }
+//获取光伏圈选散点数据
+export function getPowerFittingSelectedChartGF(data) {
+  return request({
+    baseURL: process.env.VUE_APP_TEST,
+    url: `/photovol/filter?yk=${data.yk}&wk=${data.wk}`,
+    method: "get",
+  });
+}
+
+// 获取光伏电站设备
+export function getIntervers({ wpids }) {
+  return request({
+    baseURL: process.env.VUE_APP_TEST,
+    url: `photovol/wtByWplist?wpids=${wpids}`,
+    method: "get",
+  });
+}
+//获取光伏功率拟合图表数据
+export function getPowerFittingChartGF({
+  station,
+  inverters,
+  startdate,
+  enddate,
+}) {
+  return request({
+    baseURL: process.env.VUE_APP_TEST,
+    url: `/photovol/notfile/powertimefile?station=${station}&inverters=${inverters}&startdate=${startdate}&enddate=${enddate}`,
+    method: "get",
+    timeout: 30000,
+  });
+}
+//获取光伏功率光照图表数据
+export function getPowerHotChartGF({
+  station,
+  inverters,
+  startdate,
+  enddate,
+  interval,
+  maxs,
+  mins,
+  maxpower,
+  minpower,
+}) {
+  return request({
+    baseURL: process.env.VUE_APP_TEST,
+    url: `/photovol/curve?station=${station}&inverters=${inverters}&startdate=${startdate}&enddate=${enddate}&interval=${interval}&maxs=${maxs}&mins=${mins}&maxpower=${maxpower}&minpower=${minpower}`,
+    method: "get",
+    // timeout: 9000,
+  });
+}

+ 25 - 691
src/router/index.js

@@ -979,6 +979,30 @@ export const asyncRoutes = [
             },
           },
           {
+            path: "powerAnalyse",
+            component: () =>
+              import("@/views/HealthControl/energyEfficAnalyse/powerAnalyse"),
+            name: "powerAnalyse",
+            meta: {
+              title: "功率曲线分析",
+              icon: "",
+              permissions: ["jn_nxfx_glqxnh"],
+            },
+          },
+          {
+            path: "powerHotAnalyse",
+            component: () =>
+              import(
+                "@/views/HealthControl/energyEfficAnalyse/powerHotAnalyse"
+              ),
+            name: "powerHotAnalyse",
+            meta: {
+              title: "功率光照曲线分析",
+              icon: "",
+              permissions: ["jn_nxfx_glqxnh"],
+            },
+          },
+          {
             path: "qxpclfx",
             component: () =>
               import(
@@ -1128,6 +1152,7 @@ export const asyncRoutes = [
       icon: "",
       permissions: ["jn_zhbb"],
     },
+    // component: () => import("@/views/report/index copy.vue"),
     component: () => import("@/views/report"),
     children: [
       {
@@ -1229,697 +1254,6 @@ export const asyncRoutes = [
       },
     ],
   },
-  // 报表管理-统计分析
-  //   {
-  //     path: "/others/statisticAnalysis",
-  //     name: "statisticAnalysis",
-  //     component: () =>
-  //       import(
-  //         /* webpackChunkName: "fs" */ "../views/NewPages/statisticAnalysis.vue"
-  //       ),
-  //   },
-
-  //报表管理-统计分析-表底
-  //   {
-  //     path: "/others/statisticAnalysis/form",
-  //     name: "fr",
-  //     component: () =>
-  //       import(
-  //         /* webpackChunkName: "windsitehome" */ "../views/NewPages/form.vue"
-  //       ),
-  //   },
-  //报表管理-统计分析-场站
-  //   {
-  //     path: "/others/statisticAnalysis/station",
-  //     name: "cz",
-  //     component: () =>
-  //       import(
-  //         /* webpackChunkName: "windsitehome" */ "../views/NewPages/station.vue"
-  //       ),
-  //   },
-
-  //报表管理-统计分析-新能源日报
-  //   {
-  //     path: "/others/statisticAnalysis/daily",
-  //     name: "ny",
-  //     component: () =>
-  //       import(
-  //         /* webpackChunkName: "windsitehome" */ "../views/NewPages/daily.vue"
-  //       ),
-  //   },
-
-  //   {
-  //     path: "/decision/nhycfsdl",
-  //     name: "nhycfsdl",
-  //     component: () =>
-  //       import(/* webpackChunkName: "nhycfsdl" */ "../views/report/nhycfsdl.vue"),
-  //   },
-  //   {
-  //     path: "/decision/xzycfsdl",
-  //     name: "xzycfsdl",
-  //     component: () =>
-  //       import(/* webpackChunkName: "xzycfsdl" */ "../views/report/xzycfsdl.vue"),
-  //   },
-  /***********************************************************经济运行************************************************************* */
-  /***********************************************************智慧检修************************************************************* */
-
-//   {
-//     path: "/health/sandtable",
-//     name: "sandtable",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "sandtable" */ "../views/SandTable/SandTable.vue"
-//       ),
-//   },
-//   // 等级评估(单机等级评估管理-量化评级)
-//   {
-//     path: "/health/assess/index",
-//     name: "assessindex",
-//     component: () => import("../views/HealthControl/assess/assessindex.vue"),
-//   },
-//   {
-//     path: "/health/assess/selfEvaluate", // 自组合评级
-//     name: "assessEvaluate",
-//     component: () => import("../views/HealthControl/assess/selfEvaluate.vue"),
-//   },
-//   {
-//     path: "/health/assess/config",
-//     name: "assessconfig",
-//     component: () => import("../views/HealthControl/assess/assessconfig.vue"),
-//   },
-//   {
-//     path: "/health/zhpj/yxpj", //运行评价
-//     name: "yxpj",
-//     component: () => import("../views/HealthControl/zhpj/yxpj.vue"),
-//   },
-//   {
-//     path: "/health/zhpj/jxpj", //检修评价
-//     name: "jxpj",
-//     component: () => import("../views/HealthControl/zhpj/jxpj.vue"),
-//   },
-//   {
-//     path: "/health/gzzd/malfunctionDiagnose", // 故障诊断
-//     name: "malfunctionDiagnose",
-//     component: () => import("../views/malfunctionDiagnose/index.vue"),
-//   },
-//   {
-//     path: "/health/gzzd/malfunctionRecall", // 故障回溯
-//     name: "malfunctionRecall",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "malfunctionStatistics" */ "../views/malfunctionRecall/index.vue"
-//       ),
-//   },
-//   {
-//     path: "/health/gzzd/gzfl", // 故障分类
-//     name: "gzfl",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "malfunctionStatistics" */ "../views/malfunctionDiagnose/gzfl.vue"
-//       ),
-//   },
-//   {
-//     path: "/health/gzzd/yjfl", // 预警分类
-//     name: "yjfl",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "malfunctionStatistics" */ "../views/malfunctionDiagnose/yjfl.vue"
-//       ),
-//   },
-
-//   {
-//     path: "/health/health1",
-//     name: "health1",
-//     component: () => import("../views/HealthControl/Health1.vue"),
-//   },
-
-//   {
-//     path: "/health/allLifeManage", // 全生命周期管理
-//     name: "allLifeManage",
-//     component: () => import("../views/allLifeManage/index.vue"),
-//   },
-
-//   {
-//     path: "/health/nxfx/phdffx", // 偏航对风分析
-//     name: "phdffx",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "malfunctionStatistics" */ "../views/windAnalysis/phdffx.vue"
-//       ),
-//   },
-//   {
-//     path: "/health/nxfx/cutAnalyse", // 切入切出分析
-//     name: "cutAnalyse",
-//     component: () => import("../views/cutAnalyse/index.vue"),
-//   },
-
-//   {
-//     path: "/health/kkxfx/alarmcenter1",
-//     name: "alarmcenter1",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "alarmcenter1" */ "../views/NewPages/alarm-center-1.vue"
-//       ),
-//   },
-//   {
-//     path: "/health/kkxfx/alarmcenter2",
-//     name: "alarmcenter2",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "alarmcenter2" */ "../views/NewPages/alarm-center-2.vue"
-//       ),
-//   },
-//   {
-//     path: "/health/kkxfx/warnStatistics", // 预警评判分析
-//     name: "warnStatistics",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "warnStatistics" */ "../views/warnStatistics/index.vue"
-//       ),
-//   },
-//   {
-//     path: "/health/kkxfx/malfunctionStatistics", // 故障评判分析
-//     name: "malfunctionStatistics",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "malfunctionStatistics" */ "../views/malfunctionStatistics/index.vue"
-//       ),
-//   },
-//   {
-//     path: "/health/kkxfx/bjgltjb",
-//     name: "bjgltjb",
-//     component: () =>
-//       import(/* webpackChunkName: "bjgltjb" */ "../views/report/bjgltjb.vue"),
-//   },
-//   {
-//     path: "/health/fzyfx/windAnalysis", // 风资源分析
-//     name: "windAnalysis",
-//     component: () => import("../views/windAnalysis/index.vue"),
-//   },
-//   {
-//     path: "/health/fzyfx/windAnalysis/fx", // 风向
-//     name: "fxzstmain",
-//     component: () => import("../views/windAnalysis/fxzstmain.vue"),
-//   },
-//   {
-//     path: "/health/MalfunctionWarning/", //故障预警 无监督学习
-//     name: "MalfunctionWarning",
-//     component: () =>
-//       import("../views/MalfunctionWarning/MalfunctionWarning.vue"),
-//   },
-//   {
-//     path: "/health/MalfunctionWarning/Supervised", //有监督学习
-//     name: "Supervised",
-//     component: () => import("../views/MalfunctionWarning/supervised.vue"),
-//   },
-//   /***********************************************************智慧检修************************************************************* */
-//   /***********************************************************安全管控************************************************************* */
-//   {
-//     path: "/save",
-//     name: "save",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "personnel" */ "../views/NewPages/iframe4.vue"
-//       ),
-//   },
-//   {
-//     path: "/save/personnel",
-//     name: "personnel",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "personnel" */ "../views/NewPages/personnel.vue"
-//       ),
-//   },
-//   {
-//     path: "/globalMonitor", // 全局监视
-//     name: "globalMonitor",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "globalMonitor" */ "../views/Others/index.vue"
-//       ),
-//   },
-//   /***********************************************************安全管控************************************************************* */
-
-//   {
-//     path: "/others/reportPandect", // 报表总览
-//     name: "reportPandect",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "reportPandect" */ "../views/reportPandect/index.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/tjfx",
-//     name: "tjfx",
-//     component: () =>
-//       import(/* webpackChunkName: "tjfx" */ "../views/report/tjfx.vue"),
-//   },
-//   {
-//     path: "/others/bdzcx",
-//     name: "bdzcx",
-//     component: () =>
-//       import(/* webpackChunkName: "bdzcx" */ "../views/report/bdzcx.vue"),
-//   },
-//   {
-//     path: "/others/oafd",
-//     name: "oafd",
-//     component: () =>
-//       import(/* webpackChunkName: "oafd" */ "../views/report/oafd.vue"),
-//   },
-//   {
-//     path: "/others/oagf",
-//     name: "oagf",
-//     component: () =>
-//       import(/* webpackChunkName: "oagf" */ "../views/report/oagf.vue"),
-//   },
-//   {
-//     path: "/others/missfdrb",
-//     name: "missfdrb",
-//     component: () =>
-//       import(/* webpackChunkName: "missfdrb" */ "../views/report/missfdrb.vue"),
-//   },
-//   {
-//     path: "/others/missgfrb",
-//     name: "missgfrb",
-//     component: () =>
-//       import(/* webpackChunkName: "missgfrb" */ "../views/report/missgfrb.vue"),
-//   },
-//   {
-//     path: "/others/xnyfdscyb",
-//     name: "xnyfdscyb",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "xnyfdscyb" */ "../views/report/xnyfdscyb.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/mhsscyb",
-//     name: "mhsscyb",
-//     component: () =>
-//       import(/* webpackChunkName: "mhsscyb" */ "../views/report/mhsscyb.vue"),
-//   },
-//   {
-//     path: "/others/nssscyb",
-//     name: "nssscyb",
-//     component: () =>
-//       import(/* webpackChunkName: "nssscyb" */ "../views/report/nssscyb.vue"),
-//   },
-//   {
-//     path: "/others/qsscyb",
-//     name: "qsscyb",
-//     component: () =>
-//       import(/* webpackChunkName: "qsscyb" */ "../views/report/qsscyb.vue"),
-//   },
-//   {
-//     path: "/others/sbqscyb",
-//     name: "sbqscyb",
-//     component: () =>
-//       import(/* webpackChunkName: "sbqscyb" */ "../views/report/sbqscyb.vue"),
-//   },
-//   {
-//     path: "/others/xsscyb",
-//     name: "xsscyb",
-//     component: () =>
-//       import(/* webpackChunkName: "xsscyb" */ "../views/report/xsscyb.vue"),
-//   },
-//   {
-//     path: "/others/xnygfscyb",
-//     name: "xnygfscyb",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "xnygfscyb" */ "../views/report/xnygfscyb.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/dwkscyb",
-//     name: "dwkscyb",
-//     component: () =>
-//       import(/* webpackChunkName: "dwkscyb" */ "../views/report/dwkscyb.vue"),
-//   },
-//   {
-//     path: "/others/plscyb",
-//     name: "plscyb",
-//     component: () =>
-//       import(/* webpackChunkName: "plscyb" */ "../views/report/plscyb.vue"),
-//   },
-//   {
-//     path: "/others/xhscyb",
-//     name: "xhscyb",
-//     component: () =>
-//       import(/* webpackChunkName: "xhscyb" */ "../views/report/xhscyb.vue"),
-//   },
-
-//   {
-//     path: "/others/djyrbb",
-//     name: "djyrbb",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "fdczzdy" */ "../views/report/stationReport/djyrbb.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/hsmrbb",
-//     name: "hsmrbb",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "fdczzdy" */ "../views/report/stationReport/hsmrbb.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/mljrbb",
-//     name: "mljrbb",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "fdczzdy" */ "../views/report/stationReport/mljrbb.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/njlrbb",
-//     name: "njlrbb",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "fdczzdy" */ "../views/report/stationReport/njlrbb.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/pdlrbb",
-//     name: "pdlrbb",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "fdczzdy" */ "../views/report/stationReport/pdlrbb.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/ptzrbb",
-//     name: "ptzrbb",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "fdczzdy" */ "../views/report/stationReport/ptzrbb.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/xwtrbb",
-//     name: "xwtrbb",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "fdczzdy" */ "../views/report/stationReport/xwtrbb.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/ytyrbb",
-//     name: "ytyrbb",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "fdczzdy" */ "../views/report/stationReport/ytyrbb.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/ylzrbb",
-//     name: "ylzrbb",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "fdczzdy" */ "../views/report/stationReport/ylzrbb.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/yfrbb",
-//     name: "yfrbb",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "fdczzdy" */ "../views/report/stationReport/yfrbb.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/zkrbb",
-//     name: "zkrbb",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "fdczzdy" */ "../views/report/stationReport/zkrbb.vue"
-//       ),
-//   },
-
-//   {
-//     path: "/others/gfczzdy",
-//     name: "gfczzdy",
-//     component: () =>
-//       import(/* webpackChunkName: "gfczzdy" */ "../views/report/gfczzdy.vue"),
-//   },
-//   {
-//     path: "/others/gfxmzdy",
-//     name: "gfxmzdy",
-//     component: () =>
-//       import(/* webpackChunkName: "gfxmzdy" */ "../views/report/gfxmzdy.vue"),
-//   },
-//   {
-//     path: "/others/xnyrb",
-//     name: "xnyrb",
-//     component: () =>
-//       import(/* webpackChunkName: "xnyrb" */ "../views/report/xnyrb.vue"),
-//   },
-//   {
-//     path: "/others/weather",
-//     name: "weather",
-//     component: () => import("../views/report/weather.vue"),
-//   },
-//   {
-//     path: "/others/ExportExcel",
-//     name: "ExportExcel",
-//     component: () => import("../views/report/ExportExcel.vue"),
-//   },
-//   {
-//     path: "/others/realSearch", // 测点数据查询
-//     name: "realSearch",
-//     component: () => import("../views/realSearch/index.vue"),
-//   },
-//   {
-//     path: "/others/historysearch",
-//     name: "historysearch",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "historysearch" */ "../views/NewPages/history-search.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/historySearch", // 测点历史数据查询
-//     name: "historySearch",
-//     component: () => import("../views/historySearch/index.vue"),
-//   },
-//   {
-//     path: "/others/alarmCenter/alarmcenter",
-//     name: "alarmcenter",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "personnel" */ "../views/NewPages/alarm-center.vue"
-//       ),
-//   },
-//   {
-//     path: "/others/alarmCenter/tjsj",
-//     name: "tjsj",
-//     component: () =>
-//       import(/* webpackChunkName: "tjsj" */ "../views/warn/tjsj.vue"),
-//   },
-//   {
-//     path: "/others/alarmCenter/xdgl",
-//     name: "xdgl",
-//     component: () =>
-//       import(/* webpackChunkName: "xdgl" */ "../views/warn/xdgl.vue"),
-//   }, // 报警中心-升压站报警
-//   {
-//     path: "/others/alarmCenter/ztzhjl",
-//     name: "ztzhjl",
-//     component: () =>
-//       import(/* webpackChunkName: "ztzhjl" */ "../views/warn/ztzhjl.vue"),
-//   },
-//   {
-//     path: "/others/alarmCenter/czjl",
-//     name: "czjl",
-//     component: () =>
-//       import(/* webpackChunkName: "czjl" */ "../views/warn/czjl.vue"),
-//   },
-// //   {
-// //     //光伏告警
-// //     path: "/others/alarmCenter/gfgj",
-// //     name: "gfgj",
-// //     component: () =>
-// //       import(/* webpackChunkName: "gfgj" */ "../views/warn/gfgj.vue"),
-// //   },
-// //   {
-// //     path: "/others/alarmCenter/boosterAlarm",
-// //     name: "boosterAlarm",
-// //     component: () => import("../views/alarmCenter/boosterAlarm.vue"),
-// //   },
-//   //故障样本库
-//   {
-//     path: "/others/fault",
-//     name: "fault",
-//     component: () => import("../views/sampleDatabase/fault/index.vue"),
-//   },
-//   //性能样本库
-//   {
-//     path: "/others/performance",
-//     name: "performance",
-//     component: () => import("../views/sampleDatabase/performance/index.vue"),
-//   },
-//   //预警样本库
-//   {
-//     path: "/others/warning",
-//     name: "warning",
-//     component: () => import("../views/sampleDatabase/warning/index.vue"),
-//   },
-//   //性能预警综合分析
-//   {
-//     path: "/others/analysis",
-//     name: "analysis",
-//     component: () => import("../views/sampleDatabase/analysis/index.vue"),
-//   },
-//   //样本库功率曲线分析
-//   {
-//     path: "/others/powerline/analysis",
-//     name: "powerlineAnalysis",
-//     component: () =>
-//       import("../views/sampleDatabase/powerlineAnalysis/index.vue"),
-//   },
-//   //知识库
-//   {
-//     path: "/others/knowledgeBase",
-//     name: "knowledgeBase",
-//     component: () => import("../views/sampleDatabase/knowledgeBase/index.vue"),
-//   },
-//   //发电能力分析
-//   // {
-//   // 	path: "/others/abilityAnalysis",
-//   // 	name: "abilityAnalysis",
-//   // 	component: () => import("../views/sampleDatabase/abilityAnalysis/index.vue")
-//   // },
-//   //智能营销样本库
-//   {
-//     path: "/others/market",
-//     name: "market",
-//     component: () => import("../views/sampleDatabase/market/index.vue"),
-//   },
-//   // 报警中心-SCADA报警
-//   {
-//     path: "/others/alarmCenter/scadaAlarm",
-//     name: "scadaAlarm",
-//     component: () => import("../views/alarmCenter/scadaAlarm.vue"),
-//   },
-//   // 报警中心-自定义报警
-//   {
-//     path: "/others/alarmCenter/customAlarm",
-//     name: "customAlarm",
-//     component: () => import("../views/alarmCenter/customAlarm.vue"),
-//   },
-//   // 报警中心-自定义报警统计
-//   {
-//     path: "/others/alarmCenter/customStatistics",
-//     name: "customStatistics",
-//     component: () => import("../views/alarmCenter/customStatistics.vue"),
-//   },
-//   {
-//     path: "/others/knowledge/knowledge", //故障知识列表
-//     name: "knowledge1",
-//     component: () => import("../views/Knowledge/Knowledge1.vue"),
-//   },
-//   {
-//     path: "/others/knowledge/knowledge2", //安全措施知识
-//     name: "knowledge2",
-//     component: () => import("../views/Knowledge/Knowledge2.vue"),
-//   },
-//   // {
-//   // 	path: '/others/knowledge/knowledge3', //风险辨识知识
-//   // 	name: 'knowledge3',
-//   // 	component: () =>
-//   // 		import('../views/Knowledge/Knowledge3.vue'),
-//   // },
-//   {
-//     path: "/others/knowledge/knowledge4", //作业指导知识
-//     name: "knowledge4",
-//     component: () => import("../views/Knowledge/Knowledge4.vue"),
-//   },
-//   {
-//     path: "/others/knowledge/knowledge4/AC", //安措内容分类
-//     name: "knowledgeA",
-//     component: () => import("../views/Knowledge/safety.vue"),
-//   },
-//   {
-//     path: "/others/knowledge/knowledge4/WX", //危险地点内容
-//     name: "knowledgeW",
-//     component: () => import("../views/Knowledge/risk .vue"),
-//   },
-
-//   {
-//     path: "/others/knowledge/knowledge5", //特征参数
-//     name: "knowledge5",
-//     component: () => import("../views/Knowledge/Knowledge5.vue"),
-//   },
-//   {
-//     path: "/others/knowledge/knowledge6", //排查检修方案
-//     name: "knowledge6",
-//     component: () => import("../views/Knowledge/Knowledge6.vue"),
-//   },
-//   {
-//     path: "/others/knowledge/knowledge7", //预警知识
-//     name: "knowledge7",
-//     component: () => import("../views/Knowledge/Knowledge7.vue"),
-//   },
-//   {
-//     path: "/device/device", //设备管理
-//     name: "device",
-//     component: () => import("../views/device/device.vue"),
-//   },
-
-  /***********************************************************其他************************************************************ */
-//   {
-//     path: "/planPower",
-//     name: "planPower",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "planPower" */ "../views/planPower/index.vue"
-//       ),
-//   },
-//   {
-//     path: "/new/intelligentalarmcenter",
-//     name: "intelligentalarmcenter",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "intelligentalarmcenter" */
-//         "../views/NewPages/intelligent-alarm-center.vue"
-//       ),
-//   },
-//   {
-//     path: "/new/knowledgebase",
-//     name: "knowledgebase",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "knowledgebase" */ "../views/NewPages/knowledge-base.vue"
-//       ),
-//   },
-//   {
-//     path: "/new/dj",
-//     name: "dj",
-//     component: () =>
-//       import(/* webpackChunkName: "dj" */ "../views/NewPages/dj.vue"),
-//   },
-//   {
-//     path: "/new/dj2",
-//     name: "dj2",
-//     component: () =>
-//       import(/* webpackChunkName: "dj2" */ "../views/NewPages/dj2.vue"),
-//   },
-//   {
-//     path: "/new/dialog",
-//     name: "dialog",
-//     component: () =>
-//       import(/* webpackChunkName: "dj2" */ "../views/NewPages/dialogs.vue"),
-//   },
-//   {
-//     path: "/new/powerforecast2",
-//     name: "powerforecast2",
-//     component: () =>
-//       import(
-//         /* webpackChunkName: "powerforecast2" */ "../views/NewPages/power-forecast-2.vue"
-//       ),
-//   },
 ];
 const router = createRouter({
   history: createWebHashHistory(),

+ 5 - 5
src/views/HealthControl/energyEfficAnalyse/healthPowerCurve/components/current-scatter-chart.vue

@@ -139,17 +139,17 @@ export default {
           x: "right",
           position: [10, 10],
           // backgroundColor:'rgba(0,0,0,0.4)',
-          borderColor: partten.getColor("gray"),
+          borderColor: "#ccc",
           textStyle: {
-            fontSize: util.vh(16),
-            color: partten.getColor("gray"),
+            fontSize: 16,
+            color: "#ccc",
           },
           iconStyle: {
-            borderColor: partten.getColor("gray"),
+            borderColor: "#ccc",
           },
           emphasis: {
             iconStyle: {
-              borderColor: partten.getColor("gray"),
+              borderColor: "#ccc",
             },
           },
         },

+ 65 - 21
src/views/HealthControl/energyEfficAnalyse/healthPowerCurve/index.vue

@@ -39,6 +39,13 @@
                 placeholder="请选择"
                 popper-class="select"
               >
+                <el-checkbox
+                  v-if="isMultiple"
+                  v-model="checked"
+                  :indeterminate="indeterminate"
+                  @change="selectAll"
+                  >全选</el-checkbox
+                >
                 <el-option
                   v-for="item in wtArray"
                   :key="item.id"
@@ -393,11 +400,69 @@ export default {
       wtTab: "table",
       wtDialog: false,
       wtData: [],
+      isMultiple: false,
+      checked: false,
+      indeterminate: false,
     };
   },
+  created() {
+    this.getWp();
+  },
 
+  watch: {
+    mode(val) {
+      if (val == 0) {
+        this.isMultiple = false;
+        this.wtIds =
+          typeof this.wtIds == "string"
+            ? this.wtIds
+            : this.wtIds.length
+            ? this.wtIds[0]
+            : [];
+      } else {
+        this.isMultiple = true;
+        this.wtIds = [this.wtIds];
+      }
+    },
+    wtIds: {
+      handler(newVal, oldVal) {
+        this.$nextTick(() => {
+          if (this.isMultiple) {
+            this.wtIds = newVal;
+            if (this.wtArray.length && this.wtIds) {
+              if (this.wtIds.length === this.wtArray.length) {
+                this.checked = true;
+                this.indeterminate = false;
+              } else if (this.wtIds.length < this.wtArray.length) {
+                this.checked = false;
+                if (this.wtIds.length != 0) {
+                  this.indeterminate = true;
+                }
+                if (newVal.length == 0) {
+                  this.$message.error("必须至少选择一项");
+                  this.wtIds = oldVal;
+                }
+              }
+            }
+          }
+        });
+      },
+      immediate: true,
+    },
+  },
   // 函数
   methods: {
+    selectAll() {
+      if (this.checked) {
+        this.wtArray.forEach((item) => {
+          this.wtIds.push(item.id);
+        });
+        this.wtIds = [...new Set(this.wtIds)];
+        this.indeterminate = false;
+      } else {
+        this.wtIds = [this.wtArray[0].id];
+      }
+    },
     // 时间选择器第一个禁用
     disabledDate(time) {
       if (this.et) {
@@ -832,27 +897,6 @@ export default {
     },
   },
 
-  created() {
-    this.getWp();
-  },
-
-  watch: {
-    mode(val) {
-      if (val == 0) {
-        this.isMultiple = false;
-        this.wtIds =
-          typeof this.wtIds == "string"
-            ? this.wtIds
-            : this.wtIds.length
-            ? this.wtIds[0]
-            : [];
-      } else {
-        this.isMultiple = true;
-        this.wtIds = [this.wtIds];
-      }
-    },
-  },
-
   unmounted() {},
 };
 </script>

+ 398 - 0
src/views/HealthControl/energyEfficAnalyse/powerAnalyse/components/current-scatter-chart.json

@@ -0,0 +1,398 @@
+
+{
+	"color": [
+			"#1C99FF",
+			"#FF8700",
+			"#e6b600d9",
+			"#0098d9",
+			"#3D54BE",
+			"#005eaa",
+			"#cda819",
+			"#32a487"
+	],
+	"textStyle": {},
+	"title": {
+			"textStyle": {
+					"color": "#333333"
+			},
+			"subtextStyle": {
+					"color": "#aaaaaa"
+			}
+	},
+	"line": {
+			"itemStyle": {
+					"borderWidth": 1
+			},
+			"lineStyle": {
+					"width": 2
+			},
+			"symbolSize": 4,
+			"symbol": "emptyCircle",
+			"smooth": false
+	},
+	"radar": {
+			"itemStyle": {
+					"borderWidth": 1
+			},
+			"lineStyle": {
+					"width": 2
+			},
+			"symbolSize": 4,
+			"symbol": "emptyCircle",
+			"smooth": false
+	},
+	"bar": {
+			"itemStyle": {
+					"barBorderWidth": 0,
+					"barBorderColor": "#ccc"
+			}
+	},
+	"pie": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"scatter": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"boxplot": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"parallel": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"sankey": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"funnel": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"gauge": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"candlestick": {
+			"itemStyle": {
+					"color": "#c12e34",
+					"color0": "#2b821d",
+					"borderColor": "#c12e34",
+					"borderColor0": "#2b821d",
+					"borderWidth": 1
+			}
+	},
+	"graph": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			},
+			"lineStyle": {
+					"width": 1,
+					"color": "#aaaaaa"
+			},
+			"symbolSize": 4,
+			"symbol": "emptyCircle",
+			"smooth": false,
+			"color": [
+					"#c12e34",
+					"#e6b600",
+					"#0098d9",
+					"#50ec39",
+					"#005eaa",
+					"#339ca8",
+					"#cda819",
+					"#32a487"
+			],
+			"label": {
+					"color": "#eeeeee"
+			}
+	},
+	"map": {
+			"itemStyle": {
+					"areaColor": "#ddd",
+					"borderColor": "#eee",
+					"borderWidth": 0.5
+			},
+			"label": {
+					"color": "#c12e34"
+			},
+			"emphasis": {
+					"itemStyle": {
+							"areaColor": "#e6b600",
+							"borderColor": "#ddd",
+							"borderWidth": 1
+					},
+					"label": {
+							"color": "#c12e34"
+					}
+			}
+	},
+	"geo": {
+			"itemStyle": {
+					"areaColor": "#ddd",
+					"borderColor": "#eee",
+					"borderWidth": 0.5
+			},
+			"label": {
+					"color": "#c12e34"
+			},
+			"emphasis": {
+					"itemStyle": {
+							"areaColor": "#e6b600",
+							"borderColor": "#ddd",
+							"borderWidth": 1
+					},
+					"label": {
+							"color": "#c12e34"
+					}
+			}
+	},
+	"categoryAxis": {
+			"axisLine": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisTick": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisLabel": {
+					"show": true,
+					"color": "#838383"
+			},
+			"splitLine": {
+					"show": false,
+					"lineStyle": {
+							"color": [
+									"#838383"
+							]
+					}
+			},
+			"splitArea": {
+					"show": false,
+					"areaStyle": {
+							"color": [
+									"rgba(250,250,250,0.3)",
+									"rgba(200,200,200,0.3)"
+							]
+					}
+			}
+	},
+	"valueAxis": {
+			"axisLine": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisTick": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisLabel": {
+					"show": true,
+					"color": "#838383"
+			},
+			"splitLine": {
+					"show": true,
+					"lineStyle": {
+							"color": [
+									"#ccc"
+							]
+					}
+			},
+			"splitArea": {
+					"show": false,
+					"areaStyle": {
+							"color": [
+									"rgba(250,250,250,0.3)",
+									"rgba(200,200,200,0.3)"
+							]
+					}
+			}
+	},
+	"logAxis": {
+			"axisLine": {
+					"show": true,
+					"lineStyle": {
+							"color": "#333"
+					}
+			},
+			"axisTick": {
+					"show": true,
+					"lineStyle": {
+							"color": "#333"
+					}
+			},
+			"axisLabel": {
+					"show": true,
+					"color": "#333"
+			},
+			"splitLine": {
+					"show": true,
+					"lineStyle": {
+							"color": [
+									"#ccc"
+							]
+					}
+			},
+			"splitArea": {
+					"show": false,
+					"areaStyle": {
+							"color": [
+									"rgba(250,250,250,0.3)",
+									"rgba(200,200,200,0.3)"
+							]
+					}
+			}
+	},
+	"timeAxis": {
+			"axisLine": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisTick": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisLabel": {
+					"show": true,
+					"color": "#838383"
+			},
+			"splitLine": {
+					"show": true,
+					"lineStyle": {
+							"color": [
+									"#838383"
+							]
+					}
+			},
+			"splitArea": {
+					"show": false,
+					"areaStyle": {
+							"color": [
+									"rgba(250,250,250,0.3)",
+									"rgba(200,200,200,0.3)"
+							]
+					}
+			}
+	},
+	"toolbox": {
+			"iconStyle": {
+					"borderColor": "#06467c"
+			},
+			"emphasis": {
+					"iconStyle": {
+							"borderColor": "#4187c2"
+					}
+			},
+			"textStyle": {
+				"color": "#838383"
+			}
+	},
+	"legend": {
+			"textStyle": {
+					"color": "#838383"
+			}
+	},
+	"tooltip": {
+			"axisPointer": {
+					"lineStyle": {
+							"color": "#cccccc",
+							"width": 1
+					},
+					"crossStyle": {
+							"color": "#cccccc",
+							"width": 1
+					}
+			}
+	},
+	"timeline": {
+			"lineStyle": {
+					"color": "#005eaa",
+					"width": 1
+			},
+			"itemStyle": {
+					"color": "#005eaa",
+					"borderWidth": 1
+			},
+			"controlStyle": {
+					"color": "#005eaa",
+					"borderColor": "#005eaa",
+					"borderWidth": 0.5
+			},
+			"checkpointStyle": {
+					"color": "#005eaa",
+					"borderColor": "#316bc2"
+			},
+			"label": {
+					"color": "#005eaa"
+			},
+			"emphasis": {
+					"itemStyle": {
+							"color": "#005eaa"
+					},
+					"controlStyle": {
+							"color": "#005eaa",
+							"borderColor": "#005eaa",
+							"borderWidth": 0.5
+					},
+					"label": {
+							"color": "#005eaa"
+					}
+			}
+	},
+	"visualMap": {
+			"color": [
+					"#1790cf",
+					"#a2d4e6"
+			]
+	},
+	"dataZoom": {
+			"backgroundColor": "rgba(47,69,84,0)",
+			"dataBackgroundColor": "rgba(47,69,84,0.3)",
+			"fillerColor": "rgba(167,183,204,0.4)",
+			"handleColor": "#a7b7cc",
+			"handleSize": "100%",
+			"textStyle": {
+					"color": "#333333"
+			}
+	},
+	"markPoint": {
+			"label": {
+					"color": "#eeeeee"
+			},
+			"emphasis": {
+					"label": {
+							"color": "#eeeeee"
+					}
+			}
+	}
+}

+ 360 - 0
src/views/HealthControl/energyEfficAnalyse/powerAnalyse/components/current-scatter-chart.vue

@@ -0,0 +1,360 @@
+<template>
+  <div class="chart" :id="id"></div>
+</template>
+
+<script>
+import util from "@tools/util";
+import partten from "@/helper/partten";
+import * as echarts from "echarts";
+import chartTheme from "./current-scatter-chart.json";
+
+export default {
+  name: "currentScatterChart",
+  props: {
+    // 图表宽度
+    width: {
+      type: String,
+      default: "100%",
+    },
+    // 图表高度
+    height: {
+      type: String,
+      default: "350px",
+    },
+    // 图表主标题
+    chartTitle: {
+      type: String,
+      default: "自定义图表组件",
+    },
+    // X 轴配置项
+    xAxisData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // Y 轴配置项
+    yAxisData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    dataSet: {
+      type: String,
+      default: "",
+    },
+    // 图表核心数据
+    seriesData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // 是否显示图表图例
+    showLegend: {
+      type: Boolean,
+      default: true,
+    },
+    // 是否默认采用笔刷模式
+    brushSelected: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      id: "",
+      chart: null,
+      color: [
+        "#05bb4c",
+        "#4b55ae",
+        "#fa8c16",
+        "#f8de5b",
+        "#1a93cf",
+        "#c531c7",
+        "#bd3338",
+      ],
+      theme: "dark",
+    };
+  },
+  computed: {
+    collapse() {
+      return this.$store.state.collapse;
+    },
+  },
+  watch: {
+    height() {
+      if (this.chart) {
+        this.chart.resize();
+      }
+    },
+    collapse(val) {
+      if (this.chart) {
+        setTimeout(() => {
+          this.chart.resize();
+        }, 300);
+      }
+    },
+  },
+  methods: {
+    resize() {},
+    initChart() {
+      const that = this;
+      echarts.registerTheme("chartTheme", chartTheme);
+      let myChart = echarts.init(
+        document.getElementById(this.id),
+        "chartTheme"
+      );
+      that.chart = myChart;
+      //指定图表的配置项和数据
+      const option = {
+        //标题
+        title: {
+          text: that.chartTitle,
+          right: 440,
+          top: 4,
+          textStyle: {
+            fontSize: 14,
+            color: that.theme === "dark" ? partten.getColor("grayl") : "#000",
+          },
+        },
+        // backgroundColor:
+        //   that.theme === "dark"
+        //     ? "rgba(0,0,0,0.4)"
+        //     : "rgba(255,255,255,0.5)",
+        //工具箱
+        // color: [
+        //     "#0098d9",
+        //     "rgb(255,0,0)",
+        //     "#0a4468",
+        //     "#a9e3f199",
+        //     "#a9e3f199",
+        //     "#005eaa",
+        //     "#cda819",
+        //     "#32a487"
+        // ],
+        toolbox: {
+          show: false,
+          x: "right",
+          position: [10, 10],
+          // backgroundColor:'rgba(0,0,0,0.4)',
+          borderColor: partten.getColor("gray"),
+          textStyle: {
+            fontSize: 16,
+            color: partten.getColor("gray"),
+          },
+          iconStyle: {
+            borderColor: partten.getColor("gray"),
+          },
+          emphasis: {
+            iconStyle: {
+              borderColor: partten.getColor("gray"),
+            },
+          },
+        },
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "cross",
+          },
+          // backgroundColor: "rgba(0,0,0,0.4)",
+          // borderColor: partten.getColor("gray"),
+          // textStyle: {
+          //   fontSize: util.vh(16),
+          //   color: partten.getColor("gray"),
+          // },
+          // formatter(params) {
+          //   return params.value?.x
+          //     ? `${params.seriesName}<br />风速:${params.value.x}m/s<br />功率:${params.value.y}kW`
+          //     : `${params.name}`;
+          // },
+        },
+        brush: {
+          seriesIndex: [2, 3],
+          yAxisIndex: 0,
+          transformable: true,
+          throttleType: "debounce",
+          throttleDelay: 1000,
+          removeOnClick: true,
+          brushType: "polygon",
+          brushMode: "multiple",
+          brushStyle: {
+            borderWidth: 1,
+            borderColor: "#ff2424",
+          },
+        },
+        dataZoom: [
+          {
+            type: "inside", //图表下方的伸缩条
+            show: false, //是否显示
+            realtime: true, //拖动时,是否实时更新系列的视图
+            start: 0, //伸缩条开始位置(1-100),可以随时更改
+            end: 100, //伸缩条结束位置(1-100),可以随时更改
+          },
+          {
+            type: "slider", //图表下方的伸缩条
+            show: false, //是否显示
+            realtime: true, //拖动时,是否实时更新系列的视图
+            start: 0, //伸缩条开始位置(1-100),可以随时更改
+            end: 100, //伸缩条结束位置(1-100),可以随时更改
+          },
+        ],
+        textStyle: {
+          fontSize: util.vh(16),
+          color: that.theme === "dark" ? "#fff" : "#000",
+        },
+        //图例-每一条数据的名字
+        legend: {
+          show: that.showLegend,
+          data: that.seriesData.map((i) => i.name),
+          // data: [ "拟合功率", "保证功率","无用点", "有用点", "Cp值"],
+          right: 170,
+          type: "scroll",
+          top: "5",
+          // icon: "circle",
+          itemWidth: 6,
+          inactiveColor:
+            that.theme === "dark" ? partten.getColor("gray") : "#000",
+          textStyle: {
+            color: that.theme === "dark" ? partten.getColor("grayl") : "#000",
+            fontSize: 12,
+          },
+        },
+        grid: {
+          top: 58,
+          left: 40,
+          right: 68,
+          bottom: 24,
+          containLabel: true,
+        },
+        //x轴
+        xAxis: [
+          {
+            name: "时间",
+            nameTextStyle: {
+              color: "#838383",
+            },
+            type: "category",
+            boundaryGap: true,
+            data: that.xAxisData || [],
+            axisLabel: {
+              formatter: "{value}",
+            },
+            splitLine: {
+              show: false,
+            },
+            axisLine: {
+              onZero: false,
+            },
+            smooth: true,
+            textStyle: {
+              color: that.theme === "dark" ? partten.getColor("gray") : "#000",
+            },
+          },
+        ],
+        //y轴没有显式设置,根据值自动生成y轴
+        yAxis: [
+          {
+            splitLine: { show: false },
+            position: "left",
+            min: 0,
+            name: "kW",
+            nameTextStyle: {
+              color: "#838383",
+            },
+            axisLine: {
+              onZero: false,
+            },
+          },
+        ],
+        animation: true,
+        dataset: that.dataSet.length ? JSON.parse(that.dataSet) : [],
+        //数据-data是最终要显示的数据
+        series: that.seriesData,
+      };
+
+      that.resize = function () {
+        myChart.resize();
+      };
+
+      window.addEventListener("resize", that.resize);
+
+      myChart.setOption(option);
+      // if (that.brushSelected) {
+      //   myChart.dispatchAction({
+      //     type: "takeGlobalCursor",
+      //     // 如果想变为“可刷选状态”,必须设置。不设置则会关闭“可刷选状态”。
+      //     key: "brush",
+      //     brushOption: {
+      //       seriesIndex: [2,3],
+      //       yAxisIndex: 0,
+      //       transformable: true,
+      //       throttleType: "debounce",
+      //       throttleDelay: 1000,
+      //       removeOnClick: true,
+      //       brushType: "polygon",
+      //       brushMode: "multiple",
+      //       brushStyle: {
+      //         borderWidth: 1,
+      //         color: "rgba(255,36,36,0.2)",
+      //         borderColor: "#ff2424",
+      //       },
+      //     },
+      //   });
+      // }
+      myChart.off("brushSelected");
+      myChart.on("brushSelected", (params) => {
+        that.$emit("getSelected", params.batch || []);
+      });
+      myChart.off("click");
+      myChart.on("click", (params) => {
+        // if(params.componentType === 'markArea'){
+        //   myChart.dispatchAction({
+        //     type: 'brush',
+        //     areas: [
+        //       {
+        //         xAxisIndex: 0,
+        //         brushType: 'lineX',
+        //         coordRange: [params.data.coord[0][0], params.data.coord[1][0]]
+        //       },
+        //     ]
+        //   });
+        // }
+      });
+    },
+  },
+  created() {
+    this.id = "chart-" + util.newGUID();
+  },
+  mounted() {
+    // this.$nextTick(() => {
+    this.$el.style.width = this.width;
+    this.$el.style.height = this.height;
+    this.initChart();
+    if (this.chart) {
+      this.chart.resize();
+    }
+    // });
+  },
+  updated() {
+    // console.log('update')
+    let myChart = echarts.init(document.getElementById(this.id));
+    myChart.dispose();
+    this.$nextTick(() => {
+      this.initChart();
+    });
+  },
+  unmounted() {
+    window.removeEventListener("resize", this.resize);
+  },
+};
+</script>
+
+<style>
+.chart {
+  width: 100%;
+  height: 100%;
+  display: inline-block;
+}
+</style>

+ 72 - 0
src/views/HealthControl/energyEfficAnalyse/powerAnalyse/components/table.vue

@@ -0,0 +1,72 @@
+<script setup name="table">
+import { ref, computed, defineProps, defineEmits } from "vue";
+const props = defineProps({
+  height: {
+    type: String,
+    default: "800px",
+  },
+  data: {
+    type: Array,
+    default: () => [],
+  },
+  column: {
+    type: Array,
+    default: () => [],
+  },
+  tableName: {
+    type: String,
+    default: "",
+  },
+  tableId: {
+    type: String,
+    default: "",
+  },
+  loading: {
+    type: Boolean,
+    default: false,
+  },
+});
+const emits = defineEmits(["export"]);
+const funExport = () => {
+  emits("export");
+};
+const tableRef = ref("");
+const tableHeight = computed(() => {
+  return tableRef.value.offsetHeight ? tableRef.value.offsetHeight - 12 : 739;
+});
+</script>
+<template>
+  <div
+    ref="tableRef"
+    class=""
+    :style="{
+      height:
+        typeof props.height === 'string' ? props.height : props.height + 'px',
+    }"
+  >
+    <!-- <div class="flex justify-between items-center pb-[10px]"> -->
+    <!-- <h3>{{props.tableName}}</h3> -->
+    <!-- <el-button size="small" type="primary" @click="funExport" :disabled="!props.tableId">数据导出</el-button> -->
+    <!-- </div> -->
+    <el-table
+      :data="props.data"
+      stripe
+      size="small"
+      v-loading="props.loading"
+      :height="height"
+      :style="{ width: '100%' }"
+    >
+      <el-table-column
+        align="center"
+        show-overflow-tooltip
+        v-for="item in props.column"
+        :key="item.prop"
+        :prop="item.prop"
+        :label="item.label"
+        sortable
+        resizable
+        :min-width="item.width ? item.width : 80"
+      />
+    </el-table>
+  </div>
+</template>

+ 751 - 0
src/views/HealthControl/energyEfficAnalyse/powerAnalyse/index.vue

@@ -0,0 +1,751 @@
+<template>
+  <div class="draught-fan-list">
+    <div class="form-wrapper">
+      <div class="search mg-b-8">
+        <div class="search-items">
+          <div class="search-item">
+            <div class="lable">电站:</div>
+            <div class="search-content">
+              <el-select
+                v-model="station"
+                clearable
+                size="mini"
+                placeholder="请选择"
+                popper-class="select"
+                @change="
+                  (station) => {
+                    getWt(station, true);
+                  }
+                "
+              >
+                <el-option
+                  v-for="item in wpArray"
+                  :key="item.id"
+                  :value="item.id"
+                  :label="item.name"
+                />
+              </el-select>
+            </div>
+          </div>
+          <div class="search-item">
+            <div class="lable">设备:</div>
+            <div class="search-content">
+              <el-select
+                v-model="inverters"
+                clearable
+                size="mini"
+                placeholder="请选择"
+                popper-class="select"
+              >
+                <el-option
+                  v-for="item in wtArray"
+                  :key="item.id"
+                  :value="item.id"
+                  :label="item.name"
+                />
+              </el-select>
+            </div>
+          </div>
+          <div class="search-item">
+            <div class="lable">开始时间:</div>
+            <div class="search-content">
+              <el-date-picker
+                v-model="startdate"
+                type="datetime"
+                size="mini"
+                :disabled-date="disabledDate"
+                placeholder="选择日期时间"
+                popper-class="date-select"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="search-item">
+            <div class="lable">结束时间:</div>
+            <div class="search-content">
+              <el-date-picker
+                v-model="enddate"
+                type="datetime"
+                :disabled-date="disabledDate2"
+                size="mini"
+                placeholder="选择日期时间"
+                popper-class="date-select"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+        </div>
+        <div class="search-actions">
+          <el-button size="mini" class="btn-search" @click="search"
+            >查 询</el-button
+          >
+          <!-- <el-button
+            size="mini"
+            :class="{ 'btn-active': isChartArea }"
+            :disabled="!seriesData?.length"
+            @click="funChartArea"
+            >区域划分</el-button
+          > -->
+        </div>
+      </div>
+    </div>
+    <div style="height: calc(100% - 40px); padding-bottom: 10px">
+      <el-tabs v-model="activeTab">
+        <el-tab-pane label="表格数据" name="1"> </el-tab-pane>
+        <el-tab-pane label="图表展示" name="2"> </el-tab-pane>
+        <table-cop
+          v-show="activeTab === '1'"
+          :data="tableData"
+          :loading="tableLoading"
+          :column="tableColumn"
+          height="calc(100% - 20px)"
+          :tableId="tableShowId"
+          :tableName="tableName"
+        ></table-cop>
+        <div v-show="activeTab === '2'" style="height: 100%">
+          <CurrentScatterChart
+            ref="chartRef"
+            width="100%"
+            height="100%"
+            :chartTitle="''"
+            :xAxisData="xAxisData"
+            :seriesData="seriesData"
+            :showLegend="true"
+            :brushSelected="false"
+            :dataSet="dataSet"
+            @getSelected="funChartSelect"
+          />
+        </div>
+      </el-tabs>
+    </div>
+    <el-dialog v-model="wtDialog" width="60%" top="120px" draggable>
+      <template #title>
+        <div class="dialog-title">
+          <div class="title">风机功率点位</div>
+        </div>
+      </template>
+      <el-tabs v-model="wtTab">
+        <el-tab-pane label="数据" name="table">
+          <el-table :data="wtData" row-key="id" :max-height="550">
+            <el-table-column property="wtId" align="center" label="风机" />
+            <el-table-column
+              property="time"
+              sortable
+              width="200"
+              align="center"
+              label="时间"
+            />
+            <el-table-column
+              property="speed"
+              sortable
+              width="140"
+              align="center"
+              label="风速(m/s)"
+            />
+            <el-table-column
+              property="power"
+              sortable
+              width="140"
+              align="center"
+              label="功率(kW)"
+            />
+            <el-table-column
+              property="rr"
+              sortable
+              width="140"
+              align="center"
+              label="转速"
+            />
+            <el-table-column
+              property="filter"
+              sortable
+              width="140"
+              align="center"
+              label="是否有用点"
+            />
+          </el-table>
+        </el-tab-pane>
+        <el-tab-pane label="故障" name="problem" disabled> </el-tab-pane>
+        <el-tab-pane label="预警" name="warning" disabled> </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+// import ScatterLineChart from "@com/chart/combination/scatter-line-chart.vue";
+import tableCop from "./components/table.vue";
+import CurrentScatterChart from "./components/current-scatter-chart.vue";
+import api1 from "@api/economic/index.js";
+// import api from "@api/wisdomOverhaul/energy/index.js";
+import dayjs from "dayjs";
+import {
+  getIntervers,
+  getPowerFittingGF,
+  getPowerFittingChartGF,
+  getPowerFittingChart,
+  getPowerFittingTable,
+  getPowerFittingSelectedChart,
+} from "@/api/powerAnalyse.js";
+export default {
+  // 名称
+  name: "powerAnalyse",
+
+  // 使用组件
+  components: {
+    // ScatterLineChart,
+    CurrentScatterChart,
+    tableCop,
+  },
+
+  // 数据
+  data() {
+    return {
+      activeTab: "2",
+      checkList: [
+        { name: "非并网", code: "isfbw" },
+        { name: "非合理值", code: "isfhl" },
+        { name: "并网后十分钟", code: "isbw" },
+        { name: "停机前十分钟", code: "istj" },
+        { name: "功率曲线偏差", code: "isglpc" },
+      ],
+      selectList: [
+        { name: "单台拟合", code: 0 },
+        { name: "合并拟合", code: 1 },
+        // { name: "同名拟合", code: 2 },
+      ],
+      radioList: [
+        { name: "一秒钟", code: 1 },
+        { name: "一分钟", code: 60 },
+        { name: "十分钟", code: 600 },
+        { name: "十五分钟", code: 900 },
+      ],
+      isAsc: "asc",
+      wpArray: [],
+      wtArray: [],
+      station: "",
+      inverters: "",
+      startdate: dayjs()
+        // .add(-1, "month")
+        .startOf("month")
+        .format("YYYY-MM-DD HH:mm:ss"),
+      enddate: dayjs().startOf("day").format("YYYY-MM-DD HH:mm:ss"),
+      interval: 600,
+      maxs: 25,
+      mins: 3,
+      maxp: 2500,
+      minp: 0,
+      checkedList: ["isfbw", "isfhl", "isbw", "istj", "isglpc"],
+      dimension: 10,
+      mode: 0,
+      fittingId: "",
+      seriesData: [],
+      avgObj: {
+        //平均cpz等
+        title: "",
+        cpavg: "",
+        frequency: "",
+        pcratio: "",
+      },
+      markDot: {
+        //3-5 point点等
+        pcl5: null,
+        pcl10: null,
+        pcl12: null,
+        pcl25: null,
+      },
+      xAxisData: [],
+      dataSet: "",
+      isChartArea: false,
+      tableShowId: "",
+      tableColumn: [],
+      tableLoading: false,
+      tableName: "",
+      tableData: [],
+      wtTab: "table",
+      wtDialog: false,
+      wtData: [],
+    };
+  },
+
+  // 函数
+  methods: {
+    // 时间选择器第一个禁用
+    disabledDate(time) {
+      if (this.enddate) {
+        return time.getTime() > Date.parse(this.enddate);
+      } else {
+        return null;
+      }
+    },
+    // 时间选择器第二个禁用
+    disabledDate2(time) {
+      if (this.startdate) {
+        return time.getTime() < Date.parse(this.startdate);
+      } else {
+        return null;
+      }
+    },
+    // 获取风场
+    getWp(reGetWp) {
+      api1
+        .getWpList({
+          type: "-2",
+        })
+        .then((res) => {
+          if (res.data.code === 200) {
+            this.wpArray = res.data.data;
+            this.station = res.data.data[0].id;
+            this.getWt(this.station, reGetWp);
+          }
+        });
+    },
+    // 获取风机
+    getWt(wpid, reGetWp) {
+      if (wpid) {
+        getIntervers({
+          wpids: wpid,
+        }).then(({ data: res }) => {
+          if (res.code === 200) {
+            this.wtArray = res.data;
+            this.inverters = res.data.length ? res.data[0].id : "";
+            if (!reGetWp) {
+              this.search();
+            }
+          }
+        });
+      }
+    },
+    //获取拟合id
+    getChartId() {
+      this.BASE.showLoading();
+      this.activeTab = "2";
+      let params = {
+        station: this.station,
+        inverters: this.inverters,
+        startdate: dayjs(this.startdate).valueOf(),
+        enddate: dayjs(this.enddate).valueOf(),
+      };
+      this.getChartData(params);
+      //   this.getTableData();
+    },
+    //清空数据
+    clear() {
+      this.fittingId = "";
+      this.seriesData = [];
+      this.avgObj = {
+        //平均cpz等
+        title: "",
+        cpavg: "",
+        frequency: "",
+        pcratio: "",
+      };
+      this.markDot = {
+        //3-5 point点等
+        pcl5: null,
+        pcl10: null,
+        pcl12: null,
+        pcl25: null,
+      };
+      this.xAxisData = [];
+      this.dataSet = "";
+    },
+    //是否区域划分
+    funChartArea() {
+      this.BASE.showLoading();
+      if (this.seriesData.length) {
+        if (!this.isChartArea) {
+          // 请求一下
+          this.seriesData[0] = {
+            ...this.seriesData[0],
+            markLine: {
+              symbol: "none",
+              label: {
+                show: false,
+              },
+              lineStyle: {
+                color: "rgba(96,174,255, 1)",
+              },
+              data: [
+                {
+                  xAxis: 3,
+                  valueIndex: 0,
+                },
+                {
+                  xAxis: 5,
+                  valueIndex: 0,
+                },
+                {
+                  xAxis: 10,
+                  valueIndex: 0,
+                },
+                {
+                  xAxis: 12,
+                  valueIndex: 0,
+                },
+                {
+                  xAxis: 25,
+                  valueIndex: 0,
+                },
+              ],
+            },
+            markArea: {
+              label: {
+                fontSize: 13,
+                color: "#ccc",
+                fontWeight: "normal",
+                fontFamily: "Arial",
+              },
+              itemStyle: {
+                color: "rgba(236,245,255, 0)",
+              },
+              emphasis: {
+                itemStyle: {
+                  color: "rgba(96,174,255, 0.5)",
+                },
+              },
+              data: [
+                [
+                  {
+                    name: `3~5m 偏差率: ${this.markDot.pcl5}%`,
+                    xAxis: 3,
+                  },
+                  {
+                    xAxis: 5,
+                  },
+                ],
+                [
+                  {
+                    name: `5~10m 偏差率: ${this.markDot.pcl10}%`,
+                    xAxis: 5,
+                  },
+                  {
+                    xAxis: 10,
+                  },
+                ],
+                [
+                  {
+                    name: `10~12m 偏差率: ${this.markDot.pcl12}%`,
+                    xAxis: 10,
+                  },
+                  {
+                    xAxis: 12,
+                  },
+                ],
+                [
+                  {
+                    name: `12~25m 偏差率: ${this.markDot.pcl25}%`,
+                    xAxis: 12,
+                  },
+                  {
+                    xAxis: 25,
+                  },
+                ],
+              ],
+            },
+          };
+          this.isChartArea = true;
+          this.BASE.closeLoading();
+        } else {
+          this.seriesData[0] = {
+            ...this.seriesData[0],
+            markLine: null,
+            markArea: null,
+          };
+          this.isChartArea = false;
+          this.BASE.closeLoading();
+        }
+      }
+    },
+    // // 获取表格数据
+    // getTableData() {
+    //   this.tableLoading = true;
+    //   getPowerFittingTable({
+    //     id: this.fittingId,
+    //   }).then((res) => {
+    //     if (res.code == 200) {
+    //       this.tableColumn = res.data.title.map((o) => {
+    //         return {
+    //           prop: o.key,
+    //           width: o.des === "时间" ? 100 : 80,
+    //           label: o.des,
+    //         };
+    //       });
+    //       this.tableData = res.data.data;
+    //       this.$message.success(res.msg);
+    //     }
+    //     this.tableLoading = false;
+    //   });
+    // },
+    // 获取图表数据
+    getChartData(params) {
+      getPowerFittingChartGF(params).then((res) => {
+        this.tableData = [];
+        if (res.code == 200) {
+          this.tableColumn = res.data.title.map((o) => {
+            return {
+              prop: o.key,
+              label: o.des,
+              width: o.des === "时间" ? 100 : 80,
+            };
+          });
+          const wtIds = Object.keys(res.data.data);
+          const xAxis = [];
+          const series = [];
+          if (!res.data.data || !wtIds.length) {
+            this.tableLoading = false;
+            return false;
+          }
+
+          for (const index in wtIds) {
+            const llgl = [];
+            const sjgl = [];
+            for (const o of res.data.data[wtIds[index]]) {
+              if (index === "0") {
+                xAxis.push(o.datetime);
+              }
+              this.tableData.push(o);
+              llgl.push(o.ideaP);
+              sjgl.push(o.actualP);
+            }
+            series.push({
+              name: res.data.name + "实际功率",
+              type: "line",
+              symbol: "line", //设定为实心点
+              symbolSize: 0, //设定实心点的大小
+              smooth: false, //这个是把线变成曲线
+              data: sjgl,
+              xAxisIndex: 0,
+            });
+            series.push({
+              name: res.data.name + "理论功率",
+              type: "line",
+              symbol: "line", //设定为实心点
+              symbolSize: 0, //设定实心点的大小
+              smooth: false, //这个是把线变成曲线
+              data: llgl,
+              xAxisIndex: 0,
+            });
+          }
+          this.xAxisData = xAxis;
+          this.seriesData = series;
+          this.$message.success(res.msg);
+        } else {
+          this.tableColumn = [];
+          this.tableData = [];
+          this.xAxisData = {};
+          this.seriesData = {};
+        }
+        this.BASE.closeLoading();
+      });
+    },
+    //拟合按钮
+    search() {
+      this.isChartArea = false;
+      if (!this.station || !this.inverters) {
+        this.BASE.showMsg({
+          msg: "场站与风机为必选项",
+        });
+      } else {
+        this.getChartId();
+      }
+    },
+    async funChartSelect(batch) {
+      const wDataArr = [];
+      const yDataArr = [];
+      let scatterls = [];
+      let scatterhs = [];
+      let dataSetObj = [];
+      this.wtData = [];
+      if (batch?.length && this.dataSet) {
+        scatterls = batch[0].selected[2].dataIndex;
+        scatterhs = batch[0].selected[3].dataIndex;
+        if (scatterls?.length || scatterhs?.length) {
+          dataSetObj = JSON.parse(this.dataSet);
+          if (scatterls?.length) {
+            for (const scatterIndex of scatterls) {
+              wDataArr.push(dataSetObj[0].source[scatterIndex].k);
+            }
+          }
+          if (scatterhs?.length) {
+            for (const scatterIndex of scatterhs) {
+              yDataArr.push(dataSetObj[1].source[scatterIndex].k);
+            }
+          }
+          const wtRes = await getPowerFittingSelectedChart({
+            yk: yDataArr.join(","),
+            wk: wDataArr.join(","),
+          });
+          if (wtRes.code === 200) {
+            let id = 1;
+            const tempArr = []; //用于以风机id 聚合dataArr
+            if (wtRes.data?.length) {
+              for (const data of wtRes.data) {
+                if (tempArr.length) {
+                  const findIndex = tempArr.findIndex(
+                    (o) => o.wtId === data.wtId
+                  );
+                  if (findIndex !== -1) {
+                    if (!tempArr[findIndex].children) {
+                      tempArr[findIndex].children = [];
+                    }
+                    tempArr[findIndex].children.push({
+                      ...data,
+                      id: id,
+                      filter: data.filter === 0 ? "是" : "否",
+                    });
+                    id++;
+                  } else {
+                    tempArr.push({
+                      ...data,
+                      id: id,
+                      filter: data.filter === 0 ? "是" : "否",
+                    });
+                    id++;
+                  }
+                } else {
+                  tempArr.push({
+                    ...data,
+                    id: id,
+                    filter: data.filter === 0 ? "是" : "否",
+                  });
+                  id++;
+                }
+              }
+              this.wtDialog = true;
+              this.$nextTick(() => {
+                this.wtTab = "table";
+                this.wtData = tempArr;
+              });
+            }
+          }
+        }
+      }
+    },
+  },
+
+  created() {
+    this.getWp();
+  },
+
+  watch: {},
+
+  unmounted() {},
+};
+</script>
+
+<style lang="less" scoped>
+.draught-fan-list {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  padding: 10px 20px;
+  .form-wrapper ::v-deep {
+    .el-checkbox__input {
+      display: block;
+    }
+    .el-input-number {
+      width: 100%;
+      .el-input-number__decrease,
+      .el-input-number__increase {
+        background: rgba(67, 81, 107, 0.2) !important;
+
+        position: absolute;
+        z-index: 10;
+        border: 0;
+        // height: 33px;
+        // line-height: 33px;
+        &:hover {
+          color: #05be4c;
+        }
+      }
+    }
+    .el-date-editor,
+    .el-select {
+      width: 100%;
+    }
+    .el-radio-group {
+      width: 100%;
+      display: flex;
+      .el-radio {
+        flex: 1;
+      }
+    }
+    .search {
+      display: flex;
+      align-items: center;
+      .search-items {
+        display: flex;
+        align-items: center;
+        .search-item {
+          width: 296px;
+          display: flex;
+          align-items: center;
+          margin-right: 10px;
+          .lable {
+            font-size: 14px;
+            font-family: Microsoft YaHei;
+            font-weight: 400;
+            color: #b3b3b3;
+            margin-right: 5px;
+            width: 65px;
+            white-space: nowrap;
+          }
+          .search-content {
+            flex: 1;
+          }
+          &:nth-last-child(1) {
+            margin-right: 0;
+          }
+        }
+        .custom {
+          width: auto;
+        }
+      }
+      .search-actions {
+        .el-button {
+          background-color: rgba(5, 187, 76, 0.3);
+          border: 1px solid #3b6c53;
+          color: #b3b3b3;
+          font-size: 14px;
+          border: none;
+          width: 108px;
+          min-height: 25px !important;
+
+          &.btn-search:hover {
+            background-color: rgba(5, 187, 76, 0.6);
+            color: #ffffff;
+          }
+        }
+        .btn-active {
+          background-color: rgba(5, 187, 76, 0.6);
+          color: #ffffff;
+        }
+      }
+      &:nth-last-child(1) {
+        justify-content: space-between;
+      }
+    }
+  }
+  .el-tabs ::v-deep {
+    height: 100%;
+    .el-tabs__item {
+      color: #b3b3b3;
+    }
+    .el-tabs__nav-wrap::after {
+      background-color: #14221f;
+    }
+    .el-tabs__active-bar {
+      background-color: #05bb4c;
+    }
+    .el-tabs__item.is-active,
+    .el-tabs__item:hover {
+      color: #05bb4c;
+    }
+    .el-tabs__content {
+      height: calc(100% - 53px);
+    }
+  }
+}
+</style>

+ 398 - 0
src/views/HealthControl/energyEfficAnalyse/powerHotAnalyse/components/current-scatter-chart.json

@@ -0,0 +1,398 @@
+
+{
+	"color": [
+			"#1C99FF",
+			"#FF8700",
+			"#e6b600d9",
+			"#0098d9",
+			"#3D54BE",
+			"#005eaa",
+			"#cda819",
+			"#32a487"
+	],
+	"textStyle": {},
+	"title": {
+			"textStyle": {
+					"color": "#333333"
+			},
+			"subtextStyle": {
+					"color": "#aaaaaa"
+			}
+	},
+	"line": {
+			"itemStyle": {
+					"borderWidth": 1
+			},
+			"lineStyle": {
+					"width": 2
+			},
+			"symbolSize": 4,
+			"symbol": "emptyCircle",
+			"smooth": false
+	},
+	"radar": {
+			"itemStyle": {
+					"borderWidth": 1
+			},
+			"lineStyle": {
+					"width": 2
+			},
+			"symbolSize": 4,
+			"symbol": "emptyCircle",
+			"smooth": false
+	},
+	"bar": {
+			"itemStyle": {
+					"barBorderWidth": 0,
+					"barBorderColor": "#ccc"
+			}
+	},
+	"pie": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"scatter": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"boxplot": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"parallel": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"sankey": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"funnel": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"gauge": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			}
+	},
+	"candlestick": {
+			"itemStyle": {
+					"color": "#c12e34",
+					"color0": "#2b821d",
+					"borderColor": "#c12e34",
+					"borderColor0": "#2b821d",
+					"borderWidth": 1
+			}
+	},
+	"graph": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			},
+			"lineStyle": {
+					"width": 1,
+					"color": "#aaaaaa"
+			},
+			"symbolSize": 4,
+			"symbol": "emptyCircle",
+			"smooth": false,
+			"color": [
+					"#c12e34",
+					"#e6b600",
+					"#0098d9",
+					"#50ec39",
+					"#005eaa",
+					"#339ca8",
+					"#cda819",
+					"#32a487"
+			],
+			"label": {
+					"color": "#eeeeee"
+			}
+	},
+	"map": {
+			"itemStyle": {
+					"areaColor": "#ddd",
+					"borderColor": "#eee",
+					"borderWidth": 0.5
+			},
+			"label": {
+					"color": "#c12e34"
+			},
+			"emphasis": {
+					"itemStyle": {
+							"areaColor": "#e6b600",
+							"borderColor": "#ddd",
+							"borderWidth": 1
+					},
+					"label": {
+							"color": "#c12e34"
+					}
+			}
+	},
+	"geo": {
+			"itemStyle": {
+					"areaColor": "#ddd",
+					"borderColor": "#eee",
+					"borderWidth": 0.5
+			},
+			"label": {
+					"color": "#c12e34"
+			},
+			"emphasis": {
+					"itemStyle": {
+							"areaColor": "#e6b600",
+							"borderColor": "#ddd",
+							"borderWidth": 1
+					},
+					"label": {
+							"color": "#c12e34"
+					}
+			}
+	},
+	"categoryAxis": {
+			"axisLine": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisTick": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisLabel": {
+					"show": true,
+					"color": "#838383"
+			},
+			"splitLine": {
+					"show": false,
+					"lineStyle": {
+							"color": [
+									"#838383"
+							]
+					}
+			},
+			"splitArea": {
+					"show": false,
+					"areaStyle": {
+							"color": [
+									"rgba(250,250,250,0.3)",
+									"rgba(200,200,200,0.3)"
+							]
+					}
+			}
+	},
+	"valueAxis": {
+			"axisLine": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisTick": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisLabel": {
+					"show": true,
+					"color": "#838383"
+			},
+			"splitLine": {
+					"show": true,
+					"lineStyle": {
+							"color": [
+									"#ccc"
+							]
+					}
+			},
+			"splitArea": {
+					"show": false,
+					"areaStyle": {
+							"color": [
+									"rgba(250,250,250,0.3)",
+									"rgba(200,200,200,0.3)"
+							]
+					}
+			}
+	},
+	"logAxis": {
+			"axisLine": {
+					"show": true,
+					"lineStyle": {
+							"color": "#333"
+					}
+			},
+			"axisTick": {
+					"show": true,
+					"lineStyle": {
+							"color": "#333"
+					}
+			},
+			"axisLabel": {
+					"show": true,
+					"color": "#333"
+			},
+			"splitLine": {
+					"show": true,
+					"lineStyle": {
+							"color": [
+									"#ccc"
+							]
+					}
+			},
+			"splitArea": {
+					"show": false,
+					"areaStyle": {
+							"color": [
+									"rgba(250,250,250,0.3)",
+									"rgba(200,200,200,0.3)"
+							]
+					}
+			}
+	},
+	"timeAxis": {
+			"axisLine": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisTick": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisLabel": {
+					"show": true,
+					"color": "#838383"
+			},
+			"splitLine": {
+					"show": true,
+					"lineStyle": {
+							"color": [
+									"#838383"
+							]
+					}
+			},
+			"splitArea": {
+					"show": false,
+					"areaStyle": {
+							"color": [
+									"rgba(250,250,250,0.3)",
+									"rgba(200,200,200,0.3)"
+							]
+					}
+			}
+	},
+	"toolbox": {
+			"iconStyle": {
+					"borderColor": "#06467c"
+			},
+			"emphasis": {
+					"iconStyle": {
+							"borderColor": "#4187c2"
+					}
+			},
+			"textStyle": {
+				"color": "#838383"
+			}
+	},
+	"legend": {
+			"textStyle": {
+					"color": "#838383"
+			}
+	},
+	"tooltip": {
+			"axisPointer": {
+					"lineStyle": {
+							"color": "#cccccc",
+							"width": 1
+					},
+					"crossStyle": {
+							"color": "#cccccc",
+							"width": 1
+					}
+			}
+	},
+	"timeline": {
+			"lineStyle": {
+					"color": "#005eaa",
+					"width": 1
+			},
+			"itemStyle": {
+					"color": "#005eaa",
+					"borderWidth": 1
+			},
+			"controlStyle": {
+					"color": "#005eaa",
+					"borderColor": "#005eaa",
+					"borderWidth": 0.5
+			},
+			"checkpointStyle": {
+					"color": "#005eaa",
+					"borderColor": "#316bc2"
+			},
+			"label": {
+					"color": "#005eaa"
+			},
+			"emphasis": {
+					"itemStyle": {
+							"color": "#005eaa"
+					},
+					"controlStyle": {
+							"color": "#005eaa",
+							"borderColor": "#005eaa",
+							"borderWidth": 0.5
+					},
+					"label": {
+							"color": "#005eaa"
+					}
+			}
+	},
+	"visualMap": {
+			"color": [
+					"#1790cf",
+					"#a2d4e6"
+			]
+	},
+	"dataZoom": {
+			"backgroundColor": "rgba(47,69,84,0)",
+			"dataBackgroundColor": "rgba(47,69,84,0.3)",
+			"fillerColor": "rgba(167,183,204,0.4)",
+			"handleColor": "#a7b7cc",
+			"handleSize": "100%",
+			"textStyle": {
+					"color": "#333333"
+			}
+	},
+	"markPoint": {
+			"label": {
+					"color": "#eeeeee"
+			},
+			"emphasis": {
+					"label": {
+							"color": "#eeeeee"
+					}
+			}
+	}
+}

+ 403 - 0
src/views/HealthControl/energyEfficAnalyse/powerHotAnalyse/components/current-scatter-chart.vue

@@ -0,0 +1,403 @@
+<template>
+  <div class="chart" :id="id"></div>
+</template>
+
+<script>
+import util from "@tools/util";
+import partten from "@/helper/partten";
+import * as echarts from "echarts";
+import chartTheme from "./current-scatter-chart.json";
+
+export default {
+  name: "currentScatterChart",
+  props: {
+    // 图表宽度
+    width: {
+      type: String,
+      default: "100%",
+    },
+    // 图表高度
+    height: {
+      type: String,
+      default: "350px",
+    },
+    // 图表主标题
+    chartTitle: {
+      type: String,
+      default: "自定义图表组件",
+    },
+    // X 轴配置项
+    xAxisData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // Y 轴配置项
+    yAxisData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    dataSet: {
+      type: String,
+      default: "",
+    },
+    // 图表核心数据
+    seriesData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // 是否显示图表图例
+    showLegend: {
+      type: Boolean,
+      default: true,
+    },
+    // 是否默认采用笔刷模式
+    brushSelected: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      id: "",
+      chart: null,
+      color: [
+        "#05bb4c",
+        "#4b55ae",
+        "#fa8c16",
+        "#f8de5b",
+        "#1a93cf",
+        "#c531c7",
+        "#bd3338",
+      ],
+      theme: "dark",
+    };
+  },
+  computed: {
+    collapse() {
+      return this.$store.state.collapse;
+    },
+  },
+  watch: {
+    height() {
+      if (this.chart) {
+        this.chart.resize();
+      }
+    },
+    collapse(val) {
+      if (this.chart) {
+        setTimeout(() => {
+          this.chart.resize();
+        }, 300);
+      }
+    },
+  },
+  methods: {
+    resize() {},
+    initChart() {
+      const that = this;
+      echarts.registerTheme("chartTheme", chartTheme);
+      let myChart = echarts.init(
+        document.getElementById(this.id),
+        "chartTheme"
+      );
+      that.chart = myChart;
+      //指定图表的配置项和数据
+      const option = {
+        //标题
+        title: {
+          text: that.chartTitle,
+          left: 440,
+          top: 4,
+          textStyle: {
+            fontSize: 14,
+            color: that.theme === "dark" ? partten.getColor("grayl") : "#000",
+          },
+        },
+        // backgroundColor:
+        //   that.theme === "dark"
+        //     ? "rgba(0,0,0,0.4)"
+        //     : "rgba(255,255,255,0.5)",
+        //工具箱
+        color: [
+          "#3D54BE",
+          "rgb(255,0,0)",
+          "#a1a1a1",
+          "#0098d9",
+          "#FF8700",
+          "#005eaa",
+          "#cda819",
+          "#32a487",
+        ],
+        toolbox: {
+          show: true,
+          x: "right",
+          position: [10, 10],
+          // backgroundColor:'rgba(0,0,0,0.4)',
+          borderColor: "#ccc",
+          textStyle: {
+            fontSize: 16,
+            color: "#ccc",
+          },
+          iconStyle: {
+            borderColor: "#ccc",
+          },
+          emphasis: {
+            iconStyle: {
+              borderColor: "#ccc",
+            },
+          },
+        },
+        tooltip: {
+          trigger: "item",
+          axisPointer: {
+            type: "cross",
+          },
+          backgroundColor: "rgba(0,0,0,0.4)",
+          borderColor: partten.getColor("gray"),
+          textStyle: {
+            fontSize: util.vh(16),
+            color: "#fff",
+          },
+          formatter(params) {
+            return params.value.x
+              ? `${params.seriesName}<br />光照:${params.value.x} W/m²<br />功率:${params.value.y} kW<br />温度:${params.value.s} ℃`
+              : `${params.name}`;
+          },
+        },
+        brush: {
+          seriesIndex: [1, 2],
+          yAxisIndex: 0,
+          transformable: true,
+          throttleType: "debounce",
+          throttleDelay: 1000,
+          removeOnClick: true,
+          brushType: "polygon",
+          brushMode: "multiple",
+          brushStyle: {
+            borderWidth: 1,
+            borderColor: "#ff2424",
+          },
+        },
+        dataZoom: [
+          {
+            type: "inside", //图表下方的伸缩条
+            show: false, //是否显示
+            realtime: true, //拖动时,是否实时更新系列的视图
+            start: 0, //伸缩条开始位置(1-100),可以随时更改
+            end: 100, //伸缩条结束位置(1-100),可以随时更改
+          },
+          {
+            type: "slider", //图表下方的伸缩条
+            show: false, //是否显示
+            realtime: true, //拖动时,是否实时更新系列的视图
+            start: 0, //伸缩条开始位置(1-100),可以随时更改
+            end: 100, //伸缩条结束位置(1-100),可以随时更改
+          },
+        ],
+        textStyle: {
+          fontSize: 16,
+          color: that.theme === "dark" ? "#fff" : "#000",
+        },
+        //图例-每一条数据的名字
+        legend: {
+          show: that.showLegend,
+          data: that.seriesData.map((i) => i.name),
+          right: "120",
+          top: "5",
+          // icon: "circle",
+          itemWidth: 6,
+          inactiveColor:
+            that.theme === "dark" ? partten.getColor("gray") : "#838383",
+          textStyle: {
+            color:
+              that.theme === "dark" ? partten.getColor("grayl") : "#838383",
+            fontSize: 12,
+          },
+        },
+        visualMap: [
+          {
+            type: "continuous",
+            min: -40,
+            max: 60,
+            dimension: 2,
+            orient: "vertical",
+            right: 4,
+            top: 50,
+            itemHeight: 600,
+            text: ["60", "-40"],
+            textStyle: {
+              color: "#ccc",
+            },
+            calculable: false,
+            range: [-40, 60],
+            inRange: {
+              color: [
+                "#000",
+                "rgb(75,11,106)",
+                "rgb(133,33,106)",
+                "rgb(176,49,92)",
+                "rgb(210,70,69)",
+                "rgb(235,100,42)",
+                "rgb(247,126,21)",
+                "rgb(252,183,28)",
+                "rgb(249,252,156)",
+              ],
+            },
+            outOfRange: {
+              color: ["#eee", "#eee"],
+            },
+          },
+        ],
+        grid: {
+          top: 48,
+          left: 40,
+          right: 50,
+          bottom: 24,
+          containLabel: true,
+        },
+        //x轴
+        xAxis: [
+          {
+            name: "光照",
+            nameTextStyle: {
+              color: "#838383",
+            },
+            type: "value",
+            boundaryGap: false,
+            data: that.xAxisData || [],
+            min: 0,
+            max: "dataMax",
+            // interval: 1,
+            axisLabel: {
+              formatter: "{value}",
+            },
+            splitLine: {
+              show: false,
+            },
+            textStyle: {
+              color: that.theme === "dark" ? partten.getColor("gray") : "#000",
+            },
+          },
+        ],
+        //y轴没有显式设置,根据值自动生成y轴
+        yAxis: [
+          {
+            splitLine: { show: false },
+            position: "left",
+            min: 0,
+            name: "kW",
+            nameTextStyle: {
+              color: "#838383",
+            },
+          },
+          {
+            splitLine: { show: false },
+            position: "right",
+            min: 0,
+          },
+        ],
+        animation: true,
+        dataset: that.dataSet.length ? JSON.parse(that.dataSet) : [],
+        //数据-data是最终要显示的数据
+        series: that.seriesData,
+      };
+
+      that.resize = function () {
+        myChart.resize();
+      };
+
+      window.addEventListener("resize", that.resize);
+
+      myChart.setOption(option);
+      myChart.on("legendselectchanged", (params) => {
+        let arr = Object.values(params.selected);
+        if (arr.indexOf(false) == -1) {
+          that.$emit("closeBrush", true);
+        } else {
+          that.$emit("closeBrush", false);
+        }
+      });
+      if (that.brushSelected) {
+        myChart.dispatchAction({
+          type: "takeGlobalCursor",
+          // 如果想变为“可刷选状态”,必须设置。不设置则会关闭“可刷选状态”。
+          key: "brush",
+          brushOption: {
+            seriesIndex: [2, 3],
+            yAxisIndex: 0,
+            transformable: true,
+            throttleType: "debounce",
+            throttleDelay: 1000,
+            removeOnClick: true,
+            brushType: "polygon",
+            brushMode: "multiple",
+            brushStyle: {
+              borderWidth: 1,
+              color: "rgba(255,36,36,0.2)",
+              borderColor: "#ff2424",
+            },
+          },
+        });
+      }
+      myChart.off("brushSelected");
+      myChart.on("brushSelected", (params) => {
+        that.$emit("getSelected", params.batch || []);
+      });
+      myChart.off("click");
+      myChart.on("click", (params) => {
+        // console.log(params)
+        if (params.componentType === "markArea") {
+          myChart.dispatchAction({
+            type: "brush",
+            areas: [
+              {
+                xAxisIndex: 0,
+                brushType: "lineX",
+                coordRange: [params.data.coord[0][0], params.data.coord[1][0]],
+              },
+            ],
+          });
+        }
+      });
+    },
+  },
+  created() {
+    this.id = "chart-" + util.newGUID();
+  },
+  mounted() {
+    // this.$nextTick(() => {
+    this.$el.style.width = this.width;
+    this.$el.style.height = this.height;
+    this.initChart();
+    if (this.chart) {
+      this.chart.resize();
+    }
+    // });
+  },
+  updated() {
+    // console.log('update')
+    let myChart = echarts.init(document.getElementById(this.id));
+    myChart.dispose();
+    this.$nextTick(() => {
+      this.initChart();
+    });
+  },
+  unmounted() {
+    window.removeEventListener("resize", this.resize);
+  },
+};
+</script>
+
+<style>
+.chart {
+  width: 100%;
+  height: 100%;
+  display: inline-block;
+}
+</style>

+ 72 - 0
src/views/HealthControl/energyEfficAnalyse/powerHotAnalyse/components/table.vue

@@ -0,0 +1,72 @@
+<script setup name="table">
+import { ref, computed, defineProps, defineEmits } from "vue";
+const props = defineProps({
+  height: {
+    type: String,
+    default: "800px",
+  },
+  data: {
+    type: Array,
+    default: () => [],
+  },
+  column: {
+    type: Array,
+    default: () => [],
+  },
+  tableName: {
+    type: String,
+    default: "",
+  },
+  tableId: {
+    type: String,
+    default: "",
+  },
+  loading: {
+    type: Boolean,
+    default: false,
+  },
+});
+const emits = defineEmits(["export"]);
+const funExport = () => {
+  emits("export");
+};
+const tableRef = ref("");
+const tableHeight = computed(() => {
+  return tableRef.value.offsetHeight ? tableRef.value.offsetHeight - 12 : 739;
+});
+</script>
+<template>
+  <div
+    ref="tableRef"
+    class="p-[10px]"
+    :style="{
+      height:
+        typeof props.height === 'string' ? props.height : props.height + 'px',
+    }"
+  >
+    <!-- <div class="flex justify-between items-center pb-[10px]"> -->
+    <!-- <h3>{{props.tableName}}</h3> -->
+    <!-- <el-button size="small" type="primary" @click="funExport" :disabled="!props.tableId">数据导出</el-button> -->
+    <!-- </div> -->
+    <el-table
+      :data="props.data"
+      stripe
+      size="small"
+      v-loading="props.loading"
+      :max-height="tableHeight"
+      :style="{ width: '100%' }"
+    >
+      <el-table-column
+        align="center"
+        show-overflow-tooltip
+        v-for="item in props.column"
+        :key="item.prop"
+        :prop="item.prop"
+        :label="item.label"
+        sortable
+        resizable
+        :min-width="item.width ? item.width : 80"
+      />
+    </el-table>
+  </div>
+</template>

+ 966 - 0
src/views/HealthControl/energyEfficAnalyse/powerHotAnalyse/index.vue

@@ -0,0 +1,966 @@
+<template>
+  <div class="draught-fan-list">
+    <div class="form-wrapper">
+      <div class="search mg-b-8">
+        <div class="search-items">
+          <div class="search-item">
+            <div class="lable">电站:</div>
+            <div class="search-content">
+              <el-select
+                v-model="station"
+                clearable
+                size="mini"
+                placeholder="请选择"
+                popper-class="select"
+                @change="
+                  (station) => {
+                    getWt(station, true);
+                  }
+                "
+              >
+                <el-option
+                  v-for="item in wpArray"
+                  :key="item.id"
+                  :value="item.id"
+                  :label="item.name"
+                />
+              </el-select>
+            </div>
+          </div>
+          <div class="search-item">
+            <div class="lable">设备:</div>
+            <div class="search-content">
+              <el-select
+                v-model="inverters"
+                clearable
+                :multiple="isMultiple"
+                collapse-tags
+                collapse-tags-tooltip
+                size="mini"
+                placeholder="请选择"
+                popper-class="select"
+              >
+                <el-checkbox
+                  v-if="isMultiple"
+                  v-model="checked"
+                  :indeterminate="indeterminate"
+                  @change="selectAll"
+                  >全选</el-checkbox
+                >
+                <el-option
+                  v-for="item in wtArray"
+                  :key="item.id"
+                  :value="item.id"
+                  :label="item.name"
+                />
+              </el-select>
+            </div>
+          </div>
+          <div class="search-item">
+            <div class="lable">开始时间:</div>
+            <div class="search-content">
+              <el-date-picker
+                v-model="startdate"
+                type="datetime"
+                size="mini"
+                :disabled-date="disabledDate"
+                placeholder="选择日期时间"
+                popper-class="date-select"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="search-item">
+            <div class="lable">结束时间:</div>
+            <div class="search-content">
+              <el-date-picker
+                v-model="enddate"
+                type="datetime"
+                :disabled-date="disabledDate2"
+                size="mini"
+                placeholder="选择日期时间"
+                popper-class="date-select"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="search-item custom">
+            <div class="lable">等间隔:</div>
+            <div class="search-content" style="width: 530px">
+              <el-radio-group v-model="interval">
+                <el-radio
+                  v-for="item in radioList"
+                  :key="item.code"
+                  size="mini"
+                  :label="item.code"
+                  >{{ item.name }}</el-radio
+                >
+              </el-radio-group>
+            </div>
+          </div>
+        </div>
+        <div class="search-actions">
+          <el-button size="mini" class="btn-search" @click="search"
+            >曲线拟合</el-button
+          >
+          <!-- <el-button
+            size="mini"
+            :class="{ 'btn-active': isChartArea }"
+            :disabled="!seriesData?.length"
+            @click="funChartArea"
+            >区域划分</el-button
+          > -->
+        </div>
+      </div>
+      <div class="search mg-b-8">
+        <div class="search-items">
+          <div class="search-item">
+            <div class="lable">最大辐照强度:</div>
+            <div class="search-content">
+              <el-input-number
+                v-model="maxs"
+                size="mini"
+                clearable
+                :min="mins + 1"
+                :max="5000"
+                placeholder="请选择"
+                popper-class="select"
+              >
+              </el-input-number>
+            </div>
+          </div>
+          <div class="search-item">
+            <div class="lable">最小辐照强度:</div>
+            <div class="search-content">
+              <el-input-number
+                v-model="mins"
+                size="mini"
+                clearable
+                :min="0"
+                :max="maxs - 1"
+                placeholder="请选择"
+                popper-class="select"
+              >
+              </el-input-number>
+            </div>
+          </div>
+          <div class="search-item">
+            <div class="lable">最大功率:</div>
+            <div class="search-content">
+              <el-input-number
+                v-model="maxpower"
+                size="mini"
+                clearable
+                :min="minpower + 1"
+                placeholder="请选择"
+                popper-class="select"
+              >
+              </el-input-number>
+            </div>
+          </div>
+          <div class="search-item">
+            <div class="lable">最小功率:</div>
+            <div class="search-content">
+              <el-input-number
+                v-model="minpower"
+                size="mini"
+                :min="0"
+                clearable
+                placeholder="请选择"
+                popper-class="select"
+              >
+              </el-input-number>
+            </div>
+          </div>
+          <div class="search-item">
+            <div class="lable">多项式:</div>
+            <div class="search-content">
+              <el-select v-model="dimension" size="mini">
+                <el-option
+                  v-for="item in 10"
+                  :key="item"
+                  :value="item"
+                  :label="item"
+                />
+              </el-select>
+            </div>
+          </div>
+          <div class="search-item">
+            <div class="lable">拟合方式:</div>
+            <div class="search-content">
+              <el-select v-model="mode" size="mini">
+                <el-option
+                  v-for="item in selectList"
+                  :key="item.code"
+                  size="mini"
+                  :value="item.code"
+                  :label="item.name"
+                />
+              </el-select>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div style="height: calc(100% - 40px); padding-bottom: 10px">
+      <el-tabs v-model="activeTab">
+        <el-tab-pane label="图表展示" name="2"> </el-tab-pane>
+        <div style="height: 100%">
+          <CurrentScatterChart
+            ref="chartRef"
+            width="100%"
+            height="100%"
+            :chartTitle="''"
+            :xAxisData="xAxisData"
+            :yAxisData="{ splitLine: { show: false } }"
+            :seriesData="seriesData"
+            :showLegend="true"
+            :brushSelected="isChartArea"
+            :dataSet="dataSet"
+            @getSelected="funChartSelect"
+            @closeBrush="
+              (val) => {
+                isChartArea = val;
+              }
+            "
+          />
+        </div>
+      </el-tabs>
+    </div>
+    <el-dialog v-model="wtDialog" width="60%" top="120px" draggable>
+      <template #title>
+        <div class="dialog-title">
+          <div class="title">设备功率点位</div>
+        </div>
+      </template>
+      <el-tabs v-model="wtTab">
+        <el-tab-pane label="数据" name="table">
+          <el-table :data="wtData" row-key="id" :max-height="550">
+            <el-table-column property="inverter" align="center" label="设备" />
+            <el-table-column
+              property="datetime"
+              sortable
+              width="200"
+              align="center"
+              label="时间"
+            />
+            <el-table-column
+              property="S"
+              sortable
+              width="140"
+              align="center"
+              label="光照(W/m²)"
+            />
+            <el-table-column
+              property="actualP"
+              sortable
+              width="140"
+              align="center"
+              label="功率(kW)"
+            />
+            <el-table-column
+              property="T"
+              sortable
+              width="140"
+              align="center"
+              label="温度(℃)"
+            />
+            <el-table-column
+              property="filter"
+              sortable
+              width="140"
+              align="center"
+              label="是否有用点"
+            />
+          </el-table>
+        </el-tab-pane>
+        <el-tab-pane label="故障" name="problem" disabled> </el-tab-pane>
+        <el-tab-pane label="预警" name="warning" disabled> </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+// import ScatterLineChart from "@com/chart/combination/scatter-line-chart.vue";
+import tableCop from "./components/table.vue";
+import CurrentScatterChart from "./components/current-scatter-chart.vue";
+import api1 from "@api/economic/index.js";
+// import api from "@api/wisdomOverhaul/energy/index.js";
+import dayjs from "dayjs";
+import {
+  getIntervers,
+  getPowerFittingGF,
+  getPowerHotChartGF,
+  getPowerFittingChart,
+  getPowerFittingTable,
+  getPowerFittingSelectedChartGF,
+} from "@/api/powerAnalyse.js";
+export default {
+  // 名称
+  name: "powerHotAnalyse",
+
+  // 使用组件
+  components: {
+    // ScatterLineChart,
+    CurrentScatterChart,
+    tableCop,
+  },
+
+  // 数据
+  data() {
+    return {
+      activeTab: "2",
+      checkList: [
+        { name: "非并网", code: "isfbw" },
+        { name: "非合理值", code: "isfhl" },
+        { name: "并网后十分钟", code: "isbw" },
+        { name: "停机前十分钟", code: "istj" },
+        { name: "功率曲线偏差", code: "isglpc" },
+      ],
+      selectList: [
+        { name: "单台拟合", code: 0 },
+        { name: "合并拟合", code: 1 },
+        // { name: "同名拟合", code: 2 },
+      ],
+      radioList: [
+        { name: "一秒钟", code: 1 },
+        { name: "一分钟", code: 60 },
+        { name: "十分钟", code: 600 },
+        { name: "十五分钟", code: 900 },
+      ],
+      isAsc: "asc",
+      wpArray: [],
+      wtArray: [],
+      station: "",
+      inverters: "",
+      startdate: dayjs()
+        // .add(-1, "month")
+        .startOf("month")
+        .format("YYYY-MM-DD HH:mm:ss"),
+      enddate: dayjs().startOf("day").format("YYYY-MM-DD HH:mm:ss"),
+      interval: 600,
+      maxs: 5000,
+      mins: 0,
+      maxpower: 2500,
+      minpower: 0,
+      checkedList: ["isfbw", "isfhl", "isbw", "istj", "isglpc"],
+      dimension: 10,
+      mode: 0,
+      fittingId: "",
+      seriesData: [],
+      avgObj: {
+        //平均cpz等
+        title: "",
+        cpavg: "",
+        frequency: "",
+        pcratio: "",
+      },
+      markDot: {
+        //3-5 point点等
+        pcl5: null,
+        pcl10: null,
+        pcl12: null,
+        pcl25: null,
+      },
+      xAxisData: [],
+      dataSet: "",
+      isChartArea: true,
+      tableShowId: "",
+      tableColumn: [],
+      tableLoading: false,
+      tableName: "",
+      tableData: [],
+      wtTab: "table",
+      wtDialog: false,
+      wtData: [],
+      isMultiple: false,
+      checked: false,
+      indeterminate: false,
+    };
+  },
+  created() {
+    this.getWp();
+  },
+  watch: {
+    mode(val) {
+      if (val == 0) {
+        this.isMultiple = false;
+        this.inverters =
+          typeof this.inverters == "string"
+            ? this.inverters
+            : this.inverters.length
+            ? this.inverters[0]
+            : [];
+      } else {
+        this.isMultiple = true;
+        this.inverters =
+          typeof this.inverters == "string"
+            ? [this.inverters]
+            : [...this.inverters];
+      }
+    },
+    inverters: {
+      handler(newVal, oldVal) {
+        this.$nextTick(() => {
+          if (this.isMultiple) {
+            this.inverters = newVal;
+            if (this.wtArray.length && this.inverters) {
+              if (this.inverters.length === this.wtArray.length) {
+                this.checked = true;
+                this.indeterminate = false;
+              } else if (this.inverters.length < this.wtArray.length) {
+                this.checked = false;
+                if (this.inverters.length != 0) {
+                  this.indeterminate = true;
+                }
+                if (newVal.length == 0) {
+                  this.$message.error("必须至少选择一项");
+                  this.inverters = oldVal;
+                }
+              }
+            }
+          }
+        });
+      },
+      immediate: true,
+    },
+  },
+  // 函数
+  methods: {
+    selectAll() {
+      if (this.checked) {
+        this.wtArray.forEach((item) => {
+          this.inverters.push(item.id);
+        });
+        this.inverters = [...new Set(this.inverters)];
+        this.indeterminate = false;
+      } else {
+        this.inverters = [this.wtArray[0].id];
+      }
+    },
+    // 时间选择器第一个禁用
+    disabledDate(time) {
+      if (this.enddate) {
+        return time.getTime() > Date.parse(this.enddate);
+      } else {
+        return null;
+      }
+    },
+    // 时间选择器第二个禁用
+    disabledDate2(time) {
+      if (this.startdate) {
+        return time.getTime() < Date.parse(this.startdate);
+      } else {
+        return null;
+      }
+    },
+    // 获取风场
+    getWp(reGetWp) {
+      api1
+        .getWpList({
+          type: "-2",
+        })
+        .then((res) => {
+          if (res.data.code === 200) {
+            this.wpArray = res.data.data;
+            this.station = res.data.data[0].id;
+            this.getWt(this.station, reGetWp);
+          }
+        });
+    },
+    // 获取风机
+    getWt(wpid, reGetWp) {
+      if (wpid) {
+        getIntervers({
+          wpids: wpid,
+        }).then(({ data: res }) => {
+          if (res.code === 200) {
+            this.wtArray = res.data;
+            this.inverters = res.data.length
+              ? this.isMultiple
+                ? [res.data[0].id]
+                : res.data[0].id
+              : "";
+            if (!reGetWp) {
+              this.search();
+            }
+          }
+        });
+      }
+    },
+    //获取拟合id
+    getChartId() {
+      this.BASE.showLoading();
+      this.activeTab = "2";
+      let params = {
+        station: this.station,
+        inverters: this.isMultiple ? this.inverters.join(",") : this.inverters,
+        startdate: dayjs(this.startdate).valueOf(),
+        enddate: dayjs(this.enddate).valueOf(),
+        interval: this.interval,
+        maxs: this.maxs,
+        mins: this.mins,
+        maxpower: this.maxpower,
+        minpower: this.minpower,
+      };
+      this.getChartData(params);
+    },
+    //清空数据
+    clear() {
+      this.fittingId = "";
+      this.seriesData = [];
+      this.avgObj = {
+        //平均cpz等
+        title: "",
+        cpavg: "",
+        frequency: "",
+        pcratio: "",
+      };
+      this.markDot = {
+        //3-5 point点等
+        pcl5: null,
+        pcl10: null,
+        pcl12: null,
+        pcl25: null,
+      };
+      this.xAxisData = [];
+      this.dataSet = "";
+    },
+    //是否区域划分
+    funChartArea() {
+      this.BASE.showLoading();
+      if (this.seriesData.length) {
+        if (!this.isChartArea) {
+          // 请求一下
+          this.seriesData[0] = {
+            ...this.seriesData[0],
+            markLine: {
+              symbol: "none",
+              label: {
+                show: false,
+              },
+              lineStyle: {
+                color: "rgba(96,174,255, 1)",
+              },
+              data: [
+                {
+                  xAxis: 3,
+                  valueIndex: 0,
+                },
+                {
+                  xAxis: 5,
+                  valueIndex: 0,
+                },
+                {
+                  xAxis: 10,
+                  valueIndex: 0,
+                },
+                {
+                  xAxis: 12,
+                  valueIndex: 0,
+                },
+                {
+                  xAxis: 25,
+                  valueIndex: 0,
+                },
+              ],
+            },
+            markArea: {
+              label: {
+                fontSize: 13,
+                color: "#ccc",
+                fontWeight: "normal",
+                fontFamily: "Arial",
+              },
+              itemStyle: {
+                color: "rgba(236,245,255, 0)",
+              },
+              emphasis: {
+                itemStyle: {
+                  color: "rgba(96,174,255, 0.5)",
+                },
+              },
+              data: [
+                [
+                  {
+                    name: `3~5m 偏差率: ${this.markDot.pcl5}%`,
+                    xAxis: 3,
+                  },
+                  {
+                    xAxis: 5,
+                  },
+                ],
+                [
+                  {
+                    name: `5~10m 偏差率: ${this.markDot.pcl10}%`,
+                    xAxis: 5,
+                  },
+                  {
+                    xAxis: 10,
+                  },
+                ],
+                [
+                  {
+                    name: `10~12m 偏差率: ${this.markDot.pcl12}%`,
+                    xAxis: 10,
+                  },
+                  {
+                    xAxis: 12,
+                  },
+                ],
+                [
+                  {
+                    name: `12~25m 偏差率: ${this.markDot.pcl25}%`,
+                    xAxis: 12,
+                  },
+                  {
+                    xAxis: 25,
+                  },
+                ],
+              ],
+            },
+          };
+          this.isChartArea = true;
+          this.BASE.closeLoading();
+        } else {
+          this.seriesData[0] = {
+            ...this.seriesData[0],
+            markLine: null,
+            markArea: null,
+          };
+          this.isChartArea = false;
+          this.BASE.closeLoading();
+        }
+      }
+    },
+    // // 获取表格数据
+    // getTableData() {
+    //   this.tableLoading = true;
+    //   getPowerFittingTable({
+    //     id: this.fittingId,
+    //   }).then((res) => {
+    //     if (res.code == 200) {
+    //       this.tableColumn = res.data.title.map((o) => {
+    //         return {
+    //           prop: o.key,
+    //           width: o.des === "时间" ? 100 : 80,
+    //           label: o.des,
+    //         };
+    //       });
+    //       this.tableData = res.data.data;
+    //       this.$message.success(res.msg);
+    //     }
+    //     this.tableLoading = false;
+    //   });
+    // },
+    // 获取图表数据
+    getChartData(params) {
+      getPowerHotChartGF(params).then((res) => {
+        this.tableData = [];
+        let chartRes = {};
+        if (res.code == 200) {
+          chartRes = res.data;
+          this.dataSet = JSON.stringify([
+            {
+              source: chartRes.wyd,
+            },
+            {
+              source: chartRes.yyd,
+            },
+          ]);
+          this.seriesData = [
+            {
+              name: "拟合功率",
+              type: "line",
+              lineStyle: {
+                width: 3,
+                color: "#3d54be",
+              },
+              symbol: "line", //设定为实心点
+              symbolSize: 0, //设定实心点的大小
+              smooth: true, //这个是把线变成曲线
+              data: chartRes.yydnh,
+              xAxisIndex: 0,
+            },
+
+            {
+              type: "effectScatter",
+              showEffectOn: "emphasis",
+              rippleEffect: {
+                scale: 1,
+              },
+              itemStyle: {
+                color: "#ccc",
+              },
+              name: "无用点",
+              symbolSize: (data) => {
+                return data.s ? (data.s > 10 ? 10 : data.s) : 4;
+              },
+              datasetIndex: 0,
+              encode: {
+                x: "x",
+                y: "y",
+              },
+              xAxisIndex: 0,
+              yAxisIndex: 0,
+            },
+            {
+              type: "effectScatter",
+              showEffectOn: "emphasis",
+              rippleEffect: {
+                scale: 1,
+              },
+              itemStyle: {
+                color: [
+                  {
+                    type: "linear",
+                    colorStops: [
+                      { offset: 0, color: "#000" },
+                      { offset: 0.2, color: "rgb(75,11,106)" },
+                      { offset: 0.4, color: "rgb(210,70,69)" },
+                      { offset: 0.6, color: "rgb(247,126,21)", },
+                      { offset: 1, color: "rgb(249,252,156)" },
+                    ],
+                    globalCoord: false,
+                  },
+                ],
+              },
+              name: "有用点",
+              symbolSize: (data) => {
+                return data.s ? (data.s > 10 ? 10 : data.s) : 4;
+              },
+              datasetIndex: 1,
+              encode: {
+                x: "x",
+                y: "y",
+              },
+              xAxisIndex: 0,
+              yAxisIndex: 0,
+            },
+          ];
+          this.$message.success(res.msg);
+        } else {
+          this.xAxisData = {};
+          this.seriesData = {};
+        }
+        this.BASE.closeLoading();
+      });
+    },
+    //拟合按钮
+    search() {
+      this.isChartArea = true;
+      if (!this.station || !this.inverters) {
+        this.BASE.showMsg({
+          msg: "场站与风机为必选项",
+        });
+      } else {
+        this.getChartId();
+      }
+    },
+    async funChartSelect(batch) {
+      const wDataArr = [];
+      const yDataArr = [];
+      let scatterls = [];
+      let scatterhs = [];
+      let dataSetObj = [];
+      this.wtData = [];
+      if (batch?.length && this.dataSet) {
+        scatterls = batch[0].selected[1].dataIndex;
+        scatterhs = batch[0].selected[2].dataIndex;
+        if (scatterls?.length || scatterhs?.length) {
+          dataSetObj = JSON.parse(this.dataSet);
+          if (scatterls?.length) {
+            for (const scatterIndex of scatterls) {
+              wDataArr.push(dataSetObj[0].source[scatterIndex].k);
+            }
+          }
+          if (scatterhs?.length) {
+            for (const scatterIndex1 of scatterhs) {
+              yDataArr.push(dataSetObj[1].source[scatterIndex1].k);
+            }
+          }
+          const wtRes = await getPowerFittingSelectedChartGF({
+            yk: yDataArr.join(","),
+            wk: wDataArr.join(","),
+          });
+          if (wtRes.code === 200) {
+            let id = 1;
+            const tempArr = []; //用于以风机id 聚合dataArr
+            if (wtRes.data?.length) {
+              for (const data of wtRes.data) {
+                if (tempArr.length) {
+                  const findIndex = tempArr.findIndex(
+                    (o) => o.wtId === data.wtId
+                  );
+                  if (findIndex !== -1) {
+                    if (!tempArr[findIndex].children) {
+                      tempArr[findIndex].children = [];
+                    }
+                    tempArr[findIndex].children.push({
+                      ...data,
+                      id: id,
+                      filter: data.filter === 0 ? "是" : "否",
+                    });
+                    id++;
+                  } else {
+                    tempArr.push({
+                      ...data,
+                      id: id,
+                      filter: data.filter === 0 ? "是" : "否",
+                    });
+                    id++;
+                  }
+                } else {
+                  tempArr.push({
+                    ...data,
+                    id: id,
+                    filter: data.filter === 0 ? "是" : "否",
+                  });
+                  id++;
+                }
+              }
+              this.wtDialog = true;
+              this.$nextTick(() => {
+                this.wtTab = "table";
+                this.wtData = tempArr;
+              });
+            }
+          }
+        }
+      }
+    },
+  },
+
+  unmounted() {},
+};
+</script>
+
+<style lang="less" scoped>
+.draught-fan-list {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  padding: 10px 20px;
+  .form-wrapper ::v-deep {
+    .el-checkbox__input {
+      display: block;
+    }
+    .el-input-number {
+      width: 100%;
+      .el-input-number__decrease,
+      .el-input-number__increase {
+        background: rgba(67, 81, 107, 0.2) !important;
+
+        position: absolute;
+        z-index: 10;
+        border: 0;
+        // height: 33px;
+        // line-height: 33px;
+        &:hover {
+          color: #05be4c;
+        }
+      }
+    }
+    .el-date-editor {
+      width: 100%;
+    }
+    .el-select {
+      width: 100%;
+      .el-select__tags {
+        max-width: 140px !important;
+        .el-select__tags-text {
+          max-width: 62px !important;
+        }
+      }
+    }
+    .el-radio-group {
+      width: 100%;
+      display: flex;
+      .el-radio {
+        flex: 1;
+      }
+    }
+    .search {
+      display: flex;
+      align-items: center;
+      .search-items {
+        display: flex;
+        align-items: center;
+        .search-item {
+          width: 296px;
+          display: flex;
+          align-items: center;
+          margin-right: 10px;
+          .lable {
+            font-size: 14px;
+            font-family: Microsoft YaHei;
+            font-weight: 400;
+            color: #b3b3b3;
+            margin-right: 5px;
+            width: 84px;
+            text-align: right;
+            white-space: nowrap;
+          }
+          .search-content {
+            flex: 1;
+          }
+          &:nth-last-child(1) {
+            margin-right: 0;
+          }
+        }
+        .custom {
+          width: auto;
+        }
+      }
+      .search-actions {
+        top: 152px;
+        right: 75px;
+        position: absolute;
+        z-index: 88;
+        .el-button {
+          background-color: rgba(5, 187, 76, 0.3);
+          border: 1px solid #3b6c53;
+          color: #b3b3b3;
+          font-size: 14px;
+          border: none;
+          width: 108px;
+          min-height: 25px !important;
+
+          &.btn-search:hover {
+            background-color: rgba(5, 187, 76, 0.6);
+            color: #ffffff;
+          }
+        }
+        .btn-active {
+          background-color: rgba(5, 187, 76, 0.6);
+          color: #ffffff;
+        }
+      }
+      &:nth-last-child(1) {
+        justify-content: space-between;
+      }
+    }
+  }
+  .el-tabs ::v-deep {
+    height: 100%;
+    .el-tabs__item {
+      color: #b3b3b3;
+    }
+    .el-tabs__nav-wrap::after {
+      background-color: #14221f;
+    }
+    .el-tabs__active-bar {
+      background-color: #05bb4c;
+    }
+    .el-tabs__item.is-active,
+    .el-tabs__item:hover {
+      color: #05bb4c;
+    }
+    .el-tabs__content {
+      height: calc(100% - 40px);
+    }
+  }
+}
+</style>

+ 0 - 5
src/views/layout/Header.vue

@@ -212,11 +212,6 @@ export default {
         window.open(url);
         return;
       }
-      if (data.id === "fdnlpt") {
-        let url = `http://10.81.3.155:8083/fdfx`;
-        window.open(url);
-        return;
-      }
       this.activeIndex = index;
       this.$router.push(data.path);
       const ActiveModule = this.currMenu.find((ele) => {

+ 37 - 0
src/views/report/index copy.vue

@@ -0,0 +1,37 @@
+<template>
+  <div style="height: 100%" id="baobiao">
+    <iframe
+      :src="url"
+      width="100%"
+      height="100%"
+      frameborder="0"
+      scrolling="auto"
+      style="background: #fff"
+    ></iframe>
+  </div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      url: "./static/iframe.html",
+      //   url: "https://202.99.219.114:28888/qjny/report/view/report?viewlet=清洁能源/生产部门日周月报/日报表填报-加发电量.cpt&op=write",
+      //   url: "https://202.99.219.114:28888/qjny/report/view/report?viewlet=清洁能源/生产部门日周月报/周报表展示.cpt&op=write",
+      //   url: "https://202.99.219.114:28888/qjny/report/view/report?viewlet=清洁能源/生产部门日周月报/周报表展示.cpt",
+    };
+  },
+};
+</script>
+<style lang="less" scope>
+@titleGray: #9ca5ab;
+@rowGray: #606769;
+@darkBack: #536268;
+.knowledge-2 {
+  .el-select {
+    width: 200px;
+  }
+  .el-input {
+    width: 200px;
+  }
+}
+</style>

+ 1 - 1
src/views/stateMonitor/DetailMatrix/index.vue

@@ -1849,7 +1849,7 @@ export default {
             height: 50px;
 
             .card-left {
-              width: 45px;
+              width: 60px;
               height: 100%;
               display: flex;
               flex-direction: column;

+ 2 - 2
src/views/stateMonitor/LightMatrix/index.vue

@@ -1059,12 +1059,12 @@ export default {
     padding: 5px 0;
     display: grid;
     justify-content: space-between;
-    grid-template-columns: repeat(auto-fill, 44px);
+    grid-template-columns: repeat(auto-fill, 60px);
 
     span {
       cursor: pointer;
       display: inline-block;
-      min-width: 44px;
+      min-width: 60px;
       height: 22px;
       line-height: 22px;
       text-align: center;

+ 34 - 4
src/views/stateMonitor/factoryMonitor/photovoltaic/lightDataTarget/index.vue

@@ -170,7 +170,37 @@ export default {
       JSON.stringify(localLightTargets) != "{}"
     ) {
       localLightTargets = JSON.parse(localLightTargets);
-      this.uniformDetial = localLightTargets;
+      if (localLightTargets[1].name == "装机容量") {
+        localStorage.removeItem("lightlocalData");
+        this.uniformDetial = Array.from(
+          new Set([
+            {
+              name: "场站名称",
+              uniformCode: "CZMC",
+              valueUnit: "",
+              width: "120",
+            },
+            {
+              name: "装机容量",
+              uniformCode: "ZJRL",
+              valueUnit: "MW",
+              width: "80",
+            },
+            ...localLightTargets.filter(
+              (i) =>
+                i.valueUnit != "kW" &&
+                i.name != "装机容量" &&
+                i.name != "场站名称"
+            ),
+          ])
+        );
+        window.localStorage.setItem(
+          "lightlocalData",
+          JSON.stringify(this.uniformDetial)
+        );
+      } else {
+        this.uniformDetial = localLightTargets;
+      }
     } else {
       this.uniformDetial = [
         {
@@ -182,7 +212,7 @@ export default {
         {
           name: "设备容量",
           uniformCode: "SBXH",
-          valueUnit: "",
+          valueUnit: "MW",
           width: "80",
         },
         {
@@ -396,7 +426,7 @@ export default {
           valueUnit: "",
           width: "120",
         },
-        { name: "设备容量", uniformCode: "SBXH", valueUnit: "", width: "80" },
+        { name: "设备容量", uniformCode: "SBXH", valueUnit: "MW", width: "80" },
         ...codeDetial,
       ];
       window.localStorage.setItem(
@@ -540,7 +570,7 @@ ul li {
       font-size: 16px;
       font-family: Microsoft YaHei;
       font-weight: 400;
-      color: #05BB4C;
+      color: #05bb4c;
       margin-left: 25px;
     }
   }

+ 187 - 189
src/views/stateMonitor/factoryMonitor/photovoltaic/lightMatrix/index.vue

@@ -1,140 +1,153 @@
 <template>
-  <div>
-    <headerButton @renderData="renderData" :type="-2" :tabShow="true" />
-    <div class="matrix-body">
-      <div class="body-title">
-        <div class="base-inf">
-          <div class="title-name">
-            <div class="imgs">
-              <img src="@assets/imgs/downg.png" />
-              <img src="@assets/imgs/ptyup.png" class="qty_img" />
+  <headerButton @renderData="renderData" :type="-2" :tabShow="true" />
+  <div class="matrix-body">
+    <div class="body-title">
+      <div class="base-inf">
+        <div class="title-name">
+          <div class="imgs">
+            <img src="@assets/imgs/downg.png" />
+            <img src="@assets/imgs/ptyup.png" class="qty_img" />
+          </div>
+          <div class="base-num" @click="handleClick('all')">
+            <div class="ic-nam">
+              <i class="svg-icon svg-icon-sm svg-icon-white">
+                <SvgIcon svgid="svg-station-surveillance"></SvgIcon
+              ></i>
+              <p class="base-name">{{ matrixOther?.czmc }}</p>
             </div>
-            <div class="base-num" @click="handleClick('all')">
-              <div class="ic-nam">
-                <i class="svg-icon svg-icon-sm svg-icon-white">
-                  <SvgIcon svgid="svg-station-surveillance"></SvgIcon
-                ></i>
-                <p class="base-name">{{ matrixOther?.czmc }}</p>
-              </div>
 
-              <div class="ic-fan">
-                <i class="svg-icon svg-icon-sm svg-icon-white">
-                  <SvgIcon svgid="svg-photovoltaic"></SvgIcon
-                ></i>
-                <p class="nums">{{ matrixOther?.zjsl }}</p>
-              </div>
+            <div class="ic-fan">
+              <i class="svg-icon svg-icon-sm svg-icon-white">
+                <SvgIcon svgid="svg-photovoltaic"></SvgIcon
+              ></i>
+              <p class="nums">{{ matrixOther?.zjsl }}</p>
             </div>
           </div>
-          <div class="matrix-status">
-            <div
-              class="title-status"
-              :class="item.color"
-              v-for="(item, index) in titleList"
-              :key="index"
-            >
-              <div class="status-first" @click="handleClick(item.value1)">
-                <div class="matrix-status-left">{{ item.name }}</div>
-                <div class="matrix-status-right">
-                  {{ matrixState[item.code] }}
-                </div>
+        </div>
+        <div class="matrix-status">
+          <div
+            class="title-status"
+            :class="item.color"
+            v-for="(item, index) in titleList"
+            :key="index"
+          >
+            <div class="status-first" @click="handleClick(item.value1)">
+              <div class="matrix-status-left">{{ item.name }}</div>
+              <div class="matrix-status-right">
+                {{ matrixState[item.code] }}
               </div>
-              <div class="status-end" @click="handleClick(item.value2)">
-                <div class="matrix-status-left">
-                  <i
-                    class="svg-icon svg-icon-sm"
-                    :class="
-                      $store.state.themeName === 'dark'
-                        ? 'svg-icon-' + item.color
-                        : 'white'
-                    "
-                  >
-                    <SvgIcon :svgid="item.icon1"></SvgIcon>
-                  </i>
-                  {{ item.text1 }}
-                </div>
-                <div class="matrix-status-right">
-                  {{ matrixState[item.code1] }}
-                </div>
+            </div>
+            <div class="status-end" @click="handleClick(item.value2)">
+              <div class="matrix-status-left">
+                <i
+                  class="svg-icon svg-icon-sm"
+                  :class="
+                    $store.state.themeName === 'dark'
+                      ? 'svg-icon-' + item.color
+                      : 'white'
+                  "
+                >
+                  <SvgIcon :svgid="item.icon1"></SvgIcon>
+                </i>
+                {{ item.text1 }}
               </div>
-              <div class="status-end" @click="handleClick(item.value3)">
-                <div class="matrix-status-left">
-                  <i
-                    class="svg-icon svg-icon-sm"
-                    :class="
-                      $store.state.themeName === 'dark'
-                        ? 'svg-icon-' + item.color
-                        : 'white'
-                    "
-                  >
-                    <SvgIcon :svgid="item.icon2"></SvgIcon>
-                  </i>
-                  {{ item.text2 }}
-                </div>
-                <div class="matrix-status-right">
-                  {{ matrixState[item.code2] }}
-                </div>
+              <div class="matrix-status-right">
+                {{ matrixState[item.code1] }}
+              </div>
+            </div>
+            <div class="status-end" @click="handleClick(item.value3)">
+              <div class="matrix-status-left">
+                <i
+                  class="svg-icon svg-icon-sm"
+                  :class="
+                    $store.state.themeName === 'dark'
+                      ? 'svg-icon-' + item.color
+                      : 'white'
+                  "
+                >
+                  <SvgIcon :svgid="item.icon2"></SvgIcon>
+                </i>
+                {{ item.text2 }}
+              </div>
+              <div class="matrix-status-right">
+                {{ matrixState[item.code2] }}
               </div>
             </div>
           </div>
         </div>
-        <div class="unpaid" @click="handleStationCurveClick(matrixOther.czid)">
-          <div class="unpaid-list">
-            <div
-              class="unpaid-item"
-              v-for="(item, index) in unpaidList"
-              :key="index"
-            >
-              <div class="percent">{{ item.text }}</div>
-              <div class="nums">
-                {{ matrixOther[item.code] }}
-              </div>
+      </div>
+      <div class="unpaid" @click="handleStationCurveClick(matrixOther.czid)">
+        <div class="unpaid-list">
+          <div
+            class="unpaid-item"
+            v-for="(item, index) in unpaidList"
+            :key="index"
+          >
+            <div class="percent">{{ item.text }}</div>
+            <div class="nums">
+              {{ matrixOther[item.code] }}
             </div>
           </div>
         </div>
       </div>
+    </div>
+    <div
+      style="
+        height: calc(100% - 78px);
+        overflow-y: auto;
+        background-color: rgba(0, 0, 0, 0.45);
+        padding: 5px;
+        border-radius: 0 0 5px 5px;
+      "
+    >
       <div
-        style="
-          height: calc(100% - 78px);
-          overflow-y: auto;
-          background-color: rgba(0, 0, 0, 0.45);
-          padding: 5px;
-          border-radius: 0 0 5px 5px;
-        "
+        class="matrixs"
+        v-for="(value, indexe) of showMatrixList"
+        :key="indexe"
       >
-        <div
-          class="matrixs"
-          v-for="(value, indexe) of showMatrixList"
-          :key="indexe"
-        >
-          <div class="line_all">
-            <div class="line-namebox">
-              <div class="line-name">
-                {{ indexe }}
-              </div>
+        <div class="line_all">
+          <div class="line-namebox">
+            <div class="line-name">
+              {{ indexe }}
             </div>
-            <div class="line-list">
+          </div>
+          <div class="line-list">
+            <div
+              class="matrix-item"
+              v-for="(val, indexes) in showMatrixList[indexe]"
+              :key="indexes"
+            >
+              <!--  风机颜色判断-->
               <div
-                class="matrix-item"
-                v-for="(val, indexes) in showMatrixList[indexe]"
-                :key="indexes"
+                class="matrix-card"
+                style="cursor: pointer"
+                :class="
+                  val.yxzt !== '' && colorList[val.yxzt]
+                    ? colorList[Number(val.yxzt)]
+                    : 'gray'
+                "
               >
-                <!--  风机颜色判断-->
-                <div
-                  class="matrix-card"
-                  style="cursor: pointer"
-                  :class="
-                    val.yxzt !== '' && colorList[val.yxzt]
-                      ? colorList[Number(val.yxzt)]
-                      : 'gray'
-                  "
-                >
-                  <div class="info">
-                    <div
-                      class="card-left"
-                      @click="handleLeftClick(val, matrixOther.czid)"
+                <div class="info">
+                  <div
+                    class="card-left"
+                    @click="handleLeftClick(val, matrixOther.czid)"
+                  >
+                    <!-- <i class="lock"></i> -->
+                    <div class="card-name">{{ val.name }}</div>
+                    <i
+                      class="svg-icon svg-icon-sm"
+                      :class="
+                        val.yxzt === 4 || val.yxzt === 5
+                          ? 'svg-icon-white'
+                          : `svg-icon-${colorList[Number(val.yxzt)]}`
+                      "
                     >
-                      <!-- <i class="lock"></i> -->
-                      <div class="card-name">{{ val.name }}</div>
+                      <SvgIcon :svgid="mapping[Number(val.yxzt)]"></SvgIcon
+                    ></i>
+                  </div>
+                  <div class="dashed" />
+                  <div class="card-right" @click="handleRightClick(val.id)">
+                    <div class="right-item">
                       <i
                         class="svg-icon svg-icon-sm"
                         :class="
@@ -143,63 +156,49 @@
                             : `svg-icon-${colorList[Number(val.yxzt)]}`
                         "
                       >
-                        <SvgIcon :svgid="mapping[Number(val.yxzt)]"></SvgIcon
+                        <SvgIcon svgid="svg-P"></SvgIcon
                       ></i>
-                    </div>
-                    <div class="dashed" />
-                    <div class="card-right" @click="handleRightClick(val.id)">
-                      <div class="right-item">
-                        <i
-                          class="svg-icon svg-icon-sm"
-                          :class="
-                            val.yxzt === 4 || val.yxzt === 5
-                              ? 'svg-icon-white'
-                              : `svg-icon-${colorList[Number(val.yxzt)]}`
-                          "
-                        >
-                          <SvgIcon svgid="svg-P"></SvgIcon
-                        ></i>
-                        <div class="right-value">
-                          {{
-                            val.ssgl
-                              ? val && Number(val.ssgl)?.toFixed(2)
-                              : "0.00"
-                          }}
-                        </div>
+                      <div class="right-value">
+                        {{
+                          val.ssgl
+                            ? val && Number(val.ssgl)?.toFixed(2)
+                            : "0.00"
+                        }}
                       </div>
-                      <div class="right-item">
-                        <i
-                          class="svg-icon svg-icon-sm"
-                          :class="
-                            val.yxzt === 4 || val.yxzt === 5
-                              ? 'svg-icon-white'
-                              : `svg-icon-${colorList[Number(val.yxzt)]}`
-                          "
-                        >
-                          <SvgIcon svgid="svg-A"></SvgIcon
-                        ></i>
-                        <div class="right-value">
-                          {{ val.jldl ? Number(val.jldl)?.toFixed(2) : "0.00" }}
-                        </div>
+                    </div>
+                    <div class="right-item">
+                      <i
+                        class="svg-icon svg-icon-sm"
+                        :class="
+                          val.yxzt === 4 || val.yxzt === 5
+                            ? 'svg-icon-white'
+                            : `svg-icon-${colorList[Number(val.yxzt)]}`
+                        "
+                      >
+                        <SvgIcon svgid="svg-A"></SvgIcon
+                      ></i>
+                      <div class="right-value">
+                        {{ val.jldl ? Number(val.jldl)?.toFixed(2) : "0.00" }}
                       </div>
-                      <div class="right-item">
-                        <i
-                          class="svg-icon svg-icon-sm"
-                          :class="
-                            val.yxzt === 4 || val.yxzt === 5
-                              ? 'svg-icon-white'
-                              : `svg-icon-${colorList[Number(val.yxzt)]}`
-                          "
-                        >
-                          <SvgIcon svgid="svg-V"></SvgIcon
-                        ></i>
-                        <div class="right-value">
-                          {{ val.jldy ? Number(val.jldy)?.toFixed(2) : "0.00" }}
-                        </div>
+                    </div>
+                    <div class="right-item">
+                      <i
+                        class="svg-icon svg-icon-sm"
+                        :class="
+                          val.yxzt === 4 || val.yxzt === 5
+                            ? 'svg-icon-white'
+                            : `svg-icon-${colorList[Number(val.yxzt)]}`
+                        "
+                      >
+                        <SvgIcon svgid="svg-V"></SvgIcon
+                      ></i>
+                      <div class="right-value">
+                        {{ val.jldy ? Number(val.jldy)?.toFixed(2) : "0.00" }}
                       </div>
                     </div>
                   </div>
-                  <!-- <div class="matrix-progress">
+                </div>
+                <!-- <div class="matrix-progress">
                     <div
                       class="progress-block"
                       :style="{
@@ -210,33 +209,32 @@
                       "
                     ></div>
                   </div> -->
-                </div>
               </div>
             </div>
           </div>
         </div>
       </div>
     </div>
-    <el-dialog
-      class="dialogs"
-      width="90%"
-      top="40px"
-      v-model="displayMatrix"
-      :show-close="true"
-      destroy-on-close
-    >
-      <template #title>
-        <div class="dialog-title">
-          <div class="title">设备详情</div>
-        </div>
-      </template>
-      <div class="dialog-body" style="height: 800px">
-        <img class="dialog-img" src="@assets/imgs/dialog.png" />
-        <LightDetail :wind="wind" :flag="flag"></LightDetail>
-      </div>
-    </el-dialog>
-    <qushi-dialog ref="child" :chartName="chartName"></qushi-dialog>
   </div>
+  <el-dialog
+    class="dialogs"
+    width="90%"
+    top="40px"
+    v-model="displayMatrix"
+    :show-close="true"
+    destroy-on-close
+  >
+    <template #title>
+      <div class="dialog-title">
+        <div class="title">设备详情</div>
+      </div>
+    </template>
+    <div class="dialog-body" style="height: 800px">
+      <img class="dialog-img" src="@assets/imgs/dialog.png" />
+      <LightDetail :wind="wind" :flag="flag"></LightDetail>
+    </div>
+  </el-dialog>
+  <qushi-dialog ref="child" :chartName="chartName"></qushi-dialog>
 </template>
 
 <script>
@@ -1225,8 +1223,8 @@ p {
       flex-direction: row;
       align-items: center;
       height: 65px;
-        background: #081410;
-    border: 1px solid #083D22;
+      background: #081410;
+      border: 1px solid #083d22;
       position: relative;
       flex: 1 0 auto;
       margin-left: 10px;

+ 13 - 8
src/views/stateMonitor/factoryMonitor/photovoltaic/lightMatrixMonitor/index.vue

@@ -1073,7 +1073,7 @@ export default {
         this.stsee[index].xlLists[indexes].sbLists[indexe]
       );
       let y = this.deepClone(this.ssPv);
-   
+
       y?.forEach((val) => {
         for (let key in val) {
           for (let k in s) {
@@ -1563,9 +1563,12 @@ p {
       }
 
       .line-list {
-        display: flex;
-        margin: 0 10px;
-        flex-wrap: wrap;
+        display: grid;
+        justify-content: space-between;
+        grid-template-columns: repeat(auto-fill, 142px);
+        width: 100%;
+        // margin: 0 10px;
+        // flex-wrap: wrap;
       }
     }
 
@@ -1575,12 +1578,13 @@ p {
       align-items: center;
       flex-wrap: wrap;
       margin-top: 5px;
-
+      width: 142px;
+      height: 59px;
       .matrix-card {
         display: flex;
         flex-direction: column;
-        width: 114px;
-        height: 59px;
+        width: 100%;
+        height: 100%;
         margin-right: 2px;
         margin-bottom: 2px;
 
@@ -1592,7 +1596,7 @@ p {
           height: 50px;
 
           .card-left {
-            width: 45px;
+            width: 50px;
             height: 100%;
             display: flex;
             flex-direction: column;
@@ -1617,6 +1621,7 @@ p {
           }
 
           .card-right {
+            width: calc(100% - 1px - 50px);
             display: flex;
             flex-direction: column;
             padding: 0px 4px;

+ 32 - 2
src/views/stateMonitor/factoryMonitor/windPowerPlant/DataTarget/index.vue

@@ -166,7 +166,37 @@ export default {
     let localWindTargets = window.localStorage.getItem("windlocalData");
     if (localWindTargets != null && JSON.stringify(localWindTargets) != "{}") {
       localWindTargets = JSON.parse(localWindTargets);
-      this.uniformDetial = localWindTargets;
+ if (localWindTargets[1].name == "装机容量") {
+        localStorage.removeItem("windlocalData");
+        this.uniformDetial = Array.from(
+          new Set([
+            {
+              name: "场站名称",
+              uniformCode: "CZMC",
+              valueUnit: "",
+              width: "120",
+            },
+            {
+              name: "装机容量",
+              uniformCode: "ZJRL",
+              valueUnit: "MW",
+              width: "80",
+            },
+            ...localWindTargets.filter(
+              (i) =>
+                i.valueUnit != "kW" &&
+                i.name != "装机容量" &&
+                i.name != "场站名称"
+            ),
+          ])
+        );
+        window.localStorage.setItem(
+          "windlocalData",
+          JSON.stringify(this.uniformDetial)
+        );
+      } else {
+        this.uniformDetial = localWindTargets;
+      }
     } else {
       this.uniformDetial = [
         {
@@ -175,7 +205,7 @@ export default {
           valueUnit: "",
           width: "120",
         },
-        { name: "设备容量", uniformCode: "SBXH", valueUnit: "", width: "80" },
+        { name: "设备容量", uniformCode: "SBXH", valueUnit: "MW", width: "80" },
         {
           name: "齿轮箱轴1温度",
           valueUnit: null,

+ 34 - 4
src/views/stateMonitor/zhzb/zhzb.vue

@@ -198,11 +198,41 @@ export default {
     // 判断本地是否有指标
     if (localAllTargets != null && JSON.stringify(localAllTargets) != "{}") {
       localAllTargets = JSON.parse(localAllTargets);
-      this.uniformDetial = localAllTargets;
+      if (localAllTargets[1].valueUnit == "kW") {
+        localStorage.removeItem("alllocalData");
+        this.uniformDetial = Array.from(
+          new Set([
+            {
+              name: "场站名称",
+              uniformCode: "CZMC",
+              valueUnit: "",
+              width: "120",
+            },
+            {
+              name: "装机容量",
+              uniformCode: "ZJRL",
+              valueUnit: "MW",
+              width: "80",
+            },
+            ...localAllTargets.filter(
+              (i) =>
+                i.valueUnit != "kW" &&
+                i.name != "装机容量" &&
+                i.name != "场站名称"
+            ),
+          ])
+        );
+        window.localStorage.setItem(
+          "alllocalData",
+          JSON.stringify(this.uniformDetial)
+        );
+      } else {
+        this.uniformDetial = localAllTargets;
+      }
     } else {
       this.uniformDetial = [
         { name: "场站名称", uniformCode: "CZMC", valueUnit: "", width: "120" },
-        { name: "装机容量", uniformCode: "ZJRL", valueUnit: "kW", width: "80" },
+        { name: "装机容量", uniformCode: "ZJRL", valueUnit: "MW", width: "80" },
         {
           name: "日限电停机损失电量",
           valueUnit: null,
@@ -385,7 +415,7 @@ export default {
         {
           name: "装机容量",
           uniformCode: "ZJRL",
-          valueUnit: "kW",
+          valueUnit: "MW",
           width: "80",
         },
         ...codeDetial,
@@ -604,7 +634,7 @@ export default {
       font-size: 16px;
       font-family: Microsoft YaHei;
       font-weight: 400;
-      color: #05BB4C;
+      color: #05bb4c;
       margin-left: 25px;
     }
   }