From 951b0558a6c3990e1c0ca792aed332914228508d Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期二, 13 十月 2026 17:45:08 +0800
Subject: [PATCH] 设备模块调整:档案修订新增保养、核查日期与周期并自动计算下次日期,列表新增核查、保养相关列且到期前一个月标红;设备校准的服务机构改为合格供应商下拉,使用授权的被授权人改为检测员下拉;设备树改为全部/设备/计量器具分类;保养计划明细新增计划保养时间;移除量值溯源计划页签

---
 src/views/CNAS/resourceDemand/device/component/files.vue |  112 +++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 78 insertions(+), 34 deletions(-)

diff --git a/src/views/CNAS/resourceDemand/device/component/files.vue b/src/views/CNAS/resourceDemand/device/component/files.vue
index acaad4e..e2ce9f1 100644
--- a/src/views/CNAS/resourceDemand/device/component/files.vue
+++ b/src/views/CNAS/resourceDemand/device/component/files.vue
@@ -40,10 +40,6 @@
             <p>{{ Mdata.managementNumber }}</p>
           </div>
           <div class="form-item">
-            <label>鎵�灞為儴闂�</label>
-            <p>{{ Mdata.laboratoryName }}</p>
-          </div>
-          <div class="form-item">
             <label>鐢熶骇鍘傚</label>
             <!-- <p>{{ Mdata.manufacturer }}</p> -->
             <el-tooltip class="item" :content="Mdata.manufacturer">
@@ -222,7 +218,9 @@
         <el-col :span="7">
           <el-form :model="editData" label-width="116px" ref="rules2" :rules="rules1">
             <el-form-item label="鏍″噯鏈嶅姟鏈烘瀯:">
-              <el-input v-model="editData.calibrationServices" size="small"></el-input>
+              <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>
@@ -263,14 +261,6 @@
         <!-- 鍙宠竟甯冨眬 -->
         <el-col :span="7">
           <el-form :model="editData" label-width="140px" ref="ruleForm" :rules="rules1">
-            <!-- 瀹為獙瀹ゅ垪琛� -->
-            <el-form-item label="鎵�灞為儴闂�:" prop="subordinateDepartmentsId">
-              <el-select v-model="editData.subordinateDepartmentsId" placeholder="璇烽�夋嫨" size="small" style="width:100%">
-                <el-option v-for="item in subordinateDepartmentsList" :key="item.value" :label="item.label"
-                  :value="item.value">
-                </el-option>
-              </el-select>
-            </el-form-item>
             <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
@@ -304,9 +294,35 @@
             <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 responsiblePersonList" :key="item.name" :label="item.name" :value="item.id">
+                <el-option v-for="item in inspectorList" :key="item.name" :label="item.name" :value="item.id">
                 </el-option>
               </el-select>
             </el-form-item>
@@ -446,6 +462,7 @@
 
 <script>
 import { ElMessageBox } from 'element-plus'
+import dayjs from 'dayjs'
 import fileDownload from '@/utils/file'
 // vue-qr 鍙敮鎸� Vue2锛屾崲鎴愬悓 props 鐨勬湰鍦扮粍浠讹紙鍐呴儴鐢� Vue3 鐨� qrcode.vue锛�
 import vueQr from '@/components/QrCode'
@@ -463,9 +480,7 @@
   getInsProduction,
 } from '@/api/cnas/resourceDemand/device.js'
 import { selectUserCondition } from "@/api/business/inspectionTask";
-import {
-  obtainItemParameterList,
-} from '@/api/cnas/resourceDemand/device.js'
+import { selectQualifiedSupplierManagementPage } from '@/api/cnas/externalService/supplierManage/supplierManage'
 export default {
   props: {
     clickNodeVal: {
@@ -499,9 +514,6 @@
         ],
         calibrationDate: [
           { required: true, message: '璇疯緭鍏ユ牎鍑嗗懆鏈�(鏈�)', trigger: 'blur' },
-        ],
-        subordinateDepartmentsId: [
-          { required: true, message: '璇烽�夋嫨鎵�灞為儴闂�', trigger: 'change' },
         ]
       },
       // dateForm: {
@@ -540,7 +552,7 @@
       dialogVisible: false,
       upLoad: false,
       responsiblePersonList: [],
-      subordinateDepartmentsList: [],
+      inspectorList: [],
       options: [],
       equipmentList: [],
       deviceStatusList: [],
@@ -553,9 +565,17 @@
       editData: {
         authorizedPerson: [],
       },
+      qualifiedSupplierNames: [],
     }
   },
   computed: {
+    // 鏍″噯鏈嶅姟鏈烘瀯涓嬫媺閫夐」锛堝悎鏍间緵搴斿晢 + 褰撳墠鍊煎厹搴曪級
+    calibrationServiceOptions() {
+      const list = this.qualifiedSupplierNames.slice();
+      const value = this.editData.calibrationServices;
+      if (value && list.indexOf(value) === -1) list.push(value);
+      return list;
+    },
     action() {
       return this.javaApi + '/deviceScope/uploadFile'
     }
@@ -566,8 +586,18 @@
     // 鑾峰彇鐩稿叧鏂囨。鐨勬暟鎹�
     this.getPage()
     this.timeStamp = Date.now()
+    this.obtainQualifiedSupplierList()
   },
   methods: {
+    // 鎷夊彇鍚堟牸渚涘簲鍟嗗垪琛紙鏍″噯鏈嶅姟鏈烘瀯涓嬫媺閫夐」锛�
+    obtainQualifiedSupplierList() {
+      selectQualifiedSupplierManagementPage({ current: 1, size: 999 }).then(res => {
+        if (res.code === 200) {
+          const rows = (res.data && res.data.records) || [];
+          this.qualifiedSupplierNames = [...new Set(rows.map(r => r.supplierName).filter(Boolean))];
+        }
+      });
+    },
     // 鍘熷厛鐨� Vue2 filter锛孷ue3 宸茬Щ闄� filters 閫夐」锛屾敼涓烘柟娉曡皟鐢�
     formaterDateTime(dateTime) {
       if (dateTime === undefined || dateTime === null || dateTime === '') {
@@ -602,8 +632,6 @@
     openFileRevisionDialog() {
       // 鑾峰彇妗f淇璐熻矗浜轰笅鎷夋鏁版嵁
       this.selectDevicePrincipal()
-      // 鑾峰彇妗f淇鎵�灞為儴闂ㄤ笅鎷夋鏁版嵁
-      this.obtainItemParameterList()
       // 鑾峰彇妗f淇璁惧鐘舵�佷笅鎷夋鏁版嵁
       this.selectEnumByCategory()
       // 鑾峰彇妗f淇妫�楠岄」鐩骇鑱斿脊妗嗘暟鎹�
@@ -736,6 +764,30 @@
         this.dialogVisible = true
       })
     },
+    // 涓嬫鏃ユ湡 = 鏈�杩戞棩鏈� + 鍛ㄦ湡锛堟湀锛夛紝鑷姩璁$畻
+    calcNextDate(data) {
+      const calc = (lastDate, cycle) => {
+        const period = parseInt(cycle)
+        if (!lastDate || !period || period <= 0) {
+          return null
+        }
+        return dayjs(String(lastDate).replace(' ', 'T'))
+          .add(period, 'month')
+          .format('YYYY-MM-DD HH:mm:ss')
+      }
+      const nextCalibrationDate = calc(data.lastCalibrationDate, data.calibrationDate)
+      if (nextCalibrationDate) {
+        data.nextCalibrationDate = nextCalibrationDate
+      }
+      const nextMaintenanceDate = calc(data.lastMaintenanceDate, data.maintenanceCycle)
+      if (nextMaintenanceDate) {
+        data.nextMaintenanceDate = nextMaintenanceDate
+      }
+      const nextExamineDate = calc(data.lastExamineDate, data.examineCycle)
+      if (nextExamineDate) {
+        data.nextExamineDate = nextExamineDate
+      }
+    },
     //淇妗f
     submitForm() {
       let flag = true
@@ -822,17 +874,9 @@
       selectUserCondition().then(res => {
         this.responsiblePersonList = res.data;
       })
-    },
-    obtainItemParameterList() {
-      obtainItemParameterList().then(res => {
-        let data = []
-        res.data.forEach(a => {
-          data.push({
-            label: a.laboratoryName,
-            value: a.id
-          })
-        })
-        this.subordinateDepartmentsList = data
+      // 琚巿鏉冧汉涓嬫媺鍙彇妫�娴嬪憳瑙掕壊浜哄憳
+      selectUserCondition({ type: 3 }).then(res => {
+        this.inspectorList = res.data;
       })
     },
     getInsProductIds() {

--
Gitblit v1.9.3