licp
2024-12-19 039b4a3407bf7b6878a564df3324d9da5cfb7527
完成7.4样品接收
已修改1个文件
已添加1个文件
690 ■■■■■ 文件已修改
src/assets/api/controller.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/a7-sample-registration.vue 676 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/api/controller.js
@@ -56,6 +56,7 @@
    processOrder,
    processMethodSearchNew,
    processMethodVerify,
    processSample,
  }
}
@@ -725,3 +726,16 @@
  delVerifyMethodFileList:'/processMethodVerify/delVerifyMethodFileList', // åˆ é™¤éªŒè¯åŽŸå§‹è®°å½•åˆ—è¡¨
  delMethodVerify:'/processMethodVerify/delMethodVerify', // åˆ é™¤æ ‡å‡†æ–¹æ³•更新验证
}
// 7.4检测或校准物品的处置-样品接收
const processSample = {
  pageProcessTotalSample:'/processTotalSample/pageProcessTotalSample',//查看历史
  submitProcessTotalSample :'/processTotalSample/submitProcessTotalSample ',// æäº¤åŽ†å²  ä¼ å‚id
  checkProcessTotalSample:'/processTotalSample/checkProcessTotalSample',//审核  ä¼ å‚id和通过不通过state(中文)
  ratifyProcessTotalSample:'/processTotalSample/ratifyProcessTotalSample',//批准  ä¼ å‚id和通过不通过state(中文)
  pageProcessSample:'/processSample/pageProcessSample',//查询详情  åˆ†é¡µæŸ¥è¯¢é‡Œé¢totaldealId  ä¼ å‚历史的id
  addProcessSample:'/processSample/addProcessSample',//新增详情的数据
  delProcessSample:'/processSample/delProcessSample',//删除 ä¼ å‚id
  doProcessSample:'/processSample/doProcessSample',//修改
  getProcessSample:'/processSample/getProcessSample',// æŸ¥çœ‹ ä¼ å‚id
}
src/components/view/a7-sample-registration.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,676 @@
<template>
  <div class="sample-registration">
    <el-row class="title">
      <el-col :span="20" style="padding-left: 20px;text-align: left;">样品接收</el-col>
    </el-row>
    <el-tabs type="border-card" v-model="activeName" style="height: 100%;" @tab-click="componentData0.entity.totalSampleId=''">
      <el-tab-pane label="填写" name="填写" style="height: 100%;" :key="1">
        <el-button size="small" type="primary" @click="handleAdd0" style="margin-left: 20px;" v-if="addPower">新增</el-button>
        <div class="table" style="height: calc(100% - 200px)" v-if="activeName=='填写'">
          <ValueTable ref="ValueTable0" :url="$api.processSample.pageProcessSample"
      :componentData="componentData0" :key="upIndex0" :delUrl="$api.processSample.delProcessSample" />
        </div>
      </el-tab-pane>
      <el-tab-pane label="历史记录" name="历史记录" style="height: 100%;" :key="2">
        <div class="search">
          <div class="search_thing">
            <div class="search_label">年月:</div>
            <div class="search_input">
              <el-date-picker
                v-model="componentData.entity.month"
                type="month"
                placeholder="选择月" format="yyyy-MM"
                value-format="yyyy-MM" size="small" @change="refreshTable()">
              </el-date-picker>
            </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">
          <ValueTable ref="ValueTable" :url="$api.processSample.pageProcessTotalSample"
            :componentData="componentData" :key="upIndex"/>
        </div>
      </el-tab-pane>
    </el-tabs>
    <!-- å¡«å†™ -->
    <!-- <el-dialog
      title="填写"
      :visible.sync="editDialogVisible"
      width="1000px" :close-on-click-modal="false" :close-on-press-escape="false">
      <template #title>
        <span>填写</span>
        <el-button size="small" type="primary" @click="handleAdd0" style="position: absolute;right: 60px;">新增</el-button>
      </template>
      <div style="max-height: 80vh;overflow-y: auto;" >
        <ValueTable ref="ValueTable0" :url="$api.processTotaldeal.pageProcessDeal"
      :componentData="componentData0" :key="upIndex0" style="height: calc(100% - 10px);" :delUrl="$api.processTotaldeal.delProcessDeal" />
      </div>
    </el-dialog> -->
    <!-- æ–°å¢žæ ·å“ -->
    <el-dialog
      :title="title"
      :visible.sync="addDialogVisible"
      width="400px">
      <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.sampleName"></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.sampleCode"></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-select v-model="addInfo.sampleSupplier" size="small">
                <el-option :label="item.company" :value="item.company" v-for="(item,index) in customPageList" :key="item.id"></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.num"></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.leaveDate"
                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-date-picker
                v-model="addInfo.receiveDate"
                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-input size="small" placeholder="请输入" clearable v-model="addInfo.sampleState"></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.dealTime"
                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-row>
      <span slot="footer" class="dialog-footer">
        <el-button @click="addDialogVisible = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="submitAdd" :loading="addLoading">ç¡® å®š</el-button>
      </span>
    </el-dialog>
    <!-- è¯¦æƒ…/下载/审核/批准 -->
    <el-dialog
      :title="title0"
      :visible.sync="lookDialogVisible"
      width="800px" :class="{downPdf:title0=='下载'}" :modal="title0!='下载'" top="5vh">
      <filePreview v-if="lookDialogVisible" :fileUrl="javaApi+'/word/'+currentInfo.url"
      :currentFile="{}" style="max-height: 70vh;overflow-y: auto;"/>
      <!-- <div class="dialog-body">
        <div id="dialogBody">
          <h4 style="display: flex;align-items: center;flex-direction: column;justify-content: center;">
            <span style="font-size: 20px;">样品处理申请表</span>
            <span>Sample Handing Request Form</span>
          </h4>
          <p style="display: flex;justify-content: space-between;margin-top: 16px;">
            <span>{{ currentInfo.complainNo }}</span>
            <span>NO:</span>
          </p>
          <table border="1" class="tables" cellpadding="10">
            <tr>
              <td>
                <p>序号</p>
                <p class="en">No.</p>
              </td>
              <td>
                <p>样品名称</p>
                <p class="en">Sample name</p>
              </td>
              <td>
                <p>样品编号</p>
                <p class="en">Sample number</p>
              </td>
              <td>
                <p>供样单位</p>
                <p class="en">Sample unit</p>
              </td>
              <td>
                <p>数量</p>
                <p class="en">Quantity</p>
              </td>
              <td>
                <p>处理方式</p>
                <p class="en">Processing</p>
              </td>
              <td>
                <p>时间</p>
                <p class="en">Date</p>
              </td>
            </tr>
            <tr v-for="(item,index) in currentInfo.arr" :key="index">
              <td>{{ index+1 }}</td>
              <td>{{ item.sampleName }}</td>
              <td>{{ item.sampleCode }}</td>
              <td>{{ item.sampleSupplier }}</td>
              <td>{{ item.num }}</td>
              <td>{{ item.dealMethod }}</td>
              <td>{{ item.dealTime }}</td>
            </tr>
          </table>
          <div class="user-info" v-if="title0=='查看'||title0=='下载'">
            <div class="user-info-item">
              <p>填表:<img :src="javaApi+'img/'+currentInfo.submitUrl" :alt="currentInfo.submitUserName" style="width: 100px;height: 60px"></p>
              <p class="en">Filing</p>
            </div>
            <div class="user-info-item">
              <p>审核:<img :src="javaApi+'/img/'+currentInfo.examineUrl" :alt="currentInfo.examineUserName" style="width: 100px;height: 60px"></p>
              <p class="en">Audit</p>
            </div>
            <div class="user-info-item">
              <p>批准:<img :src="javaApi+'/img/'+currentInfo.ratifyUrl" :alt="currentInfo.ratifyUserName" style="width: 100px;height: 60px"></p>
              <p class="en">Approve</p>
            </div>
          </div>
        </div>
      </div> -->
      <span slot="footer" class="dialog-footer" v-if="title0=='审核'||title0=='批准'">
        <el-button @click="submitCheck('不通过')" :loading="noCheckLoading">不通过</el-button>
        <el-button type="primary" @click="submitCheck('通过')" :loading="checkLoading">通 è¿‡</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import ValueTable from '../tool/value-table.vue'
import {exportHtmlToPDF} from '../../util/downHtmlToPDF'
import filePreview from '../tool/file-preview.vue'
export default {
  components: {
    ValueTable,
    filePreview,
  },
  name: "SampleDisposal",
  data() {
    return {
      activeName:'填写',
      title:'新增',
      addDialogVisible:false,
      addLoading:false,
      outLoading:false,
      editDialogVisible:false,
      lookDialogVisible:false,
      title0:'查看',
      noCheckLoading:false,
      checkLoading:false,
      // åŽ†å²åˆ—è¡¨
      componentData: {
          entity: {
            month: null,
            orderBy: {
              field: 'id',
              order: 'desc'
            }
          },
          isIndex: true,
          showSelect: false,
          select: false,
          do: [{
            id: 'handleLook',
            font: '查看',
            type: 'text',
            method: 'handleLook',
          }, {
            id: 'handleDown0',
            font: '下载',
            type: 'text',
            method: 'handleDown0',
            disabFun: (row, index) => {
                        return !row.url
            }
          },
          // {
          //   id: 'handleAdd',
          //   font: '填写',
          //   type: 'text',
          //   method: 'handleAdd',
          //   disabFun: (row, index) => {
          //     return row.submitState=='已提交'
          //   }
          // },
          {
            id: 'handleSubmit',
            font: '提交',
            type: 'text',
            method: 'handleSubmit',
            disabFun: (row, index) => {
                        return !!row.submitState&&row.submitState!='待提交'
            }
          }, {
            id: 'handleCheck',
            font: '审核',
            type: 'text',
            method: 'handleCheck',
            disabFun: (row, index) => {
                        return row.examineState=='通过'||row.submitState=='待提交'
            }
          }, {
            id: 'handleApproval',
            font: '批准',
            type: 'text',
            method: 'handleApproval',
            disabFun: (row, index) => {
                        return row.ratifyState=='通过'||row.submitState=='待提交'
            }
          }],
          tagField: {},
          selectField: {},
          requiredAdd: [],
          requiredUp: [],
          needSort: [],
          inputType:''
      },
      // æ ·å“åˆ—表
      componentData0: {
          entity: {
            totalSampleId: null,
            orderBy: {
              field: 'id',
              order: 'desc'
            }
          },
          isIndex: true,
          showSelect: false,
          select: false,
          do: [{
            id: 'handleAdd0',
            font: '修改',
            type: 'text',
            method: 'handleAdd0'
          },{
            id: 'delete',
            font: '删除',
            type: 'text',
            method: 'doDiy'
          }],
          tagField: {},
          selectField: {},
          requiredAdd: [],
          requiredUp: [],
          needSort: [],
          inputType: ''
      },
      upIndex0: 100,
      entityCopy: {},
      upIndex: 0,
      addInfo:{},//新增样品
      customPageList:[],
      currentInfo:{
        arr:[]
      },//查看的详情
      outPower:true,
      addPower:true,
    };
  },
  mounted() {
    this.entityCopy = this.HaveJson(this.componentData.entity);
    this.getCustomPageList()
    // this.getPower()
  },
  methods: {
    getPower(){
      let power = JSON.parse(sessionStorage.getItem('power'))
      let add = false
      let out = false
      let submitProcessTotaldeal = false
      let checkProcessTotaldeal = false
      let ratifyProcessTotaldeal = false
      for (var i = 0; i < power.length; i++) {
        if (power[i].menuMethod == 'addProcessDeal') {
          add = true
        }
        // if (power[i].menuMethod == 'exportProcessEvaluate') {
        //   out = true
        // }
        if (power[i].menuMethod == 'submitProcessTotaldeal') {
          submitProcessTotaldeal = true
        }
        if (power[i].menuMethod == 'checkProcessTotaldeal') {
          checkProcessTotaldeal = true
        }
        if (power[i].menuMethod == 'ratifyProcessTotaldeal') {
          ratifyProcessTotaldeal = true
        }
      }
      if (!ratifyProcessTotaldeal) {
        this.componentData.do.splice(4, 1)
      }
      if (!checkProcessTotaldeal) {
        this.componentData.do.splice(3, 1)
      }
      if (!submitProcessTotaldeal) {
        this.componentData.do.splice(2, 1)
      }
      if (!add) {
        this.componentData0.do.splice(1, 1)
        this.componentData0.do.splice(0, 1)
      }
      this.addPower = add
    },
    // èŽ·å–é€æ ·å•ä½åˆ—è¡¨
    getCustomPageList(){
      this.$axios.post(this.$api.user.selectCustomPageList,{
        entity: {
          orderBy: {
            field: 'createTime',
            order: 'desc'
          }
        },
        page:{
          current:-1,
          size:-1
        }
      },{headers: {
          'Content-Type': 'application/json'
      }}).then(res=>{
        this.customPageList = res.data.body.records
      }).catch(err=>{});
    },
    refreshTable() {
      this.$refs['ValueTable'].selectList()
    },
    refresh() {
      this.componentData.entity = this.HaveJson(this.entityCopy)
      this.upIndex++
      this.refreshTable()
    },
    // å¡«å†™
    // handleAdd(row){
    //   this.componentData0.entity.totaldealId = row.id
    //   this.editDialogVisible = true
    // },
    // æ‰“开新增界面
    handleAdd0(row){
      if(row){
        this.addInfo = this.HaveJson(row)
        this.title = '编辑'
      }else{
        this.title = '新增'
        this.addInfo = {}
      }
      this.addDialogVisible = true
    },
    // æäº¤æ–°å¢ž
    submitAdd(){
      if(this.addInfo.id){
        // ç¼–辑
        this.addLoading = true
        this.$axios.post(this.$api.processSample.doProcessSample,{
          totalSampleId:this.componentData0.entity.totalSampleId,
          ...this.addInfo
        },{headers: {
            'Content-Type': 'application/json'
        },noQs:false}).then(res=>{
          this.addLoading = false
          if (res.code === 201) return
          this.addDialogVisible = false
          this.$message({
            type: 'success',
            message: '编辑成功!'
          });
          this.$refs.ValueTable0.selectList()
        }).catch(err=>{});
      }else{
        // æ–°å¢ž
        this.addLoading = true
        this.$axios.post(this.$api.processSample.addProcessSample,{
          totalSampleId:this.componentData0.entity.totalSampleId,
          ...this.addInfo
        },{headers: {
            'Content-Type': 'application/json'
        },noQs:false}).then(res=>{
          this.addLoading = false
          if (res.code === 201) return
          this.addDialogVisible = false
          this.$message({
            type: 'success',
            message: '新增成功!'
          });
          this.$refs.ValueTable0.selectList()
        }).catch(err=>{});
      }
    },
    // æäº¤
    handleSubmit(row){
      this.$confirm('是否提交 '+row.month+' æœˆä»½çš„æ•°æ®', '提交', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.$axios.post(this.$api.processSample.submitProcessTotalSample,{
          id:row.id
        }).then(res=>{
          if (res.code === 201) return
          this.$message({
            type: 'success',
            message: '提交成功!'
          });
          this.$refs['ValueTable'].selectList()
        }).catch(err=>{});
      })
    },
    // æŸ¥çœ‹
    handleLook(row){
      // console.log(row)
      // this.title0 = '查看'
      // this.commonFun(row)
      this.activeName = '填写'
      this.componentData0.entity.totalSampleId = row.id
      this.$refs['ValueTable0'].selectList()
    },
    commonFun(row,callbanck){
      this.currentInfo = row
      this.componentData0.entity.totalSampleId = row.id
      this.$axios.post(this.$api.processSample.pageProcessSample,{
        entity:this.componentData0.entity,
        page:{
          current:-1,
          size:-1
        }
      },{headers: {
            'Content-Type': 'application/json'
        }}).then(res=>{
        this.currentInfo.arr = res.data.body.records
        this.lookDialogVisible = true
        if(callbanck){
          callbanck()
        }
      }).catch(err=>{});
    },
    // å®¡æ ¸
    handleCheck(row){
      this.title0 = '审核'
      this.commonFun(row)
    },
    // æ‰¹å‡†
    handleApproval(row){
      this.title0 = '批准'
      this.commonFun(row)
    },
    // æäº¤å®¡æ ¸/批准
    submitCheck(state){
      if(state=='通过'){
        this.checkLoading = true
      }else{
        this.noCheckLoading = true
      }
      if(this.title0=='审核'){
        this.$axios.post(this.$api.processSample.checkProcessTotalSample,{
          id:this.currentInfo.id,
          state:state
        }).then(res=>{
          this.checkLoading = false
          this.noCheckLoading = false
          if (res.code === 201) return
          this.$message({
            type: 'success',
            message: '操作成功!'
          });
          this.$refs['ValueTable'].selectList()
          this.lookDialogVisible = false
        }).catch(err=>{});
      }else if(this.title0=='批准'){
        this.$axios.post(this.$api.processSample.ratifyProcessTotalSample,{
          id:this.currentInfo.id,
          state:state
        }).then(res=>{
          this.checkLoading = false
          this.noCheckLoading = false
          if (res.code === 201) return
          this.$message({
            type: 'success',
            message: '操作成功!'
          });
          this.$refs['ValueTable'].selectList()
          this.lookDialogVisible = false
        }).catch(err=>{});
      }
    },
    // å¯¼å‡ºè¯¦æƒ…
    handleDown0(row){
      // å‰ç«¯ä¸‹è½½
      // this.title0 = '下载'
      // let that = this
      // function down() {
      //   setTimeout(() => {
      //     that.$nextTick(() => {
      //       const element = document.getElementById("dialogBody");
      //       exportHtmlToPDF(element,that.currentInfo.month+' æ ·å“å¤„理申请表').then(res=>{
      //         that.lookDialogVisible = false
      //       })
      //     })
      //   }, 1000);
      // }
      // this.commonFun(row,down)
      // åŽç«¯ä¸‹è½½
      let url = this.javaApi+'/word/'+row.url
      const link = document.createElement('a');
      link.href = url;
      link.download = row.month+' æ ·å“æŽ¥æ”¶è¡¨';
      link.click();
    }
  },
}
</script>
<style scoped>
.title {
    height: 60px;
    line-height: 60px;
  }
  .search {
    background-color: #fff;
    height: 40px;
    display: flex;
    align-items: center;
    position: relative;
  }
  .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 {
    background-color: #fff;
    width: calc(100% - 40px);
    height: calc(100% - 60px - 140px);
    padding: 20px;
  }
  .downPdf{
    opacity: 0 !important;
  }
  .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; /* é»˜è®¤æ¢è¡Œ */
  }
  .user-info{
    display: flex;
    align-items: center;
    justify-content: space-evenly;
    margin-top: 20px;
  }
  .user-info .el-button{
    margin: 0;
  }
  >>>.el-tabs__content{
    height: 100%;
  }
</style>