value
2024-04-25 d4b07ba3645bda96a8019adda693aeb3d83830ec
检验报告和检验流程
已修改5个文件
476 ■■■■■ 文件已修改
src/assets/api/controller.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/a5-laboratory-qualifications.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/b1-inspect-order-plan.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/b1-inspection-order.vue 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/b1-report-preparation.vue 435 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/api/controller.js
@@ -198,6 +198,7 @@
  upReportUrl: "/insReport/upReportUrl", //报告还原
  writeReport: "/insReport/writeReport", //报告提交
  examineReport: "/insReport/examineReport", //报告审核
  ratifyReport: "/insReport/ratifyReport", //报告批准
}
const warehouse = {
src/components/view/a5-laboratory-qualifications.vue
@@ -61,7 +61,7 @@
                    </el-radio-group>
                </el-col>
                <el-col :span="12" style="text-align: right;" v-if="radio==0">
                    <el-button size="medium" type="primary" @click="openAdd" v-if="addPower">新增</el-button>
                    <el-button size="medium" type="primary" @click="openAdd" v-if="addPower">资质更新</el-button>
                    <el-button size="medium" icon="el-icon-delete" @click="handleDel" v-if="delPower">删除</el-button>
                </el-col>
            </el-row>
@@ -149,7 +149,7 @@
        </div>
    <el-dialog title="资质更新" :visible.sync="qualificationsConnectVisible" width="400px">
            <div class="search_thing" style="margin-bottom: 16px;">
        <div class="search_label" style="width:120px">资质名称:</div>
        <div class="search_label" style="width:120px"><span class="required-span">* </span>资质名称:</div>
        <div class="search_input">
          <el-select v-model="formData.name" placeholder="请选择" style="width: 100%;" size="small" clearable>
            <el-option
@@ -162,7 +162,7 @@
        </div>
      </div>
      <div class="search_thing" style="margin-bottom: 16px;">
        <div class="search_label" style="width:120px">资质编码:</div>
        <div class="search_label" style="width:120px"><span class="required-span">* </span>资质编码:</div>
        <div class="search_input">
          <el-input
          size="small"
@@ -172,7 +172,7 @@
        </div>
      </div>
      <div class="search_thing" style="margin-bottom: 16px;">
        <div class="search_label" style="width:120px">颁发机构:</div>
        <div class="search_label" style="width:120px"><span class="required-span">* </span>颁发机构:</div>
        <div class="search_input">
          <el-input
          size="small"
@@ -191,7 +191,7 @@
                    v-model="formData.explanation"></el-input>
        </div>
      </div>
      <div class="search_thing" style="margin-bottom: 16px;">
      <!-- <div class="search_thing" style="margin-bottom: 16px;">
        <div class="search_label" style="width:120px">首次颁发时间:</div>
        <div class="search_input">
          <el-date-picker style="width:100%" v-model="formData.firstTime"
@@ -216,9 +216,9 @@
          placeholder="选择日期">
                    </el-date-picker>
        </div>
      </div>
      </div> -->
      <div class="search_thing" style="margin-bottom: 16px;">
        <div class="search_label" style="width:120px">到期颁发时间:</div>
        <div class="search_label" style="width:120px"><span class="required-span">* </span>到期时间:</div>
        <div class="search_input">
          <el-date-picker style="width:100%" v-model="formData.expireTime"
          type="datetime"
src/components/view/b1-inspect-order-plan.vue
@@ -237,7 +237,7 @@
                            type: 'text',
                            method: 'handleConnect',
                            disabFun: (row, index) => {
                                return row.userId == null || row.orderUserId == null
                                return row.userId == null || row.orderUserId == null || row.insState == 5  || row.insState == 3
                            }
                        },
                        {
src/components/view/b1-inspection-order.vue
@@ -172,7 +172,7 @@
                    </el-row>
                </span>
            </el-dialog>
            <el-dialog title="数据查看" :visible.sync="dataDialogVisible" width="70%">
            <el-dialog title="数据查看" :visible.sync="dataDialogVisible" width="80%">
                <div style="height: 70vh;overflow-y: auto;" v-if="dataDialogVisible">
                    <ValueTable ref="ValueTableDataLook" :url="$api.insOrder.selectSampleAndProductByOrderId"
                        :componentData="componentDataDataLook"/>
@@ -233,7 +233,7 @@
                        type: 'text',
                        method: 'handleDataLook',
                        disabFun: (row, index) => {
                            return row.state != 1
                            return row.state != 1 && row.state != 4
                        }
                    }, {
                        id: 'download',
@@ -241,7 +241,7 @@
                        type: 'text',
                        method: 'download',
                        disabFun: (row, index) => {
                            return row.state != 1 || row.reportId == null
                            return row.state != 4 || row.reportId == null
                        }
                    }, {
                        id: 'verify',
@@ -257,7 +257,7 @@
                        type: 'text',
                        method: 'handlEquash',
                        disabFun: (row, index) => {
                            return row.state == 2 || row.state == 3
                            return row.state != 1 && row.state != 0
                        }
                    }, {
                        font: '分配',
@@ -326,6 +326,22 @@
                        inspectionValueType: {select: []}
                    },
                    selectField: {},
          spanConfig:{
            rows:[
              {
                name:'sampleCode',
                index:0
              },
              {
                name:'sample',
                index:1
              },
              {
                name:'model',
                index:2
              }
            ]
          },
                    requiredAdd: [],
                    requiredUp: []
                },
src/components/view/b1-report-preparation.vue
@@ -35,24 +35,24 @@
    padding: 20px;
  }
    .el-form-item {
        margin-bottom: 16px;
    }
  .el-form-item {
    margin-bottom: 16px;
  }
  .full-screen{
  .full-screen {
    position: absolute;
    right: 52px;
    top: 22px;
  }
  .btns{
  .btns {
    position: absolute;
    right: 100px;
    top: 17px;
  }
  .fullscreen{
    height:82vh
  .fullscreen {
    height: 82vh
  }
</style>
@@ -76,30 +76,33 @@
            <el-input size="small" placeholder="请输入" clearable v-model="componentData.entity.entrustCode"
              @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>
      <!-- <input id="input" type="file" accept=".doc,.docx"></input> -->
            <div class="table">
                <ValueTable ref="ValueTable" :url="$api.insReport.pageInsReport" :componentData="componentData"
                    :key="upIndex"/>
            </div>
        </div>
    <el-dialog title="在线编制" :visible.sync="claimVisible" width="22cm" :modal-append-to-body="false" :fullscreen="fullscreen">
      <div class="full-screen">
        <i class="el-icon-full-screen" style="cursor: pointer;font-size: 18px" @click="fullscreen=true;" v-if="!fullscreen"></i>
        <img src="../../../static/img/no-full.svg" alt="" v-else style="cursor: pointer;" @click="fullscreen=false;" >
        </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>
      <Word style="height:70vh" :class="{fullscreen:fullscreen}" v-if="claimVisible" ref="Word" :value="value"/>
            <span slot="footer" class="dialog-footer">
                <el-button @click="claimVisible = false">取 消</el-button>
                <el-button type="primary" @click="confirmClaim">确 定</el-button>
            </span>
        </el-dialog>
    <el-dialog title="报告审核" :visible.sync="issuedVisible" width="400px" :modal-append-to-body="false" :fullscreen="fullscreen">
      <!-- <input id="input" type="file" accept=".doc,.docx"></input> -->
      <div class="table">
        <ValueTable ref="ValueTable" :url="$api.insReport.pageInsReport" :componentData="componentData"
          :key="upIndex" />
      </div>
    </div>
    <el-dialog title="在线编制" :visible.sync="claimVisible" width="22cm" :modal-append-to-body="false"
      :fullscreen="fullscreen">
      <div class="full-screen">
        <i class="el-icon-full-screen" style="cursor: pointer;font-size: 18px" @click="fullscreen=true;"
          v-if="!fullscreen"></i>
        <img src="../../../static/img/no-full.svg" alt="" v-else style="cursor: pointer;" @click="fullscreen=false;">
      </div>
      <Word style="height:70vh" :class="{fullscreen:fullscreen}" v-if="claimVisible" ref="Word" :value="value" />
      <span slot="footer" class="dialog-footer">
        <el-button @click="claimVisible = false">取 消</el-button>
        <el-button type="primary" @click="confirmClaim">确 定</el-button>
      </span>
    </el-dialog>
    <el-dialog title="报告审核" :visible.sync="issuedVisible" width="400px" :modal-append-to-body="false"
      :fullscreen="fullscreen">
      <!-- <div class="full-screen">
        <i class="el-icon-full-screen" style="cursor: pointer;font-size: 18px" @click="fullscreen=true;" v-if="!fullscreen"></i>
        <img src="../../../static/img/no-full.svg" alt="" v-else style="cursor: pointer;" @click="fullscreen=false;" >
@@ -109,22 +112,22 @@
        <el-button size="small">不通过</el-button>
      </div> -->
      <span slot="footer" class="dialog-footer">
                <el-button @click="issuedReasonVisible=true">不通过</el-button>
                <el-button type="primary" @click="subIssued" :loading="loadingIssued">通 过</el-button>
            </span>
        </el-dialog>
        <el-button @click="issuedReasonVisible=true">不通过</el-button>
        <el-button type="primary" @click="subIssued" :loading="loadingIssued">通 过</el-button>
      </span>
    </el-dialog>
    <el-dialog title="不通过原因" :visible.sync="issuedReasonVisible" width="400px" :modal-append-to-body="false">
      <div class="search_thing">
        <div class="search_label">不通过原因:</div>
        <div class="search_input"><el-input size="small" placeholder="请输入" clearable
            v-model="reason"></el-input></div>
        <div class="search_input"><el-input size="small" placeholder="请输入" clearable v-model="reason"></el-input></div>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="issuedReasonVisible=false">取消</el-button>
                <el-button type="primary" @click="handleIssuedReason" :loading="loadingIssuedReason">确定</el-button>
            </span>
        </el-dialog>
    <el-dialog title="报告批准" :visible.sync="approveVisible" width="400px" :modal-append-to-body="false" :fullscreen="fullscreen">
        <el-button type="primary" @click="handleIssuedReason" :loading="loadingIssuedReason">确定</el-button>
      </span>
    </el-dialog>
    <el-dialog title="报告批准" :visible.sync="approveVisible" width="400px" :modal-append-to-body="false"
      :fullscreen="fullscreen">
      <!-- <div class="full-screen">
        <i class="el-icon-full-screen" style="cursor: pointer;font-size: 18px" @click="fullscreen=true;" v-if="!fullscreen"></i>
        <img src="../../../static/img/no-full.svg" alt="" v-else style="cursor: pointer;" @click="fullscreen=false;" >
@@ -134,32 +137,33 @@
        <el-button size="small">不批准</el-button>
      </div> -->
      <span slot="footer" class="dialog-footer">
                <el-button @click="approveReasonVisible=true">不批准</el-button>
                <el-button type="primary" @click="subApprove" :loading="loadingApprove">批 准</el-button>
            </span>
        </el-dialog>
        <el-button @click="approveReasonVisible=true">不批准</el-button>
        <el-button type="primary" @click="subApprove" :loading="loadingApprove">批 准</el-button>
      </span>
    </el-dialog>
    <el-dialog title="不批准原因" :visible.sync="approveReasonVisible" width="400px" :modal-append-to-body="false">
      <div class="search_thing">
        <div class="search_label">不批准原因:</div>
        <div class="search_input"><el-input size="small" placeholder="请输入" clearable
            v-model="reason"></el-input></div>
        <div class="search_input"><el-input size="small" placeholder="请输入" clearable v-model="reason"></el-input></div>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="approveReasonVisible=false">取消</el-button>
                <el-button type="primary" @click="handleApproveReason" :loading="loadingApproveReason">确定</el-button>
            </span>
        </el-dialog>
    </div>
        <el-button type="primary" @click="handleApproveReason" :loading="loadingApproveReason">确定</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
  import ValueTable from '../tool/value-table.vue'
  import Word from '../tool/word.vue'
  import file from '../../util/file';
  import { convertToHtml } from 'mammoth';
    export default {
        components: {
            ValueTable,
  import {
    convertToHtml
  } from 'mammoth';
  export default {
    components: {
      ValueTable,
      Word,
    },
    data() {
@@ -177,65 +181,67 @@
          showSelect: false,
          select: false,
          do: [
          //   {
          //   id: 'handleWeave',
          //   font: '在线编制',
          //   type: 'text',
          //   method: 'handleWeave',
          //   disabFun: (row, index) => {
          //     return row.isExamine != null
          //   }
          // },
          {
            id: 'download',
            font: '下载',
            type: 'text',
            method: 'download'
          }, {
            id: 'handleUpload',
            font: '上传',
            type: 'upload',
            uploadConfig:{
              url:this.$api.insReport.inReport,
              accept:'.docx'
            },
            method: 'handleUpload',
            disabFun: (row, index) => {
              return row.isExamine != null
            //   {
            //   id: 'handleWeave',
            //   font: '在线编制',
            //   type: 'text',
            //   method: 'handleWeave',
            //   disabFun: (row, index) => {
            //     return row.isExamine != null
            //   }
            // },
            {
              id: 'download',
              font: '下载',
              type: 'text',
              method: 'download'
            }, {
              id: 'handleUpload',
              font: '上传',
              type: 'upload',
              uploadConfig: {
                url: this.$api.insReport.inReport,
                accept: '.docx'
              },
              method: 'handleUpload',
              disabFun: (row, index) => {
                return row.isExamine != null
              }
            }, {
              id: 'handleRestore',
              font: '还原',
              type: 'text',
              method: 'handleRestore',
              disabFun: (row, index) => {
                return row.isExamine != null
              }
            }, {
              id: 'handleSubmit',
              font: '提交',
              type: 'text',
              method: 'handleSubmit',
              disabFun: (row, index) => {
                return row.state != 0
              }
            }, {
              id: 'handleIssued',
              font: '审核',
              type: 'text',
              method: 'handleIssued',
              disabFun: (row, index) => {
                return row.state == null || row.state == 0 || row.isExamine == 1
              }
            }, {
              id: 'handleApprove',
              font: '批准',
              type: 'text',
              method: 'handleApprove',
              disabFun: (row, index) => {
                return row.state == null || row.state == 0 || row.isExamine == 0 || row.isExamine == null || row
                  .isRatify == 1
              }
            }
          }, {
            id: 'handleRestore',
            font: '还原',
            type: 'text',
            method: 'handleRestore',
            disabFun: (row, index) => {
              return row.isExamine != null
            }
          },{
            id: 'handleSubmit',
            font: '提交',
            type: 'text',
            method: 'handleSubmit',
            disabFun: (row, index) => {
              return row.state != 0
            }
          }, {
            id: 'handleIssued',
            font: '审核',
            type: 'text',
            method: 'handleIssued',
            disabFun: (row, index) => {
              return row.state == null||row.state == 0 ||row.isExamine == 1
            }
          }, {
            id: 'handleApprove',
            font: '批准',
            type: 'text',
            method: 'handleApprove',
            disabFun: (row, index) => {
              return row.state == null||row.state == 0||row.isExamine == 0||row.isExamine == null ||row.isRatify==1
            }
          }],
          ],
          linkEvent: {
            // code: {
            //   method: 'selectAllByOne'
@@ -285,17 +291,17 @@
        statusList: [],
        claimVisible: false,
        issuedVisible: false,
        issuedReasonVisible:false,
        issuedReasonVisible: false,
        approveVisible: false,
        approveReasonVisible:false,
        fullscreen:false,
        loadingApproveReason:false,
        loadingApprove:false,
        loadingIssuedReason:false,
        loadingIssued:false,
        value:``,
        reason:'',
        currentInfo:null,
        approveReasonVisible: false,
        fullscreen: false,
        loadingApproveReason: false,
        loadingApprove: false,
        loadingIssuedReason: false,
        loadingIssued: false,
        value: ``,
        reason: '',
        currentInfo: null,
      }
    },
    mounted() {
@@ -341,20 +347,20 @@
        // this.value = await file.convertFileToHtml(row.url)
        // this.claimVisible = true;
        this.$axios.post(this.$api.insReport.wordToHtml, {
          path:row.urlS?row.urlS:row.url
          }).then(res => {
                    if (res.code === 200) {
          path: row.urlS ? row.urlS : row.url
        }).then(res => {
          if (res.code === 200) {
            // console.log(11111111,res.data)
            this.value = res.data
            .replace(/<a [^>]*>/g, "")
            .replace(/<\/a>/g, "")
            .replace(/&nbsp;/g, "&nbsp;&nbsp;");
              .replace(/<a [^>]*>/g, "")
              .replace(/<\/a>/g, "")
              .replace(/&nbsp;/g, "&nbsp;&nbsp;");
            this.claimVisible = true;
                    }
          }
                }).catch(error => {
                    console.error(error)
                })
        }).catch(error => {
          console.error(error)
        })
      },
      // 权限分配
      getPower(radio) {
@@ -401,106 +407,139 @@
      confirmClaim() {
        // console.log(this.$refs.Word.getValue())
      },
      async selectAllByOne(row){
        console.log(row,await file.convertFileToHtml(row.url));
      async selectAllByOne(row) {
        console.log(row, await file.convertFileToHtml(row.url));
      },
      download(row){
        let url = row.urlS?row.urlS:row.url;
      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();
      },
      handleRestore(row){
      handleRestore(row) {
        this.$axios.post(this.$api.insReport.upReportUrl, {
          id:row.id
          }).then(res => {
                    if (res.code === 200) {
          id: row.id
        }).then(res => {
          if (res.code === 200) {
            this.$message.success('操作成功')
            this.refreshTable()
                    }
                })
          }
        })
      },
      handleIssued(row){
      handleIssued(row) {
        this.currentInfo = row;
        this.issuedVisible = true;
      },
      subIssued(){
      subIssued() {
        this.loadingIssued = true;
        this.$axios.post(this.$api.insReport.examineReport, {
                                id: this.currentInfo.id,
                isExamine: 1
          id: this.currentInfo.id,
          isExamine: 1
        }).then(res => {
          this.loadingIssued = false;
          if (res.code === 201) {
            return
          }
          this.$message.success('提交成功')
          this.refreshTable()
          this.currentInfo = null;
          this.issuedVisible = false;
        }).catch(e => {
          this.$message.error('提交失败')
          this.loadingIssued = false;
        })
      },
      handleApprove(row) {
        this.currentInfo = row;
        this.approveVisible = true;
      },
      subApprove() {
        this.loadingApprove = true;
        this.$axios.post(this.$api.insReport.ratifyReport, {
          id: this.currentInfo.id,
          isRatify: 1
        }).then(res => {
          this.loadingApprove = false;
          if (res.code == 201) {
            this.$message.error('批准失败')
            return
          }
          this.$message.success('已批准')
          this.refreshTable()
          this.currentInfo = null;
          this.approveVisible = false;
        })
      },
      handleSubmit(row) {
        this.$confirm('是否提交当前报告?', "提交", {
          confirmButtonText: "提交",
          cancelButtonText: "取消",
          type: "warning"
        }).then(() => {
          this.$axios.post(this.$api.insReport.writeReport, {
            id: row.id
          }).then(res => {
            if (res.code === 201) {
              return
            }
            this.$message.success('提交成功')
            this.refreshTable()
            this.loadingIssued = false;
            this.currentInfo = null;
            this.issuedVisible = false;
          }).catch(e => {
            this.$message.error('提交失败')
            this.loadingIssued = false;
          })
        }).catch(() => {})
      },
      handleApprove(row){
        this.currentInfo = row;
        this.approveVisible = true;
      },
      subApprove(){
        this.loadingApprove = true;
      },
      handleSubmit(row){
        this.$confirm('是否提交当前报告?', "提交", {
                            confirmButtonText: "提交",
                            cancelButtonText: "取消",
                            type: "warning"
                        }).then(() => {
                            this.$axios.post(this.$api.insReport.writeReport, {
                                id: row.id
                            }).then(res => {
                                if (res.code === 201) {
                                    return
                                }
                                this.$message.success('提交成功')
                                this.refreshTable()
                            }).catch(e => {
                                this.$message.error('提交失败')
                            })
                        }).catch(() => {})
      },
      handleIssuedReason(){
        if(!this.reason){
      handleIssuedReason() {
        if (!this.reason) {
          return this.$message.error('请输入原因')
        }
        this.loadingIssuedReason = true;
        this.$axios.post(this.$api.insReport.examineReport, {
                                id: this.currentInfo.id,
                isExamine: 0,
                examineTell:this.reason
          }).then(res => {
            if (res.code === 201) {
              return
            }
            this.$message.success('操作成功')
            this.refreshTable()
            this.loadingIssuedReason = false;
            this.currentInfo = null;
            this.reason = '';
            this.issuedVisible = false;
            this.issuedReasonVisible = false;
          }).catch(e => {
            this.$message.error('操作失败')
            this.loadingIssuedReason = false;
          })
          id: this.currentInfo.id,
          isExamine: 0,
          examineTell: this.reason
        }).then(res => {
          this.loadingIssuedReason = false;
          if (res.code === 201) {
            return
          }
          this.$message.success('操作成功')
          this.refreshTable()
          this.currentInfo = null;
          this.reason = '';
          this.issuedVisible = false;
          this.issuedReasonVisible = false;
        }).catch(e => {
          this.$message.error('操作失败')
          this.loadingIssuedReason = false;
        })
      },
      handleApproveReason(){
        if(!this.reason){
      handleApproveReason() {
        if (!this.reason) {
          return this.$message.error('请输入原因')
        }
        this.loadingApproveReason = true
        this.$axios.post(this.$api.insReport.examineReport, {
          id: this.currentInfo.id,
          isExamine: 0,
          examineTell: this.reason
        }).then(res => {
          this.loadingApproveReason = false
          if (res.code === 201) {
            return
          }
          this.$message.success('操作成功')
          this.refreshTable()
          this.currentInfo = null;
          this.reason = '';
          this.issuedVisible = false;
          this.issuedReasonVisible = false;
        }).catch(e => {
          this.$message.error('操作失败')
          this.loadingIssuedReason = false;
        })
      }
    }
  }