Quellcode durchsuchen

完成清洗录入、故障录入、场站月度分析页面功能

baiyanting vor 2 Jahren
Ursprung
Commit
03ee347559

BIN
public/static/template/wordTemplate.docx


+ 16 - 0
src/api/headerNav.js

@@ -25,6 +25,22 @@ export function GetwtByWp(wpids) {
     method: "get",
     method: "get",
   });
   });
 }
 }
+// 根据场站 ID 获取型号
+export function GetModelList(wpids) {
+  return request({
+    baseURL: process.env.VUE_APP_Economy,
+    url: `benchmarking/modellist?wpids=${wpids}`,
+    method: "get",
+  });
+}
+// 根据场站 ID 获取阵区
+export function GetModelListByWp(wpids) {
+  return request({
+    baseURL: process.env.VUE_APP_Economy,
+    url: `benchmarking/squarelist?wpids=${wpids}`,
+    method: "get",
+  });
+}
 
 
 // 根据线路 ID 获取风机列表
 // 根据线路 ID 获取风机列表
 export function GeWtList(lnids) {
 export function GeWtList(lnids) {

+ 52 - 0
src/api/insert.js

@@ -0,0 +1,52 @@
+import request from "@/utils/request";
+
+// 查询清洗录入列表
+export function GetCleanList(data) {
+  return request({
+    baseURL: process.env.VUE_APP_Economy,
+    url: `pro-econ-cleaning-input/list?windpowerstationId=${data.windpowerstationId}&pageNum=${data.pageNum}&pageSize=${data.pageSize}&begindate=${data.begindate}&planEnddate=${data.planEnddate}`,
+    method: "get",
+  });
+}
+// 新增/编辑清洗录入
+export function CleanOperation(data) {
+  return request({
+    baseURL: process.env.VUE_APP_Economy,
+    url: `pro-econ-cleaning-input/add`,
+    method: "post",
+    data,
+  });
+}
+//删除清洗录入
+export function CleanDelete(id) {
+  return request({
+    baseURL: process.env.VUE_APP_Economy,
+    url: `pro-econ-cleaning-input/${id}`,
+    method: "delete",
+  });
+}
+// 查询故障录入列表
+export function GetFaultList(data) {
+  return request({
+    baseURL: process.env.VUE_APP_Economy,
+    url: `pro-econ-fault-fault/list?windpowerstationId=${data.windpowerstationId}&pageNum=${data.pageNum}&pageSize=${data.pageSize}&begindate=${data.begindate}&planEnddate=${data.planEnddate}`,
+    method: "get",
+  });
+}
+// 新增/编辑故障录入
+export function FaultOperation(data) {
+  return request({
+    baseURL: process.env.VUE_APP_Economy,
+    url: `pro-econ-fault-fault/add`,
+    method: "post",
+    data,
+  });
+}
+//删除故障录入
+export function FaultDelete(id) {
+  return request({
+    baseURL: process.env.VUE_APP_Economy,
+    url: `pro-econ-fault-fault/${id}`,
+    method: "delete",
+  });
+}

+ 8 - 1
src/api/monthlyPerformanceAnalysis.js

@@ -403,4 +403,11 @@ export function getApiEconReport(params) {
     method: "GET",
     method: "GET",
   });
   });
 }
 }
-
+// -----------------------------------------------------------场站月度分析------------------------------------------------------------------------
+export function getApiStationMonthAnalyse(params) {
+  return request({
+    baseURL: process.env.VUE_APP_Economy,
+    url: `/stationAnalysis/month?companys=${params.companys}&type=${params.type}&beginDate=${params.beginDate}&endDate=${params.endDate}`,
+    method: "GET",
+  });
+}

+ 5 - 0
src/assets/css/common.css

@@ -314,6 +314,11 @@
   border-bottom: 1px solid #323b3c;
   border-bottom: 1px solid #323b3c;
   margin: 0 24px;
   margin: 0 24px;
 }
 }
+.el-dialog__footer {
+  padding: 15px 0 !important;
+  border-top: 1px solid #323b3c;
+  margin: 0 24px;
+}
 
 
 /* .matrix-body .el-dialog__header {
 /* .matrix-body .el-dialog__header {
     padding: 0 0 !important;
     padding: 0 0 !important;

+ 70 - 15
src/router/index.js

@@ -487,6 +487,18 @@ export const asyncRoutes = [
             },
             },
           },
           },
           {
           {
+            path: "brandBenchmarking",
+            component: () =>
+              import(
+                "@/views/layout/economicsOperation/benchmarkingManagement/brandBenchmarking"
+              ),
+            name: "brandBenchmarking",
+            meta: {
+              title: "品牌对标",
+              icon: "",
+            },
+          },
+          {
             path: "wiringBenchmarking",
             path: "wiringBenchmarking",
             component: () =>
             component: () =>
               import(
               import(
@@ -756,6 +768,18 @@ export const asyncRoutes = [
             },
             },
           },
           },
           {
           {
+            path: "stationMonthAnalyse",
+            component: () =>
+              import(
+                "@/views/layout/economicsOperation/analyse/stationMonthAnalyse"
+              ),
+            name: "stationMonthAnalyse",
+            meta: {
+              title: "场站月度分析",
+              icon: "",
+            },
+          },
+          {
             path: "inverterAnalyse",
             path: "inverterAnalyse",
             component: () =>
             component: () =>
               import(
               import(
@@ -782,9 +806,7 @@ export const asyncRoutes = [
           {
           {
             path: "cleanAnalyse",
             path: "cleanAnalyse",
             component: () =>
             component: () =>
-              import(
-                "@/views/layout/economicsOperation/analyse/cleanAnalyse"
-              ),
+              import("@/views/layout/economicsOperation/analyse/cleanAnalyse"),
             name: "cleanAnalyse",
             name: "cleanAnalyse",
             meta: {
             meta: {
               title: "清洗分析",
               title: "清洗分析",
@@ -973,40 +995,53 @@ export const asyncRoutes = [
             },
             },
           },
           },
           {
           {
-            path: "reset",
+            path: "utillHours",
             component: () =>
             component: () =>
               import(
               import(
-                "@/views/layout/economicsOperation/thematicAnalysis/reset"
+                "@/views/layout/economicsOperation/thematicAnalysis/utillHours"
               ),
               ),
-            name: "reset",
+            name: "utillHours",
             meta: {
             meta: {
-              title: "复位及时率",
+              title: "利用小时分析",
               icon: "",
               icon: "",
             },
             },
           },
           },
           {
           {
-            path: "MTBF",
+            path: "utillHoursFd",
             component: () =>
             component: () =>
-              import("@/views/layout/economicsOperation/thematicAnalysis/MTBF"),
-            name: "MTBF",
+              import(
+                "@/views/layout/economicsOperation/thematicAnalysis/utillHours/indexFd.vue"
+              ),
+            name: "utillHoursFd",
             meta: {
             meta: {
-              title: "MTBF",
+              title: "利用小时分析",
               icon: "",
               icon: "",
             },
             },
           },
           },
           {
           {
-            path: "generation",
+            path: "reset",
             component: () =>
             component: () =>
               import(
               import(
-                "@/views/layout/economicsOperation/thematicAnalysis/generation"
+                "@/views/layout/economicsOperation/thematicAnalysis/reset"
               ),
               ),
-            name: "generation",
+            name: "reset",
             meta: {
             meta: {
-              title: "发电量分析",
+              title: "复位及时率",
               icon: "",
               icon: "",
             },
             },
           },
           },
           {
           {
+            path: "MTBF",
+            component: () =>
+              import("@/views/layout/economicsOperation/thematicAnalysis/MTBF"),
+            name: "MTBF",
+            meta: {
+              title: "MTBF",
+              icon: "",
+            },
+          },
+
+          {
             path: "synthesize",
             path: "synthesize",
             component: () =>
             component: () =>
               import(
               import(
@@ -1081,6 +1116,26 @@ export const asyncRoutes = [
           },
           },
         ],
         ],
       },
       },
+      {
+        path: "insert/clean",
+        component: () =>
+          import("@/views/layout/economicsOperation/insert/cleanInsert"),
+        name: "cleanInsert",
+        meta: {
+          title: "清洗录入",
+          icon: "",
+        },
+      },
+      {
+        path: "insert/fault",
+        component: () =>
+          import("@/views/layout/economicsOperation/insert/faultInsert"),
+        name: "faultInsert",
+        meta: {
+          title: "故障录入",
+          icon: "",
+        },
+      },
     ],
     ],
   },
   },
 ];
 ];

+ 7 - 5
src/views/layout/economicsOperation/analyse/economyReport/index.vue

@@ -101,6 +101,7 @@
 
 
 <script>
 <script>
 import Get_PDF from "@tools/fixGetPDF";
 import Get_PDF from "@tools/fixGetPDF";
+import BASE from "@tools/basicTool.js";
 import docxtemplater from "docxtemplater";
 import docxtemplater from "docxtemplater";
 import { saveAs } from "file-saver";
 import { saveAs } from "file-saver";
 import JSZipUtils from "jszip-utils";
 import JSZipUtils from "jszip-utils";
@@ -175,7 +176,7 @@ export default {
 
 
   methods: {
   methods: {
     init(row) {
     init(row) {
-      this.reportName = row.stationName;
+      this.reportName = row.windpowerstationAname;
       this.getContentData();
       this.getContentData();
     },
     },
     // 初始化树形
     // 初始化树形
@@ -271,21 +272,22 @@ export default {
 
 
     // 导出 PDF
     // 导出 PDF
     exportPDF() {
     exportPDF() {
-      this.BASE.showLoading({
+      BASE.showLoading({
         text: "正在导出...请稍后...",
         text: "正在导出...请稍后...",
       });
       });
       setTimeout(() => {
       setTimeout(() => {
         Get_PDF.getPdf(
         Get_PDF.getPdf(
           document.querySelector(".contentBox .page"),
           document.querySelector(".contentBox .page"),
-          "2023年3月经济运行分析报告"
+          this.reportTitle
         );
         );
-        this.BASE.closeLoading();
+        BASE.closeLoading();
       }, 50);
       }, 50);
     },
     },
 
 
     // 导出 WORD
     // 导出 WORD
     exportWord() {
     exportWord() {
       let wordData = {};
       let wordData = {};
+      let title = this.reportTitle;
       for (let key in this.sourceData) {
       for (let key in this.sourceData) {
         if (key === "标题") {
         if (key === "标题") {
           wordData[key] = this.sourceData[key][0];
           wordData[key] = this.sourceData[key][0];
@@ -334,7 +336,7 @@ export default {
               "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
               "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
           });
           });
           // 将目标文件对象保存为目标类型的文件,并命名
           // 将目标文件对象保存为目标类型的文件,并命名
-          saveAs(out, "2023年3月经济运行分析报告.docx");
+          saveAs(out, `${title}.docx`);
         }
         }
       );
       );
     },
     },

+ 0 - 43
src/views/layout/economicsOperation/analyse/stationAnalyse/index.vue

@@ -101,7 +101,6 @@
           height="48vh"
           height="48vh"
           ref="fitting_table"
           ref="fitting_table"
           style="width: 100%"
           style="width: 100%"
-          @row-click="handleRowClick"
         >
         >
           <el-table-column
           <el-table-column
             v-for="(item, index) in tableHeader"
             v-for="(item, index) in tableHeader"
@@ -129,32 +128,6 @@
         />
         />
       </div>
       </div>
     </div>
     </div>
-    <el-dialog
-      class="dialogs"
-      width="85%"
-      top="8vh"
-      v-model="dialogCurveVisible"
-      :show-close="true"
-    >
-      <template #title>
-        <div class="dialog-title">
-          <img
-            class="dialog-title-img"
-            src="@/assets/img/images/dialog-title.png"
-          />
-          <div class="title">{{ dialogTitle }}</div>
-          <!--                    <i class="el-icon-full-screen"  @click="c"></i>-->
-        </div>
-      </template>
-      <div class="dialog-body" style="height: 65vh; width: 100%">
-        <EconomyReport ref="economyReport" />
-        <img
-          class="dialog-img"
-          style="bottom: 65px"
-          src="@/assets/img/images/dialog.png"
-        />
-      </div>
-    </el-dialog>
   </div>
   </div>
 </template>
 </template>
 
 
@@ -164,7 +137,6 @@ import { GetOrganization, GetStationByCompany } from "@/api/headerNav.js";
 import utils from "@/utils/downXlsx";
 import utils from "@/utils/downXlsx";
 import dayjs from "dayjs";
 import dayjs from "dayjs";
 import doubleYAxisLineChart from "@/components/chart/line/double-yAxis-line-chart.vue";
 import doubleYAxisLineChart from "@/components/chart/line/double-yAxis-line-chart.vue";
-import EconomyReport from "../economyReport/index.vue";
 export default {
 export default {
   name: "stationAnalyse", //场站性能分析
   name: "stationAnalyse", //场站性能分析
   data() {
   data() {
@@ -189,13 +161,10 @@ export default {
         { id: -1, name: "风电" },
         { id: -1, name: "风电" },
         { id: -2, name: "光伏" },
         { id: -2, name: "光伏" },
       ],
       ],
-      dialogCurveVisible: false,
-      dialogTitle: "分析报告",
     };
     };
   },
   },
   components: {
   components: {
     doubleYAxisLineChart,
     doubleYAxisLineChart,
-    EconomyReport,
   },
   },
   created() {
   created() {
     this.starTime = dayjs().startOf("day").format("YYYY-MM-DD HH:mm:ss");
     this.starTime = dayjs().startOf("day").format("YYYY-MM-DD HH:mm:ss");
@@ -275,18 +244,6 @@ export default {
         },
         },
       ];
       ];
     },
     },
-    handleRowClick(row) {
-      this.dialogCurveVisible = true;
-      this.$nextTick(() => {
-        this.$refs.economyReport.currentYear = dayjs(row.time).format("YYYY");
-        this.$refs.economyReport.currentMonth = dayjs(row.time).format("MM");
-        this.$refs.economyReport.currentWpid = this.stationVal;
-        this.$refs.economyReport.currentCompany = this.companyOptions.find(
-          (item) => item.id == this.companyVal
-        ).aname;
-        this.$refs.economyReport.init(row);
-      });
-    },
     downXlsxFn() {
     downXlsxFn() {
       let header = [];
       let header = [];
       this.tableHeader.forEach((it) => {
       this.tableHeader.forEach((it) => {

+ 0 - 40
src/views/layout/economicsOperation/analyse/stationAnalyse/indexFd.vue

@@ -101,7 +101,6 @@
           height="48vh"
           height="48vh"
           ref="fitting_table"
           ref="fitting_table"
           style="width: 100%"
           style="width: 100%"
-          @row-click="handleRowClick"
         >
         >
           <el-table-column
           <el-table-column
             v-for="(item, index) in tableHeader"
             v-for="(item, index) in tableHeader"
@@ -129,32 +128,6 @@
         />
         />
       </div>
       </div>
     </div>
     </div>
-    <el-dialog
-      class="dialogs"
-      width="85%"
-      top="8vh"
-      v-model="dialogCurveVisible"
-      :show-close="true"
-    >
-      <template #title>
-        <div class="dialog-title">
-          <img
-            class="dialog-title-img"
-            src="@/assets/img/images/dialog-title.png"
-          />
-          <div class="title">{{ dialogTitle }}</div>
-          <!--                    <i class="el-icon-full-screen"  @click="c"></i>-->
-        </div>
-      </template>
-      <div class="dialog-body" style="height: 65vh; width: 100%">
-        <EconomyReport ref="economyReport" />
-        <img
-          class="dialog-img"
-          style="bottom: 65px"
-          src="@/assets/img/images/dialog.png"
-        />
-      </div>
-    </el-dialog>
   </div>
   </div>
 </template>
 </template>
 
 
@@ -164,7 +137,6 @@ import { GetOrganization, GetStationByCompany } from "@/api/headerNav.js";
 import utils from "@/utils/downXlsx";
 import utils from "@/utils/downXlsx";
 import dayjs from "dayjs";
 import dayjs from "dayjs";
 import doubleYAxisLineChart from "@/components/chart/line/double-yAxis-line-chart.vue";
 import doubleYAxisLineChart from "@/components/chart/line/double-yAxis-line-chart.vue";
-import EconomyReport from "../economyReport/index.vue";
 export default {
 export default {
   name: "stationAnalyse", //场站性能分析
   name: "stationAnalyse", //场站性能分析
   data() {
   data() {
@@ -189,13 +161,10 @@ export default {
         { id: -1, name: "风电" },
         { id: -1, name: "风电" },
         { id: -2, name: "光伏" },
         { id: -2, name: "光伏" },
       ],
       ],
-      dialogCurveVisible: false,
-      dialogTitle: "分析报告",
     };
     };
   },
   },
   components: {
   components: {
     doubleYAxisLineChart,
     doubleYAxisLineChart,
-    EconomyReport,
   },
   },
   created() {
   created() {
     this.starTime = dayjs().startOf("day").format("YYYY-MM-DD HH:mm:ss");
     this.starTime = dayjs().startOf("day").format("YYYY-MM-DD HH:mm:ss");
@@ -275,15 +244,6 @@ export default {
         },
         },
       ];
       ];
     },
     },
-    handleRowClick(row) {
-      this.dialogCurveVisible = true;
-      this.$nextTick(() => {
-        this.$refs.economyReport.currentYear = dayjs(row.time).format("YYYY");
-        this.$refs.economyReport.currentMonth = dayjs(row.time).format("MM");
-        this.$refs.economyReport.currentWpid = this.stationVal;
-        this.$refs.economyReport.init();
-      });
-    },
     downXlsxFn() {
     downXlsxFn() {
       let header = [];
       let header = [];
       this.tableHeader.forEach((it) => {
       this.tableHeader.forEach((it) => {

+ 611 - 0
src/views/layout/economicsOperation/analyse/stationMonthAnalyse/index.vue

@@ -0,0 +1,611 @@
+<template>
+  <div class="powerLinefitting">
+    <div class="powerLinefitting_topAll">
+      <div class="powerLinefitting_top">
+        <div class="form-wrapper">
+          <div class="select-wrapper">
+            <el-select
+              size="mini"
+              v-model="tabEvent"
+              placeholder="请选择"
+              @change="changeBtn"
+            >
+              <el-option
+                v-for="item in tabOptions"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+            <el-select
+              size="mini"
+              v-model="companyVal"
+              placeholder="请选择"
+              @change="changeCompan"
+            >
+              <el-option
+                v-for="item in companyOptions"
+                :key="item.id"
+                :label="item.aname"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <div class="date-wrapper">
+            <div class="date-item-wrapper">
+              开始月份
+              <div class="date-item-date">
+                <el-date-picker
+                  size="mini"
+                  v-model="starTime"
+                  type="date"
+                  value-format="YYYY-MM-DD"
+                  placeholder="选择月份"
+                >
+                </el-date-picker>
+              </div>
+            </div>
+            <div class="date-item-wrapper">
+              结束月份
+              <div class="date-item-date">
+                <el-date-picker
+                  size="mini"
+                  v-model="endTime"
+                  type="date"
+                  value-format="YYYY-MM-DD"
+                  placeholder="选择月份"
+                >
+                </el-date-picker>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="but">
+          <el-button round size="mini" class="buttons" @click="getTableData"
+            >查询</el-button
+          >
+          <el-button round size="mini" class="buttons" @click="downXlsxFn"
+            >导出</el-button
+          >
+        </div>
+      </div>
+    </div>
+    <div style="background: rgba(0, 0, 0, 0.4)">
+      <div class="powerLinefitting_title clearfix">
+        <div class="leftContent floatLeft"><span>场站月度分析</span></div>
+        <div class="rightContent floatRight"></div>
+      </div>
+
+      <div class="powerLinefitting_Table">
+        <el-table
+          :data="stationAnalyseData"
+          stripe
+          size="mini"
+          height="80vh"
+          ref="fitting_table"
+          style="width: 100%"
+          @row-click="handleRowClick"
+        >
+          <el-table-column
+            v-for="(item, index) in tableHeader"
+            :key="index"
+            sortable
+            :prop="item.code"
+            :label="item.title"
+            align="center"
+          >
+            <el-table-column
+              v-for="(subItem, subIndex) in item.children"
+              :key="subIndex"
+              sortable
+              :prop="subItem.code"
+              :label="subItem.title"
+              align="center"
+            >
+              <template v-if="subItem.title != '场站'" #header="scope">
+                <div>
+                  {{
+                    scope.column.label.slice(0, scope.column.label.indexOf("("))
+                  }}
+                </div>
+                <div>
+                  {{
+                    scope.column.label.slice(scope.column.label.indexOf("("))
+                  }}
+                </div>
+              </template>
+            </el-table-column>
+          </el-table-column>
+        </el-table>
+      </div>
+    </div>
+    <!-- <div class="powerLinefitting_Echarts">
+      <div class="chart-name">
+        <div class="point left bottom"></div>
+        <div class="point right bottom"></div>
+        <span>性能分析曲线</span>
+      </div>
+      <div class="fittingEchartSty">
+        <doubleYAxisLineChart
+          :tabEvent="tabEvent"
+          :unit="'(W/m²)'"
+          :list="stationLineData"
+        />
+      </div>
+    </div> -->
+    <el-dialog
+      class="dialogs"
+      width="85%"
+      top="8vh"
+      v-model="dialogCurveVisible"
+      :show-close="true"
+    >
+      <template #title>
+        <div class="dialog-title">
+          <img
+            class="dialog-title-img"
+            src="@/assets/img/images/dialog-title.png"
+          />
+          <div class="title">{{ dialogTitle }}</div>
+          <!--                    <i class="el-icon-full-screen"  @click="c"></i>-->
+        </div>
+      </template>
+      <div class="dialog-body" style="height: 65vh; width: 100%">
+        <EconomyReport ref="economyReport" />
+        <img
+          class="dialog-img"
+          style="bottom: 65px"
+          src="@/assets/img/images/dialog.png"
+        />
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getApiStationMonthAnalyse } from "@/api/monthlyPerformanceAnalysis";
+import { GetOrganization } from "@/api/headerNav.js";
+import utils from "@/utils/downXlsx";
+import dayjs from "dayjs";
+import EconomyReport from "../economyReport/index.vue";
+export default {
+  name: "stationMonthAnalyse", //场站月度分析
+  data() {
+    return {
+      companyVal: "",
+      companyOptions: [],
+      stationVal: "",
+      stationOptions: [],
+      starTime: "",
+      endTime: "",
+      stationAnalyseData: [],
+      stationLineData: [],
+      tableHeader: [
+        {
+          title: "",
+          children: [{ title: "场站", code: "windpowerstationAname" }],
+        },
+        {
+          title: "太阳能资源指标",
+          children: [
+            { title: "年平均风速(m/s)", code: "yearAverageWindSpeed" },
+            { title: "平均温度(℃)", code: "averageTemperature" },
+            { title: "相对湿度(%)", code: "relativeHumidity" },
+            {
+              title: "水平面总辐射量(kWh/m²)",
+              code: "horizontalTotalRadiation",
+            },
+            {
+              title: "倾斜面总辐射量(kWh/m²)",
+              code: "inclinedTotalRadiation",
+            },
+            { title: "日照时数(h)", code: "sunshineDuration" },
+          ],
+        },
+        {
+          title: "电量指标",
+
+          children: [
+            { title: "发电量(kWh)", code: "powerGeneration" },
+            { title: "上网电量(kWh)", code: "gridPower" },
+            { title: "购网电量(kWh)", code: "purchasePower" },
+            { title: "逆变器输入电量(kWh)", code: "inverterInputPower" },
+            { title: "逆变器输出电量(kWh)", code: "inverterOutputPower" },
+            { title: "等效利用小时数(h)", code: "equivalentHours" },
+            { title: "弃光电量(kWh)", code: "abandonedLightPower" },
+            { title: "弃光率(%)", code: "abandonedLightRate" },
+          ],
+        },
+        {
+          title: "能耗指标",
+
+          children: [
+            { title: "厂用电量(kWh)", code: "plantPowerConsumption" },
+            {
+              title: "综合厂用电量(kWh)",
+              code: "comprehensivePlantPowerConsumption",
+            },
+            { title: "厂用电率(%)", code: "plantPowerRate" },
+            {
+              title: "综合厂用电率(%)",
+              code: "comprehensivePlantPowerRate",
+            },
+            { title: "厂损率(%)", code: "plantLossRate" },
+            { title: "逆变器损耗(kWh)", code: "inverterLoss" },
+            {
+              title: "集电线路及箱变损耗(kWh)",
+              code: "collectorLineAndBoxTransformerLoss",
+            },
+            { title: "升压站损耗(kWh)", code: "boosterStationLoss" },
+          ],
+        },
+        {
+          title: "设备运行水平指标",
+
+          children: [
+            {
+              title: "光伏电站整体效率",
+              code: "solarPowerStationEfficiency",
+            },
+            { title: "最大出力(kW)", code: "maxOutput" },
+            {
+              title: "逆变器转换效率(%)",
+              code: "inverterConversionEfficiency",
+            },
+            { title: "光伏方阵效率(%)", code: "solarArrayEfficiency" },
+          ],
+        },
+        {
+          title: "设备可靠性指标",
+
+          children: [
+            { title: "发电时长(h)", code: "powerGenerationDuration" },
+            { title: "停机时长(h)", code: "downtimeDuration" },
+            { title: "中断时长(h)", code: "interruptionDuration" },
+          ],
+        },
+      ],
+      tabEvent: -2,
+      tabOptions: [
+        { id: -1, name: "风电" },
+        { id: -2, name: "光伏" },
+      ],
+      dialogCurveVisible: false,
+      dialogTitle: "场站月度分析报告",
+    };
+  },
+  components: {
+    EconomyReport,
+  },
+  created() {
+    this.starTime = dayjs().startOf("month").format("YYYY-MM-DD");
+    this.endTime = dayjs().format("YYYY-MM-DD");
+    this.getCompanyData();
+  },
+  methods: {
+    //切换风电光伏
+    changeBtn() {
+      this.$router.push({
+        // path: "/economicsOperation/analyse/stationAnalyseFd",
+      });
+    },
+    // 获取公司列表
+    async getCompanyData() {
+      this.companyOptions = [];
+      const datas = await GetOrganization({ type: this.tabEvent });
+      this.companyOptions = datas.data;
+      this.companyVal = datas.data[0]?.id;
+      this.getTableData();
+    },
+    //切换公司
+    changeCompan(val) {
+      this.companyVal = val;
+      this.getStationData();
+    },
+    async getTableData() {
+      let params = {
+        type: this.tabEvent,
+        companys: this.companyVal,
+        beginDate: this.starTime,
+        endDate: this.endTime,
+      };
+      const { data } = await getApiStationMonthAnalyse(params);
+      this.stationAnalyseData = data;
+    },
+    handleRowClick(row) {
+      this.dialogCurveVisible = true;
+      this.$nextTick(() => {
+        this.$refs.economyReport.currentYear = dayjs(row.time).format("YYYY");
+        this.$refs.economyReport.currentMonth = dayjs(row.time).format("MM");
+        this.$refs.economyReport.currentWpid = row.windpowerstationId;
+        this.$refs.economyReport.currentCompany = this.companyOptions.find(
+          (item) => item.id == this.companyVal
+        ).aname;
+        this.$refs.economyReport.init(row);
+      });
+    },
+    downXlsxFn() {
+      let header = [];
+      this.tableHeader.forEach((it) => {
+        header.push(it.title);
+      });
+      utils.exportExcel(
+        this.$refs["fitting_table"].$el,
+        header,
+        "场站月度分析"
+      );
+    },
+  },
+};
+</script>
+
+<style lang="less">
+.powerLinefitting {
+  padding: 0 23px;
+  .powerLinefitting_topAll {
+    display: flex;
+    justify-content: space-between;
+    .powerLinefitting_top {
+      display: flex;
+      flex-direction: row;
+      align-items: center;
+      margin-top: 10px;
+      margin-bottom: 10px;
+      .form-wrapper {
+        display: flex;
+        align-items: center;
+        .select-wrapper {
+          display: flex;
+          align-items: center;
+          .el-select {
+            width: 155px;
+            .el-input .el-input__inner {
+              width: 150px;
+            }
+          }
+        }
+        .date-wrapper {
+          display: flex;
+          align-items: center;
+          font-size: 14px;
+          font-family: Microsoft YaHei;
+          font-weight: 400;
+          color: #b3b3b3;
+          margin-left: 10px;
+          .date-item-wrapper {
+            display: flex;
+            align-items: center;
+            margin-right: 15px;
+            .date-item-date {
+              margin-left: 10px;
+              .el-input .el-input__inner {
+                font-size: 13px;
+                color: #b3b3b3;
+              }
+            }
+          }
+        }
+      }
+      .station {
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        font-size: 14px;
+        font-family: Microsoft YaHei;
+        font-weight: 400;
+        color: #b3b3b3;
+        margin-right: 25px;
+      }
+      .search-input {
+        margin-left: 10px;
+        .el-input__inner {
+          width: 175px;
+        }
+        .el-input__suffix {
+          right: -50px;
+        }
+      }
+
+      .but {
+        display: flex;
+        flex-direction: row;
+        align-content: center;
+        .buttons:nth-child(1) {
+          background: rgba(0, 70, 199, 0.6);
+          border: 1px solid #1f51ae;
+          border-radius: 13px;
+          color: #fff;
+          &:hover {
+            background: rgba(14, 90, 229, 0.9);
+            border-radius: 13px;
+            color: #fff;
+          }
+        }
+        .buttons:nth-child(2) {
+          background: rgba(67, 81, 107, 0.3);
+          border: 1px solid #3b4c6c;
+          border-radius: 13px;
+          font-size: 14px;
+          color: #b3b3b3;
+        }
+      }
+    }
+    .selections {
+      display: flex;
+      margin-top: 10px;
+      position: relative;
+      right: 120px;
+      .selections_btn {
+        flex: 0 0 55px;
+        text-align: center;
+        height: 33px;
+        line-height: 33px;
+        margin-right: 8px;
+        color: #fff;
+        font-size: 1.296vh;
+        background: fade(#606769, 20);
+        border: 1px solid fade(#606769, 20);
+        border-radius: 20px;
+        &:hover,
+        &.active {
+          background: fade(#0046c7, 80);
+          border: 1px solid #0046c7;
+          color: #b9b9b9;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .powerLinefitting_title {
+    padding-left: 10px;
+    .leftContent {
+      width: 242px;
+      height: 41px;
+      line-height: 41px;
+      background: url("../../../../../assets/imgs/title_left_bg.png");
+      span {
+        font-size: 16px;
+        font-family: Microsoft YaHei;
+        font-weight: 400;
+        color: #ffffff;
+        margin-left: 25px;
+      }
+    }
+    .floatLeft {
+      float: left;
+    }
+    .floatRight {
+      float: right;
+    }
+    .rightContent {
+      width: 212px;
+      height: 28px;
+      margin-top: 13px;
+      background: url("../../../../../assets/imgs/title_right_bg.png");
+    }
+  }
+  .clearfix::after {
+    content: "";
+    clear: both;
+    height: 0;
+    line-height: 0;
+    visibility: hidden;
+    display: block;
+  }
+  .clearfix {
+    zoom: 1;
+  }
+
+  .powerLinefitting_Table {
+    margin: 0 5px 5px 5px;
+    padding-bottom: 10px;
+    .el-table--mini {
+      margin: 5px;
+      .el-table__header-wrapper {
+        tr {
+          background: rgba(83, 89, 104, 0.3) !important;
+          //   th {
+          //     vertical-align: top !important;
+          //   }
+          .cell {
+            color: #b3b3b3;
+            font-family: MicrosoftYaHei;
+            font-size: 14px;
+          }
+        }
+      }
+      .el-table__body-wrapper {
+        tr {
+          &:nth-child(2n) {
+            background: rgba(83, 89, 104, 0.05) !important;
+          }
+          .cell {
+            color: #d8d8d9;
+            font-family: ArialMT;
+            font-size: 13px;
+            height: 25px !important;
+          }
+        }
+      }
+    }
+  }
+  .powerLinefitting_Echarts {
+    margin-top: 10px;
+    width: 100%;
+    background: rgba(0, 0, 0, 0.45);
+    position: relative;
+    height: 39px;
+    // border-bottom: 1px solid rgba(153, 153, 153, 0.5);
+    font-size: 16px;
+    font-family: Microsoft YaHei;
+    font-weight: 400;
+    color: #ffffff;
+    .chart-name {
+      display: flex;
+      align-items: center;
+      padding-left: 20px;
+      position: relative;
+      height: 39px;
+      width: 98%;
+      margin-left: 1%;
+      border-bottom: 1px solid rgba(153, 153, 153, 0.5);
+      font-size: 16px;
+      font-family: Microsoft YaHei;
+      font-weight: 400;
+      color: #ffffff;
+      .point {
+        width: 6px;
+        height: 1px;
+        background-color: #ffffff;
+        position: absolute;
+
+        &.left {
+          left: 0;
+        }
+
+        &.right {
+          right: 0;
+        }
+
+        &.top {
+          top: -1px;
+        }
+
+        &.bottom {
+          bottom: -1px;
+        }
+      }
+    }
+    .fittingEchartSty {
+      width: 100%;
+      height: 280px;
+      background: rgba(0, 0, 0, 0.45);
+    }
+  }
+  .el-overlay {
+    .el-overlay-dialog {
+      overflow-y: hidden !important;
+      .powerLinefittinghistoryModel {
+        margin-top: 0 !important;
+        .el-dialog__body {
+          padding-top: 10px;
+        }
+      }
+      .contrastModal {
+        .el-dialog__body {
+          padding-top: 10px;
+        }
+      }
+    }
+  }
+
+  .el-picker__popper .el-date-range-picker__header .el-picker-panel__icon-btn {
+    color: #fff;
+  }
+  .el-picker__popper .el-date-table .in-range div {
+    background: #43516b;
+  }
+}
+</style>

+ 25 - 0
src/views/layout/economicsOperation/index.vue

@@ -30,6 +30,16 @@ export default {
           path: "/economicsOperation/homePageGf",
           path: "/economicsOperation/homePageGf",
         },
         },
         {
         {
+          titleName: "清洗录入",
+          icon: "icon-dimension-new",
+          path: "/economicsOperation/insert/clean",
+        },
+        {
+          titleName: "故障录入",
+          icon: "icon-dimension-new",
+          path: "/economicsOperation/insert/fault",
+        },
+        {
           titleName: "公司分析",
           titleName: "公司分析",
           icon: "icon-power-curve",
           icon: "icon-power-curve",
           path: "/economicsOperation/comphomepageGf",
           path: "/economicsOperation/comphomepageGf",
@@ -96,6 +106,11 @@ export default {
               icon: "",
               icon: "",
               path: "/economicsOperation/benchmarkingManagement/valueBenchmarking",
               path: "/economicsOperation/benchmarkingManagement/valueBenchmarking",
             },
             },
+            {
+              titleName: "品牌对标",
+              icon: "",
+              path: "/economicsOperation/benchmarkingManagement/brandBenchmarking",
+            },
           ],
           ],
         },
         },
         {
         {
@@ -141,6 +156,11 @@ export default {
               path: "/economicsOperation/analyse/stationAnalyse",
               path: "/economicsOperation/analyse/stationAnalyse",
             },
             },
             {
             {
+              titleName: "场站月度分析",
+              icon: "",
+              path: "/economicsOperation/analyse/stationMonthAnalyse",
+            },
+            {
               titleName: "逆变器分析",
               titleName: "逆变器分析",
               icon: "",
               icon: "",
               path: "/economicsOperation/analyse/inverterAnalyse",
               path: "/economicsOperation/analyse/inverterAnalyse",
@@ -214,6 +234,11 @@ export default {
               icon: "",
               icon: "",
               path: "/economicsOperation/thematicAnalysis/generation",
               path: "/economicsOperation/thematicAnalysis/generation",
             },
             },
+            {
+              titleName: "利用小时分析",
+              icon: "",
+              path: "/economicsOperation/thematicAnalysis/utillHours",
+            },
             // {
             // {
             //   titleName: "维护损失率",
             //   titleName: "维护损失率",
             //   icon: '',
             //   icon: '',

+ 272 - 0
src/views/layout/economicsOperation/insert/cleanInsert/components/operation.vue

@@ -0,0 +1,272 @@
+<template>
+  <el-dialog
+    class="dialogs"
+    width="45%"
+    top="10vh"
+    v-model="dialogCurveVisible"
+    :show-close="true"
+    @close="close"
+  >
+    <template #title>
+      <div class="dialog-title">
+        <img
+          class="dialog-title-img"
+          src="@/assets/img/images/dialog-title.png"
+        />
+        <div class="title">{{ dialogTitle }}</div>
+      </div>
+    </template>
+    <div class="dialog-body" style="height: 45vh; width: 100%">
+      <div class="body-wrapper">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+          <el-form-item label="场站" prop="windpowerstationId">
+            <el-select
+              v-model="form.windpowerstationId"
+              style="width: 200px"
+              placeholder="请选择"
+              clearable
+              size="mini"
+              :disabled="!isAdd ? true : false"
+              @change="stationChanged"
+            >
+              <el-option
+                v-for="item in stationOptions"
+                :key="item.id"
+                :label="item.aname"
+                :value="item.id"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="阵区" prop="squareId">
+            <el-select
+              v-model="form.squareId"
+              style="width: 200px"
+              placeholder="请选择"
+              clearable
+              size="mini"
+              :disabled="!isAdd ? true : false"
+            >
+              <el-option
+                v-for="item in squareOption"
+                :key="item.squareId"
+                :label="item.squareId"
+                :value="item.squareId"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="开始时间" prop="begindate">
+            <el-date-picker
+              v-model="form.begindate"
+              style="width: 200px"
+              type="datetime"
+              size="mini"
+              value-format="YYYY-MM-DD HH:mm:ss"
+              placeholder="选择日期时间"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item label="计划结束时间" prop="planEnddate">
+            <el-date-picker
+              v-model="form.planEnddate"
+              style="width: 200px"
+              type="datetime"
+              size="mini"
+              value-format="YYYY-MM-DD HH:mm:ss"
+              placeholder="选择日期时间"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item label="实际结束时间" prop="actualEnddate">
+            <el-date-picker
+              v-model="form.actualEnddate"
+              style="width: 200px"
+              type="datetime"
+              size="mini"
+              value-format="YYYY-MM-DD HH:mm:ss"
+              placeholder="选择日期时间"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item label="工具和材料" prop="toolMaterials">
+            <el-input
+              v-model="form.toolMaterials"
+              style="width: 200px"
+              class="inputs"
+              size="mini"
+              placeholder="请输入"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="清洗步骤" prop="cleaningSteps">
+            <el-input
+              v-model="form.cleaningSteps"
+              style="width: 200px"
+              class="inputs"
+              size="mini"
+              placeholder="请输入"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="备注" prop="spare1">
+            <el-input
+              v-model="form.spare1"
+              style="width: 200px"
+              class="inputs"
+              size="mini"
+              placeholder="请输入"
+            ></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <img
+        class="dialog-img"
+        style="bottom: 65px"
+        src="@/assets/img/images/dialog.png"
+      />
+    </div>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button type="info" size="mini" @click="close">取 消</el-button>
+        <el-button size="mini" type="primary" @click="handleSave"
+          >确 定</el-button
+        >
+      </div>
+    </template>
+  </el-dialog>
+</template>
+<script>
+import dayjs from "dayjs";
+import { CleanOperation } from "@/api/insert.js";
+import { GetModelListByWp } from "@/api/headerNav.js";
+
+export default {
+  name: "operation",
+  components: {},
+  props: {
+    stationOptions: {
+      type: Array,
+      required: true,
+    },
+  },
+  data() {
+    return {
+      dialogCurveVisible: false,
+      dialogTitle: "新增",
+      form: {
+        windpowerstationId: "",
+        windpowerstationName: "",
+        squareId: "",
+        squareName: "",
+        begindate: "",
+        planEnddate: "",
+        actualEnddate: "",
+        toolMaterials: "",
+        cleaningSteps: "",
+        spare1: "",
+      },
+      squareOption: [],
+      rules: {
+        windpowerstationId: [
+          { required: true, trigger: "blur", message: "请选择" },
+        ],
+        squareId: [{ required: true, trigger: "blur", message: "请选择" }],
+        begindate: [{ required: true, trigger: "blur", message: "请选择" }],
+        planEnddate: [{ required: true, trigger: "blur", message: "请选择" }],
+        actualEnddate: [{ required: true, trigger: "blur", message: "请选择" }],
+        toolMaterials: [{ required: true, trigger: "blur", message: "请选择" }],
+        cleaningSteps: [{ required: true, trigger: "blur", message: "请选择" }],
+      },
+      isAdd: true,
+    };
+  },
+  created() {},
+  methods: {
+    openDialog(row) {
+      if (!row) {
+        this.dialogTitle = "新增";
+        this.isAdd = true;
+      } else {
+        this.dialogTitle = "修改";
+        this.isAdd = false;
+        this.form = Object.assign({}, row);
+        this.form.id = row.id;
+      }
+      this.dialogCurveVisible = true;
+    },
+    stationChanged(val) {
+      this.getSquare(val);
+    },
+    getSquare(station) {
+      GetModelListByWp(station).then(({ data }) => {
+        this.squareOption = data;
+      });
+    },
+    handleSave() {
+      this.$refs["form"].validate(async (valid) => {
+        if (valid) {
+          if (this.isAdd) {
+            let wpinfo = this.stationOptions.find(
+              (item) => item.id == this.form.windpowerstationId
+            );
+            let sqinfo = this.squareOption.find(
+              (item) => item.squareId == this.form.squareId
+            );
+            this.form.windpowerstationName = wpinfo.aname;
+            this.form.squareName = sqinfo.aname;
+          }
+          CleanOperation(this.form).then((res) => {
+            if (res.code == 200) {
+              this.$message({
+                type: "success",
+                message: this.isAdd ? "添加成功!" : "修改成功!",
+              });
+              this.$emit("handleSuccess");
+              this.dialogCurveVisible = false;
+            }
+          });
+        } else {
+          return false;
+        }
+      });
+    },
+    close() {
+      this.$refs["form"].resetFields();
+      this.form = this.$options.data().form;
+      this.dialogCurveVisible = false;
+      this.$emit("handleSuccess");
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+.el-form ::v-deep {
+  display: flex;
+  flex-wrap: wrap;
+  .el-form-item {
+    width: 50%;
+    .el-input .el-input__inner {
+      font-size: 13px;
+      color: #b3b3b3;
+    }
+  }
+}
+.dialog-footer {
+  .el-button--primary {
+    background: rgba(0, 70, 199, 0.6);
+    border: 1px solid #1f51ae;
+    border-radius: 13px;
+    color: #fff;
+    &:hover {
+      background: rgba(14, 90, 229, 0.9);
+      border-radius: 13px;
+      color: #fff;
+    }
+  }
+  .el-button--info {
+    background: rgba(67, 81, 107, 0.3);
+    border: 1px solid #3b4c6c;
+    border-radius: 13px;
+    color: #b3b3b3;
+    &:hover {
+      background: rgba(67, 81, 107, 0.9);
+      border-radius: 13px;
+      color: #b3b3b3;
+    }
+  }
+}
+</style>

+ 641 - 0
src/views/layout/economicsOperation/insert/cleanInsert/index.vue

@@ -0,0 +1,641 @@
+<template>
+  <div class="powerLinefitting">
+    <div class="powerLinefitting_topAll">
+      <div class="powerLinefitting_top">
+        <div class="form-wrapper">
+          <div class="select-wrapper">
+            <el-select
+              size="mini"
+              v-model="tabEvent"
+              placeholder="请选择"
+              @change="changeBtn"
+            >
+              <el-option
+                v-for="item in tabOptions"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+            <el-select
+              size="mini"
+              v-model="companyVal"
+              placeholder="请选择"
+              @change="changeCompan"
+            >
+              <el-option
+                v-for="item in companyOptions"
+                :key="item.id"
+                :label="item.aname"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+            <el-select
+              size="mini"
+              v-model="stationVal"
+              placeholder="请选择"
+              @change="changeStation"
+            >
+              <el-option
+                v-for="item in stationOptions"
+                :key="item.id"
+                :label="item.aname"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <div class="date-wrapper">
+            <div class="date-item-wrapper">
+              开始时间
+              <div class="date-item-date">
+                <el-date-picker
+                  size="mini"
+                  v-model="starTime"
+                  type="datetime"
+                  value-format="YYYY-MM-DD HH:mm:ss"
+                  placeholder="选择时间"
+                >
+                </el-date-picker>
+              </div>
+            </div>
+            <div class="date-item-wrapper">
+              结束时间
+              <div class="date-item-date">
+                <el-date-picker
+                  size="mini"
+                  v-model="endTime"
+                  type="datetime"
+                  value-format="YYYY-MM-DD HH:mm:ss"
+                  placeholder="选择时间"
+                >
+                </el-date-picker>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="but">
+          <el-button round size="mini" class="buttons" @click="getTableData"
+            >查询</el-button
+          >
+          <el-button round size="mini" class="buttons" @click="handleAdd"
+            >新增</el-button
+          >
+          <el-button round size="mini" class="buttons" @click="downXlsxFn"
+            >导出</el-button
+          >
+        </div>
+      </div>
+    </div>
+    <div style="background: rgba(0, 0, 0, 0.4)">
+      <div class="powerLinefitting_title clearfix">
+        <div class="leftContent floatLeft"><span>清洗录入</span></div>
+        <div class="rightContent floatRight"></div>
+      </div>
+
+      <div class="powerLinefitting_Table">
+        <el-table
+          :data="stationAnalyseData"
+          stripe
+          size="mini"
+          height="80vh"
+          ref="fitting_table"
+          style="width: 100%"
+          @row-click="handleRowClick"
+        >
+          <el-table-column
+            v-for="(item, index) in tableHeader"
+            :key="index"
+            sortable
+            :prop="item.code"
+            :label="item.title"
+            align="center"
+          >
+            <template #default="scope" v-if="item.title === '操作'">
+              <span class="operationBtn" @click="handleEdit(scope.row)"
+                >编辑</span
+              >
+              <span class="operationBtn" @click="handleDelete(scope.row)"
+                >删除</span
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+          <el-pagination
+            @current-change="handleCurrentChange"
+            :current-page="page.currentPage"
+            :page-size="page.pagesize"
+            layout="total, prev, pager, next, jumper"
+            :total="page.total"
+          >
+          </el-pagination>
+        </div>
+      </div>
+    </div>
+    <!-- <div class="powerLinefitting_Echarts">
+      <div class="chart-name">
+        <div class="point left bottom"></div>
+        <div class="point right bottom"></div>
+        <span>性能分析曲线</span>
+      </div>
+      <div class="fittingEchartSty">
+        <doubleYAxisLineChart
+          :tabEvent="tabEvent"
+          :unit="'(W/m²)'"
+          :list="stationLineData"
+        />
+      </div>
+    </div> -->
+    <operation
+      ref="operation"
+      :stationOptions="stationOptions"
+      @handleSuccess="getTableData"
+    />
+  </div>
+</template>
+
+<script>
+import { GetCleanList, CleanDelete } from "@/api/insert.js";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { GetOrganization, GetStationByCompany } from "@/api/headerNav.js";
+import utils from "@/utils/downXlsx";
+import dayjs from "dayjs";
+import operation from "./components/operation.vue";
+// import EconomyReport from "../economyReport/index.vue";
+export default {
+  name: "cleanInsert", //清洗录入
+  data() {
+    return {
+      companyVal: "",
+      companyOptions: [],
+      stationVal: "",
+      stationOptions: [],
+      starTime: "",
+      endTime: "",
+      stationAnalyseData: [],
+      stationLineData: [],
+      tableHeader: [
+        { title: "场站", code: "windpowerstationName" },
+        { title: "阵区", code: "squareName" },
+        { title: "开始时间", code: "begindate" },
+        { title: "计划结束时间", code: "planEnddate" },
+        { title: "实际结束时间", code: "actualEnddate" },
+        { title: "工具和材料", code: "toolMaterials" },
+        { title: "清洗步骤", code: "cleaningSteps" },
+        { title: "备注", code: "spare1" },
+        { title: "操作" },
+      ],
+      tabEvent: -2,
+      tabOptions: [{ id: -2, name: "光伏" }],
+      page: {
+        pagesize: 20,
+        currentPage: 1,
+        total: 0,
+      },
+    };
+  },
+  components: {
+    operation,
+  },
+  created() {
+    this.starTime = dayjs().startOf("day").format("YYYY-MM-DD HH:mm:ss");
+    this.endTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
+    this.getCompanyData();
+  },
+  methods: {
+    //切换风电光伏
+    changeBtn() {},
+    // 获取公司列表
+    async getCompanyData() {
+      this.companyOptions = [];
+      const datas = await GetOrganization({ type: this.tabEvent });
+      this.companyOptions = datas.data;
+      this.companyVal = datas.data[0]?.id;
+      this.getStationData(this.companyVal);
+    },
+    // 获取场站列表
+    async getStationData() {
+      this.stationOptions = [];
+      let params = {
+        type: this.tabEvent,
+        companyids: this.companyVal,
+      };
+      const datas = await GetStationByCompany(params);
+      this.stationOptions = datas.data;
+      this.stationVal = datas.data[0].id;
+      this.getTableData();
+    },
+    //切换公司
+    changeCompan(val) {
+      this.companyVal = val;
+      this.getStationData();
+    },
+    //切换场站
+    changeStation(val) {
+      this.stationVal = val;
+      this.getTableData();
+    },
+    //查询
+    async getTableData() {
+      let params = {
+        windpowerstationId: this.stationVal,
+        pageSize: this.page.pagesize,
+        pageNum: this.page.currentPage,
+        begindate: this.starTime,
+        planEnddate: this.endTime,
+      };
+      const { data } = await GetCleanList(params);
+      this.stationAnalyseData = data.records;
+      this.page.total = data.total;
+    },
+    //新增
+    handleAdd() {
+      this.$refs["operation"].form.windpowerstationId = this.stationVal;
+      this.$refs["operation"].getSquare(this.stationVal);
+      this.$refs["operation"].form.begindate = dayjs().format(
+        "YYYY-MM-DD HH:mm:ss"
+      );
+      this.$refs["operation"].form.planEnddate = dayjs().format(
+        "YYYY-MM-DD HH:mm:ss"
+      );
+      this.$refs["operation"].form.actualEnddate = dayjs().format(
+        "YYYY-MM-DD HH:mm:ss"
+      );
+      this.$refs["operation"].openDialog();
+    },
+    //编辑
+    handleEdit(row) {
+      this.$refs["operation"].openDialog(row);
+    },
+    //删除
+    handleDelete(row) {
+      if (row.id) {
+        this.$confirm("你确定要删除吗?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+          .then(() => {
+            CleanDelete(row.id).then((res) => {
+              if (res.data) {
+                this.$message({
+                  type: "success",
+                  message: "删除成功!",
+                });
+                this.getTableData();
+              }
+            });
+          })
+          .catch(() => {
+            this.$message({
+              type: "info",
+              message: "已取消删除",
+            });
+          });
+      } else {
+        this.$baseMessage("未选中任何行", "error");
+        return false;
+      }
+    },
+    //导出
+    downXlsxFn() {
+      let header = [];
+      this.tableHeader.forEach((it) => {
+        if (it.title !== "操作") {
+          header.push(it.title);
+        }
+      });
+      utils.exportExcel(
+        this.$refs["fitting_table"].$el,
+        header,
+        "清洗录入列表"
+      );
+    },
+  },
+};
+</script>
+
+<style lang="less">
+.powerLinefitting {
+  padding: 0 23px;
+  .powerLinefitting_topAll {
+    display: flex;
+    justify-content: space-between;
+    .powerLinefitting_top {
+      display: flex;
+      flex-direction: row;
+      align-items: center;
+      margin-top: 10px;
+      margin-bottom: 10px;
+      .form-wrapper {
+        display: flex;
+        align-items: center;
+        .select-wrapper {
+          display: flex;
+          align-items: center;
+          .el-select {
+            width: 155px;
+            .el-input .el-input__inner {
+              width: 150px;
+            }
+          }
+        }
+        .date-wrapper {
+          display: flex;
+          align-items: center;
+          font-size: 14px;
+          font-family: Microsoft YaHei;
+          font-weight: 400;
+          color: #b3b3b3;
+          margin-left: 10px;
+          .date-item-wrapper {
+            display: flex;
+            align-items: center;
+            margin-right: 15px;
+            .date-item-date {
+              margin-left: 10px;
+              .el-input .el-input__inner {
+                font-size: 13px;
+                color: #b3b3b3;
+              }
+            }
+          }
+        }
+      }
+      .station {
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        font-size: 14px;
+        font-family: Microsoft YaHei;
+        font-weight: 400;
+        color: #b3b3b3;
+        margin-right: 25px;
+      }
+      .search-input {
+        margin-left: 10px;
+        .el-input__inner {
+          width: 175px;
+        }
+        .el-input__suffix {
+          right: -50px;
+        }
+      }
+
+      .but {
+        display: flex;
+        flex-direction: row;
+        align-content: center;
+        .buttons:nth-child(1) {
+          background: rgba(0, 70, 199, 0.6);
+          border: 1px solid #1f51ae;
+          border-radius: 13px;
+          color: #fff;
+          &:hover {
+            background: rgba(14, 90, 229, 0.9);
+            border-radius: 13px;
+            color: #fff;
+          }
+        }
+
+        .buttons:nth-child(2) {
+          background: rgba(0, 70, 199, 0.6);
+          border: 1px solid #1f51ae;
+          border-radius: 13px;
+          color: #fff;
+          &:hover {
+            background: rgba(14, 90, 229, 0.9);
+            border-radius: 13px;
+            color: #fff;
+          }
+        }
+        .buttons:nth-child(3) {
+          background: rgba(67, 81, 107, 0.3);
+          border: 1px solid #3b4c6c;
+          border-radius: 13px;
+          font-size: 14px;
+          color: #b3b3b3;
+        }
+      }
+    }
+    .selections {
+      display: flex;
+      margin-top: 10px;
+      position: relative;
+      right: 120px;
+      .selections_btn {
+        flex: 0 0 55px;
+        text-align: center;
+        height: 33px;
+        line-height: 33px;
+        margin-right: 8px;
+        color: #fff;
+        font-size: 1.296vh;
+        background: fade(#606769, 20);
+        border: 1px solid fade(#606769, 20);
+        border-radius: 20px;
+        &:hover,
+        &.active {
+          background: fade(#0046c7, 80);
+          border: 1px solid #0046c7;
+          color: #b9b9b9;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .powerLinefitting_title {
+    padding-left: 10px;
+    .leftContent {
+      width: 242px;
+      height: 41px;
+      line-height: 41px;
+      background: url("../../../../../assets/imgs/title_left_bg.png");
+      span {
+        font-size: 16px;
+        font-family: Microsoft YaHei;
+        font-weight: 400;
+        color: #ffffff;
+        margin-left: 25px;
+      }
+    }
+    .floatLeft {
+      float: left;
+    }
+    .floatRight {
+      float: right;
+    }
+    .rightContent {
+      width: 212px;
+      height: 28px;
+      margin-top: 13px;
+      background: url("../../../../../assets/imgs/title_right_bg.png");
+    }
+  }
+  .clearfix::after {
+    content: "";
+    clear: both;
+    height: 0;
+    line-height: 0;
+    visibility: hidden;
+    display: block;
+  }
+  .clearfix {
+    zoom: 1;
+  }
+
+  .powerLinefitting_Table {
+    margin: 0 5px 5px 5px;
+    padding-bottom: 10px;
+    .operationBtn {
+      cursor: pointer;
+      color: #1c99ff;
+      padding: 3px 10px;
+    }
+    .pagination-wrapper {
+      display: flex;
+      justify-content: flex-end;
+      padding-right: 20px;
+      .el-pagination {
+        display: flex;
+        align-items: center;
+        .btn-prev,
+        .btn-next,
+        .btn-quickprev,
+        .btn-quicknext,
+        .el-pager,
+        .number {
+          background: rgba(58, 63, 75, 0.4);
+          color: #fff;
+          border-radius: 2px;
+        }
+
+        .el-pager .active {
+          background: #083c94;
+          color: #fff;
+          border-radius: 2px;
+        }
+
+        .el-pagination__total,
+        .el-pagination__jump {
+          color: #fff;
+          .el-input__inner {
+            background: rgba(58, 63, 75, 0.2);
+            border: 1px solid #3e4349;
+            color: #fff;
+            border-radius: 2px;
+          }
+        }
+      }
+    }
+    .el-table--mini {
+      margin: 5px;
+      .el-table__header-wrapper {
+        tr {
+          background: rgba(83, 89, 104, 0.3) !important;
+          //   th {
+          //     vertical-align: top !important;
+          //   }
+          .cell {
+            color: #b3b3b3;
+            font-family: MicrosoftYaHei;
+            font-size: 14px;
+          }
+        }
+      }
+      .el-table__body-wrapper {
+        tr {
+          &:nth-child(2n) {
+            background: rgba(83, 89, 104, 0.05) !important;
+          }
+          .cell {
+            color: #d8d8d9;
+            font-family: ArialMT;
+            font-size: 13px;
+            height: 25px !important;
+          }
+        }
+      }
+    }
+  }
+  .powerLinefitting_Echarts {
+    margin-top: 10px;
+    width: 100%;
+    background: rgba(0, 0, 0, 0.45);
+    position: relative;
+    height: 39px;
+    // border-bottom: 1px solid rgba(153, 153, 153, 0.5);
+    font-size: 16px;
+    font-family: Microsoft YaHei;
+    font-weight: 400;
+    color: #ffffff;
+    .chart-name {
+      display: flex;
+      align-items: center;
+      padding-left: 20px;
+      position: relative;
+      height: 39px;
+      width: 98%;
+      margin-left: 1%;
+      border-bottom: 1px solid rgba(153, 153, 153, 0.5);
+      font-size: 16px;
+      font-family: Microsoft YaHei;
+      font-weight: 400;
+      color: #ffffff;
+      .point {
+        width: 6px;
+        height: 1px;
+        background-color: #ffffff;
+        position: absolute;
+
+        &.left {
+          left: 0;
+        }
+
+        &.right {
+          right: 0;
+        }
+
+        &.top {
+          top: -1px;
+        }
+
+        &.bottom {
+          bottom: -1px;
+        }
+      }
+    }
+    .fittingEchartSty {
+      width: 100%;
+      height: 280px;
+      background: rgba(0, 0, 0, 0.45);
+    }
+  }
+  .el-overlay {
+    .el-overlay-dialog {
+      overflow-y: hidden !important;
+      .powerLinefittinghistoryModel {
+        margin-top: 0 !important;
+        .el-dialog__body {
+          padding-top: 10px;
+        }
+      }
+      .contrastModal {
+        .el-dialog__body {
+          padding-top: 10px;
+        }
+      }
+    }
+  }
+
+  .el-picker__popper .el-date-range-picker__header .el-picker-panel__icon-btn {
+    color: #fff;
+  }
+  .el-picker__popper .el-date-table .in-range div {
+    background: #43516b;
+  }
+}
+</style>

+ 271 - 0
src/views/layout/economicsOperation/insert/faultInsert/components/operation.vue

@@ -0,0 +1,271 @@
+<template>
+  <el-dialog
+    class="dialogs"
+    width="45%"
+    top="10vh"
+    v-model="dialogCurveVisible"
+    :show-close="true"
+    @close="close"
+  >
+    <template #title>
+      <div class="dialog-title">
+        <img
+          class="dialog-title-img"
+          src="@/assets/img/images/dialog-title.png"
+        />
+        <div class="title">{{ dialogTitle }}</div>
+      </div>
+    </template>
+    <div class="dialog-body" style="height: 45vh; width: 100%">
+      <div class="body-wrapper">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+          <el-form-item label="场站" prop="windpowerstationId">
+            <el-select
+              v-model="form.windpowerstationId"
+              style="width: 200px"
+              placeholder="请选择"
+              clearable
+              size="mini"
+              :disabled="!isAdd ? true : false"
+              @change="stationChanged"
+            >
+              <el-option
+                v-for="item in stationOptions"
+                :key="item.id"
+                :label="item.aname"
+                :value="item.id"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="设备" prop="equipmentId">
+            <el-select
+              v-model="form.equipmentId"
+              style="width: 200px"
+              placeholder="请选择"
+              clearable
+              size="mini"
+              :disabled="!isAdd ? true : false"
+            >
+              <el-option
+                v-for="item in equipmentOption"
+                :key="item.windturbineId"
+                :label="item.aname"
+                :value="item.windturbineId"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="开始时间" prop="begindate">
+            <el-date-picker
+              v-model="form.begindate"
+              style="width: 200px"
+              type="datetime"
+              size="mini"
+              value-format="YYYY-MM-DD HH:mm:ss"
+              placeholder="选择日期时间"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item label="计划结束时间" prop="planEnddate">
+            <el-date-picker
+              v-model="form.planEnddate"
+              style="width: 200px"
+              type="datetime"
+              size="mini"
+              value-format="YYYY-MM-DD HH:mm:ss"
+              placeholder="选择日期时间"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item label="实际结束时间" prop="actualEnddate">
+            <el-date-picker
+              v-model="form.actualEnddate"
+              style="width: 200px"
+              type="datetime"
+              size="mini"
+              value-format="YYYY-MM-DD HH:mm:ss"
+              placeholder="选择日期时间"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item label="故障描述" prop="faultDescription">
+            <el-input
+              v-model="form.faultDescription"
+              style="width: 200px"
+              class="inputs"
+              size="mini"
+              placeholder="请输入"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="处理过程" prop="processingProcess">
+            <el-input
+              v-model="form.processingProcess"
+              style="width: 200px"
+              class="inputs"
+              size="mini"
+              placeholder="请输入"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="备注" prop="spare1">
+            <el-input
+              v-model="form.spare1"
+              style="width: 200px"
+              class="inputs"
+              size="mini"
+              placeholder="请输入"
+            ></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <img
+        class="dialog-img"
+        style="bottom: 65px"
+        src="@/assets/img/images/dialog.png"
+      />
+    </div>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button type="info" size="mini" @click="close">取 消</el-button>
+        <el-button size="mini" type="primary" @click="handleSave"
+          >确 定</el-button
+        >
+      </div>
+    </template>
+  </el-dialog>
+</template>
+<script>
+import { FaultOperation } from "@/api/insert.js";
+import { GetwtByWp } from "@/api/headerNav.js";
+
+export default {
+  name: "operation",
+  components: {},
+  props: {
+    stationOptions: {
+      type: Array,
+      required: true,
+    },
+  },
+  data() {
+    return {
+      dialogCurveVisible: false,
+      dialogTitle: "新增",
+      form: {
+        windpowerstationId: "",
+        windpowerstationName: "",
+        equipmentId: "",
+        equipmentName: "",
+        begindate: "",
+        planEnddate: "",
+        actualEnddate: "",
+        faultDescription: "",
+        processingProcess: "",
+        spare1: "",
+      },
+      equipmentOption: [],
+      rules: {
+        windpowerstationId: [
+          { required: true, trigger: "blur", message: "请选择" },
+        ],
+        equipmentId: [{ required: true, trigger: "blur", message: "请选择" }],
+        begindate: [{ required: true, trigger: "blur", message: "请选择" }],
+        planEnddate: [{ required: true, trigger: "blur", message: "请选择" }],
+        actualEnddate: [{ required: true, trigger: "blur", message: "请选择" }],
+        faultDescription: [{ required: true, trigger: "blur", message: "请选择" }],
+        processingProcess: [{ required: true, trigger: "blur", message: "请选择" }],
+      },
+      isAdd: true,
+    };
+  },
+  created() {},
+  methods: {
+    openDialog(row) {
+      if (!row) {
+        this.dialogTitle = "新增";
+        this.isAdd = true;
+      } else {
+        this.dialogTitle = "修改";
+        this.isAdd = false;
+        this.form = Object.assign({}, row);
+        this.form.id = row.id;
+      }
+      this.dialogCurveVisible = true;
+    },
+    stationChanged(val) {
+      this.getEquipment(val);
+    },
+    getEquipment(station) {
+      GetwtByWp(station).then(({ data }) => {
+        this.equipmentOption = data;
+      });
+    },
+    handleSave() {
+      this.$refs["form"].validate(async (valid) => {
+        if (valid) {
+          if (this.isAdd) {
+            let wpinfo = this.stationOptions.find(
+              (item) => item.id == this.form.windpowerstationId
+            );
+            let eqinfo = this.equipmentOption.find(
+              (item) => item.windturbineId == this.form.equipmentId
+            );
+            this.form.windpowerstationName = wpinfo.aname;
+            this.form.equipmentName = eqinfo.aname;
+          }
+          FaultOperation(this.form).then((res) => {
+            if (res.code == 200) {
+              this.$message({
+                type: "success",
+                message: this.isAdd ? "添加成功!" : "修改成功!",
+              });
+              this.$emit("handleSuccess");
+              this.dialogCurveVisible = false;
+            }
+          });
+        } else {
+          return false;
+        }
+      });
+    },
+    close() {
+      this.$refs["form"].resetFields();
+      this.form = this.$options.data().form;
+      this.dialogCurveVisible = false;
+      this.$emit("handleSuccess");
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+.el-form ::v-deep {
+  display: flex;
+  flex-wrap: wrap;
+  .el-form-item {
+    width: 50%;
+    .el-input .el-input__inner {
+      font-size: 13px;
+      color: #b3b3b3;
+    }
+  }
+}
+.dialog-footer {
+  .el-button--primary {
+    background: rgba(0, 70, 199, 0.6);
+    border: 1px solid #1f51ae;
+    border-radius: 13px;
+    color: #fff;
+    &:hover {
+      background: rgba(14, 90, 229, 0.9);
+      border-radius: 13px;
+      color: #fff;
+    }
+  }
+  .el-button--info {
+    background: rgba(67, 81, 107, 0.3);
+    border: 1px solid #3b4c6c;
+    border-radius: 13px;
+    color: #b3b3b3;
+    &:hover {
+      background: rgba(67, 81, 107, 0.9);
+      border-radius: 13px;
+      color: #b3b3b3;
+    }
+  }
+}
+</style>

+ 640 - 0
src/views/layout/economicsOperation/insert/faultInsert/index.vue

@@ -0,0 +1,640 @@
+<template>
+  <div class="powerLinefitting">
+    <div class="powerLinefitting_topAll">
+      <div class="powerLinefitting_top">
+        <div class="form-wrapper">
+          <div class="select-wrapper">
+            <el-select
+              size="mini"
+              v-model="tabEvent"
+              placeholder="请选择"
+              @change="changeBtn"
+            >
+              <el-option
+                v-for="item in tabOptions"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+            <el-select
+              size="mini"
+              v-model="companyVal"
+              placeholder="请选择"
+              @change="changeCompan"
+            >
+              <el-option
+                v-for="item in companyOptions"
+                :key="item.id"
+                :label="item.aname"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+            <el-select
+              size="mini"
+              v-model="stationVal"
+              placeholder="请选择"
+              @change="changeStation"
+            >
+              <el-option
+                v-for="item in stationOptions"
+                :key="item.id"
+                :label="item.aname"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <div class="date-wrapper">
+            <div class="date-item-wrapper">
+              开始时间
+              <div class="date-item-date">
+                <el-date-picker
+                  size="mini"
+                  v-model="starTime"
+                  type="datetime"
+                  value-format="YYYY-MM-DD HH:mm:ss"
+                  placeholder="选择时间"
+                >
+                </el-date-picker>
+              </div>
+            </div>
+            <div class="date-item-wrapper">
+              结束时间
+              <div class="date-item-date">
+                <el-date-picker
+                  size="mini"
+                  v-model="endTime"
+                  type="datetime"
+                  value-format="YYYY-MM-DD HH:mm:ss"
+                  placeholder="选择时间"
+                >
+                </el-date-picker>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="but">
+          <el-button round size="mini" class="buttons" @click="getTableData"
+            >查询</el-button
+          >
+          <el-button round size="mini" class="buttons" @click="handleAdd"
+            >新增</el-button
+          >
+          <el-button round size="mini" class="buttons" @click="downXlsxFn"
+            >导出</el-button
+          >
+        </div>
+      </div>
+    </div>
+    <div style="background: rgba(0, 0, 0, 0.4)">
+      <div class="powerLinefitting_title clearfix">
+        <div class="leftContent floatLeft"><span>故障录入</span></div>
+        <div class="rightContent floatRight"></div>
+      </div>
+
+      <div class="powerLinefitting_Table">
+        <el-table
+          :data="stationAnalyseData"
+          stripe
+          size="mini"
+          height="80vh"
+          ref="fitting_table"
+          style="width: 100%"
+          @row-click="handleRowClick"
+        >
+          <el-table-column
+            v-for="(item, index) in tableHeader"
+            :key="index"
+            sortable
+            :prop="item.code"
+            :label="item.title"
+            align="center"
+          >
+            <template #default="scope" v-if="item.title === '操作'">
+              <span class="operationBtn" @click="handleEdit(scope.row)"
+                >编辑</span
+              >
+              <span class="operationBtn" @click="handleDelete(scope.row)"
+                >删除</span
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+          <el-pagination
+            @current-change="handleCurrentChange"
+            :current-page="page.currentPage"
+            :page-size="page.pagesize"
+            layout="total, prev, pager, next, jumper"
+            :total="page.total"
+          >
+          </el-pagination>
+        </div>
+      </div>
+    </div>
+    <!-- <div class="powerLinefitting_Echarts">
+      <div class="chart-name">
+        <div class="point left bottom"></div>
+        <div class="point right bottom"></div>
+        <span>性能分析曲线</span>
+      </div>
+      <div class="fittingEchartSty">
+        <doubleYAxisLineChart
+          :tabEvent="tabEvent"
+          :unit="'(W/m²)'"
+          :list="stationLineData"
+        />
+      </div>
+    </div> -->
+    <operation
+      ref="operation"
+      :stationOptions="stationOptions"
+      @handleSuccess="getTableData"
+    />
+  </div>
+</template>
+
+<script>
+import { GetFaultList, FaultDelete } from "@/api/insert.js";
+import { GetOrganization, GetStationByCompany } from "@/api/headerNav.js";
+import utils from "@/utils/downXlsx";
+import dayjs from "dayjs";
+import operation from "./components/operation.vue";
+export default {
+  name: "faultInsert", //故障录入
+  data() {
+    return {
+      companyVal: "",
+      companyOptions: [],
+      stationVal: "",
+      stationOptions: [],
+      starTime: "",
+      endTime: "",
+      stationAnalyseData: [],
+      stationLineData: [],
+      tableHeader: [
+        { title: "场站", code: "windpowerstationName" },
+        { title: "设备", code: "equipmentId" },
+        { title: "开始时间", code: "begindate" },
+        { title: "计划结束时间", code: "planEnddate" },
+        { title: "实际结束时间", code: "actualEnddate" },
+        { title: "故障描述", code: "faultDescription" },
+        { title: "处理过程", code: "processingProcess" },
+        { title: "备注", code: "spare1" },
+        { title: "操作" },
+      ],
+      tabEvent: -2,
+      tabOptions: [{ id: -2, name: "光伏" }],
+      page: {
+        pagesize: 20,
+        currentPage: 1,
+        total: 0,
+      },
+    };
+  },
+  components: {
+    operation,
+  },
+  created() {
+    this.starTime = dayjs().startOf("day").format("YYYY-MM-DD HH:mm:ss");
+    this.endTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
+    this.getCompanyData();
+  },
+  methods: {
+    //切换风电光伏
+    changeBtn() {},
+    // 获取公司列表
+    async getCompanyData() {
+      this.companyOptions = [];
+      const datas = await GetOrganization({ type: this.tabEvent });
+      this.companyOptions = datas.data;
+      this.companyVal = datas.data[0]?.id;
+      this.getStationData(this.companyVal);
+    },
+    // 获取场站列表
+    async getStationData() {
+      this.stationOptions = [];
+      let params = {
+        type: this.tabEvent,
+        companyids: this.companyVal,
+      };
+      const datas = await GetStationByCompany(params);
+      this.stationOptions = datas.data;
+      this.stationVal = datas.data[0].id;
+      this.getTableData();
+    },
+    //切换公司
+    changeCompan(val) {
+      this.companyVal = val;
+      this.getStationData();
+    },
+    //切换场站
+    changeStation(val) {
+      this.stationVal = val;
+      this.getTableData();
+    },
+    //查询
+    async getTableData() {
+      let params = {
+        windpowerstationId: this.stationVal,
+        pageSize: this.page.pagesize,
+        pageNum: this.page.currentPage,
+        begindate: this.starTime,
+        planEnddate: this.endTime,
+      };
+      const { data } = await GetFaultList(params);
+      this.stationAnalyseData = data.records;
+      this.page.total = data.total;
+    },
+    //新增
+    handleAdd() {
+      this.$refs["operation"].form.windpowerstationId = this.stationVal;
+      this.$refs["operation"].getEquipment(this.stationVal);
+      this.$refs["operation"].form.begindate = dayjs().format(
+        "YYYY-MM-DD HH:mm:ss"
+      );
+      this.$refs["operation"].form.planEnddate = dayjs().format(
+        "YYYY-MM-DD HH:mm:ss"
+      );
+      this.$refs["operation"].form.actualEnddate = dayjs().format(
+        "YYYY-MM-DD HH:mm:ss"
+      );
+      this.$refs["operation"].openDialog();
+    },
+    //编辑
+    handleEdit(row) {
+        this.$refs["operation"].getEquipment(row.windpowerstationId);
+      this.$refs["operation"].openDialog(row);
+    },
+    //删除
+    handleDelete(row) {
+      if (row.id) {
+        this.$confirm("你确定要删除吗?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+          .then(() => {
+            FaultDelete(row.id).then((res) => {
+              if (res.data) {
+                this.$message({
+                  type: "success",
+                  message: "删除成功!",
+                });
+                this.getTableData();
+              }
+            });
+          })
+          .catch(() => {
+            this.$message({
+              type: "info",
+              message: "已取消删除",
+            });
+          });
+      } else {
+        this.$baseMessage("未选中任何行", "error");
+        return false;
+      }
+    },
+    //导出
+    downXlsxFn() {
+      let header = [];
+      this.tableHeader.forEach((it) => {
+        if (it.title !== "操作") {
+          header.push(it.title);
+        }
+      });
+      utils.exportExcel(
+        this.$refs["fitting_table"].$el,
+        header,
+        "故障录入列表"
+      );
+    },
+  },
+};
+</script>
+
+<style lang="less">
+.powerLinefitting {
+  padding: 0 23px;
+  .powerLinefitting_topAll {
+    display: flex;
+    justify-content: space-between;
+    .powerLinefitting_top {
+      display: flex;
+      flex-direction: row;
+      align-items: center;
+      margin-top: 10px;
+      margin-bottom: 10px;
+      .form-wrapper {
+        display: flex;
+        align-items: center;
+        .select-wrapper {
+          display: flex;
+          align-items: center;
+          .el-select {
+            width: 155px;
+            .el-input .el-input__inner {
+              width: 150px;
+            }
+          }
+        }
+        .date-wrapper {
+          display: flex;
+          align-items: center;
+          font-size: 14px;
+          font-family: Microsoft YaHei;
+          font-weight: 400;
+          color: #b3b3b3;
+          margin-left: 10px;
+          .date-item-wrapper {
+            display: flex;
+            align-items: center;
+            margin-right: 15px;
+            .date-item-date {
+              margin-left: 10px;
+              .el-input .el-input__inner {
+                font-size: 13px;
+                color: #b3b3b3;
+              }
+            }
+          }
+        }
+      }
+      .station {
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        font-size: 14px;
+        font-family: Microsoft YaHei;
+        font-weight: 400;
+        color: #b3b3b3;
+        margin-right: 25px;
+      }
+      .search-input {
+        margin-left: 10px;
+        .el-input__inner {
+          width: 175px;
+        }
+        .el-input__suffix {
+          right: -50px;
+        }
+      }
+
+      .but {
+        display: flex;
+        flex-direction: row;
+        align-content: center;
+        .buttons:nth-child(1) {
+          background: rgba(0, 70, 199, 0.6);
+          border: 1px solid #1f51ae;
+          border-radius: 13px;
+          color: #fff;
+          &:hover {
+            background: rgba(14, 90, 229, 0.9);
+            border-radius: 13px;
+            color: #fff;
+          }
+        }
+
+        .buttons:nth-child(2) {
+          background: rgba(0, 70, 199, 0.6);
+          border: 1px solid #1f51ae;
+          border-radius: 13px;
+          color: #fff;
+          &:hover {
+            background: rgba(14, 90, 229, 0.9);
+            border-radius: 13px;
+            color: #fff;
+          }
+        }
+        .buttons:nth-child(3) {
+          background: rgba(67, 81, 107, 0.3);
+          border: 1px solid #3b4c6c;
+          border-radius: 13px;
+          font-size: 14px;
+          color: #b3b3b3;
+        }
+      }
+    }
+    .selections {
+      display: flex;
+      margin-top: 10px;
+      position: relative;
+      right: 120px;
+      .selections_btn {
+        flex: 0 0 55px;
+        text-align: center;
+        height: 33px;
+        line-height: 33px;
+        margin-right: 8px;
+        color: #fff;
+        font-size: 1.296vh;
+        background: fade(#606769, 20);
+        border: 1px solid fade(#606769, 20);
+        border-radius: 20px;
+        &:hover,
+        &.active {
+          background: fade(#0046c7, 80);
+          border: 1px solid #0046c7;
+          color: #b9b9b9;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .powerLinefitting_title {
+    padding-left: 10px;
+    .leftContent {
+      width: 242px;
+      height: 41px;
+      line-height: 41px;
+      background: url("../../../../../assets/imgs/title_left_bg.png");
+      span {
+        font-size: 16px;
+        font-family: Microsoft YaHei;
+        font-weight: 400;
+        color: #ffffff;
+        margin-left: 25px;
+      }
+    }
+    .floatLeft {
+      float: left;
+    }
+    .floatRight {
+      float: right;
+    }
+    .rightContent {
+      width: 212px;
+      height: 28px;
+      margin-top: 13px;
+      background: url("../../../../../assets/imgs/title_right_bg.png");
+    }
+  }
+  .clearfix::after {
+    content: "";
+    clear: both;
+    height: 0;
+    line-height: 0;
+    visibility: hidden;
+    display: block;
+  }
+  .clearfix {
+    zoom: 1;
+  }
+
+  .powerLinefitting_Table {
+    margin: 0 5px 5px 5px;
+    padding-bottom: 10px;
+    .operationBtn {
+      cursor: pointer;
+      color: #1c99ff;
+      padding: 3px 10px;
+    }
+    .pagination-wrapper {
+      display: flex;
+      justify-content: flex-end;
+      padding-right: 20px;
+      .el-pagination {
+        display: flex;
+        align-items: center;
+        .btn-prev,
+        .btn-next,
+        .btn-quickprev,
+        .btn-quicknext,
+        .el-pager,
+        .number {
+          background: rgba(58, 63, 75, 0.4);
+          color: #fff;
+          border-radius: 2px;
+        }
+
+        .el-pager .active {
+          background: #083c94;
+          color: #fff;
+          border-radius: 2px;
+        }
+
+        .el-pagination__total,
+        .el-pagination__jump {
+          color: #fff;
+          .el-input__inner {
+            background: rgba(58, 63, 75, 0.2);
+            border: 1px solid #3e4349;
+            color: #fff;
+            border-radius: 2px;
+          }
+        }
+      }
+    }
+    .el-table--mini {
+      margin: 5px;
+      .el-table__header-wrapper {
+        tr {
+          background: rgba(83, 89, 104, 0.3) !important;
+          //   th {
+          //     vertical-align: top !important;
+          //   }
+          .cell {
+            color: #b3b3b3;
+            font-family: MicrosoftYaHei;
+            font-size: 14px;
+          }
+        }
+      }
+      .el-table__body-wrapper {
+        tr {
+          &:nth-child(2n) {
+            background: rgba(83, 89, 104, 0.05) !important;
+          }
+          .cell {
+            color: #d8d8d9;
+            font-family: ArialMT;
+            font-size: 13px;
+            height: 25px !important;
+          }
+        }
+      }
+    }
+  }
+  .powerLinefitting_Echarts {
+    margin-top: 10px;
+    width: 100%;
+    background: rgba(0, 0, 0, 0.45);
+    position: relative;
+    height: 39px;
+    // border-bottom: 1px solid rgba(153, 153, 153, 0.5);
+    font-size: 16px;
+    font-family: Microsoft YaHei;
+    font-weight: 400;
+    color: #ffffff;
+    .chart-name {
+      display: flex;
+      align-items: center;
+      padding-left: 20px;
+      position: relative;
+      height: 39px;
+      width: 98%;
+      margin-left: 1%;
+      border-bottom: 1px solid rgba(153, 153, 153, 0.5);
+      font-size: 16px;
+      font-family: Microsoft YaHei;
+      font-weight: 400;
+      color: #ffffff;
+      .point {
+        width: 6px;
+        height: 1px;
+        background-color: #ffffff;
+        position: absolute;
+
+        &.left {
+          left: 0;
+        }
+
+        &.right {
+          right: 0;
+        }
+
+        &.top {
+          top: -1px;
+        }
+
+        &.bottom {
+          bottom: -1px;
+        }
+      }
+    }
+    .fittingEchartSty {
+      width: 100%;
+      height: 280px;
+      background: rgba(0, 0, 0, 0.45);
+    }
+  }
+  .el-overlay {
+    .el-overlay-dialog {
+      overflow-y: hidden !important;
+      .powerLinefittinghistoryModel {
+        margin-top: 0 !important;
+        .el-dialog__body {
+          padding-top: 10px;
+        }
+      }
+      .contrastModal {
+        .el-dialog__body {
+          padding-top: 10px;
+        }
+      }
+    }
+  }
+
+  .el-picker__popper .el-date-range-picker__header .el-picker-panel__icon-btn {
+    color: #fff;
+  }
+  .el-picker__popper .el-date-table .in-range div {
+    background: #43516b;
+  }
+}
+</style>