From 137bf2c0666b60cfc0d98b1a9ca7ead860ee4e7c Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期三, 28 十月 2026 17:57:29 +0800
Subject: [PATCH] feat(device,supply,satisfaction): 设备计划改造、耗材采购调整与满意度照片上传

---
 src/views/CNAS/resourceDemand/device/component/equipmentMaintenancePlan.vue |  372 +++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 279 insertions(+), 93 deletions(-)

diff --git a/src/views/CNAS/resourceDemand/device/component/equipmentMaintenancePlan.vue b/src/views/CNAS/resourceDemand/device/component/equipmentMaintenancePlan.vue
index 0c19357..2eea398 100644
--- a/src/views/CNAS/resourceDemand/device/component/equipmentMaintenancePlan.vue
+++ b/src/views/CNAS/resourceDemand/device/component/equipmentMaintenancePlan.vue
@@ -10,7 +10,7 @@
           </el-select>
         </div>
         <div>
-          <el-button size="small" type="primary" @click="loadPlan">鍒锋柊</el-button>
+          <el-button size="small" type="primary" @click="loadYearOptions(true)">鍒锋柊</el-button>
           <el-button size="small" type="primary" :loading="outLoading" @click="handleDownOne">瀵煎嚭</el-button>
         </div>
       </div>
@@ -47,25 +47,45 @@
         :row-class-name="tableRowClassName" :height="'calc(100vh - 29em)'" style="width: 100%;">
         <el-table-column align="center" header-align="center" label="搴忓彿" prop="prop" type="index"
           width="70"></el-table-column>
-        <el-table-column label="璁惧鍚嶇О鍙婂瀷鍙�" min-width="180" show-overflow-tooltip>
+        <el-table-column label="璁惧鍚嶇О" min-width="150" prop="deviceName" show-overflow-tooltip></el-table-column>
+        <el-table-column label="璁惧鍨嬪彿" min-width="130" prop="specificationModel" show-overflow-tooltip></el-table-column>
+        <el-table-column label="璁惧缂栧彿" min-width="140" prop="deviceNumber"></el-table-column>
+        <el-table-column label="瀛樻斁鐐�" min-width="120" prop="storagePoint"></el-table-column>
+        <el-table-column align="center" header-align="center" label="瀹℃牳鏃ユ湡" min-width="110">
+          <template #default="scope">{{ formatReviewDate(scope.row) }}</template>
+        </el-table-column>
+        <el-table-column align="center" header-align="center" label="缁存姢淇濆吇鍐呭">
+          <el-table-column v-for="item in checkColumns" :key="item.prop" align="center" header-align="center"
+            :label="item.label" width="110">
+            <template #default="scope">{{ scope.row[item.prop] || '鈥�' }}</template>
+          </el-table-column>
+        </el-table-column>
+        <el-table-column align="center" header-align="center" label="缁存姢浜�" min-width="100">
+          <template #default="scope">{{ scope.row.maintenanceUserName || '鈥�' }}</template>
+        </el-table-column>
+        <el-table-column label="瀹℃牳鐘舵��" min-width="100">
           <template #default="scope">
-            {{ scope.row.deviceName }}{{ scope.row.specificationModel ? ' ' + scope.row.specificationModel : '' }}
+            <el-tag v-if="!scope.row.recordStatus" type="info" disable-transitions>鏈紑濮�</el-tag>
+            <el-tag v-else-if="scope.row.recordStatus === 1" type="warning" disable-transitions>寰呭鏍�</el-tag>
+            <el-tag v-else-if="scope.row.recordStatus === 2" type="success" disable-transitions>閫氳繃</el-tag>
+            <el-tag v-else-if="scope.row.recordStatus === 3" type="danger" disable-transitions>涓嶉�氳繃</el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="璁惧缂栧彿" min-width="140" prop="deviceNumber"></el-table-column>
-        <el-table-column label="褰掑睘瀹為獙瀹�" min-width="120" prop="storagePoint"></el-table-column>
-        <el-table-column label="淇濆吇鍏抽敭閮ㄤ綅" min-width="150" prop="maintenanceSite" show-overflow-tooltip></el-table-column>
-        <el-table-column label="淇濆吇鍐呭" min-width="180" prop="maintenanceContent" show-overflow-tooltip></el-table-column>
-        <el-table-column label="淇濆吇鍛ㄦ湡" min-width="100" prop="maintenanceIntervals"></el-table-column>
-        <el-table-column label="璁″垝淇濆吇鏃堕棿" min-width="130" prop="maintenanceDate"
-          :formatter="formatDateCell"></el-table-column>
-        <el-table-column align="center" fixed="right" label="鎿嶄綔" min-width="160">
+        <el-table-column label="澶囨敞" min-width="140" show-overflow-tooltip>
+          <template #default="scope">{{ scope.row.recordRemark || '鈥�' }}</template>
+        </el-table-column>
+        <el-table-column align="center" fixed="right" label="鎿嶄綔" min-width="300">
           <template #default="scope">
             <el-button size="small" link type="primary"
+              :disabled="scope.row.recordStatus === 2 || scope.row.recordStatus === 3"
               @click="handleForm('edit', scope.row)">缂栬緫</el-button>
-            <el-button size="small" link type="primary" @click="handleForm('view', scope.row)">鏌ョ湅</el-button>
-            <el-button size="small" link type="danger"
-              @click="deleteRow(scope.row)">鍒犻櫎</el-button>
+            <el-button size="small" link type="primary" :disabled="!scope.row.recordId"
+              @click="handleForm('view', scope.row)">鏌ョ湅</el-button>
+            <el-button v-if="scope.row.recordStatus === 0 || scope.row.recordStatus === 1"
+              size="small" link type="primary" :disabled="!scope.row.maintenanceUserName"
+              @click="handleReview(scope.row)">瀹℃牳</el-button>
+            <el-button v-if="scope.row.recordStatus !== 2"
+              size="small" link type="danger" @click="deleteRow(scope.row)">鍒犻櫎</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -76,55 +96,76 @@
       </el-pagination>
     </div>
     <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" v-model="dialogVisible"
-      title="璁惧淇濆吇璁″垝鏄庣粏" width="60%" @close="resetForm">
-      <el-form ref="modelForm" :model="form" :rules="rules" label-width="130px">
+      :title="dialogTitle" width="880px" @close="resetForm">
+      <el-form ref="modelForm" :model="form" :rules="rules" label-width="150px" size="small">
         <el-row>
           <el-col :span="12">
             <el-form-item label="璁惧鍚嶇О锛�">
-              <el-input v-model="form.deviceName" disabled size="small"></el-input>
+              <el-input v-model="form.deviceName" disabled></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璁惧鍨嬪彿锛�">
+              <el-input v-model="form.specificationModel" disabled></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="璁惧缂栧彿锛�">
-              <el-input v-model="form.deviceNumber" disabled size="small"></el-input>
+              <el-input v-model="form.deviceNumber" disabled></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="褰掑睘瀹為獙瀹わ細">
-              <el-input v-model="form.storagePoint" disabled size="small"></el-input>
+            <el-form-item label="瀛樻斁鐐癸細">
+              <el-input v-model="form.storagePoint" disabled></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="淇濆吇鍛ㄦ湡锛�">
-              <el-input v-model="form.maintenanceIntervals" :disabled="operationType === 'view'" clearable
-                size="small"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="淇濆吇鍏抽敭閮ㄤ綅锛�">
-              <el-input v-model="form.maintenanceSite" :disabled="operationType === 'view'" clearable size="small"
-                type="textarea"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="淇濆吇鍐呭锛�">
-              <el-input v-model="form.maintenanceContent" :disabled="operationType === 'view'" clearable size="small"
-                type="textarea"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="璁″垝淇濆吇鏃堕棿锛�" prop="maintenanceDate">
-              <el-date-picker v-model="form.maintenanceDate" :disabled="operationType === 'view'" clearable
-                format="YYYY-MM-DD" placeholder="閫夋嫨鏃ユ湡" size="small" style="width:100%" type="date"
+            <el-form-item label="缁存姢鏃ユ湡锛�" prop="maintenanceDate">
+              <el-date-picker v-model="form.maintenanceDate" :disabled="!isEdit" clearable
+                format="YYYY-MM-DD" placeholder="閫夋嫨鏃ユ湡" style="width: 100%" type="date"
                 value-format="YYYY-MM-DD"></el-date-picker>
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="缁存姢浜猴細" prop="maintenanceUserId">
+              <el-select v-model="form.maintenanceUserId" :disabled="!isEdit" clearable filterable
+                placeholder="璇烽�夋嫨" style="width: 100%">
+                <el-option v-for="item in maintainerOptions" :key="item.id" :label="item.name"
+                  :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
         </el-row>
+        <div class="form-section-title">缁存姢淇濆吇鍐呭</div>
+        <el-row>
+          <el-col v-for="item in checkColumns" :key="item.prop" :span="12">
+            <el-form-item :label="item.label + '锛�'" :prop="item.prop">
+              <el-radio-group v-model="form[item.prop]" :disabled="!isEdit">
+                <el-radio value="鈭�">鈭�</el-radio>
+                <el-radio value="脳">脳</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="淇濆吇澶囨敞锛�">
+          <el-input v-model="form.remark" :disabled="!isEdit" :rows="2" placeholder="鍙~鍐欎繚鍏诲娉�"
+            type="textarea"></el-input>
+        </el-form-item>
+        <el-form-item v-if="operationType === 'review'" label="瀹℃牳澶囨敞锛�">
+          <el-input v-model="form.reviewRemark" :rows="2" placeholder="鍙~鍐欏鏍告剰瑙�"
+            type="textarea"></el-input>
+        </el-form-item>
+        <div class="check-note">澶囨敞锛氭甯搞�佽壇濂芥墦鈥溾垰鈥濓紝涓嶆甯稿強鍚︽墦鈥溍椻�濄��</div>
+        <div v-if="cycleNote" class="check-note">{{ cycleNote }}</div>
       </el-form>
       <template #footer><span class="dialog-footer">
         <el-button @click="resetForm">鍙� 娑�</el-button>
-        <el-button :loading="submitFormLoading" type="primary" @click="submitForm"
-          v-if="operationType !== 'view'">纭� 璁�</el-button>
+        <template v-if="operationType === 'review'">
+          <el-button :loading="reviewLoading" @click="submitReview(0)">涓嶉�氳繃</el-button>
+          <el-button :loading="reviewLoading" type="primary" @click="submitReview(1)">閫� 杩�</el-button>
+        </template>
+        <el-button v-else-if="operationType === 'edit'" :loading="submitFormLoading" type="primary"
+          @click="submitForm">纭� 璁�</el-button>
       </span></template>
     </el-dialog>
   </div>
@@ -132,15 +173,32 @@
 
 <script>
 import {
-  selectDeviceMaintenancePlanByPage,
+  getMaintenancePlanYears,
   getMaintenancePlanByYear,
   pageMaintenancePlanDetail,
-  updateMaintenancePlanDetail,
   deleteMaintenancePlanDetail,
   exportDeviceMaintenancePlan,
+  addDeviceMaintenance,
+  reviewDeviceMaintenance,
 } from '@/api/cnas/resourceDemand/device.js'
+import { selectUserCondition } from '@/api/system/user'
+import dayjs from 'dayjs'
 import { formatDateOnly } from './dateFormat'
 import { saveBlobOrShowError } from '@/utils/saveBlob'
+
+// 缁存姢淇濆吇妫�鏌ラ」锛屼笌浠櫒璁惧缁存姢淇濆吇璁板綍琛ㄤ竴鑷�
+const CHECK_ITEMS = [
+  { label: '澶栬鏄惁鑹ソ', prop: 'appearanceGood' },
+  { label: '鏄惁鍙互姝e父浣跨敤', prop: 'normalUse' },
+  { label: '鏄惁娓呮磥浠櫒琛ㄩ潰', prop: 'surfaceClean' },
+  { label: '鏍囪瘑鏄惁瀹屽ソ', prop: 'labelIntact' },
+  { label: '鏄剧ず鍣ㄧ伅鏄惁姝e父', prop: 'displayLightNormal' },
+  { label: '浠櫒鏄惁鐢熼攬', prop: 'noRust' },
+  { label: '鏍″噯鏄惁姝e父', prop: 'calibrationNormal' },
+  { label: '閰嶄欢鏄惁闇�瑕佹洿鎹�', prop: 'partsReplace' },
+  { label: '缁存姢缁撴灉鏄惁姝e父', prop: 'resultNormal' },
+]
+
 export default {
   name: "equipment-maintenance-plan",
   props: {
@@ -152,6 +210,10 @@
     }
   },
   data() {
+    const rules = {
+      maintenanceDate: [{ required: true, message: '璇烽�夋嫨缁存姢鏃ユ湡', trigger: 'change' }],
+      maintenanceUserId: [{ required: true, message: '璇烽�夋嫨缁存姢浜�', trigger: 'change' }],
+    }
     return {
       planYear: '',
       yearOptions: [],
@@ -167,40 +229,38 @@
         current: 1,
         total: 0,
       },
+      checkColumns: CHECK_ITEMS.map(item => ({ ...item })),
       dialogVisible: false,
       operationType: '',
       form: {},
-      rules: {
-        maintenanceDate: [{ required: true, message: '璇烽�夋嫨璁″垝淇濆吇鏃堕棿', trigger: 'change' }],
-      },
+      rules,
       submitFormLoading: false,
       outLoading: false,
+      reviewLoading: false,
+      userOptions: [],
     }
   },
   mounted() {
     this.loadYearOptions()
+    this.getUserList()
   },
   methods: {
-    // 骞翠唤涓嬫媺閫夐」锛氬凡鏈夎鍒掑勾浠� + 褰撳墠骞翠唤
-    loadYearOptions() {
+    // 骞翠唤涓嬫媺锛氬彧鍒楀嚭鏈夋槑缁嗙殑骞翠唤锛堢┖骞翠唤璁″垝鐢卞悗绔垹闄わ級锛岄粯璁ゆ樉绀烘湰骞村害锛堟湰骞村害鏃犺鍒掓椂閫�鍥炴渶鏂板勾浠斤級
+    loadYearOptions(preserveYear = false) {
       const currentYear = String(new Date().getFullYear())
       const finish = (years) => {
-        if (years.indexOf(currentYear) === -1) {
-          years.push(currentYear)
+        let list = [...new Set(years.map(y => String(y)).filter(Boolean))]
+        list.sort((a, b) => b.localeCompare(a))
+        if (!list.length) {
+          list = [currentYear]
         }
-        this.yearOptions = [...new Set(years)].sort((a, b) => b.localeCompare(a))
-        this.planYear = currentYear
+        this.yearOptions = list
+        const keep = preserveYear && this.planYear && list.includes(String(this.planYear))
+        this.planYear = keep ? String(this.planYear) : (list.includes(currentYear) ? currentYear : list[0])
         this.loadPlan()
       }
-      selectDeviceMaintenancePlanByPage({
-        current: 1,
-        size: 99,
-      }).then(res => {
-        let years = []
-        if (res.code == 200) {
-          years = (res.data.records || []).map(r => r.planYear).filter(Boolean)
-        }
-        finish(years)
+      getMaintenancePlanYears().then(res => {
+        finish(res.code == 200 ? (res.data || []) : [])
       }).catch(() => {
         finish([])
       })
@@ -251,9 +311,10 @@
         this.tableLoading = false
       })
     },
-    // 鍒扮偣闇�淇濆吇鐨勮鏍囩孩
-    formatDateCell(row, column, cellValue) {
-      return formatDateOnly(cellValue)
+    // 鏈鏍告樉绀鸿鍒掍繚鍏绘椂闂达紱瀹℃牳閫氳繃鍚庢樉绀哄鏍稿綋澶╋紙涓庢牳鏌ヨ鍒掍竴鑷达級
+    formatReviewDate(row) {
+      const date = row.reviewStatus === 1 ? row.reviewTime : row.maintenanceDate
+      return formatDateOnly(date) || '鈥�'
     },
     tableRowClassName({ row }) {
       return row.redFlag === 1 ? 'red-row' : ''
@@ -276,10 +337,10 @@
       this.pagination1.current = val
       this.getTableList()
     },
-    // 鎵撳紑鏄庣粏寮规
+    // 鎵撳紑鏄庣粏寮规锛歟dit 濉啓/淇敼淇濆吇璁板綍锛寁iew 鏌ョ湅锛宺eview 瀹℃牳
     handleForm(type, row) {
       this.operationType = type
-      this.form = this.HaveJson(row)
+      this.form = this.buildForm(row)
       this.dialogVisible = true
       this.$nextTick(() => {
         if (this.$refs.modelForm) {
@@ -287,31 +348,60 @@
         }
       })
     },
-    // 鎻愪氦琛ㄥ崟锛堝彧鍥炰紶鏄庣粏琛ㄥ瓧娈碉級
+    buildForm(row) {
+      const form = {
+        id: row.recordId || null,
+        maintenancePlanDetailId: row.maintenancePlanDetailId,
+        deviceId: row.deviceId,
+        deviceName: row.deviceName,
+        specificationModel: row.specificationModel,
+        deviceNumber: row.deviceNumber,
+        storagePoint: row.storagePoint,
+        // 宸叉湁璁板綍鐢ㄨ褰曟棩鏈燂紱杩樻病璁板綍鏃堕粯璁や粖澶╋紝閬垮厤鎶婅鍒掓棩鏈熷綋鎴愬疄闄呬繚鍏绘棩鏈�
+        maintenanceDate: row.recordId
+          ? formatDateOnly(row.recordMaintenanceDate)
+          : dayjs().format('YYYY-MM-DD'),
+        maintenanceCycle: row.maintenanceCycle || row.maintenanceIntervals || '',
+        maintenanceUserId: row.maintenanceUserId || '',
+        maintenanceUserName: row.maintenanceUserName || '',
+        remark: row.recordRemark || '',
+        reviewRemark: '',
+      }
+      this.checkColumns.forEach(item => {
+        form[item.prop] = row[item.prop] || ''
+      })
+      return form
+    },
+    // 淇濆瓨淇濆吇璁板綍锛堟柊澧炴垨淇敼鍚庤繘鍏ュ緟瀹℃牳锛�
     submitForm() {
       this.$refs.modelForm.validate(valid => {
-        if (valid) {
-          this.submitFormLoading = true
-          const payload = {
-            maintenancePlanDetailId: this.form.maintenancePlanDetailId,
-            maintenancePlanId: this.form.maintenancePlanId,
-            deviceId: this.form.deviceId,
-            maintenanceSite: this.form.maintenanceSite,
-            maintenanceContent: this.form.maintenanceContent,
-            maintenanceIntervals: this.form.maintenanceIntervals,
-            maintenanceDate: this.form.maintenanceDate,
-          }
-          updateMaintenancePlanDetail(payload).then(res => {
-            if (res.code == 200) {
-              this.$message.success('淇敼鎴愬姛')
-              this.dialogVisible = false
-              this.getTableList()
-            }
-            this.submitFormLoading = false
-          }).catch(() => {
-            this.submitFormLoading = false
-          })
+        if (!valid) {
+          return
         }
+        this.submitFormLoading = true
+        const payload = {
+          maintenancePlanDetailId: this.form.maintenancePlanDetailId,
+          deviceId: this.form.deviceId,
+          maintenanceDate: this.form.maintenanceDate,
+          maintenanceUserId: this.form.maintenanceUserId,
+          remark: this.form.remark,
+        }
+        if (this.form.id) {
+          payload.id = this.form.id
+        }
+        this.checkColumns.forEach(item => {
+          payload[item.prop] = this.form[item.prop]
+        })
+        addDeviceMaintenance(payload).then(res => {
+          this.submitFormLoading = false
+          if (res.code == 200) {
+            this.$message.success(this.form.id ? '淇敼鎴愬姛' : '淇濆瓨鎴愬姛')
+            this.dialogVisible = false
+            this.loadPlan()
+          }
+        }).catch(() => {
+          this.submitFormLoading = false
+        })
       })
     },
     resetForm() {
@@ -319,14 +409,15 @@
     },
     // 鏄庣粏-鍒犻櫎
     deleteRow(row) {
-      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ潯鏄庣粏, 鏄惁缁х画?', '鎻愮ず', {
+      this.$confirm('鍒犻櫎鍚庯紝璇ヨ鐨勪繚鍏昏褰曪紙鏈鏍告垨瀹℃牳涓嶉�氳繃锛変細涓�骞跺垹闄わ紝鏄惁缁х画?', '鎻愮ず', {
         confirmButtonText: '纭畾',
         cancelButtonText: '鍙栨秷',
         type: 'warning'
       }).then(() => {
         deleteMaintenancePlanDetail({ maintenancePlanDetailId: row.maintenancePlanDetailId }).then(() => {
           this.$message.success('鍒犻櫎鎴愬姛锛�');
-          this.getTableList()
+          // 鍒犲畬鍙兘鏄骞翠唤鏈�鍚庝竴鏉★紝閲嶆柊鍙栧勾浠斤紝绌哄勾浠戒細涓�骞舵竻鎺�
+          this.loadYearOptions(true)
         });
       }).catch(() => {
         this.$message({
@@ -344,12 +435,91 @@
       }).catch(() => {
         this.outLoading = false
       })
-    }
+    },
+    // 鎵撳紑淇濆吇璁板綍瀹℃牳寮规
+    handleReview(row) {
+      this.handleForm('review', row)
+    },
+    // 鎻愪氦瀹℃牳缁撴灉锛�1 閫氳繃锛�0 涓嶉�氳繃
+    submitReview(status) {
+      this.reviewLoading = true
+      reviewDeviceMaintenance({
+        maintenancePlanDetailId: this.form.maintenancePlanDetailId,
+        reviewStatus: status,
+        reviewRemark: this.form.reviewRemark,
+      }).then(res => {
+        this.reviewLoading = false
+        if (res.code == 200) {
+          this.$message.success(status === 1 ? '瀹℃牳閫氳繃' : '瀹℃牳涓嶉�氳繃')
+          this.dialogVisible = false
+          // 瀹℃牳閫氳繃鍚庢槑缁嗕細褰掑埌瀹℃牳骞翠唤鐨勮鍒掞紝閲嶆柊鍙栧勾浠介伩鍏嶅仠鍦ㄤ笉瀛樺湪鐨勫勾浠�
+          this.loadYearOptions(true)
+        }
+      }).catch(() => {
+        this.reviewLoading = false
+      })
+    },
+    // 缁存姢浜轰笅鎷�
+    getUserList() {
+      selectUserCondition({ type: 2 }).then(res => {
+        if (res.code == 200) {
+          this.userOptions = res.data || []
+        }
+      })
+    },
   },
   computed: {
     // 鏄惁宸插畬鎴愬鏍革紙閫氳繃/涓嶉�氳繃锛�
     isAudited() {
       return this.planInfo.status === 0 || this.planInfo.status === 1;
+    },
+    // 浠呯紪杈戠姸鎬佸彲濉啓琛ㄥ崟
+    isEdit() {
+      return this.operationType === 'edit'
+    },
+    // 鎸夎澶囨。妗堢殑淇濆吇鍛ㄦ湡锛堟湀锛夌敓鎴愬簳閮ㄨ鏄�
+    cycleNote() {
+      const months = parseInt((this.form && this.form.maintenanceCycle) || '', 10)
+      if (!months || months <= 0) {
+        return ''
+      }
+      if (months === 1) {
+        return '姝よ澶囩淮鎶や繚鍏绘瘡鏈� 1 娆°��'
+      }
+      if (months === 3) {
+        return '姝よ澶囩淮鎶や繚鍏绘瘡瀛e害 1 娆°��'
+      }
+      if (months === 6) {
+        return '姝よ澶囩淮鎶や繚鍏绘瘡鍗婂勾 1 娆°��'
+      }
+      if (months === 12) {
+        return '姝よ澶囩淮鎶や繚鍏绘瘡骞� 1 娆°��'
+      }
+      if (months % 12 === 0) {
+        return `姝よ澶囩淮鎶や繚鍏绘瘡 ${months / 12} 骞� 1 娆°�俙
+      }
+      return `姝よ澶囩淮鎶や繚鍏绘瘡 ${months} 涓湀 1 娆°�俙
+    },
+    dialogTitle() {
+      if (this.operationType === 'view') {
+        return '鏌ョ湅淇濆吇璁板綍'
+      }
+      if (this.operationType === 'review') {
+        return '淇濆吇璁板綍瀹℃牳'
+      }
+      return '缂栬緫淇濆吇璁板綍'
+    },
+    // 宸查�夌淮鎶や汉涓嶅湪褰撳墠浜哄憳鍒楄〃鏃惰ˉ涓�鏉★紝淇濊瘉涓嬫媺鑳芥樉绀哄鍚�
+    maintainerOptions() {
+      const list = this.userOptions.slice()
+      const form = this.form || {}
+      if (form.maintenanceUserId && !list.some(item => item.id === form.maintenanceUserId)) {
+        list.unshift({
+          id: form.maintenanceUserId,
+          name: form.maintenanceUserName || String(form.maintenanceUserId),
+        })
+      }
+      return list
     },
   },
 }
@@ -407,6 +577,22 @@
   margin-bottom: 10px;
 }
 
+.form-section-title {
+  font-size: 14px;
+  font-weight: 600;
+  color: var(--lims-text);
+  margin: 4px 0 16px;
+  padding-left: 8px;
+  border-left: 4px solid var(--el-color-primary);
+}
+
+.check-note {
+  font-size: 13px;
+  color: #909399;
+  line-height: 22px;
+  padding-left: 150px;
+}
+
 :deep(.red-row td) {
   background: #ffcccc !important;
 }

--
Gitblit v1.9.3