质量监督计划:新增计划下发(列表下发状态列与下发按钮,仅已批准未下发的可下发),导出弹窗改卡片式并拦截导出错误响应避免下载损坏文件,日常监督检查记录单按纸质表重做(受监督人多选、监督员下拉、监督内容多选、监督记录、存在问题、整改意见),各表单人员列表改为全实验室不按部门筛选;方法验证:表单新增数据处理、质量控制方法、方法结果验证、验证结论及评审、审批意见字段并新增详情入口,迁移原标准方法变更的设备、检测记录、校准文件、工作证等查看组件,标准方法变更模块下线;设备档案、设备管理编辑弹窗改版为图片与基本信息左右布局、表单行式排列
已修改11个文件
已重命名4个文件
已删除3个文件
2470 ■■■■■ 文件已修改
src/api/cnas/process/ensureResults/qualitySupervise.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/process/method/methodVerification.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/process/method/standardMethodsChange.js 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/ensureResults/qualityControlPlan/components/detailFormDialog.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/ensureResults/qualityControlPlan/components/processingSheet.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/ensureResults/qualityControlPlan/components/rectifyDialogNew.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/methodVerification/component/ViewDeviceDialog.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/methodVerification/component/ViewTestRecord.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/methodVerification/component/calibrationsFileDia.vue 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/methodVerification/component/formDIa.vue 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/methodVerification/component/viewWorkPermitDia.vue 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/methodVerification/index.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/standardMethodsChange/component/formDIaChange.vue 456 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/standardMethodsChange/index.vue 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/resourceDemand/device/component/files.vue 411 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/resourceDemand/device/component/management.vue 679 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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({
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
  })
}
src/api/cnas/process/method/standardMethodsChange.js
ÎļþÒÑɾ³ý
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 || [];
      })
    },
  }
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,
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="检测工作监督记录表"
               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>受监督人:</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('请填写监督记录')
          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,
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,
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('下发后监督员与相关检测人员将收到通知, æ˜¯å¦ç»§ç»­?', '提示', {
        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;
src/views/CNAS/process/method/methodVerification/component/ViewDeviceDialog.vue
ÎļþÃû´Ó src/views/CNAS/process/method/standardMethodsChange/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',
src/views/CNAS/process/method/methodVerification/component/ViewTestRecord.vue
ÎļþÃû´Ó src/views/CNAS/process/method/standardMethodsChange/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',
src/views/CNAS/process/method/methodVerification/component/calibrationsFileDia.vue
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å¹´MM月DD日" 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>技术负责人:</span>
                <el-input v-model="form.approvalPerson" placeholder="请输入" size="small" style="width: 160px"></el-input>
                <el-date-picker v-model="form.approvalDate" format="YYYYå¹´MM月DD日" 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>
src/views/CNAS/process/method/methodVerification/component/viewWorkPermitDia.vue
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) => {
src/views/CNAS/process/method/standardMethodsChange/component/formDIaChange.vue
ÎļþÒÑɾ³ý
src/views/CNAS/process/method/standardMethodsChange/index.vue
ÎļþÒÑɾ³ý
src/views/CNAS/resourceDemand/device/component/files.vue
@@ -180,176 +180,199 @@
    <!-- ä¿®è®¢ -->
    <el-dialog title="档案修订" 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 å­—符串,逐层解析还原成数组
    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;
}
src/views/CNAS/resourceDemand/device/component/management.vue
@@ -37,173 +37,201 @@
        </div>
        <el-dialog :title="isUp ? '设备详情' : '档案修订'" 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 å­—符串,逐层解析还原成数组
        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 = ç‚¹å‡»å¯¹åº”行值
            //复制给formData
            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 = ç‚¹å‡»å¯¹åº”行值一行值
            //复制给formData
            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>