From c8a5ed885ab1a8206020b76be316ece1eb1f68f2 Mon Sep 17 00:00:00 2001
From: 祖安之光 <11848914+light-of-zuan@user.noreply.gitee.com>
Date: 星期二, 30 九月 2025 09:48:51 +0800
Subject: [PATCH] 修改新增

---
 src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/index.vue                 |  244 +++++++++++++++++++++++++++++++++-------
 src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/components/editDialog.vue |  112 ++++++++++++------
 2 files changed, 272 insertions(+), 84 deletions(-)

diff --git a/src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/components/editDialog.vue b/src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/components/editDialog.vue
index 99d8e75..fc7d3f5 100644
--- a/src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/components/editDialog.vue
+++ b/src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/components/editDialog.vue
@@ -163,29 +163,50 @@
               </el-input>
             </template>
           </el-table-column>
+          <el-table-column label="证书名称" prop="certificateName" align="center">
+            <template #default="scope">
+              <el-input
+                  v-model.trim="scope.row.certificateName"
+                  style="width: 100%;"
+                  clearable
+                  :readonly="state.title == '查看'"
+              >
+              </el-input>
+            </template>
+          </el-table-column>
+          <el-table-column label="证书上传" prop="certificateName" align="center">
+            <template #default="scope">
+              <el-upload accept=".pdf,image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,scope.$index)" :on-exceed="showTip" :limit='state.fileLimit' v-model:file-list="state.fileList[scope.$index]" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles, scope.$index)" >
+                <el-button type="primary">点击上传</el-button>
+                <template #tip>
+                  <div class="el-upload__tip">支持上传pdf、图片格式,尺寸小于5M,最多可上传1份</div>
+                </template>
+              </el-upload>
+            </template>
+          </el-table-column>
           <el-table-column label="操作" align="center" width="70" v-if="state.title == '新增'||state.title == '编辑' ">
             <template #default="scope">
               <el-button link type="danger" @click="handleDelete(scope.$index)">删除</el-button>
             </template>
           </el-table-column>
         </el-table>
-        <el-form-item label="证书名称:" prop="certificateName" v-if="state.title == '上传'">
-          <el-input
-              v-model.trim="state.form.certificateName"
-              style="width: 100%;"
-              clearable
-              :readonly="state.title == '查看'"
-          >
-          </el-input>
-        </el-form-item>
-        <el-form-item label="检定证书:" prop="certificate" v-if="state.title == '上传'">
-          <el-upload accept=".pdf,image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.fileLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" >
-            <el-button type="primary">点击上传</el-button>
-            <template #tip>
-              <div class="el-upload__tip">支持上传pdf、图片格式,尺寸小于5M,最多可上传1份</div>
-            </template>
-          </el-upload>
-        </el-form-item>
+<!--        <el-form-item label="证书名称:" prop="certificateName" v-if="state.title == '上传'">-->
+<!--          <el-input-->
+<!--              v-model.trim="state.form.certificateName"-->
+<!--              style="width: 100%;"-->
+<!--              clearable-->
+<!--              :readonly="state.title == '查看'"-->
+<!--          >-->
+<!--          </el-input>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="检定证书:" prop="certificate" v-if="state.title == '上传'">-->
+<!--          <el-upload accept=".pdf,image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.fileLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" >-->
+<!--            <el-button type="primary">点击上传</el-button>-->
+<!--            <template #tip>-->
+<!--              <div class="el-upload__tip">支持上传pdf、图片格式,尺寸小于5M,最多可上传1份</div>-->
+<!--            </template>-->
+<!--          </el-upload>-->
+<!--        </el-form-item>-->
         <el-row v-if="state.title !== '上传'">
           <el-col :span="12">
             <el-form-item label="编制:" prop="establishmentId">
@@ -293,9 +314,7 @@
     establishmentTime: '',
     processId: null,
     processName: '',
-    processTime: '',
-    certificateName: '',
-    certificate: '',
+    processTime: ''
   },
   oldDeviceList: [],
   formRules:{
@@ -307,9 +326,7 @@
     establishmentTime: [{ required: true, message: '请选择编制时间', trigger: 'blur' }],
     processId: [{ required: true, message: '请选择审核人', trigger: 'blur' }],
     processTime: [{ required: true, message: '请选择审核时间', trigger: 'blur' }],
-    approvalId: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
-    certificateName: [{ required: true, message: '请填写证书名称', trigger: 'blur' }],
-    certificate: [{ required: true, validator: checkFileList, trigger: 'blur' }]
+    approvalId: [{ required: true, message: '请选择批准人', trigger: 'blur' }]
   },
   isAdmin: false,
   companyList: [],
@@ -353,13 +370,17 @@
     actCalibrationTime: '',
     calibrationUser: '',
     status: '',
-    useUser: ''
+    useUser: '',
+    certificateName: '',
+    certificate: ''
   }
   state.form.annualVerificationDevices.push(obj);
 }
 
 const handleDelete = (i) =>{
+  console.log(i,state.fileList,'list')
   state.form.annualVerificationDevices = state.form.annualVerificationDevices.filter((item,index) => index != i)
+  state.fileList = state.fileList.filter((item,index) => index != i)
 }
 
 const onSubmit = async () => {
@@ -414,16 +435,27 @@
         actCalibrationTime: item.actCalibrationTime,
         calibrationUser: item.calibrationUser,
         useUser: item.useUser,
-        status: item.status
+        status: item.status,
+        certificateName: item.certificateName,
+        certificate: item.certificate
       }
     })
     state.oldDeviceList = state.form.annualVerificationDevices
-    if(state.form.certificate) {
-      const obj = {
-        url: state.form.certificate,
-        name: state.form.certificateName
+    // if(state.form.certificate) {
+    //   const obj = {
+    //     url: state.form.certificate,
+    //     name: state.form.certificateName
+    //   }
+    //   state.fileList = [obj]
+    // }
+    for(let i in state.form.annualVerificationDevices){
+      if(state.form.annualVerificationDevices[i].certificate && state.form.annualVerificationDevices[i].certificate !== ''){
+          const obj = {
+            url: state.form.annualVerificationDevices[i].certificate,
+            name: state.form.annualVerificationDevices[i].certificateName
+          }
+          state.fileList[i] = [obj]
       }
-      state.fileList = [obj]
     }
   }else{
     ElMessage.warning(res.message)
@@ -452,11 +484,11 @@
   }
 }
 
-const handleAvatarSuccess = (res, uploadFile) => {
+const handleAvatarSuccess = (res, uploadFile, index) => {
   if(res.code == 200){
-    state.form.certificate = res.data.path
+    state.form.annualVerificationDevices[index].certificate = res.data.path
   }else{
-    state.fileList = []
+    state.fileList[index] = []
     ElMessage({
       type: 'warning',
       message: '文件上传失败'
@@ -479,15 +511,16 @@
     return false
   }
 };
-const handleRemove = async (file, uploadFiles) => {
-  let path = state.form.filePath;
+const handleRemove = async (file, uploadFiles, index) => {
+  let path = state.form.annualVerificationDevices[index].certificate
   await delPic({path: path}).then(res => {
     if(res.code == 200){
       // ElMessage({
       //   type: 'success',
       //   message: '文件已删除'
       // })
-      state.form.certificate = ''
+      state.form.annualVerificationDevices[index].certificate = ''
+      state.form.annualVerificationDevices[index].certificateName = ''
     }else{
       ElMessage({
         type: 'warning',
@@ -495,7 +528,8 @@
       })
     }
   }).catch(() => {
-    state.form.certificate = ''
+    state.form.annualVerificationDevices[index].certificate = ''
+    state.form.annualVerificationDevices[index].certificateName = ''
   });
 }
 
@@ -512,9 +546,7 @@
     establishmentTime: '',
     processId: null,
     processName: '',
-    processTime: '',
-    certificateName: '',
-    certificate: '',
+    processTime: ''
   }
   state.fileList = []
   superRef.value.clearValidate();
diff --git a/src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/index.vue b/src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/index.vue
index e8fdc69..ef9ae3b 100644
--- a/src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/index.vue
+++ b/src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/index.vue
@@ -20,40 +20,181 @@
             </el-option>
           </el-select>
         </el-form-item>
+        <el-form-item v-if="isAdmin" label="年份:">
+          <el-date-picker
+              v-model="data.queryParams.year"
+              type="year"
+              value-format="YYYY"
+              placeholder="请选择年份"
+          />
+        </el-form-item>
         <el-form-item >
           <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
           <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
+          <el-button type="primary" plain @click="openDialog('edit',data.dataList)" v-if="data.hasInfo">编辑</el-button>
+          <el-button type="primary" plain @click="downloadFile()" v-if="data.hasInfo">导出</el-button>
 <!--          <el-button type="primary">导出</el-button>-->
         </el-form-item>
       </el-form>
     </div>
-    <!-- 表格数据 -->
-    <el-table v-loading="loading" :data="dataList" :border="true">
-      <el-table-column type="index" label="序号"></el-table-column>
-      <el-table-column prop="name" align="center" label="计划名称"></el-table-column>
-      <el-table-column prop="certificateName" align="center" label="检定证书">
-        <template #default="scope">
-          {{scope.row.certificateName}}
-        </template>
-      </el-table-column>
-      <el-table-column label="操作" align="center">
-        <template #default="scope">
-          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
-          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
-          <el-button link type="primary" @click="openDialog('upload',scope.row)">上传证书</el-button>
-          <el-button link type="primary" @click="downloadFile(scope.row)">导出</el-button>
-          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
+    <div style="background: #fff;padding: 20px;border-radius: 0.6rem">
+      <el-form :model="data.dataList" label-position="left" size="default" label-width="120px" v-if="data.hasInfo">
+        <el-form-item v-if="isAdmin" label="企业:" prop="companyId">
+          <el-input
+              v-model.trim="data.dataList.companyName"
+              style="width: 100%;"
+              readonly
+          >
+          </el-input>
+        </el-form-item>
+        <el-form-item label="计划名称:" prop="name">
+          <el-input
+              v-model.trim="data.dataList.name"
+              style="width: 100%;"
+              readonly
+          >
+          </el-input>
+        </el-form-item>
+        <el-form-item label="年份:" prop="year">
+          <el-input
+              v-model.trim="data.dataList.year"
+              style="width: 100%;"
+              readonly
+          >
+          </el-input>
+        </el-form-item>
+        <el-form-item label="设备列表:" prop="annualVerificationDevices">
 
-    <pagination
-        v-show="total > 0"
-        :total="total"
-        v-model:page="queryParams.pageNum"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getList"
-    />
+        </el-form-item>
+        <el-table v-if="data.dataList.annualVerificationDevices && data.dataList.annualVerificationDevices.length>0" :data="data.dataList.annualVerificationDevices" style="margin-bottom: 20px" :border="true">
+          <el-table-column label="序号" type="index" width="80" align="center">
+          </el-table-column>
+          <el-table-column label="设备编号" prop="deviceNumber" align="center"/>
+          <el-table-column label="设备名称" prop="deviceName" align="center"/>
+          <el-table-column label="规格型号" prop="model" align="center"/>
+          <el-table-column label="校准周期" prop="calibrationCycle" align="center"/>
+          <el-table-column label="下次校准时间" prop="nextCalibrationTime" align="center">
+            <template #default="scope">
+              {{scope.row.nextCalibrationTime.substring(0,10)}}
+            </template>
+          </el-table-column>
+          <el-table-column label="实际检定时间" prop="actCalibrationTime" align="center">
+            <template #default="scope">
+              {{scope.row.actCalibrationTime.substring(0,10)}}
+            </template>
+          </el-table-column>
+          <el-table-column label="校准人" prop="calibrationUser" align="center"/>
+          <el-table-column label="目前状态" prop="status" align="center"/>
+          <el-table-column label="使用人" prop="useUser" align="center"/>
+          <el-table-column label="证书名称" prop="certificateName" align="center"/>
+          <el-table-column label="证书" prop="certificate" align="center">
+            <template #default="scope">
+              <div v-if="scope.row.certificate && scope.row.certificate!==''" style="cursor:pointer;">
+                <iframe
+                    v-if="scope.row.certificate.split('.').pop().toLowerCase() == 'pdf'"
+                    :src="data.baseUrl + '/' + scope.row.certificate"
+                    width="100px"
+                    height="100px"
+                    style="overflow: hidden"
+                ></iframe>
+                <el-image
+                    v-else
+                    style="width: 100px; height: 100px"
+                    :src="data.baseUrl + '/' + scope.row.certificate"
+                    :max-scale="7"
+                    :min-scale="0.2"
+                    :preview-src-list="[data.baseUrl + '/' + scope.row.certificate]"
+                    :initial-index="0"
+                    fit="cover"
+                    :preview-teleported=true
+                />
+              </div>
+              <el-link type="primary" :href="data.baseUrl + '/' + scope.row.certificate" target="_blank">预览</el-link>
+            </template>
+          </el-table-column>
+        </el-table>
+  <!--      <el-form-item label="检定证书:" prop="certificate">-->
+  <!--        <el-upload accept=".pdf,image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.fileLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" >-->
+  <!--          <el-button type="primary">点击上传</el-button>-->
+  <!--          <template #tip>-->
+  <!--            <div class="el-upload__tip">支持上传pdf、图片格式,尺寸小于5M,最多可上传1份</div>-->
+  <!--          </template>-->
+  <!--        </el-upload>-->
+  <!--      </el-form-item>-->
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="编制:" prop="establishmentName">
+              <el-input
+                  v-model.trim="data.dataList.establishmentName"
+                  style="width: 100%;"
+                  readonly
+              >
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="日期:" prop="establishmentTime" >
+              <el-input
+                  v-model.trim="data.dataList.establishmentTime"
+                  style="width: 100%;"
+                  readonly
+              >
+              </el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="审核:" prop="processName">
+              <el-input
+                  v-model.trim="data.dataList.processName"
+                  style="width: 100%;"
+                  readonly
+              >
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="日期:" prop="processTime" >
+              <el-input
+                  v-model.trim="data.dataList.processTime"
+                  style="width: 100%;"
+                  readonly
+              >
+              </el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div v-else>暂无计划</div>
+    </div>
+    <!-- 表格数据 -->
+<!--    <el-table v-loading="loading" :data="dataList" :border="true">-->
+<!--      <el-table-column type="index" label="序号"></el-table-column>-->
+<!--      <el-table-column prop="name" align="center" label="计划名称"></el-table-column>-->
+<!--      <el-table-column prop="certificateName" align="center" label="检定证书">-->
+<!--        <template #default="scope">-->
+<!--          {{scope.row.certificateName}}-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--      <el-table-column label="操作" align="center">-->
+<!--        <template #default="scope">-->
+<!--          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>-->
+<!--          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>-->
+<!--          <el-button link type="primary" @click="openDialog('upload',scope.row)">上传证书</el-button>-->
+<!--          <el-button link type="primary" @click="downloadFile(scope.row)">导出</el-button>-->
+<!--          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--    </el-table>-->
+
+<!--    <pagination-->
+<!--        v-show="total > 0"-->
+<!--        :total="total"-->
+<!--        v-model:page="queryParams.pageNum"-->
+<!--        v-model:limit="queryParams.pageSize"-->
+<!--        @pagination="getList"-->
+<!--    />-->
 
     <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
   </div>
@@ -87,17 +228,21 @@
   queryParams: {
     pageNum: 1,
     pageSize: 10,
-    companyId: null
+    companyId: null,
+    year: ''
   },
   total: 0,
-  dataList: [],
+  dataList: {},
   companyList: [],
-  isAdmin: false
+  isAdmin: false,
+  baseUrl: import.meta.env.VITE_APP_BASE_API,
+  hasInfo: false
 });
 
 const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data);
 const userInfo = ref()
 onMounted(async ()=>{
+  data.queryParams.year = new Date().getFullYear().toString()
   if(userStore.roles.includes('admin')){
     data.isAdmin = true
     await getCompanyList()
@@ -116,8 +261,27 @@
   loading.value = true
   const res = await getAnnualVerificationPlanList(data.queryParams)
   if(res.code == 200){
-    data.dataList = res.data.list || []
-    data.total = res.data.total
+    if(Array.isArray(res.data.list) && res.data.list.length>0){
+      data.hasInfo = true
+      const re = await getAnnualVerificationPlanDetail({id: res.data.list[0].id})
+      if(re.code == 200){
+        if(re.data){
+          data.dataList = re.data
+          data.dataList.companyName = data.companyList.find(i=>i.id == data.dataList.companyId)?.name
+          data.dataList.establishmentTime = data.dataList.establishmentTime.substring(0,10)
+          data.dataList.processTime = data.dataList.processTime.substring(0,10)
+        }
+      }else{
+        data.hasInfo = false
+        data.dataList = {}
+        data.dataList.companyName = ''
+        ElMessage.warning(res.message)
+      }
+    }else{
+      data.hasInfo = false
+      data.dataList = {}
+      data.dataList.companyName = ''
+    }
   }else{
     ElMessage.warning(res.message)
   }
@@ -137,12 +301,9 @@
   }
 }
 
-const downloadFile = async (val)=>{
-  const res = await getAnnualVerificationPlanDetail({id: val.id})
-  if(res.code == 200){
-    if(res.data){
-      let tableData = res.data
-      tableData.table = res.data.annualVerificationDevices.map((item,index)=>{
+const downloadFile = async ()=>{
+      let tableData = data.dataList
+      tableData.table = data.dataList.annualVerificationDevices.map((item,index)=>{
         return {
           ...item,
           index: index + 1,
@@ -160,12 +321,6 @@
           message: '导出失败'
         });
       }
-    }else{
-      ElMessage.warning('暂无数据')
-    }
-  }else{
-    ElMessage.warning(res.message)
-  }
 }
 
 const openDialog = (type, value) => {
@@ -177,7 +332,8 @@
   data.queryParams = {
     pageNum: 1,
     pageSize: 10,
-    companyId: null
+    companyId: null,
+    year: new Date().getFullYear().toString()
   }
   await getCompanyList()
   await getList()

--
Gitblit v1.9.2