Redeem 1 dzień temu
rodzic
commit
1aef554ab9

+ 1 - 1
cors.js

@@ -207,7 +207,7 @@ module.exports = {
   },
   },
   // devModules: ['index', 'entrustedManagement','sampleManager','screeningTests', 'resourceManager']
   // devModules: ['index', 'entrustedManagement','sampleManager','screeningTests', 'resourceManager']
   //devModules: ['reportForm', 'screeningTests', 'index',  'entrustedManagement','measurementDataManagement', 'approveManagement', 'testAnalysis', 'resourceManager', 'taskManagement']
   //devModules: ['reportForm', 'screeningTests', 'index',  'entrustedManagement','measurementDataManagement', 'approveManagement', 'testAnalysis', 'resourceManager', 'taskManagement']
-  // devModules: ["index", "reportForm"],
+  // devModules: ["index", "approveManagement"],
   devModules: ["all"],
   devModules: ["all"],
   // devModules: ["index", "certificateManagement", "approveManagement"],
   // devModules: ["index", "certificateManagement", "approveManagement"],
 };
 };

+ 2 - 3
src/views/approveManagement/components/fourApprove.vue

@@ -714,6 +714,7 @@ export default {
         console.log(this.sectionNameType);
         console.log(this.sectionNameType);
         // this.getCompany()
         // this.getCompany()
       });
       });
+    this.search.type = this.$route.query.type || '';
     this.searchData();
     this.searchData();
   },
   },
   watch: {
   watch: {
@@ -722,9 +723,7 @@ export default {
     }
     }
   },
   },
   mounted() {
   mounted() {
-    this.search.type = this.$route.query.type || '';
-    console.log('mounted.......', this.$route.query)
-    console.log('mounted........', this.$route.query.type);
+
     this.axios
     this.axios
       .post(
       .post(
         "pass/baseManagement/v1/limsbaseinfos/queryBaseInfoByBaseCode",
         "pass/baseManagement/v1/limsbaseinfos/queryBaseInfoByBaseCode",

+ 2 - 2
src/views/entrustedManagement/components/inspectionProudects/inspectionProudects.vue

@@ -609,8 +609,8 @@ export default {
     };
     };
   },
   },
   created() {
   created() {
-    this.height_top = window.innerHeight - 200;
-    this.height_bot = window.innerHeight - 200;
+    this.height_top = window.innerHeight - 250;
+    this.height_bot = window.innerHeight - 250;
     this.search.times = [this.getYNM(new Date()), this.getYNM(new Date())];
     this.search.times = [this.getYNM(new Date()), this.getYNM(new Date())];
     this.activeMenu = window.top.localStorage.getItem("activeMenu");
     this.activeMenu = window.top.localStorage.getItem("activeMenu");
   },
   },

+ 98 - 41
src/views/reportForm/components/chemicalAnalysisReport.vue

@@ -27,9 +27,6 @@
           <el-date-picker v-model="search.stateTime[1]" value-format="yyyy-MM-dd" format="yyyy-MM-dd" type="date"
           <el-date-picker v-model="search.stateTime[1]" value-format="yyyy-MM-dd" format="yyyy-MM-dd" type="date"
             placeholder="结束日期" size="mini" style="width: 150px">
             placeholder="结束日期" size="mini" style="width: 150px">
           </el-date-picker>
           </el-date-picker>
-          <!-- <el-date-picker v-model="search.stateTime" value-format="yyyy-MM-dd" format="yyyy-MM-dd" type="daterange"
-            range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" size="mini" style="width: 200px">
-          </el-date-picker> -->
         </el-form-item>
         </el-form-item>
         <el-form-item>
         <el-form-item>
           <el-button icon="el-icon-search" type="goon" size="mini" :loading="dataLoading"
           <el-button icon="el-icon-search" type="goon" size="mini" :loading="dataLoading"
@@ -47,7 +44,7 @@
           </div>
           </div>
         </div>
         </div>
         <div class="common-table-div">
         <div class="common-table-div">
-          <el-table ref="tableMain11" :height="singleTableHeight" v-loading="tableLoading" :data="table.list"
+          <el-table ref="tableMain11" :height="tableHeight"  v-loading="tableLoading" :data="table.list"
             highlight-current-row @row-click="handleCurrentChange" :summary-method="getSummaries"
             highlight-current-row @row-click="handleCurrentChange" :summary-method="getSummaries"
             :header-cell-style="tableHeaderCellStyle" show-summary border style="width: 100%" :icorePanelShown="100"
             :header-cell-style="tableHeaderCellStyle" show-summary border style="width: 100%" :icorePanelShown="100"
             :icore-filter-flag="icoreFilterFlag">
             :icore-filter-flag="icoreFilterFlag">
@@ -70,7 +67,7 @@
           </div>
           </div>
         </div>
         </div>
         <div class="common-table-div" id="topTable">
         <div class="common-table-div" id="topTable">
-          <el-table ref="el_table_1" border :height="singleTableHeight" width="100%" highlight-current-row
+          <el-table ref="el_table_1" border :height="tableHeight"  width="100%" highlight-current-row
             @selection-change="searchFollow" :data="table.list1">
             @selection-change="searchFollow" :data="table.list1">
             <el-table-column type="selection" width="55" align="center"></el-table-column>
             <el-table-column type="selection" width="55" align="center"></el-table-column>
             <el-table-column sortable show-overflow-tooltip align="center" width="160" prop="CAR_NO"
             <el-table-column sortable show-overflow-tooltip align="center" width="160" prop="CAR_NO"
@@ -109,7 +106,7 @@
         <span style="margin-left: 10px; font-size: 18px">维护信息</span>
         <span style="margin-left: 10px; font-size: 18px">维护信息</span>
       </div>
       </div>
       <div class="common-table-div">
       <div class="common-table-div">
-        <el-table border ref="dataTable123" :data="recallList" :height="theight2" @selection-change="recallSelection"
+        <el-table border ref="dataTable123" :data="recallList" :height="dialogTableHeight" @selection-change="recallSelection"
           highlight-current-row>
           highlight-current-row>
           <el-table-column type="selection" width="45" align="center"></el-table-column>
           <el-table-column type="selection" width="45" align="center"></el-table-column>
           <el-table-column show-overflow-tooltip sortable min-width="80" align="center" prop="ANLY_ITEM_NAME"
           <el-table-column show-overflow-tooltip sortable min-width="80" align="center" prop="ANLY_ITEM_NAME"
@@ -182,12 +179,15 @@
     </el-dialog>
     </el-dialog>
   </div>
   </div>
 </template>
 </template>
+
 <script>
 <script>
 import { getCookie, formatDate } from "@/utils/util.js";
 import { getCookie, formatDate } from "@/utils/util.js";
 import { cookieUserId, cookieUserName } from "@/config/config.js";
 import { cookieUserId, cookieUserName } from "@/config/config.js";
 import { exportToExcel } from "../../../utils/utils.js";
 import { exportToExcel } from "../../../utils/utils.js";
+
 let userName = getCookie(cookieUserName);
 let userName = getCookie(cookieUserName);
 let userId = getCookie(cookieUserId);
 let userId = getCookie(cookieUserId);
+
 export default {
 export default {
   data() {
   data() {
     return {
     return {
@@ -214,26 +214,30 @@ export default {
       },
       },
       cols: ["无"],
       cols: ["无"],
       redDataCk: [], //显红的数据
       redDataCk: [], //显红的数据
-      singleTableHeight: 600,
+      tableHeight: 0, // 主表格自适应高度
+      dialogTableHeight: 0, // 弹窗表格自适应高度
       icoreFilterFlag: true,
       icoreFilterFlag: true,
       tableLoading: false,
       tableLoading: false,
       tableExportLoading: false,
       tableExportLoading: false,
       batchLoading: false,
       batchLoading: false,
       recallShow: false,
       recallShow: false,
       recallList: [],
       recallList: [],
-      theight2: 0,
       recallSelectionList: [],
       recallSelectionList: [],
     };
     };
   },
   },
   created() {
   created() {
-    this.singleTableHeight = window.innerHeight - 190;
-    this.theight2 = window.innerHeight - 180;
+    // 初始化日期范围
     let aaa = new Date();
     let aaa = new Date();
     let bbb = new Date().getTime() - 60000 * 60 * 24 * 7;
     let bbb = new Date().getTime() - 60000 * 60 * 24 * 7;
     aaa.setTime(bbb);
     aaa.setTime(bbb);
     this.search.stateTime = [this.getYNM(aaa), this.getYNM(new Date())];
     this.search.stateTime = [this.getYNM(aaa), this.getYNM(new Date())];
   },
   },
   mounted() {
   mounted() {
+    // 初始化表格高度 + 监听窗口变化
+    this.setTableHeight();
+    window.addEventListener('resize', this.setTableHeight);
+
+    // 获取样品类型数据
     this.axios
     this.axios
       .post(
       .post(
         "pass/baseManagement/v1/limsbaseinfos/queryBaseInfoByBaseCode",
         "pass/baseManagement/v1/limsbaseinfos/queryBaseInfoByBaseCode",
@@ -244,7 +248,54 @@ export default {
         this.sampleTypeNameType = res.data;
         this.sampleTypeNameType = res.data;
       });
       });
   },
   },
+  beforeDestroy() {
+    // 移除窗口监听,防止内存泄漏
+    window.removeEventListener('resize', this.setTableHeight);
+  },
   methods: {
   methods: {
+    // 核心:计算自适应表格高度(适配所有分辨率)
+    setTableHeight() {
+    // const winHeight = window.innerHeight;
+    // // 主表格:窗口高度 - 200px,最小为窗口高度的 40%
+    // this.tableHeight = Math.max(winHeight - 200, winHeight * 0.4);
+    // // 弹窗表格:窗口高度 - 220px,最小为窗口高度的 35%
+    // this.dialogTableHeight = Math.max(winHeight - 220, winHeight * 0.35);
+
+        function getZoomLevel() {
+          const screenCssPixels = window.screen.width;
+          const screenDevicePixels = window.screen.width * window.devicePixelRatio;
+          return screenDevicePixels / screenCssPixels;
+        }
+
+        function getCorrectedTop() {
+          const rect = document.getElementById('topTable').getBoundingClientRect();
+          const zoom = getZoomLevel();
+          return rect.top * zoom;
+        }
+
+        function getTableHeight() {
+          const winHeight = window.innerHeight;
+          const correctedTop = getCorrectedTop();
+          const availableHeight = winHeight - correctedTop - 10; // 20px 预留底部空间
+          console.log('availableHeight:', availableHeight, 'correctedTop:', correctedTop, 'winHeight:', winHeight);
+          return Math.max(availableHeight, winHeight * 0.1); // 最小为窗口高度的 40%
+        }
+
+
+        this.$nextTick(() => {
+          console.log('-------------3')
+          // this.$refs.tableMain11.doLayout()
+          console.log('-------------31')
+          // this.$refs.el_table_1.doLayout() // 调用 el-table 重绘方法
+          console.log('-------------32')
+          this.tableHeight = getTableHeight();
+          console.log('-------------33')
+          console.log('tableHeight:', this.tableHeight);
+        });
+
+
+    },
+    // 日期格式化
     getYNM(date) {
     getYNM(date) {
       let year = date.getFullYear().toString();
       let year = date.getFullYear().toString();
       let month = date.getMonth() + 1;
       let month = date.getMonth() + 1;
@@ -265,8 +316,8 @@ export default {
       let startTime = "";
       let startTime = "";
       let endTime = "";
       let endTime = "";
       if (!this.search.stateTime) {
       if (!this.search.stateTime) {
-        startTime=null;
-        endTime=null;
+        startTime = null;
+        endTime = null;
       } else {
       } else {
         startTime = this.search.stateTime[0];
         startTime = this.search.stateTime[0];
         endTime = this.search.stateTime[1];
         endTime = this.search.stateTime[1];
@@ -354,8 +405,8 @@ export default {
       let startTime = "";
       let startTime = "";
       let endTime = "";
       let endTime = "";
       if (!this.search.stateTime) {
       if (!this.search.stateTime) {
-        startTime=null;
-        endTime=null;
+        startTime = null;
+        endTime = null;
       } else {
       } else {
         startTime = this.search.stateTime[0];
         startTime = this.search.stateTime[0];
         endTime = this.search.stateTime[1];
         endTime = this.search.stateTime[1];
@@ -498,10 +549,6 @@ export default {
     },
     },
     // 导出
     // 导出
     doExport() {
     doExport() {
-      // if (this.table.list1.length === 0) {
-      //     this.$message.warning("表格无数据不能导出");
-      //     return true;
-      // }
       if (this.saveMainData.length < 1) {
       if (this.saveMainData.length < 1) {
         this.$message.warning("表格无数据不能导出");
         this.$message.warning("表格无数据不能导出");
         return;
         return;
@@ -538,15 +585,7 @@ export default {
         [],
         [],
         []
         []
       );
       );
-
-      // setTimeout(() => {
-      //     setTimeout(() => {
-      //     setTimeout(() => {
       this.tableExportLoading = false;
       this.tableExportLoading = false;
-      //         this.doExport2();
-      //     }, 0);
-      //     }, 0);
-      // }, 0);
     },
     },
     doExport2() {
     doExport2() {
       this.$nextTick(() => {
       this.$nextTick(() => {
@@ -619,7 +658,6 @@ export default {
       this.table.list = []
       this.table.list = []
       this.table.list1 = []
       this.table.list1 = []
       this.searchData1();
       this.searchData1();
-
     },
     },
     getSummaries(param) {
     getSummaries(param) {
       const { columns, data } = param;
       const { columns, data } = param;
@@ -659,56 +697,47 @@ export default {
       while (tdTarget.tagName !== "TD") {
       while (tdTarget.tagName !== "TD") {
         tdTarget = tdTarget.parentElement;
         tdTarget = tdTarget.parentElement;
       }
       }
-      // if (event.keyCode === 13) {
-      //   this.jisuanRow(row, rindex)
-      // }
-      // 如果按下键盘下键或者回车键
       if (event.keyCode === 40 || event.keyCode === 13) {
       if (event.keyCode === 40 || event.keyCode === 13) {
         let ind = Number(index) + 1;
         let ind = Number(index) + 1;
         let id = "#" + columnId + "--" + ind;
         let id = "#" + columnId + "--" + ind;
         let input = $(id);
         let input = $(id);
         if (input) {
         if (input) {
-          // this.$refs.tablePllr.setCurrentRow(this.tableData[ind])
           input.focus();
           input.focus();
-          input.select(); // 选中内容
+          input.select();
           event.stopPropagation();
           event.stopPropagation();
           event.stopImmediatePropagation();
           event.stopImmediatePropagation();
           event.preventDefault();
           event.preventDefault();
           return false;
           return false;
         }
         }
       } else if (event.keyCode === 38) {
       } else if (event.keyCode === 38) {
-        // 键盘上键
         let ind = Number(index) - 1;
         let ind = Number(index) - 1;
         let id = "#" + columnId + "--" + ind;
         let id = "#" + columnId + "--" + ind;
         let input = $(id);
         let input = $(id);
         if (input) {
         if (input) {
-          // this.$refs.tablePllr.setCurrentRow(this.tableData[ind])
           input.focus();
           input.focus();
-          input.select(); // 选中内容
+          input.select();
           event.stopPropagation();
           event.stopPropagation();
           event.stopImmediatePropagation();
           event.stopImmediatePropagation();
           event.preventDefault();
           event.preventDefault();
           return false;
           return false;
         }
         }
       } else if (event.keyCode === 37) {
       } else if (event.keyCode === 37) {
-        // 键盘左键
         let input =
         let input =
           $(tdTarget).prev().find("input") &&
           $(tdTarget).prev().find("input") &&
           $(tdTarget).prev().find("input")[0];
           $(tdTarget).prev().find("input")[0];
         if (input) {
         if (input) {
           input.focus();
           input.focus();
-          input.select(); // 选中内容
+          input.select();
           event.stopPropagation();
           event.stopPropagation();
           event.stopImmediatePropagation();
           event.stopImmediatePropagation();
           event.preventDefault();
           event.preventDefault();
           return false;
           return false;
         }
         }
       } else if (event.keyCode === 39) {
       } else if (event.keyCode === 39) {
-        // 键盘右键
         let input = $(tdTarget).next().find("input")[0];
         let input = $(tdTarget).next().find("input")[0];
         if (input) {
         if (input) {
           input.focus();
           input.focus();
-          input.select(); // 选中内容
+          input.select();
           event.stopPropagation();
           event.stopPropagation();
           event.stopImmediatePropagation();
           event.stopImmediatePropagation();
           event.preventDefault();
           event.preventDefault();
@@ -731,4 +760,32 @@ export default {
   },
   },
 };
 };
 </script>
 </script>
-<style scoped></style>
+
+<style scoped>
+/* 强制表格容器溢出隐藏,让表格自身控制滚动 */
+.common-table-div {
+  overflow: hidden !important;
+}
+
+/* 强制表格内容区永远显示垂直滚动条(核心) */
+:deep(.el-table__body-wrapper) {
+  overflow-y: scroll !important;
+  /* 滚动条样式优化(可选) */
+  scrollbar-width: thin; /* 火狐 */
+  -ms-overflow-style: scrollbar; /* IE/Edge */
+}
+
+/* 美化滚动条(Chrome/Safari) */
+:deep(.el-table__body-wrapper::-webkit-scrollbar) {
+  width: 6px;
+}
+:deep(.el-table__body-wrapper::-webkit-scrollbar-thumb) {
+  background-color: #ddd;
+  border-radius: 3px;
+}
+
+/* 确保表格高度继承 */
+:deep(.el-table) {
+  height: 100% !important;
+}
+</style>

+ 434 - 891
src/views/resourceManager/components/standardFluidManagement/alertComponents2.vue

@@ -1,891 +1,434 @@
-<!-- BatchCalibrationTable.vue -->
-<template>
-  <div>
-    <div v-for="(rowData, rowIdx) in tableData" :key="rowIdx" class="form-block">
-      <el-form :model="tableData" label-width="120px" ref="tablePllr" style="width:100%;">
-        <table class="common-table-style4" border style="width:100%; border-collapse:collapse; table-layout: fixed;">
-          <tr>
-            <td colspan="2" style="text-align:center; vertical-align:middle; border:1px solid #e6e6e6 !important; padding: 8px;">
-              <el-form-item prop="index" style="margin: 0;">
-                <span style="display:block; margin:5px 0; text-align:center;">标定{{ rowIdx + 1 }}</span>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length > 0">
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[0].ANLY_ITEM_NAME || '字段1'" :prop="cols[0].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[0].ANLY_ITEM_NO]" 
-                  @keydown.native="keyDown($event, rowIdx, 0)" 
-                  :data-row="rowIdx"
-                  :data-col="0"
-                  :id="`input-${rowIdx}-0`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[1].ANLY_ITEM_NAME || '字段2'" :prop="cols[1].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[1].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 1)" 
-                  :data-row="rowIdx"
-                  :data-col="1"
-                  :id="`input-${rowIdx}-1`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length >= 2">
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[2].ANLY_ITEM_NAME || '字段1'" :prop="cols[2].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[2].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 2)" 
-                  :data-row="rowIdx"
-                  :data-col="2"
-                  :id="`input-${rowIdx}-2`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[3].ANLY_ITEM_NAME || '字段2'" :prop="cols[3].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[3].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 3)" 
-                  :data-row="rowIdx"
-                  :data-col="3"
-                  :id="`input-${rowIdx}-3`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length >= 4">
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[4].ANLY_ITEM_NAME || '字段1'" :prop="cols[4].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[4].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 4)" 
-                  :data-row="rowIdx"
-                  :data-col="4"
-                  :id="`input-${rowIdx}-4`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[5].ANLY_ITEM_NAME || '字段2'" :prop="cols[5].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[5].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 5)" 
-                  :data-row="rowIdx"
-                  :data-col="5"
-                  :id="`input-${rowIdx}-5`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length >= 6">
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[6].ANLY_ITEM_NAME || '字段1'" :prop="cols[6].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[6].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 6)" 
-                  :data-row="rowIdx"
-                  :data-col="6"
-                  :id="`input-${rowIdx}-6`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[7].ANLY_ITEM_NAME" :prop="cols[7].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[7].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 7)" 
-                  :data-row="rowIdx"
-                  :data-col="7"
-                  :id="`input-${rowIdx}-7`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length >= 8">
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[8].ANLY_ITEM_NAME || '字段1'" :prop="cols[8].STUFF_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[8].STUFF_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 8)" 
-                  :data-row="rowIdx"
-                  :data-col="8"
-                  :id="`input-${rowIdx}-8`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[9].ANLY_ITEM_NAME || '字段2'" :prop="cols[9].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[9].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 9)" 
-                  :data-row="rowIdx"
-                  :data-col="9"
-                  :id="`input-${rowIdx}-9`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-          </tr>
-        </table>
-        <table class="common-table-style4" border style="width:100%; border-collapse:collapse; table-layout: fixed;">
-          <tr v-if="cols.length >= 10">
-            <td colspan="5" style="width: 100% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item label="干燥/灼烧恒重(g)" style="margin: 0;">
-                <div style="display:flex; gap: 8px; width: 100%; box-sizing: border-box;">
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[10].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 10)" 
-                    :data-row="rowIdx"
-                    :data-col="10"
-                    :id="`input-${rowIdx}-10`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[11].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 11)" 
-                    :data-row="rowIdx"
-                    :data-col="11"
-                    :id="`input-${rowIdx}-11`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[12].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 12)" 
-                    :data-row="rowIdx"
-                    :data-col="12"
-                    :id="`input-${rowIdx}-12`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[13].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 13)" 
-                    :data-row="rowIdx"
-                    :data-col="13"
-                    :id="`input-${rowIdx}-13`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                </div>
-              </el-form-item>
-            </td>
-          </tr>
-        </table>
-        <table class="common-table-style4" border style="width:100%; border-collapse:collapse; table-layout: fixed;">
-          <tr v-if="cols.length >= 15">
-            <td style="width: 33.33% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[14].ANLY_ITEM_NAME || '字段1'" :prop="cols[14].STUFF_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[14].STUFF_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 14)" 
-                  :data-row="rowIdx"
-                  :data-col="14"
-                  :id="`input-${rowIdx}-14`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-            <td style="width: 33.33% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[15].ANLY_ITEM_NAME || '字段2'" :prop="cols[15].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[15].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 15)" 
-                  :data-row="rowIdx"
-                  :data-col="15"
-                  :id="`input-${rowIdx}-15`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-            <td style="width: 33.33% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[16].ANLY_ITEM_NAME || '字段2'" :prop="cols[16].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[16].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 16)" 
-                  :data-row="rowIdx"
-                  :data-col="16"
-                  :id="`input-${rowIdx}-16`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length >= 18">
-            <td style="width: 33.33% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[17].ANLY_ITEM_NAME || '字段1'" :prop="cols[17].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[17].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 17)" 
-                  :data-row="rowIdx"
-                  :data-col="17"
-                  :id="`input-${rowIdx}-17`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-            <td style="width: 33.33% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[18].ANLY_ITEM_NAME || '字段2'" :prop="cols[18].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[18].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 18)" 
-                  :data-row="rowIdx"
-                  :data-col="18"
-                  :id="`input-${rowIdx}-18`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-            <td style="width: 33.33% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[22].ANLY_ITEM_NAME || '字段2'" :prop="cols[22].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[22].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 19)" 
-                  :data-row="rowIdx"
-                  :data-col="19"
-                  :id="`input-${rowIdx}-19`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-          </tr>
-        </table>
-        <table class="common-table-style4" border style="width:100%; border-collapse:collapse; table-layout: fixed;">
-          <tr>
-            <td colspan="5" style="width: 100% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item label="标定序号" style="margin: 0;">
-                <div style="display:flex; gap: 8px; width: 100%; box-sizing: border-box;">
-                  <span style="flex: 1; min-width: 80px; width: 100%;text-align: center; box-sizing: border-box;">1</span>
-                  <span style="flex: 1; min-width: 80px; width: 100%;text-align: center; box-sizing: border-box;">2</span>
-                  <span style="flex: 1; min-width: 80px; width: 100%; text-align: center;box-sizing: border-box;">3</span>
-                  <span style="flex: 1; min-width: 80px; width: 100%;text-align: center; box-sizing: border-box;">4</span>
-                </div>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length >= 26">
-            <td colspan="5" style="width: 100% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item label="标定物用量" style="margin: 0;">
-                <div style="display:flex; gap: 8px; width: 100%; box-sizing: border-box;">
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[21].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 20)" 
-                    :data-row="rowIdx"
-                    :data-col="20"
-                    :id="`input-${rowIdx}-20`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[23].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 21)" 
-                    :data-row="rowIdx"
-                    :data-col="21"
-                    :id="`input-${rowIdx}-21`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[24].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 22)" 
-                    :data-row="rowIdx"
-                    :data-col="22"
-                    :id="`input-${rowIdx}-22`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[25].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 23)" 
-                    :data-row="rowIdx"
-                    :data-col="23"
-                    :id="`input-${rowIdx}-23`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                </div>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length >= 38">
-            <td colspan="5" style="width: 100% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item label="滴定体积" style="margin: 0;">
-                <div style="display:flex; gap: 8px; width: 100%; box-sizing: border-box;">
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[34].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 24)" 
-                    :data-row="rowIdx"
-                    :data-col="24"
-                    :id="`input-${rowIdx}-24`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[35].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 25)" 
-                    :data-row="rowIdx"
-                    :data-col="25"
-                    :id="`input-${rowIdx}-25`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[36].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 26)" 
-                    :data-row="rowIdx"
-                    :data-col="26"
-                    :id="`input-${rowIdx}-26`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[37].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 27)" 
-                    :data-row="rowIdx"
-                    :data-col="27"
-                    :id="`input-${rowIdx}-27`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                </div>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length >= 34">
-            <td colspan="5" style="width: 100% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item label="温度校正后的值" style="margin: 0;">
-                <div style="display:flex; gap: 8px; width: 100%; box-sizing: border-box;">
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[30].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 28)" 
-                    :data-row="rowIdx"
-                    :data-col="28"
-                    :id="`input-${rowIdx}-28`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[31].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 29)" 
-                    :data-row="rowIdx"
-                    :data-col="29"
-                    :id="`input-${rowIdx}-29`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[32].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 30)" 
-                    :data-row="rowIdx"
-                    :data-col="30"
-                    :id="`input-${rowIdx}-30`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[33].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 31)" 
-                    :data-row="rowIdx"
-                    :data-col="31"
-                    :id="`input-${rowIdx}-31`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                </div>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length >= 38">
-            <td colspan="5" style="width: 100% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item label="滴定管校正后值" style="margin: 0;">
-                <div style="display:flex; gap: 8px; width: 100%; box-sizing: border-box;">
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[34].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 32)" 
-                    :data-row="rowIdx"
-                    :data-col="32"
-                    :id="`input-${rowIdx}-32`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[35].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 33)" 
-                    :data-row="rowIdx"
-                    :data-col="33"
-                    :id="`input-${rowIdx}-33`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[36].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 34)" 
-                    :data-row="rowIdx"
-                    :data-col="34"
-                    :id="`input-${rowIdx}-34`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[37].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 35)" 
-                    :data-row="rowIdx"
-                    :data-col="35"
-                    :id="`input-${rowIdx}-35`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                </div>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length >= 43">
-            <td colspan="5" style="width: 100% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item label="实际消耗体积" style="margin: 0;">
-                <div style="display:flex; gap: 8px; width: 100%; box-sizing: border-box;">
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[39].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 36)" 
-                    :data-row="rowIdx"
-                    :data-col="36"
-                    :id="`input-${rowIdx}-36`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[40].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 37)" 
-                    :data-row="rowIdx"
-                    :data-col="37"
-                    :id="`input-${rowIdx}-37`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[41].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 38)" 
-                    :data-row="rowIdx"
-                    :data-col="38"
-                    :id="`input-${rowIdx}-38`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[42].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 39)" 
-                    :data-row="rowIdx"
-                    :data-col="39"
-                    :id="`input-${rowIdx}-39`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                </div>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length >= 49">
-            <td colspan="5" style="width: 100% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item label="计算结果值" prop="correctedV2">
-                <div style="display:flex; gap: 8px; width: 100%; box-sizing: border-box;">
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[45].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 40)" 
-                    :data-row="rowIdx"
-                    :data-col="40"
-                    :id="`input-${rowIdx}-40`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[46].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 41)" 
-                    :data-row="rowIdx"
-                    :data-col="41"
-                    :id="`input-${rowIdx}-41`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[47].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 42)" 
-                    :data-row="rowIdx"
-                    :data-col="42"
-                    :id="`input-${rowIdx}-42`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[48].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 43)" 
-                    :data-row="rowIdx"
-                    :data-col="43"
-                    :id="`input-${rowIdx}-43`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                </div>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr>
-            <td colspan="5" style="width: 100% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[38].ANLY_ITEM_NAME" style="margin: 0;">
-                <div style="display:flex; gap: 8px; width: 100%; box-sizing: border-box;">
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[38].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 44)" 
-                    :data-row="rowIdx"
-                    :data-col="44"
-                    :id="`input-${rowIdx}-44`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                </div>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr>
-            <td colspan="5" style="width: 100% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[43].ANLY_ITEM_NAME" style="margin: 0;">
-                <div style="display:flex; gap: 8px; width: 100%; box-sizing: border-box;">
-                  <el-input 
-                    size="mini" 
-                    v-model="rowData[cols[43].ANLY_ITEM_NO || '']"
-                    @keydown.native="keyDown($event, rowIdx, 45)" 
-                    :data-row="rowIdx"
-                    :data-col="45"
-                    :id="`input-${rowIdx}-45`"
-                    placeholder="请输入值"
-                    style="flex: 1; min-width: 80px; width: 100%; box-sizing: border-box;">
-                  </el-input>
-                </div>
-              </el-form-item>
-            </td>
-          </tr>
-        </table>
-
-        <table class="common-table-style4" border style="width:100%; border-collapse:collapse; table-layout: fixed;">
-          <tr v-if="cols.length > 51">
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[49].ANLY_ITEM_NAME || '字段1'" :prop="cols[49].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[49].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 46)" 
-                  :data-row="rowIdx"
-                  :data-col="46"
-                  :id="`input-${rowIdx}-46`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[50].ANLY_ITEM_NAME || '字段2'" :prop="cols[50].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[50].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 47)" 
-                  :data-row="rowIdx"
-                  :data-col="47"
-                  :id="`input-${rowIdx}-47`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length > 53">
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[51].ANLY_ITEM_NAME || '字段1'" :prop="cols[51].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[51].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 48)" 
-                  :data-row="rowIdx"
-                  :data-col="48"
-                  :id="`input-${rowIdx}-48`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[52].ANLY_ITEM_NAME || '字段2'" :prop="cols[52].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[52].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 49)" 
-                  :data-row="rowIdx"
-                  :data-col="49"
-                  :id="`input-${rowIdx}-49`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr v-if="cols.length > 55">
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[53].ANLY_ITEM_NAME || '字段1'" :prop="cols[53].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[53].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 50)" 
-                  :data-row="rowIdx"
-                  :data-col="50"
-                  :id="`input-${rowIdx}-50`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-            <td style="width: 50% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[54].ANLY_ITEM_NAME || '字段2'" :prop="cols[54].ANLY_ITEM_NO">
-                <el-input 
-                  size="mini" 
-                  v-model="rowData[cols[54].ANLY_ITEM_NO]"
-                  @keydown.native="keyDown($event, rowIdx, 51)" 
-                  :data-row="rowIdx"
-                  :data-col="51"
-                  :id="`input-${rowIdx}-51`"
-                  placeholder="请输入值">
-                </el-input>
-              </el-form-item>
-            </td>
-          </tr>
-          <tr>
-            <td colspan="2" style="width: 100% !important; padding: 8px; box-sizing: border-box;">
-              <el-form-item :label="cols[55].ANLY_ITEM_NAME" :prop="cols[55].ANLY_ITEM_NO">
-                <el-input 
-                  type="textarea" 
-                  :rows="4" 
-                  size="small"
-                  v-model="rowData[cols[55].ANLY_ITEM_NO]"  
-                  @keydown.native="keyDown($event, rowIdx, 52)" 
-                  :data-row="rowIdx"
-                  :data-col="52"
-                  :id="`input-${rowIdx}-52`"
-                  placeholder="请输入备注">
-                </el-input>
-              </el-form-item>
-            </td>
-          </tr>
-        </table>
-      </el-form>
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-  name: 'alertComponents2',
-  props: {
-    tableData: {
-      type: Array,
-      required: true,
-      default: () => []
-    },
-    // selectRowList: { // 新增:接收父组件的选中数据
-    //   type: Array,
-    //   required: true,
-    //   default: () => []
-    // },
-    cols: { // 列配置
-      type: Array,
-      required: true,
-      default: () => []
-    },
-    theight4: {
-      type: [Number, String],
-      default: 400
-    }
-  },
-  // watch: {
-  //   selectRowList: {
-  //     immediate: true, // 初始化时执行一次
-  //     deep: true,
-  //     handler(newVal) {
-  //       if (newVal.length && this.cols.length) {
-  //         this.tableData = this.formatTableData(newVal, this.cols);
-  //       } else {
-  //         this.tableData = []; // 无数据时清空
-  //       }
-  //     }
-  //   },
-  //   cols: {
-  //     immediate: true,
-  //     deep: true,
-  //     handler() {
-  //       if (this.selectRowList.length) {
-  //         this.tableData = this.formatTableData(this.selectRowList, this.cols);
-  //       }
-  //     }
-  //   }
-  // },
-  mounted() {
-    console.log('子组件接收的tableData:', this.tableData);
-    console.log('子组件接收的selectRowList:', this.selectRowList);
-    console.log('子组件接收的cols:', this.cols);
-
-    if (this.tableData.length > 0) {
-      const firstRowKeys = Object.keys(this.tableData[0]);
-      const colKeys = this.cols.map(col => col.ANLY_ITEM_NO || col.STUFF_NO).filter(Boolean);
-      const unmatch = colKeys.filter(key => !firstRowKeys.includes(key));
-      if (unmatch.length > 0) {
-        console.warn('字段不匹配(需确保tableData包含这些字段):', unmatch);
-      }
-    }
-  },
-  methods: {
-    // formatTableData(selectRowList, cols) {
-    //   return selectRowList.map(row => {
-    //     const newRow = {};
-    //     // 遍历cols,映射selectRowList的字段到tableData所需字段
-    //     cols.forEach(col => {
-    //       const key = col.ANLY_ITEM_NO || col.STUFF_NO; // tableData的目标字段名
-    //       // 关键:映射规则(根据你的业务调整,以下是通用方案)
-    //       // 方案1:selectRowList字段名与key一致 → 直接赋值
-    //       newRow[key] = row[key] || ""; 
-    //       // 方案2:selectRowList字段名与key不一致 → 手动映射(示例)
-    //       // newRow[key] = row.原始字段名 || ""; 
-    //     });
-    //     return newRow;
-    //   });
-    // },
-    keyDown(event, rowIdx, colIdx) {
-      const isTextarea = event.target.tagName === 'TEXTAREA';
-      if (event.key !== 'Enter' || isTextarea) return;
-
-      event.preventDefault();
-      event.stopPropagation();
-
-      const getValidInputs = (targetRowIdx) => {
-        const rowInputWrappers = Array.from(document.querySelectorAll(`[data-row="${targetRowIdx}"]`));
-        const nativeInputs = rowInputWrappers.map(wrapper => {
-          return wrapper.querySelector('input, textarea') || wrapper;
-        }).filter(input => {
-          return !input.disabled && 
-                 !input.readOnly && 
-                 input.style.display !== 'none' && 
-                 input.offsetParent !== null;
-        }).sort((a, b) => {
-          const aCol = parseInt(a.dataset.col || 0);
-          const bCol = parseInt(b.dataset.col || 0);
-          return aCol - bCol;
-        });
-
-        return nativeInputs;
-      };
-      const currentRowInputs = getValidInputs(rowIdx);
-      if (currentRowInputs.length === 0) return;
-
-      const currentInput = event.target;
-      const currentIndex = currentRowInputs.findIndex(input => input === currentInput);
-
-      if (currentIndex === -1) return;
-
-      this.$nextTick(() => {
-        if (currentIndex < currentRowInputs.length - 1) {
-          currentRowInputs[currentIndex + 1].focus();
-          if (currentRowInputs[currentIndex + 1].tagName === 'INPUT') {
-            currentRowInputs[currentIndex + 1].select();
-          }
-        } else {
-          const nextRowIdx = rowIdx + 1;
-          const nextRowInputs = getValidInputs(nextRowIdx);
-          if (nextRowInputs.length > 0) {
-            nextRowInputs[0].focus();
-            if (nextRowInputs[0].tagName === 'INPUT') {
-              nextRowInputs[0].select();
-            }
-          } else {
-            currentRowInputs[0].focus();
-            if (currentRowInputs[0].tagName === 'INPUT') {
-              currentRowInputs[0].select();
-            }
-          }
-        }
-      });
-    },
-    handleInputChange(row, field, index) {
-      this.$emit('data-change', row, field, index);
-    }
-  }
-}
-</script>
-
-<style scoped>
-.common-table-style4 {
-  font-size: 14px;
-  color: #666;
-}
-
-.common-table-style4 td {
-  border: 1px solid #e6e6e6;
-  padding: 8px;
-}
-
-/* 聚焦输入框高亮样式(可选) */
-:deep(input:focus), :deep(textarea:focus) {
-  border-color: #409eff;
-  box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
-  outline: none;
-}
-</style>
+<template>
+  <div class="batch-calibration-table">
+    <div v-for="(rowData, rowIdx) in tableData" :key="rowIdx" class="form-block">
+      <el-form :model="rowData" ref="tablePllr" label-width="130px" style="width: 100%">
+        <!-- 顶部标题 -->
+        <div style="text-align:center; margin:10px 0;">
+          <div style="font-size:16px; font-weight:bold;">广西北港新材料有限公司检测中心</div>
+          <div style="font-size:18px; font-weight:bold; margin:5px 0;">标准溶液标定记录</div>
+          <div style="display:flex; justify-content:space-between; font-size:13px; margin:5px 10px;">
+            <span>BBWXCLJC-4-11-03</span>
+            <span>编号:{{ rowData.recordNo || '2025092702-2' }}</span>
+          </div>
+        </div>
+
+        <!-- 表格主体:统一6列等宽布局 -->
+        <table class="common-table-style4 fixed-layout" border style="width:100%;border-collapse:collapse;">
+          <!-- 定义6列等宽 -->
+          <colgroup>
+            <col style="width:16.6666%">
+            <col style="width:16.6666%">
+            <col style="width:16.6666%">
+            <col style="width:16.6666%">
+            <col style="width:16.6666%">
+            <col style="width:16.6666%">
+          </colgroup>
+
+          <!-- 标定序号行(合并6列) -->
+          <tr>
+            <td colspan="6" style="text-align:center; padding:6px; font-weight:bold;">标定{{ rowIdx + 1 }}</td>
+          </tr>
+
+          <!-- 基础信息行1:溶液名称 + 溶液编号 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">溶液名称</td>
+            <td colspan="2" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[0] ? cols[0].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="0" @keydown.native="handleKeyDown($event, rowIdx, 0)"></el-input>
+            </td>
+            <td style="padding:6px; text-align:right; font-weight:bold;">溶液编号</td>
+            <td colspan="2" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[1] ? cols[1].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="1" @keydown.native="handleKeyDown($event, rowIdx, 1)"></el-input>
+            </td>
+          </tr>
+
+          <!-- 基础信息行2:标定物名称 + 标定物编号 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">标定物名称</td>
+            <td colspan="2" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[2] ? cols[2].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="2" @keydown.native="handleKeyDown($event, rowIdx, 2)"></el-input>
+            </td>
+            <td style="padding:6px; text-align:right; font-weight:bold;">标定物编号</td>
+            <td colspan="2" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[3] ? cols[3].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="3" @keydown.native="handleKeyDown($event, rowIdx, 3)"></el-input>
+            </td>
+          </tr>
+
+          <!-- 基础信息行3:标定物级别批号 + 标定物厂家 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">标定物级别批号</td>
+            <td colspan="2" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[4] ? cols[4].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="4" @keydown.native="handleKeyDown($event, rowIdx, 4)"></el-input>
+            </td>
+            <td style="padding:6px; text-align:right; font-weight:bold;">标定物厂家</td>
+            <td colspan="2" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[5] ? cols[5].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="5" @keydown.native="handleKeyDown($event, rowIdx, 5)"></el-input>
+            </td>
+          </tr>
+
+          <!-- 干燥/灼烧仪器 + 仪器编号 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">干燥/灼烧仪器</td>
+            <td colspan="2" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[6] ? cols[6].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="6" @keydown.native="handleKeyDown($event, rowIdx, 6)"></el-input>
+            </td>
+            <td style="padding:6px; text-align:right; font-weight:bold;">干燥/灼烧仪器编号</td>
+            <td colspan="2" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[7] ? cols[7].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="7" @keydown.native="handleKeyDown($event, rowIdx, 7)"></el-input>
+            </td>
+          </tr>
+
+          <!-- 干燥/灼烧温度 + 干燥/灼烧时间 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">干燥/灼烧温度(℃)</td>
+            <td colspan="2" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[8] ? cols[8].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="8" @keydown.native="handleKeyDown($event, rowIdx, 8)"></el-input>
+            </td>
+            <td style="padding:6px; text-align:right; font-weight:bold;">干燥/灼烧时间(h)</td>
+            <td colspan="2" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[9] ? cols[9].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="9" @keydown.native="handleKeyDown($event, rowIdx, 9)"></el-input>
+            </td>
+          </tr>
+
+          <!-- 干燥/灼烧恒重(单字段,合并5列) -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">干燥/灼烧恒重(g)</td>
+            <td colspan="5" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[10] ? cols[10].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="10" @keydown.native="handleKeyDown($event, rowIdx, 10)"></el-input>
+            </td>
+          </tr>
+
+          <!-- 环境参数:温度、水温、湿度(三组,每组占2列) -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">温度(℃)</td>
+            <td colspan="1" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[14] ? cols[14].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="14" @keydown.native="handleKeyDown($event, rowIdx, 14)"></el-input>
+            </td>
+            <td style="padding:6px; text-align:right; font-weight:bold;">水温(℃)</td>
+            <td colspan="1" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[15] ? cols[15].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="15" @keydown.native="handleKeyDown($event, rowIdx, 15)"></el-input>
+            </td>
+            <td style="padding:6px; text-align:right; font-weight:bold;">湿度(%)</td>
+            <td colspan="1" style="padding:6px;">
+              <el-input size="mini" v-model="rowData[cols[16] ? cols[16].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="16" @keydown.native="handleKeyDown($event, rowIdx, 16)"></el-input>
+            </td>
+          </tr>
+
+          <!-- ========= 标定数据区域:6列等宽 ========= -->
+          <!-- 表头行:标定序号、1、2、3、4、空 -->
+          <tr style="font-weight:bold; text-align:center;">
+            <td style="padding:6px;">标定序号</td>
+            <td style="padding:6px;">1</td>
+            <td style="padding:6px;">2</td>
+            <td style="padding:6px;">3</td>
+            <td style="padding:6px;">4</td>
+            <td style="padding:6px;"></td>
+          </tr>
+
+          <!-- 标定物用量 (g/ml) -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">标定物用量(g/ml)</td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[21] ? cols[21].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="21" @keydown.native="handleKeyDown($event, rowIdx, 21)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[23] ? cols[23].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="23" @keydown.native="handleKeyDown($event, rowIdx, 23)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[24] ? cols[24].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="24" @keydown.native="handleKeyDown($event, rowIdx, 24)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[25] ? cols[25].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="25" @keydown.native="handleKeyDown($event, rowIdx, 25)"></el-input></td>
+            <td style="padding:6px;"></td>
+          </tr>
+
+          <!-- 滴定初读数V₀(ml) -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">滴定初读数V₀(ml)</td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[26] ? cols[26].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="26" @keydown.native="handleKeyDown($event, rowIdx, 26)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[27] ? cols[27].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="27" @keydown.native="handleKeyDown($event, rowIdx, 27)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[28] ? cols[28].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="28" @keydown.native="handleKeyDown($event, rowIdx, 28)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[29] ? cols[29].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="29" @keydown.native="handleKeyDown($event, rowIdx, 29)"></el-input></td>
+            <td style="padding:6px;"></td>
+          </tr>
+
+          <!-- 滴定末读数V₁(ml) -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">滴定末读数V₁(ml)</td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[30] ? cols[30].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="30" @keydown.native="handleKeyDown($event, rowIdx, 30)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[31] ? cols[31].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="31" @keydown.native="handleKeyDown($event, rowIdx, 31)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[32] ? cols[32].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="32" @keydown.native="handleKeyDown($event, rowIdx, 32)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[33] ? cols[33].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="33" @keydown.native="handleKeyDown($event, rowIdx, 33)"></el-input></td>
+            <td style="padding:6px;"></td>
+          </tr>
+
+          <!-- 滴定体积V₃(ml) - 自动计算只读 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">滴定体积V₃(ml)</td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[34] ? cols[34].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="34"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[35] ? cols[35].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="35"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[36] ? cols[36].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="36"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[37] ? cols[37].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="37"></el-input></td>
+            <td style="padding:6px;"></td>
+          </tr>
+
+          <!-- 温度校正后值V₄(ml) - 自动计算只读 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">温度校正后值V₄(ml)</td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[38] ? cols[38].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="38"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[39] ? cols[39].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="39"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[40] ? cols[40].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="40"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[41] ? cols[41].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="41"></el-input></td>
+            <td style="padding:6px;"></td>
+          </tr>
+
+          <!-- 滴定管校正后值V₅(ml) - 自动计算只读 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">滴定管校正后值V₅(ml)</td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[42] ? cols[42].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="42"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[43] ? cols[43].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="43"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[44] ? cols[44].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="44"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[45] ? cols[45].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="45"></el-input></td>
+            <td style="padding:6px;"></td>
+          </tr>
+
+          <!-- 空白试验体积V₆(ml) -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">空白试验体积V₆(ml)</td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[46] ? cols[46].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="46" @keydown.native="handleKeyDown($event, rowIdx, 46)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[47] ? cols[47].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="47" @keydown.native="handleKeyDown($event, rowIdx, 47)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[48] ? cols[48].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="48" @keydown.native="handleKeyDown($event, rowIdx, 48)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[49] ? cols[49].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="49" @keydown.native="handleKeyDown($event, rowIdx, 49)"></el-input></td>
+            <td style="padding:6px;"></td>
+          </tr>
+
+          <!-- 实际消耗体积V(ml) - 自动计算只读 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">实际消耗体积V(ml)</td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[50] ? cols[50].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="50"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[51] ? cols[51].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="51"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[52] ? cols[52].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="52"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" readonly v-model="rowData[cols[53] ? cols[53].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="53"></el-input></td>
+            <td style="padding:6px;"></td>
+          </tr>
+
+          <!-- 计算公式(合并6列) -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">计算公式</td>
+            <td colspan="5" style="padding:6px;">
+              <el-input type="textarea" :rows="2" size="mini" v-model="rowData[cols[54] ? cols[54].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="54" @keydown.native="handleKeyDown($event, rowIdx, 54)"></el-input>
+            </td>
+          </tr>
+
+          <!-- 结果计算值 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">结果计算值</td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[55] ? cols[55].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="55" @keydown.native="handleKeyDown($event, rowIdx, 55)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[56] ? cols[56].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="56" @keydown.native="handleKeyDown($event, rowIdx, 56)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[57] ? cols[57].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="57" @keydown.native="handleKeyDown($event, rowIdx, 57)"></el-input></td>
+            <td style="padding:6px;"><el-input size="mini" v-model="rowData[cols[58] ? cols[58].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="58" @keydown.native="handleKeyDown($event, rowIdx, 58)"></el-input></td>
+            <td style="padding:6px;"></td>
+          </tr>
+
+          <!-- 平均值与极差 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">单人结果平均值1</td>
+            <td colspan="2" style="padding:6px;">
+              <el-input size="mini" readonly v-model="rowData[cols[59] ? cols[59].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="59"></el-input>
+            </td>
+            <td style="padding:6px; text-align:right; font-weight:bold;">CR0.95(4)r-1</td>
+            <td style="padding:6px;">
+              <el-input size="mini" readonly v-model="rowData[cols[60] ? cols[60].ANLY_ITEM_NO : '']" :data-row="rowIdx" :data-col="60"></el-input>
+            </td>
+            <td style="padding:6px; font-weight:bold;">(≤0.15)</td>
+          </tr>
+
+          <!-- 标定人员与日期 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">标定日期</td>
+            <td colspan="2" style="padding:6px;">
+              <el-date-picker size="mini" type="date" value-format="yyyy-MM-dd" v-model="rowData.calibDate" style="width:100%"></el-date-picker>
+            </td>
+            <td style="padding:6px; text-align:right; font-weight:bold;">标定人员</td>
+            <td colspan="2" style="padding:6px;">
+              <el-input size="mini" v-model="rowData.calibUser" :data-row="rowIdx" :data-col="61" @keydown.native="handleKeyDown($event, rowIdx, 61)"></el-input>
+            </td>
+          </tr>
+
+          <!-- 复核人员与日期 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">复核日期</td>
+            <td colspan="2" style="padding:6px;">
+              <el-date-picker size="mini" type="date" value-format="yyyy-MM-dd" v-model="rowData.reviewDate" style="width:100%"></el-date-picker>
+            </td>
+            <td style="padding:6px; text-align:right; font-weight:bold;">复核人员</td>
+            <td colspan="2" style="padding:6px;">
+              <el-input size="mini" v-model="rowData.reviewUser" :data-row="rowIdx" :data-col="62" @keydown.native="handleKeyDown($event, rowIdx, 62)"></el-input>
+            </td>
+          </tr>
+
+          <!-- 备注 -->
+          <tr>
+            <td style="padding:6px; text-align:right; font-weight:bold;">备 注</td>
+            <td colspan="5" style="padding:6px;">
+              <el-input type="textarea" :rows="2" size="mini" placeholder="无相关数据处保持空白状态" v-model="rowData.remark" :data-row="rowIdx" :data-col="63" @keydown.native="handleKeyDown($event, rowIdx, 63)"></el-input>
+            </td>
+          </tr>
+        </table>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "BatchCalibrationTable",
+  props: {
+    tableData: {
+      type: Array,
+      required: true,
+      default: function() {
+        return [];
+      }
+    },
+    cols: {
+      type: Array,
+      required: true,
+      default: function() {
+        return [];
+      }
+    },
+    theight4: {
+      type: [Number, String],
+      default: 400
+    }
+  },
+  mounted: function() {
+    this.validateFieldMapping();
+  },
+  methods: {
+    validateFieldMapping: function() {
+      if (this.tableData.length === 0 || this.cols.length === 0) {
+        return;
+      }
+      var firstRow = this.tableData[0];
+      var dataKeys = Object.keys(firstRow);
+      var configKeys = [];
+      for (var i = 0; i < this.cols.length; i++) {
+        var col = this.cols[i];
+        if (!col) continue;
+        var key = col.ANLY_ITEM_NO || col.STUFF_NO;
+        if (key) {
+          configKeys.push(key);
+        }
+      }
+      var missingKeys = [];
+      for (var j = 0; j < configKeys.length; j++) {
+        var k = configKeys[j];
+        if (dataKeys.indexOf(k) === -1) {
+          missingKeys.push(k);
+        }
+      }
+      if (missingKeys.length > 0) {
+        console.warn("字段不匹配:", missingKeys);
+      }
+    },
+    handleKeyDown: function(event, rowIdx, colIdx) {
+      var tagName = event.target.tagName;
+      var isTextArea = (tagName === "TEXTAREA");
+      if (event.key !== "Enter" || isTextArea) {
+        return;
+      }
+      event.preventDefault();
+      var getAvailableInputs = function(targetRow) {
+        var selector = '[data-row="' + targetRow + '"]';
+        var wrappers = document.querySelectorAll(selector);
+        var list = [];
+        for (var i = 0; i < wrappers.length; i++) {
+          var wrap = wrappers[i];
+          var el = wrap.querySelector("input,textarea") || wrap;
+          if (!el) continue;
+          if (el.disabled || el.readOnly) continue;
+          if (el.offsetParent === null) continue;
+          list.push(el);
+        }
+        list.sort(function(a, b) {
+          var c1 = parseInt(a.dataset.col || 0, 10);
+          var c2 = parseInt(b.dataset.col || 0, 10);
+          return c1 - c2;
+        });
+        return list;
+      };
+      var currentInputs = getAvailableInputs(rowIdx);
+      var current = null;
+      for (var i = 0; i < currentInputs.length; i++) {
+        if (currentInputs[i] === event.target) {
+          current = currentInputs[i];
+          break;
+        }
+      }
+      if (!current) return;
+      var index = -1;
+      for (var i = 0; i < currentInputs.length; i++) {
+        if (currentInputs[i] === current) {
+          index = i;
+          break;
+        }
+      }
+      if (index === -1) return;
+      var that = this;
+      this.$nextTick(function() {
+        if (index < currentInputs.length - 1) {
+          var nextInput = currentInputs[index + 1];
+          if (nextInput) {
+            nextInput.focus();
+            if (nextInput.tagName === "INPUT") {
+              nextInput.select();
+            }
+          }
+        } else {
+          var nextRow = rowIdx + 1;
+          var nextInputs = getAvailableInputs(nextRow);
+          var target;
+          if (nextInputs.length > 0) {
+            target = nextInputs[0];
+          } else {
+            target = currentInputs[0];
+          }
+          if (target) {
+            target.focus();
+            if (target.tagName === "INPUT") {
+              target.select();
+            }
+          }
+        }
+      });
+    },
+    handleInputChange: function(row, field, index) {
+      this.$emit("data-change", row, field, index);
+    }
+  }
+};
+</script>
+
+<style scoped>
+.common-table-style4 {
+  font-size: 13px;
+  color: #333;
+  width: 100%;
+  border: 1px solid #999;
+}
+.common-table-style4 td {
+  border: 1px solid #999;
+  padding: 4px;
+  vertical-align: middle;
+}
+/* 固定布局确保等宽生效 */
+.common-table-style4.fixed-layout {
+  table-layout: fixed;
+}
+.form-block {
+  margin-bottom: 20px;
+}
+:deep(.el-form-item) {
+  margin-bottom: 0;
+}
+:deep(.el-input__inner) {
+  border-radius: 0;
+}
+:deep(.el-textarea__inner) {
+  border-radius: 0;
+}
+</style>

+ 2 - 2
src/views/resourceManager/components/standardFluidManagement/standardFluidManagement.vue

@@ -584,7 +584,7 @@ export default {
                 }
                 }
             }
             }
         },
         },
-    
+
     jisuan(){
     jisuan(){
       if(this.selectRowChangeList.length < 0){
       if(this.selectRowChangeList.length < 0){
         this.$message.warning('计算没有数据')
         this.$message.warning('计算没有数据')
@@ -1077,7 +1077,7 @@ export default {
         });
         });
 
 
     },
     },
-    
+
     searchData1(val) {
     searchData1(val) {
         this.dataLoading = true;
         this.dataLoading = true;
         this.page.pageNum = 1;
         this.page.pageNum = 1;

+ 1 - 2
src/views/standardManagement/app.html

@@ -10,14 +10,13 @@
     <link href="../static/css/common.css" rel="stylesheet"/>
     <link href="../static/css/common.css" rel="stylesheet"/>
     <link href="../static/img/favicon.ico" rel="shortcut icon"/>
     <link href="../static/img/favicon.ico" rel="shortcut icon"/>
     <script src="../static/lib/jquery/jquery.min.js" type="text/javascript"></script>
     <script src="../static/lib/jquery/jquery.min.js" type="text/javascript"></script>
-
     <!--<script src="../static/lib/miniui/scripts/boot.js" type="text/javascript"></script>-->
     <!--<script src="../static/lib/miniui/scripts/boot.js" type="text/javascript"></script>-->
     <script src="../static/lib/jquery/jquery.PrintArea.js" type="text/javascript"></script>
     <script src="../static/lib/jquery/jquery.PrintArea.js" type="text/javascript"></script>
     <script src="../static/lib/qrcode.min.js" type="text/javascript"></script>
     <script src="../static/lib/qrcode.min.js" type="text/javascript"></script>
     <script src='../static/lib/XLSX/xlsx.core.min.js' type='text/javascript'></script>
     <script src='../static/lib/XLSX/xlsx.core.min.js' type='text/javascript'></script>
     <!--<script src="../static/lib/swiper/js/swiper.min.js" type="text/javascript"></script>-->
     <!--<script src="../static/lib/swiper/js/swiper.min.js" type="text/javascript"></script>-->
-
     <script src="../static/js/common.js" type="text/javascript"></script>
     <script src="../static/js/common.js" type="text/javascript"></script>
+    <script src="http://192.168.3.34:9898/web-apps/apps/api/documents/api.js"></script>
 
 
   </head>
   </head>
   <body>
   <body>

+ 149 - 0
src/views/standardManagement/components/systemFileManagement/OnlyofficeEditor.vue

@@ -0,0 +1,149 @@
+<template>
+  <div ref="officeEditor" class="office-editor"></div>
+</template>
+
+<script>
+export default {
+  name: 'OnlyofficeEditor',
+  props: {
+    documentUrl: { type: String, required: true },
+    title: { type: String, default: '文档.docx' },
+    fileType: { type: String, default: 'docx' },
+    isEdit: { type: Boolean, default: true },
+    callbackUrl: { type: String, default: '' },
+    documentKey: { type: String, default: '' },
+    data: { type: Object, default: () => ({}) }
+  },
+  data() {
+    return {
+      docEditor: null
+    }
+  },
+  mounted() {
+    console.log('[OnlyofficeEditor] mounted, documentUrl=', this.documentUrl)
+    this.$nextTick(() => {
+    if (this.documentUrl) {
+      this.initEditor();
+    }
+   });
+  this.$nextTick(() => {
+  console.log('editor height:', this.$refs.officeEditor.offsetHeight);
+  })
+  },
+  beforeDestroy() {
+    this.destroyEditor()
+  },
+  watch: {
+    documentUrl: {
+      handler(newVal, oldVal) {
+        console.log('[OnlyofficeEditor] documentUrl changed from', oldVal, 'to', newVal)
+        if (newVal && newVal !== oldVal) {
+          this.reinitEditor()
+        }
+      },
+      immediate: false
+    }
+  },
+  methods: {
+    getDocumentType(ext) {
+      const textTypes = ['doc', 'docm', 'docx', 'dot', 'dotm', 'dotx', 'odt', 'ott', 'rtf', 'txt']
+      const spreadTypes = ['xls', 'xlsm', 'xlsx', 'xlt', 'xltm', 'xltx', 'ods', 'ots', 'csv']
+      const presentTypes = ['ppt', 'pptm', 'pptx', 'pps', 'ppsm', 'ppsx', 'pot', 'potm', 'potx', 'odp', 'otp']
+      if (textTypes.includes(ext)) return 'text'
+      if (spreadTypes.includes(ext)) return 'spreadsheet'
+      if (presentTypes.includes(ext)) return 'presentation'
+      return 'text'
+    },
+    generateKey() {
+      return `${this.title}_${Date.now()}_${Math.random().toString(36).substring(2)}`
+    },
+    initEditor() {
+      console.log('[OnlyofficeEditor] initEditor called with url:', this.documentUrl)
+      console.log('[OnlyofficeEditor] Mount element:', this.$refs.officeEditor);
+      // 如果 DocsAPI 还未加载,等待100ms后重试
+      if (!window.DocsAPI) {
+        console.warn('DocsAPI not ready, retrying...');
+        setTimeout(() => this.initEditor(), 100);
+        return;
+      }
+      console.log('DocsAPI ready, initializing with url:', this.documentUrl);
+      if (!this.documentUrl) {
+        console.warn('[OnlyofficeEditor] documentUrl is empty, cannot init editor')
+        return
+      }
+      if (!this.$refs.officeEditor) {
+        console.error('[OnlyofficeEditor] officeEditor ref not found')
+        return
+      }
+
+      const config = {
+        document: {
+        url: 'http://192.168.254.22:9002/files/oss-volume-SA20260316152536737.docx', // 硬编码测试
+        title: 'test.docx',
+        fileType: 'docx',
+        key: 'test-key'
+      },
+      documentType: 'text',
+      height: '100%',
+      width: '100%',
+        editorConfig: {
+          mode: this.isEdit ? 'edit' : 'view',
+          lang: 'zh',
+          callbackUrl: this.callbackUrl,
+          customization: {
+            autosave: true,
+            chat: false,
+            comments: true,
+            help: false,
+            spellcheck: true
+          },
+          custom: this.data
+        },
+        events: {
+          onError: (error) => {
+            console.error('[OnlyofficeEditor] Error event:', error);
+          },
+          onAppReady: () => {
+            console.log('[OnlyofficeEditor] App ready');
+          },
+          onDocumentReady: () => {
+            console.log('[OnlyofficeEditor] Document ready');
+          },
+          onRequestClose: () => {
+            console.log('[OnlyofficeEditor] Request close');
+          }
+        },
+        height: '100%',
+        width: '100%'
+      }
+
+      try {
+        this.docEditor = new window.DocsAPI.DocEditor(this.$refs.officeEditor, config)
+        console.log('[OnlyofficeEditor] Editor instance created successfully')
+      } catch (error) {
+        console.error('[OnlyofficeEditor] Failed to create editor:', error)
+      }
+    },
+    destroyEditor() {
+      if (this.docEditor && typeof this.docEditor.destroyEditor === 'function') {
+        this.docEditor.destroyEditor()
+        this.docEditor = null
+        console.log('[OnlyofficeEditor] Editor destroyed')
+      }
+    },
+    reinitEditor() {
+      console.log('[OnlyofficeEditor] Reinitializing editor')
+      this.destroyEditor()
+      this.initEditor()
+    }
+  }
+}
+</script>
+
+<style scoped>
+.office-editor {
+  width: 100%;
+  height: 100%;
+  min-height: 600px;
+}
+</style>

+ 25 - 6
src/views/standardManagement/components/systemFileManagement/batchFileUploadComponents.vue

@@ -57,7 +57,12 @@
             ></el-option>
             ></el-option>
           </el-select>
           </el-select>
         </el-form-item>
         </el-form-item>
-
+        <el-form-item prop="isTemp" label="是否模板">
+          <el-select v-model="batchForm.isTemp" filterable collapse-tags size="small" style="width: 80px">
+            <el-option v-for="(item, index) in isTempList" :key="index" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item prop="memo" label="备注(批量)">
         <el-form-item prop="memo" label="备注(批量)">
           <el-input
           <el-input
             v-model="batchForm.memo"
             v-model="batchForm.memo"
@@ -129,13 +134,25 @@ export default {
         uploadType: '1', // 上传方式:1-原名,2-随机名
         uploadType: '1', // 上传方式:1-原名,2-随机名
         fileDate: _this.formatDate(new Date()), // 文件日期
         fileDate: _this.formatDate(new Date()), // 文件日期
         memo: '', // 备注
         memo: '', // 备注
-        audit: '1' // 是否审核:1-是,0-否
+        audit: '1', // 是否审核:1-是,0-否,
+        isTemp: '是'
+      },
+      batchFormCache: {
+        uploadType: '1', // 上传方式:1-原名,2-随机名
+        fileDate: _this.formatDate(new Date()), // 文件日期
+        memo: '', // 备注
+        audit: '1', // 是否审核:1-是,0-否,
+        isTemp: '是'
       },
       },
       selectedFileList: [], // 本地暂存的文件列表(核心校验)
       selectedFileList: [], // 本地暂存的文件列表(核心校验)
       isSmpType: [
       isSmpType: [
         { id: "0", isSmp: "否" },
         { id: "0", isSmp: "否" },
         { id: "1", isSmp: "是" },
         { id: "1", isSmp: "是" },
       ],
       ],
+      isTempList: [
+        { value: "否", label: "否" },
+        { value: "是", label: "是" },
+      ],
       // 仅校验:本地是否选文件、表单必填项是否填
       // 仅校验:本地是否选文件、表单必填项是否填
       ruleValidate: {
       ruleValidate: {
         uploadType: [{ required: true, message: '请选择上传方式', trigger: 'change' }],
         uploadType: [{ required: true, message: '请选择上传方式', trigger: 'change' }],
@@ -224,7 +241,9 @@ export default {
         formData.append('fileDate', _this.batchForm.fileDate);
         formData.append('fileDate', _this.batchForm.fileDate);
         formData.append('memo', _this.batchForm.memo || '');
         formData.append('memo', _this.batchForm.memo || '');
         formData.append('audit', _this.batchForm.audit);
         formData.append('audit', _this.batchForm.audit);
-
+        formData.append('fileNo', _this.batchForm.fileNo);
+        formData.append('tenantNo', _this.batchForm.tenantNo);
+        formData.append('isTemp', _this.batchForm.isTemp);
         // 第二步:追加多文件【原写法不变】- 相同key=file,多次append原始文件
         // 第二步:追加多文件【原写法不变】- 相同key=file,多次append原始文件
         for (var j = 0; j < validFiles.length; j++) {
         for (var j = 0; j < validFiles.length; j++) {
           var fileItem = validFiles[j];
           var fileItem = validFiles[j];
@@ -294,9 +313,9 @@ export default {
       }
       }
     },
     },
     recordObj(newVal, oldVal) {
     recordObj(newVal, oldVal) {
-      this.editData = { ...this.editDataCache, ...newVal }
-      if (this.editData.fileDate == null || this.editData.fileDate == "") {
-        this.editData.fileDate = this.getYNM(new Date())
+      this.batchForm = { ...this.batchFormCache, ...newVal }
+      if (this.batchForm.fileDate == null || this.batchForm.fileDate == "") {
+        this.batchForm.fileDate = this.getYNM(new Date())
       }
       }
     }
     }
   }
   }

+ 219 - 0
src/views/standardManagement/components/systemFileManagement/fourFileOnlineEdit.vue

@@ -0,0 +1,219 @@
+<template>
+  <el-container class="layout-container">
+    <!-- 主体左右分栏 -->
+    <el-container>
+      <!-- 左侧树区域 -->
+      <el-aside width="300px" class="aside-tree">
+        <div class="tree-header">
+          <el-input
+            v-model="filterText"
+            placeholder="搜索模板"
+            size="small"
+            prefix-icon="el-icon-search"
+            clearable
+          />
+          <el-button-group style="display: flex;">
+            <el-button size="mini" icon="el-icon-arrow-down" @click="expandAll">展开</el-button>
+            <el-button size="mini" icon="el-icon-arrow-up" @click="collapseAll">折叠</el-button>
+          </el-button-group>
+        </div>
+
+        <el-tree
+          ref="tree"
+          :data="treeData"
+          :props="defaultProps"
+          :filter-node-method="filterNode"
+          node-key="id"
+          highlight-current
+          @node-click="handleNodeClick"
+          class="tree-content"
+        >
+          <span slot-scope="{ node, data }" class="custom-tree-node">
+            <i :class="data.isFolder ? 'el-icon-menu' : 'el-icon-document'"></i>
+            <span>{{ node.label }}</span>
+          </span>
+        </el-tree>
+      </el-aside>
+
+      <!-- 右侧编辑器区域 -->
+      <el-main class="main-editor">
+        <div v-if="!currentFile" class="placeholder">
+          请从左侧选择一个模板文档
+        </div>
+        <div v-else class="editor-wrapper">
+          <OnlyofficeEditor
+            :key="editorKey"
+            :document-url="documentUrl"
+            :title="currentFile.name"
+            :file-type="currentFile.ext"
+            :callback-url="callbackUrl"
+            :data="{ templateId: currentFile.id }"
+            @document-ready="onDocumentReady"
+          />
+          <div class="editor-footer">
+            <span>当前编辑:{{ currentFile.name }}</span>
+            <el-button type="primary" size="small" @click="handleSave">保存</el-button>
+          </div>
+        </div>
+      </el-main>
+    </el-container>
+  </el-container>
+</template>
+
+<script>
+import OnlyofficeEditor from './OnlyofficeEditor.vue'
+
+export default {
+  name: 'TemplateEditor',
+  components: { OnlyofficeEditor },
+  data() {
+    return {
+      filterText: '',            // 搜索关键字
+      treeData: [],              // 树数据
+      defaultProps: {
+        children: 'children',
+        label: 'label',
+        isFolder: 'isFolder' // 标识是否为文件夹
+      },
+      currentFile: null,         // 当前选中的文件节点
+      documentUrl: '',           // 传递给编辑器的签名URL
+      editorKey: 0,              // 用于强制刷新编辑器
+      callbackUrl: process.env.VUE_APP_API_BASE + '/api/onlyoffice/callback' // 保存回调地址
+    }
+  },
+  watch: {
+    filterText(val) {
+      this.$refs.tree.filter(val)
+    }
+  },
+  mounted() {
+    this.loadTreeData()
+  },
+  methods: {
+    // 加载左侧树
+    async loadTreeData() {
+      try {
+        const { data } = await this.getTemplateTree()
+        this.treeData = data
+      } catch (error) {
+        this.$message.error('加载模板树失败')
+      }
+    },
+    getTemplateTree() {
+      return this.axios.get('pass/baseManagement/v1/limsisofileds/getFiletree')
+    },
+    // 树节点过滤
+    filterNode(value, data) {
+      if (!value) return true
+      return data.label.toLowerCase().includes(value.toLowerCase())
+    },
+
+    // 展开所有节点
+    expandAll() {
+      const nodes = this.$refs.tree.store.nodesMap
+      Object.values(nodes).forEach(node => node.expand())
+    },
+
+    // 折叠所有节点
+    collapseAll() {
+      const nodes = this.$refs.tree.store.nodesMap
+      Object.values(nodes).forEach(node => node.collapse())
+    },
+
+    // 点击树节点
+    async handleNodeClick(data) {
+      if (data.isFolder) return // 文件夹不可编辑
+      this.currentFile = {
+        id: data.id,
+        name: data.label,
+        ext: this.getFileExt(data.label),
+        path: "http://192.168.254.22:9002/files/" + data.url // 假设后端返回了文件路径
+      }
+
+      // 获取签名URL
+      try {
+        this.documentUrl = this.currentFile.path
+        console.log('文件访问链接:', this.documentUrl)
+      } catch (error) {
+        this.$message.error('获取文件访问链接失败')
+      }
+    },
+
+    // 获取文件扩展名
+    getFileExt(filename) {
+      return filename.split('.').pop().toLowerCase()
+    },
+
+    // 编辑器加载完成事件
+    onDocumentReady() {
+      console.log('编辑器已就绪')
+    },
+
+    // 手动触发保存(可选)
+    handleSave() {
+      // 由于ONLYOFFICE自带保存功能(通过回调),此按钮可保留用于提示
+      this.$message.info('编辑后请稍等,自动保存中...')
+      // 如果需要强制触发ONLYOFFICE的保存,可以调用编辑器实例的方法(如果有)
+      // 但通常自动保存已足够
+    }
+  }
+}
+</script>
+
+<style scoped>
+.layout-container {
+  height: 100vh;
+}
+.header {
+  background-color: #409EFF;
+  color: white;
+  line-height: 60px;
+  padding-left: 20px;
+}
+.aside-tree {
+  background-color: #f5f7fa;
+  border-right: 1px solid #e6e9ed;
+  padding: 10px;
+  overflow-y: auto;
+}
+.tree-header {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+  margin-bottom: 10px;
+}
+.tree-content {
+  background-color: transparent;
+}
+.custom-tree-node {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+}
+.main-editor {
+  padding: 0;
+  display: flex;
+  flex-direction: column;
+}
+.placeholder {
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #909399;
+  font-size: 16px;
+}
+.editor-wrapper {
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+}
+.editor-footer {
+  padding: 8px 16px;
+  background-color: #f5f7fa;
+  border-top: 1px solid #e6e9ed;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+</style>

+ 12 - 1
src/views/standardManagement/components/systemFileManagement/recordAlertComponents.vue

@@ -25,6 +25,12 @@
             </el-option>
             </el-option>
           </el-select>
           </el-select>
         </el-form-item>
         </el-form-item>
+        <el-form-item prop="isTemp" label="是否模板">
+          <el-select v-model="editData.isTemp" filterable collapse-tags size="small" style="width: 80px">
+            <el-option v-for="(item, index) in isTempList" :key="index" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item label="文件上传">
         <el-form-item label="文件上传">
           <el-input v-model="editData.filePath01" size="small" readonly disabled
           <el-input v-model="editData.filePath01" size="small" readonly disabled
             style="width: 192px; display: inline-block"></el-input>
             style="width: 192px; display: inline-block"></el-input>
@@ -62,7 +68,8 @@ export default {
         fileName: '',
         fileName: '',
         fileDate: '',
         fileDate: '',
         memo: '',
         memo: '',
-        filePath01: ''
+        filePath01: '',
+        isTemp: '是'
       },
       },
       editDataCache: {
       editDataCache: {
         fileName: '',
         fileName: '',
@@ -79,6 +86,10 @@ export default {
         { id: "0", label: "否" },
         { id: "0", label: "否" },
         { id: "√", label: "是" },
         { id: "√", label: "是" },
       ],
       ],
+      isTempList: [
+        { value: "否", label: "否" },
+        { value: "是", label: "是" },
+      ],
       tableType: 0,// 当前是编辑还是新增, 0为新增
       tableType: 0,// 当前是编辑还是新增, 0为新增
       ruleValidate: {
       ruleValidate: {
         fileDate: [{ required: true, message: '该项不能为空', trigger: 'change' }]
         fileDate: [{ required: true, message: '该项不能为空', trigger: 'change' }]

+ 4 - 0
src/views/standardManagement/components/systemFileManagement/systemFileManagement.vue

@@ -232,6 +232,8 @@
               align="center"></el-table-column>
               align="center"></el-table-column>
             <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="isAudit" label="是否审核流"
             <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="isAudit" label="是否审核流"
               align="center"></el-table-column>
               align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="isTemp" label="是否模板"
+              align="center"></el-table-column>
           </el-table>
           </el-table>
           <div class="common-foot-style">
           <div class="common-foot-style">
             <el-pagination v-loading="recordDataLoading" @size-change="recordPageSizeChange"
             <el-pagination v-loading="recordDataLoading" @size-change="recordPageSizeChange"
@@ -757,7 +759,9 @@ export default {
     },
     },
     imgPreViewY(row, fileName) {
     imgPreViewY(row, fileName) {
       let aaa = fileName.substr(fileName.indexOf(".") + 1);
       let aaa = fileName.substr(fileName.indexOf(".") + 1);
+      console.log(aaa,'aaa')
       this.axios.get('pass/baseManagement/v1/file/download/' + fileName, { responseType: 'blob' }, { headers: { 'content-type': 'application/x-www-form-urlencoded' } }).then(res => {
       this.axios.get('pass/baseManagement/v1/file/download/' + fileName, { responseType: 'blob' }, { headers: { 'content-type': 'application/x-www-form-urlencoded' } }).then(res => {
+        console.log(res,'res')
         if (aaa == "docx") {
         if (aaa == "docx") {
           this.showFlag(true);
           this.showFlag(true);
           docx.renderAsync(res, this.$refs.file)
           docx.renderAsync(res, this.$refs.file)

+ 166 - 100
src/views/standardManagement/router/index.js

@@ -1,110 +1,176 @@
-import Vue from 'vue'
-import Router from 'vue-router'
+import Vue from "vue";
+import Router from "vue-router";
 
 
-import routerBefore from '@/config/routerBefore.js'
+import routerBefore from "@/config/routerBefore.js";
 // 主要
 // 主要
 // import main from '@/components/main.vue'
 // import main from '@/components/main.vue'
 // 页面示例
 // 页面示例
 // import mypage from '../components/myPage.vue'
 // import mypage from '../components/myPage.vue'
-Vue.use(Router)
-const constantRouterMap = [{
-  path: '/',
-  name: 'main',
-  component: resolve => require(['@/components/main.vue'], resolve),
-  redirect: {
-    name: 'analyzeProjectConfiguration'
+Vue.use(Router);
+const constantRouterMap = [
+  {
+    path: "/",
+    name: "main",
+    component: (resolve) => require(["@/components/main.vue"], resolve),
+    redirect: {
+      name: "analyzeProjectConfiguration",
+    },
+    children: [
+      {
+        path: "analyzeProjectConfiguration",
+        name: "analyzeProjectConfiguration",
+        component: (resolve) =>
+          require([
+            "../components/analyzeProjectConfiguration/analyzeProjectConfiguration.vue",
+          ], resolve),
+      },
+      {
+        path: "testProjectConfiguration",
+        name: "testProjectConfiguration",
+        component: (resolve) =>
+          require([
+            "../components/testProjectConfiguration/testProjectConfiguration.vue",
+          ], resolve),
+      },
+      {
+        path: "testMethodConfiguration",
+        name: "testMethodConfiguration",
+        component: (resolve) =>
+          require([
+            "../components/testMethodConfiguration/testMethodConfiguration.vue",
+          ], resolve),
+      },
+      {
+        path: "standardInformation",
+        name: "standardInformation",
+        component: (resolve) =>
+          require([
+            "../components/standardInformation/standardInformation.vue",
+          ], resolve),
+      },
+      {
+        path: "standardContentInformation",
+        name: "standardContentInformation",
+        component: (resolve) =>
+          require([
+            "../components/standardContentInformation/standardContentInformation.vue",
+          ], resolve),
+      },
+      {
+        path: "standardContentConfiguration",
+        name: "standardContentConfiguration",
+        component: (resolve) =>
+          require([
+            "../components/standardContentConfiguration/standardContentConfiguration.vue",
+          ], resolve),
+      },
+      {
+        path: "sampleTemplateMaintenance",
+        name: "sampleTemplateMaintenance",
+        component: (resolve) =>
+          require([
+            "../components/sampleTemplateMaintenance/sampleTemplateMaintenance.vue",
+          ], resolve),
+      },
+      {
+        path: "testTaskMaintenance",
+        name: "testTaskMaintenance",
+        component: (resolve) =>
+          require([
+            "../components/testTaskMaintenance/testTaskMaintenance.vue",
+          ], resolve),
+      },
+      {
+        path: "testIndexMaintenance",
+        name: "testIndexMaintenance",
+        component: (resolve) =>
+          require([
+            "../components/testIndexMaintenance/testIndexMaintenance.vue",
+          ], resolve),
+      },
+      {
+        // 体系文件审核
+        path: "systemAudit",
+        name: "systemAudit",
+        component: (resolve) =>
+          require(["../components/systemAudit/systemAudit.vue"], resolve),
+      },
+      {
+        // 体系文件查看
+        path: "systemFileViewing",
+        name: "systemFileViewing",
+        component: (resolve) =>
+          require([
+            "../components/systemFileViewing/systemFileViewing.vue",
+          ], resolve),
+      },
+      {
+        // 体系文件管理
+        path: "systemFileManagement",
+        name: "systemFileManagement",
+        component: (resolve) =>
+          require([
+            "../components/systemFileManagement/systemFileManagement.vue",
+          ], resolve),
+      },
+      {
+        // 体系文件记录管理
+        path: "systemFileManagementRecord",
+        name: "systemFileManagementRecord",
+        component: (resolve) =>
+          require([
+            "../components/systemFileManagementRecord/systemFileManagement.vue",
+          ], resolve),
+      },
+      {
+        // 体系文件记录管理
+        path: "systemAuditRecord",
+        name: "systemAuditRecord",
+        component: (resolve) =>
+          require(["../components/systemAuditRecord/systemAudit.vue"], resolve),
+      },
+      {
+        // 体系文件记录管理
+        path: "systemFileViewingRecord",
+        name: "systemFileViewingRecord",
+        component: (resolve) =>
+          require([
+            "../components/systemFileViewingRecord/systemFileViewing.vue",
+          ], resolve),
+      },
+      {
+        // 内审管理
+        path: "internalAuditManagement",
+        name: "internalAuditManagement",
+        component: (resolve) =>
+          require([
+            "../components/internalAuditManagement/internalAuditManagement.vue",
+          ], resolve),
+      },
+      {
+        // 体系模板管理
+        path: "systemTemplateManagement",
+        name: "systemTemplateManagement",
+        component: (resolve) =>
+          require([
+            "../components/systemTemplateManagement/systemTemplateManagement.vue",
+          ], resolve),
+      },
+      {
+        // 体系模板管理
+        path: "fourFileOnlineEdit",
+        name: "fourFileOnlineEdit",
+        component: (resolve) =>
+          require([
+            "../components/systemFileManagement/fourFileOnlineEdit.vue",
+          ], resolve),
+      },
+    ],
   },
   },
-  children: [
-    {
-      path: 'analyzeProjectConfiguration',
-      name: 'analyzeProjectConfiguration',
-      component: resolve => require(['../components/analyzeProjectConfiguration/analyzeProjectConfiguration.vue'], resolve)
-    },
-    {
-      path: 'testProjectConfiguration',
-      name: 'testProjectConfiguration',
-      component: resolve => require(['../components/testProjectConfiguration/testProjectConfiguration.vue'], resolve)
-    },
-    {
-      path: 'testMethodConfiguration',
-      name: 'testMethodConfiguration',
-      component: resolve => require(['../components/testMethodConfiguration/testMethodConfiguration.vue'], resolve)
-    },
-    {
-      path: 'standardInformation',
-      name: 'standardInformation',
-      component: resolve => require(['../components/standardInformation/standardInformation.vue'], resolve)
-    },
-    {
-      path: 'standardContentInformation',
-      name: 'standardContentInformation',
-      component: resolve => require(['../components/standardContentInformation/standardContentInformation.vue'], resolve)
-    },
-    {
-      path: 'standardContentConfiguration',
-      name: 'standardContentConfiguration',
-      component: resolve => require(['../components/standardContentConfiguration/standardContentConfiguration.vue'], resolve)
-    },
-    {
-      path: 'sampleTemplateMaintenance',
-      name: 'sampleTemplateMaintenance',
-      component: resolve => require(['../components/sampleTemplateMaintenance/sampleTemplateMaintenance.vue'], resolve)
-    },
-    {
-      path: 'testTaskMaintenance',
-      name: 'testTaskMaintenance',
-      component: resolve => require(['../components/testTaskMaintenance/testTaskMaintenance.vue'], resolve)
-    },
-    {
-      path: 'testIndexMaintenance',
-      name: 'testIndexMaintenance',
-      component: resolve => require(['../components/testIndexMaintenance/testIndexMaintenance.vue'], resolve)
-    },
-    { // 体系文件审核
-      path: 'systemAudit',
-      name: 'systemAudit',
-      component: resolve => require(['../components/systemAudit/systemAudit.vue'], resolve)
-    },
-    { // 体系文件查看
-      path: 'systemFileViewing',
-      name: 'systemFileViewing',
-      component: resolve => require(['../components/systemFileViewing/systemFileViewing.vue'], resolve)
-    },
-    { // 体系文件管理
-      path: 'systemFileManagement',
-      name: 'systemFileManagement',
-      component: resolve => require(['../components/systemFileManagement/systemFileManagement.vue'], resolve)
-    },
-    { // 体系文件记录管理
-      path: 'systemFileManagementRecord',
-      name: 'systemFileManagementRecord',
-      component: resolve => require(['../components/systemFileManagementRecord/systemFileManagement.vue'], resolve)
-    },
-    { // 体系文件记录管理
-      path: 'systemAuditRecord',
-      name: 'systemAuditRecord',
-      component: resolve => require(['../components/systemAuditRecord/systemAudit.vue'], resolve)
-    },
-    { // 体系文件记录管理
-      path: 'systemFileViewingRecord',
-      name: 'systemFileViewingRecord',
-      component: resolve => require(['../components/systemFileViewingRecord/systemFileViewing.vue'], resolve)
-    },
-    { // 内审管理
-      path: 'internalAuditManagement',
-      name: 'internalAuditManagement',
-      component: resolve => require(['../components/internalAuditManagement/internalAuditManagement.vue'], resolve)
-    },
-    { // 体系模板管理
-      path: 'systemTemplateManagement',
-      name: 'systemTemplateManagement',
-      component: resolve => require(['../components/systemTemplateManagement/systemTemplateManagement.vue'], resolve)
-    }
-  ]
-}];
+];
 const router = new Router({
 const router = new Router({
-  routes: constantRouterMap
-})
+  routes: constantRouterMap,
+});
 
 
 //  before
 //  before
 routerBefore(router, constantRouterMap);
 routerBefore(router, constantRouterMap);