chenrui
2025-02-25 b4f13431dafc42c189af2380218909b9931bacc6
Merge remote-tracking branch 'origin/dev' into dev
已修改18个文件
已添加5个文件
2109 ■■■■ 文件已修改
src/api/business/materialInspection.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/business/productOrder.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/business/productSamplingInfo.js 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/business/rawMaterialOrder.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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/business/inspectionReview/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/inspectionTask/components/InspectionWord.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/materialOrder/index.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/materialOrderComponents/materialOrder/downFileDialog.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/materialOrderComponents/materialOrder/filesLookVisible.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/productOrder/index.vue 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/productSamplingInfo/components/addQuarterItem.vue 290 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/productSamplingInfo/index.vue 647 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/rawMaterialInspection/index.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/reportPreparation/index.vue 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/structural/capabilityAndLaboratory/laboratory/index.vue 257 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/business/materialInspection.js
@@ -93,6 +93,7 @@
  return request({
    url: '/rawMaterialOrder/rawAllExport',
    method: 'post',
    data: query
    data: query,
    responseType: "blob"
  })
}
src/api/business/productOrder.js
@@ -22,7 +22,8 @@
  return request({
    url: '/insOrder/rawAllInsOrderExport',
    method: 'post',
    data: query
    data: query,
    responseType: "blob"
  })
}
// å°†å¾…检验的的撤销进行更改
src/api/business/productSamplingInfo.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
// æŠ½æ ·ä¿¡æ¯è¯¦æƒ…页面相关接口
import request from '@/utils/request'
// æŠ½æ ·ä¿¡æ¯-季度查询
export function getQuarterPage(query) {
  return request({
    url: '/finishProductSpotCheck/getQuarterPage',
    method: 'get',
    params: query
  })
}
// æŠ½æ ·ä¿¡æ¯-年度查询
export function getSpotCheckYearPage(query) {
  return request({
    url: '/finishProductSpotCheck/getSpotCheckYearPage',
    method: 'get',
    params: query
  })
}
// åˆ é™¤å­£åº¦æŠ½æ£€
export function deleteQuarter(query) {
  return request({
    url: '/finishProductSpotCheck/deleteQuarter',
    method: 'delete',
    params: query
  })
}
// ç”Ÿæˆå­£åº¦æŠ¥å‘Š
export function finalReportQuarter(query) {
  return request({
    url: '/finishProductSpotCheck/finalReportQuarter',
    method: 'get',
    params: query,
    responseType: "blob"
  })
}
// ç”Ÿæˆå¹´åº¦æŠ¥å‘Š
export function finalReportSpotCheckYear(query) {
  return request({
    url: '/finishProductSpotCheck/finalReportSpotCheckYear',
    method: 'get',
    params: query,
    responseType: "blob"
  })
}
// åˆ é™¤å¹´åº¦æŠ½æ£€
export function deleteSpotCheckYear(query) {
  return request({
    url: '/finishProductSpotCheck/deleteSpotCheckYear',
    method: 'delete',
    params: query,
  })
}
// å¹´åº¦æŠ½æ£€æŸ¥çœ‹è¯¦æƒ…
export function getSpotCheckYear(query) {
  return request({
    url: '/finishProductSpotCheck/getSpotCheckYear',
    method: 'get',
    params: query,
  })
}
// æäº¤å¹´åº¦æŠ½æ ·
export function addSpotCheckYear(query) {
  return request({
    url: '/finishProductSpotCheck/addSpotCheckYear',
    method: 'post',
    data: query,
  })
}
// ç¼–辑年度抽样
export function updateSpotCheckYear(query) {
  return request({
    url: '/finishProductSpotCheck/updateSpotCheckYear',
    method: 'post',
    data: query,
  })
}
// å­£åº¦æŠ½æ£€æŸ¥çœ‹è¯¦æƒ…
export function getQuarter(query) {
  return request({
    url: '/finishProductSpotCheck/getQuarter',
    method: 'get',
    params: query,
  })
}
// æäº¤å­£åº¦æŠ½æ ·
export function addQuarter(query) {
  return request({
    url: '/finishProductSpotCheck/addQuarter',
    method: 'post',
    data : query,
  })
}
// ç¼–辑季度检验
export function updateQuarterOnOrder(query) {
  return request({
    url: '/finishProductSpotCheck/updateQuarterOnOrder',
    method: 'post',
    data : query,
  })
}
src/api/business/rawMaterialOrder.js
@@ -214,12 +214,13 @@
    data: query
  })
}
// åŽŸææ–™ä¸‹å•å‡ºåŽ‚æ’¤é”€
// åŽŸææ–™æŠ¥æ£€å…¨éƒ¨å¯¼å‡º
export function rawAllExport(query) {
  return request({
    url: '/rawMaterialOrder/rawAllExport',
    method: 'post',
    data: query
    data: query,
    responseType: "blob"
  })
}
// åŽŸææ–™ä¸‹å•å‡ºåŽ‚æ’¤é”€
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/business/inspectionReview/index.vue
@@ -362,12 +362,8 @@
    },
    // ä¸‹è½½æŠ¥å‘Š
    download(row) {
      let url = (row.urlS===null||row.urlS==='')?row.url:row.urlS
      const link = document.createElement('a');
      link.href = this.javaApi + url;
      link.target = '_blank';
      document.body.appendChild(link);
      link.click();
      let url = this.javaApi+'/word/' + (row.urlS===null||row.urlS==='')?row.url:row.urlS
      this.$download.saveAs(url, row.fileName);
    },
    // è¿˜åŽŸæ“ä½œ
    handleRestore(row) {
src/views/business/inspectionTask/components/InspectionWord.vue
@@ -2039,13 +2039,10 @@
          let url = '';
          if(res.data.type==1){
            url = this.javaApi+'/img/'+res.data.fileUrl
            file.downloadIamge(url,row.fileName)
            this.$download.saveAs(url, row.fileName);
          }else{
            url = this.javaApi+'/word/'+res.data.fileUrl
            const link = document.createElement('a');
            link.href = url;
            link.download = row.fileName;
            link.click();
            this.$download.saveAs(url, row.fileName);
          }
        }
      }).catch(error => {
src/views/business/materialOrder/index.vue
@@ -1073,17 +1073,11 @@
      let entity = this.tabIndex === 3 ? { ...this.entity, isInspect: 2 } : { ...this.entity, state: 2, orderState: 4, }
      delete entity.orderBy
      this.outLoading = true
      rawAllExport({
        entity: entity
      }, { responseType: "blob" }).then(res => {
      rawAllExport({entity: entity}).then(res => {
        this.outLoading = false
        this.$message.success('导出成功')
        const blob = new Blob([res], { type: 'application/octet-stream' });
        const url = URL.createObjectURL(blob);
        const link = document.createElement('a');
        link.href = url;
        link.download = '原材料检测信息导出.xlsx';
        link.click();
        let url = this.javaApi + '/word/' + res.data
        this.$download.saveAs(url, '原材料检测信息导出.xlsx');
      })
    },
    // æäº¤ä¿®æ”¹å§”托编号信息
src/views/business/materialOrderComponents/materialOrder/downFileDialog.vue
@@ -46,27 +46,13 @@
  methods: {
    // è¿›åŽ‚æ£€éªŒæŠ¥å‘Šä¸‹è½½
    downLoad0 () {
      let url = this.downLoadInfo.enterUrlS ? this.downLoadInfo.enterUrlS : this.downLoadInfo.enterUrl
      if(url){
        url = url.split('.')[0]+'.pdf'
        const link = document.createElement('a');
        link.href = this.javaApi + url;
        link.target = '_blank';
        document.body.appendChild(link);
        link.click();
      }
      let url = this.javaApi+'/word/' + this.downLoadInfo.enterUrlS ? this.downLoadInfo.enterUrlS : this.downLoadInfo.enterUrl
      this.$download.saveAs(url, this.downLoadInfo.fileName);
    },
    // å­£åº¦æ£€éªŒæŠ¥å‘Šä¸‹è½½
    downLoad1 () {
      let url = this.downLoadInfo.quarterUrlS ? this.downLoadInfo.quarterUrlS : this.downLoadInfo.quarterUrl
      if(url){
        url = url.split('.')[0]+'.pdf'
        const link = document.createElement('a');
        link.href = this.javaApi + url;
        link.target = '_blank';
        document.body.appendChild(link);
        link.click();
      }
      let url = this.javaApi+'/word/' + this.downLoadInfo.quarterUrlS ? this.downLoadInfo.quarterUrlS : this.downLoadInfo.quarterUrl
      this.$download.saveAs(url, this.downLoadInfo.fileName);
    }
  },
}
src/views/business/materialOrderComponents/materialOrder/filesLookVisible.vue
@@ -158,13 +158,10 @@
          let url = '';
          if (res.data.type == 1) {
            url = this.javaApi + '/img/' + res.data.fileUrl
            file.downloadIamge(url, row.fileName)
            this.$download.saveAs(url, row.fileName);
          } else {
            url = this.javaApi + '/word/' + res.data.fileUrl
            const link = document.createElement('a');
            link.href = url;
            link.download = row.fileName;
            link.click();
            this.$download.saveAs(url, row.fileName);
          }
        }
      }).catch(error => {
src/views/business/productOrder/index.vue
@@ -865,14 +865,10 @@
    },
    // å¯¼å‡ºè®°å½•
    downLoad () {
      rawAllInsOrderExport({...this.entity, responseType: "blob"}).then(res => {
      rawAllInsOrderExport({...this.entity}).then(res => {
        this.$message.success('导出成功')
        const blob = new Blob([res],{ type: 'application/octet-stream' });
        const url = URL.createObjectURL(blob);
        const link = document.createElement('a');
        link.href = url;
        link.download = '委托检测信息导出' + '.xlsx';
        link.click();
        let url = this.javaApi + '/word/' + res.data
        this.$download.saveAs(url, '委托检测信息导出.xlsx');
      }).catch(err => {
        console.log('err---', err);
      })
@@ -984,13 +980,10 @@
          let url = '';
          if(res.data.type==1){
            url = this.javaApi+'/img/'+res.data.fileUrl
            file.downloadIamge(url,row.fileName)
            this.$download.saveAs(url, row.fileName);
          }else{
            url = this.javaApi+'/word/'+res.data.fileUrl
            const link = document.createElement('a');
            link.href = url;
            link.download = row.fileName;
            link.click();
            this.$download.saveAs(url, row.fileName);
          }
        }
      }).catch(error => {
@@ -999,14 +992,9 @@
    },
    // ä¸‹è½½æŠ¥å‘Š
    download(row) {
      let url = row.urlS?row.urlS:row.url;
      let url = this.javaApi+'/word/' + row.urlS?row.urlS:row.url;
      if(url){
        url = url.split('.')[0]+'.pdf'
        const link = document.createElement('a');
        link.href = this.javaApi + url;
        link.target = '_blank';
        document.body.appendChild(link);
        link.click();
        this.$download.saveAs(url, this.downLoadInfo.fileName);
      }
    },
    // æ’¤é”€
src/views/business/productSamplingInfo/components/addQuarterItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,290 @@
<template>
  <div>
    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="quarterSampleDia" title="季度抽样" width="90%" @close="quarterSampleDia = false">
      <div style="display: flex;align-items: center;justify-content: space-between;margin-bottom: 10px">
        <div style="width: 30%;display: flex;align-items: center;" >
          <span style="width: 50px">编号:</span>
          <el-input v-model="quarterSampleForm.quarterNo" :disabled="operationType !== 'add'" size="small"></el-input>
        </div>
        <div v-if="operationType === 'add'">
          <el-button size="small" type="primary" @click="addQuarter">添加</el-button>
          <el-button size="small" type="danger" @click="clearTable">清空</el-button>
        </div>
      </div>
      <div>
        <el-table v-loading="tableLoading" :data="quarterItems" border height="400" style="width: 100%">
          <el-table-column label="产品类型" prop="productType" width="200">
            <template slot-scope="{row}">
              <template>
                <el-input v-model="row.productType" size="small"/>
              </template>
            </template>
          </el-table-column>
          <el-table-column label="责任人" prop="dutyUser" width="100"></el-table-column>
          <el-table-column label="型号" prop="productModel" width="120">
            <template slot-scope="{row}">
              <template>
                <el-input v-model="row.productModel" size="small" :disabled="operationType === 'view'"/>
              </template>
            </template>
          </el-table-column>
          <el-table-column label="抽样数量" min-width="340" prop="spotCheckNumber">
            <template slot-scope="{row}">
              <template>
                <el-input v-model="row.spotCheckNumber" size="small" :disabled="operationType === 'view'"/>
              </template>
            </template>
          </el-table-column>
          <el-table-column v-if="operationType === 'add'" label="数量" min-width="120" prop="number">
            <template slot-scope="{row}">
              <template>
                <el-input v-model="row.number" size="small" :disabled="operationType === 'view'"/>
              </template>
            </template>
          </el-table-column>
          <el-table-column v-if="operationType !== 'add'" label="抽样时间" prop="spotCheckTime" width="160">
            <template slot-scope="{row}">
              <template>
                <el-date-picker v-model="row.spotCheckTime"
                                format="yyyy-MM-dd"
                                :disabled="operationType === 'view'"
                                placeholder="选择日期"
                                size="small"
                                clearable
                                style="width:100%"
                                type="date"
                                value-format="yyyy-MM-dd">
                </el-date-picker>
              </template>
            </template>
          </el-table-column>
          <el-table-column v-if="operationType !== 'add'" label="试样结论" prop="result" width="130">
            <template v-slot="scope">
              <el-select v-model="scope.row.result" placeholder="请选择" size="small" clearable :disabled="operationType === 'view'">
                <el-option label="合格" value="合格"></el-option>
                <el-option label="不合格" value="不合格"></el-option>
              </el-select>
            </template>
          </el-table-column>
          <el-table-column v-if="operationType !== 'add'" label="取样人员" prop="samplingUser" width="120">
            <template slot-scope="{row}">
              <template>
                <el-input v-model="row.samplingUser" size="small" :disabled="operationType === 'view'"/>
              </template>
            </template>
          </el-table-column>
          <el-table-column label="备注" prop="itemRemark" width="200">
            <template slot-scope="{row}">
              <template>
                <el-input v-model="row.itemRemark" size="small" :disabled="operationType === 'view'"/>
              </template>
            </template>
          </el-table-column>
          <el-table-column v-if="operationType !== 'view'" fixed="right" label="操作" width="100">
            <template slot-scope="scope">
              <el-button size="small" style="color: #f56c6c" type="text" @click="deleteScope(scope.$index)">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <div style="display: flex;align-items: center;margin: 10px 0">
        <span style="width: 70px">备注:</span>
        <el-input v-model="quarterSampleForm.remark" :disabled="operationType === 'view'" size="small" style="width: 43%" type="textarea"></el-input>
      </div>
      <div v-if="operationType !== 'add'">
        <el-form ref="form" :model="editForm" label-width="70px">
          <el-col :span="12">
            <el-form-item label="编制人:">
              <el-select v-model="editForm.writeUser" :disabled="operationType !=='edit'" placeholder="请选择" size="small" style="width: 100%">
                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="会签人:">
              <el-select v-model="editForm.countersignUser" :disabled="operationType !=='edit'" multiple placeholder="请选择" size="small" style="width: 100%">
                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="审核人:">
              <el-select v-model="editForm.examineUser" :disabled="operationType !=='edit'" placeholder="请选择" size="small" style="width: 100%">
                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="批准人:">
              <el-select v-model="editForm.ratifyUser" :disabled="operationType !=='edit'" placeholder="请选择" size="small" style="width: 100%">
                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-form>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="quarterSampleDia = false">取 æ¶ˆ</el-button>
        <el-button v-if="operationType === 'add'" @click="quarterSampleDia = false">保 å­˜</el-button>
        <el-button v-if="operationType !== 'add' && operationType !== 'view'" type="primary" @click="handleSample">ç¡® å®š</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import {addQuarter, getQuarter, updateQuarterOnOrder} from "@/api/business/productSamplingInfo";
import {selectUserCondition} from "@/api/performance/class";
export default {
  name: "addQuarterItem",
  // import å¼•入的组件需要注入到对象中才能使用
  components: {},
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      tableLoading: false,
      quarterSampleDia: false, // å­£åº¦æŠ½æ ·å¼¹æ¡†
      quarterSampleForm: {
        quarterNo: '', // ç¼–号
      },
      quarterItems: [],
      quarterTemItems: [],
      operationType: '',
      editForm: {
        quarterId: '',
        writeUser: '', // ç¼–制人
        countersignUser: [], // ä¼šç­¾äºº
        examineUser: '', // å®¡æ ¸äºº
        ratifyUser: '', // æ‰¹å‡†äºº
      },
      userList: [],
      quarterRow: {},
    }
  },
  mounted() {
    this.getUserList()
  },
  // æ–¹æ³•集合
  methods: {
    openDia (quarterTemItems, type) {
      this.quarterSampleDia = true
      this.operationType = type
      if (type === 'add') {
        if (quarterTemItems.length > 0) {
          this.quarterItems = quarterTemItems
        }
        this.quarterSampleForm.quarterNo = getCurrentMonthTwoDigits()
      } else {
        this.tableLoading = true
        this.quarterRow = quarterTemItems
        getQuarter({quarterId: quarterTemItems.quarterId}).then(res => {
          this.tableLoading = false
          if (res.code === 200) {
            this.quarterItems = res.data.quarterItems
            this.quarterSampleForm.quarterNo = res.data.quarterNo
            this.quarterSampleForm.remark = res.data.remark
            this.editForm.quarterId = res.data.quarterId
            this.editForm.writeUser = res.data.writeUser
            this.editForm.examineUser = res.data.examineUser
            this.editForm.ratifyUser = res.data.ratifyUser
            if (res.data.countersignUser) {
              this.editForm.countersignUser = res.data.countersignUser.split(",").map(Number)
            }
          }
        })
      }
    },
    // æ‰‹åŠ¨æ·»åŠ 
    addQuarter () {
      this.quarterItems.push({
        productType: '',
        dutyUser: JSON.parse(localStorage.getItem("user")).name,
        productModel: '',
        spotCheckNumber: '',
        number: '',
        spotCheckTime: '',
        result: '',
        samplingUser: '',
        itemRemark: '',
      })
    },
    // æäº¤å­£åº¦æŠ½æ ·
    handleSample () {
      this.$confirm('是否提交该数据', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        if (this.operationType === 'add') {
          this.quarterSampleForm.quarterItems = JSON.parse(JSON.stringify(this.quarterItems))
          this.quarterSampleForm.quarterItems.forEach(item => {
            item.spotCheckNumber = item.spotCheckNumber + ' ' + (item.number == null ? "" : item.number)
          })
          addQuarter(this.quarterSampleForm).then(res => {
            if (res.code == 200) {
              this.$message.success('提交成功')
              this.quarterItems = []
              this.$parent.quarterTemItems = []
              this.closeQuarterSampleDia()
            }
          })
        } else {
          const params = {...this.editForm}
          if (params.countersignUser.length > 0) {
            params.countersignUser = params.countersignUser.join(',')
          } else {
            params.countersignUser = ''
          }
          params.quarterItems = JSON.parse(JSON.stringify(this.quarterItems))
          updateQuarterOnOrder(params).then(res => {
            if (res.code == 200) {
              this.$message.success('提交成功')
              this.quarterItems = []
              this.closeQuarterSampleDia()
            }
          })
        }
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消'
        });
      });
    },
    // æ¸…空抽样计划
    clearTable () {
      this.quarterItems = []
      this.$parent.quarterTemItems = []
    },
    // æ‰‹åŠ¨åˆ é™¤
    deleteScope (index) {
      this.quarterItems.splice(index, 1)
    },
    // å…³é—­å­£åº¦æŠ½æ ·å¼¹æ¡†
    closeQuarterSampleDia () {
      this.quarterSampleDia = false
      if (this.operationType === 'add') {
        this.$parent.handleStockList()
      } else {
        this.$parent.refreshTable()
      }
    },
    getUserList(){
      selectUserCondition({ type: 0 }).then((res) => {
        this.userList = res.data;
      })
    },
  },
}
function getCurrentMonthTwoDigits() {
  const currentDate = new Date();
  const year = currentDate.getFullYear();
  const currentMonth = currentDate.getMonth() + 1;
  return year + currentMonth.toString().padStart(2, '0');
}
</script>
<style scoped>
</style>
src/views/business/productSamplingInfo/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,647 @@
<template>
  <div class="capacity-scope">
    <div style="display: flex;justify-content: space-between">
      <el-form :model="entity" ref="entity" size="small" :inline="true">
        <el-form-item label="编号" prop="quarterNo" v-show="tabIndex === 0">
          <el-input v-model="entity.quarterNo" clearable placeholder="请输入"
                    size="small"
                    @keyup.enter.native="refreshTable">
          </el-input>
        </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-form-item>
      </el-form>
      <div>
        <el-button v-if="tabIndex === 1" size="small" type="primary" @click="yearSample('add')">年度抽样</el-button>
      </div>
    </div>
    <div>
      <div class="table">
        <ul class="tab">
          <li v-for="(m,i) in tabList" :key="i" :class="{active:i===tabIndex}" @click="handleTab(m,i)">{{m.label}}</li>
        </ul>
        <!--季度-->
        <lims-table :tableData="tableData" :column="column" v-if="tabIndex === 0"
                    @pagination="pagination" :height="'calc(100vh - 290px)'"
                    :page="page" :tableLoading="tableLoading"></lims-table>
        <!--年度-->
        <lims-table :tableData="tableData1" :column="column1" v-if="tabIndex === 1"
                    @pagination="pagination1" :height="'calc(100vh - 290px)'"
                    key="tableData1" :page="page1" :tableLoading="tableLoading1"></lims-table>
      </div>
    </div>
    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="yearSampleDia" title="年度抽样" width="70%"
               @close="closeYearSampleDia">
      <div style="display: flex;align-items: center;justify-content: space-between;margin-bottom: 10px">
        <div style="width: 30%;display: flex;align-items: center;" >
          <el-input v-if="operationType !=='view'" v-model="currentYear" size="small"/>
          <span v-if="operationType ==='view'" style="width: 160px;font-size: 18px;font-weight: 600">{{currentYear}}</span>
        </div>
        <div  v-if="operationType !== 'view'">
          <el-button size="small" type="primary" @click="addQuarter">添加</el-button>
          <el-button size="small" type="danger" @click="clearTable">清空</el-button>
        </div>
      </div>
      <div>
        <el-table :data="yearItems" border height="450" style="width: 100%">
          <el-table-column label="类别" prop="yearType" width="240">
            <template slot-scope="{row}">
              <template v-if="operationType !== 'view'">
                <el-input v-model="row.yearType" size="small" type="textarea" :rows="4"/>
              </template>
              <template v-else>
                <span size="small">{{row.yearType}}</span>
              </template>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="1" prop="january" width="160">
            <template slot-scope="{row}">
              <template v-if="operationType !== 'view'">
                <el-input v-model="row.january" size="small" type="textarea" :rows="4"/>
              </template>
              <template v-else>
                <span size="small">{{row.january}}</span>
              </template>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="2" prop="february" width="160">
            <template slot-scope="{row}">
              <template v-if="operationType !== 'view'">
                <el-input v-model="row.february" size="small" type="textarea" :rows="4"/>
              </template>
              <template v-else>
                <span size="small">{{row.february}}</span>
              </template>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="3" prop="march" width="160">
            <template slot-scope="{row}">
              <template v-if="operationType !== 'view'">
                <el-input v-model="row.march" size="small" type="textarea" :rows="4"/>
              </template>
              <template v-else>
                <span size="small">{{row.march}}</span>
              </template>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="4" prop="april" width="160">
            <template slot-scope="{row}">
              <template v-if="operationType !== 'view'">
                <el-input v-model="row.april" size="small" type="textarea" :rows="4"/>
              </template>
              <template v-else>
                <span size="small">{{row.april}}</span>
              </template>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="5" prop="may" width="160">
            <template slot-scope="{row}">
              <template v-if="operationType !== 'view'">
                <el-input v-model="row.may" size="small" type="textarea" :rows="4"/>
              </template>
              <template v-else>
                <span size="small">{{row.may}}</span>
              </template>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="6" prop="june" width="160">
            <template slot-scope="{row}">
              <template v-if="operationType !== 'view'">
                <el-input v-model="row.june" size="small" type="textarea" :rows="4"/>
              </template>
              <template v-else>
                <span size="small">{{row.june}}</span>
              </template>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="7" prop="july" width="160">
            <template slot-scope="{row}">
              <template v-if="operationType !== 'view'">
                <el-input v-model="row.july" size="small" type="textarea" :rows="4"/>
              </template>
              <template v-else>
                <span size="small">{{row.july}}</span>
              </template>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="8" prop="august" width="160">
            <template slot-scope="{row}">
              <template v-if="operationType !== 'view'">
                <el-input v-model="row.august" size="small" type="textarea" :rows="4"/>
              </template>
              <template v-else>
                <span size="small">{{row.august}}</span>
              </template>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="9" prop="september" width="160">
            <template slot-scope="{row}">
              <template v-if="operationType !== 'view'">
                <el-input v-model="row.september" size="small" type="textarea" :rows="4"/>
              </template>
              <template v-else>
                <span size="small">{{row.september}}</span>
              </template>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="10" prop="october" width="160">
            <template slot-scope="{row}">
              <template v-if="operationType !== 'view'">
                <el-input v-model="row.october" size="small" type="textarea" :rows="4"/>
              </template>
              <template v-else>
                <span size="small">{{row.october}}</span>
              </template>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="11" prop="november" width="160">
            <template slot-scope="{row}">
              <template v-if="operationType !== 'view'">
                <el-input v-model="row.november" size="small" type="textarea" :rows="4"/>
              </template>
              <template v-else>
                <span size="small">{{row.november}}</span>
              </template>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="12" prop="december" width="160">
            <template slot-scope="{row}">
              <template v-if="operationType !== 'view'">
                <el-input v-model="row.december" size="small" type="textarea" :rows="4"/>
              </template>
              <template v-else>
                <span size="small">{{row.december}}</span>
              </template>
            </template>
          </el-table-column>
          <el-table-column v-if="operationType !== 'view'" fixed="right" label="操作"  width="100">
            <template slot-scope="scope">
              <el-button size="small" style="color: #f56c6c" type="text" @click="deleteScope(scope.$index)">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <div style="display: flex;align-items: center;margin-top: 10px">
        <span style="width: 70px">注意事项:</span>
        <el-input v-model="yearSampleForm.tableRemark" :disabled="operationType === 'view'" size="small" style="width: 50%" type="textarea"></el-input>
      </div>
      <div style="display: flex;align-items: center;margin-top: 10px">
        <span style="width: 70px">备注:</span>
        <el-input v-model="yearSampleForm.remark" :disabled="operationType === 'view'" size="small" style="width: 50%" type="textarea"></el-input>
      </div>
      <div v-if="operationType !== 'add'">
        <el-form ref="form" :model="editYearFormRow" label-width="70px">
          <el-col :span="12">
            <el-form-item label="编制人:">
              <el-select v-model="editYearFormRow.writeUser" :disabled="operationType !=='edit'" placeholder="请选择" size="small" style="width: 100%">
                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="会签人:">
              <el-select v-model="editYearFormRow.countersignUser" :disabled="operationType !=='edit'" multiple placeholder="请选择" size="small" style="width: 100%">
                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="审核人:">
              <el-select v-model="editYearFormRow.examineUser" :disabled="operationType !=='edit'" placeholder="请选择" size="small" style="width: 100%">
                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="批准人:">
              <el-select v-model="editYearFormRow.ratifyUser" :disabled="operationType !=='edit'" placeholder="请选择" size="small" style="width: 100%">
                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-form>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="closeYearSampleDia">取 æ¶ˆ</el-button>
        <el-button v-if="operationType !== 'view'" type="primary" @click="handleSample">ç¡® å®š</el-button>
      </span>
    </el-dialog>
    <add-quarter-item ref="addQuarterItem"></add-quarter-item>
  </div>
</template>
<script>
import AddQuarterItem from "./components/addQuarterItem.vue";
import limsTable from "@/components/Table/lims-table.vue";
import {
  addSpotCheckYear,
  deleteQuarter, deleteSpotCheckYear,
  finalReportQuarter,
  finalReportSpotCheckYear,
  getQuarterPage, getSpotCheckYear, getSpotCheckYearPage, updateSpotCheckYear
} from "@/api/business/productSamplingInfo";
import {selectUserCondition} from "@/api/performance/class";
export default {
  name: "b1-product-sampling-info",
  // import å¼•入的组件需要注入到对象中才能使用
  components: {limsTable, AddQuarterItem},
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      upIndex: 0,
      tabIndex: 0,
      tabList: [
        {
          label: '季度',
          value: 0
        },
        {
          label: '年度',
          value: 1
        },
      ],
      entity: {
        quarterNo: null,
      },
      tableData: [],
      tableLoading: false,
      column: [
        {label: '编号', prop: 'quarterNo'},
        {label: '备注', prop: 'remark'},
        {label: '创建人', prop: 'createUserName'},
        {label: '创建时间', prop: 'createTime'},
        {
          dataType: 'action',
          label: '操作',
          operation: [
            {
              name: '编辑',
              type: 'text',
              clickFun: (row) => {
                this.editForm(row);
              },
            },
            {
              name: '查看',
              type: 'text',
              clickFun: (row) => {
                this.viewQuarterInfo(row);
              },
            },
            {
              name: '下载',
              type: 'text',
              clickFun: (row) => {
                this.handleDown(row);
              },
            },
            {
              name: '删除',
              type: 'text',
              clickFun: (row) => {
                this.deleteQuarterInfo(row);
              },
            }
          ]
        }
      ],
      page: {
        total:0,
        size:10,
        current:1
      },
      tableData1: [],
      tableLoading1: false,
      column1: [
        { label: '名称', prop: 'yearHead' },
        { label: '创建人', prop: 'createUserName' },
        { label: '创建时间', prop: 'createTime' },
        {
          dataType: 'action',
          label: '操作',
          operation: [
            {
              name: '编辑',
              type: 'text',
              clickFun: (row) => {
                this.editYearForm(row);
              },
            },
            {
              name: '查看',
              type: 'text',
              clickFun: (row) => {
                this.viewYearInfo(row);
              },
            },
            {
              name: '下载',
              type: 'text',
              clickFun: (row) => {
                this.download(row);
              },
            },
            {
              name: '删除',
              type: 'text',
              clickFun: (row) => {
                this.deleteYearInfo(row);
              },
            },
          ]
        }
      ],
      page1: {
        total: 0,
        size: 10,
        current: 1
      },
      yearSampleDia: false, // å¹´åº¦æŠ½æ ·
      yearSampleForm: {
        tableRemark: '',
        remark: ''
      },
      yearItems: [],
      currentYear: '',
      operationType: '',
      userList: [],
      yearRow: {},
      editYearFormRow: {
        yearId: '',
        writeUser: '', // ç¼–制人
        countersignUser: null, // ä¼šç­¾äºº
        examineUser: '', // å®¡æ ¸äºº
        ratifyUser: '', // æ‰¹å‡†äºº
      }
    }
  },
  mounted() {
    this.refreshTable()
  },
  // æ–¹æ³•集合
  methods: {
    // æŸ¥è¯¢å›žè°ƒ
    refreshTable(e) {
      if (this.tabIndex === 0) {
        this.getQuarterPageList()
      } else if (this.tabIndex === 1) {
        this.getSpotCheckYearPageList()
      }
    },
    getQuarterPageList () {
      this.tableLoading = true
      getQuarterPage({
        ...this.page,...this.entity
      }).then(res => {
        this.tableLoading = false
        this.page.total = res.data.total
        this.tableData = res.data.records
      }).catch(err => {
        this.tableLoading = false
      })
    },
    getSpotCheckYearPageList () {
      this.tableLoading1 = true
      getSpotCheckYearPage({
        ...this.page1
      }).then(res => {
        this.tableLoading1 = false
        this.page1.total = res.data.total
        this.tableData1 = res.data.records
      }).catch(err => {
        this.tableLoading1 = false
      })
    },
    // é‡ç½®
    refresh() {
      this.resetForm('entity')
      this.refreshTable()
    },
    pagination (page) {
      this.page.size = page.limit
      this.refreshTable()
    },
    pagination1 (page) {
      this.page1.size = page.limit
      this.refreshTable()
    },
    // ç¼–辑季度抽样
    editForm (row) {
      this.$refs.addQuarterItem.openDia(row, 'edit')
    },
    // æŸ¥çœ‹å­£åº¦æŠ½æ ·
    viewQuarterInfo (row) {
      this.$refs.addQuarterItem.openDia(row, 'view')
    },
    // åˆ é™¤å­£åº¦æŠ½æ ·
    deleteQuarterInfo (row) {
      this.$confirm('是否删除当前数据?', "警告", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        deleteQuarter({quarterId: row.quarterId}).then(res => {
          if (res.code === 200) {
            this.$message.success('删除成功')
            this.refreshTable()
          }
        })
      }).catch(() => {})
    },
    // å¯¼å‡º
    handleDown (row) {
      let randomNum = Math.random();
      finalReportQuarter({quarterId: row.quarterId, random: randomNum}).then(res => {
        this.outLoading = false
        const blob = new Blob([res], { type: 'application/octet-stream' });
        this.$download.saveAs(blob, '季度抽样信息导出.docx')
        this.$message.success('导出成功')
      })
    },
    // å¹´åº¦ä¸‹è½½
    download(row) {
      finalReportSpotCheckYear({yearId: row.yearId}).then(res => {
        this.outLoading = false
        const blob = new Blob([res], { type: 'application/octet-stream' });
        this.$download.saveAs(blob, row.yearHead + '.docx')
        this.$message.success('导出成功')
      })
    },
    // åˆ é™¤å¹´åº¦æŠ½æ ·
    deleteYearInfo (row) {
      this.$confirm('是否删除当前数据?', "警告", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        deleteSpotCheckYear({yearId: row.yearId}).then(res => {
          if (res.code === 200) {
            this.$message.success('删除成功')
            this.refreshTable()
          }
        })
      }).catch(() => {})
    },
    // æŸ¥çœ‹å¹´åº¦è¯¦æƒ…
    viewYearInfo (row) {
      this.operationType = 'view'
      this.getUserList()
      this.yearSampleDia = true
      this.yearRow = row
      getSpotCheckYear({yearId: row.yearId}).then(res => {
        if (res.code === 200) {
          this.currentYear = res.data.yearHead
          this.yearItems = res.data.yearItems
          this.yearSampleForm.tableRemark = res.data.tableRemark
          this.yearSampleForm.remark = res.data.remark
          this.editYearFormRow.yearId = res.data.yearId
          this.editYearFormRow.writeUser = res.data.writeUser
          this.editYearFormRow.examineUser = res.data.examineUser
          this.editYearFormRow.ratifyUser = res.data.ratifyUser
          if (res.data.countersignUser) {
            this.editYearFormRow.countersignUser = res.data.countersignUser.split(",").map(Number)
          }
        }
      })
    },
    // ç¼–辑年度抽样
    editYearForm (row) {
      this.operationType = 'edit'
      this.getUserList()
      this.yearSampleDia = true
      getSpotCheckYear({yearId: row.yearId}).then(res => {
        if (res.code === 200) {
          this.currentYear = res.data.yearHead
          this.yearItems = res.data.yearItems
          this.yearSampleForm.tableRemark = res.data.tableRemark
          this.yearSampleForm.remark = res.data.remark
          this.editYearFormRow.yearId = res.data.yearId
          this.editYearFormRow.writeUser = res.data.writeUser
          this.editYearFormRow.examineUser = res.data.examineUser
          this.editYearFormRow.ratifyUser = res.data.ratifyUser
          if (res.data.countersignUser) {
            this.editYearFormRow.countersignUser = res.data.countersignUser.split(",").map(Number)
          }
        }
      })
    },
    // æäº¤å¹´åº¦è®¡åˆ’
    handleSample () {
      if (this.operationType === 'add') {
        this.yearSampleForm.yearItems = JSON.parse(JSON.stringify(this.yearItems))
        this.yearSampleForm.yearHead = this.currentYear
        addSpotCheckYear(this.yearSampleForm).then(res => {
          if (res.code == 200) {
            this.$message.success('提交成功')
            this.yearSampleForm = {}
            this.yearItems = []
            this.closeYearSampleDia()
            this.refreshTable()
          }
        })
      } else {
        const params = {...this.editYearFormRow}
        if (params.countersignUser != null) {
          params.countersignUser = params.countersignUser.join(',')
        }
        params.yearItems = JSON.parse(JSON.stringify(this.yearItems))
        params.tableRemark = this.yearSampleForm.tableRemark
        params.remark = this.yearSampleForm.remark
        updateSpotCheckYear(params).then(res => {
          if (res.code == 200) {
            this.$message.success('修改成功')
            this.yearSampleForm = {}
            this.editYearFormRow = {
              yearId: '',
              writeUser: '', // ç¼–制人
              countersignUser: [], // ä¼šç­¾äºº
              examineUser: '', // å®¡æ ¸äºº
              ratifyUser: '', // æ‰¹å‡†äºº
            }
            this.yearItems = []
            this.closeYearSampleDia()
            this.refreshTable()
          }
        })
      }
    },
    yearSample (type) {
      this.operationType = type
      const currentDate = new Date();
      this.yearSampleDia = true
      this.currentYear = currentDate.getFullYear() + '年年度抽检计划'
    },
    // æ·»åŠ å¹´åº¦è®¡åˆ’
    addQuarter () {
      this.yearItems.push({})
    },
    // æ¸…空抽样计划
    clearTable () {
      this.yearItems = []
    },
    // æ‰‹åŠ¨åˆ é™¤
    deleteScope (index) {
      this.yearItems.splice(index, 1)
    },
    // åˆ‡æ¢ä¸‹å•tab表格
    handleTab(m, i) {
      this.tabIndex = i;
      if (this.tabIndex === 0) {
        this.componentData.entity.quarterNo = this.entity.quarterNo
      }
      this.refreshTable()
    },
    closeYearSampleDia () {
      this.yearSampleForm = {
        tableRemark: '',
        remark: ''
      }
      this.yearItems = []
      this.yearSampleDia = false
    },
    getStyle(){
      return 'height: calc(100% - '+'44'+'px)'
    },
    getUserList(){
      selectUserCondition({ type: 0 }).then((res) => {
        this.userList = res.data;
      })
    },
  },
}
</script>
<style scoped>
.tab {
  list-style-type: none;
  display: flex;
  margin-bottom: 12px;
  margin-top: 0;
  padding-left: 0;
}
.tab li {
  line-height: 24px;
  padding: 6px 14px;
  font-size: 14px;
  color: #333333;
  border: 1px solid #EEEEEE;
  cursor: pointer;
}
.tab li:nth-child(1) {
  border-radius: 8px 0 0 8px;
}
.tab li:nth-child(2) {
  border-radius: 0 8px 8px 0;
}
.tab li.active {
  border-color: #3A7BFA;
  color: #3A7BFA;
}
</style>
src/views/business/rawMaterialInspection/index.vue
@@ -795,16 +795,11 @@
      this.outLoading = true
      rawAllExport({
        entity:entity
      },{
        responseType: "blob"}).then(res => {
      }).then(res => {
        this.outLoading = false
        this.$message.success('导出成功')
        const blob = new Blob([res],{ type: 'application/octet-stream' });
        const url = URL.createObjectURL(blob);
        const link = document.createElement('a');
        link.href = url;
        link.download = '原材料检测信息导出.xlsx';
        link.click();
        let url = this.javaApi + '/word/' + res.data
        this.$download.saveAs(url, "原材料检测信息导出.xlsx");
      })
    },
    clear() {
src/views/business/reportPreparation/index.vue
@@ -43,13 +43,13 @@
                     :on-success="handleSuccessUp1"
                     :show-file-list="false"
                     accept='.doc,.docx'>
            <el-button size="small" type="text" :disabled="scope.row.state != 0 || userName !== scope.row.writeUserName">上传</el-button>
            <el-button size="small" type="text" :disabled="scope.row.state != 0 || nickName !== scope.row.writeUserName">上传</el-button>
          </el-upload>
          <el-button type="text" size="small" :disabled="scope.row.state != 0 || userName !== scope.row.writeUserName" @click="handleRestore(scope.row)">还原</el-button>
          <el-button type="text" size="small" :disabled="scope.row.state != 0 || userName !== scope.row.writeUserName" @click="sendBackTask(scope.row)">退回任务</el-button>
          <el-button type="text" size="small" :disabled="scope.row.state != 0 || userName !== scope.row.writeUserName" @click="handle(scope.row)">提交</el-button>
          <el-button type="text" size="small" :disabled="scope.row.state == null || scope.row.state == 0 ||scope.row.isExamine == 1 || userName !== scope.row.examineUser" @click="handleIssued(scope.row)">审核</el-button>
          <el-button type="text" size="small" :disabled="scope.row.state == null || scope.row.state == 0 || scope.row.isExamine == 0 || scope.row.isExamine == null || scope.row.isRatify == 1 || userName !== scope.row.ratifyUser" @click="handleApprove(scope.row)">批准</el-button>
          <el-button type="text" size="small" :disabled="scope.row.state != 0 || nickName !== scope.row.writeUserName" @click="handleRestore(scope.row)">还原</el-button>
          <el-button type="text" size="small" :disabled="scope.row.state != 0 || nickName !== scope.row.writeUserName" @click="sendBackTask(scope.row)">退回任务</el-button>
          <el-button type="text" size="small" :disabled="scope.row.state != 0 || nickName !== scope.row.writeUserName" @click="handle(scope.row)">提交</el-button>
          <el-button type="text" size="small" :disabled="scope.row.state == null || scope.row.state == 0 ||scope.row.isExamine == 1 || nickName !== scope.row.examineUser" @click="handleIssued(scope.row)">审核</el-button>
          <el-button type="text" size="small" :disabled="scope.row.state == null || scope.row.state == 0 || scope.row.isExamine == 0 || scope.row.isExamine == null || scope.row.isRatify == 1 || nickName !== scope.row.ratifyUser" @click="handleApprove(scope.row)">批准</el-button>
          <el-popover placement="bottom" trigger="hover" style="margin-left: 6px">
            <template #reference>
              <el-button link type="text" size="small">更多</el-button>
@@ -555,13 +555,10 @@
          let url = '';
          if(res.data.type==1){
            url = this.javaApi+'/img/'+res.data.fileUrl
            file.downloadIamge(url,row.fileName)
            this.$download.saveAs(url, row.fileName);
          }else{
            url = this.javaApi+'/word/'+res.data.fileUrl
            const link = document.createElement('a');
            link.href = url;
            link.download = row.fileName;
            link.click();
            this.$download.saveAs(url, row.fileName);
          }
        }
      }).catch(error => {
@@ -603,17 +600,7 @@
      downAll({ids: str}).then(res => {
        this.outLoading = false
        this.$message.success('导出成功')
        // const blob = new Blob([res],{ type: 'application/octet-stream' });
        // const url = URL.createObjectURL(blob);
        // const link = document.createElement('a');
        // link.href = url;
        // link.download = '报告.zip';
        // link.click();
        const link = document.createElement('a');
        link.href = this.javaApi + res.message;
        link.target = '_blank';
        document.body.appendChild(link);
        link.click();
        this.$download.saveAs(this.javaApi + res.message, row.fileName);
      })
    },
    beforeUpload(file){
@@ -709,12 +696,8 @@
      }
    },
    download(row) {
      let url = row.urlS ? row.urlS : row.url;
      const link = document.createElement('a');
      link.href = this.javaApi + url;
      link.target = '_blank';
      document.body.appendChild(link);
      link.click();
      let url = this.javaApi+'/word/' + row.urlS ? row.urlS : row.url;
      this.$download.saveAs(url, row.fileName);
    },
    // è¿˜åŽŸæ“ä½œ
    handleRestore(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);