Newer
Older
smart-metering-front / src / views / business / fieldTest / approve / edit.vue
dutingting on 31 Mar 34 KB 委托书样品证书清单导出
<!-- 现场检测审批详情 -->
<script lang="ts" setup name="FieldTestApproveDetail">
import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus'
import { ref } from 'vue'
import dayjs from 'dayjs'
import selectStaffList from '../components/selectStaffList.vue'
import type { IForm, dictType } from './approve-interface'
import { cancelApproval, fetchApproval, submitApproval } from '@/api/approval'
import ApprovalDialog from '@/components/Approval/ApprovalDialog.vue'
import type { IAddress } from '@/components/AddressSelect/address-interface'
import type { TableColumn } from '@/components/NormalTable/table_interface'
import { getDictByCode } from '@/api/system/dict'
import type { IOrderList } from '@/views/business/schedule/order/orderList_interface'
import selectOrder from '@/views/business/schedule/interchangeReceipt/selectOrder.vue'
import useUserStore from '@/store/modules/user'
import { getUserList } from '@/api/system/user'
import { SCHEDULE } from '@/utils/scheduleDict'
import { printPdf } from '@/utils/printUtils'
import type { userType } from '@/views/system/user/user-interface'
import { getPhotoUrl } from '@/api/system/tool'
import SelectDeviceDialog from '@/views/device/receive/selectDeviceDialog.vue'
import { addFieldTestApproveList, failUpdateFieldTestApprove, getDetail, submit, updateFieldTestApprove } from '@/api/business/fieldTest/apply'
const user = useUserStore() // 用户信息
const { proxy } = getCurrentInstance() as any
const $router = useRouter() // 关闭页面使用
const usePersonList = ref<userType[]>([]) // 申请人列表(用户)
const usePersonOptions = ref<userType[]>([]) // 申请人列表(用户)--模糊搜索数据
const applyPersonLoading = ref(false) // 申请人模糊搜索框loading
const approvalStatusName = ref('') // 审批状态名称
const textMap: { [key: string]: string } = {
  edit: '编辑',
  add: '新建',
  detail: '详情',
}// 字典
const pageType = ref('add') // 页面类型: add, edit, detail
const infoId = ref('') // 列表id
const submitId = ref('') // 新建提交时所用的id
const $route = useRoute() // 路由参数
const ruleFormRef = ref<FormInstance>() // 表单ref
const decisionItem = ref('') // 同意、驳回、拒绝按钮权限
const taskId = ref('') // 任务id,用于同意、驳回、拒绝审批
const approvalDialog = ref() // 审批对话ref
const form = ref<IForm>({
  siteExecutiveNo: '', // 现场检测编号
  siteExecutiveName: '', // 现场检测名字
  applyPerson: '', // 申请人
  applyPersonName: '', // 申请人名称
  applyTime: '', // 申请时间
  directorId: '', // 负责人id
  directorName: '', // 负责人
  taskSource: '', // 任务来源-字典code
  taskSourceName: '', // 任务来源-字典value
  orderCode: '', // 委托单编号
  orderId: '', // 委托单id
  customerId: '', // 委托方id
  customerNo: '', // 委托方代码
  customerName: '', // 委托方名称
  customerAddress: '', // 委托方地址
  phone: '', // 委托方电话
  deliverer: '', // 送检人
  delivererTel: '', // 送样人联系方式
  preCost: '', // 预计计量费用
  preStartTime: '', // 预计开始时间
  preEndTime: '', // 预计结束时间
  executiveAddress: '', // 检测地址
  executiveEnvironment: '', // 现场环境条件
  executiveItem: '', // 现场测试、校准或检定项目
  hazardSourceAndPreventionMethod: '', // 主要危害源及预防措施
  meterStaffList: [] as any, // 现场测试、校准或检定人员
  equipmentInfoList: [] as any, // 携带仪器设备
  remark: '', // 备注
  processId: '', // 流程实例id

  rejectRemark: '', // 历次原因
})

// 自定义校验规则--要求预计结束时间大于预计开始时间
const requireOverTimeValid = (rule: any, value: any, callback: any) => {
  if (!value) {
    return callback(new Error('预计结束时间必填'))
  }
  if (new Date(form.value.preEndTime).getTime() <= new Date(form.value.preStartTime).getTime()) {
    return callback(new Error('不能小于预计开始时间'))
  }
  callback()
}
// 校验规则
const formRules = ref<FormRules>({
  directorId: [{ required: true, message: '要求负责人必填', trigger: ['blur', 'change'] }],
  taskSource: [{ required: true, message: '要求任务来源必填', trigger: ['blur', 'change'] }],
  preCost: [{ required: true, message: '要求预计计量费用必填', trigger: ['blur', 'change'] },
    { pattern: /^(?!0+(?:\.0+)?$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$/, message: '要求大于0,且最多保留两位小数', trigger: ['blur', 'change'] }],
  preStartTime: [{ required: true, message: '要求预计开始时间必填', trigger: ['blur', 'change'] }],
  preEndTime: [{ required: true, type: 'date', validator: requireOverTimeValid, trigger: 'change' }],
  // preEndTime: [{ required: true, message: '要求预计结束时间必填', trigger: ['blur', 'change'] }],
  executiveAddress: [{ required: true, message: '要求现场测试、校准或检定地点必填', trigger: ['blur', 'change'] }],
  hazardSourceAndPreventionMethod: [{ required: true, message: '要求主要危害源及预防措施必填', trigger: ['blur', 'change'] }],
  executiveEnvironment: [{ required: true, message: '要求现场环境条件必填', trigger: ['blur', 'change'] }],
  executiveItem: [{ required: true, message: '要求现场测试、校准或检定项目必填', trigger: ['blur', 'change'] }],
  orderCode: [{ required: true, message: '要求委托单编号必填', trigger: ['blur', 'change'] }],
})
// -----------------------------------------------路由参数---------------------------------
if ($route.params && $route.params.type) {
  pageType.value = $route.params.type as string
  if ($route.params.id) {
    infoId.value = $route.params.id as string
  }
}
// ---------------------------------------------负责人-----------------------------------
// 选择器模糊查询
const remoteMethod = (query: string) => {
  if (query) {
    applyPersonLoading.value = true
    setTimeout(() => {
      applyPersonLoading.value = false
      usePersonOptions.value = usePersonList.value.filter((item) => {
        return item.name.toLowerCase().includes(query.toLowerCase())
      })
    }, 200)
  }
  else {
    usePersonOptions.value = usePersonList.value
  }
}
// 获取用户列表(增加模糊查询)
const fetchUserList = () => {
  getUserList({ offset: 1, limit: 999999 }).then((res: any) => {
    usePersonList.value = res.data.rows
    usePersonOptions.value = res.data.rows
  })
}
// ---------------------------------------------字典------------------------------------
const taskSourceMap = ref<dictType[]>([]) // 任务来源
function getDict() {
  // 任务来源
  getDictByCode('taskSource').then((response) => {
    taskSourceMap.value = response.data
  })
}
// -----------------------------------------------选择委托单-----------------------------
const orderVisible = ref(false) // 控制委托单对话框显隐
// 点击选择委托单编号
const handleClickOrder = () => {
  orderVisible.value = true
}
// 修改委托单对话框显隐
const changeOrderVisible = (val: boolean) => {
  orderVisible.value = val
}
// 选好委托单
const confirmCheckoutOrder = (val: Array<IOrderList>) => {
  if (val && val.length) {
    form.value.orderCode = val[0].orderCode // 委托单编号
    form.value.orderId = val[0].id // 委托单id
    form.value.customerNo = val[0].customerNo // 委托方代码
    form.value.customerId = val[0].customerId // 委托方id
    form.value.customerName = val[0].customerName // 委托方名称
    form.value.customerAddress = val[0].customerAddress // 委托方地址
    form.value.deliverer = val[0].deliverer // 联系人
    form.value.delivererTel = val[0].delivererTel // 委托方名称
  }
}
// ----------------------------------------审批流程-------------------------------------
const approvalRecordData = ref([]) // 审批流程数据
// 查询审批记录
function getApprovalRecord(processId: string) {
  if (pageType.value !== 'add') {
    if (processId) {
      fetchApproval(processId).then((res) => {
        approvalRecordData.value = res.data
      })
    }
    else {
      ElMessage.warning('流程实例id为空')
    }
  }
}
// ---------------------------------------现场检测人员----------------------------------
const checkoutMeterPersonList = ref([]) as any// 人员选中列表
const isMultiMerterPerson = ref(false) // 计量人员是否多选
// 人员信息表头
const meterPersonColumns = ref<TableColumn[]>([
  { text: '姓名', value: 'name', width: '220' },
  { text: '人员编号', value: 'staffNo', width: '160' },
  { text: '工作部门', value: 'deptName' },
  { text: '计量专业', value: 'major' },
  { text: '证书编号', value: 'verifierCertificateNo' },
  { text: '证书有效期', value: 'certificateDate', width: '120' },
])
// 记录点击的第几行
const listIndex = ref(0)
// 计量人员Ref
const merterPersonRef = ref()
// 点击选择
const handleClick = (index: number) => {
  isMultiMerterPerson.value = false
  listIndex.value = index // 选择的第几行
  merterPersonRef.value.initDialog()
}
// 选完计量人员
const confirmSelectPerson = (val: any) => {
  if (isMultiMerterPerson.value) { // 批量增加时push
    val.forEach((item: any) => {
    // 只添加列表里不存在的
      const index = form.value.meterStaffList.findIndex((i: any) => item.staffNo === i.staffNo)
      if (index === -1) {
        form.value.meterStaffList.push({
          ...item,
          deptName: item.deptName,
        })
      }
    })
  }
  else { // 单选替换
    const index = form.value.meterStaffList.findIndex((i: any) => val[0].staffNo === i.staffNo)
    if (index !== -1) {
      ElMessage.warning('此人员已添加过')
      return
    }
    form.value.meterStaffList.splice(listIndex.value, 1, val[0])
  }
}
// 增加行
const addMeterPersonRow = () => {
  const index = form.value.meterStaffList.findIndex((item: { name: string }) => !item.name)
  if (index !== -1) {
    ElMessage.warning('请完善上一条人员信息')
    return
  }
  form.value.meterStaffList.push(
    {
      name: '', // 姓名
      staffNo: '', // 人员编号
      deptName: '', // 工作部门
      major: '', // 计量专业
      verifierCertificateNo: '', // 证书编号
      certificateDate: '', // 证书有效期
    },
  )
}
// 删除行
const delMeterPersonRow = () => {
  if (checkoutMeterPersonList.value.length <= 0) {
    ElMessage({
      message: '请选中要删除的行',
      type: 'warning',
    })
  }
  else {
    checkoutMeterPersonList.value.forEach((item: any) => {
      form.value.meterStaffList.forEach((element: any, index: number) => {
        if (element.staffNo === item.staffNo) {
          form.value.meterStaffList.splice(index, 1)
        }
      })
    })
  }
}
// 选中变化
const handleMeterPersonSelectionChange = (val: any) => {
  checkoutMeterPersonList.value = val
}
// 点击批量增加
const multiAddMeterPerson = () => {
  isMultiMerterPerson.value = true
  merterPersonRef.value.initDialog()
}
// --------------------------------------------携带仪器设备------------------------------------------
const checkoutEquipmentList = ref([]) as any// 人员选中列表
const dialogSelectDiviceVisible = ref(false) // 选择设备对话框显隐
// 携带仪器设备表头
const EquipmentColumns = ref<TableColumn[]>([
  { text: '设备名称', value: 'equipmentName', width: '220' },
  { text: '设备编号', value: 'equipmentNo', width: '160' },
  { text: '型号', value: 'modelNo' },
  { text: '出厂编号', value: 'manufacturingNo' },
  { text: '使用部门', value: 'useDeptName' },
  { text: '有效日期', value: 'validDate', width: '120' },
])
// 记录点击的第几行
const listEquipmentIndex = ref(0)
// 点击选择
const handleEquipmentClick = (index: number) => {
  listEquipmentIndex.value = index // 选择的第几行
  dialogSelectDiviceVisible.value = true
}
// 选择设备对话框关闭
const closeDialog = () => {
  dialogSelectDiviceVisible.value = false
}
// 选完设备
const confirmSelectEquipment = (val: any) => {
  const index = form.value.equipmentInfoList.findIndex((i: any) => val[0].equipmentNo === i.equipmentNo)
  if (index !== -1) {
    ElMessage.warning('此设备已添加过')
    return
  }
  form.value.equipmentInfoList.splice(listEquipmentIndex.value, 1, val[0])
}
// 增加行
const addEquipmentRow = () => {
  const index = form.value.equipmentInfoList.findIndex((item: { equipmentNo: string }) => !item.equipmentNo)
  if (index !== -1) {
    ElMessage.warning('请完善上一条设备信息')
    return
  }
  form.value.equipmentInfoList.push(
    {
      equipmentName: '', // 设备名称
      equipmentNo: '', // 设备编号
      modelNo: '', // 型号
      mesureRange: '', // 测量范围
      useDeptName: '', // 使用部门
      usePersonName: '', // 使用人
      managerStateName: '', // 管理状态
      validDate: '', // 有效日期
      equipmentId: '', // 设备ID
    },
  )
}
// 删除行
const delEquipmentRow = () => {
  if (checkoutEquipmentList.value.length <= 0) {
    ElMessage({
      message: '请选中要删除的行',
      type: 'warning',
    })
  }
  else {
    checkoutEquipmentList.value.forEach((item: any) => {
      form.value.equipmentInfoList.forEach((element: any, index: number) => {
        if (element.equipmentNo === item.equipmentNo) {
          form.value.equipmentInfoList.splice(index, 1)
        }
      })
    })
  }
}
// 选中变化
const handleEquipmentSelectionChange = (val: any) => {
  checkoutEquipmentList.value = val
}

// 扫描识别
const scan = () => {

}

// ---------------------------------------------------------------------------------------
// 关闭新增页面的回调
const close = () => {
  $router.back()
}

// 保存
const save = () => {
  if (!form.value.meterStaffList.length) {
    ElMessage.warning('现场测试、校准或检定人员表格不能为空')
    return false
  }
  if (!form.value.equipmentInfoList.length) {
    ElMessage.warning('携带仪器设备表格不能为空')
    return false
  }
  ruleFormRef.value!.validate((valid: boolean) => {
    if (valid) {
      const loading = ElLoading.service({
        lock: true,
        background: 'rgba(255, 255, 255, 0.8)',
      })
      // 保存之前清除空行、避免传给后端无用空对象
      const index = form.value.meterStaffList.findIndex((item: any) => !item.staffNo)
      if (index !== -1) {
        form.value.meterStaffList.splice(index, 1)
      }
      const indexEquipment = form.value.equipmentInfoList.findIndex((item: any) => !item.equipmentNo)
      if (index !== -1) {
        form.value.equipmentInfoList.splice(indexEquipment, 1)
      }
      //
      const equipmentInfoList = form.value.equipmentInfoList.map((item: { id: string }) => {
        return {
          id: item.id,
        }
      })
      const meterStaffList = form.value.meterStaffList.map((item: { id: string }) => {
        return {
          id: item.id,
        }
      })
      const params = {
        ...form.value,
        meterStaffList,
        equipmentInfoList,
      }
      // 新建
      if (pageType.value === 'add') {
        addFieldTestApproveList(params).then((res) => {
          submitId.value = res.data.data
          ElMessage.success('保存成功')
          loading.close()
        }).catch(() => {
          loading.close()
        })
      }
      // 保存
      else if (pageType.value === 'edit') {
        if (approvalStatusName.value === '未通过-驳回') {
          failUpdateFieldTestApprove(params).then((res) => {
            ElMessage.success('保存成功')
            loading.close()
            close()
          }).catch(() => {
            loading.close()
          })
        }
        else {
          updateFieldTestApprove(params).then((res) => {
            ElMessage.success('保存成功')
            loading.close()
            close()
          }).catch(() => {
            loading.close()
          })
        }
      }
    }
    else {
      console.log('表单校验不通过')
    }
  })
}

// 提交表单
const handleSubmit = () => {
  if (submitId.value) {
    const loading = ElLoading.service({
      lock: true,
      background: 'rgba(255, 255, 255, 0.8)',
    })
    const params = {
      id: submitId.value,
      formId: SCHEDULE.BUSINESS_FIELDTEST_APPROVE, // 表单id
    }
    submit(params).then(() => {
      ElMessage.success('提交成功')
      loading.close()
      close()
    })
  }
  else {
    ElMessage.warning('请先保存再提交!')
  }
}

// 审批结束回调
const approvalSuccess = () => {
  close() // 返回上一页
}
// 审批
const handleApprove = (val: string, title = '') => {
  if (val === '取消') {
    const params = {
      processInstanceId: form.value.processId!,
      comments: '',
    }
    ElMessageBox.confirm(
      '确认取消该审批吗?',
      '提示',
      {
        confirmButtonText: '确认',
        cancelButtonText: '取消',
        type: 'warning',
      },
    )
      .then(() => {
        cancelApproval(params).then((res) => {
          ElMessage({
            type: 'success',
            message: '取消成功',
          })
          close()
        })
      })
  }
  else if (val === '同意') {
    approvalDialog.value.initDialog('agree', taskId.value)
  }
  else if (val === '驳回') {
    approvalDialog.value.initDialog('reject', taskId.value)
  }
  else if (val === '拒绝') {
    approvalDialog.value.initDialog('refuse', taskId.value)
  }
}

// 获取详细信息
const getInfo = async () => {
  const loading = ElLoading.service({
    lock: true,
    background: 'rgba(255, 255, 255, 0.8)',
  })
  const res = await getDetail({ id: infoId.value })
  form.value = res.data
  form.value.meterStaffList = res.data.meterStaffList.map((item: any) => {
    return {
      ...item,
      certificateDate: item.certificateDate ? dayjs(item.certificateDate).format('YYYY-MM-DD') : '',
    }
  }) // 现场测试、校准或检定人员
  form.value.equipmentInfoList = res.data.equipmentInfoList.map((item: any) => {
    return {
      ...item,
      validDate: item.validDate ? dayjs(item.validDate).format('YYYY-MM-DD') : '',
    }
  }) // 携带仪器设备
  form.value.siteExecutiveName = '现场检测审批单' // 现场检测审批名字
  form.value.applyPerson = user.id// 申请人
  form.value.applyPersonName = user.name // 申请人名字
  loading.close()
}
// 打印
const print = () => {
  // getPhotoUrl(printFileName as string).then((res) => {
  //   const url = res.data
  //   printPdf(res.data)
  // })
}

onMounted(async () => {
  fetchUserList() // 获取用户列表
  await getDict()// 字典
  form.value.processId = $route.query.processId as string // 任务id
  approvalStatusName.value = $route.query.approvalStatusName as string // 审批类型名称
  decisionItem.value = $route.query.decisionItem as string // 同意、驳回、拒绝按钮权限
  taskId.value = $route.query.taskId as string // 流程实例id
  if (pageType.value !== 'add') {
    await getInfo() // 获取详情
    if (approvalStatusName.value !== '草稿箱') {
      getApprovalRecord(form.value.processId)
    }
  }
  form.value.siteExecutiveName = '现场检测审批单' // 现场检测审批名字
  form.value.applyPerson = user.id// 申请人
  form.value.applyPersonName = user.name // 申请人名字
  form.value.applyTime = dayjs().format('YYYY-MM-DD HH-mm:ss')// 申请时间
})

// 监听到驳回原因
const giveRejectRemark = (reason: string) => {
  if (form.value.rejectRemark) {
    const lastIndex = form.value.rejectRemark.lastIndexOf(reason)
    if (lastIndex === -1) { // 本次原因和上次最后一次原因不同才去拼接
      form.value.rejectRemark = `${form.value.rejectRemark};${reason}`
    }
  }
  else {
    form.value.rejectRemark = reason
  }
}
</script>

<template>
  <app-container>
    <detail-page :title="`现场检测审批-${textMap[pageType]}`">
      <template #btns>
        <el-button v-if="pageType === 'detail' && approvalStatusName === '待审批'" type="primary" @click="handleApprove('同意')">
          同意
        </el-button>
        <el-button v-if="pageType === 'detail' && approvalStatusName === '待审批' && decisionItem !== '3'" type="primary" @click="handleApprove('驳回')">
          驳回
        </el-button>
        <el-button v-if="pageType === 'detail' && approvalStatusName === '待审批' && decisionItem !== '2'" type="danger" @click="handleApprove('拒绝')">
          拒绝
        </el-button>

        <el-button v-if="pageType === 'add'" type="primary" @click="handleSubmit">
          提交
        </el-button>
        <el-button v-if="pageType !== 'detail'" type="primary" @click="save">
          保存
        </el-button>
        <!-- <el-button v-if="pageType === 'detail' && approvalStatusName === '已通过' " type="primary" @click="print">
          打印
        </el-button> -->
        <el-button v-if="pageType === 'detail' && approvalStatusName === '审批中'" type="info" @click="handleApprove('取消')">
          取消
        </el-button>
        <el-button type="info" @click="close">
          关闭
        </el-button>
      </template>
      <el-form
        ref="ruleFormRef"
        :model="form"
        label-width="200"
        label-position="right"
        :rules="formRules"
      >
        <el-row :gutter="24">
          <el-col :span="8">
            <el-form-item label="现场检测编号:" prop="siteExecutiveNo">
              <el-input v-model="form.siteExecutiveNo" disabled placeholder="系统自动生成" />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="现场检测名称:" prop="siteExecutiveName">
              <el-input
                v-model="form.siteExecutiveName"
                :placeholder="pageType === 'detail' ? '' : '请输入现场检测名称'"
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="申请人:">
              <el-input
                v-model="form.applyPersonName" disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="申请时间:" prop="applyTime">
              <el-date-picker
                v-model="form.applyTime"
                type="datetime"
                format="YYYY-MM-DD HH:mm:ss"
                value-format="YYYY-MM-DD HH:mm:ss"
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="负责人:" prop="directorId">
              <el-select
                v-model="form.directorId"
                placeholder="请选择负责人"
                class="full-width-input"
                :disabled="pageType === 'detail'"
                filterable
                remote
                remote-show-suffix
                :remote-method="remoteMethod"
                :loading="applyPersonLoading"
              >
                <el-option v-for="item in usePersonOptions" :key="item.id" :label="item.name" :value="item.id" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="任务来源:" prop="taskSource">
              <el-select
                v-model="form.taskSource"
                :placeholder="pageType === 'detail' ? '' : '请选择任务来源'"
                :disabled="pageType === 'detail'"
                class="full-width-input"
              >
                <el-option v-for="item of taskSourceMap" :key="item.value" :label="item.name" :value="item.value" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="关联委托单编号:" prop="orderCode">
              <el-input
                v-model="form.orderCode"
                :placeholder="pageType === 'detail' ? '' : '请选择委托单编号'"
                :class="{ 'detail-input': pageType === 'detail' }"
                disabled
              >
                <template v-if="pageType !== 'detail'" #append>
                  <el-button size="small" @click="handleClickOrder">
                    选择
                  </el-button>
                </template>
              </el-input>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="委托方代码:" prop="customerNo">
              <el-input
                v-model="form.customerNo"
                :placeholder="pageType === 'detail' ? '' : '请输入委托方代码'"
                :class="{ 'detail-input': pageType === 'detail' }"
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="委托方名称:" prop="customerName">
              <el-input
                v-model="form.customerName"
                :placeholder="pageType === 'detail' ? '' : '请输入委托方名称'"
                :class="{ 'detail-input': pageType === 'detail' }"
                disabled
              />
            </el-form-item>
          </el-col>
          <!-- <el-col :span="8">
            <el-form-item label="委托方电话" prop="phone">
              <el-input
                v-model="form.phone"
                :placeholder="pageType === 'detail' ? '' : '请输入委托方电话'"
                :class="{ 'detail-input': pageType === 'detail' }"
                disabled
              />
            </el-form-item>
          </el-col> -->
          <el-col :span="8">
            <el-form-item label="联系人" prop="deliverer">
              <el-input
                v-model="form.deliverer"
                :placeholder="pageType === 'detail' ? '' : '请输入联系人'"
                :class="{ 'detail-input': pageType === 'detail' }"
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="联系方式" prop="delivererTel">
              <el-input
                v-model="form.delivererTel"
                :placeholder="pageType === 'detail' ? '' : '请输入联系方式'"
                :class="{ 'detail-input': pageType === 'detail' }"
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24">
          <el-col :span="16">
            <el-form-item label="委托方地址:" prop="customerAddress">
              <el-input
                v-model="form.customerAddress"
                type="textarea"
                autosize
                :placeholder="pageType === 'detail' ? '' : '请输入委托方地址'"
                :class="{ 'detail-input': pageType === 'detail' }"
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24">
          <el-col :span="8">
            <el-form-item label="预计计量费用(元):" prop="preCost">
              <el-input
                v-model="form.preCost"
                placeholder="请输入预计计量费用"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="预计开始时间:" prop="preStartTime">
              <el-date-picker
                v-model="form.preStartTime"
                type="datetime"
                placeholder="请选择"
                format="YYYY-MM-DD HH:mm:ss"
                value-format="YYYY-MM-DD HH:mm:ss"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="预计结束时间:" prop="preEndTime">
              <el-date-picker
                v-model="form.preEndTime"
                type="datetime"
                placeholder="请选择"
                format="YYYY-MM-DD HH:mm:ss"
                value-format="YYYY-MM-DD HH:mm:ss"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24">
          <el-col :span="16">
            <el-form-item label="现场测试、校准或检定地点:" prop="executiveAddress">
              <el-input
                v-model="form.executiveAddress"
                :placeholder="pageType === 'detail' ? '' : '请输入现场测试、校准或检定地点'"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="24">
          <el-col :span="16">
            <el-form-item label="现场环境条件:" prop="executiveEnvironment">
              <el-input
                v-model="form.executiveEnvironment"
                :placeholder="pageType === 'detail' ? '' : '请输入现场环境条件'"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24">
          <el-col :span="16">
            <el-form-item label="主要危害源及预防措施:" prop="hazardSourceAndPreventionMethod">
              <el-input
                v-model="form.hazardSourceAndPreventionMethod"
                :placeholder="pageType === 'detail' ? '' : '请输入主要危害源及预防措施'"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24">
          <el-col :span="16">
            <el-form-item label="现场测试、校准或检定项目:" prop="executiveItem">
              <el-input
                v-model="form.executiveItem"
                :placeholder="pageType === 'detail' ? '' : '请输入现场测试、校准或检定项目'"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24">
          <el-col :span="16">
            <el-form-item label="备注:" prop="remark">
              <el-input
                v-model="form.remark"
                autosize
                type="textarea"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row v-if="approvalStatusName === '未通过-驳回'" :gutter="20">
          <el-col :span="24">
            <el-form-item label="历次驳回原因:">
              <el-input
                v-model.trim="form.rejectRemark"
                :placeholder="pageType === 'detail' ? '' : '历次驳回原因'"
                class="full-width-input"
                clearable
                type="textarea"
                autosize
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </detail-page>
    <detail-block title="现场测试、校准或检定人员">
      <template v-if="pageType !== 'detail'" #btns>
        <el-button type="primary" @click="multiAddMeterPerson">
          批量添加
        </el-button>
        <el-button type="primary" @click="addMeterPersonRow">
          增加行
        </el-button>
        <el-button type="info" @click="delMeterPersonRow">
          删除行
        </el-button>
      </template>
      <el-table
        :data="form.meterStaffList"
        border
        style="width: 100%;"
        @selection-change="handleMeterPersonSelectionChange"
      >
        <el-table-column v-if="pageType !== 'detail'" type="selection" width="55" />
        <el-table-column align="center" label="序号" width="80" type="index" />
        <el-table-column
          v-for="item in meterPersonColumns"
          :key="item.value"
          :prop="item.value"
          :label="item.text"
          :width="item.width"
          show-overflow-tooltip
          align="center"
        >
          <template v-if="item.text === '姓名' && pageType !== 'detail'" #default="scope">
            <el-input v-model="scope.row[item.value]" disabled :placeholder="`${item.text}`" class="input">
              <template #append>
                <el-button
                  v-if="pageType !== 'detail'"
                  size="small"
                  @click="handleClick(scope.$index)"
                >
                  选择
                </el-button>
              </template>
            </el-input>
          </template>
        </el-table-column>
      </el-table>
    </detail-block>
    <detail-block title="携带仪器设备">
      <template v-if="pageType !== 'detail'" #btns>
        <!-- <el-button type="primary" @click="scan">
          扫描识别
        </el-button> -->
        <el-button type="primary" @click="addEquipmentRow">
          增加行
        </el-button>
        <el-button type="info" @click="delEquipmentRow">
          删除行
        </el-button>
      </template>
      <el-table
        :data="form.equipmentInfoList"
        border
        style="width: 100%;"
        @selection-change="handleEquipmentSelectionChange"
      >
        <el-table-column v-if="pageType !== 'detail'" type="selection" width="55" />
        <el-table-column align="center" label="序号" width="80" type="index" />
        <el-table-column
          v-for="item in EquipmentColumns"
          :key="item.value"
          :prop="item.value"
          :label="item.text"
          :width="item.width"
          align="center"
        >
          <template v-if="item.text === '设备名称' && pageType !== 'detail'" #default="scope">
            <el-input v-model="scope.row[item.value]" disabled :placeholder="`${item.text}`" class="input">
              <template #append>
                <el-button
                  v-if="pageType !== 'detail'"
                  size="small"
                  @click="handleEquipmentClick(scope.$index)"
                >
                  选择
                </el-button>
              </template>
            </el-input>
          </template>
        </el-table-column>
      </el-table>
    </detail-block>
    <detail-block v-if="approvalStatusName !== '草稿箱' && pageType !== 'add'" title="审批流程">
      <!-- 审批流程 -->
      <approval-record ref="approvalRecord" :approval-record-data="approvalRecordData" @give-reject-remark="giveRejectRemark" />
    </detail-block>
    <!-- 选择委托单组件 -->
    <select-order v-model:visible="orderVisible" @confirm-checkout="confirmCheckoutOrder" @change-visible="changeOrderVisible" />
    <!-- 选择计量人员组件列表 -->
    <select-staff-list ref="merterPersonRef" :is-multi-merter-person="isMultiMerterPerson" @add="confirmSelectPerson" />
    <!-- 设备 -->
    <select-device-dialog
      :dialog-select-divice-visible="dialogSelectDiviceVisible"
      :is-multi="false"
      @close-dialog="closeDialog"
      @update-device-confirm="confirmSelectEquipment"
    />
    <!-- 审批弹窗 -->
    <approval-dialog ref="approvalDialog" @on-success="approvalSuccess" />
  </app-container>
</template>