spring
2025-02-25 9dd11bd6a971e13aa74ad7a8994f9710edb42590
修改导出
已修改7个文件
已添加2个文件
928 ■■■■■ 文件已修改
src/api/cnas/process/reportResults.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/reportResults/index.vue 431 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/resourceDemand/standardMaterialAccept/index.vue 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/customerSatisfaction/index.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/structural/capabilityAndLaboratory/laboratory/index.vue 257 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/process/reportResults.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
// æŠ¥å‘Šç»“果相关接口
import request from "@/utils/request";
//8报告结果-导出
export function exportProcessReport(query) {
  return request({
    url: "/processReport/exportProcessReport",
    method: "get",
    params: query,
  });
}
// 8报告结果-新增
export function addProcessReport(data) {
  return request({
    url: "/processReport/addProcessReport",
    method: "post",
    data: data,
  });
}
// 8报告结果-修改
export function doProcessReport(data) {
  return request({
    url: "/processReport/doProcessReport",
    method: "post",
    data: data,
  });
}
src/views/CNAS/process/reportResults/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,431 @@
<template>
  <div class="report-results">
    <el-row class="title">
      <el-col :span="12" style="padding-left: 20px;text-align: left;">报告结果</el-col>
      <el-col :span="12" style="text-align: right;">
        <el-button size="medium" type="primary" @click="handleDown" :loading="outLoading" v-if="outPower">导出</el-button>
        <el-button size="medium" type="primary" @click="openAdd" v-if="addPower">新增</el-button>
      </el-col>
    </el-row>
    <div class="search">
      <div class="search_thing">
        <div class="search_label">检验报告编号:</div>
        <div class="search_input"><el-input size="small" placeholder="请输入" clearable v-model="queryParams.insReportCode"
            @keyup.enter.native="refreshTable()"></el-input></div>
      </div>
      <div class="search_thing" style="padding-left: 30px;">
        <el-button size="small" @click="refresh()">重 ç½®</el-button>
        <el-button size="small" type="primary" @click="refreshTable()">查 è¯¢</el-button>
      </div>
    </div>
    <div class="table">
      <lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading" :height="'calc(100vh - 290px)'"
        :page="page" @pagination="pagination"></lims-table>
      <!-- <ValueTable ref="ValueTable" :url="$api.processReport.pageProcessReport"
        :delUrl="$api.processReport.delProcessReport" :componentData="componentData" :key="upIndex" /> -->
    </div>
    <el-dialog :title="title" :visible.sync="addDialogVisible" width="400px" top="6vh">
      <el-row>
        <el-col :span="24" style="margin-bottom: 16px;">
          <div class="search_thing">
            <div class="search_label">检验报告编号:</div>
            <div class="search_input"><el-input size="small" placeholder="请输入" clearable
                v-model="addInfo.insReportCode"></el-input></div>
          </div>
        </el-col>
        <el-col :span="24" style="margin-bottom: 16px;">
          <div class="search_thing">
            <div class="search_label">页数:</div>
            <div class="search_input"><el-input size="small" placeholder="请输入" clearable
                v-model="addInfo.pages"></el-input></div>
          </div>
        </el-col>
        <el-col :span="24" style="margin-bottom: 16px;">
          <div class="search_thing">
            <div class="search_label">发送份数:</div>
            <div class="search_input"><el-input size="small" placeholder="请输入" clearable
                v-model="addInfo.number"></el-input></div>
          </div>
        </el-col>
        <el-col :span="24" style="margin-bottom: 16px;">
          <div class="search_thing">
            <div class="search_label">发往何处:</div>
            <div class="search_input"><el-input size="small" placeholder="请输入" clearable
                v-model="addInfo.send"></el-input></div>
          </div>
        </el-col>
        <el-col :span="24" style="margin-bottom: 16px;">
          <div class="search_thing">
            <div class="search_label">发送方式:</div>
            <div class="search_input"><el-input size="small" placeholder="请输入" clearable
                v-model="addInfo.method"></el-input></div>
          </div>
        </el-col>
        <el-col :span="24" style="margin-bottom: 16px;">
          <div class="search_thing">
            <div class="search_label">发送日期:</div>
            <div class="search_input">
              <el-date-picker v-model="addInfo.sendTime" type="date" size="small" placeholder="选择日期" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd" style="width: 100%;">
              </el-date-picker>
            </div>
          </div>
        </el-col>
        <el-col :span="24" style="margin-bottom: 16px;">
          <div class="search_thing">
            <div class="search_label">发送人:</div>
            <div class="search_input">
              <el-select v-model="addInfo.sendUser" placeholder="请选择" size="small" style="width: 100%;">
                <el-option v-for="item in personList" :key="item.value" :label="item.label" :value="item.value">
                </el-option>
              </el-select>
            </div>
          </div>
        </el-col>
        <el-col :span="24" style="margin-bottom: 16px;">
          <div class="search_thing">
            <div class="search_label">签收人:</div>
            <div class="search_input">
              <el-select v-model="addInfo.signatory" placeholder="请选择" size="small" style="width: 100%;" multiple>
                <el-option v-for="item in personList" :key="item.value" :label="item.label" :value="item.value">
                </el-option>
              </el-select>
            </div>
          </div>
        </el-col>
        <el-col :span="24" style="margin-bottom: 16px;">
          <div class="search_thing">
            <div class="search_label">备注:</div>
            <div class="search_input"><el-input size="small" placeholder="请输入" clearable v-model="addInfo.remark"
                type="textarea" :rows="2"></el-input></div>
          </div>
        </el-col>
      </el-row>
      <span slot="footer" class="dialog-footer">
        <el-button @click="addDialogVisible = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="handleAdd" :loading="addLoading">ç¡® å®š</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import limsTable from "@/components/Table/lims-table.vue";
import {
  exportProcessReport,
  doProcessReport,
  addProcessReport
} from '@/api/cnas/process/reportResults.js'
import {
  selectUserCondition,
} from "@/api/business/inspectionTask.js";
export default {
  components: {
    limsTable
  },
  data() {
    return {
      outLoading: false,
      addPower: true,
      outPower: true,
      componentData: {
        entity: {
          insReportCode: null,
          // sendUserName: null,
          orderBy: {
            field: 'createTime',
            order: 'desc'
          }
        },
        isIndex: true,
        showSelect: true,
        select: true,
        selectMethod: 'handleChangeTask',
        do: [
          {
            id: 'handleWork',
            font: '修改',
            type: 'text',
            method: 'handleWork'
          },
          {
            id: 'delete',
            font: '删除',
            type: 'text',
            method: 'doDiy'
          }
        ],
        tagField: {},
        selectField: {
          sendUser: {
            select: []
          },
          signatory: {
            select: []
          },
        },
        // addUpload:['signatoryUrl'],
        requiredAdd: [],
        requiredUp: [],
        needSort: [],
        inputType: ''
      },
      entityCopy: {},
      upIndex: 0,
      personList: [],
      title: '新增',
      addDialogVisible: false,
      addInfo: {
        signatory: []
      },
      addLoading: false,
      mutilSelect: [],
      queryParams: {},
      tableData: [],
      column: [
        { label: "编号", prop: "number" },
        { label: "辅助项目名称", prop: "auxiliaryProject", width: "120px" },
        {
          label: "实验室",
          prop: "laboratory",
          dataType: "tag",
          formatData: (params) => {
            return this.laboratoryList.find((m) => m.value == params).label;
          },
        },
        { label: "单位", prop: "unit" },
        { label: "核准工时", prop: "approvedWorkingHour" },
        { label: "部门", prop: "department" },
        { label: "备注", prop: "remarks" },
        {
          dataType: "action",
          fixed: "right",
          label: "操作",
          operation: [
            {
              name: "编辑",
              type: "text",
              clickFun: (row) => {
                this.openAdd("编辑", row);
              },
              showHide: (row) => {
                return this.checkPermi([
                  "performance:manHour:workTimeConfig:edit",
                ]);
              },
            },
            {
              name: "删除",
              type: "text",
              clickFun: (row) => {
                this.handleDelete(row);
              },
              showHide: (row) => {
                return this.checkPermi([
                  "performance:manHour:workTimeConfig:del",
                ]);
              },
            },
          ],
        },
      ],
      page: {
        total: 0,
        size: 10,
        current: 0,
      },
      tableLoading: false,
    }
  },
  mounted() {
    // this.entityCopy = this.HaveJson(this.componentData.entity);
    // this.getPower()
    this.getAuthorizedPerson()
  },
  methods: {
    getPower() {
      let power = JSON.parse(sessionStorage.getItem('power'))
      let up = false
      let del = false
      let add = false
      let out = false
      for (var i = 0; i < power.length; i++) {
        if (power[i].menuMethod == 'doProcessReport') {
          up = true
        }
        if (power[i].menuMethod == 'addProcessReport') {
          add = true
        }
        if (power[i].menuMethod == 'delProcessReport') {
          del = true
        }
        if (power[i].menuMethod == 'exportProcessReport') {
          out = true
        }
      }
      if (!up) {
        this.componentData.do.splice(1, 1)
      }
      if (!del) {
        this.componentData.do.splice(0, 1)
      }
      this.outPower = out
      this.addPower = add
    },
    handleDown() {
      if (this.mutilSelect.length == 0) {
        this.$message.warning('请选择要导出的数据')
        return
      }
      // html导出为word,样子太丑了,代码先放着吧
      // exportHtmlToWord(this.$refs.content,'检验报告发放登记表')
      this.outLoading = true
      exportProcessReport({ ids: this.mutilSelect.map(m => m.id) }).then(res => {
        this.outLoading = false
        if (res.code === 201) return
        this.$message.success('导出成功')
        const url = this.javaApi + '/word/' + res.message;
        this.$download.saveAs(url, "报告结果");
      })
    },
    openAdd() {
      this.title = '新增'
      this.addInfo = {
        signatory: []
      }
      this.addDialogVisible = true;
    },
    refreshTable() {
      this.$refs['ValueTable'].selectList()
    },
    refresh() {
      this.componentData.entity = this.HaveJson(this.entityCopy)
      this.upIndex++
      this.refreshTable()
    },
    getAuthorizedPerson() {
      selectUserCondition().then(res => {
        let data = []
        res.data.forEach(a => {
          data.push({
            label: a.name,
            value: a.id
          })
        })
        this.personList = data
      })
    },
    handleAdd() {
      this.addLoading = true
      delete this.addInfo.createTime
      delete this.addInfo.createUser
      delete this.addInfo.updateTime
      delete this.addInfo.signatoryUrl
      delete this.addInfo.updateUserer
      delete this.addInfo.sendUserName
      let addInfo = this.HaveJson(this.addInfo)
      addInfo.signatory = addInfo.signatory.join(',')
      if (this.title == '新增') {
        addProcessReport(addInfo).then(res => {
          this.addLoading = false
          if (res.code == 201) {
            return
          }
          this.addDialogVisible = false
          this.$message({
            type: 'success',
            message: '操作成功!'
          });
          this.refreshTable()
        }).catch(err => { })
      } else {
        doProcessReport(addInfo).then(res => {
          this.addLoading = false
          if (res.code == 201) {
            return
          }
          this.addDialogVisible = false
          this.$message({
            type: 'success',
            message: '操作成功!'
          });
          this.refreshTable()
        }).catch(err => { })
      }
    },
    handleWork(row) {
      this.title = '修改'
      this.addInfo = row
      console.log(this.addInfo)
      this.addInfo.signatory = this.addInfo.signatory ? this.addInfo.signatory.split(',').map(m => Number(m)) : []
      this.addDialogVisible = true;
    },
    handleChangeTask(list) {
      this.mutilSelect = list
    }
  }
}
</script>
<style scoped>
.title {
  height: 60px;
  line-height: 60px;
}
.search {
  background-color: #fff;
  height: 80px;
  display: flex;
  align-items: center;
}
.search_thing {
  width: 350px;
  display: flex;
  align-items: center;
}
.search_label {
  width: 110px;
  font-size: 14px;
  text-align: right;
}
.search_input {
  width: calc(100% - 110px);
}
.table {
  margin-top: 10px;
  background-color: #fff;
  width: calc(100% - 40px);
  height: calc(100% - 60px - 80px - 10px - 40px);
  padding: 20px;
}
.tables {
  table-layout: fixed;
  width: 100%;
  margin-top: 10px;
}
.tables td {
  height: 40px;
  width: 100px;
  text-align: center;
  font-size: 14px;
  word-wrap: break-word;
  white-space: normal;
}
.en {
  font-size: 12px;
  word-break: break-word;
  /* è‡ªåŠ¨æ–­è¡Œ */
  overflow-wrap: break-word;
  /* é˜²æ­¢æº¢å‡º */
  white-space: normal;
  /* é»˜è®¤æ¢è¡Œ */
}
</style>
src/views/CNAS/resourceDemand/standardMaterialAccept/index.vue
@@ -19,34 +19,34 @@
    </div>
    <div class="table">
      <lims-table :tableData="tableData" :column="columns" :height="'calc(100vh - 250px)'" @pagination="pagination"
                  :page="page" :tableLoading="tableLoading"></lims-table>
        :page="page" :tableLoading="tableLoading"></lims-table>
    </div>
    <AddRecord ref="addRecordRef" @submit="submit"></AddRecord>
  </div>
<!--    <div class="tables">-->
<!--      <ZTTable-->
<!--        :column="columns"-->
<!--        :table-data="tableData"-->
<!--      >-->
<!--        <template slot="action" slot-scope="{ row }">-->
<!--          <el-button type="text" @click="edit(row)">编辑</el-button>-->
<!--        </template>-->
<!--      </ZTTable>-->
<!--      <div class="pagination">-->
<!--        <div></div>-->
<!--        <el-pagination-->
<!--          :page-size="pagination.pageSize"-->
<!--          :page-sizes="[10, 20, 30, 40]"-->
<!--          :total="pagination.total"-->
<!--          layout="total, sizes, prev, pager, next, jumper"-->
<!--          @current-change="handleCurrent"-->
<!--          @size-change="handleSize"-->
<!--        >-->
<!--        </el-pagination>-->
<!--      </div>-->
<!--    </div>-->
<!--    <AddRecord ref="addRecordRef" @submit="submit"></AddRecord>-->
  <!--    <div class="tables">-->
  <!--      <ZTTable-->
  <!--        :column="columns"-->
  <!--        :table-data="tableData"-->
  <!--      >-->
  <!--        <template slot="action" slot-scope="{ row }">-->
  <!--          <el-button type="text" @click="edit(row)">编辑</el-button>-->
  <!--        </template>-->
  <!--      </ZTTable>-->
  <!--      <div class="pagination">-->
  <!--        <div></div>-->
  <!--        <el-pagination-->
  <!--          :page-size="pagination.pageSize"-->
  <!--          :page-sizes="[10, 20, 30, 40]"-->
  <!--          :total="pagination.total"-->
  <!--          layout="total, sizes, prev, pager, next, jumper"-->
  <!--          @current-change="handleCurrent"-->
  <!--          @size-change="handleSize"-->
  <!--        >-->
  <!--        </el-pagination>-->
  <!--      </div>-->
  <!--    </div>-->
  <!--    <AddRecord ref="addRecordRef" @submit="submit"></AddRecord>-->
</template>
<script>
@@ -138,8 +138,8 @@
  },
  methods: {
    async getTableData() {
      const res = await  getPageAcceptance(this.form);
      if(res.code === 200){
      const res = await getPageAcceptance(this.form);
      if (res.code === 200) {
        this.tableData = res.data.records;
        this.page.total = res.data.total;
      }
@@ -150,9 +150,9 @@
    },
    async submit(form) {
      const {code} = await form.acceptance.id ? updateAcceptanc(this.form):addAcceptance((this.form));
      if(code == 200) {
        this.$message.success(`${form.acceptance.id ? '编辑':'添加'}成功`)
      const { code } = await form.acceptance.id ? updateAcceptanc(this.form) : addAcceptance((this.form));
      if (code == 200) {
        this.$message.success(`${form.acceptance.id ? '编辑' : '添加'}成功`)
        this.getTableData()
      }
    },
@@ -169,7 +169,7 @@
        url: getAcceptanceDetails,
        params: { id }
      })
      if(code == 200) {
      if (code == 200) {
        return data;
      }
    },
@@ -183,33 +183,8 @@
        url: `${exportAcceptance}`,
        responseType: "blob"
      })
      const blob = new Blob([res], {type: 'application/octet-stream'});
      //将Blob å¯¹è±¡è½¬æ¢æˆå­—符串
      let reader = new FileReader();
      reader.readAsText(blob, 'utf-8');
      reader.onload = () => {
        try {
          let result = JSON.parse(reader.result);
          if (result.message) {
            this.$message.error(result.message);
          } else {
            const url = URL.createObjectURL(blob);
            const link = document.createElement('a');
            link.href = url;
            link.download = '标准物质验收.xlsx';
            link.click();
            this.$message.success('导出成功')
          }
        } catch (err) {
          console.log(err);
          const url = URL.createObjectURL(blob);
          const link = document.createElement('a');
          link.href = url;
          link.download = '标准物质验收.xlsx';
          link.click();
          this.$message.success('导出成功')
        }
      }
      const blob = new Blob([res], { type: 'application/octet-stream' });
      this.$download.saveAs(blob, '标准物质验收.xlsx');
    },
    // åˆ†é¡µåˆ‡æ¢
src/views/CNAS/systemManagement/customerSatisfaction/index.vue
@@ -310,13 +310,10 @@
      let url = '';
      if (row.type == 1) {
        url = this.javaApi + '/img/' + row.fileUrl
        file.downloadIamge(url, row.fileName)
        this.$download.saveAs(url, row.fileName);
      } else {
        url = this.javaApi + '/word/' + row.fileUrl
        const link = document.createElement('a');
        link.href = url;
        link.download = row.fileName;
        link.click();
        this.$download.saveAs(url, row.fileName);
      }
    },
    // åˆ é™¤å®¢æˆ·åˆ†æžé™„ä»¶
src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue
@@ -394,33 +394,7 @@
      exportManageDocumentIssueRecycle(this.queryParams).then(res => {
        this.outLoading = false
        const blob = new Blob([res], { type: 'application/octet-stream' });
        // this.$download.saveAs(blob, '发放回收记录.xlsx')
        //将Blob å¯¹è±¡è½¬æ¢æˆå­—符串
        let reader = new FileReader();
        reader.readAsText(blob, 'utf-8');
        reader.onload = () => {
          try {
            let result = JSON.parse(reader.result);
            if (result.message) {
              this.$message.error(result.message);
            } else {
              const url = URL.createObjectURL(blob);
              const link = document.createElement('a');
              link.href = url;
              link.download = '发放回收记录.xlsx';
              link.click();
              this.$message.success('导出成功')
            }
          } catch (err) {
            console.log(err);
            const url = URL.createObjectURL(blob);
            const link = document.createElement('a');
            link.href = url;
            link.download = '发放回收记录.xlsx';
            link.click();
            this.$message.success('导出成功')
          }
        }
        this.$download.saveAs(blob, '发放回收记录.xlsx');
      })
    },
    changeFileList(e) {
src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue
@@ -276,33 +276,7 @@
          return
        }
        const blob = new Blob([res], { type: 'application/octet-stream' });
        //将Blob å¯¹è±¡è½¬æ¢æˆå­—符串
        let reader = new FileReader();
        reader.readAsText(blob, 'utf-8');
        reader.onload = () => {
          try {
            let result = JSON.parse(reader.result);
            if (result.message) {
              this.$message.error(result.message);
            } else {
              const url = URL.createObjectURL(blob);
              const link = document.createElement('a');
              link.href = url;
              link.download = '评审计划.docx';
              link.click();
              this.$download.saveAs(blob, name)
              this.$message.success('导出成功')
            }
          } catch (err) {
            console.log(err);
            const url = URL.createObjectURL(blob);
            const link = document.createElement('a');
            link.href = url;
            link.download = '评审计划.docx';
            link.click();
            this.$message.success('导出成功')
          }
        }
        this.$download.saveAs(blob, '评审计划.docx');
      })
    },
    lookFile(url, name) {
@@ -313,10 +287,7 @@
    handleDown0(url, name) {
      if (!url) return this.$message.warning('文件未上传')
      let url0 = this.javaApi + '/word/' + url
      const link = document.createElement('a');
      link.href = url0;
      link.target = '_blank';
      link.click();
      this.$download.saveAs(url0, name);
    }
  }
};
src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue
@@ -172,32 +172,7 @@
          return
        }
        const blob = new Blob([res], { type: 'application/octet-stream' });
        //将Blob å¯¹è±¡è½¬æ¢æˆå­—符串
        let reader = new FileReader();
        reader.readAsText(blob, 'utf-8');
        reader.onload = () => {
          try {
            let result = JSON.parse(reader.result);
            if (result.message) {
              this.$message.error(result.message);
            } else {
              const url = URL.createObjectURL(blob);
              const link = document.createElement('a');
              link.href = url;
              link.download = '会议记录.docx';
              link.click();
              this.$message.success('导出成功')
            }
          } catch (err) {
            console.log(err);
            const url = URL.createObjectURL(blob);
            const link = document.createElement('a');
            link.href = url;
            link.download = '会议记录.docx';
            link.click();
            this.$message.success('导出成功')
          }
        }
        this.$download.saveAs(blob, '会议记录.docx');
      })
    },
  }
src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue
@@ -231,32 +231,7 @@
          return
        }
        const blob = new Blob([res], { type: 'application/octet-stream' });
        //将Blob å¯¹è±¡è½¬æ¢æˆå­—符串
        let reader = new FileReader();
        reader.readAsText(blob, 'utf-8');
        reader.onload = () => {
          try {
            let result = JSON.parse(reader.result);
            if (result.message) {
              this.$message.error(result.message);
            } else {
              const url = URL.createObjectURL(blob);
              const link = document.createElement('a');
              link.href = url;
              link.download = '评审报告.docx';
              link.click();
              this.$message.success('导出成功')
            }
          } catch (err) {
            console.log(err);
            const url = URL.createObjectURL(blob);
            const link = document.createElement('a');
            link.href = url;
            link.download = '评审报告.docx';
            link.click();
            this.$message.success('导出成功')
          }
        }
        this.$download.saveAs(blob, '评审报告.docx');
      })
    },
    submit(type, row) {
src/views/structural/capabilityAndLaboratory/laboratory/index.vue
@@ -3,103 +3,50 @@
    <div>
      <el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
        <el-form-item label="资质名称" prop="name">
          <el-select
            v-model="queryParams.name"
            placeholder="选择资质名称"
            size="small"
            @change="refreshTable()"
          >
            <el-option
              v-for="dict in dict.type.cnas_method_qualification"
              :key="dict.value"
              :label="dict.label"
              :value="dict.value"
            >
          <el-select v-model="queryParams.name" placeholder="选择资质名称" size="small" @change="refreshTable()">
            <el-option v-for="dict in dict.type.cnas_method_qualification" :key="dict.value" :label="dict.label"
              :value="dict.value">
              {{ dict.label }}
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button
            type="primary"
            icon="el-icon-search"
            size="mini"
            @click="refreshTable"
            >查 è¯¢</el-button
          >
          <el-button icon="el-icon-refresh" size="mini" @click="refresh"
            >重 ç½®</el-button
          >
          <el-button type="primary" icon="el-icon-search" size="mini" @click="refreshTable">查 è¯¢</el-button>
          <el-button icon="el-icon-refresh" size="mini" @click="refresh">重 ç½®</el-button>
        </el-form-item>
      </el-form>
    </div>
    <div>
      <el-row class="title">
        <el-col :span="12" style="text-align: left">
          <el-radio-group
            v-model="radio"
            @input="selectorSwitch"
            size="medium"
            fill="#409EFF"
          >
          <el-radio-group v-model="radio" @input="selectorSwitch" size="medium" fill="#409EFF">
            <el-radio-button :label="0">资质明细</el-radio-button>
            <el-radio-button :label="1">资质总览</el-radio-button>
          </el-radio-group>
        </el-col>
        <el-col :span="12" style="text-align: right" v-if="radio === 0">
          <el-button size="small" type="primary" @click="openAdd"
            >资质更新</el-button
          >
          <el-button size="small" icon="el-icon-delete" @click="handleDel"
            >删除</el-button
          >
          <el-button size="small" type="primary" @click="openAdd">资质更新</el-button>
          <el-button size="small" icon="el-icon-delete" @click="handleDel">删除</el-button>
        </el-col>
      </el-row>
    </div>
    <div v-if="radio === 0">
      <lims-table
        :tableData="tableData"
        :column="column"
        :isSelection="true"
        :handleSelectionChange="handleSelectionChange"
        @pagination="pagination"
        :height="'calc(100vh - 300px)'"
        :page="page"
        :tableLoading="tableLoading"
      ></lims-table>
      <lims-table :tableData="tableData" :column="column" :isSelection="true"
        :handleSelectionChange="handleSelectionChange" @pagination="pagination" :height="'calc(100vh - 300px)'"
        :page="page" :tableLoading="tableLoading"></lims-table>
    </div>
    <div
      class="table"
      v-if="radio === 1"
      v-loading="pageLoading"
      @scroll="scrollFn"
    >
    <div class="table" v-if="radio === 1" v-loading="pageLoading" @scroll="scrollFn">
      <el-row :gutter="16">
        <el-col
          :span="8"
          v-for="(m, i) in list"
          :key="i"
          :xs="24"
          :sm="12"
          :md="8"
          :lg="8"
          :xl="6"
          style="margin-bottom: 16px"
        >
        <el-col :span="8" v-for="(m, i) in list" :key="i" :xs="24" :sm="12" :md="8" :lg="8" :xl="6"
          style="margin-bottom: 16px">
          <div class="table-item">
            <el-image
              style="
            <el-image style="
                width: 102px;
                height: 102px;
                margin-right: 20px;
                border-radius: 16px;
              "
              :src="javaApi + '/img/' + m.imageUrl"
            >
              <div
                slot="error"
                class="image-error"
                style="
              " :src="javaApi + '/img/' + m.imageUrl">
              <div slot="error" class="image-error" style="
                  width: 100px;
                  height: 100px;
                  border-radius: 16px;
@@ -107,18 +54,11 @@
                  align-items: center;
                  justify-content: center;
                  border: 1px solid #eeeeee;
                "
              >
                <i
                  class="el-icon-picture-outline"
                  style="font-size: 30px; color: #666666"
                ></i>
                ">
                <i class="el-icon-picture-outline" style="font-size: 30px; color: #666666"></i>
              </div>
            </el-image>
            <div
              class="table-item-right"
              style="flex: 1; font-size: 12px; color: #666666"
            >
            <div class="table-item-right" style="flex: 1; font-size: 12px; color: #666666">
              <p style="line-height: 26px">
                èµ„质名称:<span style="color: #3a7bfa">{{ m.name }}</span>
              </p>
@@ -126,168 +66,76 @@
              <p style="line-height: 26px">到期时间:{{ m.expireTime }}</p>
              <p>
                <span>状态:</span>
                <el-tag
                  :type="m.state === 0 ? 'danger' : 'success'"
                  size="small"
                  >{{ m.state === 0 ? "失效" : "有效" }}</el-tag
                >
                <el-tag :type="m.state === 0 ? 'danger' : 'success'" size="small">{{ m.state === 0 ? "失效" : "有效"
                  }}</el-tag>
              </p>
            </div>
          </div>
        </el-col>
      </el-row>
      <div
        v-if="list.length < 1 && !pageLoading && !isLoding"
        style="
      <div v-if="list.length < 1 && !pageLoading && !isLoding" style="
          color: #909399;
          font-size: 14px;
          text-align: center;
          margin-top: 200px;
        "
      >
        ">
        æš‚无数据
      </div>
      <div v-if="list.length > 0">
        <el-button
          v-if="isLoding"
          type="text"
          style="display: flex; margin: 0 auto; color: #909399"
        >
        <el-button v-if="isLoding" type="text" style="display: flex; margin: 0 auto; color: #909399">
          <i class="el-icon-loading" style="font-size: 20px"></i>
        </el-button>
        <el-button
          type="text"
          v-if="finishLoding"
          style="display: flex; margin: 0 auto; color: #909399"
          >已经没有更多啦~</el-button
        >
        <el-button type="text" v-if="finishLoding"
          style="display: flex; margin: 0 auto; color: #909399">已经没有更多啦~</el-button>
      </div>
    </div>
    <el-dialog
      title="资质更新"
      :visible.sync="qualificationsConnectVisible"
      width="400px"
    >
      <el-form
        ref="formDataRef"
        :model="formData"
        label-position="right"
        :rules="formDataRules"
        label-width="78px"
      >
    <el-dialog title="资质更新" :visible.sync="qualificationsConnectVisible" width="400px">
      <el-form ref="formDataRef" :model="formData" label-position="right" :rules="formDataRules" label-width="78px">
        <el-form-item label="资质名称" prop="name">
          <el-select
            v-model="formData.name"
            placeholder="请选择"
            style="width: 100%"
            size="small"
            clearable
          >
            <el-option
              v-for="dict in dict.type.cnas_method_qualification"
              :key="dict.value"
              :label="dict.label"
              :value="dict.value"
            >
          <el-select v-model="formData.name" placeholder="请选择" style="width: 100%" size="small" clearable>
            <el-option v-for="dict in dict.type.cnas_method_qualification" :key="dict.value" :label="dict.label"
              :value="dict.value">
              {{ dict.label }}
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="资质编码" prop="code">
          <el-input
            size="small"
            placeholder="请输入"
            clearable
            v-model="formData.code"
          ></el-input>
          <el-input size="small" placeholder="请输入" clearable v-model="formData.code"></el-input>
        </el-form-item>
        <el-form-item label="颁发机构" prop="organization">
          <el-input
            size="small"
            placeholder="请输入"
            clearable
            v-model="formData.organization"
          ></el-input>
          <el-input size="small" placeholder="请输入" clearable v-model="formData.organization"></el-input>
        </el-form-item>
        <el-form-item label="资质说明" prop="explanation">
          <el-input
            size="small"
            placeholder="请输入"
            clearable
            v-model="formData.explanation"
          ></el-input>
          <el-input size="small" placeholder="请输入" clearable v-model="formData.explanation"></el-input>
        </el-form-item>
        <el-form-item label="颁发时间" prop="dateOfIssuance">
          <el-date-picker
            style="width: 100%"
            v-model="formData.dateOfIssuance"
            type="datetime"
            size="small"
            format="yyyy-MM-dd HH:mm:ss"
            value-format="yyyy-MM-dd HH:mm:ss"
            clearable
            placeholder="选择日期"
          >
          <el-date-picker style="width: 100%" v-model="formData.dateOfIssuance" type="datetime" size="small"
            format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" clearable placeholder="选择日期">
          </el-date-picker>
        </el-form-item>
        <el-form-item label="到期时间" prop="expireTime">
          <el-date-picker
            style="width: 100%"
            v-model="formData.expireTime"
            type="datetime"
            size="small"
            format="yyyy-MM-dd HH:mm:ss"
            value-format="yyyy-MM-dd HH:mm:ss"
            clearable
            placeholder="选择日期"
          >
          <el-date-picker style="width: 100%" v-model="formData.expireTime" type="datetime" size="small"
            format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" clearable placeholder="选择日期">
          </el-date-picker>
        </el-form-item>
        <el-form-item label="资质图片">
          <el-upload
            ref="upload"
            :action="uploadAction"
            :on-success="(m) => handleSuccessUpImg(m, 'imageUrl')"
            accept="image/jpg,image/jpeg,image/png"
            :multiple="false"
            :limit="1"
            :headers="headers"
            :on-change="beforeUpload"
            :on-error="onError"
          >
            <el-button slot="trigger" size="small" type="primary"
              >选取图片</el-button
            >
          <el-upload ref="upload" :action="uploadAction" :on-success="(m) => handleSuccessUpImg(m, 'imageUrl')"
            accept="image/jpg,image/jpeg,image/png" :multiple="false" :limit="1" :headers="headers"
            :on-change="beforeUpload" :on-error="onError">
            <el-button slot="trigger" size="small" type="primary">选取图片</el-button>
          </el-upload>
        </el-form-item>
        <el-form-item label="资质附件">
          <el-upload
            ref="upload1"
            :action="uploadAction"
            :on-success="(m) => handleSuccessUpImg(m, 'fileUrl')"
            accept="image/jpg,image/jpeg,image/png,application/pdf,.doc,.docx"
            :headers="headers"
            :multiple="false"
            :limit="1"
            :on-change="beforeUpload1"
            :on-error="onError1"
          >
            <el-button slot="trigger" size="small" type="primary"
              >选取文件</el-button
            >
          <el-upload ref="upload1" :action="uploadAction" :on-success="(m) => handleSuccessUpImg(m, 'fileUrl')"
            accept="image/jpg,image/jpeg,image/png,application/pdf,.doc,.docx" :headers="headers" :multiple="false"
            :limit="1" :on-change="beforeUpload1" :on-error="onError1">
            <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
          </el-upload>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="qualificationsConnectVisible = false"
          >取 æ¶ˆ</el-button
        >
        <el-button
          type="primary"
          @click="confirmQualifications"
          :loading="loading"
          >ç¡® å®š</el-button
        >
        <el-button @click="qualificationsConnectVisible = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="confirmQualifications" :loading="loading">ç¡® å®š</el-button>
      </span>
    </el-dialog>
  </div>
@@ -480,12 +328,6 @@
    },
    // èµ„质明细附件下载
    handleDownLoad(row) {
      // let url = row.fileUrl;
      // const link = document.createElement('a');
      // link.href = this.javaApi + '/img/'+ url;
      // document.body.appendChild(link);
      // link.target = '_blank';
      // link.click();
      const url = process.env.VUE_APP_BASE_API + "/img/" + row.fileUrl;
      this.$download.saveAs(url, row.fileUrl);
    },
@@ -595,6 +437,7 @@
  line-height: 40px;
  margin-bottom: 10px;
}
.table-item {
  border-radius: 8px 8px 8px 8px;
  box-shadow: 4px 4px 8px 0px rgba(51, 51, 51, 0.04);