rui.jiang 6 місяців тому
батько
коміт
2447926604
26 змінених файлів з 684 додано та 371 видалено
  1. 20 20
      src/assets/js/constants/echarts-config/pareto.js
  2. 2 3
      src/components/Tinymce.vue
  3. 1 1
      src/store/dragChart.js
  4. 11 33
      src/utils/indexedDb.js
  5. 27 15
      src/utils/vuexIndexedDBPlugin.js
  6. 76 51
      src/views/dataAdministration/index.vue
  7. 121 22
      src/views/performance/assetssDetail.vue
  8. 99 36
      src/views/performance/components/EditAnalysis.vue
  9. 0 1
      src/views/performance/components/custonAsCom/AssociatedFields.vue
  10. 15 9
      src/views/performance/components/custonAsCom/DatabaseTable.vue
  11. 2 2
      src/views/performance/components/custonAsCom/dataTable.vue
  12. 172 40
      src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/Heatmap.js
  13. 2 1
      src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/boxPlot.js
  14. 31 31
      src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/pareto.js
  15. 2 1
      src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/pie.js
  16. 24 32
      src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/radar.js
  17. 2 1
      src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/roseChart.js
  18. 5 6
      src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/sankeyDiagram.js
  19. 2 1
      src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/stackedBar.js
  20. 37 23
      src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartTitle.vue
  21. 2 1
      src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/configFn.js
  22. 3 4
      src/views/performance/components/custonAsCom/dragChart/components/chartsContent.vue
  23. 2 9
      src/views/performance/components/custonAsCom/dragChart/components/chartsData.vue
  24. 5 3
      src/views/performance/components/custonAsCom/luckySheet.vue
  25. 15 13
      src/views/performance/customAnalysis.vue
  26. 6 12
      vue.config.js

+ 20 - 20
src/assets/js/constants/echarts-config/pareto.js

@@ -1,7 +1,7 @@
 /*
  * @Author: your name
  * @Date: 2024-11-20 09:19:45
- * @LastEditTime: 2024-11-27 15:05:13
+ * @LastEditTime: 2024-12-31 11:10:20
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/assets/js/constants/echarts-config/pareto.js
@@ -79,22 +79,22 @@ export const option = {
       type: "bar",
       data: [50, 30, 10, 5, 5],
       showBackground: true,
-      itemStyle: {
-        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-          { offset: 0, color: "#83bff6" },
-          { offset: 0.5, color: "#188df0" },
-          { offset: 1, color: "#188df0" },
-        ]),
-      },
-      emphasis: {
-        itemStyle: {
-          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-            { offset: 0, color: "#2378f7" },
-            { offset: 0.7, color: "#2378f7" },
-            { offset: 1, color: "#83bff6" },
-          ]),
-        },
-      },
+      // itemStyle: {
+      //   color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+      //     { offset: 0, color: "#83bff6" },
+      //     { offset: 0.5, color: "#188df0" },
+      //     { offset: 1, color: "#188df0" },
+      //   ]),
+      // },
+      // emphasis: {
+      //   itemStyle: {
+      //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+      //       { offset: 0, color: "#2378f7" },
+      //       { offset: 0.7, color: "#2378f7" },
+      //       { offset: 1, color: "#83bff6" },
+      //     ]),
+      //   },
+      // },
     },
     {
       name: "累积百分比",
@@ -102,9 +102,9 @@ export const option = {
       yAxisIndex: 1,
       data: [50, 80, 90, 95, 100],
       smooth: true,
-      lineStyle: {
-        color: "#d14a61",
-      },
+      // lineStyle: {
+      //   color: "#d14a61",
+      // },
     },
   ],
 };

+ 2 - 3
src/components/Tinymce.vue

@@ -99,7 +99,6 @@ export default Vue.extend({
               uploadFile(form)
                 .then((res) => {
                   let data = res.data;
-                  console.log(data, 7777);
                   insertFn(`${data}`);
                   Vue.prototype.$message({
                     type: "success",
@@ -137,8 +136,8 @@ export default Vue.extend({
     //     alert("只能上传格式为html、pdf、word、excel、csv、docx、xlsx的文件!");
     //     return;
     //   }
-    //   const form = new FormData();
-    //   form.append("file", file);
+    // const form = new FormData();
+    // form.append("file", file);
     //   uploadFile(form)
     //     .then((res) => {
     //       let data = res.data;

+ 1 - 1
src/store/dragChart.js

@@ -43,7 +43,7 @@ export default {
         relatedFieldsData: [], //关联字段表
         formFilterAlign: [],
       };
-      //清空indexeddb 数据库
+      //跳转离开编辑表格页面触发清空indexeddb 数据库方法
       clearAllDataFromIndexedDB();
       clearMyIndexedDBIndexedDB();
       // 遍历重置每个字段

+ 11 - 33
src/utils/indexedDb.js

@@ -207,38 +207,6 @@ export async function storeSetData(db, storeName, key, newFileData, callback) {
   };
 }
 
-// export async function storeSetData(db, storeName, key, newFileData, callback) {
-//   if (!db) {
-//     console.error("数据库未初始化.");
-//     return;
-//   }
-//   const transaction = db.transaction([storeName], "readwrite");
-//   const store = transaction.objectStore(storeName);
-//   const getRequest = store.get(key);
-//   getRequest.onsuccess = () => {
-//     const fileDataArray = getRequest.result ? getRequest.result.data : [];
-//     console.log(fileDataArray, "qiannewFileData");
-//     fileDataArray.push(newFileData);
-//     const putRequest = store.put({
-//       id: key,
-//       data: fileDataArray,
-//     });
-//     putRequest.onsuccess = () => {
-//       if (callback && typeof callback === "function") {
-//         callback();
-//       }
-//     };
-
-//     putRequest.onerror = (event) => {
-//       console.error("在IndexedDB中更新数据出错:", event.target.error);
-//     };
-//   };
-
-//   getRequest.onerror = (event) => {
-//     console.error("从IndexedDB检索数据时出错:", event.target.error);
-//   };
-// }
-// utils/indexedDb.js
 export async function openDB(dbName, version) {
   return new Promise((resolve, reject) => {
     const request = indexedDB.open(dbName, version);
@@ -264,10 +232,20 @@ export async function saveData(dbName, key, value) {
   });
 }
 
+// export async function getData(dbName, key) {
+//   const db = await openDB(dbName, 1);
+//   return new Promise((resolve, reject) => {
+//     const transaction = db.transaction(["vuexData"], "readonly");
+//     const store = transaction.objectStore("vuexData");
+//     const request = store.get(key);
+//     request.onsuccess = () => resolve(request.result?.value || null);
+//     request.onerror = (event) => reject(event.target.error);
+//   });
+// }
 export async function getData(dbName, key) {
   const db = await openDB(dbName, 1);
   return new Promise((resolve, reject) => {
-    const transaction = db.transaction(["vuexData"], "readonly");
+    const transaction = db.transaction(["vuexData"], "readonly"); // 确保使用 vuexData 作为对象存储名
     const store = transaction.objectStore("vuexData");
     const request = store.get(key);
     request.onsuccess = () => resolve(request.result?.value || null);

+ 27 - 15
src/utils/vuexIndexedDBPlugin.js

@@ -159,35 +159,51 @@ const filterState = (state) => {
   return clonedState;
 };
 
-// 修改后的 openDB 方法
+// // 修改后的 openDB 方法
+// const openDB = (dbName, version) => {
+//   return new Promise((resolve, reject) => {
+//     const request = indexedDB.open(dbName, version);
+
+//     request.onsuccess = () => {
+//       resolve(request.result);
+//     };
+
+//     request.onerror = (error) => {
+//       reject(error);
+//     };
+
+//     request.onupgradeneeded = (event) => {
+//       const db = event.target.result;
+
+//       // 创建对象存储(如果不存在)
+//       if (!db.objectStoreNames.contains("myIndexedDB")) {
+//         db.createObjectStore("myIndexedDB");
+//       }
+//     };
+//   });
+// };
 const openDB = (dbName, version) => {
   return new Promise((resolve, reject) => {
     const request = indexedDB.open(dbName, version);
-
     request.onsuccess = () => {
       resolve(request.result);
     };
-
     request.onerror = (error) => {
       reject(error);
     };
-
     request.onupgradeneeded = (event) => {
       const db = event.target.result;
-
-      // 创建对象存储(如果不存在)
-      if (!db.objectStoreNames.contains("myIndexedDB")) {
-        db.createObjectStore("myIndexedDB");
+      // 创建对象存储,确保名称为 vuexData(与getData中的名称一致)
+      if (!db.objectStoreNames.contains("vuexData")) {
+        db.createObjectStore("vuexData");
       }
     };
   });
 };
-
 // vuex 插件
 const vuexIndexedDBPlugin = (store) => {
   const dbName = "vuexDB";
   const keyName = "vuexState";
-
   // 初始化 IndexedDB 并加载状态
   openDB(dbName, 1).then(() => {
     getData(dbName, keyName).then((savedState) => {
@@ -199,18 +215,15 @@ const vuexIndexedDBPlugin = (store) => {
       }
     });
   });
-
   // 订阅 Vuex mutations,每次状态变更时保存到 IndexedDB
   store.subscribe((mutation, state) => {
     if (mutation.type.startsWith("dragChart/")) {
       const dragChartState = state.dragChart;
-
       try {
         // 过滤不需要保存的内容
         const cleanedState = filterState(dragChartState);
-
         // 直接保存整个状态到 IndexedDB
-        saveData("myIndexedDB", keyName, cleanedState)
+        saveData("vuexData", keyName, cleanedState)
           .then(() => {
             console.log("State saved successfully");
           })
@@ -231,5 +244,4 @@ const vuexIndexedDBPlugin = (store) => {
     }
   });
 };
-
 export default vuexIndexedDBPlugin;

+ 76 - 51
src/views/dataAdministration/index.vue

@@ -516,8 +516,20 @@
             </el-col>
           </el-row>
         </el-form>
-        <el-divider>映射点表配置</el-divider>
-        <WindCodeAndTypeForPlt ref="forPltRef"></WindCodeAndTypeForPlt>
+        <el-divider
+          v-if="
+            editTransferStateForm.transferTypeName !== '故障' &&
+            editTransferStateForm.transferTypeName !== '告警'
+          "
+          >映射点表配置</el-divider
+        >
+        <WindCodeAndTypeForPlt
+          v-if="
+            editTransferStateForm.transferTypeName !== '故障' &&
+            editTransferStateForm.transferTypeName !== '告警'
+          "
+          ref="forPltRef"
+        ></WindCodeAndTypeForPlt>
         <span slot="footer" class="dialog-footer">
           <el-button @click="editstateCancel('editStateForm')" size="small"
             >取 消</el-button
@@ -745,53 +757,64 @@ export default {
             .then((_) => {
               const token = JSON.parse(sessionStorage.getItem("vuex"))?.auth
                 ?.userInfo?.token;
-              axios
-                .post(
-                  "/transDataWeb/transConf/insertOrUpdate",
-                  {
-                    type: this.forPltFrom.transferType,
-                    windCode: this.forPltFrom.fieldCode,
-                    windName: this.forPltFrom.fieldName,
-                    ...this.$refs.forPltRef.formData,
-                  },
-                  {
-                    headers: {
-                      token,
+              try {
+                axios
+                  .post(
+                    "/transDataWeb/transConf/insertOrUpdate",
+                    {
+                      type: this.forPltFrom.transferType,
+                      windCode: this.forPltFrom.fieldCode,
+                      windName: this.forPltFrom.fieldName,
+                      ...(this.$refs.forPltRef && this.$refs.forPltRef.formData
+                        ? this.$refs.forPltRef.formData
+                        : {}),
                     },
-                  }
-                )
-                .then((pltRes) => {
-                  if (pltRes.data.code === 200) {
-                    dataTransfer({
-                      dataTransferAddr:
-                        this.editTransferStateForm.dataTransferTypePath,
-                      dataTransferType: this.editTransferStateForm.transferType,
-                      batchCode: this.editTransferStateForm.batchCode,
-                      timeGranularity:
-                        this.editTransferStateForm.timeGranularity,
-                    })
-                      .then((res) => {
-                        this.$message({
-                          message: "操作成功",
-                          type: "success",
-                        });
-                        this.$refs.forPltRef.reset("fromPlt");
-                        this.fetchData();
-                        this.editstateCancel();
+                    {
+                      headers: {
+                        token,
+                      },
+                    }
+                  )
+                  .then((pltRes) => {
+                    if (pltRes.data.code === 200) {
+                      dataTransfer({
+                        dataTransferAddr:
+                          this.editTransferStateForm.dataTransferTypePath,
+                        dataTransferType:
+                          this.editTransferStateForm.transferType,
+                        batchCode: this.editTransferStateForm.batchCode,
+                        timeGranularity:
+                          this.editTransferStateForm.timeGranularity,
                       })
-                      .catch((error) => {
-                        this.loadingViewEdit = false;
+                        .then((res) => {
+                          this.$message({
+                            message: "操作成功",
+                            type: "success",
+                          });
+                          if (this.$refs.forPltRef) {
+                            this.$refs.forPltRef.reset("fromPlt");
+                          }
+
+                          this.fetchData();
+                          this.editstateCancel();
+                        })
+                        .catch((error) => {
+                          this.loadingViewEdit = false;
+                        });
+                    } else {
+                      this.loadingViewEdit = false;
+                      this.$message({
+                        message: pltRes.message,
+                        type: "error",
                       });
-                  } else {
-                    this.$message({
-                      message: pltRes.message,
-                      type: "error",
-                    });
-                  }
-                })
-                .catch((error) => {
-                  this.loadingViewEdit = false;
-                });
+                    }
+                  })
+                  .catch((error) => {
+                    this.loadingViewEdit = false;
+                  });
+              } catch (err) {
+                this.loadingViewEdit = true;
+              }
             })
             .catch((_) => {
               this.loadingViewEdit = false;
@@ -817,11 +840,13 @@ export default {
       this.editTransferStateLoading = true;
       // if (title === "重新转换") {
       this.$nextTick(() => {
-        this.$refs.forPltRef.reset("fromPlt");
-        this.$refs.forPltRef.reSetByWindCodeAndTypeForPlt({
-          type: this.forPltFrom.transferType,
-          windCode: this.forPltFrom.fieldCode,
-        });
+        if (this.$refs.forPltRef) {
+          this.$refs.forPltRef.reset("fromPlt");
+          this.$refs.forPltRef.reSetByWindCodeAndTypeForPlt({
+            type: this.forPltFrom.transferType,
+            windCode: this.forPltFrom.fieldCode,
+          });
+        }
       });
       // } else {
       //   this.$nextTick(() => {

+ 121 - 22
src/views/performance/assetssDetail.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2024-05-27 09:25:45
- * @LastEditTime: 2024-12-24 10:49:20
+ * @LastEditTime: 2025-01-03 12:11:11
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/assetssDetail.vue
@@ -119,6 +119,73 @@
         <el-table-column prop="engine_name" label="风机名称"> </el-table-column>
         <el-table-column prop="yaw_error1" label="误差值"> </el-table-column>
       </el-table>
+      <el-table
+        v-else-if="formInfo.analysisTypeCode === 'production_indicator'"
+        :data="productionIndicatorCsvData"
+        border
+        style="width: 100%"
+        align="center"
+      >
+        <el-table-column prop="EPActualTotal" label="实发电量">
+        </el-table-column>
+        <el-table-column prop="TurbinePowerRate" label="风机能量利用率">
+        </el-table-column>
+        <el-table-column prop="EPLostStopPercent" label="停机损失百分比">
+        </el-table-column>
+        <el-table-column prop="EPLostBadPercent" label="欠发损失百分比">
+        </el-table-column>
+        <el-table-column
+          prop="EPLostPerformPercent"
+          label="功率曲线未达标损失百分比"
+        >
+        </el-table-column>
+        <el-table-column prop="EPLostLimitPercent" label="限电损失百分比">
+        </el-table-column>
+        <el-table-column prop="TurbineRunRate" label="风机可利用率">
+        </el-table-column>
+        <el-table-column prop="mean_width" label="功率水平平均宽度">
+        </el-table-column>
+        <el-table-column prop="variance_width" label="功率水平方差">
+        </el-table-column>
+        <el-table-column prop="WindSpeedAvr" label="平均风速">
+        </el-table-column>
+        <el-table-column prop="Thi" label="利用小时"> </el-table-column>
+        <el-table-column prop="Ws" label="功率曲线一致性系数">
+        </el-table-column>
+        <el-table-column
+          v-if="
+            formInfo.fieldEngineCode !== '' && formInfo.fieldEngineCode !== null
+          "
+          prop="Qp"
+          label="风场总发电量"
+        >
+        </el-table-column>
+        <el-table-column
+          v-if="
+            formInfo.fieldEngineCode !== '' && formInfo.fieldEngineCode !== null
+          "
+          prop="Thc"
+          label="风场等效利用小时"
+        >
+        </el-table-column>
+        <el-table-column
+          v-if="
+            formInfo.fieldEngineCode !== '' && formInfo.fieldEngineCode !== null
+          "
+          prop="Rdr"
+          label="风场弃风率"
+        >
+        </el-table-column>
+        <el-table-column
+          v-if="
+            formInfo.fieldEngineCode !== '' && formInfo.fieldEngineCode !== null
+          "
+          prop="Qdr"
+          label="风场弃风电量"
+        >
+        </el-table-column>
+      </el-table>
+
       <!-- 需要在这里添加三个分析类型排版布局 ,分析详情中 -->
       <div v-else>
         <el-card class="box-card analysisType" v-if="generalFiles.length > 0">
@@ -350,6 +417,22 @@
                   @load="iframeLoad(index + diagramRelations.length)"
                 ></iframe>
               </el-col>
+              <el-col
+                v-for="(file, index) in diagramRelations"
+                :key="index + file.fileAddr + file.createTime + 'png'"
+                :span="24"
+                :style="{
+                  display:
+                    getFileType(file.fileAddr) === 'image' ? 'block' : 'none',
+                }"
+                class="col_content"
+              >
+                <img
+                  :src="file.fileAddr"
+                  alt=""
+                  style="width: 100%; height: 590px"
+                />
+              </el-col>
             </template>
           </el-row>
         </el-card>
@@ -421,6 +504,8 @@ export default {
         fieldEngineCode: null,
         analysisTypeCode: null,
       },
+      productionIndicatorCsvData: [],
+      productionIndicatorCsvHeader: [],
       csvData: [], // 解析后的数据
       csvHeaders: [], // CSV 表头
       rules: {},
@@ -644,9 +729,21 @@ export default {
             response.data.length > 0 &&
             response.data[0].commentDescriptionVos) ||
           [];
-        if (this.formInfo.analysisTypeCode === "yaw_error") {
-          this.getCsvData(response.data[0].generalFiles[0].fileAddr);
+        if (
+          response.data[0] &&
+          response.data[0]?.generalFiles &&
+          response.data[0]?.generalFiles[0]?.fileAddr
+        ) {
+          const fileUrl = response.data[0]?.generalFiles[0]?.fileAddr;
+          if (this.formInfo.analysisTypeCode === "yaw_error") {
+            this.fetchCsvData("yaw_error", fileUrl);
+          } else if (
+            this.formInfo.analysisTypeCode === "production_indicator"
+          ) {
+            this.fetchCsvData("production_indicator", fileUrl);
+          }
         }
+
         this.initializeLoading();
         //有功功率的数据处理
         // 有功功率的数据处理
@@ -802,8 +899,8 @@ export default {
 
       return powerCurveTableData.flat();
     },
-    getCsvData(url) {
-      // 使用 axios 获取 CSV 文件
+    // 封装的获取 CSV 数据方法
+    fetchCsvData(analysisType, url) {
       axios
         .get(url, { responseType: "blob" }) // 确保数据以 blob 格式返回
         .then((response) => {
@@ -813,10 +910,25 @@ export default {
             Papa.parse(csvText, {
               header: true, // 使用 CSV 第一行作为键
               complete: (result) => {
-                this.csvHeaders = Object.keys(result.data[0]);
-                this.csvData = result.data.filter(
-                  (row) => Object.keys(row).length
-                ); // 过滤空行
+                // 根据分析类型设置不同的数据
+                if (analysisType === "yaw_error") {
+                  this.csvHeaders = Object.keys(result.data[0]);
+                  this.csvData = result.data.filter(
+                    (row) => Object.keys(row).length
+                  ); // 过滤空行
+                } else if (analysisType === "production_indicator") {
+                  this.productionIndicatorCsvHeader = Object.keys(
+                    result.data[0]
+                  );
+                  this.productionIndicatorCsvData = result.data.filter(
+                    (row) => Object.keys(row).length
+                  ); // 过滤空行
+                  console.log(
+                    this.productionIndicatorCsvHeader,
+                    result.data,
+                    "result.data"
+                  );
+                }
               },
               error: (error) => {
                 console.error("CSV 解析错误:", error);
@@ -880,19 +992,6 @@ export default {
         console.error(error);
       }
     },
-    // getSpan(index, type) {
-    //   let isLastElement = false;
-    //   if (type === "generalFiles") {
-    //     isLastElement = index === this.generalFiles.length - 1;
-    //   } else if (type === "diagramRelations") {
-    //     isLastElement = index === this.diagramRelations.length - 1;
-    //   }
-    //   const isOddPosition = (index + 1) % 2 !== 0;
-    //   if (isLastElement && isOddPosition) {
-    //     return 24;
-    //   }
-    //   return 12;
-    // },
     getFileType(url) {
       // 使用 URL 对象解析 URL
       // 获取路径名部分

+ 99 - 36
src/views/performance/components/EditAnalysis.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2024-05-29 09:14:23
- * @LastEditTime: 2024-12-24 10:48:23
+ * @LastEditTime: 2025-01-03 12:15:53
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/EditAnalysis.vue
@@ -67,7 +67,6 @@
     ></el-empty>
     <el-card v-if="!noData" shadow="always" class="box-card">
       <el-row class="assetssConent">
-        <!-- {{ generalFilesData }} -->
         <el-col
           :span="24"
           v-if="form.configAnalysis === 'yaw_error' && this.csvData.length > 0"
@@ -86,51 +85,64 @@
             </el-table>
           </div>
         </el-col>
-        <el-col
-          :span="24"
-          v-if="form.configAnalysis === '发电效能评价数字化指标分析'"
+        <el-col :span="24" v-if="form.configAnalysis === 'production_indicator'"
           ><div class="left">
             <el-table
-              :data="tableData"
+              :data="productionIndicatorCsvData"
               border
               style="width: 100%"
               align="center"
             >
-              <el-table-column prop="date" label="风电机组可利用率">
+              <el-table-column prop="EPActualTotal" label="实发电量">
               </el-table-column>
-              <el-table-column prop="name" label="能量利用率">
+              <el-table-column prop="TurbinePowerRate" label="风机能量利用率">
               </el-table-column>
-              <el-table-column prop="name" label="应发电量"> </el-table-column>
-              <el-table-column prop="name" label="实发电量"> </el-table-column>
-              <el-table-column prop="name" label="停机损失电量">
+              <el-table-column prop="EPLostStopPercent" label="停机损失百分比">
               </el-table-column>
-              <el-table-column prop="name" label="停机损失电量百分比">
+              <el-table-column prop="EPLostBadPercent" label="欠发损失百分比">
               </el-table-column>
-              <el-table-column prop="name" label="欠发损失电量">
+              <el-table-column
+                prop="EPLostPerformPercent"
+                label="功率曲线未达标损失百分比"
+              >
               </el-table-column>
-              <el-table-column prop="name" label="欠发损失电量百分比">
+              <el-table-column prop="EPLostLimitPercent" label="限电损失百分比">
               </el-table-column>
-              <el-table-column prop="name" label="限电损失电量">
+              <el-table-column prop="TurbineRunRate" label="风机可利用率">
               </el-table-column>
-              <el-table-column prop="name" label="限电损失电量百分比">
+              <el-table-column prop="mean_width" label="功率水平平均宽度">
               </el-table-column>
-              <el-table-column prop="name" label="功率曲线未达标损失电量">
+              <el-table-column prop="variance_width" label="功率水平方差">
               </el-table-column>
-              <el-table-column prop="name" label="功率曲线未达标损失电量百分比">
+              <el-table-column prop="WindSpeedAvr" label="平均风速">
+              </el-table-column>
+              <el-table-column prop="Thi" label="利用小时"> </el-table-column>
+              <el-table-column prop="Ws" label="功率曲线一致性系数">
+              </el-table-column>
+              <el-table-column
+                v-if="form.turbines !== '' && form.turbines !== null"
+                prop="Qp"
+                label="风场总发电量"
+              >
               </el-table-column>
               <el-table-column
-                prop="name"
-                label="功率散点不同水平功率带分布宽度"
+                v-if="form.turbines !== '' && form.turbines !== null"
+                prop="Thc"
+                label="风场等效利用小时"
               >
               </el-table-column>
               <el-table-column
-                prop="name"
-                label="功率散点水平平均功率带分布平均宽度"
+                v-if="form.turbines !== '' && form.turbines !== null"
+                prop="Rdr"
+                label="风场弃风率"
               >
               </el-table-column>
-              <el-table-column prop="name" label="功率散点分布异常特征值">
+              <el-table-column
+                v-if="form.turbines !== '' && form.turbines !== null"
+                prop="Qdr"
+                label="风场弃风电量"
+              >
               </el-table-column>
-              <el-table-column prop="name" label="平均风速"> </el-table-column>
             </el-table>
           </div>
         </el-col>
@@ -335,6 +347,21 @@
                   height="100%"
                 ></iframe>
               </el-col>
+              <el-col
+                :key="index + file.fileAddr + file.createTime + 'png'"
+                :span="24"
+                class="col_content"
+                :style="{
+                  display:
+                    getFileType(file.fileAddr) === 'image' ? 'block' : 'none',
+                }"
+              >
+                <img
+                  :src="file.fileAddr"
+                  alt=""
+                  style="width: 100%; height: 590px"
+                />
+              </el-col>
             </template>
           </template>
         </template>
@@ -406,7 +433,8 @@
           <template
             v-if="
               form.configAnalysis !== 'yaw_error' &&
-              form.configAnalysis !== 'power_curve'
+              form.configAnalysis !== 'power_curve' &&
+              form.configAnalysis !== 'production_indicator'
             "
           >
             <el-col :span="24">
@@ -438,7 +466,6 @@
                 ></iframe>
               </el-col>
             </template>
-
             <el-col :span="24">
               <div
                 style="font-weight: 700; font-size: 16px"
@@ -467,6 +494,21 @@
                   @load="iframeLoad(index + diagramRelations.length)"
                 ></iframe>
               </el-col>
+              <el-col
+                :key="index + file.fileAddr + file.createTime + 'png'"
+                :span="24"
+                class="col_content"
+                :style="{
+                  display:
+                    getFileType(file.fileAddr) === 'image' ? 'block' : 'none',
+                }"
+              >
+                <img
+                  :src="file.fileAddr"
+                  alt=""
+                  style="width: 100%; height: 590px"
+                />
+              </el-col>
             </template>
           </template>
         </template>
@@ -565,6 +607,8 @@ export default {
       flage: false,
       csvData: [], // 解析后的数据
       csvHeaders: [], // CSV 表头
+      productionIndicatorCsvData: [],
+      productionIndicatorCsvHeader: [],
       rules: {
         commentTypeName: {
           required: true,
@@ -691,6 +735,7 @@ export default {
       formData.append("batchCode", this.$route.query.batchCode);
       formData.append("analysisTypeCode", this.form.configAnalysis);
       formData.append("fieldEngineCode", this.form.turbines);
+
       //获取详情信息
       this.loading = true;
       try {
@@ -706,7 +751,6 @@ export default {
             response.data.length > 0 &&
             response.data[0].generalFiles) ||
           [];
-
         this.diagramRelations = [];
         this.diagramRelations =
           (response.data &&
@@ -727,9 +771,19 @@ export default {
               ? this.editableTabs[0].commentTypeCode
               : "";
         }
-        if (this.form.configAnalysis === "yaw_error") {
-          this.getCsvData(response.data[0].generalFiles[0].fileAddr);
+        if (
+          response.data[0] &&
+          response.data[0]?.generalFiles &&
+          response.data[0]?.generalFiles[0]?.fileAddr
+        ) {
+          const fileUrl = response.data[0].generalFiles[0].fileAddr;
+          if (this.form.configAnalysis === "yaw_error") {
+            this.fetchCsvData("yaw_error", fileUrl);
+          } else if (this.form.configAnalysis === "production_indicator") {
+            this.fetchCsvData("production_indicator", fileUrl);
+          }
         }
+
         //有功功率的数据处理
         if (this.form.configAnalysis === "power_curve") {
           try {
@@ -891,8 +945,8 @@ export default {
       // );
       return powerCurveTableData.flat();
     },
-    getCsvData(url) {
-      // 使用 axios 获取 CSV 文件
+    // 封装的获取 CSV 数据方法
+    fetchCsvData(analysisType, url) {
       axios
         .get(url, { responseType: "blob" }) // 确保数据以 blob 格式返回
         .then((response) => {
@@ -902,10 +956,20 @@ export default {
             Papa.parse(csvText, {
               header: true, // 使用 CSV 第一行作为键
               complete: (result) => {
-                this.csvHeaders = Object.keys(result.data[0]);
-                this.csvData = result.data.filter(
-                  (row) => Object.keys(row).length
-                ); // 过滤空行
+                // 根据分析类型设置不同的数据
+                if (analysisType === "yaw_error") {
+                  this.csvHeaders = Object.keys(result.data[0]);
+                  this.csvData = result.data.filter(
+                    (row) => Object.keys(row).length
+                  ); // 过滤空行
+                } else if (analysisType === "production_indicator") {
+                  this.productionIndicatorCsvHeader = Object.keys(
+                    result.data[0]
+                  );
+                  this.productionIndicatorCsvData = result.data.filter(
+                    (row) => Object.keys(row).length
+                  ); // 过滤空行
+                }
               },
               error: (error) => {
                 console.error("CSV 解析错误:", error);
@@ -1099,7 +1163,6 @@ export default {
 <style scoped lang="scss">
 .box-card {
   margin: 10px 0;
-  // box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
   width: 100%;
   font-size: 14px;
   .el-card__body {

+ 0 - 1
src/views/performance/components/custonAsCom/AssociatedFields.vue

@@ -301,7 +301,6 @@ export default {
           filterNodeData = this.filterDataRecursively(filterNodeData, 1);
           this.saveDatas(filterNodeData);
         } else {
-          console.log("error submit!!");
           return false;
         }
       });

+ 15 - 9
src/views/performance/components/custonAsCom/DatabaseTable.vue

@@ -1,8 +1,8 @@
 <!--
  * @Author: your name
  * @Date: 2024-10-28 17:43:21
- * @LastEditTime: 2024-12-26 09:28:12
- * @LastEditors: bogon
+ * @LastEditTime: 2025-01-03 12:35:03
+ * @LastEditors: milo-MBP
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/custonAsCom/DatabaseTable.vue
 -->
@@ -197,19 +197,25 @@ export default {
       grouped.forEach((checkChildNode, parentNode) => {
         output.push({ parentNode, checkChildNode });
       });
-      const response = await axios.post("/databaseApi/filterTablesData", {
-        database: { ...this.formLabelAlign },
-        filterData: output,
-      });
+      const response = await axios.post(
+        "/databaseApi/databaseApi/filterTablesData",
+        {
+          database: { ...this.formLabelAlign },
+          filterData: output,
+        }
+      );
       this.conversionData(response.data);
     },
     submitForm(formName) {
       this.$refs[formName].validate(async (valid) => {
         if (valid) {
           try {
-            const response = await axios.get("/databaseApi/tables", {
-              params: { ...this.formLabelAlign },
-            });
+            const response = await axios.get(
+              "/databaseApi/databaseApi/tables",
+              {
+                params: { ...this.formLabelAlign },
+              }
+            );
             // this.tableFieldMap = response.data;
             this.initializeTreeData(response.data);
             this.$emit("closeDialog");

+ 2 - 2
src/views/performance/components/custonAsCom/dataTable.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2024-10-28 16:46:38
- * @LastEditTime: 2024-12-26 09:13:11
+ * @LastEditTime: 2024-12-31 14:30:17
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/custonAsCom/dataTable.vue
@@ -124,7 +124,7 @@ export default {
     removeTab(targetName) {
       // 1. 在 tabData 中删除对应的 tab
       const index = this.tabData.findIndex((tab) => tab.fileId === targetName);
-      console.log(this.tabData, targetName, "targetName");
+
       if (index !== -1) {
         this.$confirm("此操作将永久删除该文件, 是否继续?", "提示", {
           confirmButtonText: "确定",

+ 172 - 40
src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/Heatmap.js

@@ -1,12 +1,134 @@
-/*
- * @Author: your name
- * @Date: 2024-11-28 10:31:21
- * @LastEditTime: 2024-12-26 09:56:47
- * @LastEditors: bogon
- * @Description: In User Settings Edit
- * @FilePath: /performance-test/src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/Heatmap.js
- */
+// /*
+//  * @Author: your name
+//  * @Date: 2024-11-28 10:31:21
+//  * @LastEditTime: 2024-12-26 17:26:25
+//  * @LastEditors: bogon
+//  * @Description: In User Settings Edit
+//  * @FilePath: /performance-test/src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/Heatmap.js
+//  */
+// import { filterData } from "../dargChartFIlter";
+// export function handleHeatmapPlotChartLogic(
+//   item,
+//   formLabelAlign,
+//   formFilterAlign,
+//   isFilter,
+//   type
+// ) {
+//   // 数据筛选逻辑
+//   if (isFilter === "filter") {
+//     const filterResult = formLabelAlign.Ydata.map((yItem, index) => ({
+//       label: yItem.label,
+//       id: yItem.id,
+//       data: yItem.data.map((val) => {
+//         const filters = formFilterAlign[index]?.filters || [];
+//         // 排除 null 数据和不符合筛选条件的数据
+//         return val === null ||
+//           (filters.length > 0 && !filters.includes(val[yItem.label]))
+//           ? null
+//           : val;
+//       }),
+//     }));
+//     // 条件筛选逻辑
+//     const filterList = filterResult.map((filteredItem, index) => {
+//       const filter = formFilterAlign[index];
+//       const { filterType1, filterType2, number1, number2 } = filter;
+
+//       if (
+//         (number1 === null || number1 === "") &&
+//         (number2 === null || number2 === "")
+//       ) {
+//         return {
+//           label: filteredItem.label,
+//           id: filteredItem.id,
+//           data: filteredItem.data,
+//         };
+//       } else {
+//         const filterDatas = filterData(
+//           filter,
+//           filteredItem.data,
+//           filteredItem.label
+//         );
+//         return {
+//           label: filteredItem.label,
+//           id: filteredItem.id,
+//           data: [...filterDatas],
+//         };
+//       }
+//     });
+//     item.Xdata = formLabelAlign.Xdata;
+//     item.Ydata = filterList;
+//   } else {
+//     item.Xdata = formLabelAlign.Xdata;
+//     item.Ydata = formLabelAlign.Ydata;
+//   }
+//   // 生成数据
+//   if (
+//     item.Xdata.length > 1 &&
+//     item.Xdata[1]?.data?.length > 0 &&
+//     item.Ydata.length > 0 &&
+//     item.Ydata[0]?.data?.length > 0
+//   ) {
+//     // 初始化 series 数据
+//     item.option.series = [];
+//     const xAxisData = item.Xdata[0].data
+//       .map((xitem) => xitem[item.Xdata[0].label])
+//       .filter((val) => val !== null && val !== "" && val !== undefined);
+//     const yAxisData = item.Xdata[1].data
+//       .map((xitem) => xitem[item.Xdata[1].label])
+//       .filter((val) => val !== null && val !== "" && val !== undefined);
+//     // 设置 x 和 y 轴标签
+//     item.option.xAxis = {
+//       ...item.option.xAxis,
+//       name: formLabelAlign.Xlable,
+//       data: xAxisData,
+//     };
+//     item.option.yAxis = {
+//       ...item.option.yAxis,
+//       name: formLabelAlign.Ylable,
+//       data: yAxisData,
+//     };
+//     // 初始化热力图数据
+//     const data1 = [];
+//     for (let z = 0; z < xAxisData.length; z++) {
+//       for (let i = 0; i < yAxisData.length; i++) {
+//         // 在 Ydata[0].data 中查找匹配的值
+//         const matchedValue = item.Ydata[0].data.find(
+//           (yval) =>
+//             yval !== null &&
+//             yval[item.Xdata[0].label] === xAxisData[z] &&
+//             yval[item.Xdata[1].label] === yAxisData[i]
+//         );
+//         // 如果找到匹配值,则取 Ydata[0].label 的值,否则为 null
+//         const value = matchedValue ? matchedValue[item.Ydata[0].label] : null;
+//         // 将值推入 data1
+//         data1.push([i, z, value]);
+//       }
+//     }
+//     // 转换数据结构(如有必要)
+//     const formattedData = data1.map((item) => [
+//       item[1],
+//       item[0],
+//       item[2] || "-",
+//     ]);
+
+//     item.option.series = [
+//       {
+//         type: "heatmap",
+//         data: formattedData,
+//         progressiveThreshold: 3000, // 当数据量超过3000时启用渐进式渲染
+//         progressive: true, // 启用渐进式渲染
+//         emphasis: {
+//           itemStyle: {
+//             shadowBlur: 10,
+//             shadowColor: "rgba(0, 0, 0, 0.5)",
+//           },
+//         },
+//       },
+//     ];
+//   }
+// }
 import { filterData } from "../dargChartFIlter";
+
 export function handleHeatmapPlotChartLogic(
   item,
   formLabelAlign,
@@ -14,6 +136,7 @@ export function handleHeatmapPlotChartLogic(
   isFilter,
   type
 ) {
+  console.log("1");
   // 数据筛选逻辑
   if (isFilter === "filter") {
     const filterResult = formLabelAlign.Ydata.map((yItem, index) => ({
@@ -28,10 +151,11 @@ export function handleHeatmapPlotChartLogic(
           : val;
       }),
     }));
+    console.log("2");
     // 条件筛选逻辑
     const filterList = filterResult.map((filteredItem, index) => {
-      const filter = formFilterAlign[index];
-      const { filterType1, filterType2, number1, number2 } = filter;
+      const { filterType1, filterType2, number1, number2 } =
+        formFilterAlign[index];
 
       if (
         (number1 === null || number1 === "") &&
@@ -44,7 +168,7 @@ export function handleHeatmapPlotChartLogic(
         };
       } else {
         const filterDatas = filterData(
-          filter,
+          formFilterAlign[index],
           filteredItem.data,
           filteredItem.label
         );
@@ -55,12 +179,14 @@ export function handleHeatmapPlotChartLogic(
         };
       }
     });
+
     item.Xdata = formLabelAlign.Xdata;
     item.Ydata = filterList;
   } else {
     item.Xdata = formLabelAlign.Xdata;
     item.Ydata = formLabelAlign.Ydata;
   }
+  console.log(item.Xdata, item.Ydata, "3");
   // 生成数据
   if (
     item.Xdata.length > 1 &&
@@ -70,53 +196,59 @@ export function handleHeatmapPlotChartLogic(
   ) {
     // 初始化 series 数据
     item.option.series = [];
-    const xAxisData = item.Xdata[0].data
-      .map((xitem) => xitem[item.Xdata[0].label])
-      .filter((val) => val !== null && val !== "" && val !== undefined);
-    const yAxisData = item.Xdata[1].data
-      .map((xitem) => xitem[item.Xdata[1].label])
-      .filter((val) => val !== null && val !== "" && val !== undefined);
-    // 设置 x 和 y 轴标签
+
+    // 提取 X 和 Y 轴数据
+    // 提取 X轴 和 Y轴 数据
+    const xAxisData = item.Xdata[0].data.map(
+      (xItem) => xItem[item.Xdata[0].label]
+    );
+    const yAxisData = item.Xdata[1].data.map(
+      (yItem) => yItem[item.Xdata[1].label]
+    );
+    console.log("4");
+    // 设置 ECharts 的 x 和 y 轴
     item.option.xAxis = {
       ...item.option.xAxis,
+      type: "category",
       name: formLabelAlign.Xlable,
       data: xAxisData,
     };
+
     item.option.yAxis = {
       ...item.option.yAxis,
+      type: "category",
       name: formLabelAlign.Ylable,
       data: yAxisData,
     };
-    // 初始化热力图数据
-    const data1 = [];
-    for (let z = 0; z < xAxisData.length; z++) {
-      for (let i = 0; i < yAxisData.length; i++) {
-        // 在 Ydata[0].data 中查找匹配的值
-        const matchedValue = item.Ydata[0].data.find(
-          (yval) =>
-            yval !== null &&
-            yval[item.Xdata[0].label] === xAxisData[z] &&
-            yval[item.Xdata[1].label] === yAxisData[i]
-        );
-        // 如果找到匹配值,则取 Ydata[0].label 的值,否则为 null
-        const value = matchedValue ? matchedValue[item.Ydata[0].label] : null;
-        // 将值推入 data1
-        data1.push([i, z, value]);
+    // 设置 x 和 y 轴标签
+    // 准备热力图数据
+    const heatmapData = [];
+
+    // 遍历每个 SalesID 和 PrdctID 的组合
+    for (let i = 0; i < yAxisData.length; i++) {
+      for (let j = 0; j < xAxisData.length; j++) {
+        // 找到对应的 Amount 值
+        const amountValue =
+          item.Ydata[0].data[j] && item.Ydata[0].data[i]
+            ? item.Ydata[0].data[j][item.Ydata[0].label]
+            : null;
+
+        // 如果找到有效值,则将其加入热力图数据中
+        if (amountValue !== null || amountValue !== undefined) {
+          heatmapData.push([i, j, amountValue]); // [yIndex, xIndex, value]
+        }
       }
     }
-    // 转换数据结构(如有必要)
-    const formattedData = data1.map((item) => [
-      item[1],
-      item[0],
-      item[2] || "-",
-    ]);
+    console.log(heatmapData, "heatmapData");
 
+    // 生成热力图数据
     item.option.series = [
       {
         type: "heatmap",
-        data: formattedData,
+        data: heatmapData,
         progressiveThreshold: 3000, // 当数据量超过3000时启用渐进式渲染
         progressive: true, // 启用渐进式渲染
+        renderMode: "webgl", // 启用 WebGL 渲染
         emphasis: {
           itemStyle: {
             shadowBlur: 10,

+ 2 - 1
src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/boxPlot.js

@@ -1,7 +1,7 @@
 /*
  * @Author: your name
  * @Date: 2024-11-27 15:20:57
- * @LastEditTime: 2024-12-26 09:56:13
+ * @LastEditTime: 2024-12-27 15:11:52
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/boxPlot.js
@@ -112,6 +112,7 @@ export function handleBoxPlotChartLogic(
       type: "boxplot",
       progressiveThreshold: 3000, // 当数据量超过3000时启用渐进式渲染
       progressive: true, // 启用渐进式渲染
+      renderMode: "webgl", // 启用 WebGL 渲染
       data: boxplotData,
     });
   }

+ 31 - 31
src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/pareto.js

@@ -1,7 +1,7 @@
 /*
  * @Author: your name
  * @Date: 2024-11-27 09:59:10
- * @LastEditTime: 2024-12-26 09:57:24
+ * @LastEditTime: 2024-12-31 11:08:57
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/pareto.js
@@ -41,34 +41,34 @@ function generateSeriesData(dataSource, xData, yData, labelKey) {
       progressive: true, // 启用渐进式渲染
       showBackground: true,
       smooth: labelKey === "line" ? true : undefined,
-      lineStyle:
-        labelKey === "line"
-          ? {
-              color: "#d14a61",
-            }
-          : undefined,
-      itemStyle:
-        labelKey === "bar"
-          ? {
-              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-                { offset: 0, color: "#83bff6" },
-                { offset: 0.5, color: "#188df0" },
-                { offset: 1, color: "#188df0" },
-              ]),
-            }
-          : undefined,
-      emphasis: {
-        itemStyle:
-          labelKey === "bar"
-            ? {
-                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-                  { offset: 0, color: "#2378f7" },
-                  { offset: 0.7, color: "#2378f7" },
-                  { offset: 1, color: "#83bff6" },
-                ]),
-              }
-            : undefined,
-      },
+      // lineStyle:
+      //   labelKey === "line"
+      //     ? {
+      //         color: "#d14a61",
+      //       }
+      //     : undefined,
+      // itemStyle:
+      //   labelKey === "bar"
+      //     ? {
+      //         color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+      //           { offset: 0, color: "#83bff6" },
+      //           { offset: 0.5, color: "#188df0" },
+      //           { offset: 1, color: "#188df0" },
+      //         ]),
+      //       }
+      //     : undefined,
+      // emphasis: {
+      //   itemStyle:
+      //     labelKey === "bar"
+      //       ? {
+      //           color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+      //             { offset: 0, color: "#2378f7" },
+      //             { offset: 0.7, color: "#2378f7" },
+      //             { offset: 1, color: "#83bff6" },
+      //           ]),
+      //         }
+      //       : undefined,
+      // },
       data: item.data
         ?.map((val, valInd) => {
           if (val === null) {
@@ -77,8 +77,8 @@ function generateSeriesData(dataSource, xData, yData, labelKey) {
           }
           // 返回有效的散点数据
           return [
-            xData[ind]?.data[valInd][xData[ind].label], // x轴数据
-            val[item.label], // y轴数据
+            String(xData[ind]?.data[valInd][xData[ind].label]), // x轴数据
+            String(val[item.label]), // y轴数据
           ];
         })
         .filter(Boolean), // 使用 filter 去除 null 值

+ 2 - 1
src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/pie.js

@@ -1,7 +1,7 @@
 /*
  * @Author: your name
  * @Date: 2024-11-26 16:33:45
- * @LastEditTime: 2024-12-26 09:57:53
+ * @LastEditTime: 2025-01-02 16:22:21
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/pie.js
@@ -69,6 +69,7 @@ export function handlePieChartLogic(
       radius: "60%",
       progressiveThreshold: 3000, // 当数据量超过3000时启用渐进式渲染
       progressive: true, // 启用渐进式渲染
+      renderMode: "webgl", // 启用 WebGL 渲染
       data:
         yItem.data &&
         yItem.data.map((val, valIndex) => {

+ 24 - 32
src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/radar.js

@@ -1,7 +1,7 @@
 /*
  * @Author: your name
  * @Date: 2024-11-21 09:40:55
- * @LastEditTime: 2024-12-26 09:58:03
+ * @LastEditTime: 2024-12-27 15:12:28
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/radar.js
@@ -73,27 +73,13 @@ export function handleRadarChartLogic(
         data: fitem.data.filter((fval) => fval !== null),
       };
     });
-    console.log(filterList, item.Ydata, "filterList");
   } else {
     item.Xdata = formLabelAlign.Xdata;
     item.Ydata = formLabelAlign.Ydata;
   }
-
-  // 设置纬度(indicator)并去重
-  if (item.Xdata.length > 0 && item.Xdata[0].data?.length > 0) {
-    const radarIndicators = Array.from(
-      new Set(
-        item.Xdata.flatMap((xItem) =>
-          xItem.data.map((xVal) => xVal[xItem.label])
-        )
-      )
-    )
-      .filter((name) => name !== undefined) // 过滤掉 undefined
-      .map((name) => ({ name }));
-
-    item.option.radar.indicator = radarIndicators;
-  }
-
+  item.option.radar.indicator = item.Xdata[0].data.map((items) => ({
+    name: items[item.Xdata[0].label],
+  }));
   // 设置系列(series),对相同纬度的数据值进行求和
   if (
     item.Ydata.length > 0 &&
@@ -102,33 +88,39 @@ export function handleRadarChartLogic(
     item.Xdata[0]?.data?.length > 0
   ) {
     const seriesData = item.Ydata.map((yItem) => {
-      const summedValues = item.option.radar.indicator.map((indicator) => {
-        const filteredValues = yItem.data.filter(
-          (yVal) => yVal[item.Xdata[0].label] === indicator.name
-        );
-
-        // 跳过 null 和非数字值
-        return filteredValues.reduce((sum, val) => {
-          const numericValue = Number(val[yItem.label]);
-          return !isNaN(numericValue) ? sum + numericValue : sum;
-        }, 0);
-      });
-
       return {
         name: yItem.label,
-        value: summedValues,
+        value: yItem.data.map((yObj) =>
+          !isNaN(Number(yObj[yItem.label])) ? Number(yObj[yItem.label]) : 0
+        ),
       };
     });
-
+    console.log(seriesData, "seriesData");
     item.option.series = [
       {
         type: "radar",
         progressiveThreshold: 3000, // 当数据量超过3000时启用渐进式渲染
         progressive: true, // 启用渐进式渲染
         data: seriesData,
+        renderMode: "webgl", // 启用 WebGL 渲染
       },
     ];
   } else {
     item.option.series = []; // 无数据时清空系列
   }
+  item.option.tooltip = {
+    trigger: "item", // 鼠标悬停时触发 tooltip
+    axisPointer: {
+      type: "shadow", // 使用阴影指示
+    },
+    formatter: function (params) {
+      // 获取当前鼠标悬停项对应的维度名称和数据值
+      const indicatorName = params.seriesName; // 获取 series 的名称
+      const indicatorIndex = params.dataIndex; // 获取当前维度的索引
+      const value = params.value[indicatorIndex]; // 获取当前维度的值
+
+      // 返回自定义 tooltip 内容
+      return `${params.name}: ${value}`; // 只显示当前维度的值
+    },
+  };
 }

+ 2 - 1
src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/roseChart.js

@@ -1,7 +1,7 @@
 /*
  * @Author: your name
  * @Date: 2024-11-26 16:33:38
- * @LastEditTime: 2024-12-26 09:58:11
+ * @LastEditTime: 2024-12-27 15:12:41
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/roseChart.js
@@ -79,6 +79,7 @@ export function handleRoseChartChartLogic(
       coordinateSystem: "polar",
       progressiveThreshold: 3000, // 当数据量超过3000时启用渐进式渲染
       progressive: true, // 启用渐进式渲染
+      renderMode: "webgl", // 启用 WebGL 渲染
       data:
         yitem.data &&
         yitem.data.map((val) => {

+ 5 - 6
src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/sankeyDiagram.js

@@ -1,7 +1,7 @@
 /*
  * @Author: your name
  * @Date: 2024-11-27 17:15:51
- * @LastEditTime: 2024-12-26 09:58:23
+ * @LastEditTime: 2024-12-31 14:25:18
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/sankeyDiagram.js
@@ -62,10 +62,9 @@ export function handleSankeyDiagramPlotChartLogic(
     item.Xdata = formLabelAlign.Xdata;
     item.Ydata = formLabelAlign.Ydata;
   }
-  console.log(item.Xdata, item.Ydata, "item.Xdata,item.Ydata");
   // 设置 X 轴
   const xData = formLabelAlign.Xdata.flatMap((item) =>
-    item.data.map((val) => val[item.label])
+    item.data.map((val) => val[item.label] + "")
   ).filter((val) => val !== null && val !== undefined && val !== ""); // 排除 null 和 undefined
   // 对 xData 去重并转换为 [{name: ''}, {name: ''}] 的格式
   const uniqueXData = [...new Set(xData)].map((name) => ({ name }));
@@ -95,13 +94,12 @@ export function handleSankeyDiagramPlotChartLogic(
         );
         // 检查所有值是否有效
         sankeyDiagramData.push({
-          source: values[0],
-          target: values[1],
+          source: String(values[0]),
+          target: String(values[1]),
           value: values[2],
         });
       }
     }
-    console.log(sankeyDiagramData, "sankeyDiagramData");
     item.option.series = [
       {
         type: "sankey",
@@ -111,6 +109,7 @@ export function handleSankeyDiagramPlotChartLogic(
         },
         progressiveThreshold: 3000, // 当数据量超过3000时启用渐进式渲染
         progressive: true, // 启用渐进式渲染
+        renderMode: "webgl", // 启用 WebGL 渲染
         data: uniqueXData,
         links: sankeyDiagramData,
         lineStyle: {

+ 2 - 1
src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/stackedBar.js

@@ -1,7 +1,7 @@
 /*
  * @Author: your name
  * @Date: 2024-11-27 09:36:28
- * @LastEditTime: 2024-12-26 09:59:03
+ * @LastEditTime: 2024-12-27 15:13:05
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartLogic/modules/stackedBar.js
@@ -82,6 +82,7 @@ export function handlestackedBarChartLogic(
         stack: "d",
         progressiveThreshold: 3000, // 当数据量超过3000时启用渐进式渲染
         progressive: true, // 启用渐进式渲染
+        renderMode: "webgl", // 启用 WebGL 渲染
         data: item.data.map(
           (data) => parseFloat(data !== null && data[item.label]) || 0
         ), // 将数据转换为数值

+ 37 - 23
src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/chartTitle.vue

@@ -22,7 +22,7 @@
               placement="bottom-start"
               v-if="
                 curEdit.type === 'scatter' ||
-                curEdit.type === 'radar' ||
+                // curEdit.type === 'radar' ||
                 curEdit.type === 'sankeyDiagram' ||
                 curEdit.type === 'Heatmap'
               "
@@ -74,7 +74,7 @@
               <el-tooltip
                 v-if="
                   curEdit.type === 'scatter' ||
-                  curEdit.type === 'radar' ||
+                  // curEdit.type === 'radar' ||
                   curEdit.type === 'sankeyDiagram' ||
                   curEdit.type === 'Heatmap'
                 "
@@ -195,15 +195,19 @@
           "
         >
           <span>线纬度标签</span>
-          <!-- <el-tooltip content="添加纬度" placement="bottom-start">
+          <el-tooltip
+            content="添加纬度"
+            placement="bottom-start"
+            v-if="curEdit.type === 'Cp'"
+          >
             <i
               @click="
-                formLabelAlign.LineXdata.push({ lable: '', data: [], id: '' })
+                formLabelAlign.LineXdata.push({ label: '', data: [], id: '' })
               "
               class="el-icon-circle-plus-outline"
               style="font-size: 20px"
             ></i>
-          </el-tooltip> -->
+          </el-tooltip>
         </div>
         <template v-for="(item, ind) in formLabelAlign.LineXdata">
           <div class="attributeItemData">
@@ -222,11 +226,12 @@
                 :key="item.id + ind"
               ></el-option>
             </el-select>
-            <!-- <el-tooltip
+            <el-tooltip
+              v-if="curEdit.type === 'Cp'"
               :content="
                 formLabelAlign.LineXdata.length <= 1
-                  ? '该指标不可删除,最少存在一组指标'
-                  : '删除该指标'
+                  ? '该维度不可删除,最少存在一组指标'
+                  : '删除该维度指标'
               "
               placement="bottom-start"
             >
@@ -240,7 +245,7 @@
                   style="font-size: 16px; color: red; padding: 0 0 0 10px"
                 ></i
               ></el-button>
-            </el-tooltip> -->
+            </el-tooltip>
           </div>
         </template>
       </el-form-item>
@@ -326,7 +331,7 @@
           >
             <i
               @click="
-                formLabelAlign.BarXdata.push({ lable: '', data: [], id: '' })
+                formLabelAlign.BarXdata.push({ label: '', data: [], id: '' })
               "
               class="el-icon-circle-plus-outline"
               style="font-size: 20px"
@@ -449,7 +454,7 @@
             <i
               @click="
                 formLabelAlign.ScatterXdata.push({
-                  lable: '',
+                  label: '',
                   data: [],
                   id: '',
                 })
@@ -714,6 +719,7 @@ export default {
   data() {
     return {
       value: "all",
+      checkList: [],
       formFilterAlign: [
         {
           filters: [],
@@ -814,7 +820,6 @@ export default {
       const { type } = this.curEdit;
       const { BarYdata, LineYdata, ScatterYdata, Ydata } = this.formLabelAlign;
       if (type === "pareto") {
-        console.log([...BarYdata, ...LineYdata], "[...BarYdata, ...LineYdata]");
         return [...LineYdata, ...BarYdata];
       } else if (type === "Cp") {
         return [...LineYdata, ...ScatterYdata];
@@ -856,7 +861,12 @@ export default {
     dataBaseCheckList: {
       handler(newVal) {
         this.disabled = newVal.length === 0 ? true : false;
-        this.selectData = newVal;
+        const objData = newVal.map((item) => item.fileObj);
+
+        const flattenedArray = objData.reduce((acc, subArray) => {
+          return acc.concat(subArray);
+        }, []);
+        this.selectData = flattenedArray;
       },
       immediate: true, // 组件加载时立即检查
       deep: true, // 深度监听
@@ -871,7 +881,6 @@ export default {
     handleLatitude(type) {
       switch (type) {
         case "init":
-          console.log(this.curEdit.type, this.formLabelAlign.Xdata.length);
           if (
             (this.curEdit.type === "sankeyDiagram" ||
               this.curEdit.type === "Heatmap") &&
@@ -882,12 +891,11 @@ export default {
             );
             return;
           }
-          this.formLabelAlign.Xdata.push({ lable: "", data: [], id: "" });
+          this.formLabelAlign.Xdata.push({ label: "", data: [], id: "" });
           break;
       }
     },
     handleMetrics(type) {
-      console.log(type, "tianjia yige");
       switch (type) {
         case "init":
           if (
@@ -900,7 +908,7 @@ export default {
             return;
           }
 
-          this.formLabelAlign.Ydata.push({ lable: "", data: [], id: "" });
+          this.formLabelAlign.Ydata.push({ label: "", data: [], id: "" });
           this.formFilterAlign.push({
             filters: [],
             filterType1: "",
@@ -911,7 +919,7 @@ export default {
           });
           break;
         case "bar":
-          this.formLabelAlign.BarYdata.push({ lable: "", data: [], id: "" });
+          this.formLabelAlign.BarYdata.push({ label: "", data: [], id: "" });
           this.formFilterAlign.push({
             filters: [],
             filterType1: "",
@@ -922,7 +930,7 @@ export default {
           });
           break;
         case "line":
-          this.formLabelAlign.LineYdata.push({ lable: "", data: [], id: "" });
+          this.formLabelAlign.LineYdata.push({ label: "", data: [], id: "" });
           this.formFilterAlign.push({
             filters: [],
             filterType1: "",
@@ -934,7 +942,7 @@ export default {
           break;
         case "scatter":
           this.formLabelAlign.ScatterYdata.push({
-            lable: "",
+            label: "",
             data: [],
             id: "",
           });
@@ -1014,10 +1022,18 @@ export default {
     },
     updateAxisData(axisData) {
       axisData.forEach((item, index) => {
-        const selected = this.selectData.find(
+        let selected = this.selectData.find(
           (val) => (val && val.id) === (item && item.id)
         );
+
         if (selected) {
+          this.dataBaseCheckList.map((baseItem) => {
+            if (selected.parentId === baseItem.parentId) {
+              selected.fileData = baseItem.fileData.map((baseObj) => ({
+                [selected.label]: baseObj[selected.label],
+              }));
+            }
+          });
           Vue.set(axisData, index, {
             ...item,
             label: selected.label || "",
@@ -1035,7 +1051,6 @@ export default {
           break;
         case "bar":
           this.formLabelAlign.BarYdata.splice(index, 1); // 删除当前项
-
           break;
         case "line":
           this.formLabelAlign.LineYdata.splice(index, 1); // 删除当前项
@@ -1075,7 +1090,6 @@ export default {
       if (this.$refs.form) {
         this.$refs.form.resetFields();
       }
-      console.log(this.formFilterAlign, "this.formFilterAlign 默认");
       // 图表内容回显图表配置赋值
       if (this.curEdit && this.curEdit.option) {
         // 使用 this.$set 替代直接赋值

+ 2 - 1
src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/configFn.js

@@ -1,7 +1,7 @@
 /*
  * @Author: your name
  * @Date: 2024-11-12 09:27:50
- * @LastEditTime: 2024-12-26 09:55:59
+ * @LastEditTime: 2024-12-27 15:11:28
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/custonAsCom/dragChart/components/chartConfig/form/configFn.js
@@ -30,6 +30,7 @@ export const getFormattedSeries = (data, chartType) => {
       type: chartType,
       progressiveThreshold: 3000, // 当数据量超过3000时启用渐进式渲染
       progressive: true, // 启用渐进式渲染
+      renderMode: "webgl", // 启用 WebGL 渲染
       data: item.data.map(
         (data) => parseFloat(data !== null && data[item.label]) || 0
       ), // 将数据转换为数值

+ 3 - 4
src/views/performance/components/custonAsCom/dragChart/components/chartsContent.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2024-11-01 10:14:11
- * @LastEditTime: 2024-12-24 14:35:12
+ * @LastEditTime: 2024-12-31 14:54:06
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/performance/components/custonAsCom/dragChart/components/chartsContent.vue
@@ -94,7 +94,6 @@ export default {
       screenWidth: 0,
     };
   },
-  created() {},
   watch: {
     addChartType(type) {
       if (type !== "") {
@@ -128,8 +127,8 @@ export default {
       "updateChart",
       "deleteChart",
       "setCurEdit",
-      "recordOriginChartList",
-      "restoreOriginChartList",
+      // "recordOriginChartList",
+      // "restoreOriginChartList",
     ]),
     // ruler-tool 组件标尺滚动事件
     handleScroll({ scrollLeft, scrollTop }) {

+ 2 - 9
src/views/performance/components/custonAsCom/dragChart/components/chartsData.vue

@@ -46,7 +46,6 @@ export default {
     },
     triggerGetData: function (newVal) {
       if (newVal) {
-        console.log(newVal, "newVal chartData");
         this.getAllData();
         // 重置 triggerGetData 状态为 false
         this.setTriggerGetData(false);
@@ -60,7 +59,6 @@ export default {
     ...mapMutations("dragChart", ["updateDataBase", "setTriggerGetData"]),
     async getIndexDbData() {
       const jsonData = await getDataFromIndexedDB();
-      console.log(jsonData, "jsonData  chartData");
       this.data = jsonData.map((item) => {
         return {
           label: item.filename,
@@ -128,13 +126,8 @@ export default {
               });
             }
           });
-        console.log(newDatas, "newDatas");
-        // checkData=[{fileData:[],fileObj:[{}],parentId:''}]
-        this.updateDataBase(
-          this.$refs.tree
-            .getCheckedNodes()
-            .filter((obj) => obj.children === undefined)
-        );
+
+        this.updateDataBase(newDatas);
       }
     },
     // 父节点复选框改变时递归设置子节点状态

+ 5 - 3
src/views/performance/components/custonAsCom/luckySheet.vue

@@ -183,9 +183,11 @@ export default {
       await initDatabase()
         .then((database) => {
           allFileData.forEach((fileData) => {
-            storeSetData(database, "files", "fileDataArray", fileData, () => {
-              console.log("数据存储成功:", fileData.filename);
-            });
+            if (fileData && fileData.fileData.length > 0) {
+              storeSetData(database, "files", "fileDataArray", fileData, () => {
+                console.log("数据存储成功:", fileData.filename);
+              });
+            }
           });
           // 跳转到分析页面
           this.$router.push("/home/performance/customAnalysis");

+ 15 - 13
src/views/performance/customAnalysis.vue

@@ -206,7 +206,6 @@
     ></DatabaseTable>
   </div>
 </template>
-
 <script>
 import DataTable from "./components/custonAsCom/dataTable.vue";
 import DatabaseTable from "./components/custonAsCom/DatabaseTable.vue";
@@ -283,7 +282,7 @@ export default {
   watch: {
     updateTriggerGetData: function (newVal) {
       if (newVal) {
-        console.log(newVal, "newVal dataTable");
+        // console.log(newVal, "newVal dataTable");
         this.setUpdateTriggerGetData(false);
         this.$refs.dataTableRef.getIndexDbData();
         // 重置 triggerGetData 状态为 false
@@ -300,7 +299,7 @@ export default {
         const request = indexedDB.open("FileDataDB", 2); // 使用较高版本
         request.onupgradeneeded = (event) => {
           const db = event.target.result;
-          console.log("升级数据库,创建对象存储。");
+          // console.log("升级数据库,创建对象存储。");
 
           // 检查是否存在对象存储
           if (!db.objectStoreNames.contains("files")) {
@@ -309,7 +308,7 @@ export default {
         };
         request.onsuccess = async (event) => {
           this.db = event.target.result;
-          console.log("数据库已成功初始化。");
+          // console.log("数据库已成功初始化。");
           resolve();
         };
         request.onerror = (event) => {
@@ -331,7 +330,7 @@ export default {
           })),
         };
       });
-      console.log(this.options, "调用数据");
+      // console.log(this.options, "调用数据");
     },
     async submitComputedFn(formName) {
       this.loading = true;
@@ -419,13 +418,16 @@ export default {
     //调用算法接口
     async fetchAlgorithmData(regionData) {
       try {
-        const res = await axios.post("/sAlgorithm/CalculateFeatures/", {
-          data: regionData,
-          start_index:
-            this.ruleForm.min !== null ? Number(this.ruleForm.min) : null,
-          end_index:
-            this.ruleForm.max !== null ? Number(this.ruleForm.max) : null,
-        });
+        const res = await axios.post(
+          "/sAlgorithm/sAlgorithm/CalculateFeatures/",
+          {
+            data: regionData,
+            start_index:
+              this.ruleForm.min !== null ? Number(this.ruleForm.min) : null,
+            end_index:
+              this.ruleForm.max !== null ? Number(this.ruleForm.max) : null,
+          }
+        );
         return JSON.parse(res.data, "res");
       } catch (error) {
         console.error("算法接口调用失败:", error);
@@ -533,7 +535,7 @@ export default {
       const formData = new FormData();
       formData.append("file", file);
       // 使用 axios 自定义上传逻辑
-      console.log("自定义上传", file.name);
+      // console.log("自定义上传", file.name);
     },
     // 验证并处理文件变化
     validateAndHandleChange(fileList) {

+ 6 - 12
vue.config.js

@@ -88,15 +88,6 @@ module.exports = {
         target: "http://106.120.102.238:18080/ImportDataDev", //WTL外网目标地址
         changeOrigin: true,
         pathRewrite: {
-          "^/ETLapi": "", // 去掉 /WZLapi 前缀
-        },
-      },
-      // 文佳
-      "/WJapi": {
-        // target: "http://192.168.50.235:8888", // WZLapi 内网 目标地址
-        target: "http://106.120.102.238:18888", // WZLapi 内网 目标地址
-        changeOrigin: true,
-        pathRewrite: {
           "^/WJapi": "", // 去掉 /WZLapi 前缀
         },
         onProxyReq(proxyReq, req, res) {
@@ -105,7 +96,8 @@ module.exports = {
       },
       // 数据转换亮亮
       "/transDataWeb": {
-        target: "http://192.168.50.241:9000/trans_data_web",
+        // target: "http://192.168.50.241:9000/trans_data_web",//生产
+        target: "http://192.168.50.235/transDataWeb", //测试
         changeOrigin: true,
         pathRewrite: {
           "^/transDataWeb": "", // 去掉 /transDataWeb 前缀
@@ -113,7 +105,8 @@ module.exports = {
       },
       //自定义算法文佳
       "/sAlgorithm": {
-        target: "http://192.168.50.235:8666", // 目标地址
+        // target: "http://192.168.50.235:8666", // 目标地址
+        target: "http://106.120.102.238:58880",
         changeOrigin: true,
         pathRewrite: {
           "^/sAlgorithm": "", // 如果后端需要 `/api` 前缀
@@ -121,7 +114,8 @@ module.exports = {
       },
       //nodejs 数据库数据
       "/databaseApi": {
-        target: "http://192.168.50.234:3000",
+        // target: "http://192.168.50.234:3000",
+        target: "http://106.120.102.238:58880",
         changeOrigin: true,
         pathRewrite: {
           "^/databaseApi": "", // 去掉 /databaseApi 前缀