From d4d34a9b730ac328068f936598d4138ac2635e57 Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期四, 15 十月 2026 11:21:08 +0800
Subject: [PATCH] 质量监督计划:新增计划下发(列表下发状态列与下发按钮,仅已批准未下发的可下发),导出弹窗改卡片式并拦截导出错误响应避免下载损坏文件,日常监督检查记录单按纸质表重做(受监督人多选、监督员下拉、监督内容多选、监督记录、存在问题、整改意见),各表单人员列表改为全实验室不按部门筛选;方法验证:表单新增数据处理、质量控制方法、方法结果验证、验证结论及评审、审批意见字段并新增详情入口,迁移原标准方法变更的设备、检测记录、校准文件、工作证等查看组件,标准方法变更模块下线;设备档案、设备管理编辑弹窗改版为图片与基本信息左右布局、表单行式排列

---
 src/views/CNAS/resourceDemand/device/component/files.vue                                |  411 +++++++----
 src/views/CNAS/resourceDemand/device/component/management.vue                           |  679 ++++++++++++--------
 src/views/CNAS/process/ensureResults/qualityControlPlan/components/processingSheet.vue  |    5 
 src/views/CNAS/process/method/methodVerification/index.vue                              |    7 
 src/views/CNAS/process/method/methodVerification/component/calibrationsFileDia.vue      |    0 
 src/api/cnas/process/method/methodVerification.js                                       |   36 +
 src/views/CNAS/process/method/methodVerification/component/formDIa.vue                  |  131 +++
 src/views/CNAS/process/ensureResults/qualityControlPlan/components/detailFormDialog.vue |    5 
 src/api/cnas/process/ensureResults/qualitySupervise.js                                  |    8 
 /dev/null                                                                               |  193 ------
 src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue                       |  186 +++++
 src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue    |  242 ++----
 src/views/CNAS/process/ensureResults/qualityControlPlan/components/rectifyDialogNew.vue |    5 
 src/views/CNAS/process/method/methodVerification/component/ViewDeviceDialog.vue         |    2 
 src/views/CNAS/process/method/methodVerification/component/viewWorkPermitDia.vue        |    0 
 src/views/CNAS/process/method/methodVerification/component/ViewTestRecord.vue           |    2 
 16 files changed, 1,088 insertions(+), 824 deletions(-)

diff --git a/src/api/cnas/process/ensureResults/qualitySupervise.js b/src/api/cnas/process/ensureResults/qualitySupervise.js
index 8ab0823..7d767ed 100644
--- a/src/api/cnas/process/ensureResults/qualitySupervise.js
+++ b/src/api/cnas/process/ensureResults/qualitySupervise.js
@@ -17,6 +17,14 @@
     data: query
   })
 }
+// 鐩戠潱璁″垝涓嬪彂
+export function issueQualitySupervise(query) {
+  return request({
+    url: '/qualitySupervise/issueQualitySupervise',
+    method: 'post',
+    data: query
+  })
+}
 // 璐ㄩ噺鐩戠潱骞磋鍒掑垪琛�
 export function exportQualitySupervise(query) {
   return request({
diff --git a/src/api/cnas/process/method/methodVerification.js b/src/api/cnas/process/method/methodVerification.js
index 671363e..250aafe 100644
--- a/src/api/cnas/process/method/methodVerification.js
+++ b/src/api/cnas/process/method/methodVerification.js
@@ -64,3 +64,39 @@
     params: query
   })
 }
+
+//鑾峰彇鐢ㄦ埛鍒楄〃
+export function selectUserCondition(query) {
+  return request({
+    url: "/system/newUser/selectUserCondition",
+    method: "get",
+    params: query,
+  });
+}
+
+// 閫氳繃璁惧鍒嗙被鑾峰彇璁惧鍒楄〃
+export function deviceScopeSearch(query) {
+  return request({
+    url: '/deviceScope/search',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鍘熷璁板綍鍒楄〃
+export function getVerifyMethodFileList(query) {
+  return request({
+    url: '/processMethodVerify/getVerifyMethodFileList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鍒犻櫎楠岃瘉鍘熷璁板綍鍒楄〃
+export function delVerifyMethodFileList(query) {
+  return request({
+    url: '/processMethodVerify/delVerifyMethodFileList',
+    method: 'delete',
+    params: query
+  })
+}
diff --git a/src/api/cnas/process/method/standardMethodsChange.js b/src/api/cnas/process/method/standardMethodsChange.js
deleted file mode 100644
index e4579aa..0000000
--- a/src/api/cnas/process/method/standardMethodsChange.js
+++ /dev/null
@@ -1,102 +0,0 @@
-// 瀹為獙瀹ょ殑妫�娴嬭兘鍔涙。妗堢浉鍏虫帴鍙�
-import request from "@/utils/request";
-
-//鏍囧噯鏂规硶鏇存柊楠岃瘉鍒楄〃
-export function pagesMethodVerify(query) {
-  return request({
-    url: "/processMethodVerify/pagesMethodVerify",
-    method: "get",
-    params: query,
-  });
-}
-
-//鑾峰彇鐢ㄦ埛鍒楄〃
-export function selectUserCondition(query) {
-  return request({
-    url: "/system/newUser/selectUserCondition",
-    method: "get",
-    params: query,
-  });
-}
-
-//鏌ヨ鏍囧噯鏂规硶楠岃瘉璇︽儏
-export function getMethodVerifyOne(query) {
-  return request({
-    url: "/processMethodVerify/getMethodVerifyOne",
-    method: "get",
-    params: query,
-  });
-}
-
-// 閫氳繃璁惧鍒嗙被鑾峰彇璁惧鍒楄〃
-export function deviceScopeSearch(query) {
-  return request({
-    url: '/deviceScope/search',
-    method: 'get',
-    params: query
-  })
-}
-
-// 鏂板鏍囧噯鏂规硶楠岃瘉
-export function addMethodVerify(data) {
-  return request({
-    url: "/processMethodVerify/addMethodVerify",
-    method: "post",
-    data: data,
-  });
-}
-
-// 淇敼鏍囧噯鏂规硶楠岃瘉
-export function updateMethodVerify(data) {
-  return request({
-    url: "/processMethodVerify/updateMethodVerify",
-    method: "post",
-    data: data,
-  });
-}
-
-// 瀵煎嚭鏍囧噯鏂规硶鏇存柊楠岃瘉
-export function exportMethodVerify(query) {
-  return request({
-    url: '/processMethodVerify/exportMethodVerify',
-    method: "get",
-    responseType: "blob",
-    params: query,
-  })
-}
-
-// 楠岃瘉纭
-export function methodVerifyAffirm(query) {
-  return request({
-    url: '/processMethodVerify/methodVerifyAffirm',
-    method: 'get',
-    params: query
-  })
-}
-
-// 鍒犻櫎鏍囧噯鏂规硶鏇存柊楠岃瘉
-export function delMethodVerify(query) {
-  return request({
-    url: '/processMethodVerify/delMethodVerify',
-    method: 'delete',
-    params: query
-  })
-}
-
-// 鍘熷璁板綍鍒楄〃
-export function getVerifyMethodFileList(query) {
-  return request({
-    url: '/processMethodVerify/getVerifyMethodFileList',
-    method: 'get',
-    params: query
-  })
-}
-
-// 鍒犻櫎楠岃瘉鍘熷璁板綍鍒楄〃
-export function delVerifyMethodFileList(query) {
-  return request({
-    url: '/processMethodVerify/delVerifyMethodFileList',
-    method: 'delete',
-    params: query
-  })
-}
diff --git a/src/views/CNAS/process/ensureResults/qualityControlPlan/components/detailFormDialog.vue b/src/views/CNAS/process/ensureResults/qualityControlPlan/components/detailFormDialog.vue
index 6df339c..0cafc96 100644
--- a/src/views/CNAS/process/ensureResults/qualityControlPlan/components/detailFormDialog.vue
+++ b/src/views/CNAS/process/ensureResults/qualityControlPlan/components/detailFormDialog.vue
@@ -162,8 +162,9 @@
       this.$emit('closeDia')
     },
     getUserList(){
-      selectUserCondition({ type: 2 }).then((res) => {
-        this.userList = res.data;
+      // 璐ㄩ噺鐩戠潱闈㈠悜鍏ㄥ疄楠屽, 浜哄憳鍒楄〃涓嶆寜閮ㄩ棬绛涢��
+      selectUserCondition({ type: 1 }).then((res) => {
+        this.userList = res.data || [];
       })
     },
   }
diff --git a/src/views/CNAS/process/ensureResults/qualityControlPlan/components/processingSheet.vue b/src/views/CNAS/process/ensureResults/qualityControlPlan/components/processingSheet.vue
index 4f3ae1d..f3624d5 100644
--- a/src/views/CNAS/process/ensureResults/qualityControlPlan/components/processingSheet.vue
+++ b/src/views/CNAS/process/ensureResults/qualityControlPlan/components/processingSheet.vue
@@ -450,9 +450,10 @@
       this.$emit('closeProcessingDia')
     },
     getAuthorizedPerson() {
-      selectUserCondition({ type: 2 }).then((res) => {
+      // 璐ㄩ噺鐩戠潱闈㈠悜鍏ㄥ疄楠屽, 浜哄憳鍒楄〃涓嶆寜閮ㄩ棬绛涢��
+      selectUserCondition({ type: 1 }).then((res) => {
         let data = [];
-        res.data.forEach((a) => {
+        (res.data || []).forEach((a) => {
           data.push({
             label: a.name,
             value: a.id,
diff --git a/src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue b/src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue
index e24000f..39e3be1 100644
--- a/src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue
+++ b/src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue
@@ -2,7 +2,7 @@
   <div>
     <el-dialog :close-on-click-modal="false" :close-on-press-escape="false"
                v-model="formDia"
-               title="妫�娴嬪伐浣滅洃鐫h褰曡〃"
+               title="鏃ュ父鐩戠潱妫�鏌ヨ褰曡〃"
                width="70%" @close="closeRecordsDia">
       <el-steps :active="currentStep" align-center finish-status="success">
         <el-step title="瀹炴柦"></el-step>
@@ -12,30 +12,9 @@
         <table border="1" cellspacing="10" class="tables">
           <tr>
             <td class="td-title">
-              <p><span class="required-span">* </span>妫�娴嬩汉鍛橈細</p>
+              <p><span class="required-span">* </span>鐩戠潱妫�娴嬮」鐩細</p>
             </td>
             <td colspan="2">
-              <el-input v-if="currentStep === 0" v-model="form.testMember"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.testMember }}</span>
-            </td>
-            <td class="td-title">
-              <p><span class="required-span">* </span>鐩戠潱鍛橈細</p>
-            </td>
-            <td colspan="2">
-              <el-select v-if="currentStep === 0" @change="usePersonName" v-model="form.supervisor" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
-                <el-option v-for="item in recordUserList" :key="item.userName" :label="item.userName" :value="item.userName"></el-option>
-              </el-select>
-              <span v-else class="td-info"> {{ form.supervisor }}</span>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
-              <p><span class="required-span">* </span>妫�娴嬮」鐩細</p>
-            </td>
-            <td>
               <el-input v-if="currentStep === 0" v-model="form.testItem"
                         placeholder="璇疯緭鍏ュ唴瀹�"
                         size="small">
@@ -43,19 +22,9 @@
               <span v-else class="td-info"> {{ form.testItem }}</span>
             </td>
             <td class="td-title">
-              <p><span class="required-span">* </span>鏍峰搧缂栧彿锛�</p>
+              <p><span class="required-span">* </span>鐩戠潱妫�娴嬫棩鏈燂細</p>
             </td>
-            <td>
-              <el-input v-if="currentStep === 0" v-model="form.sampleNumber"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.sampleNumber }}</span>
-            </td>
-            <td class="td-title">
-              <p><span class="required-span">* </span>妫�娴嬫棩鏈燂細</p>
-            </td>
-            <td>
+            <td colspan="2">
               <el-input v-if="currentStep === 0" v-model="form.testDate"
                         placeholder="璇疯緭鍏ュ唴瀹�"
                         size="small">
@@ -65,126 +34,80 @@
           </tr>
           <tr>
             <td class="td-title">
-              <p><span class="required-span">* </span>浜哄憳锛�</p>
+              <p><span class="required-span">* </span>鍙楃洃鐫d汉锛�</p>
             </td>
-            <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.personnel"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.personnel }}</span>
+            <td colspan="2">
+              <el-select v-if="currentStep === 0" v-model="superviseeList" multiple filterable collapse-tags
+                         placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in personList" :key="item.value" :label="item.label"
+                           :value="item.label"></el-option>
+              </el-select>
+              <span v-else class="td-info"> {{ form.testMember }}</span>
+            </td>
+            <td class="td-title">
+              <p><span class="required-span">* </span>鐩戠潱鍛橈細</p>
+            </td>
+            <td colspan="2">
+              <el-select v-if="currentStep === 0" v-model="form.supervisor" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in recordUserList" :key="item.userId" :label="item.userName" :value="item.userName"></el-option>
+              </el-select>
+              <span v-else class="td-info"> {{ form.supervisor }}</span>
             </td>
           </tr>
           <tr>
             <td class="td-title">
-              <p><span class="required-span">* </span>浠櫒璁惧锛�</p>
+              <p>鐩戠潱鍐呭锛�</p>
             </td>
             <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.device"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.device }}</span>
+              <template v-if="currentStep === 0">
+                <div v-for="(rowItems, rowIndex) in contentRows" :key="rowIndex" style="display: flex;">
+                  <el-checkbox v-for="item in rowItems" :key="item" v-model="superviseContentList"
+                               :value="item" style="flex: 1;">{{ item }}</el-checkbox>
+                </div>
+              </template>
+              <span v-else class="td-info"> {{ form.superviseContent }}</span>
             </td>
           </tr>
           <tr>
             <td class="td-title">
-              <p><span class="required-span">* </span>宸ヤ綔鐜锛�</p>
+              <p><span class="required-span">* </span>鐩戠潱璁板綍锛�</p>
             </td>
             <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.environment"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.environment }}</span>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
-              <p><span class="required-span">* </span>鏍峰搧閲囬泦锛�</p>
-            </td>
-            <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.sampleCollection"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.sampleCollection }}</span>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
-              <p><span class="required-span">* </span>鏍峰搧鐨勫噯澶囷細</p>
-            </td>
-            <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.samplePreparation"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.samplePreparation }}</span>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
-              <p><span class="required-span">* </span>妫�娴嬫柟娉曪細</p>
-            </td>
-            <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.detectionMethod"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.detectionMethod }}</span>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
-              <p><span class="required-span">* </span>妫�娴嬭褰曪細</p>
-            </td>
-            <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.inspectionRecord"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.inspectionRecord }}</span>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
-              <p><span class="required-span">* </span>妫�娴嬫姤鍛婏細</p>
-            </td>
-            <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.examiningReport"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.examiningReport }}</span>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
-              <p><span class="required-span">* </span>鐩戠潱鎯呭喌璇勪环锛�</p>
-            </td>
-            <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.supervisionEvaluation"
+              <el-input v-if="currentStep === 0" v-model="form.superviseRecord"
                         :rows="4"
                         placeholder="璇疯緭鍏ュ唴瀹�"
                         size="small"
                         type="textarea">
               </el-input>
-              <span v-else class="td-info"> {{ form.supervisionEvaluation }}</span>
+              <span v-else class="td-info"> {{ form.superviseRecord }}</span>
             </td>
           </tr>
           <tr>
             <td class="td-title">
-              <p><span class="required-span">* </span>涓嶇鍚堝鐞嗘剰瑙侊細</p>
+              <p>瀛樺湪闂锛�</p>
             </td>
             <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.handlingAdvice"
-                        :rows="4"
+              <el-input v-if="currentStep === 0" v-model="form.problemDesc"
+                        :rows="3"
+                        placeholder="涓嶇鍚堥棶棰樻弿杩帮紝鏃犲垯濉�滄棤鈥�"
+                        size="small"
+                        type="textarea">
+              </el-input>
+              <span v-else class="td-info"> {{ form.problemDesc }}</span>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>鏁存敼鎰忚锛�</p>
+            </td>
+            <td colspan="5">
+              <el-input v-if="currentStep === 0" v-model="form.rectifyAdvice"
+                        :rows="3"
                         placeholder="璇疯緭鍏ュ唴瀹�"
                         size="small"
                         type="textarea">
               </el-input>
-              <span v-else class="td-info"> {{ form.handlingAdvice }}</span>
+              <span v-else class="td-info"> {{ form.rectifyAdvice }}</span>
             </td>
           </tr>
           <tr>
@@ -235,7 +158,7 @@
       </div>
       <template #footer><span  class="dialog-footer">
         <el-button @click="closeRecordsDia">鍙� 娑�</el-button>
-        <el-button v-if="currentStep === 0 && userId == supervisedUserId" :loading="editLoad" type="primary" @click="handleEdit">鎻� 浜�</el-button>
+        <el-button v-if="currentStep === 0 && canSubmitRecord" :loading="editLoad" type="primary" @click="handleEdit">鎻� 浜�</el-button>
         <el-button v-if="currentStep === 1 && userId == ratifyUserId" :loading="editLoad" @click="handleEdit(0)">涓嶉�氳繃</el-button>
         <el-button v-if="currentStep === 1 && userId == ratifyUserId" :loading="editLoad" type="primary" @click="handleEdit(1)">閫�
           杩�</el-button>
@@ -266,24 +189,17 @@
         superviseDetailsRecordId: '',
         testMember: '',
         supervisor: '',
-        supervisorId: '',
+        superviseContent: '',
+        superviseRecord: '',
+        problemDesc: '',
+        rectifyAdvice: '',
         testItem: '',
-        sampleNumber: '',
         testDate: '',
-        personnel: '',
-        device: '',
-        environment: '',
-        sampleCollection: '',
-        samplePreparation: '',
-        detectionMethod: '',
-        inspectionRecord: '',
-        examiningReport: '',
-        supervisionEvaluation: '',
-        handlingAdvice: '',
         ratifyUserId: '',
         ratifyUserName: '',
         ratifyOpinion: '',
         isAccording: '',
+        isFinish: '',
       },
       currentStep: 0,
       editLoad: false,
@@ -291,10 +207,26 @@
       recordUserList: [],
       supervisedUserId: '',
       ratifyUserId: '',
+      superviseeList: [],
+      superviseContentList: [],
+      superviseContentItems: ['浜哄憳鎸佽瘉鍙婂煿璁�', '璁炬柦鍙婄幆澧冩潯浠�', '妫�娴嬫柟娉�', '浠櫒璁惧绠$悊', '娴嬮噺婧簮鎬�', '鏍囧噯鐗╄川绠$悊', '鏍峰搧鍒跺鍜屽缃�', '妫�娴嬫暟鎹鐞�', '缁撴灉鎶ュ憡缁撴灉'],
     };
   },
   computed: {
     ...mapGetters(["userId"]),
+    contentRows() {
+      const rows = []
+      for (let i = 0; i < this.superviseContentItems.length; i += 3) {
+        rows.push(this.superviseContentItems.slice(i, i + 3))
+      }
+      return rows
+    },
+    canSubmitRecord() {
+      if (this.userId == this.supervisedUserId) {
+        return true
+      }
+      return this.recordUserList.some(item => item.userId == this.userId)
+    },
   },
   // 鏂规硶闆嗗悎
   methods: {
@@ -303,12 +235,6 @@
       this.supervisedUserId = row.supervisedUserId
       this.searchInfo(row)
       this.getAuthorizedPerson()
-    },
-    usePersonName (value) {
-      const index = this.recordUserList.findIndex(item => item.userId === value)
-      if (index > -1) {
-        this.form.supervisor = this.recordUserList[index].userName
-      }
     },
     // 鏌ヨ鐩戠潱璁″垝璇︽儏璁板綍娴佺▼淇℃伅
     searchInfo (row) {
@@ -327,6 +253,8 @@
         this.form = res.data
         this.form.superviseDetailsId = row.superviseDetailsId
         this.ratifyUserId = res.data.ratifyUserId
+        this.superviseeList = this.form.testMember ? this.form.testMember.split('銆�').filter(i => i) : []
+        this.superviseContentList = this.form.superviseContent ? this.form.superviseContent.split('銆�').filter(i => i) : []
         this.getRecordUser()
       }).catch(err => {
         console.log('err---', err);
@@ -334,12 +262,17 @@
     },
     // 鎻愪氦娴佺▼
     handleEdit (isFinish) {
-      if (!this.form.testMember || !this.form.supervisor || !this.form.testItem || !this.form.sampleNumber
-        || !this.form.testDate) {
-        this.$message.warning('璇峰~鍐欏畬鏁�')
-        return
-      }
       if (this.currentStep === 0) {
+        if (!this.form.testItem || !this.form.testDate || this.superviseeList.length === 0 || !this.form.supervisor) {
+          this.$message.warning('璇峰~鍐欏畬鏁�')
+          return
+        }
+        if (!this.form.superviseRecord) {
+          this.$message.warning('璇峰~鍐欑洃鐫h褰�')
+          return
+        }
+        this.form.testMember = this.superviseeList.join('銆�')
+        this.form.superviseContent = this.superviseContentList.join('銆�')
         this.addInfo()
       } else {
         this.editInfo(isFinish)
@@ -363,7 +296,7 @@
         this.$message.warning('璇峰~鍐欏鎵规剰瑙�')
         return
       }
-      if (this.form.isAccording === null) {
+      if (this.form.isAccording !== 0 && this.form.isAccording !== 1) {
         this.$message.warning('璇烽�夋嫨鏄惁绗﹀悎')
         return
       }
@@ -384,9 +317,10 @@
       this.$emit('closeRecordsDia')
     },
     getAuthorizedPerson() {
-      selectUserCondition({ type: 2 }).then((res) => {
+      // 璐ㄩ噺鐩戠潱闈㈠悜鍏ㄥ疄楠屽, 浜哄憳鍒楄〃涓嶆寜閮ㄩ棬绛涢��
+      selectUserCondition({ type: 1 }).then((res) => {
         let data = [];
-        res.data.forEach((a) => {
+        (res.data || []).forEach((a) => {
           data.push({
             label: a.name,
             value: a.id,
diff --git a/src/views/CNAS/process/ensureResults/qualityControlPlan/components/rectifyDialogNew.vue b/src/views/CNAS/process/ensureResults/qualityControlPlan/components/rectifyDialogNew.vue
index d4402a5..24a7076 100644
--- a/src/views/CNAS/process/ensureResults/qualityControlPlan/components/rectifyDialogNew.vue
+++ b/src/views/CNAS/process/ensureResults/qualityControlPlan/components/rectifyDialogNew.vue
@@ -389,9 +389,10 @@
       this.showStep = step
     },
     getAuthorizedPerson() {
-      selectUserCondition({ type: 2 }).then((res) => {
+      // 璐ㄩ噺鐩戠潱闈㈠悜鍏ㄥ疄楠屽, 浜哄憳鍒楄〃涓嶆寜閮ㄩ棬绛涢��
+      selectUserCondition({ type: 1 }).then((res) => {
         let data = [];
-        res.data.forEach((a) => {
+        (res.data || []).forEach((a) => {
           data.push({
             label: a.name,
             value: a.id,
diff --git a/src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue b/src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue
index 41565fe..6df53e6 100644
--- a/src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue
+++ b/src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue
@@ -74,12 +74,43 @@
         <el-button :loading="ratifyLoading" type="primary" @click="handleRatify(1)">鎵� 鍑�</el-button>
       </span></template>
     </el-dialog>
-    <el-dialog v-model="downloadDialog" title="瀵煎嚭" width="600px">
-      <span>
-        <el-button plain type="primary" :disabled="download.recordStatus !== 3" @click="controlDown">璁板綍鍗曞鍑�</el-button>
-        <el-button plain type="primary" :disabled="download.accordingStatus !== 3" @click="processingDown">澶勭悊鍗曞鍑�</el-button>
-        <el-button plain type="primary" :disabled="download.correctStatus !== 3" @click="supervisoryDown">绾犳鍗曞鍑�</el-button>
-      </span>
+    <el-dialog v-model="downloadDialog" title="瀵煎嚭" width="640px">
+      <div class="doc-card">
+        <div class="doc-card-head">
+          <span class="doc-card-name">鏃ュ父鐩戠潱妫�鏌ヨ褰曡〃锛堣褰曞崟锛�</span>
+          <el-tag :type="download.recordStatus === 3 ? 'success' : 'info'" size="small">
+            {{ download.recordStatus === 3 ? '宸叉壒鍑�' : '鏈壒鍑�' }}
+          </el-tag>
+        </div>
+        <div class="doc-card-foot">
+          <el-button type="primary" :disabled="download.recordStatus !== 3" @click="controlDown">瀵� 鍑�</el-button>
+        </div>
+      </div>
+      <div class="doc-card">
+        <div class="doc-card-head">
+          <span class="doc-card-name">涓嶇鍚堝伐浣滄帶鍒跺崟锛堝鐞嗗崟锛�</span>
+          <el-tag :type="download.accordingStatus === 3 ? 'success' : 'info'" size="small">
+            {{ download.accordingStatus === 3 ? '宸叉壒鍑�' : '鏈壒鍑�' }}
+          </el-tag>
+        </div>
+        <div class="doc-card-foot">
+          <el-button type="primary" :disabled="download.accordingStatus !== 3" @click="processingDown">瀵� 鍑�</el-button>
+        </div>
+      </div>
+      <div class="doc-card">
+        <div class="doc-card-head">
+          <span class="doc-card-name">绾犳鎺柦澶勭悊鍗曪紙绾犳鍗曪級</span>
+          <el-tag :type="download.correctStatus === 3 ? 'success' : 'info'" size="small">
+            {{ download.correctStatus === 3 ? '宸叉壒鍑�' : '鏈壒鍑�' }}
+          </el-tag>
+        </div>
+        <div class="doc-card-foot">
+          <el-button type="primary" :disabled="download.correctStatus !== 3" @click="supervisoryDown">瀵� 鍑�</el-button>
+        </div>
+      </div>
+      <div class="down-tip">
+        浠�"宸叉壒鍑�"鐨勮〃鍗曞彲瀵煎嚭锛岀伆鑹茶〃绀哄搴旇〃鍗曞皻鏈壒鍑嗘垨鏆傛棤鏁版嵁
+      </div>
       <template #footer><span  class="dialog-footer">
         <el-button @click="downloadDialog = false">鍙� 娑�</el-button>
       </span></template>
@@ -131,7 +162,7 @@
 import limsTable from "@/components/Table/lims-table.vue";
 import {
   delQualitySupervise, delQualitySuperviseDetail,
-  exportQualitySupervise, exportSuperviseDetailRecord,
+  exportQualitySupervise, exportSuperviseDetailRecord, issueQualitySupervise,
   pageQualitySupervise, pageQualitySuperviseDetail,
   ratifyQualitySupervise, superviseDetailAccordingExport,
   exportSuperviseDetaillCorrect
@@ -200,6 +231,25 @@
           prop: 'ratifyTime',
           width: '160'
         }, {
+          dataType: 'tag',
+          label: '涓嬪彂鐘舵��',
+          prop: 'issueStatus',
+          width: '100',
+          formatData: (params) => {
+            if (params === 1) {
+              return '宸蹭笅鍙�';
+            } else {
+              return '鏈笅鍙�';
+            }
+          },
+          formatType: (params) => {
+            if (params === 1) {
+              return 'success';
+            } else {
+              return 'info';
+            }
+          }
+        }, {
           dataType: 'action',
           label: '鎿嶄綔',
           operation: [
@@ -215,6 +265,20 @@
               },
               clickFun: (row) => {
                 this.approvalPlan(row)
+              }
+            },
+            {
+              name: '涓嬪彂',
+              type: 'text',
+              disabled: (row) => {
+                if (row.ratifyStatus !== 1 || row.issueStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+              clickFun: (row) => {
+                this.issuePlan(row)
               }
             },
             {
@@ -389,6 +453,13 @@
               type: 'text',
               clickFun: (row) => {
                 this.records(row)
+              },
+              disabled: () => {
+                if (this.currentPlan.issueStatus !== 1) {
+                  return true
+                } else {
+                  return false
+                }
               }
             },
             {
@@ -446,6 +517,7 @@
       },
       currentScrollPosition: 0,
       superviseId: '',
+      currentPlan: {},
       formDia: false,
       recordsDia: false,
       processingDia: false,
@@ -562,8 +634,9 @@
       this.getUserList()
     },
     getUserList() {
-      selectUserCondition({ type: 2 }).then((res) => {
-        this.userList = res.data;
+      // 璐ㄩ噺鐩戠潱闈㈠悜鍏ㄥ疄楠屽, 浜哄憳鍒楄〃涓嶆寜閮ㄩ棬绛涢��
+      selectUserCondition({ type: 1 }).then((res) => {
+        this.userList = res.data || [];
       })
     },
     // 鎵瑰噯
@@ -592,14 +665,29 @@
     // 瀵煎嚭
     handleDown(row) {
       exportQualitySupervise({ superviseId: row.superviseId }).then(res => {
-        try {
-          this.outLoading = false
-          const blob = new Blob([res], { type: 'application/msword' });
-          this.$download.saveAs(blob, row.superviseName + '.docx')
-        } catch (error) {
-          console.error('鍒涘缓Blob瀵硅薄鏃跺嚭閿�:', error);
-        }
+        this.outLoading = false
+        this.saveDocx(res, row.superviseName + '.docx')
+      }).catch(err => {
+        console.log('err---', err);
       })
+    },
+    // 淇濆瓨瀵煎嚭鏂囦欢: 鍚庣瀵煎嚭澶辫触鏃朵細杩斿洖閿欒JSON, 姝ゆ椂寮规彁绀鸿�屼笉鏄瓨鎴愭崯鍧忕殑docx
+    saveDocx(res, filename) {
+      const reader = new FileReader();
+      reader.readAsText(res, 'utf-8');
+      reader.onload = () => {
+        const text = (reader.result || '').trim();
+        if (text.startsWith('{') || text.startsWith('[')) {
+          let msg = '瀵煎嚭澶辫触';
+          try { msg = JSON.parse(text).msg || msg; } catch (e) { }
+          this.$message.error(msg);
+        } else {
+          this.$download.saveAs(new Blob([res], { type: 'application/msword' }), filename);
+        }
+      };
+      reader.onerror = () => {
+        this.$download.saveAs(new Blob([res], { type: 'application/msword' }), filename);
+      };
     },
     // 鍒犻櫎杩涘害璁″垝琛�
     delPlan(row) {
@@ -627,7 +715,31 @@
     // 骞村害璁″垝琛ㄦ牸锛岀偣鍑昏鏁版嵁鍚庡埛鏂拌鎯�
     rowClick(row) {
       this.superviseId = row.superviseId
+      this.currentPlan = row
       this.getYearDetailPlan()
+    },
+    // 涓嬪彂璁″垝
+    issuePlan(row) {
+      this.$confirm('涓嬪彂鍚庣洃鐫e憳涓庣浉鍏虫娴嬩汉鍛樺皢鏀跺埌閫氱煡, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.yearLoading = true
+        issueQualitySupervise({ superviseId: row.superviseId }).then(res => {
+          this.yearLoading = false
+          this.$message.success('涓嬪彂鎴愬姛')
+          this.getYearPlanList()
+        }).catch(err => {
+          this.yearLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堜笅鍙�'
+        });
+      });
     },
     getYearDetailPlan () {
       this.yearDetailPage.current = 1
@@ -715,8 +827,7 @@
     // 瀵煎嚭璁板綍
     controlDown() {
       exportSuperviseDetailRecord({ superviseDetailsId: this.download.superviseDetailsId }).then(res => {
-        const blob = new Blob([res], { type: 'application/msword' });
-        this.$download.saveAs(blob, '璁板綍瀵煎嚭.docx')
+        this.saveDocx(res, '璁板綍瀵煎嚭.docx')
       }).catch(err => {
         console.log('err---', err);
       })
@@ -724,8 +835,7 @@
     // 澶勭悊鍗曞鍑�
     processingDown() {
       superviseDetailAccordingExport({ superviseDetailsId: this.download.superviseDetailsId }).then(res => {
-        const blob = new Blob([res], { type: 'application/msword' });
-        this.$download.saveAs(blob, '涓嶇鍚堥」瀵煎嚭.docx')
+        this.saveDocx(res, '涓嶇鍚堥」瀵煎嚭.docx')
       }).catch(err => {
         console.log('err---', err);
       })
@@ -733,8 +843,9 @@
     // 绾犳鍗曞鍑�
     supervisoryDown() {
       exportSuperviseDetaillCorrect({ superviseDetailsCorrectId: this.download.superviseDetailsCorrectId }).then(res => {
-        const blob = new Blob([res], { type: 'application/msword' });
-        this.$download.saveAs(blob, '鐩戠潱绾犳鎺柦.docx')
+        this.saveDocx(res, '鐩戠潱绾犳鎺柦.docx')
+      }).catch(err => {
+        console.log('err---', err);
       })
     },
     // 鍒犻櫎骞村害璇︽儏鍒楄〃
@@ -793,6 +904,37 @@
   margin: 0 5px;
 }
 
+.doc-card {
+  padding: 12px 16px;
+  margin-bottom: 12px;
+  background-color: #f7f8fa;
+  border: 1px solid #ebeef5;
+  border-radius: 6px;
+}
+
+.doc-card-head {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.doc-card-name {
+  font-size: 14px;
+  color: var(--lims-text-2, #303133);
+}
+
+.doc-card-foot {
+  display: flex;
+  justify-content: flex-end;
+  margin-top: 10px;
+}
+
+.down-tip {
+  margin-top: 10px;
+  color: #909399;
+  font-size: 12px;
+}
+
 .search {
   width: 150px;
   padding: 0 16px;
diff --git a/src/views/CNAS/process/method/standardMethodsChange/component/ViewDeviceDialog.vue b/src/views/CNAS/process/method/methodVerification/component/ViewDeviceDialog.vue
similarity index 97%
rename from src/views/CNAS/process/method/standardMethodsChange/component/ViewDeviceDialog.vue
rename to src/views/CNAS/process/method/methodVerification/component/ViewDeviceDialog.vue
index b0faeeb..e92c63b 100644
--- a/src/views/CNAS/process/method/standardMethodsChange/component/ViewDeviceDialog.vue
+++ b/src/views/CNAS/process/method/methodVerification/component/ViewDeviceDialog.vue
@@ -60,7 +60,7 @@
 </template>
 
 <script>
-import { deviceScopeSearch } from '@/api/cnas/process/method/standardMethodsChange'
+import { deviceScopeSearch } from '@/api/cnas/process/method/methodVerification'
 
 export default {
   name: 'ViewDeviceDialog',
diff --git a/src/views/CNAS/process/method/standardMethodsChange/component/ViewTestRecord.vue b/src/views/CNAS/process/method/methodVerification/component/ViewTestRecord.vue
similarity index 98%
rename from src/views/CNAS/process/method/standardMethodsChange/component/ViewTestRecord.vue
rename to src/views/CNAS/process/method/methodVerification/component/ViewTestRecord.vue
index 752f3e2..309eba1 100644
--- a/src/views/CNAS/process/method/standardMethodsChange/component/ViewTestRecord.vue
+++ b/src/views/CNAS/process/method/methodVerification/component/ViewTestRecord.vue
@@ -32,7 +32,7 @@
 <script>
 import limsTable from '@/components/Table/lims-table.vue'
 import file from "@/utils/file";
-import { delVerifyMethodFileList, getVerifyMethodFileList } from '@/api/cnas/process/method/standardMethodsChange'
+import { delVerifyMethodFileList, getVerifyMethodFileList } from '@/api/cnas/process/method/methodVerification'
 
 export default {
   name: 'ViewTestRecord',
diff --git a/src/views/CNAS/process/method/standardMethodsChange/component/calibrationsFileDia.vue b/src/views/CNAS/process/method/methodVerification/component/calibrationsFileDia.vue
similarity index 100%
rename from src/views/CNAS/process/method/standardMethodsChange/component/calibrationsFileDia.vue
rename to src/views/CNAS/process/method/methodVerification/component/calibrationsFileDia.vue
diff --git a/src/views/CNAS/process/method/methodVerification/component/formDIa.vue b/src/views/CNAS/process/method/methodVerification/component/formDIa.vue
index 5323b46..5b8d568 100644
--- a/src/views/CNAS/process/method/methodVerification/component/formDIa.vue
+++ b/src/views/CNAS/process/method/methodVerification/component/formDIa.vue
@@ -1,12 +1,13 @@
 <template>
   <div>
     <el-dialog :close-on-click-modal="false" :close-on-press-escape="false"
-               :title="operationType === 'edit' ? '缂栬緫' : '鏂板'"
+               :title="operationType === 'edit' ? '缂栬緫' : operationType === 'view' ? '璇︽儏' : '鏂板'"
                v-model="formDia"
                width="90%" @close="closeDia">
       <div v-if="operationType === 'edit'" style="text-align: right">
         <el-button :disabled="form.confirmDate" size="small" type="primary" @click="validation">楠岃瘉纭</el-button>
       </div>
+      <fieldset :disabled="operationType === 'view'" class="view-fieldset">
       <table border="1" cellspacing="10" class="tables">
         <tr>
           <td>
@@ -202,6 +203,72 @@
           </td>
         </tr>
         <tr>
+          <td>鏁版嵁澶勭悊</td>
+          <td colspan="7">
+            <el-input v-model="form.dataProcessing" :rows="2" placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea"></el-input>
+          </td>
+        </tr>
+        <tr>
+          <td>璐ㄩ噺鎺у埗鏂规硶</td>
+          <td colspan="7">
+            <el-input v-model="form.qualityControlMethod" :rows="2" placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea"></el-input>
+          </td>
+        </tr>
+        <tr>
+          <td>鏂规硶缁撴灉楠岃瘉</td>
+          <td colspan="7">
+            <el-input v-model="form.methodResultVerification" :rows="2" placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea"></el-input>
+          </td>
+        </tr>
+        <tr>
+          <td>楠岃瘉缁撹</td>
+          <td colspan="7">
+            <el-input v-model="form.verificationConclusion" :rows="2" placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea"></el-input>
+          </td>
+        </tr>
+        <tr>
+          <td>璇勫鎰忚</td>
+          <td colspan="7">
+            <div class="opinion-box">
+              <div class="opinion-checks">
+                <el-checkbox :model-value="form.reviewResult === '鍚屾剰浣跨敤'"
+                             @change="toggleReview('鍚屾剰浣跨敤', $event)">鍚屾剰浣跨敤</el-checkbox>
+                <el-checkbox :model-value="form.reviewResult === '涓嶈兘浣跨敤'"
+                             @change="toggleReview('涓嶈兘浣跨敤', $event)">涓嶈兘浣跨敤</el-checkbox>
+                <el-checkbox :model-value="form.reviewResult === '闄愬埗浣跨敤'"
+                             @change="toggleReview('闄愬埗浣跨敤', $event)">闄愬埗浣跨敤</el-checkbox>
+              </div>
+              <div class="opinion-sign">
+                <span>璇勫浜哄憳锛�</span>
+                <el-input v-model="form.reviewPerson" placeholder="璇疯緭鍏�" size="small" style="width: 160px"></el-input>
+                <el-date-picker v-model="form.reviewDate" format="YYYY骞碝M鏈圖D鏃�" placeholder="閫夋嫨鏃ユ湡" size="small"
+                                type="date" value-format="YYYY-MM-DD" style="width: 170px"></el-date-picker>
+              </div>
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>瀹℃壒鎰忚</td>
+          <td colspan="7">
+            <div class="opinion-box">
+              <div class="opinion-checks">
+                <el-checkbox :model-value="form.approvalResult === '鍚屾剰浣跨敤'"
+                             @change="toggleApproval('鍚屾剰浣跨敤', $event)">鍚屾剰浣跨敤</el-checkbox>
+                <el-checkbox :model-value="form.approvalResult === '涓嶈兘浣跨敤'"
+                             @change="toggleApproval('涓嶈兘浣跨敤', $event)">涓嶈兘浣跨敤</el-checkbox>
+                <el-checkbox :model-value="form.approvalResult === '闄愬埗浣跨敤'"
+                             @change="toggleApproval('闄愬埗浣跨敤', $event)">闄愬埗浣跨敤</el-checkbox>
+              </div>
+              <div class="opinion-sign">
+                <span>鎶�鏈礋璐d汉锛�</span>
+                <el-input v-model="form.approvalPerson" placeholder="璇疯緭鍏�" size="small" style="width: 160px"></el-input>
+                <el-date-picker v-model="form.approvalDate" format="YYYY骞碝M鏈圖D鏃�" placeholder="閫夋嫨鏃ユ湡" size="small"
+                                type="date" value-format="YYYY-MM-DD" style="width: 170px"></el-date-picker>
+              </div>
+            </div>
+          </td>
+        </tr>
+        <tr>
           <td colspan="3">
             <p>鏄惁寮曠敤姝ゆ爣鍑嗗紑灞曟娴�:</p>
           </td>
@@ -216,15 +283,16 @@
             <p>鍙傚姞纭浜虹鍚�:</p>
           </td>
           <td colspan="5">
-            <el-select v-model="form.confirmUser" multiple placeholder="璇烽�夋嫨" size="small" style="width: 100%" :multiple-limit="5">
+            <el-select v-model="form.confirmUser" :disabled="operationType === 'view'" multiple placeholder="璇烽�夋嫨" size="small" style="width: 100%" :multiple-limit="5">
               <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
             </el-select>
           </td>
         </tr>
       </table>
+      </fieldset>
       <template #footer><span  class="dialog-footer">
         <el-button @click="closeDia">鍙� 娑�</el-button>
-        <el-button :loading="editLoad" type="primary" @click="handleEdit">鎻� 浜�</el-button>
+        <el-button v-if="operationType !== 'view'" :loading="editLoad" type="primary" @click="handleEdit">鎻� 浜�</el-button>
       </span></template>
     </el-dialog>
     <ViewDeviceDialog v-if="viewDeviceDialog" ref="viewDeviceDialog" @closDeviceDia="closDeviceDia" @handleDeviceInfo="handleDeviceInfo"></ViewDeviceDialog>
@@ -236,17 +304,17 @@
 
 <script>
 import { dateFormat } from '@/utils/date'
-import ViewDeviceDialog from '../../standardMethodsChange/component/ViewDeviceDialog.vue';
-import ViewTestRecord from '../../standardMethodsChange/component/ViewTestRecord.vue';
-import ViewWorkPermitDia from '../../standardMethodsChange/component/viewWorkPermitDia.vue';
-import CalibrationsFileDia from '../../standardMethodsChange/component/calibrationsFileDia.vue';
+import ViewDeviceDialog from './ViewDeviceDialog.vue';
+import ViewTestRecord from './ViewTestRecord.vue';
+import ViewWorkPermitDia from './viewWorkPermitDia.vue';
+import CalibrationsFileDia from './calibrationsFileDia.vue';
 import {
   addMethodVerify,
   getMethodVerifyOne,
   methodVerifyAffirm,
   updateMethodVerify
 } from '@/api/cnas/process/method/methodVerification'
-import { selectUserCondition } from '@/api/cnas/process/method/standardMethodsChange'
+import { selectUserCondition } from '@/api/cnas/process/method/methodVerification'
 export default {
   name: 'formDIa',
   // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
@@ -294,6 +362,16 @@
         otherReadiness: '',
         otherIsSatisfied: '',
         otherRemark: '',
+        dataProcessing: '',
+        qualityControlMethod: '',
+        methodResultVerification: '',
+        verificationConclusion: '',
+        reviewResult: '',
+        reviewPerson: '',
+        reviewDate: '',
+        approvalResult: '',
+        approvalPerson: '',
+        approvalDate: '',
         machineAttachmentList: []
       },
       editLoad: false,
@@ -313,7 +391,7 @@
       this.formDia = true
       this.info = row
       this.getUserList()
-      if (this.operationType === 'edit') {
+      if (this.operationType === 'edit' || this.operationType === 'view') {
         this.searchInfo(row)
       }
     },
@@ -341,6 +419,14 @@
       } else {
         this.addInfo(processMethodSearchNews)
       }
+    },
+    // 璇勫鎰忚鍕鹃�夛紙涓夐�変竴锛屽啀鐐逛竴娆″彇娑堬級
+    toggleReview (value, checked) {
+      this.form.reviewResult = checked ? value : ''
+    },
+    // 瀹℃壒鎰忚鍕鹃�夛紙涓夐�変竴锛屽啀鐐逛竴娆″彇娑堬級
+    toggleApproval (value, checked) {
+      this.form.approvalResult = checked ? value : ''
     },
     // 鏌ョ湅涓婂矖璇�
     viewWorkPermit () {
@@ -445,6 +531,12 @@
   width: 100%;
   margin-top: 10px;
 }
+.view-fieldset {
+  border: none;
+  margin: 0;
+  padding: 0;
+  min-width: 0;
+}
 .tables td {
   height: 34px;
   width: 100px;
@@ -454,4 +546,25 @@
   white-space: normal;
   padding: 4px;
 }
+.opinion-box {
+  border: 1px solid var(--el-border-color);
+  border-radius: 4px;
+  min-height: 72px;
+  padding: 8px 10px;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  gap: 8px;
+}
+.opinion-checks {
+  display: flex;
+  justify-content: flex-start;
+}
+.opinion-sign {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  gap: 8px;
+  font-size: 14px;
+}
 </style>
diff --git a/src/views/CNAS/process/method/standardMethodsChange/component/viewWorkPermitDia.vue b/src/views/CNAS/process/method/methodVerification/component/viewWorkPermitDia.vue
similarity index 100%
rename from src/views/CNAS/process/method/standardMethodsChange/component/viewWorkPermitDia.vue
rename to src/views/CNAS/process/method/methodVerification/component/viewWorkPermitDia.vue
diff --git a/src/views/CNAS/process/method/methodVerification/index.vue b/src/views/CNAS/process/method/methodVerification/index.vue
index 2349b16..dd77321 100644
--- a/src/views/CNAS/process/method/methodVerification/index.vue
+++ b/src/views/CNAS/process/method/methodVerification/index.vue
@@ -68,6 +68,13 @@
           label: '鎿嶄綔',
           operation: [
             {
+              name: '璇︽儏',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('view', row);
+              },
+            },
+            {
               name: '缂栬緫',
               type: 'text',
               clickFun: (row) => {
diff --git a/src/views/CNAS/process/method/standardMethodsChange/component/formDIaChange.vue b/src/views/CNAS/process/method/standardMethodsChange/component/formDIaChange.vue
deleted file mode 100644
index 8a64cd7..0000000
--- a/src/views/CNAS/process/method/standardMethodsChange/component/formDIaChange.vue
+++ /dev/null
@@ -1,456 +0,0 @@
-<template>
-  <div>
-    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false"
-               :title="operationType === 'edit' ? '缂栬緫' : '鏂板'"
-               v-model="formDia"
-               width="90%" @close="closeDia">
-      <div v-if="operationType === 'edit'" style="text-align: right">
-        <el-button :disabled="form.confirmDate !== '' && form.confirmDate !== null && form.confirmDate !== undefined" size="small" type="primary" @click="validation">楠岃瘉纭</el-button>
-      </div>
-      <table border="1" cellspacing="10" class="tables">
-        <tr>
-          <td>
-            <p>鏍囧噯鏂规硶</p>
-          </td>
-          <td>
-            <p>楠岃瘉鍘熷洜</p>
-          </td>
-          <td>
-            <p>涓昏鎶�鏈彉鍖�</p>
-          </td>
-          <td>
-            <p>娑夊強鏂归潰</p>
-          </td>
-          <td>
-            <p>鏍囧噯瑕佹眰</p>
-          </td>
-          <td>
-            <p>鍑嗗鎯呭喌</p>
-          </td>
-          <td>
-            <p>鏄惁婊¤冻</p>
-          </td>
-          <td>
-            <p>澶囨敞</p>
-          </td>
-        </tr>
-        <tr>
-          <td rowspan="9">
-            <el-input v-model="form.methodName" :rows="6"
-                      placeholder="璇疯緭鍏ュ唴瀹�"
-                      size="small"
-                      type="textarea">
-            </el-input>
-          </td>
-          <td rowspan="9">
-            <el-input v-model="form.verifyReason" :rows="6"
-                      placeholder="璇疯緭鍏ュ唴瀹�"
-                      size="small"
-                      type="textarea">
-            </el-input>
-          </td>
-          <td rowspan="9">
-            <el-input v-model="form.technologyChange" :rows="6"
-                      placeholder="璇疯緭鍏ュ唴瀹�"
-                      size="small"
-                      type="textarea">
-            </el-input>
-          </td>
-        </tr>
-        <tr>
-          <td>浜猴細</td>
-          <td>
-            <el-input v-model="form.personRequirements" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-input v-model="form.personReadiness" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-radio-group v-model="form.personIsSatisfied">
-              <el-radio :value="0">鍚�</el-radio>
-              <el-radio :value="1">鏄�</el-radio>
-            </el-radio-group>
-          </td>
-          <td>
-            <el-link type="primary" @click="viewWorkPermit">鏌ョ湅涓婂矖璇�</el-link>
-          </td>
-        </tr>
-        <tr>
-          <td>鏈猴細</td>
-          <td>
-            <el-input v-model="form.machineRequirements" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-input v-model="form.machineReadiness" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-radio-group v-model="form.machineIsSatisfied">
-              <el-radio :value="0">鍚�</el-radio>
-              <el-radio :value="1">鏄�</el-radio>
-            </el-radio-group>
-          </td>
-          <td>
-            <el-link type="primary" @click="viewDevice">鏌ョ湅璁惧</el-link>
-          </td>
-        </tr>
-        <tr>
-          <td>鏂欙細</td>
-          <td>
-            <el-input v-model="form.materialRequirements" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-input v-model="form.materialReadiness" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-radio-group v-model="form.materialIsSatisfied">
-              <el-radio :value="0">鍚�</el-radio>
-              <el-radio :value="1">鏄�</el-radio>
-            </el-radio-group>
-          </td>
-          <td>
-            <el-input v-model="form.materialRemark" size="small"></el-input>
-          </td>
-        </tr>
-        <tr>
-          <td>娉曪細</td>
-          <td>
-            <el-input v-model="form.methodRequirements" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-input v-model="form.methodReadiness" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-radio-group v-model="form.methodIsSatisfied">
-              <el-radio :value="0">鍚�</el-radio>
-              <el-radio :value="1">鏄�</el-radio>
-            </el-radio-group>
-          </td>
-          <td>
-            <el-link type="primary" @click="viewTestRecord">鏌ョ湅妫�娴嬭褰�</el-link>
-          </td>
-        </tr>
-        <tr>
-          <td>鐜細</td>
-          <td>
-            <el-input v-model="form.environmentRequirements" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-input v-model="form.environmentReadiness" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-radio-group v-model="form.environmentIsSatisfied">
-              <el-radio :value="0">鍚�</el-radio>
-              <el-radio :value="1">鏄�</el-radio>
-            </el-radio-group>
-          </td>
-          <td>
-            <el-input v-model="form.traceabilityRemark" size="small"></el-input>
-          </td>
-        </tr>
-        <tr>
-          <td>娴嬮噺婧簮鎬э細</td>
-          <td>
-            <el-input v-model="form.traceabilityRequirements" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-input v-model="form.traceabilityReadiness" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-radio-group v-model="form.traceabilityIsSatisfied">
-              <el-radio :value="0">鍚�</el-radio>
-              <el-radio :value="1">鏄�</el-radio>
-            </el-radio-group>
-          </td>
-          <td>
-            <el-link type="primary" @click="viewCalibrationsFileDia">鏌ョ湅鏍″噯璇佷功</el-link>
-          </td>
-        </tr>
-        <tr>
-          <td>鏍峰搧绠$悊闇�姹傦細</td>
-          <td>
-            <el-input v-model="form.managementRequirements" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-input v-model="form.managementReadiness" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-radio-group v-model="form.managementIsSatisfied">
-              <el-radio :value="0">鍚�</el-radio>
-              <el-radio :value="1">鏄�</el-radio>
-            </el-radio-group>
-          </td>
-          <td>
-            <el-input v-model="form.managementRemark" size="small"></el-input>
-          </td>
-        </tr>
-        <tr>
-          <td>鍏朵粬锛�</td>
-          <td>
-            <el-input v-model="form.otherRequirements" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-input v-model="form.otherReadiness" size="small" type="textarea"></el-input>
-          </td>
-          <td>
-            <el-radio-group v-model="form.otherIsSatisfied">
-              <el-radio :value="0">鍚�</el-radio>
-              <el-radio :value="1">鏄�</el-radio>
-            </el-radio-group>
-          </td>
-          <td>
-            <el-input v-model="form.otherRemark" size="small"></el-input>
-          </td>
-        </tr>
-        <tr>
-          <td colspan="3">
-            <p>鏄惁寮曠敤姝ゆ爣鍑嗗紑灞曟娴�:</p>
-          </td>
-          <td colspan="3">鍙互寮曠敤姝ゆ爣鍑嗗紑灞曟娴�</td>
-          <td>
-            <p>纭鏃堕棿:</p>
-          </td>
-          <td>{{form.confirmDate}}</td>
-        </tr>
-        <tr>
-          <td colspan="3">
-            <p>鍙傚姞纭浜虹鍚�:</p>
-          </td>
-          <td colspan="5">
-            <el-select v-model="form.confirmUser" multiple placeholder="璇烽�夋嫨" size="small" style="width: 100%" :multiple-limit="5">
-              <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
-            </el-select>
-          </td>
-        </tr>
-      </table>
-      <template #footer><span  class="dialog-footer">
-        <el-button @click="closeDia">鍙� 娑�</el-button>
-        <el-button :loading="editLoad" type="primary" @click="handleEdit">鎻� 浜�</el-button>
-      </span></template>
-    </el-dialog>
-    <ViewDeviceDialog v-if="viewDeviceDialog" ref="viewDeviceDialog" @closDeviceDia="closDeviceDia" @handleDeviceInfo="handleDeviceInfo"></ViewDeviceDialog>
-    <ViewTestRecord v-if="viewTestRecordDialog" ref="viewTestRecordDialog"></ViewTestRecord>
-    <ViewWorkPermitDia v-if="viewWorkPermitDia" ref="viewWorkPermitDia"></ViewWorkPermitDia>
-    <calibrations-file-dia v-if="calibrationsFileDia" ref="calibrationsFileDia"></calibrations-file-dia>
-  </div>
-</template>
-
-<script>
-import { dateFormat } from '@/utils/date'
-import ViewTestRecord from '../component/ViewTestRecord.vue';
-import ViewDeviceDialog from '../component/ViewDeviceDialog.vue';
-import ViewWorkPermitDia from '../component/viewWorkPermitDia.vue';
-import CalibrationsFileDia from '../component/calibrationsFileDia.vue';
-import {
-  addMethodVerify, deviceScopeSearch,
-  getMethodVerifyOne,
-  selectUserCondition,
-  updateMethodVerify
-} from '@/api/cnas/process/method/standardMethodsChange'
-
-export default {
-  name: 'formDIaChange',
-  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
-  components: { CalibrationsFileDia, ViewWorkPermitDia, ViewDeviceDialog, ViewTestRecord },
-  props: {
-    operationType: {
-      type: String,
-      default: () => ''
-    }
-  },
-  data() {
-    // 杩欓噷瀛樻斁鏁版嵁
-    return {
-      formDia: false,
-      form: {
-        methodName: '',
-        verifyReason: '',
-        technologyChange: '',
-        personRequirements: '',
-        personReadiness: '',
-        personIsSatisfied: '',
-        personRemark: '',
-        machineRequirements: '',
-        machineReadiness: '',
-        machineIsSatisfied: '',
-        materialRequirements: '',
-        materialReadiness: '',
-        materialIsSatisfied: '',
-        materialRemark: '',
-        methodRequirements: '',
-        methodReadiness: '',
-        methodIsSatisfied: '',
-        environmentRequirements: '',
-        environmentReadiness: '',
-        environmentIsSatisfied: '',
-        traceabilityRequirements: '',
-        traceabilityReadiness: '',
-        traceabilityIsSatisfied: '',
-        traceabilityRemark: '',
-        managementRequirements: '',
-        managementReadiness: '',
-        managementIsSatisfied: '',
-        managementRemark: '',
-        otherRequirements: '',
-        otherReadiness: '',
-        otherIsSatisfied: '',
-        otherRemark: '',
-        machineAttachmentList: []
-      },
-      editLoad: false,
-      info: {
-        methodVerifyId: ''
-      },
-      userList: [],
-      viewDeviceDialog: false,
-      viewTestRecordDialog: false,
-      viewWorkPermitDia: false,
-      calibrationsFileDia: false,
-    };
-  },
-  // 鏂规硶闆嗗悎
-  methods: {
-    openDia(row) {
-      this.formDia = true
-      this.info = row
-      this.getUserList()
-      if (this.operationType === 'edit') {
-        this.searchInfo(row)
-      }
-    },
-    // 鏌ヨ璇︽儏淇℃伅
-    searchInfo (row) {
-      getMethodVerifyOne({methodVerifyId:row.methodVerifyId}).then(res => {
-        if (res.code === 200) {
-          this.form = {...res.data}
-          if (this.form.confirmUser) {
-            this.form.confirmUser = this.form.confirmUser.split(',').map(Number)
-          }
-        }
-      }).catch(err => {
-        console.log('err---', err);
-      })
-    },
-    // 鎻愪氦
-    handleEdit() {
-      this.editLoad = true
-      const processMethodSearchNews = this.HaveJson(this.form)
-      processMethodSearchNews.confirmUser = processMethodSearchNews.confirmUser && processMethodSearchNews.confirmUser.join(',')
-      processMethodSearchNews.operationType = 0
-      if (this.operationType === 'edit') {
-        this.editInfo(processMethodSearchNews)
-      } else {
-        this.addInfo(processMethodSearchNews)
-      }
-    },
-    // 鏌ョ湅涓婂矖璇�
-    viewWorkPermit () {
-      this.viewWorkPermitDia = true
-      this.$nextTick(() => {
-        this.$refs.viewWorkPermitDia.openDia(this.form)
-      })
-    },
-    // 鏌ョ湅鏍″噯璇佷功
-    viewCalibrationsFileDia () {
-      this.calibrationsFileDia = true
-      this.$nextTick(() => {
-        this.$refs.calibrationsFileDia.openDia(this.form)
-      })
-    },
-    // 鏌ョ湅璁惧
-    viewDevice () {
-      this.viewDeviceDialog = true
-      this.$nextTick(() => {
-        this.$refs.viewDeviceDialog.openDia(this.form)
-      })
-    },
-    // 鍏抽棴璁惧寮规
-    closDeviceDia () {
-      this.viewDeviceDialog = false
-    },
-    // 鎻愪氦璁惧淇℃伅
-    handleDeviceInfo (machineAttachmentList) {
-      this.viewDeviceDialog = false
-      this.form.machineAttachmentList = machineAttachmentList
-    },
-    // 鏌ョ湅妫�娴嬭褰�
-    viewTestRecord () {
-      this.viewTestRecordDialog = true
-      this.$nextTick(() => {
-        this.$refs.viewTestRecordDialog.openDia(this.info)
-      })
-    },
-    // 鎻愪氦缂栬緫
-    editInfo (processMethodSearchNews) {
-      updateMethodVerify(processMethodSearchNews).then(res => {
-        this.editLoad = false
-        if (res.code === 200){
-          this.$message.success('鎿嶄綔鎴愬姛')
-          this.closeDia()
-        }
-      }).catch(err => {
-        console.log('err---', err);
-        this.editLoad = false
-      })
-    },
-    // 鎻愪氦鏂板
-    addInfo (processMethodSearchNews) {
-      addMethodVerify(processMethodSearchNews).then(res => {
-        this.editLoad = false
-        if (res.code === 200) {
-          this.$message.success('鎿嶄綔鎴愬姛')
-          this.closeDia()
-        }
-      }).catch(err => {
-        console.log('err---', err);
-        this.editLoad = false
-      })
-    },
-    // 楠岃瘉纭
-    validation () {
-      deviceScopeSearch({methodVerifyId:this.info.methodVerifyId}).then(res => {
-        if (res.code === 200){
-          this.form.confirmDate = dateFormat(new Date())
-        }
-      }).catch(err => {
-        console.log('err---', err);
-      })
-    },
-    // 鍏抽棴寮规
-    closeDia() {
-      this.formDia = false
-      this.$emit('closeDia');
-    },
-    getUserList(){
-      selectUserCondition().then(res => {
-        if (res.code === 200) {
-          this.userList = res.data
-        }
-      })
-    },
-  }
-};
-</script>
-
-<style scoped>
-:deep(.el-dialog) {
-  margin-top: 2vh !important;
-}
-:deep(.el-dialog__body) {
-  max-height: 720px;
-  overflow-y: auto;
-}
-.tables {
-  table-layout: fixed;
-  width: 100%;
-  margin-top: 10px;
-}
-.tables td {
-  height: 34px;
-  width: 100px;
-  text-align: center;
-  font-size: 14px;
-  word-wrap: break-word;
-  white-space: normal;
-  padding: 4px;
-}
-</style>
diff --git a/src/views/CNAS/process/method/standardMethodsChange/index.vue b/src/views/CNAS/process/method/standardMethodsChange/index.vue
deleted file mode 100644
index a372307..0000000
--- a/src/views/CNAS/process/method/standardMethodsChange/index.vue
+++ /dev/null
@@ -1,193 +0,0 @@
-<template>
-  <div class="capacity-scope">
-    <div style="display: flex;justify-content: space-between">
-      <div style="display: flex;">
-        <div style="margin-bottom: 18px;margin-right: 10px;display: flex;align-items: center;line-height: 32px;">
-          <span style="width: 88px;font-size: 14px;font-weight: 700;color: var(--lims-text-2);">鏍囧噯鏂规硶</span>
-          <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="searchForm.methodName"
-                    @keyup.enter="searchList"></el-input>
-        </div>
-        <div style="line-height: 30px;">
-          <el-button type="primary" size="small" @click="searchList">鏌ヨ</el-button>
-          <el-button size="small" @click="resetSearchForm">閲嶇疆</el-button>
-        </div>
-      </div>
-      <div style="line-height: 30px;">
-        <el-button size="small" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
-      </div>
-    </div>
-    <div class="table">
-      <lims-table :tableData="tableData" :column="tableColumn" :height="'calc(100vh - 250px)'"
-                  @pagination="pagination" :page="page" :tableLoading="tableLoading"></lims-table>
-    </div>
-    <formDIaChange v-if="formDIa" ref="formDIa" :operationType="operationType" @closeDia="closeDia"></formDIaChange>
-  </div>
-</template>
-
-<script>
-import formDIaChange from './component/formDIaChange.vue';
-import limsTable from '@/components/Table/lims-table.vue'
-import {
-  delMethodVerify,
-  exportMethodVerify,
-  pagesMethodVerify
-} from '@/api/cnas/process/method/standardMethodsChange'
-
-export default {
-  name: 'StandardMethodschange',
-  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
-  components: { limsTable, formDIaChange },
-  data() {
-    // 杩欓噷瀛樻斁鏁版嵁
-    return {
-      searchForm: {
-        methodName: '',
-        operationType: 0,
-      },
-      options: [
-        { label: '涓婂崐骞�', value: '1' },
-        { label: '涓嬪崐骞�', value: '2' },
-      ],
-      tableColumn: [
-        {
-          label: '鏍囧噯鏂规硶',
-          prop: 'methodName',
-          minWidth: '100'
-        },
-        {
-          label: '楠岃瘉鍘熷洜',
-          prop: 'verifyReason',
-          minWidth: '100'
-        },
-        {
-          label: '涓昏鎶�鏈彉鍖�',
-          prop: 'technologyChange',
-          minWidth: '100'
-        },
-        {
-          dataType: 'action',
-          minWidth: '60',
-          label: '鎿嶄綔',
-          operation: [
-            {
-              name: '缂栬緫',
-              type: 'text',
-              clickFun: (row) => {
-                this.openFormDia('edit', row);
-              },
-            },
-            {
-              name: '瀵煎嚭',
-              type: 'text',
-              clickFun: (row) => {
-                this.downLoadPost(row);
-              },
-            },
-            {
-              name: '鍒犻櫎',
-              type: 'text',
-              color: 'var(--el-color-danger)',
-              clickFun: (row) => {
-                this.deleteRow(row);
-              },
-            }
-
-          ]
-        }
-      ],
-      tableData: [],
-      tableLoading: false,
-      page: {
-        size: 10,
-        current: 1,
-        total: 0,
-      },
-      formDIa: false,
-      operationType: '',
-    };
-  },
-  mounted() {
-    this.searchList()
-  },
-  // 鏂规硶闆嗗悎
-  methods: {
-    // 鏌ヨ鍒楄〃
-    searchList() {
-      const entity = {
-        methodName: this.searchForm.methodName,
-        operationType: this.searchForm.operationType,
-      }
-      this.tableLoading = true
-      pagesMethodVerify({ ... this.page, ...entity }).then(res => {
-        this.tableLoading = false
-        if (res.code === 200) {
-          this.tableData = res.data.records
-          this.page.total = res.data.total
-        }
-      }).catch(err => {
-        console.log('err---', err);
-        this.tableLoading = false
-      })
-    },
-    // 鍒犻櫎
-    deleteRow(row) {
-      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning'
-      }).then(() => {
-        this.tableLoading = true
-        delMethodVerify({ methodVerifyId: row.methodVerifyId }).then(res => {
-          this.tableLoading = false
-          if (res.code === 200) {
-            this.$message.success('鍒犻櫎鎴愬姛')
-            this.searchList()
-          }
-        }).catch(err => {
-          this.tableLoading = false
-          console.log('err---', err);
-        })
-      })
-    },
-    // 閲嶇疆鏌ヨ鏉′欢
-    resetSearchForm() {
-      this.searchForm.methodName = '';
-      this.searchList()
-    },
-    openFormDia(type, row) {
-      this.formDIa = true
-      this.operationType = type
-      this.$nextTick(() => {
-        this.$refs.formDIa.openDia(row)
-      })
-    },
-    // 鍏抽棴寮规
-    closeDia() {
-      this.formDIa = false
-      this.searchList()
-    },
-    // 瀵煎嚭
-    downLoadPost(row) {
-      this.outLoading = true
-      exportMethodVerify({ methodVerifyId: row.methodVerifyId }).then(res => {
-        this.outLoading = false
-        const blob = new Blob([res], { type: 'application/msword' });
-        this.$download.saveAs(blob, '鏍囧噯锛堟柟娉曪級纭璁板綍.docx')
-      })
-    },
-    // 鍒嗛〉鍒囨崲
-    pagination(page) {
-      this.page.size = page.limit
-      this.searchList();
-    },
-  }
-};
-</script>
-
-<style scoped>
-.search {
-  height: 46px;
-  display: flex;
-  justify-content: space-between;
-}
-</style>
diff --git a/src/views/CNAS/resourceDemand/device/component/files.vue b/src/views/CNAS/resourceDemand/device/component/files.vue
index e2ce9f1..4228c5f 100644
--- a/src/views/CNAS/resourceDemand/device/component/files.vue
+++ b/src/views/CNAS/resourceDemand/device/component/files.vue
@@ -180,176 +180,199 @@
     <!-- 淇 -->
     <el-dialog title="妗f淇" top="5vh" v-model="dialogVisible" width="70%" @open="openFileRevisionDialog"
       :before-close="handleClose">
-      <el-row style="display:flex;justify-content: space-around;max-height: 75vh;overflow-y: auto;">
-        <!-- 宸﹁竟甯冨眬 -->
-        <el-col :span="7">
-          <el-col>
-            <!-- 鍥剧墖 -->
-            <el-image class="img" style="width:100%;height: 320px;margin-bottom:16px"
-              :src="javaApi + '/img/' + editData.imageUpload">
-              <template #error><div  class="image-error" style="width: calc(100% - 2px);
+      <div style="max-height: 75vh;overflow-y: auto;">
+      <!-- 椤堕儴锛氬浘鐗� + 鍩烘湰淇℃伅 -->
+      <el-row>
+        <el-col :span="7" style="padding-right: 20px;">
+          <!-- 鍥剧墖 -->
+          <el-image class="img" style="width:100%;height: 320px;"
+            :src="javaApi + '/img/' + editData.imageUpload">
+            <template #error><div  class="image-error" style="width: calc(100% - 2px);
             height: 318px;
             border-radius: 16px;
             display: flex;
             align-items: center;
             justify-content: center;
             border: 1px solid var(--lims-divider);">
-                <lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon>
-              </div></template>
-            </el-image>
-            <!-- 琛ㄥ崟 -->
-            <el-form :model="editData" label-width="120px" ref="rules1" :rules="rules1">
+              <lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon>
+            </div></template>
+          </el-image>
+          <!-- 鍥剧墖涓婁紶 -->
+          <div style="margin-top: 12px;text-align: center;">
+            <div v-show="editData.imageName" class="picName">{{ editData.imageName }}</div>
+            <el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false"
+              accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :on-change="beforeUpload"
+              :on-error="onError" ref='upload' class="avatar-uploader">
+              <img v-if="editData.imageUpload" :src="javaApi + '/img/' + editData.imageUpload" class="avatar">
+              <lims-icon name="el-icon-plus" v-else class="avatar-uploader-icon"></lims-icon>
+            </el-upload>
+          </div>
+        </el-col>
+        <el-col :span="17">
+          <!-- 鍩烘湰淇℃伅 -->
+          <div class="section-title" style="margin-top: 0;">鍩烘湰淇℃伅</div>
+          <el-form :model="editData" label-width="120px" ref="rules1" :rules="rules1">
+            <div class="form-row">
               <el-form-item label="浠櫒鍚嶇О:" prop="deviceName">
                 <el-input v-model="editData.deviceName" size="small"></el-input>
               </el-form-item>
               <el-form-item label="浠櫒鍚嶇ОEN:" prop="enDeviceName">
                 <el-input v-model="editData.enDeviceName" size="small"></el-input>
               </el-form-item>
+            </div>
+            <div class="form-row">
               <el-form-item label="瑙勬牸鍨嬪彿:" prop="specificationModel">
                 <el-input v-model="editData.specificationModel" size="small"></el-input>
               </el-form-item>
               <el-form-item label="鐢熶骇鍘傚:">
                 <el-input v-model="editData.manufacturer" size="small"></el-input>
               </el-form-item>
-            </el-form>
-          </el-col>
-        </el-col>
-        <!-- 涓棿甯冨眬 -->
-        <el-col :span="7">
-          <el-form :model="editData" label-width="116px" ref="rules2" :rules="rules1">
-            <el-form-item label="鏍″噯鏈嶅姟鏈烘瀯:">
-              <el-select v-model="editData.calibrationServices" clearable filterable size="small" style="width: 100%">
-                <el-option v-for="name in calibrationServiceOptions" :key="name" :label="name" :value="name"></el-option>
-              </el-select>
-            </el-form-item>
-            <el-form-item label="璧勪骇缂栫爜:">
-              <el-input v-model="editData.assetCode" size="small"></el-input>
-            </el-form-item>
-            <el-form-item label="浜у湴:">
-              <el-input v-model="editData.origin" size="small"></el-input>
-            </el-form-item>
-            <el-form-item label="鍑哄巶缂栧彿:">
-              <el-input v-model="editData.factoryNo" size="small"></el-input>
-            </el-form-item>
-            <el-form-item label="绠$悊缂栧彿:" prop="managementNumber">
-              <el-input v-model="editData.managementNumber" size="small"></el-input>
-            </el-form-item>
-            <el-form-item label="璐疆鏃ユ湡:">
-              <el-date-picker style="width:100%" v-model="editData.acquisitionDate" type="date" format="YYYY-MM-DD"
-                value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="閫夋嫨鏃ユ湡">
-              </el-date-picker>
-            </el-form-item>
-            <el-form-item label="鏍″噯鏈夋晥鏈�:" prop="activationDate">
-              <el-date-picker style="width:100%" v-model="editData.activationDate" type="date" format="YYYY-MM-DD"
-                value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="閫夋嫨鏃ユ湡">
-              </el-date-picker>
-            </el-form-item>
-            <el-form-item label="璐熻矗浜�:">
-              <el-select v-model="editData.equipmentManager" placeholder="璇烽�夋嫨" size="small" style="width:100%">
-                <el-option v-for="item in responsiblePersonList" :key="item.name" :label="item.name" :value="item.id">
-                </el-option>
-              </el-select>
-            </el-form-item>
-            <el-form-item label="瀛樻斁鐐�:">
-              <el-input v-model="editData.storagePoint" size="small"></el-input>
-            </el-form-item>
-            <el-form-item label="鎶�鏈寚鏍�:">
-              <el-input v-model="editData.technicalIndicators" :rows="7" type="textarea" size="small"></el-input>
-            </el-form-item>
-          </el-form>
-        </el-col>
-        <!-- 鍙宠竟甯冨眬 -->
-        <el-col :span="7">
-          <el-form :model="editData" label-width="140px" ref="ruleForm" :rules="rules1">
-            <el-form-item label="妫�娴嬮」鐩�:">
-              <el-cascader v-model="editData.insProductIds" :options="options" :show-all-levels="false" :props="props"
-                placeholder="璇烽�夋嫨" size="small" style="width:100%;" :collapse-tags="true" separator="," filterable
-                clearable></el-cascader>
-            </el-form-item>
-            <el-form-item label="鏈�杩戞牎鍑嗘棩鏈�:">
-              <el-date-picker style="width:100%" v-model="editData.lastCalibrationDate" format="YYYY-MM-DD"
-                value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-              </el-date-picker>
-            </el-form-item>
-            <el-form-item label="涓嬫鏍″噯鏃ユ湡:">
-              <el-date-picker style="width:100%" v-model="editData.nextCalibrationDate" format="YYYY-MM-DD"
-                value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-              </el-date-picker>
-            </el-form-item>
-            <el-form-item label="璁惧绫诲瀷:">
-              <el-select v-model="editData.largeCategory" placeholder="璇烽�夋嫨" size="small" style="width:100%">
-                <el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value">
-                </el-option>
-              </el-select>
-            </el-form-item>
-            <el-form-item label="鍗曚环(涓囧厓):">
-              <el-input v-model="editData.unitPrice" size="small"></el-input>
-            </el-form-item>
-            <el-form-item label="褰撳墠鐘舵��:" prop="deviceStatus">
-              <el-select v-model="editData.deviceStatus" placeholder="璇烽�夋嫨" size="small" style="width:100%">
-                <el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value">
-                </el-option>
-              </el-select>
-            </el-form-item>
-            <el-form-item label="鏍″噯鍛ㄦ湡锛堟湀锛�:" prop="calibrationDate">
-              <el-input v-model="editData.calibrationDate" size="small"></el-input>
-            </el-form-item>
-            <el-form-item label="鏈�杩戜繚鍏绘棩鏈�:">
-              <el-date-picker style="width:100%" v-model="editData.lastMaintenanceDate" @change="calcNextDate(editData)"
-                format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-              </el-date-picker>
-            </el-form-item>
-            <el-form-item label="涓嬫淇濆吇鏃ユ湡:">
-              <el-date-picker :disabled="true" style="width:100%" v-model="editData.nextMaintenanceDate"
-                format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-              </el-date-picker>
-            </el-form-item>
-            <el-form-item label="淇濆吇鍛ㄦ湡锛堟湀锛�:">
-              <el-input v-model="editData.maintenanceCycle" size="small" @change="calcNextDate(editData)"></el-input>
-            </el-form-item>
-            <el-form-item label="鏈�杩戞牳鏌ユ棩鏈�:">
-              <el-date-picker style="width:100%" v-model="editData.lastExamineDate" @change="calcNextDate(editData)"
-                format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-              </el-date-picker>
-            </el-form-item>
-            <el-form-item label="涓嬫鏍告煡鏃ユ湡:">
-              <el-date-picker :disabled="true" style="width:100%" v-model="editData.nextExamineDate"
-                format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-              </el-date-picker>
-            </el-form-item>
-            <el-form-item label="鏍告煡鍛ㄦ湡锛堟湀锛�:">
-              <el-input v-model="editData.examineCycle" size="small" @change="calcNextDate(editData)"></el-input>
-            </el-form-item>
-            <el-form-item label="琚巿鏉冧汉:">
-              <el-select v-model="editData.authorizedPerson" multiple placeholder="璇烽�夋嫨" size="small" style="width:100%">
-                <el-option v-for="item in inspectorList" :key="item.name" :label="item.name" :value="item.id">
-                </el-option>
-              </el-select>
-            </el-form-item>
-            <el-form-item label="鍥剧墖:">
-              <!-- <div
-                style="border: 1px solid var(--el-border-color);border-radius:4px;height:32px;lineHeight:32px;display:flex;justify-content: space-around;font-size: 13px;">
-                <div v-show="Mdata.imageName" class="picName">{{ Mdata.imageName }}</div>
-                <el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false"
-                  accept='image/jpg,image/jpeg,image/png' :headers="headers" :on-change="beforeUpload"
-                  :on-error="onError" ref='upload'>
-                  <el-button type="text" style="height:30px;padding-top:8px"><span v-if="Mdata.imageName"></span></el-button>
-                </el-upload>
-              </div> -->
-
-              <div>
-                <div v-show="editData.imageName" class="picName">{{ editData.imageName }}</div>
-                <el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false"
-                  accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :on-change="beforeUpload"
-                  :on-error="onError" ref='upload' class="avatar-uploader">
-                  <img v-if="editData.imageUpload" :src="javaApi + '/img/' + editData.imageUpload" class="avatar">
-                  <lims-icon name="el-icon-plus" v-else class="avatar-uploader-icon"></lims-icon>
-                </el-upload>
-              </div>
-            </el-form-item>
+            </div>
+            <div class="form-row">
+              <el-form-item label="浜у湴:">
+                <el-input v-model="editData.origin" size="small"></el-input>
+              </el-form-item>
+              <el-form-item label="鍑哄巶缂栧彿:">
+                <el-input v-model="editData.factoryNo" size="small"></el-input>
+              </el-form-item>
+            </div>
+            <div class="form-row">
+              <el-form-item label="璧勪骇缂栫爜:">
+                <el-input v-model="editData.assetCode" size="small"></el-input>
+              </el-form-item>
+              <el-form-item label="绠$悊缂栧彿:" prop="managementNumber">
+                <el-input v-model="editData.managementNumber" size="small"></el-input>
+              </el-form-item>
+            </div>
+            <div class="form-row">
+              <el-form-item label="璐疆鏃ユ湡:">
+                <el-date-picker style="width:100%" v-model="editData.acquisitionDate" type="date" format="YYYY-MM-DD"
+                  value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="閫夋嫨鏃ユ湡">
+                </el-date-picker>
+              </el-form-item>
+              <el-form-item label="鏍″噯鏈夋晥鏈�:" prop="activationDate">
+                <el-date-picker style="width:100%" v-model="editData.activationDate" type="date" format="YYYY-MM-DD"
+                  value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="閫夋嫨鏃ユ湡">
+                </el-date-picker>
+              </el-form-item>
+            </div>
+            <div class="form-row">
+              <el-form-item label="鏍″噯鏈嶅姟鏈烘瀯:">
+                <el-select v-model="editData.calibrationServices" clearable filterable size="small" style="width: 100%">
+                  <el-option v-for="name in calibrationServiceOptions" :key="name" :label="name" :value="name"></el-option>
+                </el-select>
+              </el-form-item>
+              <div style="flex: 1;"></div>
+            </div>
           </el-form>
         </el-col>
       </el-row>
+      <!-- 璁惧绠$悊 -->
+      <div class="section-title">璁惧绠$悊</div>
+      <el-form :model="editData" label-width="120px" ref="rules2" :rules="rules1">
+        <div class="form-row">
+          <el-form-item label="妫�娴嬮」鐩�:">
+            <el-cascader v-model="editData.insProductIds" :options="options" :show-all-levels="false" :props="props"
+              placeholder="璇烽�夋嫨" size="small" style="width:100%;" :collapse-tags="true" separator="," filterable
+              clearable></el-cascader>
+          </el-form-item>
+          <el-form-item label="璁惧绫诲瀷:">
+            <el-select v-model="editData.largeCategory" placeholder="璇烽�夋嫨" size="small" style="width:100%">
+              <el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="鍗曚环(涓囧厓):">
+            <el-input v-model="editData.unitPrice" size="small"></el-input>
+          </el-form-item>
+        </div>
+        <div class="form-row">
+          <el-form-item label="褰撳墠鐘舵��:" prop="deviceStatus">
+            <el-select v-model="editData.deviceStatus" placeholder="璇烽�夋嫨" size="small" style="width:100%">
+              <el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="璐熻矗浜�:">
+            <el-select v-model="editData.equipmentManager" placeholder="璇烽�夋嫨" size="small" style="width:100%">
+              <el-option v-for="item in responsiblePersonList" :key="item.name" :label="item.name" :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="琚巿鏉冧汉:">
+            <el-select v-model="editData.authorizedPerson" multiple placeholder="璇烽�夋嫨" size="small" style="width:100%">
+              <el-option v-for="item in inspectorList" :key="item.name" :label="item.name" :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </div>
+        <div class="form-row">
+          <el-form-item label="瀛樻斁鐐�:">
+            <el-input v-model="editData.storagePoint" size="small"></el-input>
+          </el-form-item>
+          <div style="flex: 1;"></div>
+        </div>
+      </el-form>
+      <!-- 鏍″噯/淇濆吇/鏍告煡 鍛ㄦ湡淇℃伅 -->
+      <el-form :model="editData" :rules="rules1" ref="cycleForm" label-width="140px"
+        style="margin-top: 12px;border-top: 1px solid var(--lims-divider);padding-top: 4px;">
+        <div class="cycle-row">
+          <span class="cycle-title">鏍″噯淇℃伅</span>
+          <el-form-item label="鏈�杩戞牎鍑嗘棩鏈�:" class="cycle-item">
+            <el-date-picker style="width:100%" v-model="editData.lastCalibrationDate" format="YYYY-MM-DD"
+              value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="涓嬫鏍″噯鏃ユ湡:" class="cycle-item">
+            <el-date-picker style="width:100%" v-model="editData.nextCalibrationDate" format="YYYY-MM-DD"
+              value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="鏍″噯鍛ㄦ湡锛堟湀锛�:" prop="calibrationDate" class="cycle-item">
+            <el-input v-model="editData.calibrationDate" size="small"></el-input>
+          </el-form-item>
+        </div>
+        <div class="cycle-row">
+          <span class="cycle-title">淇濆吇淇℃伅</span>
+          <el-form-item label="鏈�杩戜繚鍏绘棩鏈�:" class="cycle-item">
+            <el-date-picker style="width:100%" v-model="editData.lastMaintenanceDate" @change="calcNextDate(editData)"
+              format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="涓嬫淇濆吇鏃ユ湡:" class="cycle-item">
+            <el-date-picker :disabled="true" style="width:100%" v-model="editData.nextMaintenanceDate"
+              format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="淇濆吇鍛ㄦ湡锛堟湀锛�:" class="cycle-item">
+            <el-input v-model="editData.maintenanceCycle" size="small" @change="calcNextDate(editData)"></el-input>
+          </el-form-item>
+        </div>
+        <div class="cycle-row">
+          <span class="cycle-title">鏍告煡淇℃伅</span>
+          <el-form-item label="鏈�杩戞牳鏌ユ棩鏈�:" class="cycle-item">
+            <el-date-picker style="width:100%" v-model="editData.lastExamineDate" @change="calcNextDate(editData)"
+              format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="涓嬫鏍告煡鏃ユ湡:" class="cycle-item">
+            <el-date-picker :disabled="true" style="width:100%" v-model="editData.nextExamineDate"
+              format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="鏍告煡鍛ㄦ湡锛堟湀锛�:" class="cycle-item">
+            <el-input v-model="editData.examineCycle" size="small" @change="calcNextDate(editData)"></el-input>
+          </el-form-item>
+        </div>
+      </el-form>
+      <!-- 鎶�鏈寚鏍� -->
+      <div class="section-title">鎶�鏈寚鏍�</div>
+      <el-form :model="editData" ref="ruleForm" :rules="rules1">
+        <el-form-item>
+          <el-input v-model="editData.technicalIndicators" :rows="7" type="textarea" size="small"></el-input>
+        </el-form-item>
+      </el-form>
+      </div>
       <template #footer><span  class="dialog-footer">
         <el-row>
           <el-button @click="handleClose">鍙� 娑�</el-button>
@@ -734,6 +757,27 @@
           this.tableDataA = res.data
       })
     },
+    // 琚巿鏉冧汉鍘嗗彶鍊煎彲鑳芥槸琚弽澶嶈浆涔夌殑澶氬眰 JSON 瀛楃涓诧紝閫愬眰瑙f瀽杩樺師鎴愭暟缁�
+    normalizeAuthorizedPerson(val) {
+      let v = val
+      for (let i = 0; i < 10; i++) {
+        if (typeof v !== 'string') break
+        if (v === '') {
+          v = []
+          break
+        }
+        try {
+          v = JSON.parse(v)
+        } catch (e) {
+          v = []
+          break
+        }
+      }
+      if (!Array.isArray(v)) {
+        v = v === '' || v === null || v === undefined ? [] : [v]
+      }
+      return v.filter(x => x !== '' && x !== null && x !== undefined)
+    },
     // 鏀堕泦鏁版嵁
     getList(id) {
       selectDeviceByCode({ id }).then(res => {
@@ -741,9 +785,7 @@
         if (res.code == 200) {
           this.Mdata = res.data;
           this.Mdata.insProductIds = this.Mdata.insProductIds.split(',')
-          if (this.Mdata.authorizedPerson) {
-            this.Mdata.authorizedPerson = JSON.parse(this.Mdata.authorizedPerson)
-          }
+          this.Mdata.authorizedPerson = this.normalizeAuthorizedPerson(this.Mdata.authorizedPerson)
         }
       });
     },
@@ -809,6 +851,12 @@
           return false;
         }
       });
+      this.$refs['cycleForm'].validate((valid) => {
+        if (!valid) {
+          flag = false;
+          return false;
+        }
+      });
       if (!flag) {
         return;
       }
@@ -820,11 +868,9 @@
       const formData = this.HaveJson(this.editData)
       formData.userAllow = this.equipmentManager.toString();
       formData.insProductIds = Array.isArray(formData.insProductIds) ? formData.insProductIds.join(',') : '';
-      if (formData.authorizedPerson.length === 0) {
-        formData.authorizedPerson = ''
-      } else {
-        formData.authorizedPerson = JSON.stringify(formData.authorizedPerson)
-      }
+      formData.authorizedPerson = Array.isArray(formData.authorizedPerson) && formData.authorizedPerson.length
+        ? JSON.stringify(formData.authorizedPerson)
+        : ''
       this.upLoad = true;
       upDeviceParameter(formData).then(res => {
         this.$message.success('淇敼鎴愬姛')
@@ -974,6 +1020,57 @@
   width: 100%;
 }
 
+.cycle-row {
+  display: flex;
+  align-items: center;
+}
+
+.cycle-title {
+  width: 68px;
+  flex-shrink: 0;
+  font-size: 13px;
+  color: var(--lims-text-2, #909399);
+}
+
+.cycle-item {
+  flex: 1;
+  margin-bottom: 6px;
+  margin-right: 10px;
+}
+
+.cycle-item:last-child {
+  margin-right: 0;
+}
+
+.form-row {
+  display: flex;
+  gap: 16px;
+}
+
+.form-row > .el-form-item {
+  flex: 1;
+}
+
+.section-title {
+  position: relative;
+  padding-left: 10px;
+  margin: 14px 0 12px;
+  font-size: 13px;
+  font-weight: 600;
+  color: var(--lims-text-1, #303133);
+}
+
+.section-title::before {
+  content: "";
+  position: absolute;
+  left: 0;
+  top: 3px;
+  bottom: 3px;
+  width: 3px;
+  border-radius: 2px;
+  background: var(--el-color-primary, #409eff);
+}
+
 .el-image {
   position: relative;
 }
diff --git a/src/views/CNAS/resourceDemand/device/component/management.vue b/src/views/CNAS/resourceDemand/device/component/management.vue
index eb3cbd2..b658874 100644
--- a/src/views/CNAS/resourceDemand/device/component/management.vue
+++ b/src/views/CNAS/resourceDemand/device/component/management.vue
@@ -37,173 +37,201 @@
 		</div>
 		<el-dialog :title="isUp ? '璁惧璇︽儏' : '妗f淇'" v-model="dialogVisible" width="70%" top="5vh"
 			:before-close="handleClose">
-			<el-row style="display:flex;justify-content: space-around;max-height: 75vh;overflow-y: auto;">
-				<!-- 宸﹁竟甯冨眬 -->
-				<el-col :span="7">
-					<el-col>
-						<!-- 鍥剧墖 -->
-						<el-image class="img" style="width:100%;height: 320px;marginBottom:16px"
-							:src="javaApi + '/img/' + formData.imageUpload">
-							<template #error><div  class="image-error" style="width: calc(100% -2px);
+			<div style="max-height: 75vh;overflow-y: auto;">
+			<!-- 椤堕儴锛氬浘鐗� + 鍩烘湰淇℃伅 -->
+			<el-row>
+				<el-col :span="7" style="padding-right: 20px;">
+					<!-- 鍥剧墖 -->
+					<el-image class="img" style="width:100%;height: 320px"
+						:src="javaApi + '/img/' + formData.imageUpload">
+						<template #error><div  class="image-error" style="width: calc(100% -2px);
             height: 318px;
             border-radius: 16px;
             display: flex;
             align-items: center;
             justify-content: center;
             border: 1px solid var(--lims-divider);">
-								<lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon>
-							</div></template>
-						</el-image>
-						<!-- 琛ㄥ崟 -->
-						<el-form :label-position="labelPosition" :model="formData" label-width="120px">
+							<lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon>
+						</div></template>
+					</el-image>
+					<!-- 鍥剧墖涓婁紶 -->
+					<div style="border: 1px solid var(--el-border-color);border-radius:4px;height:32px;lineHeight:32px;display:flex;justify-content: space-around;font-size: 13px;margin-top:12px;">
+						<div v-show="formData.imageName" class="picName">{{ formData.imageName }}</div>
+						<el-upload :disabled="isUp" :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false"
+							accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :on-change="beforeUpload"
+							:on-error="onError" ref='upload'>
+							<el-button link type="primary" style="height:30px;padding-top:8px">涓婁紶</el-button>
+						</el-upload>
+					</div>
+				</el-col>
+				<el-col :span="17">
+					<!-- 鍩烘湰淇℃伅 -->
+					<div class="section-title" style="margin-top: 0;">鍩烘湰淇℃伅</div>
+					<el-form :label-position="labelPosition" :model="formData" label-width="120px">
+						<div class="form-row">
 							<el-form-item label="浠櫒鍚嶇О:" required prop="deviceName">
 								<el-input :disabled="isUp" v-model="formData.deviceName" size="small"></el-input>
 							</el-form-item>
 							<el-form-item label="浠櫒鍚嶇ОEN:">
 								<el-input :disabled="isUp" v-model="formData.enDeviceName" size="small"></el-input>
 							</el-form-item>
+						</div>
+						<div class="form-row">
 							<el-form-item label="瑙勬牸鍨嬪彿:" required>
 								<el-input :disabled="isUp" v-model="formData.specificationModel" size="small"></el-input>
 							</el-form-item>
 							<el-form-item label="鐢熶骇鍘傚:">
 								<el-input :disabled="isUp" v-model="formData.manufacturer" size="small"></el-input>
 							</el-form-item>
-						</el-form>
-					</el-col>
-				</el-col>
-				<!-- 涓棿甯冨眬 -->
-				<el-col :span="7">
-					<el-form :label-position="labelPosition" :model="formData" label-width="116px">
-						<el-form-item label="鏍″噯鏈嶅姟鏈烘瀯:">
-							<el-select :disabled="isUp" v-model="formData.calibrationServices" clearable filterable size="small" style="width: 100%">
-								<el-option v-for="name in calibrationServiceOptions" :key="name" :label="name" :value="name"></el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item label="璧勪骇缂栫爜:">
-							<el-input v-model="formData.assetCode" :disabled="isUp" size="small"></el-input>
-						</el-form-item>
-						<el-form-item label="浜у湴:">
-							<el-input v-model="formData.origin" :disabled="isUp" size="small"></el-input>
-						</el-form-item>
-						<el-form-item label="鍑哄巶缂栧彿:">
-							<el-input :disabled="isUp" v-model="formData.factoryNo" size="small"></el-input>
-						</el-form-item>
-						<el-form-item label="绠$悊缂栧彿:" required>
-							<el-input :disabled="isUp" v-model="formData.managementNumber" size="small"></el-input>
-						</el-form-item>
-						<el-form-item label="璐疆鏃ユ湡:">
-							<el-date-picker :disabled="isUp" style="width:100%" v-model="formData.acquisitionDate" type="date"
-								format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="閫夋嫨鏃ユ湡">
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item label="鏍″噯鏈夋晥鏈�:" required>
-							<el-date-picker :disabled="isUp" style="width:100%" v-model="formData.activationDate" type="date"
-								format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="閫夋嫨鏃ユ湡">
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item label="璐熻矗浜�:">
-							<el-select v-model="formData.equipmentManager" placeholder="璇烽�夋嫨" size="small" :disabled="isUp"
-								style="width:100%">
-								<el-option v-for="item in responsiblePersonList" :key="item.value" :label="item.label"
-									:value="item.value">
-								</el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item label="瀛樻斁鐐�:">
-							<el-input :disabled="isUp" v-model="formData.storagePoint" size="small"></el-input>
-						</el-form-item>
-						<el-form-item label="鎶�鏈寚鏍�:">
-							<el-input :disabled="isUp" v-model="formData.technicalIndicators" :rows="7" type="textarea"
-								size="small"></el-input>
-						</el-form-item>
-					</el-form>
-				</el-col>
-				<!-- 鍙宠竟甯冨眬 -->
-				<el-col :span="7">
-					<el-form :label-position="labelPosition" :model="formData" label-width="140px" ref="ruleForm">
-						<el-form-item label="妫�娴嬮」鐩�:">
-							<el-cascader :disabled="isUp" v-model="formData.insProductIds" :options="options" :show-all-levels="false"
-								:props="props" placeholder="璇烽�夋嫨" size="small" style="width:100%;" :collapse-tags="!isUp" separator=","
-								filterable clearable></el-cascader>
-						</el-form-item>
-						<el-form-item label="鏈�杩戞牎鍑嗘棩鏈�:">
-							<el-date-picker :disabled="isUp" style="width:100%" v-model="formData.lastCalibrationDate" @change="calcNextDate(formData)"
-								format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item label="涓嬫鏍″噯鏃ユ湡:">
-							<el-date-picker :disabled="true" style="width:100%" v-model="formData.nextCalibrationDate"
-								format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item label="璁惧绫诲瀷:">
-							<el-select :disabled="isUp" v-model="formData.largeCategory" placeholder="璇烽�夋嫨" size="small"
-								style="width:100%">
-								<el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value">
-								</el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item label="鍗曚环(涓囧厓):">
-							<el-input :disabled="isUp" v-model="formData.unitPrice" size="small"></el-input>
-						</el-form-item>
-						<el-form-item label="褰撳墠鐘舵��:" required>
-							<el-select :disabled="isUp" v-model="formData.deviceStatus" placeholder="璇烽�夋嫨" size="small"
-								style="width:100%">
-								<el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value">
-								</el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item label="鏍″噯鍛ㄦ湡锛堟湀锛�:" required>
-							<el-input :disabled="isUp" v-model="formData.calibrationDate" size="small" @change="calcNextDate(formData)"></el-input>
-						</el-form-item>
-						<el-form-item label="鏈�杩戜繚鍏绘棩鏈�:">
-							<el-date-picker :disabled="isUp" style="width:100%" v-model="formData.lastMaintenanceDate" @change="calcNextDate(formData)"
-								format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item label="涓嬫淇濆吇鏃ユ湡:">
-							<el-date-picker :disabled="true" style="width:100%" v-model="formData.nextMaintenanceDate"
-								format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item label="淇濆吇鍛ㄦ湡锛堟湀锛�:">
-							<el-input :disabled="isUp" v-model="formData.maintenanceCycle" size="small" @change="calcNextDate(formData)"></el-input>
-						</el-form-item>
-						<el-form-item label="鏈�杩戞牳鏌ユ棩鏈�:">
-							<el-date-picker :disabled="isUp" style="width:100%" v-model="formData.lastExamineDate" @change="calcNextDate(formData)"
-								format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item label="涓嬫鏍告煡鏃ユ湡:">
-							<el-date-picker :disabled="true" style="width:100%" v-model="formData.nextExamineDate"
-								format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item label="鏍告煡鍛ㄦ湡锛堟湀锛�:">
-							<el-input :disabled="isUp" v-model="formData.examineCycle" size="small" @change="calcNextDate(formData)"></el-input>
-						</el-form-item>
-						<el-form-item label="琚巿鏉冧汉:">
-							<el-select v-model="formData.authorizedPerson" multiple :disabled="isUp" placeholder="璇烽�夋嫨" size="small"
-								style="width:100%">
-								<el-option v-for="item in inspectorList" :key="item.value" :label="item.label"
-									:value="item.value">
-								</el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item label="鍥剧墖:">
-							<div
-								style="border: 1px solid var(--el-border-color);border-radius:4px;height:32px;lineHeight:32px;display:flex;justify-content: space-around;font-size: 13px;">
-								<div v-show="formData.imageName" class="picName">{{ formData.imageName }}</div>
-								<el-upload :disabled="isUp" :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false"
-									accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :on-change="beforeUpload"
-									:on-error="onError" ref='upload'>
-									<el-button link type="primary" style="height:30px;padding-top:8px">涓婁紶</el-button>
-								</el-upload>
-							</div>
-						</el-form-item>
+						</div>
+						<div class="form-row">
+							<el-form-item label="浜у湴:">
+								<el-input v-model="formData.origin" :disabled="isUp" size="small"></el-input>
+							</el-form-item>
+							<el-form-item label="鍑哄巶缂栧彿:">
+								<el-input :disabled="isUp" v-model="formData.factoryNo" size="small"></el-input>
+							</el-form-item>
+						</div>
+						<div class="form-row">
+							<el-form-item label="璧勪骇缂栫爜:">
+								<el-input v-model="formData.assetCode" :disabled="isUp" size="small"></el-input>
+							</el-form-item>
+							<el-form-item label="绠$悊缂栧彿:" required>
+								<el-input :disabled="isUp" v-model="formData.managementNumber" size="small"></el-input>
+							</el-form-item>
+						</div>
+						<div class="form-row">
+							<el-form-item label="璐疆鏃ユ湡:">
+								<el-date-picker :disabled="isUp" style="width:100%" v-model="formData.acquisitionDate" type="date"
+									format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="閫夋嫨鏃ユ湡">
+								</el-date-picker>
+							</el-form-item>
+							<el-form-item label="鏍″噯鏈夋晥鏈�:" required>
+								<el-date-picker :disabled="isUp" style="width:100%" v-model="formData.activationDate" type="date"
+									format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="閫夋嫨鏃ユ湡">
+								</el-date-picker>
+							</el-form-item>
+						</div>
+						<div class="form-row">
+							<el-form-item label="鏍″噯鏈嶅姟鏈烘瀯:">
+								<el-select :disabled="isUp" v-model="formData.calibrationServices" clearable filterable size="small" style="width: 100%">
+									<el-option v-for="name in calibrationServiceOptions" :key="name" :label="name" :value="name"></el-option>
+								</el-select>
+							</el-form-item>
+							<div style="flex: 1;"></div>
+						</div>
 					</el-form>
 				</el-col>
 			</el-row>
+			<!-- 璁惧绠$悊 -->
+			<div class="section-title">璁惧绠$悊</div>
+			<el-form :label-position="labelPosition" :model="formData" label-width="120px">
+				<div class="form-row">
+					<el-form-item label="妫�娴嬮」鐩�:">
+						<el-cascader :disabled="isUp" v-model="formData.insProductIds" :options="options" :show-all-levels="false"
+							:props="props" placeholder="璇烽�夋嫨" size="small" style="width:100%;" :collapse-tags="!isUp" separator=","
+							filterable clearable></el-cascader>
+					</el-form-item>
+					<el-form-item label="璁惧绫诲瀷:">
+						<el-select :disabled="isUp" v-model="formData.largeCategory" placeholder="璇烽�夋嫨" size="small"
+							style="width:100%">
+							<el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value">
+							</el-option>
+						</el-select>
+					</el-form-item>
+					<el-form-item label="鍗曚环(涓囧厓):">
+						<el-input :disabled="isUp" v-model="formData.unitPrice" size="small"></el-input>
+					</el-form-item>
+				</div>
+				<div class="form-row">
+					<el-form-item label="褰撳墠鐘舵��:" required>
+						<el-select :disabled="isUp" v-model="formData.deviceStatus" placeholder="璇烽�夋嫨" size="small"
+							style="width:100%">
+							<el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value">
+							</el-option>
+						</el-select>
+					</el-form-item>
+					<el-form-item label="璐熻矗浜�:">
+						<el-select v-model="formData.equipmentManager" placeholder="璇烽�夋嫨" size="small" :disabled="isUp"
+							style="width:100%">
+							<el-option v-for="item in responsiblePersonList" :key="item.value" :label="item.label"
+								:value="item.value">
+							</el-option>
+						</el-select>
+					</el-form-item>
+					<el-form-item label="琚巿鏉冧汉:">
+						<el-select v-model="formData.authorizedPerson" multiple :disabled="isUp" placeholder="璇烽�夋嫨" size="small"
+							style="width:100%">
+							<el-option v-for="item in inspectorList" :key="item.value" :label="item.label"
+								:value="item.value">
+							</el-option>
+						</el-select>
+					</el-form-item>
+				</div>
+				<div class="form-row">
+					<el-form-item label="瀛樻斁鐐�:">
+						<el-input :disabled="isUp" v-model="formData.storagePoint" size="small"></el-input>
+					</el-form-item>
+					<div style="flex: 1;"></div>
+				</div>
+			</el-form>
+			<!-- 鏍″噯/淇濆吇/鏍告煡 鍛ㄦ湡淇℃伅 -->
+			<el-form :label-position="labelPosition" :model="formData" label-width="140px"
+				style="margin-top: 12px;border-top: 1px solid var(--lims-divider);padding-top: 4px;">
+				<div class="cycle-row">
+					<span class="cycle-title">鏍″噯淇℃伅</span>
+					<el-form-item label="鏈�杩戞牎鍑嗘棩鏈�:" class="cycle-item">
+						<el-date-picker :disabled="isUp" style="width:100%" v-model="formData.lastCalibrationDate" @change="calcNextDate(formData)"
+							format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+						</el-date-picker>
+					</el-form-item>
+					<el-form-item label="涓嬫鏍″噯鏃ユ湡:" class="cycle-item">
+						<el-date-picker :disabled="true" style="width:100%" v-model="formData.nextCalibrationDate"
+							format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+						</el-date-picker>
+					</el-form-item>
+					<el-form-item label="鏍″噯鍛ㄦ湡锛堟湀锛�:" class="cycle-item" required>
+						<el-input :disabled="isUp" v-model="formData.calibrationDate" size="small" @change="calcNextDate(formData)"></el-input>
+					</el-form-item>
+				</div>
+				<div class="cycle-row">
+					<span class="cycle-title">淇濆吇淇℃伅</span>
+					<el-form-item label="鏈�杩戜繚鍏绘棩鏈�:" class="cycle-item">
+						<el-date-picker :disabled="isUp" style="width:100%" v-model="formData.lastMaintenanceDate" @change="calcNextDate(formData)"
+							format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+						</el-date-picker>
+					</el-form-item>
+					<el-form-item label="涓嬫淇濆吇鏃ユ湡:" class="cycle-item">
+						<el-date-picker :disabled="true" style="width:100%" v-model="formData.nextMaintenanceDate"
+							format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+						</el-date-picker>
+					</el-form-item>
+					<el-form-item label="淇濆吇鍛ㄦ湡锛堟湀锛�:" class="cycle-item">
+						<el-input :disabled="isUp" v-model="formData.maintenanceCycle" size="small" @change="calcNextDate(formData)"></el-input>
+					</el-form-item>
+				</div>
+				<div class="cycle-row">
+					<span class="cycle-title">鏍告煡淇℃伅</span>
+					<el-form-item label="鏈�杩戞牳鏌ユ棩鏈�:" class="cycle-item">
+						<el-date-picker :disabled="isUp" style="width:100%" v-model="formData.lastExamineDate" @change="calcNextDate(formData)"
+							format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+						</el-date-picker>
+					</el-form-item>
+					<el-form-item label="涓嬫鏍告煡鏃ユ湡:" class="cycle-item">
+						<el-date-picker :disabled="true" style="width:100%" v-model="formData.nextExamineDate"
+							format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+						</el-date-picker>
+					</el-form-item>
+					<el-form-item label="鏍告煡鍛ㄦ湡锛堟湀锛�:" class="cycle-item">
+						<el-input :disabled="isUp" v-model="formData.examineCycle" size="small" @change="calcNextDate(formData)"></el-input>
+					</el-form-item>
+				</div>
+			</el-form>
+			<!-- 鎶�鏈寚鏍� -->
+			<div class="section-title">鎶�鏈寚鏍�</div>
+			<el-input :disabled="isUp" v-model="formData.technicalIndicators" :rows="7" type="textarea"
+				size="small"></el-input>
+			</div>
 			<template #footer><span  class="dialog-footer">
 				<el-row v-if="!isUp" justify="end">
 					<el-button @click="handleClose">鍙� 娑�</el-button>
@@ -213,146 +241,166 @@
 		</el-dialog>
 		<!-- 鏂板-->
 		<el-dialog title="鏂板璁惧" top="5vh" v-model="dialogVisible2" width="70%" :before-close="handleClose2">
-			<el-row style="display:flex;justify-content: space-around;">
-				<!-- 宸﹁竟甯冨眬 -->
-				<el-col :span="7">
-					<el-col>
-						<!-- 鍥剧墖 -->
-						<el-image class="img" style="width:100%;height: 320px;margin-bottom:16px"
-							:src="javaApi + '/img/' + formData2.imageUpload">
-							<template #error><div  class="image-error" style="width: calc(100% -2px);
-          height: 318px;
-          border-radius: 16px;
-          display: flex;
-          align-items: center;
-          justify-content: center;
-          border: 1px solid var(--lims-divider);">
-								<lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon>
-							</div></template>
-						</el-image>
-						<!-- 琛ㄥ崟 -->
-						<el-form :label-position="labelPosition" :model="formData2" label-width="120px">
+			<div style="max-height: 75vh;overflow-y: auto;">
+			<!-- 椤堕儴锛氬浘鐗� + 鍩烘湰淇℃伅 -->
+			<el-row>
+				<el-col :span="7" style="padding-right: 20px;">
+					<!-- 鍥剧墖 -->
+					<el-image class="img" style="width:100%;height: 320px"
+						:src="javaApi + '/img/' + formData2.imageUpload">
+						<template #error><div  class="image-error" style="width: calc(100% -2px);
+            height: 318px;
+            border-radius: 16px;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            border: 1px solid var(--lims-divider);">
+							<lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon>
+						</div></template>
+					</el-image>
+					<!-- 鍥剧墖涓婁紶 -->
+					<div style="border: 1px solid var(--el-border-color);border-radius:4px;height:32px;line-height:32px;display:flex;justify-content: space-around;font-size: 13px;margin-top:12px;">
+						<div v-show="formData2.imageName" class="picName">{{ formData2.imageName }}</div>
+						<el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false"
+							accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :on-change="beforeUpload"
+							:on-error="onError" ref='upload'>
+							<el-button link type="primary" style="height:30px;padding-top:8px">涓婁紶</el-button>
+						</el-upload>
+					</div>
+				</el-col>
+				<el-col :span="17">
+					<!-- 鍩烘湰淇℃伅 -->
+					<div class="section-title" style="margin-top: 0;">鍩烘湰淇℃伅</div>
+					<el-form :label-position="labelPosition" :model="formData2" label-width="120px">
+						<div class="form-row">
 							<el-form-item label="浠櫒鍚嶇О:" required>
 								<el-input v-model="formData2.deviceName" size="small"></el-input>
 							</el-form-item>
 							<el-form-item label="浠櫒鍚嶇ОEN:">
 								<el-input v-model="formData2.enDeviceName" size="small"></el-input>
 							</el-form-item>
+						</div>
+						<div class="form-row">
 							<el-form-item label="瑙勬牸鍨嬪彿:" required>
 								<el-input v-model="formData2.specificationModel" size="small"></el-input>
 							</el-form-item>
 							<el-form-item label="鐢熶骇鍘傚:">
 								<el-input v-model="formData2.manufacturer" size="small"></el-input>
 							</el-form-item>
-						</el-form>
-					</el-col>
-				</el-col>
-				<!-- 涓棿甯冨眬 -->
-				<el-col :span="7">
-					<el-form :label-position="labelPosition" :model="formData2" label-width="110px">
-						<!-- <el-form-item label="鐢熶骇鍘傚EN:">
-              <el-input v-model="formData2.factoryNo" size="small"></el-input>
-            </el-form-item> -->
-						<el-form-item label="鏍″噯鏈嶅姟鏈烘瀯:">
-							<el-select v-model="formData2.calibrationServices" clearable filterable size="small" style="width: 100%">
-								<el-option v-for="name in calibrationServiceOptions2" :key="name" :label="name" :value="name"></el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item label="璧勪骇缂栫爜:">
-							<el-input v-model="formData2.assetCode" size="small"></el-input>
-						</el-form-item>
-						<el-form-item label="浜у湴:">
-							<el-input v-model="formData2.origin" size="small"></el-input>
-						</el-form-item>
-						<el-form-item label="鍑哄巶缂栧彿:">
-							<el-input v-model="formData2.factoryNo" size="small"></el-input>
-						</el-form-item>
-						<el-form-item label="绠$悊缂栧彿:" required>
-							<el-input v-model="formData2.managementNumber" size="small"></el-input>
-						</el-form-item>
-						<el-form-item label="璐疆鏃ユ湡:">
-							<el-date-picker style="width:100%" v-model="formData2.acquisitionDate" type="date" format="YYYY-MM-DD"
-								value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="閫夋嫨鏃ユ湡">
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item label="鏍″噯鏈夋晥鏈�:" required>
-							<el-date-picker style="width:100%" v-model="formData2.activationDate" type="date" format="YYYY-MM-DD"
-								value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="閫夋嫨鏃ユ湡">
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item label="璐熻矗浜�:">
-							<el-select v-model="formData2.equipmentManager" placeholder="璇烽�夋嫨" size="small" style="width:100%">
-								<el-option v-for="item in responsiblePersonList" :key="item.value" :label="item.label"
-									:value="item.value">
-								</el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item label="瀛樻斁鐐�:">
-							<el-input v-model="formData2.storagePoint" size="small"></el-input>
-						</el-form-item>
-						<el-form-item label="鎶�鏈寚鏍�:">
-							<el-input v-model="formData2.technicalIndicators" :rows="7" type="textarea" size="small"></el-input>
-						</el-form-item>
-					</el-form>
-				</el-col>
-				<!-- 鍙宠竟甯冨眬 -->
-				<el-col :span="7">
-					<el-form :label-position="labelPosition" :model="formData2" label-width="120px" ref="ruleForm">
-						<el-form-item label="妫�娴嬮」鐩�:">
-							<el-cascader v-model="formData2.insProductIds" :options="options" :show-all-levels="false" :props="props"
-								placeholder="璇烽�夋嫨" size="small" style="width:100%" collapse-tags separator="," filterable
-								clearable></el-cascader>
-						</el-form-item>
-						<el-form-item label="鏈�杩戞牎鍑嗘棩鏈�:">
-							<el-date-picker style="width:100%" v-model="formData2.lastCalibrationDate" format="YYYY-MM-DD" @change="calcNextDate(formData2)"
-								value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item label="涓嬫鏍″噯鏃ユ湡:">
-							<el-date-picker :disabled="true" style="width:100%" v-model="formData2.nextCalibrationDate" format="YYYY-MM-DD"
-								value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item label="璁惧绫诲瀷:">
-							<el-select v-model="formData2.largeCategory" placeholder="璇烽�夋嫨" size="small" style="width:100%">
-								<el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value">
-								</el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item label="鍗曚环(涓囧厓):">
-							<el-input v-model="formData2.unitPrice" size="small"></el-input>
-						</el-form-item>
-						<el-form-item label="褰撳墠鐘舵��:" required>
-							<el-select v-model="formData2.deviceStatus" placeholder="璇烽�夋嫨" size="small" style="width:100%">
-								<el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value">
-								</el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item label="鏍″噯鍛ㄦ湡锛堟湀锛�:" required>
-							<el-input v-model="formData2.calibrationDate" size="small" @change="calcNextDate(formData2)"></el-input>
-						</el-form-item>
-						<el-form-item label="琚巿鏉冧汉:">
-							<el-select v-model="formData2.authorizedPerson" multiple placeholder="璇烽�夋嫨" size="small"
-								style="width:100%">
-								<el-option v-for="item in inspectorList" :key="item.value" :label="item.label"
-									:value="item.value">
-								</el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item label="鍥剧墖:">
-							<div
-								style="border: 1px solid var(--el-border-color);border-radius:4px;height:32px;line-height:32px;display:flex;justify-content: space-around;font-size: 13px;">
-								<div v-show="formData2.imageName" class="picName">{{ formData2.imageName }}</div>
-								<el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false"
-									accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :on-change="beforeUpload"
-									:on-error="onError" ref='upload'>
-									<el-button link type="primary" style="height:30px;padding-top:8px">涓婁紶</el-button>
-								</el-upload>
-							</div>
-						</el-form-item>
+						</div>
+						<div class="form-row">
+							<el-form-item label="浜у湴:">
+								<el-input v-model="formData2.origin" size="small"></el-input>
+							</el-form-item>
+							<el-form-item label="鍑哄巶缂栧彿:">
+								<el-input v-model="formData2.factoryNo" size="small"></el-input>
+							</el-form-item>
+						</div>
+						<div class="form-row">
+							<el-form-item label="璧勪骇缂栫爜:">
+								<el-input v-model="formData2.assetCode" size="small"></el-input>
+							</el-form-item>
+							<el-form-item label="绠$悊缂栧彿:" required>
+								<el-input v-model="formData2.managementNumber" size="small"></el-input>
+							</el-form-item>
+						</div>
+						<div class="form-row">
+							<el-form-item label="璐疆鏃ユ湡:">
+								<el-date-picker style="width:100%" v-model="formData2.acquisitionDate" type="date" format="YYYY-MM-DD"
+									value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="閫夋嫨鏃ユ湡">
+								</el-date-picker>
+							</el-form-item>
+							<el-form-item label="鏍″噯鏈夋晥鏈�:" required>
+								<el-date-picker style="width:100%" v-model="formData2.activationDate" type="date" format="YYYY-MM-DD"
+									value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="閫夋嫨鏃ユ湡">
+								</el-date-picker>
+							</el-form-item>
+						</div>
+						<div class="form-row">
+							<el-form-item label="鏍″噯鏈嶅姟鏈烘瀯:">
+								<el-select v-model="formData2.calibrationServices" clearable filterable size="small" style="width: 100%">
+									<el-option v-for="name in calibrationServiceOptions2" :key="name" :label="name" :value="name"></el-option>
+								</el-select>
+							</el-form-item>
+							<div style="flex: 1;"></div>
+						</div>
 					</el-form>
 				</el-col>
 			</el-row>
+			<!-- 璁惧绠$悊 -->
+			<div class="section-title">璁惧绠$悊</div>
+			<el-form :label-position="labelPosition" :model="formData2" label-width="120px">
+				<div class="form-row">
+					<el-form-item label="妫�娴嬮」鐩�:">
+						<el-cascader v-model="formData2.insProductIds" :options="options" :show-all-levels="false" :props="props"
+							placeholder="璇烽�夋嫨" size="small" style="width:100%" collapse-tags separator="," filterable
+							clearable></el-cascader>
+					</el-form-item>
+					<el-form-item label="璁惧绫诲瀷:">
+						<el-select v-model="formData2.largeCategory" placeholder="璇烽�夋嫨" size="small" style="width:100%">
+							<el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value">
+							</el-option>
+						</el-select>
+					</el-form-item>
+					<el-form-item label="鍗曚环(涓囧厓):">
+						<el-input v-model="formData2.unitPrice" size="small"></el-input>
+					</el-form-item>
+				</div>
+				<div class="form-row">
+					<el-form-item label="褰撳墠鐘舵��:" required>
+						<el-select v-model="formData2.deviceStatus" placeholder="璇烽�夋嫨" size="small" style="width:100%">
+							<el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value">
+							</el-option>
+						</el-select>
+					</el-form-item>
+					<el-form-item label="璐熻矗浜�:">
+						<el-select v-model="formData2.equipmentManager" placeholder="璇烽�夋嫨" size="small" style="width:100%">
+							<el-option v-for="item in responsiblePersonList" :key="item.value" :label="item.label"
+								:value="item.value">
+							</el-option>
+						</el-select>
+					</el-form-item>
+					<el-form-item label="琚巿鏉冧汉:">
+						<el-select v-model="formData2.authorizedPerson" multiple placeholder="璇烽�夋嫨" size="small"
+							style="width:100%">
+							<el-option v-for="item in inspectorList" :key="item.value" :label="item.label"
+								:value="item.value">
+							</el-option>
+						</el-select>
+					</el-form-item>
+				</div>
+				<div class="form-row">
+					<el-form-item label="瀛樻斁鐐�:">
+						<el-input v-model="formData2.storagePoint" size="small"></el-input>
+					</el-form-item>
+					<div style="flex: 1;"></div>
+				</div>
+			</el-form>
+			<!-- 鏍″噯淇℃伅 -->
+			<el-form :label-position="labelPosition" :model="formData2" label-width="140px"
+				style="margin-top: 12px;border-top: 1px solid var(--lims-divider);padding-top: 4px;">
+				<div class="cycle-row">
+					<span class="cycle-title">鏍″噯淇℃伅</span>
+					<el-form-item label="鏈�杩戞牎鍑嗘棩鏈�:" class="cycle-item">
+						<el-date-picker style="width:100%" v-model="formData2.lastCalibrationDate" format="YYYY-MM-DD" @change="calcNextDate(formData2)"
+							value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+						</el-date-picker>
+					</el-form-item>
+					<el-form-item label="涓嬫鏍″噯鏃ユ湡:" class="cycle-item">
+						<el-date-picker :disabled="true" style="width:100%" v-model="formData2.nextCalibrationDate" format="YYYY-MM-DD"
+							value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="閫夋嫨鏃ユ湡">
+						</el-date-picker>
+					</el-form-item>
+					<el-form-item label="鏍″噯鍛ㄦ湡锛堟湀锛�:" class="cycle-item" required>
+						<el-input v-model="formData2.calibrationDate" size="small" @change="calcNextDate(formData2)"></el-input>
+					</el-form-item>
+				</div>
+			</el-form>
+			<!-- 鎶�鏈寚鏍� -->
+			<div class="section-title">鎶�鏈寚鏍�</div>
+			<el-input v-model="formData2.technicalIndicators" :rows="7" type="textarea"
+				size="small"></el-input>
+			</div>
 			<template #footer><span  class="dialog-footer">
 				<el-row justify="end">
 					<el-button @click="handleClose2">鍙� 娑�</el-button>
@@ -613,6 +661,27 @@
 		handleNotification(cate) {
 			this.queryParams.largeCategory = cate
 		},
+		// 琚巿鏉冧汉鍘嗗彶鍊煎彲鑳芥槸琚弽澶嶈浆涔夌殑澶氬眰 JSON 瀛楃涓诧紝閫愬眰瑙f瀽杩樺師鎴愭暟缁�
+		normalizeAuthorizedPerson(val) {
+			let v = val
+			for (let i = 0; i < 10; i++) {
+				if (typeof v !== 'string') break
+				if (v === '') {
+					v = []
+					break
+				}
+				try {
+					v = JSON.parse(v)
+				} catch (e) {
+					v = []
+					break
+				}
+			}
+			if (!Array.isArray(v)) {
+				v = v === '' || v === null || v === undefined ? [] : [v]
+			}
+			return v.filter(x => x !== '' && x !== null && x !== undefined)
+		},
 		getList() {
 			this.tableLoading = true;
 			let param = { ...this.queryParams, ...this.page };
@@ -770,6 +839,7 @@
 			//row = 鐐瑰嚮瀵瑰簲琛屽��
 			//澶嶅埗缁檉ormData
 			this.formData = this.HaveJson(row);
+			this.formData.authorizedPerson = this.normalizeAuthorizedPerson(row.authorizedPerson);
 			console.log(row.insProductIds + 'valll');
 			this.formData.insProductIds = row.insProductIds ? row.insProductIds.split(',') : [];
 		},
@@ -781,6 +851,7 @@
 			//row = 鐐瑰嚮瀵瑰簲琛屽�间竴琛屽��
 			//澶嶅埗缁檉ormData
 			this.formData = this.HaveJson(row);
+			this.formData.authorizedPerson = this.normalizeAuthorizedPerson(row.authorizedPerson);
 			if (typeof (row.insProductIds) === 'number') {
 				row.insProductIds = row.insProductIds + ''
 			}
@@ -879,11 +950,9 @@
 			delete this.formData.updateUser
 			const formData = this.HaveJson(this.formData)
 			formData.insProductIds = formData.insProductIds ? formData.insProductIds.join() : ''
-			if (formData.authorizedPerson && formData.authorizedPerson.length === 0) {
-				formData.authorizedPerson = ''
-			} else {
-				formData.authorizedPerson = JSON.stringify(formData.authorizedPerson)
-			}
+			formData.authorizedPerson = Array.isArray(formData.authorizedPerson) && formData.authorizedPerson.length
+				? JSON.stringify(formData.authorizedPerson)
+				: ''
 			this.upLoad = true;
 			upDeviceParameter(formData).then(res => {
 				this.$message.success('淇敼鎴愬姛')
@@ -924,11 +993,9 @@
 			}
 			const formData = this.HaveJson(this.formData2)
 			formData.insProductIds = formData.insProductIds ? formData.insProductIds.join() : ''
-			if (formData.authorizedPerson.length === 0) {
-				formData.authorizedPerson = ''
-			} else {
-				formData.authorizedPerson = JSON.stringify(formData.authorizedPerson)
-			}
+			formData.authorizedPerson = Array.isArray(formData.authorizedPerson) && formData.authorizedPerson.length
+				? JSON.stringify(formData.authorizedPerson)
+				: ''
 			this.upLoad2 = true;
 			addDeviceParameter(formData).then(res => {
 				this.$message.success('鎻愪氦鎴愬姛')
@@ -1075,4 +1142,54 @@
 .form-item :deep(.el-form-item__content) {
   width: 120px;
 }
+.cycle-row {
+  display: flex;
+  align-items: center;
+}
+
+.cycle-title {
+  width: 68px;
+  flex-shrink: 0;
+  font-size: 13px;
+  color: var(--lims-text-2, #909399);
+}
+
+.cycle-item {
+  flex: 1;
+  margin-bottom: 6px;
+  margin-right: 10px;
+}
+
+.cycle-item:last-child {
+  margin-right: 0;
+}
+
+.form-row {
+  display: flex;
+  gap: 16px;
+}
+
+.form-row > .el-form-item {
+  flex: 1;
+}
+
+.section-title {
+  position: relative;
+  padding-left: 10px;
+  margin: 14px 0 12px;
+  font-size: 13px;
+  font-weight: 600;
+  color: var(--lims-text-1, #303133);
+}
+
+.section-title::before {
+  content: "";
+  position: absolute;
+  left: 0;
+  top: 3px;
+  bottom: 3px;
+  width: 3px;
+  border-radius: 2px;
+  background: var(--el-color-primary, #409eff);
+}
 </style>

--
Gitblit v1.9.3