多体系建设信息化条统-前端
祖安之光
2025-09-30 c8a5ed885ab1a8206020b76be316ece1eb1f68f2
修改新增
2 files modified
356 ■■■■ changed files
src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/components/editDialog.vue 112 ●●●●● patch | view | raw | blame | history
src/views/work/assetMng/toolsMonitorMeasure/annualVerificationPlan/index.vue 244 ●●●● patch | view | raw | blame | history
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();
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()