Newer
Older
xc-business-system / src / views / business / manager / order / detail.vue
dutingting on 29 Nov 40 KB 临时提交
<!-- 任务单详情 -->
<script lang="ts" setup name="OrderDetail">
import type { Ref } from 'vue'
import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
import type { DateModelType, FormInstance, FormRules, UploadUserFile } from 'element-plus'
import dayjs from 'dayjs'
import { fromPairs } from 'lodash-es'
import type { IDetailTableList, IForm } from './order-interface'
import selectEquipmentDialog from './dialog/selectEquipment.vue'
import selectCustomerDialog from './dialog/selectCustomer.vue'
import ReplenishOrBackDialog from './dialog/replenishOrBackDialog.vue'
import selectFieldTestApprovalDialog from './dialog/selectFieldTestApprovalDialog.vue'
import { getDictByCode } from '@/api/system/dict'
import { getUid } from '@/utils/getUid'
import scanSampleDialog from '@/components/ScanSampleDialog/index.vue'
import type { dictType } from '@/global'
import { useCheckList } from '@/commonMethods/useCheckList'
import { useDoubleClickTableRow, useSetAllRowReadable } from '@/commonMethods/useSetAllRowReadable'
import useUserStore from '@/store/modules/user'
import { getUserList } from '@/api/system/user'
import { getAllDeptList, getDept, getDeptTreeList } from '@/api/system/dept'
import { toTreeList } from '@/utils/structure'
import QRcodeDeviceDialog from '@/components/QRcodeDeviceDialog/index.vue'

import { addOrder, getOrderDetail, receiveOrder, updateOrder } from '@/api/business/manager/order'
const textMap: { [key: string]: string } = {
  edit: '编辑',
  add: '新建',
  detail: '详情',
}// 页面类型字典
const user = useUserStore() // 用户信息
const pageType = ref('add') // 页面类型: add, edit, detail
const infoId = ref('') // id
const ruleFormRef = ref() // 表单ref

// 表单
const form: Ref<IForm> = ref({
  orderNo: '', // 任务单编号
  delivererId: '', // 送检人id
  deliverer: '', // 送检人
  customerId: '', // 委托方id
  customerNo: '', // 委托方代码
  customerName: '', // 委托方名称
  customerPhone: '', // 委托方电话
  customerAddress: '', // 委托方地址
  planDeliverTime: '', // 预计送达时间
  requireOverTime: '', // 要求检完时间
  isUrgent: '0', // 是否加急
  maintainMajor: '', // 检修专业
  createUserId: '', // 创建人id
  createUserName: '', // 创建人
  createTime: '', // 创建时间
  measureCompany: '', // 检定(校准)单位
  undertakerId: '', // 承接人id
  undertakerName: '', // 承接人
  undertakeTime: '', // 承接时间
  receiveStatus: '', // 接收状态
  receiveIllustrate: '', // 接收说明
  isOnSiteCheck: 0, // 是否现场检定
  onSiteCheckTime: '', // 现场检定时间
  siteExecutiveId: '', // 现场测试、校准或检定审批单id
  siteExecutiveNo: '', // 现场测试、校准或检定审批单编号
  deptId: '', // 使用部门
  dataSource: '', // 来源模块
})
const onSiteCheckTimeRange = ref<[DateModelType, DateModelType]>(['', '']) // 现场检定时间范围

// 自定义校验规则--要求检完时间不能比预计送达时间大
const requireOverTimeValid = (rule: any, value: any, callback: any) => {
  if (!value) {
    return callback(new Error('要求检完时间不能为空'))
  }
  if (new Date(form.value.planDeliverTime).getTime() >= new Date(form.value.requireOverTime).getTime()) {
    return callback(new Error('要求检完时间应大于预计送达时间'))
  }
  callback()
}
const rules = reactive<FormRules>({ // 表单验证规则
  deliverer: [{ required: true, message: '送检人不能为空', trigger: 'blur' }],
  customerName: [{ required: true, message: '委托方不能为空', trigger: ['change', 'blur'] }],
  // customerPhone: [{ required: true, message: '电话不能为空', trigger: 'change' }],
  planDeliverTime: [{ type: 'date', required: true, message: '预计送达时间不能为空', trigger: 'change' }],
  requireOverTime: [{ required: true, type: 'date', validator: requireOverTimeValid, trigger: 'change' }],
  isUrgent: [{ required: true, message: '是否加急不能为空', trigger: 'change' }],
  maintainMajor: [{ required: true, message: '检修专业不能为空', trigger: 'blur' }],
  receiveIllustrate: [{ required: true, message: '接收说明不能为空', trigger: 'blur' }],
  isOnSiteCheck: [{ required: true, message: '是否现场检定不能为空', trigger: 'blur' }],
  onSiteCheckTime: [{ required: true, message: '现场检定时间不能为空', trigger: 'blur' }],
  deptId: [{ required: true, message: '使用部门不能为空', trigger: 'blur' }],
})

// -------------------------------------------字典------------------------------------------
const isUrgentList = ref<dictType[]>([])// 是否加急
const statusList = ref<dictType[]>([])// 接收状态
const statusMap = ref({}) as any // 检定完成度、样品检定状态
const userList = ref<{ [key: string]: string }[]>([]) // 用户列表

// 获取字典值
async function getDict() {
  // 获取用户列表
  getUserList({ offset: 1, limit: 999999 }).then((res: any) => {
    userList.value = res.data.rows
  })
  // 检测完成度
  getDictByCode('sampleStatus').then((res) => {
    res.data.forEach((item: any) => {
      statusMap.value[`${item.value}`] = item.name
    })
  })
  // 是否加急
  const resIsUrgent = await getDictByCode('isUrgent')
  isUrgentList.value = resIsUrgent.data

  // 接收状态
  const resStatus = await getDictByCode('orderStatus')
  statusList.value = resStatus.data
}
// -----------------------------------------路由参数----------------------------------------
// 从路由中获取页面类型参数
const $route = useRoute()
if ($route.params && $route.params.type) {
  pageType.value = $route.params.type as string
  if ($route.params.id) {
    infoId.value = $route.params.id as string
  }
}
console.log('页面类型', pageType.value)

// -------------------------------------------表格(任务单列表)------------------------------------------
const list = ref<IDetailTableList[]>([])// 表格数据
const selectEquipmentRef = ref() // 选择智能模型组件ref
const isMulti = ref(false) // 表格是否多选
const selectIndex = ref(0) // 选择的第几列
const checkoutList = ref<IDetailTableList[]>([]) // 选中的内容
const columns = ref([]) as any // 表头

const columnsAdd = ref([
  // { text: '统一编号', value: 'sampleNo', align: 'center', width: '240', disabled: true, required: true },
  { text: '智能模型名称', value: 'sampleName', width: '240', align: 'center', disabled: true, required: true },
  { text: '规格型号', value: 'sampleModel', align: 'center', required: false },
  { text: '出厂编号', value: 'manufactureNo', align: 'center', required: false },
  { text: '厂商', value: 'manufacturer', align: 'center', required: false },
  // { text: '辅助字段', value: 'helpInstruction', align: 'center', required: false },
  // { text: '使用状态', value: 'usageStatusName', align: 'center', required: false },
  { text: '附件', value: 'appendixDescn', align: 'center', required: false },
  // { text: '外观和功能检查', value: 'appearanceInspect', align: 'center', required: false },
  { text: '特殊要求', value: 'specialRequire', align: 'center', required: false },
  // { text: '接收状态', value: 'specialRequire', align: 'center', required: false },
  // { text: '接收状态说明', value: 'specialRequire', align: 'center', required: false },
  // { text: '接收状态说明', value: 'specialRequire', align: 'center', required: false },
  // { text: '检校项目', value: 'measureContent', align: 'center', required: true },
])
const detailColumns = ref([
  // // { text: '统一编号', value: 'sampleNo', align: 'center', width: '240', disabled: true, required: true },
  // { text: '智能模型名称', value: 'sampleName', align: 'center', required: false },
  // { text: '规格型号', value: 'sampleModel', align: 'center', required: false },
  // { text: '出厂编号', value: 'manufactureNo', align: 'center', required: false },
  // { text: '厂商', value: 'manufacturer', align: 'center', required: false },
  // { text: '辅助字段', value: 'helpInstruction', align: 'center', required: false },
  // // { text: '使用状态', value: 'usageStatusName', align: 'center', required: false },
  // { text: '附件', value: 'appendixDescn', align: 'center', required: false },
  // // { text: '外观和功能检查', value: 'appearanceInspect', align: 'center', required: false },
  // { text: '特殊要求', value: 'specialRequire', align: 'center', required: false },
  // { text: '接收状态', value: 'receiveStatusName', align: 'center', required: false },
  // { text: '接收状态说明', value: '1', align: 'center', required: false },
  // { text: '特殊要求', value: 'specialRequire', align: 'center', required: false },
  // // { text: '检校项目', value: 'measureContent', align: 'center', required: true },
  // // { text: '受检智能模型状态', value: 'sampleStatusName', align: 'center' },
  // // { text: '检测完成度', value: 'measureCompletePercent', align: 'center' },
  // { text: '检定结果', value: 'measureCompletePercent', align: 'center' },
  // { text: '检定完成时间', value: 'measureCompleteTime', align: 'center', width: '180' },
  // { text: '检定说明', value: 'measureCompleteTime', align: 'center', width: '180' },

  // { text: '统一编号', value: 'sampleNo', align: 'center', width: '240', disabled: true, required: true },
  { text: '智能模型名称', value: 'sampleName', align: 'center', width: '240', disabled: true, required: true },
  { text: '型号规格', value: 'sampleModel', align: 'center', required: false },
  { text: '出厂编号', value: 'manufactureNo', align: 'center', required: false },
  { text: '厂商', value: 'manufacturer', align: 'center', required: false },
  { text: '辅助字段', value: 'helpInstruction', align: 'center', required: false },
  // { text: '使用状态', value: 'usageStatusName', align: 'center', required: false },
  { text: '附件', value: 'appendixDescn', align: 'center', required: false },
  // { text: '外观和功能检查', value: 'appearanceInspect', align: 'center', required: false },
  { text: '特殊要求', value: 'specialRequire', align: 'center', required: false },
  // { text: '检校项目', value: 'measureContent', align: 'center', required: true },
  { text: '受检智能模型状态', value: 'sampleStatusName', align: 'center' },
  { text: '检测完成度', value: 'measureCompletePercent', align: 'center' },
  { text: '检定完成时间', value: 'measureCompleteTime', align: 'center', width: '180' },
])

// 多选发生改变时
const handleSelectionChange = (e: any) => {
  checkoutList.value = e
}

// 点击选择
const selectEquipment = (index: number) => {
  isMulti.value = false
  selectIndex.value = index
  selectEquipmentRef.value.initDialog(isMulti.value, form.value.customerId)
}

// 点击批量添加
const multiAdd = () => {
  if (!form.value.customerId) {
    ElMessage.warning('请先选择委托方')
    return false
  }
  isMulti.value = true
  selectEquipmentRef.value.initDialog(isMulti.value, form.value.customerId)
}

// 增加行
const addRow = () => {
  if (!form.value.customerId) {
    ElMessage.warning('请先选择委托方')
    return false
  }
  const checkResult = useCheckList(list.value, columns.value, '任务单列表') // 检查表格
  if (checkResult) {
    // useSetAllRowReadable(list.value)
    list.value.push({
      id: '', // 主键
      sampleId: '', // 智能模型id
      sampleNo: '', // 统一编号\智能模型编号
      sampleName: '', // 智能模型名称
      sampleModel: '', // 规格型号
      manufactureNo: '', // 出厂编号
      manufacturer: '', // 厂商
      appendixDescn: '', // 附件
      appearanceInspect: '', // 外观和功能检查
      specialRequire: '', // 特殊要求
      measureContent: '', // 检校项目
      editable: true,
    })
  }
}

// 选好智能模型
const clickConfirmEquipment = (val: Array<IDetailTableList>) => {
  console.log(val[0])

  if (isMulti.value) { // 多选
    val.forEach((item: IDetailTableList) => {
      // 只添加列表里不存在的
      const index = list.value.findIndex((i: IDetailTableList) => item.id === i.sampleId)
      if (index === -1) {
        const param = {
          // ...item,
          id: '', // 主键
          sampleId: item.id!, // 智能模型id
          sampleNo: item.equipmentNo!, // 统一编号\智能模型编号
          sampleName: item.equipmentName!, // 智能模型名称
          sampleModel: item.model!, // 规格型号
          manufactureNo: item.manufactureNo, // 出厂编号
          manufacturer: item.manufacturer, // 厂商
          appendixDescn: '', // 附件
          appearanceInspect: '', // 外观和功能检查
          specialRequire: '', // 特殊要求
          measureContent: '', // 检校项目
          helpInstruction: item.helpInstruction, // 辅助字段
          editable: true,
        }
        list.value.push(param)
      }
    })
  }
  else { // 单选
    const getValue = val[0]
    const index = list.value.findIndex((i: IDetailTableList) => val[0].equipmentNo === i.sampleNo)
    if (index !== -1) {
      ElMessage.warning('此智能模型已添加过')
      return
    }
    const param = {
      id: '', // 主键
      sampleId: getValue.id!, // 智能模型id
      sampleNo: getValue.equipmentNo!, // 统一编号\智能模型编号
      sampleName: getValue.equipmentName!, // 智能模型名称
      sampleModel: getValue.model!, // 规格型号
      appendixDescn: '', // 附件
      appearanceInspect: '', // 外观和功能检查
      manufactureNo: getValue.manufactureNo, // 出厂编号
      manufacturer: getValue.manufacturer, // 厂商
      specialRequire: '', // 特殊要求
      measureContent: '', // 检校项目
      helpInstruction: getValue.helpInstruction, // 辅助字段
      editable: true,
    }
    list.value.splice(selectIndex.value, 1, param)
  }
}

// 删除行
const delRow = () => {
  if (checkoutList.value.length <= 0) {
    ElMessage({
      message: '请选中要删除的行',
      type: 'warning',
    })
  }
  else {
    checkoutList.value.forEach((item: IDetailTableList) => {
      list.value.forEach((element, index) => {
        if (element.sampleNo === item.sampleNo) {
          list.value.splice(index, 1)
        }
      })
    })
  }
}

// =============================补送、退回========================
const replenishOrBackDialogRef = ref() // 补送和退回组件ref
// 补送
const replenish = () => {
  if (!checkoutList.value.length) {
    ElMessage({
      message: '请选中需要补送配件的智能模型',
      type: 'warning',
    })
    return false
  }
  replenishOrBackDialogRef.value.initDialog(checkoutList.value, infoId.value, '补送详情', '1')
}
// 退回
const back = () => {
  if (!checkoutList.value.length) {
    ElMessage({
      message: '请选中需要退回的智能模型',
      type: 'warning',
    })
    return false
  }
  replenishOrBackDialogRef.value.initDialog(checkoutList.value, infoId.value, '退回原因', '2')
}

// 补送、退回完成
const onSuccess = () => {
  pageType.value = 'detail'
}

// ===============================================================
// 双击表格
const dblclick = (row: any) => {
  if (pageType.value !== 'detail' && form.value.receiveStatus !== '2') {
    // useDoubleClickTableRow(row, list.value)
  }
}
// ------------------------------------------委托方-----------------------------------------------
const selectCustomerRef = ref() // 委托方组件ref
// 点击选择委托方
const selectCustomer = () => {
  selectCustomerRef.value.initDialog()
}
// 选好委托方
const clickConfirmCustomer = (val: any) => {
  // 委托方变化智能模型清空
  if (val[0].customerNo !== form.value.customerNo) {
    list.value = []
  }
  if (val && val.length) {
    form.value.customerNo = val[0].customerNo // 委托方代码
    form.value.customerId = val[0].deptId // 委托方id、deptId是受检智能模型系统里的委托方id
    form.value.customerName = val[0].customerName // 委托方名称
    form.value.customerPhone = val[0].mobile // 委托方电话
    form.value.customerAddress = val[0].address // 委托方地址
  }
}
// --------------------------------------------绑定现场审批单-------------------------------------------
const selectFieldTestApprovalRef = ref() // 选择现场测试、校准或检定审批 组件ref
// 点击选择现场审批单
const selectFieldTestApproval = () => {
  selectFieldTestApprovalRef.value.initDialog()
}

// 确定选择
const confirmSelectedFieldTestApproval = (val: any) => {
  form.value.siteExecutiveId = val[0].id
  form.value.siteExecutiveName = val[0].siteExecutiveName
  form.value.siteExecutiveNo = val[0].siteExecutiveNo
}
// ---------------------------------------------其他方法-------------------------------------------
const $router = useRouter()
// 关闭新增页面的回调
const close = () => {
  $router.back()
}
const isFold = ref(true) // 是否展开状态
// 点击展开折叠切换
const trigger = () => {
  isFold.value = !isFold.value
}

// 点击保存
const saveForm = (formEl: FormInstance | undefined) => {
  if (!list.value.length) {
    ElMessage.warning('要求任务单列表不能为空')
    return
  }
  // 检查表格是否存在增加行信息没有完善的情况
  const checkResult = useCheckList(list.value, columns.value, '任务单列表') // 检查表格
  if (!checkResult) {
    return
  }
  useSetAllRowReadable(list.value) // 所有行退出编辑模式
  if (!formEl) { return }
  formEl.validate((valid) => {
    if (valid) {
      ElMessageBox.confirm(
        '确认保存吗?',
        '提示',
        {
          confirmButtonText: '确认',
          cancelButtonText: '取消',
          type: 'warning',
        },
      ).then(() => {
        const loading = ElLoading.service({
          lock: true,
          background: 'rgba(255, 255, 255, 0.8)',
        })
        const params = {
          ...form.value,
          customerPhone: form.value.customerPhone, // 委托方电话
          customerSampleInfoList: list.value,
          id: infoId.value,
        }
        if (pageType.value === 'edit') { // 编辑
          updateOrder(params).then(() => {
            ElMessage.success('已保存')
            loading.close()
            pageType.value = 'detail'
          }).catch(() => {
            loading.close()
          })
        }
        if (pageType.value === 'add') { // 新建
          addOrder(params).then((res) => {
            ElMessage.success('已保存')
            loading.close()
            form.value.orderNo = res.data.orderNo// 任务编号
            infoId.value = res.data.id
            receiveOrder({ id: res.data.id })
            pageType.value = 'detail'
          }).catch(() => {
            loading.close()
          })
        }
      })
    }
  })
}

// 确定选择送检人
const selctedDeliverer = (id: string) => {
  const index = userList.value.findIndex(item => item.id === id)
  if (index !== -1) {
    form.value.deliverer = userList.value[index].name
  }
}

// ---------------------------------------------扫描--------------------------------------
const scanSampleRef = ref()
const QRcodeDeviceDialogRef = ref()
// 点击扫描收添加
const scan = (type: 'scanner' | 'rfid') => {
  if (!form.value.customerId) {
    ElMessage.warning('请先选择委托方')
    return
  }
  if (type === 'scanner') {
    QRcodeDeviceDialogRef.value.initDialog('2', '', 'list', form.value.customerId)
  }
  else {
    // 参数:不是标签绑定,委托书,业务场景
    scanSampleRef.value.initDialog(false, '2', '', 'list', form.value.customerId)
  }
}
// 扫描结束
const scanOver = (sampleList: any) => {
  console.log(sampleList)
  sampleList.forEach((item: any) => {
    list.value.push({
      ...item,
      editable: true, // 是否可编辑
      isExistSample: '1', // 是否存在样品库中 1存在、0不存在
      delId: getUid(),
    })
  })
  scanSampleRef.value.closeDialog()
}
// --------------------------------------------------------------------------------------

// 获取详细信息
const getInfo = () => {
  const loading = ElLoading.service({
    lock: true,
    background: 'rgba(255, 255, 255, 0.8)',
  })
  getOrderDetail({ id: infoId.value }).then((res) => {
    form.value = res.data.data
    form.value.isUrgent = `${res.data.data.isUrgent}` // 是否加急
    list.value = res.data.data.customerSampleInfoList.map((item: { editable: Boolean; sampleStatus: string | number; onSiteCheckTime: string }) => {
      return {
        ...item,
        editable: pageType.value === 'detail' ? false : !(pageType.value === 'edit' && form.value.receiveStatus === '2'),
        sampleStatusName: `${item.sampleStatus}` ? statusMap.value[item.sampleStatus] : item.sampleStatus,
      }
    })
    if (res.data.data.onSiteCheckTime) {
      onSiteCheckTimeRange.value = res.data.data.onSiteCheckTime.split(',')
    }
    loading.close()
  })
}

// 编辑
const edit = () => {
  if (form.value.receiveStatus !== '2') {
    list.value.forEach((item) => {
      item.editable = true
    })
  }

  pageType.value = 'edit'
}
watch(() => pageType.value, (newValue) => {
  if (newValue === 'add') {
    columns.value = columnsAdd.value
  }
  else {
    columns.value = detailColumns.value
  }
}, { immediate: true })

watch(onSiteCheckTimeRange, (val) => { // 监听现场检定时间
  if (val) {
    form.value.onSiteCheckTime = val.join(',')
  }
  else {
    form.value.onSiteCheckTime = ''
  }
})

// ==============================使用部门========================================
const deptList = ref([]) as any // 使用部门列表
// 监听委托方变化,请求使用部门
watch(() => form.value.customerId, (newVal) => {
  if (newVal) {
    // getDeptTreeList({ pid: newVal }).then((res) => {
    //   deptList.value = toTreeList(res.data.map((item: any) => ({ ...item, label: item.name, value: item.id }))) as any
    // })
    form.value.deptId = ''
    getAllDeptList({ pid: newVal }).then((res) => {
      deptList.value = toTreeList(res.data.map((item: any) => ({ ...item, label: item.name, value: item.id }))) as any
    })
  }
}, {
  deep: true,
  immediate: true,
})
// 选中使用部门触发
const nodeClick = (data: any) => {
  form.value.deptName = data.name // 使用部门名称
}
// =============================================================================

onMounted(async () => {
  getDict().then(() => {
    // 非添加页面获取详情
    if (pageType.value === 'edit' || pageType.value === 'detail') {
      getInfo()
    }
    else { // 新建
      form.value.createUserId = user.id// 创建人id
      form.value.createUserName = user.name // 创建人
      form.value.undertakerName = user.name // 承接人
      form.value.undertakerId = user.id // 承接id
      form.value.createTime = dayjs().format('YYYY-MM-DD HH-mm:ss')// 创建时间
      form.value.undertakeTime = dayjs().format('YYYY-MM-DD HH-mm:ss')// 承接时间
      form.value.measureCompany = user.bizLabCode === 'H' ? '海口实验室' : user.bizLabCode === 'X' ? '西昌实验室' : '' // 检定(校准)单位
      form.value.receiveStatus = '1' // 新建的时候就是接收
      form.value.dataSource = '计量业务系统' // 新建的时候就是接收
    }
    isFold.value = pageType.value === 'detail' // 详情折叠,编辑新建展开
  })
})
</script>

<template>
  <div class="order-detail">
    <app-container>
      <detail-page :title="`任务单管理(${textMap[pageType]})`">
        <template #btns>
          <!-- <el-button v-if="pageType === 'detail' && form.receiveStatus === '2'" type="primary" @click="print">
            打印
          </el-button> -->
          <el-button v-if="pageType === 'detail' && (form.receiveStatus === '1' || form.receiveStatus === '2')" type="primary" @click="edit">
            编辑
          </el-button>
          <el-button v-if="pageType === 'detail'" type="primary" @click="trigger">
            展开/折叠
          </el-button>
          <el-button v-if="pageType !== 'detail'" type="primary" @click="saveForm(ruleFormRef)">
            保存
          </el-button>
          <el-button type="info" @click="close">
            关闭
          </el-button>
        </template>
        <el-form
          ref="ruleFormRef"
          :model="form"
          :label-width="130"
          label-position="right"
          :rules="rules"
        >
          <el-row :gutter="24">
            <el-col :span="6">
              <el-form-item label="任务单编号:" prop="orderNo">
                <el-input
                  v-model="form.orderNo"
                  :placeholder="pageType === 'detail' ? '' : '系统自动生成'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  disabled
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="送检人" prop="delivererId">
                <el-input
                  v-if="form.dataSource !== '计量业务系统'"
                  v-model="form.deliverer"
                  :placeholder="pageType === 'detail' ? ' ' : '送检人'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  disabled
                />
                <el-select
                  v-if="form.dataSource === '计量业务系统'"
                  v-model="form.delivererId"
                  filterable
                  :placeholder="pageType === 'detail' ? '' : '请输入送检人'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  :disabled="pageType === 'detail' || (pageType === 'edit' && form.receiveStatus === '2')"
                  @change="selctedDeliverer"
                >
                  <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id" />
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="委托方" prop="customerName">
                <el-input
                  v-model="form.customerName"
                  :placeholder="pageType === 'detail' ? '' : '请选择'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  disabled
                >
                  <template v-if="form.dataSource !== '受检智能模型系统' && (!(pageType === 'detail' || (pageType === 'edit' && form.receiveStatus === '2')))" #append>
                    <el-button size="small" @click="selectCustomer">
                      选择
                    </el-button>
                  </template>
                </el-input>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="使用部门" prop="deptId">
                <el-input v-if="pageType === 'detail' || form.dataSource === '受检智能模型系统'" v-model.trim="form.deptName" disabled />
                <el-tree-select
                  v-if="pageType !== 'detail' && form.dataSource === '计量业务系统'"
                  v-model="form.deptId"
                  style="width: 100%;"
                  :data="deptList"
                  :render-after-expand="false"
                  check-strictly
                  placeholder="使用部门"
                  :disabled="!form.customerId"
                  @node-click="nodeClick"
                />
              </el-form-item>
            </el-col>
            <el-col v-show="!isFold" :span="6">
              <el-form-item label="送检人电话" prop="customerPhone">
                <el-input
                  v-model="form.customerPhone"
                  :placeholder="pageType === 'detail' ? '' : '请输入送检人电话'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  :disabled="pageType === 'detail' || (pageType === 'edit' && form.receiveStatus === '2')"
                />
              </el-form-item>
            </el-col>

            <el-col v-show="!isFold" :span="6">
              <el-form-item label="是否现场检定:" prop="isOnSiteCheck">
                <el-radio-group v-model="form.isOnSiteCheck" :disabled="pageType === 'detail' || (pageType === 'edit' && form.receiveStatus === '2') || form.dataSource === '受检智能模型系统'">
                  <el-radio :label="1">
                    是
                  </el-radio>
                  <el-radio :label="0">
                    否
                  </el-radio>
                </el-radio-group>
              </el-form-item>
            </el-col>
            <el-col v-show="!isFold" v-if="form.isOnSiteCheck === 1" :span="12">
              <el-form-item label="现场检定时间:" prop="onSiteCheckTime">
                <el-date-picker
                  v-model="onSiteCheckTimeRange"
                  type="daterange"
                  range-separator="至"
                  format="YYYY-MM-DD"
                  value-format="YYYY-MM-DD"
                  start-placeholder="现场检定时间(开始)"
                  end-placeholder="现场检定时间(结束)"
                  :disabled="pageType === 'detail'"
                />
              </el-form-item>
            </el-col>
            <el-col v-show="!isFold" v-if="form.isOnSiteCheck === 1" :span="6">
              <el-form-item label="现场检定审批单">
                <el-input
                  v-model="form.siteExecutiveNo"
                  :placeholder="pageType === 'detail' ? '' : '请选择'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  disabled
                >
                  <template v-if="pageType !== 'detail'" #append>
                    <el-button size="small" @click="selectFieldTestApproval">
                      选择
                    </el-button>
                  </template>
                </el-input>
              </el-form-item>
            </el-col>
            <el-col v-show="!isFold" v-if="form.isOnSiteCheck === 0" :span="6">
              <el-form-item label="预计送达时间:" prop="planDeliverTime">
                <el-date-picker
                  v-model="form.planDeliverTime"
                  type="datetime"
                  class="full-width-input"
                  :placeholder="pageType === 'detail' ? '' : '请输入预计送达时间'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  :disabled="pageType === 'detail' || (pageType === 'edit' && form.receiveStatus === '2')"
                  format="YYYY-MM-DD HH:mm:ss"
                  value-format="YYYY-MM-DD HH:mm:ss"
                />
              </el-form-item>
            </el-col>
            <el-col v-show="!isFold" v-if="form.isOnSiteCheck === 0" :span="6">
              <el-form-item label="要求检完时间:" prop="requireOverTime">
                <el-date-picker
                  v-model="form.requireOverTime"
                  type="datetime"
                  class="full-width-input"
                  :placeholder="pageType === 'detail' ? '' : '请输入要求检完时间'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  :disabled="pageType === 'detail' || (pageType === 'edit' && form.receiveStatus === '2')"
                  format="YYYY-MM-DD HH:mm:ss"
                  value-format="YYYY-MM-DD HH:mm:ss"
                />
              </el-form-item>
            </el-col>
            <el-col v-show="!isFold" :span="6">
              <el-form-item label="是否加急:" prop="isUrgent">
                <el-select v-model="form.isUrgent" :placeholder="pageType === 'detail' ? '' : '请选择是否加急'" :disabled="pageType === 'detail'" class="full-width-input">
                  <el-option
                    v-for="i in isUrgentList"
                    :key="i.value"
                    :label="i.name"
                    :value="i.value"
                  />
                </el-select>
              </el-form-item>
            </el-col>
            <!-- <el-col :span="6">
              <el-form-item label="检修专业:" prop="maintainMajor">
                <el-input
                  v-model="form.maintainMajor"
                  :placeholder="pageType === 'detail' ? '' : '请输入检修专业'"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  :disabled="pageType === 'detail' || (pageType === 'edit' && form.receiveStatus === '2')"
                />
              </el-form-item>
            </el-col> -->
          </el-row>
          <el-row v-show="!isFold" :gutter="24">
            <el-col :span="6">
              <el-form-item label="创建人:">
                <el-input v-model="form.createUserName" disabled />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="创建时间:">
                <el-date-picker
                  v-model="form.createTime"
                  type="datetime"
                  format="YYYY-MM-DD HH:mm:ss"
                  value-format="YYYY-MM-DD HH:mm:ss"
                  disabled
                  class="full-width-input"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="委托方地址:">
                <el-input
                  v-model="form.customerAddress"
                  type="textarea"
                  :placeholder="pageType === 'detail' ? ' ' : '委托方地址'"
                  autosize
                  :class="{ 'detail-input': pageType === 'detail' }"
                  disabled
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="检定(校准)单位:">
                <el-input
                  v-model="form.measureCompany"
                  :class="{ 'detail-input': pageType === 'detail' }"
                  disabled
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="承接人:">
                <el-input v-model="form.undertakerName" disabled />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="承接时间:">
                <el-date-picker
                  v-model="form.undertakeTime"
                  type="datetime"
                  format="YYYY-MM-DD HH:mm:ss"
                  value-format="YYYY-MM-DD HH:mm:ss"
                  disabled
                  class="full-width-input"
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="接收状态:">
                <el-select v-model="form.receiveStatus" :placeholder="pageType === 'detail' ? '' : '接收状态'" disabled class="full-width-input">
                  <el-option
                    v-for="i in statusList"
                    :key="i.value"
                    :label="i.name"
                    :value="i.value"
                  />
                </el-select>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row v-show="!isFold" :gutter="24" class="marg" prop="receiveIllustrate">
            <el-col :span="12">
              <el-form-item label="接收说明:">
                <el-input
                  v-model="form.receiveIllustrate"
                  type="textarea"
                  autosize
                  :placeholder="pageType === 'detail' ? '' : '请输入接收说明'"
                  :disabled="pageType === 'detail' || (pageType === 'edit' && form.receiveStatus === '2')"
                  :class="{ 'detail-input': pageType === 'detail' }"
                />
              </el-form-item>
            </el-col>
          </el-row>
        </el-form>
      </detail-page>
      <!-- 表格 -->
      <detail-block title="任务单列表">
        <template #btns>
          <el-button v-if="pageType === 'detail' && form.receiveStatus === '2'" type="warning" @click="replenish">
            补送
          </el-button>
          <el-button v-if="pageType === 'detail' && form.receiveStatus === '2'" type="warning" @click="back">
            退回
          </el-button>
          <el-button v-if="pageType !== 'detail'" type="primary" @click="scan('scanner')">
            扫码枪扫描添加
          </el-button>
          <el-button v-if="pageType !== 'detail'" type="primary" @click="scan('rfid')">
            RFID扫描添加
          </el-button>
          <el-button v-if="pageType !== 'detail'" type="primary" @click="multiAdd">
            批量添加
          </el-button>
          <el-button v-if="pageType !== 'detail'" type="primary" @click="addRow">
            增加行
          </el-button>
          <el-button v-if="pageType !== 'detail'" type="info" @click="delRow">
            删除行
          </el-button>
        </template>
        <el-table
          :data="list"
          border
          style="width: 100%;"
          max-height="600"
          @selection-change="handleSelectionChange"
          @row-dblclick="dblclick"
        >
          <el-table-column v-if="(pageType === 'detail' && form.receiveStatus === '2') || (pageType !== 'detail')" type="selection" width="38" />
          <!-- <el-table-column v-if="(pageType === 'detail' && form.receiveStatus === '2') || (pageType !== 'detail' && form.receiveStatus !== '2')" type="selection" width="38" /> -->
          <el-table-column align="center" label="序号" width="80" type="index" />
          <el-table-column
            v-for="item in columns"
            :key="item.value"
            :prop="item.value"
            :label="item.text"
            :width="item.width"
            align="center"
          >
            <template #header>
              <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span>
            </template>
            <template #default="scope">
              <el-input
                v-if="scope.row.editable && item.value === 'sampleName'"
                v-model="scope.row[item.value]"
                placeholder="请选择"
                :disabled="item.disabled"
              >
                <template #append>
                  <el-button size="small" @click="selectEquipment(scope.$index)">
                    选择
                  </el-button>
                </template>
              </el-input>
              <el-input
                v-if="scope.row.editable && item.value !== 'sampleNo' && item.value !== 'sampleName' && item.value !== 'sampleModel' && item.value !== 'manufactureNo' && item.value !== 'manufacturer'
                  && item.value !== 'helpInstruction' && item.value !== 'receiveStatus'"
                v-model="scope.row[item.value]"
                :placeholder="item.text"
              />
              <span v-if="!scope.row.editable">{{ scope.row[item.value] }}</span>
            </template>
          </el-table-column>
        </el-table>
      </detail-block>
      <!-- 选择委托方组件 -->
      <select-customer-dialog ref="selectCustomerRef" @confirm="clickConfirmCustomer" />
      <!-- 选择智能模型组件 -->
      <select-equipment-dialog ref="selectEquipmentRef" :is-multi="isMulti" @confirm="clickConfirmEquipment" />
      <!-- 扫描 -->
      <scan-sample-dialog ref="scanSampleRef" title="扫描添加智能模型" @confirm="scanOver" />
      <!-- 补送、退回组件 -->
      <replenish-or-back-dialog ref="replenishOrBackDialogRef" @on-success="onSuccess" />
      <!-- 选择现场测试、校准或检定审批 -->
      <select-field-test-approval-dialog ref="selectFieldTestApprovalRef" @confirm="confirmSelectedFieldTestApproval" />
      <!-- 扫码枪扫描收入  -->
      <q-rcode-device-dialog ref="QRcodeDeviceDialogRef" @confirm="scanOver" />
    </app-container>
  </div>
</template>

<style lang="scss" scoped>
.customer-title {
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 24px;
  font-weight: 700;
  margin: 24px 0;

  .img {
    width: 32px;
    height: 32px;
    margin-right: 14px;
    vertical-align: middle;
  }
}

.customer-info {
  display: flex;
  justify-content: space-around;
  align-items: center;
  flex-wrap: nowrap;
  margin: 40px 0;

  .content {
    display: flex;
    font-size: 14px;

    .title {
      font-weight: 600;
      color: #000;
    }

    .value {
      margin-left: 10px;
    }
  }
}

.selectBtn {
  position: absolute;
  top: 0;
  right: 0;
}

.receipt-signature {
  display: flex;
  justify-content: flex-end;
  margin-right: 300px;
  // padding: 50px 250px 50px 150px;
  padding: 50px;
  font-size: 28px;
  color: #000;
  font-weight: 600;

  .content {
    display: flex;
    position: relative;

    .img {
      position: absolute;
      right: 0;
      top: 0;
      z-index: 2;
    }

    .img-name {
      position: absolute;
      left: 220px;
      top: -30px;
      z-index: 1;
    }

    .title {
      margin-right: 32px;
      letter-spacing: 6px;
    }

    .deliverer-time {
      display: flex;
      flex-direction: column;

      .text-title {
        letter-spacing: 2px;
      }

      .time {
        margin-top: 30px;
        letter-spacing: 2px;
      }

      .text {
        font-size: 24px;
        font-weight: 500;
        margin-left: 10px;
      }
    }
  }
}
</style>

<style lang="scss">
.order-detail {
  .el-radio__label {
    display: block !important;
  }
}
</style>