fix:1. 过程要求 - 样品接收:列表样式优化。
2. 过程要求 - 方法验证:点击详情还能修改,导出格式优化,按客户给的文档来。
3. 业务管理 - 检验任务:删除不合格相关的检测。
4. 业务管理 - 报告结果:按照发送日期倒序排列。
5. 基础配置 - 行业管理:删除印章管理。
6. 体系管理要求 - 客户满意度:附件上传报错,精简上传逻辑。
已修改9个文件
274 ■■■■■ 文件已修改
src/views/CNAS/process/disposal/sampleReceipt/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/methodVerification/component/ViewDeviceDialog.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/methodVerification/component/ViewTestRecord.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/methodVerification/component/formDIa.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/methodVerification/component/wordFormDIa.vue 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/method/methodVerification/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/inspectionTask/inspection.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/inspectionView/index.vue 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/structural/premises/index.vue 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/disposal/sampleReceipt/index.vue
@@ -40,7 +40,7 @@
        <lims-table :tableData="tableData" :column="column" @pagination="pagination"
                    :height="'calc(100vh - 280px)'" :key="upIndex" :page="page" :tableLoading="tableLoading">
          <template #inspectionItem="scope">
            <div style="white-space: pre-line; text-align: left; padding: 4px 0;">{{ scope.row.inspectionItem }}</div>
            <div style="white-space: pre-line; text-align: center; padding: 4px 0;">{{ scope.row.inspectionItem }}</div>
          </template>
          <template #remark="scope">
            <span>{{ scope.row.status === 2 && scope.row.rejectRemark ? scope.row.rejectRemark : scope.row.remark }}</span>
src/views/CNAS/process/method/methodVerification/component/ViewDeviceDialog.vue
@@ -1,7 +1,7 @@
<template>
  <div>
    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" v-model="viewDeviceDialog" title="查看设备" width="80%" @close="closeDia">
      <div style="text-align: right;margin-bottom: 10px">
      <div v-if="!readOnly" style="text-align: right;margin-bottom: 10px">
        <el-button size="small" type="primary" @click="addRow">添加</el-button>
        <el-button size="small" type="danger" @click="clearTable">清空</el-button>
      </div>
@@ -18,7 +18,7 @@
                         clearable
                         filterable
                         placeholder="设备名称"
                         size="small" @change="(val)=>changeMachineName(val, scope.$index)">
                         size="small" :disabled="readOnly" @change="(val)=>changeMachineName(val, scope.$index)">
                <el-option v-for="item in equipOptions" :key="item.value"  :label="item.label" :value="item.value">
                  {{item.label + item.value}}
                </el-option>
@@ -30,7 +30,7 @@
              <p>型号规格</p>
            </template>
            <template #default="{row}">
              <el-input v-model="row.machineSpecification" size="small"/>
              <el-input v-model="row.machineSpecification" size="small" :disabled="readOnly"/>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="测量范围" prop="machineMeasuringRange">
@@ -38,7 +38,7 @@
              <p>测量范围</p>
            </template>
            <template #default="{row}">
              <el-input v-model="row.machineMeasuringRange" size="small" type="textarea"/>
              <el-input v-model="row.machineMeasuringRange" size="small" type="textarea" :disabled="readOnly"/>
            </template>
          </el-table-column>
          <el-table-column header-align="center" label="①扩展不确定度②最大允差③准确度等级" prop="other">
@@ -46,14 +46,14 @@
              <p>①扩展不确定度②最大允差③准确度等级</p>
            </template>
            <template #default="{row}">
              <el-input v-model="row.other" size="small" type="textarea"/>
              <el-input v-model="row.other" size="small" type="textarea" :disabled="readOnly"/>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <template #footer><span  class="dialog-footer">
        <el-button @click="closeDia">取 消</el-button>
        <el-button type="primary" @click="handleDeviceInfo">确 定</el-button>
        <el-button v-if="!readOnly" type="primary" @click="handleDeviceInfo">确 定</el-button>
      </span></template>
    </el-dialog>
  </div>
@@ -64,6 +64,7 @@
export default {
  name: 'ViewDeviceDialog',
  props: { readOnly: { type: Boolean, default: false } },
  // import 引入的组件需要注入到对象中才能使用
  components: {},
  data() {
@@ -83,6 +84,7 @@
    },
    // 增加表格行数据
    addRow () {
      if (this.readOnly) return
      this.machineAttachmentList.push({
        machineName: '',
        machineSpecification: '',
@@ -92,10 +94,12 @@
    },
    // 清空表格数据
    clearTable () {
      if (this.readOnly) return
      this.machineAttachmentList = []
    },
    // 选择设备的回调
    changeMachineName (val, index) {
      if (this.readOnly) return
      const index1 = this.equipOptions.findIndex(item => item.value === val);
      if (index1 !== -1) {
        this.machineAttachmentList[index].deviceId = this.equipOptions[index1].id;
@@ -105,6 +109,7 @@
    },
    // 提交设备信息
    handleDeviceInfo () {
      if (this.readOnly) return
      if (this.machineAttachmentList.length === 0) {
        this.$message.warning('请添加信息')
        return
src/views/CNAS/process/method/methodVerification/component/ViewTestRecord.vue
@@ -1,7 +1,7 @@
<template>
  <div>
    <el-dialog v-model="filesDialogVisible" title="附件上传" width="80%" @closed="closeFilesLook">
      <div style="display: flex;justify-content: space-between;">
    <el-dialog v-model="filesDialogVisible" :title="readOnly ? '查看附件' : '附件上传'" width="80%" @closed="closeFilesLook">
      <div v-if="!readOnly" style="display: flex;justify-content: space-between;">
        <el-upload ref='upload'
                   :action="fileAction"
                   :auto-upload="true"
@@ -17,7 +17,7 @@
      <div>
        <lims-table
          ref="yearTable"
          :column="columnData"
          :column="readOnly ? readonlyColumnData : columnData"
          :height="'calc(100vh - 47em)'"
          :highlightCurrentRow="true"
          :table-data="tableData"
@@ -36,8 +36,16 @@
export default {
  name: 'ViewTestRecord',
  props: { readOnly: { type: Boolean, default: false } },
  // import 引入的组件需要注入到对象中才能使用
  components: { limsTable },
  computed: {
    readonlyColumnData() {
      return this.columnData.map(column => column.dataType === 'action'
        ? { ...column, operation: column.operation.filter(item => item.name !== '删除') }
        : column)
    }
  },
  data() {
    // 这里存放数据
    return {
@@ -122,6 +130,7 @@
    },
    // 删除
    delete (row) {
      if (this.readOnly) return
      this.tableLoading = true
      delVerifyMethodFileList({methodFileId:row.methodFileId}).then(res => {
        this.tableLoading = false
@@ -137,6 +146,7 @@
    },
    // 上传验证
    fileBeforeUpload(file) {
      if (this.readOnly) return false
      let flag = true
      if (file.size > 1024 * 1024 * 10) {
        this.$message.error('上传文件不超过10M');
src/views/CNAS/process/method/methodVerification/component/formDIa.vue
@@ -291,12 +291,12 @@
      </table>
      </fieldset>
      <template #footer><span  class="dialog-footer">
        <el-button @click="closeDia">取 消</el-button>
        <el-button @click="closeDia">{{ operationType === 'view' ? '关闭' : '取 消' }}</el-button>
        <el-button v-if="operationType !== 'view'" :loading="editLoad" type="primary" @click="handleEdit">提 交</el-button>
      </span></template>
    </el-dialog>
    <ViewDeviceDialog v-if="viewDeviceDialog" ref="viewDeviceDialog" @closDeviceDia="closDeviceDia" @handleDeviceInfo="handleDeviceInfo"></ViewDeviceDialog>
    <ViewTestRecord v-if="viewTestRecordDialog" ref="viewTestRecordDialog"></ViewTestRecord>
    <ViewDeviceDialog v-if="viewDeviceDialog" ref="viewDeviceDialog" :read-only="operationType === 'view'" @closDeviceDia="closDeviceDia" @handleDeviceInfo="handleDeviceInfo"></ViewDeviceDialog>
    <ViewTestRecord v-if="viewTestRecordDialog" ref="viewTestRecordDialog" :read-only="operationType === 'view'"></ViewTestRecord>
    <ViewWorkPermitDia v-if="viewWorkPermitDia" ref="viewWorkPermitDia"></ViewWorkPermitDia>
    <calibrations-file-dia v-if="calibrationsFileDia" ref="calibrationsFileDia"></calibrations-file-dia>
  </div>
@@ -410,6 +410,7 @@
    },
    // 提交
    handleEdit() {
      if (this.operationType === 'view') return
      this.editLoad = true
      const processMethodSearchNews = this.HaveJson(this.form)
      processMethodSearchNews.confirmUser = processMethodSearchNews.confirmUser && processMethodSearchNews.confirmUser.join(',')
@@ -422,10 +423,12 @@
    },
    // 评审意见勾选(三选一,再点一次取消)
    toggleReview (value, checked) {
      if (this.operationType === 'view') return
      this.form.reviewResult = checked ? value : ''
    },
    // 审批意见勾选(三选一,再点一次取消)
    toggleApproval (value, checked) {
      if (this.operationType === 'view') return
      this.form.approvalResult = checked ? value : ''
    },
    // 查看上岗证
@@ -455,6 +458,7 @@
    },
    // 提交设备信息
    handleDeviceInfo (machineAttachmentList) {
      if (this.operationType === 'view') return
      this.viewDeviceDialog = false
      this.form.machineAttachmentList = machineAttachmentList
    },
src/views/CNAS/process/method/methodVerification/component/wordFormDIa.vue
@@ -14,17 +14,17 @@
          <tr>
            <th>标准名称</th>
            <td>
              <el-input v-model="form.standardName"/>
              <el-input v-model="form.standardName" :disabled="isView"/>
            </td>
            <th>标准编号</th>
            <td>
              <el-input v-model="form.standardCode"/>
              <el-input v-model="form.standardCode" :disabled="isView"/>
            </td>
          </tr>
          <tr>
            <th>验证项目</th>
            <td colspan="3">
              <el-input v-model="form.verifyItem"/>
              <el-input v-model="form.verifyItem" :disabled="isView"/>
            </td>
          </tr>
          </tbody>
@@ -48,13 +48,13 @@
          <tr v-for="(item, index) in content.checks" :key="item.key">
            <th>{{ index < 7 ? `${index + 1}. ${item.label}` : item.label }}</th>
            <td>
              <el-input v-model="item.requirement" type="textarea" :rows="3"/>
              <el-input v-model="item.requirement" type="textarea" :rows="3" :disabled="isView"/>
            </td>
            <td>
              <el-input v-model="item.capability" type="textarea" :rows="3"/>
              <el-input v-model="item.capability" type="textarea" :rows="3" :disabled="isView"/>
              <div v-if="item.key === 'personnel'" class="row-extra">
                <span>检测人员</span>
                <el-select v-model="form.confirmUser" multiple :multiple-limit="5" placeholder="请选择检测人员">
                <el-select v-model="form.confirmUser" multiple :multiple-limit="5" placeholder="请选择检测人员" :disabled="isView">
                  <el-option v-for="user in userList" :key="user.id" :label="user.name" :value="user.id"/>
                </el-select>
                <el-link v-if="operationType !== 'add'" type="primary" @click="viewWorkPermit">查看上岗证</el-link>
@@ -66,7 +66,7 @@
              </div>
            </td>
            <td class="choice-cell">
              <el-radio-group v-model="item.satisfied">
              <el-radio-group v-model="item.satisfied" :disabled="isView">
                <el-radio :value="1">是</el-radio>
                <el-radio :value="0">否</el-radio>
              </el-radio-group>
@@ -75,23 +75,23 @@
          <tr>
            <th>验证结论</th>
            <td colspan="3">
              <el-input v-model="content.conclusion" type="textarea" :rows="4"/>
              <el-input v-model="content.conclusion" type="textarea" :rows="4" :disabled="isView"/>
            </td>
          </tr>
          <tr v-for="decision in decisions" :key="decision.key">
            <th>{{ decision.label }}</th>
            <td colspan="3">
              <div class="decision-row">
                <el-radio-group v-model="content[decision.key]">
                <el-radio-group v-model="content[decision.key]" :disabled="isView">
                  <el-radio value="同意使用">同意使用</el-radio>
                  <el-radio value="不能使用">不能使用</el-radio>
                  <el-radio value="限制使用">限制使用</el-radio>
                </el-radio-group>
                <span>{{ decision.personLabel }}</span>
                <el-input v-model="content[decision.personKey]" class="person-input"/>
                <el-input v-model="content[decision.personKey]" class="person-input" :disabled="isView"/>
                <span>日期</span>
                <el-date-picker v-model="content[decision.dateKey]" type="date" value-format="YYYY-MM-DD"
                                placeholder="选择日期"/>
                                placeholder="选择日期" :disabled="isView"/>
              </div>
            </td>
          </tr>
@@ -103,13 +103,13 @@
        </div>
      </div>
      <template #footer>
        <el-button @click="closeDia">取消</el-button>
        <el-button @click="closeDia">{{ isView ? '关闭' : '取消' }}</el-button>
        <el-button v-if="operationType !== 'view'" :loading="loading" type="primary" @click="submit">提交</el-button>
      </template>
    </el-dialog>
    <ViewDeviceDialog v-if="deviceVisible" ref="device" @closDeviceDia="deviceVisible = false"
    <ViewDeviceDialog v-if="deviceVisible" ref="device" :read-only="isView" @closDeviceDia="deviceVisible = false"
                      @handleDeviceInfo="setDevices"/>
    <ViewTestRecord v-if="recordVisible" ref="record"/>
    <ViewTestRecord v-if="recordVisible" ref="record" :read-only="isView"/>
    <ViewWorkPermitDia v-if="permitVisible" ref="permit"/>
    <CalibrationsFileDia v-if="calibrationVisible" ref="calibration"/>
  </div>
@@ -157,6 +157,9 @@
  components: {ViewDeviceDialog, ViewTestRecord, ViewWorkPermitDia, CalibrationsFileDia},
  props: {operationType: {type: String, default: 'add'}},
  computed: {
    isView() {
      return this.operationType === 'view'
    },
    dialogTitle() {
      if (this.operationType === 'view') return '查看方法验证'
      return this.operationType === 'edit' ? '编辑方法验证' : '新增方法验证'
@@ -198,6 +201,7 @@
      })
    },
    submit() {
      if (this.isView) return
      if (!this.form.standardName?.trim() || !this.form.standardCode?.trim() || !this.form.verifyItem?.trim()) {
        this.$message.warning('请填写标准名称、标准编号和验证项目')
        return
@@ -239,6 +243,7 @@
      this.openChild('recordVisible', 'record', this.info)
    },
    setDevices(list) {
      if (this.isView) return
      this.deviceVisible = false;
      this.form.machineAttachmentList = list
    },
src/views/CNAS/process/method/methodVerification/index.vue
@@ -177,7 +177,7 @@
      exportMethodVerify({ methodVerifyId: row.methodVerifyId }).then(res => {
        this.outLoading = false
        const blob = new Blob([res], { type: 'application/msword' });
        this.$download.saveAs(blob, '标准(方法)确认记录.docx')
        this.$download.saveAs(blob, '方法验证记录.docx')
      })
    },
    // 关闭弹框
src/views/business/inspectionTask/inspection.vue
@@ -121,9 +121,6 @@
          </el-radio-group>
        </div>
        <div style="display: flex; align-items: center">
          <el-button v-if="state == 1" size="small" type="primary" @click="openAddUnpass">新增不合格复测</el-button>
          <el-button v-if="state == 1" size="small" type="primary" @click="unpassCheck">不合格复测</el-button>
          <el-button v-if="state > 1" size="small" type="primary" @click="viewUnpassCheck">查看不合格复测</el-button>
          <span v-if="cableTagList.length > 0">&nbsp;&nbsp;电缆配置:</span>
          <el-select v-if="cableTagList.length > 0" v-model="currentTab" clearable placeholder="请选择" size="small"
            @change="(m) => handleChangeCableTag(currentSample.id, 0, 'cableTag', m)
src/views/business/inspectionView/index.vue
@@ -83,7 +83,6 @@
        <div style="display: flex; align-items: center">
          <el-button v-if="state == 1" size="small" type="primary" @click="openAddUnpass">新增不合格复测</el-button>
          <el-button v-if="state == 1" size="small" type="primary" @click="unpassCheck">不合格复测</el-button>
          <el-button v-if="state > 1" size="small" type="primary" @click="viewUnpassCheck">查看不合格复测</el-button>
          <span v-if="cableTagList.length > 0">&nbsp;&nbsp;电缆配置:</span>
          <el-select v-if="cableTagList.length > 0" v-model="currentTab" clearable placeholder="请选择" size="small"
                     @change="(m) => handleChangeCableTag(currentSample.id, 0, 'cableTag', m)
src/views/structural/premises/index.vue
@@ -53,33 +53,6 @@
        <el-button type="primary" @click="customAdd" :loading="loading">确 定</el-button>
      </span></template>
    </el-dialog>
    <el-dialog title="印章管理" v-model="fileVisible" width="60vw">
      <div class="btns">
        <el-button size="default" type="primary" @click="openUpload">更新印章</el-button>
      </div>
      <lims-table :tableData="fileComponentData" :column="fileComponentDataColumn" @pagination="fileComponentPagination"
        height="500px" :page="fileComponentPage" :tableLoading="fileComponentTableLoading"></lims-table>
    </el-dialog>
    <el-dialog title="更新印章" v-model="upFileVisible" width="400px">
      <el-form ref="dataForm" :model="dataForm" :rules="dataFormRules" label-position="right" label-width="80px">
        <el-form-item label="印章类型" prop="type">
          <el-cascader v-model="dataForm.type" :options="options" :show-all-levels="false" :props="props"
            placeholder="请选择" size="small" style="width:100%" collapse-tags clearable></el-cascader>
        </el-form-item>
        <el-form-item label="印章图片" prop="address">
          <el-upload class="avatar-uploader" :action="action" :headers="uploadHeader"
            accept='image/jpg,image/jpeg,image/png' :show-file-list="false" :on-success="handleSuccess"
            :on-change="beforeUpload" ref="upload" :on-error="onError">
            <img v-if="dataForm.address" :src="javaApi + '/img/' + dataForm.address" class="avatar">
            <lims-icon v-else class="avatar-uploader-icon" name="el-icon-plus"></lims-icon>
          </el-upload>
        </el-form-item>
      </el-form>
      <template #footer><span  class="dialog-footer">
        <el-button @click="upFileVisible = false">取 消</el-button>
        <el-button type="primary" @click="confirmConnect" :loading="loading">确 定</el-button>
      </span></template>
    </el-dialog>
  </div>
</template>
@@ -87,22 +60,14 @@
import limsTable from "@/components/Table/lims-table.vue";
import {
  addParameter,
  addSeal,
  delParameter,
  selectItemParameter,
  selectSeal,
  upParameter
} from "@/api/structural/laboratoryScope";
import { getCertificationDetail } from "@/api/structural/laboratory";
export default {
  components: {
    limsTable
  },
  computed: {
    action() {
      return this.javaApi + '/deviceScope/uploadFile'
    }
  },
  data() {
    return {
@@ -139,13 +104,6 @@
                this.delete(row);
              },
            },
            {
              name: '印章管理',
              type: 'text',
              clickFun: (row) => {
                this.fileManagement(row);
              },
            },
          ]
        }
      ],
@@ -166,49 +124,7 @@
        head: [{ required: true, message: '请输入负责人', trigger: 'blur' }],
        phoneNumber: [{ required: true, message: '请输入负责人电话', trigger: 'blur' }],
      },
      currentRow: {},
      fileComponentTableLoading: false,
      fileComponentData: [],
      fileComponentDataColumn: [
        { label: '行业名称', prop: 'laboratoryName' },
        { label: '印章图片', prop: 'address', dataType: 'image' },
        { label: '印章类型', prop: 'type' },
      ],
      fileComponentPage: {
        total: 0,
        size: 10,
        current: 1,
        layout: 'total, prev, pager, next'
      },
      fileVisible: false,
      upFileVisible: false,
      loading: false,
      dataForm: {
        type: '',
        address: '',
      },
      dataFormRules: {
        type: [{ required: true, message: '请选择印章类型', trigger: 'change' }],
        address: [{ required: false, message: '请上传图片', trigger: 'change' }],
      },
      props: { multiple: false, emitPath: false, },
      options: [
        {
          value: '行业资质',
          label: '行业资质',
          children: []
        },
        {
          value: '委托报告',
          label: '委托报告',
          children: null
        },
        {
          value: '进厂报告',
          label: '进厂报告',
          children: null
        },
      ],
    }
  },
  mounted() {
@@ -291,80 +207,6 @@
        })
      }).catch(() => { })
    },
    // 打开印章管理弹框
    fileManagement(row) {
      this.fileVisible = true;
      this.fileComponentTableLoading = true
      this.currentRow = row
      this.getFileComponentList()
    },
    getFileComponentList() {
      selectSeal({ id: this.currentRow.id, ...this.fileComponentPage }).then(res => {
        this.fileComponentTableLoading = false
        if (res.code === 200) {
          this.fileComponentData = res.data.records
          this.fileComponentPage.total = res.data.total
        }
      }).catch(err => {
        this.fileComponentTableLoading = false
      })
    },
    fileComponentPagination(page) {
      this.fileComponentPage.size = page.limit
      this.getFileComponentList()
    },
    // 打开更新印章弹框
    openUpload() {
      this.dataForm.type = '';
      this.dataForm.address = '';
      this.upFileVisible = true;
      this.getCertificationOperation()
    },
    // 查询印章类型
    getCertificationOperation() {
      const params = {
        current: -1,
        size: -1,
      }
      getCertificationDetail(params).then(res => {
        this.options[0].children = res.data.records.map(m => {
          m.value = m.name;
          m.label = m.name;
          return m
        });
      })
    },
    // 提交更新印章
    confirmConnect() {
      this.$refs['dataForm'].validate((valid) => {
        if (valid) {
          this.loading = true;
          addSeal({ labId: this.currentRow.id, ...this.dataForm }).then(res => {
            this.loading = false;
            this.getFileComponentList()
            this.upFileVisible = false;
          })
        }
      })
    },
    handleSuccess(response,) {
      if (response.code === 200) {
        this.dataForm.address = response.data.url
      }
    },
    beforeUpload(file, type) {
      if (file.size > 1024 * 1024 * 10) {
        this.$message.error('上传文件不超过10M');
        this.$refs.upload.clearFiles()
        return false;
      } else {
        return true;
      }
    },
    onError(err, file, fileList, type) {
      this.$message.error('上传失败')
      this.$refs.upload.clearFiles()
    },
  }
}
</script>
@@ -375,39 +217,7 @@
  justify-content: space-between;
}
.btns {
  text-align: right;
  margin-bottom: 10px;
}
:deep(.el-dialog__body) {
  padding-top: 8px !important;
}
.avatar-uploader :deep(.el-upload) {
  border: 1px dashed var(--lims-text-2);
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
}
.avatar-uploader :deep(.el-upload:hover) {
  border-color: var(--el-color-primary);
}
.avatar-uploader-icon {
  font-size: 20px;
  color: #8c939d;
  width: 90px;
  height: 90px;
  line-height: 90px;
  text-align: center;
}
.avatar {
  width: 90px;
  height: 90px;
  display: block;
}
</style>