Просмотр исходного кода

联调自定义算法函数接口

liujiejie 1 год назад
Родитель
Сommit
9d7a03e2f7

Разница между файлами не показана из-за своего большого размера
+ 22276 - 20
package-lock.json


+ 2 - 0
package.json

@@ -20,10 +20,12 @@
     "el-tree-select": "^3.1.14",
     "element-ui": "^2.15.14",
     "file-saver": "^2.0.5",
+    "flatted": "^3.3.2",
     "happypack": "^5.0.1",
     "jszip": "^3.10.1",
     "luckysheet": "^2.1.13",
     "ol": "^9.2.3",
+    "pako": "^2.1.0",
     "papaparse": "^5.4.1",
     "plotly.js-dist": "^2.34.0",
     "plotly.js-dist-min": "^2.34.0",

+ 26 - 1
src/api/dataManage.js

@@ -1,12 +1,37 @@
 /*
  * @Author: your name
  * @Date: 2024-06-04 09:48:21
- * @LastEditTime: 2024-07-18 09:31:19
+ * @LastEditTime: 2024-11-29 10:58:41
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /dashengmag/performance-test/src/api/dataManage.js
  */
 import request from "@/utils/request";
+// /waveDatatransfer/dataTransfer
+//查询振动数据转换数组
+export function getDataTransfer(data) {
+  return request({
+    url: "/energy-manage-service/waveDataTransfer/queryDataTransfer",
+    method: "get",
+    params: data,
+  });
+}
+// 转换、重新转换/energy-manage-service/waveDatatransfer/dataTransfer
+export function DataTransfer(data) {
+  return request({
+    url: "/energy-manage-service/waveDatatransfer/dataTransfer",
+    method: "post",
+    data,
+  });
+}
+//新增振动数据转换/energy-manage-service/waveDataTransfer/addDataTransfer
+export function addDataTransfer(data) {
+  return request({
+    url: "/energy-manage-service/waveDataTransfer/addDataTransfer",
+    method: "post",
+    data,
+  });
+}
 //查询转换数组
 export function queryDataTransferGroup(data) {
   return request({

+ 15 - 0
src/api/dragChart.js

@@ -0,0 +1,15 @@
+/*
+ * @Author: your name
+ * @Date: 2024-11-29 14:33:04
+ * @LastEditTime: 2024-11-29 14:36:00
+ * @LastEditors: bogon
+ * @Description: In User Settings Edit
+ * @FilePath: /performance-test/src/api/dragChart.js
+ */
+// export function DataTransfer(data) {
+//   return request({
+//     url: "/apiAlgorithm/calculate-features",
+//     method: "post",
+//     data,
+//   });
+// }

+ 11 - 4
src/main.js

@@ -32,10 +32,8 @@ Vue.prototype.$qs = qs;
 // Vue.prototype.$tinymce = tinymce;
 
 // dialog拖拽全屏
-import dialogDrag from './views/health/dialogDrag';
-Vue.directive('dialogDrag', dialogDrag);
-
-
+import dialogDrag from "./views/health/dialogDrag";
+Vue.directive("dialogDrag", dialogDrag);
 
 Vue.use(ElementUI);
 // 引入tailwind
@@ -71,8 +69,17 @@ Vue.prototype.$formatDateTWO = function (timestamp) {
   // const seconds = String(date.getSeconds()).padStart(2, "0");:${seconds}
   return `${year}-${month}-${day} ${hours}:${minutes}`;
 };
+
+// 路由导航守卫
+router.beforeEach((to, from, next) => {
+  if (from.path === "/home/performance/customAnalysis") {
+    store.commit("dragChart/clearchart");
+  }
+  next();
+});
 // 监听页面刷新或关闭事件
 window.addEventListener("beforeunload", () => {
+  console.log("调用了dragChart/clearchart");
   // 调用清空 Vuex 仓库的 Action
   store.commit("dragChart/clearchart");
 });

+ 7 - 3
src/store/dragChart.js

@@ -1,7 +1,10 @@
 import { SCALE } from "@/assets/js/constants/config.js";
 import { Message } from "element-ui";
-import { clearAllDataFromIndexedDB } from "@/utils/indexedDb";
-import { saveData, getData } from "@/utils/indexedDb";
+import {
+  clearAllDataFromIndexedDB,
+  clearMyIndexedDBIndexedDB,
+} from "@/utils/indexedDb";
+
 const _ = require("lodash");
 
 export default {
@@ -41,7 +44,8 @@ export default {
         formFilterAlign: [],
       };
       //清空indexeddb 数据库
-      // clearAllDataFromIndexedDB();
+      clearAllDataFromIndexedDB();
+      clearMyIndexedDBIndexedDB();
       // 遍历重置每个字段
       Object.keys(resetState).forEach((key) => {
         state[key] = resetState[key];

+ 33 - 2
src/utils/indexedDb.js

@@ -93,7 +93,7 @@ export async function getDataFromIndexedDB() {
   });
 }
 
-// 清除整个对象存储
+// 清除 FileDataDB整个对象存储
 export async function clearAllDataFromIndexedDB() {
   return new Promise((resolve, reject) => {
     const versionRequest = indexedDB.open("FileDataDB");
@@ -140,7 +140,6 @@ export async function clearAllDataFromIndexedDB() {
         reject(event.target.error);
       };
     };
-
     versionRequest.onerror = (event) => {
       console.error("Failed to retrieve database version:", event.target.error);
       reject(event.target.error);
@@ -148,6 +147,38 @@ export async function clearAllDataFromIndexedDB() {
   });
 }
 
+// 清除 myIndexedDB整个对象存储
+
+export const clearMyIndexedDBIndexedDB = () => {
+  const dbName = "myIndexedDB";
+
+  const request = indexedDB.open(dbName);
+
+  request.onsuccess = (event) => {
+    const db = event.target.result;
+
+    const transaction = db.transaction(db.objectStoreNames, "readwrite");
+
+    for (const storeName of db.objectStoreNames) {
+      if (storeName.startsWith("vuexData")) {
+        const objectStore = transaction.objectStore(storeName);
+        objectStore.clear().onsuccess = () => {
+          console.log(`Cleared all data in ${storeName}`);
+        };
+      }
+    }
+
+    transaction.oncomplete = () => {
+      console.log("All vuexData tables cleared.");
+      db.close();
+    };
+  };
+
+  request.onerror = (event) => {
+    console.error("Failed to open IndexedDB:", event.target.error);
+  };
+};
+
 //往indexedDB 某一个表里添加一条数据
 export async function storeSetData(db, storeName, key, newFileData, callback) {
   if (!db) {

+ 1 - 0
src/utils/request.js

@@ -15,6 +15,7 @@ const writeList = ["/api/energy-manage-service/sysuserinfo/open/userLogin"];
  */
 service.interceptors.request.use(
   (config) => {
+    console.log(config, "请求发送了config");
     if (!writeList.includes(config.url)) {
       const token = JSON.parse(sessionStorage.getItem("vuex"))?.auth?.userInfo
         ?.token;

+ 69 - 9
src/utils/vuexIndexedDBPlugin.js

@@ -1,5 +1,15 @@
 import { saveData, getData, openDB } from "@/utils/indexedDb";
-
+import { stringify, parse } from "flatted"; // 用于处理循环引用
+import pako from "pako";
+import { Message } from "element-ui";
+// 通用分片函数
+const splitIntoChunks = (data, chunkSize) => {
+  const chunks = [];
+  for (let i = 0; i < data.length; i += chunkSize) {
+    chunks.push(data.slice(i, i + chunkSize));
+  }
+  return chunks;
+};
 const vuexIndexedDBPlugin = (store) => {
   const dbName = "vuexDB";
   const keyName = "vuexState";
@@ -31,14 +41,64 @@ const vuexIndexedDBPlugin = (store) => {
 
   // 订阅 Vuex mutations,每次状态变更时保存到 IndexedDB
   store.subscribe((mutation, state) => {
-    const serializableState = filterState(state);
-    saveData(dbName, keyName, serializableState)
-      .then(() => {
-        console.log(`Mutation "${mutation.type}" saved state to IndexedDB`);
-      })
-      .catch((error) => {
-        console.error("Failed to save state to IndexedDB:", error);
-      });
+    if (mutation.type.startsWith("dragChart/")) {
+      const dragChartState = state.dragChart;
+
+      try {
+        const cleanedState = JSON.parse(
+          JSON.stringify(dragChartState, (key, value) => {
+            if (
+              typeof value === "function" ||
+              value instanceof HTMLElement ||
+              value === undefined
+            ) {
+              return undefined;
+            }
+            return value;
+          })
+        );
+
+        // 压缩或分片存储
+        const chunkSize = 500;
+        if (
+          cleanedState.currentChartList &&
+          Array.isArray(cleanedState.currentChartList)
+        ) {
+          const chunks = splitIntoChunks(
+            cleanedState.currentChartList,
+            chunkSize
+          );
+          chunks.forEach((chunk, index) => {
+            const chunkKey = `dragChart_chunk_${index}`;
+            saveData("myIndexedDB", chunkKey, chunk)
+              .then(() => console.log(`Chunk ${index} saved successfully`))
+              .catch((error) =>
+                console.error(`Failed to save chunk ${index}:`, error)
+              );
+          });
+
+          saveData("myIndexedDB", "dragChart_chunk_meta", {
+            totalChunks: chunks.length,
+          });
+        }
+
+        // 存储压缩的元数据
+        const compressedData = pako.deflate(stringify(cleanedState), {
+          to: "string",
+        });
+        saveData("myIndexedDB", "dragChart_compressed", compressedData)
+          .then(() => console.log("Compressed metadata saved"))
+          .catch((error) =>
+            console.error("Failed to save compressed metadata:", error)
+          );
+      } catch (error) {
+        console.error("Error processing dragChart state:", error);
+        Message({
+          message: "数据存储已满,请刷新页面进行数据清除" + error,
+          type: "error",
+        });
+      }
+    }
   });
 };
 

+ 62 - 90
src/views/dataAdministration/vibration/index.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: your name
  * @Date: 2024-11-25 09:28:47
- * @LastEditTime: 2024-11-25 09:33:01
+ * @LastEditTime: 2024-11-29 14:36:46
  * @LastEditors: bogon
  * @Description: In User Settings Edit
  * @FilePath: /performance-test/src/views/dataAdministration/vibration/index.vue
@@ -10,7 +10,7 @@
   <div class="global-variable" v-loading="loading">
     <!-- 振动数据操作页面 -->
     <div class="condition">
-      <el-form
+      <!-- <el-form
         :inline="true"
         ref="ruleForm"
         :model="formInline"
@@ -24,31 +24,13 @@
             placeholder="请输入风场名称"
           ></el-input>
         </el-form-item>
-        <el-form-item label="状态:" prop="batchState" size="small">
-          <el-select v-model="formInline.batchState" placeholder="请选择状态">
-            <el-option label="启用" value="1"></el-option>
-            <el-option label="停用" value="0"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="创建时间">
-          <el-date-picker
-            size="small"
-            v-model="formInline.picker"
-            type="daterange"
-            range-separator="至"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            @change="onDateChange"
-          >
-          </el-date-picker>
-        </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="onSubmit" size="small"
             >查询</el-button
           >
           <el-button @click="reset('ruleForm')" size="small">重置</el-button>
         </el-form-item>
-      </el-form>
+      </el-form> -->
     </div>
     <div class="list-page">
       <div class="newly">
@@ -71,21 +53,18 @@
           prop="fieldName"
           align="center"
           min-width="100"
-          label="关联风场"
+          label="风场名称"
         >
         </el-table-column>
         <el-table-column
           align="center"
           min-width="100"
-          label="批次名称"
-          prop="batchName"
+          label="进度"
+          prop="transferProgress"
         >
         </el-table-column>
-        <!-- <el-table-column align="center" label="批次编号" prop="batchCode">
-          </el-table-column> -->
-
         <el-table-column
-          prop="batchState"
+          prop="transferStatus"
           align="center"
           label="状态"
           min-width="100"
@@ -93,20 +72,39 @@
           <template slot-scope="scope">
             <span>
               {{
-                scope.row.batchState == 0
-                  ? "禁用"
-                  : scope.row.batchState == 1
-                  ? "启用"
+                scope.row.transferStatus == 0
+                  ? "转换中"
+                  : scope.row.transferStatus == 1
+                  ? "转换完成"
+                  : scope.row.transferStatus == 2
+                  ? "转换异常"
+                  : scope.row.transferStatus == -1
+                  ? "未转换"
                   : "/"
               }}</span
             >
           </template>
         </el-table-column>
+
+        <el-table-column
+          align="center"
+          min-width="100"
+          label="异常信息"
+          prop="errInfo"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="transferStartTime"
+          align="center"
+          min-width="150"
+          label="开始时间"
+        >
+        </el-table-column>
         <el-table-column
-          prop="createTime"
+          prop="transferEndTime"
           align="center"
           min-width="150"
-          label="创建时间"
+          label="结束时间"
         >
         </el-table-column>
         <el-table-column
@@ -118,38 +116,25 @@
         >
           <template slot-scope="scope">
             <el-button
-              v-hasPermi="['performance:batchMag:edit']"
-              @click="compile(scope.row)"
-              type="text"
-              size="small"
-              >编辑</el-button
-            >
-            <el-button
-              v-hasPermi="['performance:batchMag:editState']"
-              v-if="scope.row.batchState == 0"
-              @click="setState(1, scope.row)"
+              v-if="scope.row.transferStatus === -1"
+              v-hasPermi="['dataAdministration:vibration:conversion']"
+              @click="conversion(scope.row, 0)"
               type="text"
               size="small"
-              >启用</el-button
+              >转换</el-button
             >
             <el-button
-              v-else
-              v-hasPermi="['performance:batchMag:editState']"
-              style="color: #666"
-              @click="setState(0, scope.row)"
+              v-if="
+                scope.row.transferStatus === 0 ||
+                scope.row.transferStatus === 1 ||
+                scope.row.transferStatus === 2
+              "
+              v-hasPermi="['dataAdministration:vibration:reconversion']"
+              @click="conversion(scope.row, 1)"
               type="text"
               size="small"
-              >禁用</el-button
-            >
-
-            <el-button
-              style="color: #f00"
-              @click="deleted(scope.row)"
-              v-hasPermi="['performance:batchMag:delete']"
-              type="text"
-              size="small"
-              :disabled="scope.row.batchState == 1"
-              >删除</el-button
+              :disabled="scope.row.transferStatus == 0"
+              >重新转换</el-button
             >
           </template>
         </el-table-column>
@@ -182,11 +167,10 @@
           label-width="100px"
           class="demo-ruleForm"
         >
-          <el-form-item label="关联风场:" prop="fieldCode">
+          <el-form-item label="风场:" prop="fieldCode">
             <el-select
-              :disabled="title === '编辑'"
               v-model="ruleForm.fieldCode"
-              placeholder="请选择关联风场"
+              placeholder="请选择风场"
               style="width: 100%"
             >
               <el-option
@@ -196,14 +180,10 @@
               ></el-option>
             </el-select>
           </el-form-item>
-          <el-form-item
-            label="批次名称"
-            prop="batchName"
-            v-if="title === '编辑'"
-          >
+          <el-form-item label="转换路径" prop="transferAddr">
             <el-input
-              v-model="ruleForm.batchName"
-              placeholder="请输入批次名称"
+              v-model="ruleForm.transferAddr"
+              placeholder="请输入转换路径"
             ></el-input>
           </el-form-item>
         </el-form>
@@ -234,6 +214,12 @@ import {
   deleteFieldBatch,
   createBatchName,
 } from "@/api/performance.js";
+import {
+  getDataTransfer,
+  addDataTransfer,
+  DataTransfer,
+} from "@/api/dataManage.js";
+
 export default {
   data() {
     return {
@@ -247,12 +233,9 @@ export default {
       endDate: "",
       fieldCodeList: [],
       formInline: {
-        fieldName: undefined,
-        batchState: undefined,
-        picker: [],
         pageNum: 1,
         pageSize: 10,
-        totalSize: 0,
+        transferType: 1,
       },
       tableData: [],
       // 新增编辑表单
@@ -267,8 +250,8 @@ export default {
           message: "请选择关联风场",
           trigger: "change",
         },
-        batchName: [
-          { required: true, message: "请输入批次名称", trigger: "blur" },
+        transferAddr: [
+          { required: true, message: "请输入转换路径", trigger: "blur" },
         ],
       },
       //修改密码
@@ -288,6 +271,7 @@ export default {
   },
 
   methods: {
+    conversion(row, retransfer) {},
     handleCloses(done) {
       this.$confirm("确认关闭?")
         .then((_) => {
@@ -344,12 +328,8 @@ export default {
     async getTableList() {
       try {
         this.loading = true;
-        const result = await getBatchMagList({
+        const result = await getDataTransfer({
           ...this.formInline,
-          picker: undefined,
-          startTime: this.startDate || undefined,
-          endTime: this.endDate || undefined,
-          totalSize: undefined,
         });
         this.tableData = result.data.list;
         this.formInline.totalSize = result.data.totalSize;
@@ -369,14 +349,6 @@ export default {
     onSubmit() {
       this.getTableList();
     },
-    // 重置
-    reset(formName) {
-      this.formInline.picker = [];
-      this.startDate = undefined;
-      this.endDate = undefined;
-      this.$refs[formName].resetFields();
-      this.getTableList();
-    },
 
     // 新增,编辑确定
     submitForm(formName) {
@@ -391,7 +363,7 @@ export default {
               );
               const form = new FormData();
               form.append("fieldName", obj.fieldName);
-              createBatchName(form).then((results) => {
+              addDataTransfer(form).then((results) => {
                 addFieldBatch({
                   ...this.ruleForm,
                   batchName: results.data,

+ 17 - 13
src/views/performance/components/custonAsCom/dragChart/components/chartsData.vue

@@ -135,19 +135,23 @@ export default {
         node.level === 1
           ? h("span", [
               h(
-                "el-checkbox",
-                {
-                  props: {
-                    value: node.checked,
-                    indeterminate: node.indeterminate, // 用于半选状态
-                  },
-                  on: {
-                    change: (val) => {
-                      this.handleParentNodeChange(node, val);
-                    },
-                  },
-                },
-                [data.label]
+                "span",
+                data.label
+                // [
+                //   // "el-checkbox",
+                //   // {
+                //   //   props: {
+                //   //     value: node.checked,
+                //   //     indeterminate: node.indeterminate, // 用于半选状态
+                //   //   },
+                //   //   on: {
+                //   //     change: (val) => {
+                //   //       this.handleParentNodeChange(node, val);
+                //   //     },
+                //   //   },
+                //   // },
+                //   data.label
+                // ]
               ),
             ])
           : h("span", data.label),

+ 222 - 24
src/views/performance/customAnalysis.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="content">
+  <div class="content" v-loading="loading">
     <el-tabs
       ref="tabs"
       tab-position="left"
@@ -19,7 +19,7 @@
                 :before-upload="checkFileType"
                 :show-file-list="false"
               >
-                <div class="uploadBoxContent">
+                <div class="uploadBoxContent" inert>
                   <svg-icon
                     icon-class="table(2)"
                     style="width: 40px; height: 40px; margin-right: 10px"
@@ -87,7 +87,7 @@
         <DataTable ref="dataTableRef"></DataTable>
       </el-tab-pane>
       <el-tab-pane name="compute">
-        <span slot="label" class="iconFont" @click.stop="dialogVisible = true">
+        <span slot="label" class="iconFont" @click.stop="handleUploadBox">
           <el-tooltip
             class="item"
             effect="dark"
@@ -137,21 +137,31 @@
         class="demo-ruleForm"
       >
         <el-form-item label="选择数据列表:" prop="region">
-          <el-select
+          <el-cascader
+            v-model="ruleForm.region"
+            size="small"
+            placeholder="试试搜索:"
+            collapse-tags
+            :options="options"
+            filterable
+          >
+            <!-- :props="{ multiple: true }" -->
+          </el-cascader>
+          <!-- <el-select
             v-model="ruleForm.region"
             placeholder="请选择活动区域"
             size="small"
           >
             <el-option label="区域一" value="shanghai"></el-option>
             <el-option label="区域二" value="beijing"></el-option>
-          </el-select>
+          </el-select> -->
         </el-form-item>
         <el-form-item label="选择数据范围:">
           <div class="demo-input-suffix">
             <el-input
               size="small"
               type="number"
-              placeholder="最小值"
+              placeholder="开始行"
               v-model="ruleForm.min"
             >
             </el-input>
@@ -159,7 +169,7 @@
             <el-input
               size="small"
               type="number"
-              placeholder="最大值"
+              placeholder="结束行"
               v-model="ruleForm.max"
             >
             </el-input>
@@ -167,24 +177,23 @@
         </el-form-item>
         <el-form-item label="选择特征值计算:" prop="type">
           <el-checkbox-group v-model="ruleForm.type">
-            <el-checkbox label="有效值" name="type"></el-checkbox>
-            <el-checkbox label="平均值" name="type"></el-checkbox>
-            <el-checkbox label="最大值" name="type"></el-checkbox>
-            <el-checkbox label="最小值" name="type"></el-checkbox>
-            <el-checkbox label="峰值" name="type"></el-checkbox>
-            <el-checkbox label="峰峰值" name="type"></el-checkbox>
-            <el-checkbox label="峰值指标" name="type"></el-checkbox>
-            <el-checkbox label="峰度指标" name="type"></el-checkbox>
-            <el-checkbox label="歪度指标" name="type"></el-checkbox>
-            <el-checkbox label="裕度指标" name="type"></el-checkbox>
-            <el-checkbox label="脉冲指标" name="type"></el-checkbox>
-            <el-checkbox label="波形指标" name="type"></el-checkbox>
+            <el-checkbox label="有效值" name="Xrms"></el-checkbox>
+            <el-checkbox label="平均值" name="Mean"></el-checkbox>
+            <el-checkbox label="最大值" name="Max"></el-checkbox>
+            <el-checkbox label="最小值" name="Min"></el-checkbox>
+            <el-checkbox label="峰值" name="Xp"></el-checkbox>
+            <el-checkbox label="峰峰值" name="Xpp"></el-checkbox>
+            <el-checkbox label="峰度指标" name="Cf"></el-checkbox>
+            <el-checkbox label="歪度指标" name="Sk"></el-checkbox>
+            <el-checkbox label="裕度指标" name="Ce"></el-checkbox>
+            <el-checkbox label="脉冲指标" name="If"></el-checkbox>
+            <el-checkbox label="波形指标" name="Sf"></el-checkbox>
           </el-checkbox-group>
         </el-form-item>
       </el-form>
       <span slot="footer" class="dialog-footer">
-        <el-button @click="dialogVisible = false">取 消</el-button>
-        <el-button type="primary" @click="dialogVisible = false"
+        <el-button @click="resetForm">取 消</el-button>
+        <el-button type="primary" @click="submitComputedFn('ruleForm')"
           >确 定</el-button
         >
       </span>
@@ -203,9 +212,10 @@ import DragChart from "./components/custonAsCom/dragChart/index.vue";
 import AssociatedFields from "./components/custonAsCom/AssociatedFields.vue";
 import Papa from "papaparse";
 import * as XLSX from "xlsx";
-import { storeSetData } from "@/utils/indexedDb";
+import { storeSetData, getDataFromIndexedDB } from "@/utils/indexedDb";
 import { format } from "date-fns";
 import { mapMutations, mapState } from "vuex";
+import axios from "axios";
 export default {
   components: {
     DataTable,
@@ -215,6 +225,8 @@ export default {
   },
   data() {
     return {
+      options: [],
+      loading: false,
       db: null,
       activeName: "chart",
       showDatabaseTable: false,
@@ -249,6 +261,22 @@ export default {
     ...mapState("dragChart", {
       updateTriggerGetData: "updateTriggerGetData",
     }),
+    selectedNames() {
+      const nameMap = {
+        有效值: "Xrms",
+        平均值: "Mean",
+        最大值: "Max",
+        最小值: "Min",
+        峰值: "Xp",
+        峰峰值: "Xpp",
+        峰度指标: "Cf",
+        歪度指标: "Sk",
+        裕度指标: "Ce",
+        脉冲指标: "If",
+        波形指标: "Sf",
+      };
+      return this.ruleForm.type.map((label) => nameMap[label]);
+    },
   },
   watch: {
     updateTriggerGetData: function (newVal) {
@@ -265,6 +293,7 @@ export default {
       "setTriggerGetData",
       "setUpdateTriggerGetData",
     ]),
+
     async initDB() {
       return new Promise((resolve, reject) => {
         const request = indexedDB.open("FileDataDB", 2); // 使用较高版本
@@ -277,7 +306,7 @@ export default {
             db.createObjectStore("files", { keyPath: "id" });
           }
         };
-        request.onsuccess = (event) => {
+        request.onsuccess = async (event) => {
           this.db = event.target.result;
           console.log("数据库已成功初始化。");
           resolve();
@@ -288,6 +317,164 @@ export default {
         };
       });
     },
+    async handleUploadBox() {
+      this.dialogVisible = true;
+      const indexeddbData = await getDataFromIndexedDB();
+      this.options = indexeddbData.map((item) => {
+        return {
+          value: item.fileId,
+          label: item.filename,
+          children: Object.keys(item.fileData[0]).map((val) => ({
+            value: val,
+            label: val,
+          })),
+        };
+      });
+      console.log(this.options, "调用数据");
+    },
+    async submitComputedFn(formName) {
+      try {
+        // 1. 验证表单
+        if (!(await this.validateForm(formName))) return;
+        if (Number(this.ruleForm.max) < Number(this.ruleForm.min)) {
+          this.$message.error("开始行不可以大于结束行");
+          return;
+        }
+        // 2. 获取 IndexedDB 数据
+        const indexeddbData = await getDataFromIndexedDB();
+        const region = this.getRegionData(indexeddbData);
+
+        if (!region.length) {
+          console.warn("当前选择的列未找到数据");
+          return;
+        }
+
+        // 3. 调用算法接口
+        const resData = await this.fetchAlgorithmData(region[0]);
+
+        // 4. 筛选和处理数据
+        const filteredData = this.filterResponseData(resData);
+
+        // 5. 构建导出数据
+        const resObj = this.buildExportData(indexeddbData, filteredData);
+        this.storeData(resObj);
+        this.resetForm();
+        console.log(resObj, "resObj");
+      } catch (error) {
+        console.error("提交过程中发生错误:", error);
+      }
+    },
+
+    async validateForm(formName) {
+      try {
+        const valid = await this.$refs[formName].validate();
+        if (!valid) {
+          console.warn("表单验证失败");
+          return false;
+        }
+        return true;
+      } catch (error) {
+        console.error("表单验证错误:", error);
+        return false;
+      }
+    },
+    //生成数据
+    getRegionData(indexeddbData) {
+      return indexeddbData
+        .filter((item) => item.fileId === this.ruleForm.region[0])
+        .map((item) =>
+          item.fileData.map((val, ind) => ({
+            index: ind + 1,
+            value: val[this.ruleForm.region[1]],
+          }))
+        );
+    },
+    //调用算法接口
+    async fetchAlgorithmData(regionData) {
+      try {
+        const res = await axios.post("/sAlgorithm/CalculateFeatures/", {
+          data: regionData,
+          start_index: Number(this.ruleForm.min),
+          end_index: Number(this.ruleForm.max),
+        });
+        return JSON.parse(res.data, "res");
+      } catch (error) {
+        console.error("算法接口调用失败:", error);
+        throw error;
+      }
+    },
+    //过滤字段
+    filterResponseData(resData) {
+      return resData.map((item) => {
+        const filteredItem = { ...item };
+        Object.keys(filteredItem).forEach((key) => {
+          if (
+            this.selectedNames.length > 0 &&
+            !this.selectedNames.includes(key) &&
+            key !== "index" &&
+            key !== "value"
+          ) {
+            delete filteredItem[key];
+          }
+        });
+        return filteredItem;
+      });
+    },
+    //处理算法返回的数据
+    buildExportData(indexeddbData, resData) {
+      const nameMap = {
+        有效值: "Xrms",
+        平均值: "Mean",
+        最大值: "Max",
+        最小值: "Min",
+        峰值: "Xp",
+        峰峰值: "Xpp",
+        峰度指标: "Cf",
+        歪度指标: "Sk",
+        裕度指标: "Ce",
+        脉冲指标: "If",
+        波形指标: "Sf",
+      };
+      const resObj = indexeddbData.find(
+        (item) => item.fileId === this.ruleForm.region[0]
+      );
+      if (!resObj) {
+        console.warn("未找到对应文件数据");
+        return {};
+      }
+      resObj.filename =
+        format(new Date(), "yyyyMMdd-HH:mm:ss") + resObj.fileOldName;
+      resObj.fileId = new Date().getTime();
+      resObj.fileData = resData.map((item) => {
+        const dynamicKeys = this.ruleForm.type.reduce((acc, label) => {
+          const fieldName = this.selectedNames.find(
+            (name) => nameMap[label] === name
+          );
+          if (fieldName) {
+            acc[label] = item[fieldName];
+          }
+          return acc;
+        }, {});
+
+        return {
+          [this.ruleForm.region[1]]: item.value,
+          ...dynamicKeys,
+        };
+      });
+
+      return resObj;
+    },
+
+    resetForm() {
+      this.ruleForm = {
+        max: "",
+        min: "",
+        region: [],
+        type: [],
+      };
+      this.dialogVisible = false; // 重置表单状态
+    },
+
     async storeData(newFileData) {
       await storeSetData(this.db, "files", "fileDataArray", newFileData, () => {
         this.setTriggerGetData(true);
@@ -335,10 +522,12 @@ export default {
             };
             if (results.data.length > 0) {
               this.storeData(fileData);
+              this.loading = false;
             }
           },
           error: (error) => {
             console.error("Error parsing CSV:", error);
+            this.loading = false;
           },
         });
       } else {
@@ -358,6 +547,7 @@ export default {
             };
             if (sheetData.length > 0) {
               this.storeData(fileData);
+              this.loading = false;
             }
             // console.log("Parsed Excel Sheet Data:", sheetData);
             // 可以进一步处理解析后的数据
@@ -376,8 +566,16 @@ export default {
         file.name.endsWith(".xlsx");
       if (!isPdf) {
         this.$message.error("只能上传csv文件或xlsx文件");
+        return false;
+      }
+      // 判断文件大小(以字节为单位,100kB = 102400字节)
+      const maxSize = 50 * 1024; // 100kB
+      if (file.size > maxSize) {
+        this.$message.error("文件大小不能超过50kB");
+        return false;
       }
-      return isPdf;
+      this.loading = true;
+      return true;
     },
   },
   async mounted() {

+ 15 - 9
vue.config.js

@@ -63,8 +63,8 @@ module.exports = {
     // contentBase: path.join(__dirname, "public"),
     proxy: {
       "/api": {
-        target: "http://192.168.5.4:16200", // 石月
-        // target: "http://192.168.50.235:16200", //内网
+        // target: "http://192.168.5.4:16200", // 石月
+        target: "http://192.168.50.235:16200", //内网
         // target: "http://192.168.5.15:16200",
         // target: "http://106.120.102.238:16600", //外网
         //  target: "http://10.96.137.5",
@@ -72,6 +72,9 @@ module.exports = {
         pathRewrite: {
           "^/api": "", // 需要regit write重写的,
         },
+        onProxyReq(proxyReq, req, res) {
+          console.log("Proxying request to:", proxyReq.path); // 打印代理请求路径
+        },
       },
       "/transDataWeb": {
         target: "http://192.168.50.241:9000/trans_data_web",
@@ -80,13 +83,16 @@ module.exports = {
           "^/transDataWeb": "", // 需要regit write重写的,
         },
       },
-      // "/downLoadApi": {
-      //   target: "http://192.168.50.241:8080", //http://192.168.50.241:8080/
-      //   changeOrigin: true,
-      //   pathRewrite: {
-      //     "^/downLoadApi": "", // 需要rewrite重写的,z
-      //   },
-      // },
+      "/sAlgorithm": {
+        target: "http://192.168.5.28:8666", // 目标地址
+        changeOrigin: true,
+        pathRewrite: {
+          "^/sAlgorithm": "", // 如果后端需要 `/api` 前缀
+        },
+        onProxyReq(proxyReq, req, res) {
+          console.log("Proxying request to:", proxyReq.path); // 打印代理请求路径
+        },
+      },
     },
   },
 

Некоторые файлы не были показаны из-за большого количества измененных файлов