<!-- 委托书详情 --> <script lang="ts" setup name="OrderListEdit"> import type { Ref } from 'vue' import { ElLoading, ElMessage, ElMessageBox } from 'element-plus' import type { FormInstance, FormRules, UploadUserFile } from 'element-plus' import type { IOrderDetail, ISampleList, dictType } from './orderList_interface' import selectSample from './selectSample.vue' import { UploadFile } from '@/api/measure/file' import selectCustomer from '@/views/customer/sample/list/selectCustomer.vue' import type { ICustomer } from '@/views/customer/customerInfo/customer_interface' import showPhoto from '@/views/system/tool/showPhoto.vue' import { getDictByCode } from '@/api/system/dict' import { getUid } from '@/utils/getUid' import scanSampleDialog from '@/components/ScanSampleDialog/index.vue' import { addOrder, getOrderDetail, getStream, updateOrder } from '@/api/business/schedule/order' import selectStaffList from '@/views/business/fieldTest/components/selectStaffList.vue' import { printPdf } from '@/utils/printUtils' const pageType = ref('add') // 页面类型: add, edit, detail const infoId = ref('') // id const isReceived = ref(false) // 样品状态是否已接收 const visible = ref(false) // 控制选择委托方对话框显隐 const sampleVisible = ref(false) // 控制选择样品对话框显隐 const ruleFormRef = ref() const orderType = ref('') // 委托书类型 1检测委托单、2检定或校准委托单 // 表单 const dataForm: Ref<IOrderDetail> = ref({ id: '', orderCode: '', // 委托书编号 postalCode: '', // 委托方邮编 orderId: '', // 委托书编号 deliverer: '', // 送检人/联系人 // delivererTel: '', // 送样人联系方式 orderTime: '', // 委托日期 planDeliverTime: '', // 预计送达时间 requireOverTime: '', // 要求检完时间 customerNo: '', // 委托方代码 customerId: '', // 委托方id customerName: '', // 委托方名称 phone: '', // 委托方电话 customerAddress: '', // 委托方地址 remark: '', // 备注 minioFileName: '', // 附件 isUrgent: 0, // 是否加急 0否 1是 certifications: '', // 证书类别 certificationCompany: '', // 证书单位名称 certificationCompanyAddress: '', // 证书单位地址 needContact: '1', // 需联络后再做退件处理0、直接退件处理1 staffNo: '', // 收件人工号 staffName: '', // 收件人名称 receiveDate: '', // 收件日期 fixedTel: '', // 固定电话 delivererTel: '', // 移动电话 email: '', // 电子邮件或qq invoiceCompany: '', // 发票单位名称 }) const checkCertificateList = ref([]) as any// 对证书要求多选框 const scanSampleRef = ref() // 标签绑定弹窗ref const certificationsMap = ref<dictType[]>([]) // 证书类别 const powerVoltageMap = ref<dictType[]>([]) // 电源电压 const isUrgentMap = ref<dictType[]>([]) // 是否加急 const sampleStatusMap = ref([]) as any// 样品状态 const customerInfoMap = ref<dictType[]>([]) // 系统字典--航天计量检测技术(江苏)有限公司基本信息 const list = ref<ISampleList[]>([])// 表格数据 // 选中的内容 const checkoutList = ref([]) const columns = ref([]) as any // 表头 const columnsMeasure = ref([ { text: '被测样品名称', value: 'sampleName', align: 'center', required: true }, { text: '型号规格', value: 'sampleModel', align: 'center', required: true }, { text: '仪器编号', value: 'manufacturingNo', align: 'center', required: true }, { text: '生产厂家', value: 'manufacturer', align: 'center', required: true }, { text: '样品编号', value: 'sampleNo', align: 'center', width: '170', disabled: true, required: true }, // { text: '电源电压', value: 'powerVoltage', align: 'center', required: true }, { text: '外观状态', value: 'appearanceStatus', align: 'center', required: true }, { text: '检测项目', value: 'measureContent', align: 'center', required: false }, // { text: '样品状态', value: 'sampleStatusName', align: 'center' }, { text: '检测依据标准', value: 'accordStandard', align: 'center', required: false }, { text: '备注', value: 'remark', align: 'center', required: false }, ]) // 表头 const columnsCalibration = ref([ { text: '被测样品名称', value: 'sampleName', align: 'center', required: true }, { text: '型号规格', value: 'sampleModel', align: 'center', required: true }, { text: '仪器编号', value: 'manufacturingNo', align: 'center', required: true }, { text: '生产厂家', value: 'manufacturer', align: 'center', required: true }, { text: '样品编号', value: 'sampleNo', align: 'center', width: '170', disabled: true, required: true }, { text: '证书要求', value: 'certificateRequire', align: 'center', required: false }, { text: '外观状态', value: 'appearanceStatus', align: 'center', required: true }, // { text: '客户特殊要求', value: 'specialRequire', align: 'center', required: false }, { text: '备注', value: 'remark', align: 'center', required: false }, ]) // 自定义校验规则--要求检完时间不能比预计送达时间大 const requireOverTimeValid = (rule: any, value: any, callback: any) => { if (!value) { return callback(new Error('要求检完时间必填')) } if (new Date(dataForm.value.planDeliverTime).getTime() >= new Date(dataForm.value.requireOverTime).getTime()) { return callback(new Error('要求检完时间应大于预计送达时间')) } callback() } // 校验规则 const rules = reactive<FormRules>({ // deliverer: [{ required: true, message: '要求送样人必填', trigger: 'blur' }], // delivererTel: [{ required: true, message: '要求送样人联系方式必填', trigger: 'blur' }], customerNo: [{ required: true, message: '要求委托方代码必填', trigger: 'change' }], customerName: [{ required: true, message: '要求委托方名称必填', trigger: 'change' }], // phone: [{ required: true, message: '要求委托方电话必填', trigger: 'change' }], customerAddress: [{ required: true, message: '要求委托方地址必填', trigger: 'change' }], orderTime: [{ type: 'date', required: true, message: '要求委托日期必填', trigger: 'change' }], planDeliverTime: [{ type: 'date', required: true, message: '要求预计送达时间必填', trigger: 'change' }], requireOverTime: [{ required: true, type: 'date', validator: requireOverTimeValid, trigger: 'change' }], certifications: [{ required: true, message: '要求证书类别必填', trigger: 'change' }], isUrgent: [{ required: true, message: '要求是否加急必填', trigger: 'change' }], certificationCompany: [{ required: true, message: '要求证书单位名称必填', trigger: 'blur' }], certificationCompanyAddress: [{ required: true, message: '要求证书单位地址必填', trigger: 'blur' }], deliverer: [{ required: true, message: '联系人必填', trigger: 'blur' }], delivererTel: [{ required: true, message: '移动电话必填', trigger: 'blur' }], // phone: [{ required: true, message: '固定电话必填', trigger: 'blur' }], // email: [{ required: true, message: '电子邮件/QQ必填', trigger: 'blur' }], // invoiceCompany: [{ required: true, message: '发票单位名称必填', trigger: 'blur' }], }) // 表单验证规则 // 从路由中获取页面类型参数 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 } if ($route.params.status) { isReceived.value = $route.params.status === '2' // 已接收 console.log('样品状态', isReceived.value) } } // 获取字典值 function getDict() { // 证书类别 getDictByCode('certificationType').then((response) => { certificationsMap.value = response.data }) // 电源电压 getDictByCode('powerVoltage').then((response) => { powerVoltageMap.value = response.data }) // 是否加急 getDictByCode('isUrgent').then((response) => { isUrgentMap.value = response.data.map((item: dictType) => { return { ...item, value: parseInt(item.value as string), } }) }) // 样品状态 getDictByCode('sampleStatus').then((response) => { response.data.forEach((item: dictType) => { sampleStatusMap.value[`${item.value}`] = item.name }) }) // 系统字典 getDictByCode('systemDict').then((response) => { const tempMap = response.data.map((item: dictType) => { if (item.value === 'address') { item.label = '通信地址' } else if (item.value === 'postalCode') { item.label = '邮编' } else if (item.value === 'tel') { item.label = '电话' } return item }) // 删除除上述四项的其他基本信息 tempMap.forEach((item: dictType, index: number) => { if (item.value !== 'address' && item.value !== 'postalCode' && item.value !== 'tel' && item.value !== 'fax') { tempMap.splice(index, 1) } }) customerInfoMap.value = tempMap }) } // 点击选择 const customerNoFocus = () => { visible.value = true } // 点击从样品库添加 const multiAdd = () => { if (!dataForm.value.customerNo) { ElMessage.warning('请先选择委托方') return } sampleVisible.value = true } // 双击样品表格 const rowDblclick = (row: ISampleList) => { row.isEdit = true } // 单击样品表格某一行 const rowClick = (row: ISampleList) => { // row.isEdit = false } // 点击表头--手填全的行和样品库中选的行退出编辑模式 const headerClick = () => { list.value.forEach((item) => { if ((item.isEdit && (!item.sampleName || !item.sampleModel || !item.manufacturingNo || !item.powerVoltage))) { item.isEdit = true } else { item.isEdit = false } }) } // 选好委托方 const confirmCheckout = (val: Array<ICustomer>) => { // 委托方变化样品清单置空 if (val[0].customerNo !== dataForm.value.customerNo) { list.value = [] } if (val && val.length) { list.value.filter(item => !item.sampleNo) // 切换委托方时把不是手填的样品删了 dataForm.value.customerNo = val[0].customerNo // 委托方代码 dataForm.value.customerId = val[0].id // 委托方id dataForm.value.customerName = val[0].customerName // 委托方名称 dataForm.value.phone = val[0].phone // 委托方电话 dataForm.value.customerAddress = val[0].fullAddress // 委托方地址 dataForm.value.deliverer = val[0].director // 联系人 dataForm.value.delivererTel = val[0].mobile // 移动电话 dataForm.value.email = val[0].email // 电子邮件或qq dataForm.value.postalCode = val[0].postalCode // 邮编 dataForm.value.certificationCompany = val[0].customerName // 证书单位名称 dataForm.value.certificationCompanyAddress = val[0].fullAddress // 证书单位地址 } } // 选择好样品 const clickConfirmSample = (val: Array<ISampleList>) => { val.forEach((item: ISampleList) => { // 只添加列表里不存在的 const index = list.value.findIndex((i: ISampleList) => item.sampleNo === i.sampleNo) if (index === -1) { list.value.push({ ...item, // measureContent: '', // 检定项目置空 isExistSample: '1', // 是否存在样品库中 1存在、0不存在 }) } }) } // 控制选择委托方对话框显隐 const changeVisible = (val: boolean) => { visible.value = val } // 控制选择样品对话框显隐 const changeSampleVisible = (val: boolean) => { sampleVisible.value = val } // 多选发生改变时 const handleSelectionChange = (e: any) => { checkoutList.value = e } // 检查表格第几行信息未完善 const checkList = () => { // const index = list.value.findIndex(item => (!item.sampleNo || item.sampleNo === '系统自动生成') && (!item.sampleName || !item.sampleModel || !item.manufacturingNo || !item.powerVoltage || !item.measureContent)) const index = list.value.findIndex((item: any) => !item.sampleName || !item.sampleModel || !item.manufacturingNo || !item.appearanceStatus) if (index !== -1) { return index + 1 } else { return 'pass' } } // 增加行 const addRow = () => { const result = checkList() if (result !== 'pass') { ElMessage.warning(`请完善第${result}行样品信息`) return } list.value.push({ sampleNo: '', // 样品编号 sampleName: '', // 样品名称 sampleModel: '', // 样品型号 manufacturingNo: '', // 出厂编号 appendixDescn: '', // 附件说明 appearanceStatus: '', // 外观状态 measureContent: '', // 检测依据标准 certificateRequire: '', // 证书要求 specialRequire: '', // 客户特殊要求 powerVoltage: '', // 电源电压 accordStandard: '', // 附件说明 remark: '', // 备注 isEdit: true, // 是否可编辑 isExistSample: '0', // 是否存在样品库中 1存在、0不存在 delId: getUid(), }) } // 删除行 const delRow = () => { if (checkoutList.value.length <= 0) { ElMessage({ message: '请选中要删除的行', type: 'warning', }) } else { checkoutList.value.forEach((item: ISampleList) => { list.value.forEach((element, index) => { if (!item.sampleNo) { // 点击增加行--手动增加的项目需要判断前端添加的delID if (element.delId === item.delId) { list.value.splice(index, 1) } } else { // 从样品库中选择的项目 if (element.sampleNo === item.sampleNo) { list.value.splice(index, 1) } } }) }) } } const fileRef = ref() // 文件上传input const onFileChange = (event: any) => { // 原生上传 if (event.target.files?.length !== 0) { // 创建formdata对象 const fd = new FormData() fd.append('multipartFile', event.target.files[0]) const loading = ElLoading.service({ lock: true, background: 'rgba(255, 255, 255, 0.8)', }) UploadFile(fd).then((res) => { if (res.code === 200) { dataForm.value.minioFileName = res.data[0] // 重置当前验证 ElMessage.success('文件上传成功') loading.close() } else { ElMessage.error(res.message) loading.close() } }) } } const upload = () => { fileRef.value.click() } const $router = useRouter() // 关闭新增页面的回调 const close = () => { $router.back() } // 点击保存 const saveForm = (formEl: FormInstance | undefined) => { console.log('委托单类型', orderType.value === 'measure' ? '1' : orderType.value === 'calibration' ? '2' : '') if (!list.value.length) { ElMessage.warning('要求样品清单不能为空') return } // 检查表格是否存在增加行信息没有完善的情况 const result = checkList() if (result !== 'pass') { ElMessage.warning(`表格第${result}行信息未完善`) return } headerClick() // 所有行退出编辑模式 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 = { ...dataForm.value, customerPhone: dataForm.value.phone, // 委托方电话 accordLab: checkCertificateList.value.includes('如无相应检定规程/校准规范,可按本实验室的方法进行校准') ? '1' : '0', agreeOther: checkCertificateList.value.includes('如不能出具所选证书类型,同意受托方出具其他类型证书') ? '1' : '0', needAccordDeclare: checkCertificateList.value.includes('需要符合性声明') ? '1' : '0', needAdvice: checkCertificateList.value.includes('需要建议再校准日期') ? '1' : '0', contactReturn: dataForm.value.needContact === '1' ? '1' : '0', // 需联系之后退件处理 directReturn: dataForm.value.needContact === '2' ? '1' : '0', // 直接退件处理 orderType: orderType.value === 'measure' ? '1' : orderType.value === 'calibration' ? '2' : '', orderTypeName: orderType.value === 'measure' ? '检测委托单' : orderType.value === 'calibration' ? '检定或校准委托单' : '', customerSampleInfoList: list.value, } if (pageType.value === 'edit') { // 编辑 updateOrder(params).then(() => { ElMessage.success('已保存') loading.close() $router.go(-1) }).catch(() => { loading.close() }) } if (pageType.value === 'add') { // 新建 addOrder(params).then(() => { ElMessage.success('已保存') loading.close() $router.go(-1) }).catch(() => { loading.close() }) } }) } }) } // ---------------------------------------------扫描-------------------------------------- // 点击扫描收添加 const scan = () => { if (!dataForm.value.customerNo) { ElMessage.warning('请先选择委托方') return } // 参数:不是标签绑定,委托书,业务场景 scanSampleRef.value.initDialog(false, '2', '', 'list', dataForm.value.customerId) } // 扫描结束 const scanOver = (sampleList: any) => { console.log(sampleList) sampleList.forEach((item: any) => { list.value.push({ ...item, isEdit: true, // 是否可编辑 isExistSample: '1', // 是否存在样品库中 1存在、0不存在 delId: getUid(), }) }) scanSampleRef.value.closeDialog() } // -------------------------------------------------------------------------------------- // 点击打印 const printPDF = () => { const loading = ElLoading.service({ lock: true, background: 'rgba(255, 255, 255, 0.8)', }) getStream({ id: infoId.value }).then((res) => { loading.close() const pdfStream = new Blob([res.data]) const blobUrl = URL.createObjectURL(pdfStream) printPdf(blobUrl) }) } // 获取详细信息 const getInfo = () => { const loading = ElLoading.service({ lock: true, background: 'rgba(255, 255, 255, 0.8)', }) getOrderDetail({ id: infoId.value }).then((res) => { dataForm.value = res.data dataForm.value.phone = res.data.customerPhone if (`${res.data.accordLab}` === '1') { checkCertificateList.value.push('如无相应检定规程/校准规范,可按本实验室的方法进行校准') } if (`${res.data.agreeOther}` === '1') { checkCertificateList.value.push('如不能出具所选证书类型,同意受托方出具其他类型证书') } if (`${res.data.needAccordDeclare}` === '1') { checkCertificateList.value.push('需要符合性声明') } if (`${res.data.needAdvice}` === '1') { checkCertificateList.value.push('需要建议再校准日期') } if (`${res.data.contactReturn}` === '1') { // 需联系之后退件处理 dataForm.value.needContact = '1' } if (`${res.data.directReturn}` === '1') { // 直接退件处理 dataForm.value.needContact = '2' } orderType.value = res.data.orderType === '1' ? 'measure' : 'calibration' // 委托书类型 list.value = res.data.customerSampleInfoList.map((item: any) => { return { ...item, sampleStatusName: item.sampleStatus ? sampleStatusMap.value[item.sampleStatus] : '', } }) loading.close() }) } // ---------------------------------------收件人------------------------------------------------- const merterPersonRef = ref() // 计量人员Ref // 点击选择 const selectReceivePerson = () => { merterPersonRef.value.initDialog() } // 选完计量人员 const confirmSelectPerson = (val: any) => { dataForm.value.staffNo = val[0].staffNo// 收件人工号 dataForm.value.staffName = val[0].name// 收件人名称 } // ----------------------------------------------------------------------------------------------- watch(() => orderType.value, (newValue) => { if (newValue === 'measure') { columns.value = columnsMeasure.value } else if (newValue === 'calibration') { columns.value = columnsCalibration.value } }, { immediate: true }) watch(() => checkCertificateList.value, (list) => { console.log(list) }, { deep: true }) onMounted(async () => { await getDict() orderType.value = $route.query.orderType as string // 委托书类型 1检测委托单、2检定或校准委托单 // 非添加页面获取详情 if (pageType.value !== 'add') { getInfo() } }) </script> <template> <app-container> <div id="main"> <!-- <div class="customer-title"> <img src="@/assets/images/logo.png" class="img"> <div class="title"> 航天计量检测技术(江苏)有限公司 </div> </div> --> <detail-page :title="orderType === 'measure' ? '检测委托单' : '检定或校准委托单'"> <template #btns> <el-button v-if="pageType === 'detail'" type="primary" @click="printPDF"> 打印 </el-button> <el-button v-if="pageType !== 'detail'" type="primary" @click="saveForm(ruleFormRef)"> 保存 </el-button> <el-button type="info" @click="close"> 关闭 </el-button> </template> <div id="form"> <el-form ref="ruleFormRef" :model="dataForm" :label-width="120" label-position="right" :rules="rules" > <el-row :gutter="24"> <el-col :span="8"> <el-form-item label="委托书编号:" prop="orderCode"> <el-input v-model="dataForm.orderCode" :placeholder="pageType === 'detail' ? ' ' : '系统自动生成'" :class="{ 'detail-input': pageType === 'detail' }" disabled /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="委托方代码" prop="customerNo"> <el-input v-model="dataForm.customerNo" :placeholder="pageType === 'detail' ? ' ' : '请选择'" :class="{ 'detail-input': pageType === 'detail' }" disabled > <template v-if="pageType !== 'detail' && !isReceived" #append> <el-button size="small" @click="customerNoFocus"> 选择 </el-button> </template> </el-input> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="委托方名称" prop="customerName"> <el-input v-model="dataForm.customerName" :placeholder="pageType === 'detail' ? ' ' : '委托方名称'" :class="{ 'detail-input': pageType === 'detail' }" disabled /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="邮政编码" prop="postalCode"> <el-input v-model="dataForm.postalCode" :placeholder="pageType === 'detail' ? ' ' : '邮政编码'" :class="{ 'detail-input': pageType === 'detail' }" disabled /> </el-form-item> </el-col> <el-col :span="16"> <el-form-item label="委托方地址:"> <el-input v-model="dataForm.customerAddress" type="textarea" autosize :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="dataForm.deliverer" :placeholder="pageType === 'detail' ? '' : '请输入联系人'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail' || isReceived" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="固定电话:" prop="phone"> <el-input v-model="dataForm.phone" :placeholder="pageType === 'detail' ? '' : '请输入固定电话'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail' || isReceived" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="移动电话:" prop="delivererTel"> <el-input v-model="dataForm.delivererTel" :placeholder="pageType === 'detail' ? '' : '请输入移动电话'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail' || isReceived" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="电子邮件/QQ:" prop="email"> <el-input v-model="dataForm.email" :placeholder="pageType === 'detail' ? '' : '请输入电子邮件/QQ'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail' || isReceived" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="预约送达时间:" prop="planDeliverTime"> <el-date-picker v-model="dataForm.planDeliverTime" type="datetime" class="full-width-input" :placeholder="pageType === 'detail' ? '' : '请输入预约送达时间'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail' || isReceived" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="预约取样时间:" prop="requireOverTime"> <el-date-picker v-model="dataForm.requireOverTime" type="date" class="full-width-input" :placeholder="pageType === 'detail' ? '' : '请输入预约取样时间'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail' || isReceived" format="YYYY-MM-DD" value-format="YYYY-MM-DD" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="发票单位名称:" prop="invoiceCompany"> <el-input v-model="dataForm.invoiceCompany" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail' || isReceived" :placeholder="pageType === 'detail' ? '' : '请输入发票单位名称'" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="证书单位名称:" prop="certificationCompany"> <el-input v-model="dataForm.certificationCompany" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail' || isReceived" :placeholder="pageType === 'detail' ? '' : '请输入证书单位名称'" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="是否加急:" prop="isUrgent"> <el-select v-model="dataForm.isUrgent" :placeholder="pageType === 'detail' ? '' : '请选择是否加急'" :disabled="pageType === 'detail'" class="full-width-input"> <el-option v-for="i in isUrgentMap" :key="i.value" :label="i.name" :value="i.value" /> </el-select> </el-form-item> </el-col> <el-col :span="16"> <el-form-item label="证书单位地址:" prop="certificationCompanyAddress"> <el-input v-model="dataForm.certificationCompanyAddress" type="textarea" autosize :class="{ 'detail-input': pageType === 'detail' }" :placeholder="pageType === 'detail' ? '' : '请输入证书单位地址'" :disabled="pageType === 'detail' || isReceived" /> </el-form-item> </el-col> <!-- <el-col :span="8"> <el-form-item label="送样人:" prop="deliverer"> <el-input v-model="dataForm.deliverer" :placeholder="pageType === 'detail' ? '' : '请输入送样人'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail' || isReceived" /> </el-form-item> </el-col> --> <!-- <el-col :span="8"> <el-form-item label="联系方式:" prop="delivererTel"> <el-input v-model="dataForm.delivererTel" :placeholder="pageType === 'detail' ? '' : '请输入联系方式'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail' || isReceived" /> </el-form-item> </el-col> --> <!-- <el-col :span="8"> <el-form-item label="委托日期:" prop="orderTime"> <el-date-picker v-model="dataForm.orderTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" class="full-width-input" :placeholder="pageType === 'detail' ? '' : '请输入委托日期'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail' || isReceived" /> </el-form-item> </el-col> --> </el-row> <el-row :gutter="24"> <el-form-item label="说明:"> <el-col :span="24" style="display: flex;align-items: center;"> <!-- <span style="font-weight: 600;font-size: 13px;">说明</span> --> <span style="font-size: 13px;margin-right: 60px;">1.如仪器出现故障或不合格</span> <el-radio-group v-model="dataForm.needContact" :disabled="pageType === 'detail' || isReceived"> <el-radio label="1"> 需联络后再做退件处理 </el-radio> <el-radio label="2"> 直接退件处理 </el-radio> </el-radio-group> </el-col> </el-form-item> </el-row> <el-row v-if="orderType === 'calibration'" :gutter="24"> <el-form-item label=" "> <el-col :span="24" style="display: flex;align-items: center;"> <span style="font-size: 13px;margin-right: 60px;">2.对证书要求</span> <el-checkbox-group v-model="checkCertificateList" :disabled="pageType === 'detail' || isReceived"> <el-checkbox label="需要符合性声明" /> <el-checkbox label="如无相应检定规程/校准规范,可按本实验室的方法进行校准" /> <el-checkbox label="需要建议再校准日期" /> <el-checkbox label="如不能出具所选证书类型,同意受托方出具其他类型证书" /> </el-checkbox-group> </el-col> </el-form-item> </el-row> <el-row :gutter="24"> <el-col :span="8"> <el-form-item label="收件人工号:" prop="staffNo"> <el-input v-model.trim="dataForm.staffNo" :placeholder="pageType === 'detail' ? '' : '请选择收件人工号'" disabled class="full-width-input" clearable > <template v-if="pageType !== 'detail'" #append> <el-button size="small" @click="selectReceivePerson" > 选择 </el-button> </template> </el-input> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="收件人姓名:" prop="staffName"> <el-input v-model.trim="dataForm.staffName" :placeholder="pageType === 'detail' ? '' : '请输入收件人姓名'" disabled class="full-width-input" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="收件日期:" prop="receiveDate"> <el-date-picker v-model="dataForm.receiveDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" class="full-width-input" :placeholder="pageType === 'detail' ? '' : '请选择收件日期'" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail' || isReceived" /> </el-form-item> </el-col> </el-row> <!-- <el-row :gutter="24"> <el-col :span="8"> <el-form-item label="证书类别:" prop="certifications"> <el-select v-model="dataForm.certifications" :placeholder="pageType === 'detail' ? '' : '请选择证书类别'" :disabled="pageType === 'detail' || isReceived" class="full-width-input"> <el-option v-for="i in certificationsMap" :key="i.value" :label="i.name" :value="i.value" /> </el-select> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="是否加急:" prop="isUrgent"> <el-select v-model="dataForm.isUrgent" :placeholder="pageType === 'detail' ? '' : '请选择是否加急'" :disabled="pageType === 'detail'" class="full-width-input"> <el-option v-for="i in isUrgentMap" :key="i.value" :label="i.name" :value="i.value" /> </el-select> </el-form-item> </el-col> </el-row> --> <!-- <el-row :gutter="24" class="marg"> <el-col :span="16"> <el-form-item label="备注:"> <el-input v-model="dataForm.remark" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入备注'" :disabled="pageType === 'detail' || isReceived" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> </el-row> --> <!-- <el-row :gutter="24" class="marg"> <el-col :span="16"> <el-form-item label="附件:"> <show-photo v-if="dataForm.minioFileName" :minio-file-name="dataForm.minioFileName" /> <span v-else-if="pageType === 'detail'">无</span> <input v-show="pageType === ''" ref="fileRef" type="file" @change="onFileChange"> <el-button v-if="pageType !== 'detail' && !isReceived" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-left': dataForm.minioFileName === '' ? '0px' : '20px' }" @click="upload"> {{ dataForm.minioFileName === '' ? '上传' : '更换附件' }} </el-button> </el-form-item> </el-col> </el-row> --> </el-form> <div style="color: red;font-size: 13px;"> *本委托单一式两份 双方各执一份 </div> </div> </detail-page> <!-- 表格 --> <detail-block title="样品清单"> <template #btns> <el-button v-if="pageType !== 'detail' && !isReceived" type="primary" @click="scan"> 扫描添加 </el-button> <el-button v-if="pageType !== 'detail' && !isReceived" type="primary" @click="multiAdd"> 从样品库中添加 </el-button> <el-button v-if="pageType !== 'detail' && !isReceived" type="primary" @click="addRow"> 增加行 </el-button> <el-button v-if="pageType !== 'detail' && !isReceived" type="info" @click="delRow"> 删除行 </el-button> </template> <el-table :data="list" border style="width: 100%;" max-height="600" @selection-change="handleSelectionChange" @row-dblclick="rowDblclick" @row-click="rowClick" @header-click="headerClick" > <el-table-column v-if="pageType !== 'detail' && !isReceived" 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 v-if="(pageType === 'add' || pageType === 'edit')" #default="scope"> <!-- 手动增加行-名称、型号、编号可编辑 --> <el-input v-if="(!scope.row.sampleNo || scope.row.sampleNo === '系统自动生成') && (item.value === 'sampleNo' || item.value === 'sampleName' || item.value === 'sampleModel' || item.value === 'manufacturingNo') && scope.row.isEdit" v-model="scope.row[item.value]" :placeholder="item.value === 'sampleNo' ? '系统自动生成' : `请输入${item.text}`" :disabled="item.disabled" /> <!-- 手动增加行可编辑:附件说明、检定项目、备注、检测依据标准 --> <el-input v-if="(item.value === 'appendixDescn' || item.value === 'measureContent' || item.value === 'remark' || item.value === 'appearanceStatus' || item.value === 'certificateRequire' || item.value === 'specialRequire' || item.value === 'accordStandard')" v-model="scope.row[item.value]" type="textarea" autosize :placeholder=" `请输入${item.text}`" :disabled="item.disabled || isReceived" /> <!-- 除电源电压和样品编号另外的行 --> <!-- <span v-if="item.value !== 'powerVoltage' && item.value !== 'sampleNo' && item.value !== 'appendixDescn' && item.value !== 'measureContent' && !scope.row.isEdit">{{ scope.row[item.value] }}</span> --> <!-- 除样品编号另外的行 --> <span v-if="item.value !== 'specialRequire' && item.value !== 'certificateRequire' && item.value !== 'remark' && item.value !== 'accordStandard' && item.value !== 'sampleNo' && item.value !== 'appendixDescn' && item.value !== 'measureContent' && item.value !== 'appearanceStatus' && !scope.row.isEdit">{{ scope.row[item.value] }}</span> <!-- 样品编号不可编辑 --> <span v-if="item.value === 'sampleNo' && !scope.row.isEdit">{{ scope.row[item.value] || '系统自动生成' }}</span> <el-select v-if="item.value === 'powerVoltage' && scope.row.isEdit" v-model="scope.row[item.value]" :placeholder="`请选择${item.text}`"> <el-option v-for="i in powerVoltageMap" :key="i.value" :label="i.name" :value="i.value" /> </el-select> <!-- <span v-if="item.value === 'powerVoltage' && !scope.row.isEdit">{{ scope.row[item.value] }}</span> --> </template> </el-table-column> </el-table> </detail-block> <!-- 签章部分 --> <!-- <div class="receipt-signature"> <div class="content"> <div class="deliverer-time"> <span class="text-title">送样人:</span> <span class="time">时ㅤ间:</span> </div> </div> </div> --> <!-- 公司信息 --> <!-- <div class="customer-info"> <div v-for="item in customerInfoMap" :key="item.value" class="content"> <div v-if="item.value === 'address' || item.value === 'postalCode' || item.value === 'tel'" class="title"> {{ item.label }}: </div> <div v-if="item.value === 'address' || item.value === 'postalCode' || item.value === 'tel'" class="value"> {{ item.name }} </div> </div> </div> --> </div> <!-- 选择委托方组件 --> <select-customer v-model:visible="visible" @confirmCheckout="confirmCheckout" @changeVisible="changeVisible" /> <!-- 选择样品组件 --> <select-sample v-model:visible="sampleVisible" :customer-no="dataForm.customerNo" :customer-id="dataForm.customerId" :order-id="infoId" @clickConfirmSample="clickConfirmSample" @changeVisible="changeSampleVisible" /> <scan-sample-dialog ref="scanSampleRef" title="扫描添加样品" @confirm="scanOver" /> <!-- 选择计量人员组件列表 --> <select-staff-list ref="merterPersonRef" :is-multi-merter-person="false" @add="confirmSelectPerson" /> </app-container> </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"> .el-radio__label { display: block !important; } </style>