Newer
Older
smart-metering-front / src / views / business / lab / components / distributeDialog.vue
bairujie on 28 Mar 2023 5 KB 任务分发修改
<script setup lang="ts" name="DistributeDialog">
import { Aim } from '@element-plus/icons-vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getDictByCode } from '@/api/system/dict'
import type { dictType } from '@/global'
import { allocate, executiveDetail } from '@/api/business/schedule/task'
// 实验室任务分发弹窗

// 自定义方法:close关闭弹窗
const emit = defineEmits(['close'])
const dialogVisible = ref(false) // 弹窗显示
const sampleId = ref('') // 样品id
const orderId = ref('') // 委托单id

// 委托书-证书类别列表
const certificationTypes = ref<dictType[]>([])
// 获取字典值
function getDict() {
  getDictByCode('certificationType').then((response) => {
    certificationTypes.value = response.data
  })
}
// 样品详情
const sampleDetail = ref({
  sampleName: '',
  measureContent: '',
  certifications: [] as any,
  remark: '',
  laboratoryId: '',
  deptId: '',
})

const processNode = ref({
  id: '', // 检测节点id
  executiveItem: '', // 检测项目
  executiveDept: '', // 检测部门
  executiveDeptName: '', // 检测部门
  executivePerson: '', // 检测人员
  executivePersonName: '', // 检测人员
  measureState: '0', // 检测状态:待分发,待分配,待检测,检测中,检测完,退回,取消
  measureStateName: '', // 检测状态
  currentCertifications: '', // 当前证书数
  requireCertifications: '', // 应出具证书数
  updateTime: '', // 更新时间
  backPerson: '', // 退回人
  backReason: '', // 退回原因
  backTime: '', // 退回时间
  distributePerson: '', // 分配人
  distributeTime: '', // 分配时间
  startTime: '', // 检测开始时间
  overTime: '', // 检测结束时间
  measurePersonId: '', // 检定人员id
  measureSegmentId: '', // 实验室id
})

// 初始化弹窗
const initDialog = (id: string, sampleid: string, orderid: string) => {
  dialogVisible.value = true
  sampleId.value = sampleid
  orderId.value = orderid
  executiveDetail({ orderId: orderid, sampleId: sampleid }).then((res) => {
    if (res.data) {
      sampleDetail.value = res.data
      sampleDetail.value.laboratoryId = id
      sampleDetail.value.deptId = res.data.measureProcessList[0].id
      // 证书类别
      console.log(res.data.certifications)
      sampleDetail.value.certifications = ['1'] // 接口未提供字段,默认先使用1
      // sampleDetail.value.certifications = res.data.certifications.split(',')
    }
  })
}

// 选择人员
const choosePersonShow = ref(false)
const choosePerson = () => {
  choosePersonShow.value = true
}
// 人员选择完毕
const choosePersonOver = (person: { id: string; name: string; measurePersonId: string; measureSegmentId: string }) => {
  console.log(person)
  processNode.value.executivePerson = person.id
  processNode.value.executivePersonName = person.name
  processNode.value.measurePersonId = person.measurePersonId
  processNode.value.measureSegmentId = person.measureSegmentId
  choosePersonShow.value = false
}

// 流程配置组件
const processConfigRef = ref()
// 保存流程按钮点击分配
const saveProcess = () => {
  // ctx.emit('fetchData') // fatherMethod 是想要调用父组件的一个方法

  const postData = {
    id: sampleDetail.value.laboratoryId, // 实验室检测id
    measurePersonId: processNode.value.executivePerson, // 分配检定人员id(在本部门下的计量人员列表中选择)
    requireCertifications: processNode.value.requireCertifications, // 应出具证书总数
  }
  allocate(postData).then((res: { code: number }) => {
    if (res.code == 200) {
      ElMessage.success('分配成功')
    }
  })
  emit('close')
}

function cancel() {
  dialogVisible.value = false
}
getDict()

// ----------------------- 以下是暴露的方法内容 ----------------------------
defineExpose({ initDialog })
</script>

<template>
  <el-dialog v-model="dialogVisible" title="任务分发" width="700" @close="cancel">
    <div class="simple-info">
      <div class="simple-info-line">
        <span class="label">样品名称:</span>
        <el-input v-model="sampleDetail.sampleName" disabled style="width: 280px;" />
      </div>
      <div class="simple-info-line">
        <span class="label">证书类别:</span>
        <el-checkbox-group v-model="sampleDetail.certifications" disabled>
          <el-checkbox v-for="item in certificationTypes" :key="item.value" :label="item.value">
            {{ item.name }}
          </el-checkbox>
        </el-checkbox-group>
      </div>
      <div class="simple-info-line">
        <span class="label">检定项目:</span>
        <el-input v-model="sampleDetail.measureContent" disabled style="width: 480px;" />
      </div>
      <div class="simple-info-line">
        <span class="label">备注:</span>
        <el-input v-model="sampleDetail.remark" disabled style="width: 480px;" />
      </div>
      <div class="simple-info-line">
        <span class="label">检定人员:</span>
        <el-input v-model="processNode.executivePersonName" readonly class="process-input" style="width: 180px;">
          <template #append>
            <el-button :icon="Aim" size="small" link @click="choosePerson" />
          </template>
        </el-input>
      </div>
      <div class="simple-info-line">
        <span class="label">应出具证书:</span>
        <el-input v-model="processNode.requireCertifications" style="width: 50px;margin-right: 10px;" /> 份
      </div>
    </div>
    <template #footer>
      <el-button type="primary" @click="saveProcess">
        分配
      </el-button>
      <el-button @click="cancel">
        取消
      </el-button>
    </template>
    <select-staff-dialog v-model:visible="choosePersonShow" :data="[processNode.executivePerson]" :multi="false" @change="choosePersonOver" />
  </el-dialog>
</template>

<style lang="scss" scoped>
//  样式
.simple-info {
  margin-top: -10px;
  margin-bottom: 10px;

  .simple-info-line {
    display: flex;
    align-items: center;
    margin: 7px 0;

    .label {
      display: block;
      width: 110px;
    }
  }
}
</style>