<!-- 溯源计划管理 基本信息 --> <script name="ResultConfirmApproveBasic" lang="ts" setup> import type { Ref } from 'vue' import { ElLoading, ElMessage, ElMessageBox } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' import dayjs from 'dayjs' import type { IForm, IQuantityTarget } from '../resultConfirm-interface' import type { dictType } from '@/global' import { getDictByCode } from '@/api/system/dict' import { SCHEDULE } from '@/utils/scheduleDict' import ApprovalDialog from '@/components/Approval/ApprovalDialog.vue' import useUserStore from '@/store/modules/user' import { useCheckList } from '@/commonMethods/useCheckList' import { getInfo as getEquipmentDetail } from '@/api/equipment/info/book' import { UploadFile } from '@/api/file' import SelectEquipmentDialog from '@/views/business/fieldTest/approve/dialog/selectEquipmentDialog.vue' import { useDoubleClickTableRow, useSetAllRowReadable } from '@/commonMethods/useSetAllRowReadable' import { addResultConfirmList, failUpdateResultConfirmList, getInfo, submit, updateResultConfirmList } from '@/api/equipment/source/resultConfirm' const props = defineProps({ pageType: { // 页面类型 add新建 edit编辑 detail详情 type: String, requre: true, default: 'detail', }, id: { type: String, requre: true, }, approvalStatusName: { // 审批状态名称 type: String, requre: true, }, processId: { type: String, }, }) const emits = defineEmits(['addSuccess', 'submitSuccess']) const user = useUserStore() // 用户信息 const form = ref<IForm>({ id: '', // 列表id labCode: '', // 实验室 labCodeName: '', // 实验室名称 groupCode: '', // 部门 groupCodeName: '', // 部门名称 confirmNo: '', // 登记表编号 confirmName: '', // 登记表名称 createUserId: '', // 创建人id createUserName: '', // 创建人 createTime: '', // 创建时间 planGroup: '', // 计划表部门 planYear: '', // 计划表年份 equipmentId: '', // 设备id equipmentNo: '', // 统一编号 equipmentName: '', // 设备名称 model: '', // 规格型号 manufactureNo: '', // 出厂编号 manufacturer: '', // 生产厂家 standardNo: '', // 所属测量标准号 standardName: '', // 所属测量标准名称 directorName: '', // 负责人 measureCategoryName: '', // 证书类型名称 customerMatch: 0, // 委托方名称是否与实际相符 customerAddressMatch: 0, // 委托方地址是否与实际相符 equipmentCorrect: 0, // 被检件名称是否正确 equipmentModelCorrect: 0, // 被检件型号是否正确 equipmentNoCorrect: 0, // 被检件编号是否正确 equipmentManufacturerCorrect: 0, // 被检件生产厂家是否正确 onValid: 0, // 测量设备开展检定工作时是否在有效期内 denyInfo: '', // 否则列出 fileCorrect: 0, // 依据文件是否正确 fileNoOne: '', // 依据文件编号1 fileNoNameOne: '', // 依据文件名称1 fileNoTwo: '', // 依据文件编号2 fileNoNameTwo: '', // 依据文件名称2 fileNoThree: '', // 依据文件编号3 fileNoNameThree: '', // 依据文件名称3 fileNoFour: '', // 依据文件编号4 fileNoNameFour: '', // 依据文件名称4 meterIdentify: '', // 结论 resultCorrect: 0, // 结论与数据结果是否一致 traceDate: '', // 测试、校准或检定日期 dateCorrect: 0, // 日期是否与粘贴标识一致 validDate: '', // 有效期 validDateCorrect: 0, // 有效期是否正确 signComplete: 0, // 签名信息是否齐全 sealComplete: 0, // 是否盖有有效印章 conclusion: '', // 结论(计量标识字典code) limitScope: '', // 限用范围 meterIdentifyName: '', // 结果确认结论(输入框) remark: '', // 备注 quantityTargetItem: '', // 量传指标检定项目 notQuantityTargetItem: '', // 非量传指标检定项目 planId: '', // 溯源计划id }) const ruleFormRef = ref() // 表单ref const certFormRef = ref() // 证书要素确认ref const resultRulesRef = ref() // 结果确认ref const equipmentRef = ref() // 设备ref const loading = ref(false) // loading const infoId = ref('') // id const rules = ref<FormRules>({ // 校验规则 // equipmentNo: [{ required: true, message: '统一编号不能为空', trigger: ['blur', 'change'] }], denyInfo: [{ required: true, message: '否则列出不能为空', trigger: ['blur', 'change'] }], // labCode: [{ required: true, message: '实验室不能为空', trigger: ['blur', 'change'] }], // groupCode: [{ required: true, message: '部门不能为空', trigger: ['blur', 'change'] }], planYear: [{ required: true, message: '年不能为空', trigger: ['blur', 'change'] }], planGroup: [{ required: true, message: '组不能为空', trigger: ['blur', 'change'] }], measureCategory: [{ required: true, message: '证书类型不能为空', trigger: ['blur', 'change'] }], labelConsistent: [{ required: true, message: '是否与粘贴标识一致不能为空', trigger: ['blur', 'change'] }], certificateNo: [{ required: true, message: '证书编号不能为空', trigger: ['blur', 'change'] }], traceCompany: [{ required: true, message: '溯源机构名称不能为空', trigger: ['blur', 'change'] }], supplierConsistent: [{ required: true, message: '是否与合格供方名录一致不能为空', trigger: ['blur', 'change'] }], diagramConsistent: [{ required: true, message: '是否与溯源等级关系图一致不能为空', trigger: ['blur', 'change'] }], customerMatch: [{ required: true, message: '委托方名称是否与实际相符不能为空', trigger: ['blur', 'change'] }], customerAddressMatch: [{ required: true, message: '委托方地址是否与实际相符不能为空', trigger: ['blur', 'change'] }], equipmentCorrect: [{ required: true, message: '被检件名称是否正确不能为空', trigger: ['blur', 'change'] }], equipmentModelCorrect: [{ required: true, message: '被检件型号是否正确不能为空', trigger: ['blur', 'change'] }], equipmentNoCorrect: [{ required: true, message: '被检件编号是否正确不能为空', trigger: ['blur', 'change'] }], equipmentManufacturerCorrect: [{ required: true, message: '被检件生产厂家是否正确不能为空', trigger: ['blur', 'change'] }], onValid: [{ required: true, message: '测量设备开展检定工作时是否在有效期内不能为空', trigger: ['blur', 'change'] }], fileCorrect: [{ required: true, message: '依据文件是否正确不能为空', trigger: ['blur', 'change'] }], fileNoOne: [{ required: true, message: '依据文件编号1不能为空', trigger: ['blur', 'change'] }], fileNoNameOne: [{ required: true, message: '依据文件名称1不能为空', trigger: ['blur', 'change'] }], fileNoTwo: [{ required: true, message: '依据文件编号2不能为空', trigger: ['blur', 'change'] }], fileNoNameTwo: [{ required: true, message: '依据文件名称2不能为空', trigger: ['blur', 'change'] }], fileNoThree: [{ required: true, message: '依据文件编号3不能为空', trigger: ['blur', 'change'] }], fileNoNameThree: [{ required: true, message: '依据文件名称3不能为空', trigger: ['blur', 'change'] }], fileNoFour: [{ required: true, message: '依据文件编号4不能为空', trigger: ['blur', 'change'] }], fileNoNameFour: [{ required: true, message: '依据文件名称4不能为空', trigger: ['blur', 'change'] }], conclusion: [{ required: true, message: '结论不能为空', trigger: ['blur', 'change'] }], meterIdentifyName: [{ required: true, message: '结果确认结论不能为空', trigger: ['blur', 'change'] }], resultCorrect: [{ required: true, message: '结论是否与数据结果一致不能为空', trigger: ['blur', 'change'] }], traceDate: [{ required: true, message: '测试、校准或检定日期不能为空', trigger: ['blur', 'change'] }], dateCorrect: [{ required: true, message: '日期是否与粘贴标识一致不能为空', trigger: ['blur', 'change'] }], validDate: [{ required: true, message: '有效期不能为空', trigger: ['blur', 'change'] }], validDateCorrect: [{ required: true, message: '有效期是否正确不能为空', trigger: ['blur', 'change'] }], signComplete: [{ required: true, message: '签名信息是否齐全不能为空', trigger: ['blur', 'change'] }], sealComplete: [{ required: true, message: '是否盖有有效印章不能为空', trigger: ['blur', 'change'] }], meterIdentify: [{ required: true, message: '结论不能为空', trigger: ['blur', 'change'] }], certificateFile: [{ required: true, message: '检定证书不能为空', trigger: ['blur', 'change'] }], }) // -----------------------------------------字典-------------------------------------------------------------- const labCodeList = ref<dictType[]>([]) // 实验室 const groupCodeList = ref<dictType[]>([]) // 部门 const meterIdentifyDict = ref<dictType[]>([]) // 计量标识 const measureCategoryList = ref<dictType[]>([]) // 证书类型(即检校类别) // 查询字典 const getDict = async () => { // 计量标识 getDictByCode('bizMeterIdentify').then((response) => { meterIdentifyDict.value = response.data }) // 实验室 getDictByCode('bizGroupCodeEquipment').then((response) => { labCodeList.value = response.data }) // 部门 getDictByCode('bizGroupCode').then((response) => { groupCodeList.value = response.data }) // 证书类型(即检校类别) getDictByCode('measureCategory').then((response) => { measureCategoryList.value = response.data }) } // ----------------------------------------------依据文件------------------------------------------- const showFileTree = ref(false) // 是否显示第三个依据文件 const showFileFour = ref(false) // 是否显示第四个依据文件 // 点击增加依据文件 const addFile = () => { if (!showFileTree.value) { showFileTree.value = true } else { showFileFour.value = true } } // 点击移除依据的技术文件 const removeFile = () => { if (showFileFour.value) { showFileFour.value = false form.value.fileNoFour = '' // 依据文件编号4 form.value.fileNoNameFour = '' // 依据文件名称4 } else { showFileTree.value = false form.value.fileNoThree = '' // 依据文件编号3 form.value.fileNoNameThree = '' // 依据文件名称3 } } // ------------------------------------------量传指标------------------------------------------------ const quantityTargetColumns = ref([ // 表头 { text: '测量范围', value: 'measureRange', align: 'center', required: true }, { text: '使用要求', value: 'useRequire', align: 'center', required: true }, { text: '测试、校准或检定数据是否满足使用要求', value: 'meetRequire', align: 'center', required: true }, { text: '如不满足,请写明范围', value: 'reason', align: 'center' }, ]) const quantityTargetList = ref<IQuantityTarget[]>([]) // 量传指标列表 const checkoutQuantityTargetList = ref<IQuantityTarget[]>([]) // 量传指标选中 const notQuantityTargetList = ref<IQuantityTarget[]>([]) // 非量传指标列表 const checkoutNotQuantityTargetList = ref<IQuantityTarget[]>([]) // 非量传指标选中 // 量传指标选中 const handleTechSelectionQuantityTargetChange = (e: any) => { checkoutQuantityTargetList.value = e } // 非量传指标选中 const handleTechSelectionNotQuantityTargetChange = (e: any) => { checkoutNotQuantityTargetList.value = e } // 点击增加行 const addRow = (type: string) => { if (type === 'quantityTarget') { // 量传指标 const checkResult = useCheckList(quantityTargetList.value, quantityTargetColumns.value, '量传指标', 'reason', 'meetRequire', 0) // 检查表格 if (checkResult) { useSetAllRowReadable(quantityTargetList.value) quantityTargetList.value.push({ id: '', measureRange: '', // 测量范围 useRequire: '', // 使用要求 meetRequire: '', // 测试、校准或检定数据是否满足使用要求 reason: '', // 如不满足,请写明范围 editable: props.pageType === 'edit', }) } } else { const checkResult = useCheckList(notQuantityTargetList.value, quantityTargetColumns.value, '非量传指标', 'reason', 'meetRequire', 0) // 检查表格 if (checkResult) { useSetAllRowReadable(notQuantityTargetList.value) notQuantityTargetList.value.push({ id: '', measureRange: '', // 测量范围 useRequire: '', // 使用要求 meetRequire: '', // 测试、校准或检定数据是否满足使用要求 reason: '', // 如不满足,请写明范围 editable: props.pageType === 'edit', }) } } } // 删除行 const deleteRow = (type: string) => { if (type === 'quantityTarget') { // 量传指标 if (!checkoutQuantityTargetList.value.length) { ElMessage({ message: '请选中要删除的行', type: 'warning', }) return false } quantityTargetList.value = quantityTargetList.value.filter((item: any) => { return !checkoutQuantityTargetList.value.includes(item) }) } else { // 非量传指标 if (!checkoutNotQuantityTargetList.value.length) { ElMessage({ message: '请选中要删除的行', type: 'warning', }) return false } notQuantityTargetList.value = notQuantityTargetList.value.filter((item: any) => { return !checkoutNotQuantityTargetList.value.includes(item) }) } } // 双击行--量传指标 const rowDblclickQuantityTarget = (row: any) => { if (props.pageType !== 'detail') { useDoubleClickTableRow(row, checkoutQuantityTargetList.value) } } // 双击行--非量传指标 const rowDblclickNotQuantityTarget = (row: any) => { if (props.pageType !== 'detail') { useDoubleClickTableRow(row, checkoutNotQuantityTargetList.value) } } // 通过设备获取量传指标、非量传指标的信息 const fetchEquipmentDetail = (getId = '') => { if (!getId) { return false } getEquipmentDetail({ id: getId, type: '1' }).then((res) => { quantityTargetList.value = res.data.technicalTargetList.filter((item: { indicatorType: string }) => `${item.indicatorType}` === '0').map((i: { uncertainty: string }) => { return { ...i, useRequire: i.uncertainty, id: '', } }) notQuantityTargetList.value = res.data.technicalTargetList.filter((item: { indicatorType: string }) => `${item.indicatorType}` === '1').map((i: { uncertainty: string }) => { return { ...i, useRequire: i.uncertainty, id: '', } }) // ------------------处理所属测量标准名称---------------------- const meterStandardList = res.data.standardInfoList.map((item: { standardName: string;standardNo: string;id: string }) => { return { standardName: item.standardName, standardNo: item.standardNo, id: item.id, } }) // form.value.standardId = meterStandardList.map((item: { id: string }) => item.id).join(',') form.value.standardNo = meterStandardList.map((item: { standardNo: string }) => item.standardNo).join(',') form.value.standardName = meterStandardList.map((item: { standardName: string }) => item.standardName).join(',') }) } // -----------------------------------------表格------------------------------------------- const overallInfoList = ref([]) as any // 表格数据列表 const checkoutOverallInfoList = ref([]) as any // 技术指标表格选中 const addObj = { id: '', measureCategory: 2, // 证书类型 labelConsistent: 0, // 是否与粘贴标识一致 certificateNo: '', // 证书编号 traceCompany: '', // 溯源机构名称 supplierConsistent: 0, // 是否与合格供方名录一致 diagramConsistent: 0, // 是否与溯源等级关系图一致 certificateFile: '', // 检定证书 } const overallInfoColumns = [ // 表头 { text: '证书类型', value: 'measureCategory', required: true }, { text: '是否与粘贴标识一致', value: 'labelConsistent', required: true }, { text: '证书编号', value: 'certificateNo', required: true }, { text: '溯源机构名称', value: 'traceCompany', required: true }, { text: '是否与合格供方名录一致', value: 'supplierConsistent', required: true }, { text: '是否与溯源等级关系图一致', value: 'diagramConsistent', required: true }, { text: '检定证书', value: 'certificateFile', required: true }, ] /** * 点击增加行 */ const addOverallInfo = () => { if (useCheckList(overallInfoList.value, overallInfoColumns, '表格')) { overallInfoList.value.push({ ...addObj }) } } /** * 点击删除行 */ const deleteOverallInfo = () => { overallInfoList.value = overallInfoList.value.filter((item: any) => { return !checkoutOverallInfoList.value.includes(item) }) } // 表格多选选中 const handleSelectionOverallInfoChange = (e: any) => { checkoutOverallInfoList.value = e } // -------------------------------------------文件上传-------------------------------------- const fileRef = ref() // 文件上传input const uploadIndex = ref() 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) { // form.value.certificateFile = res.data[0] overallInfoList.value[uploadIndex.value].certificateFile = res.data[0] event.target.value = null // 重置当前验证 ElMessage.success('文件上传成功') loading.close() } else { ElMessage.error(res.message) loading.close() } }) } } const upload = (index: number) => { uploadIndex.value = index fileRef.value.click() } // -----------------------------------------------保存---------------------------------------------- // 保存之前校验量传指标、非量传指标表格校验 const checkTableList = () => { for (let i = 0; i < quantityTargetList.value.length; i++) { if (`${quantityTargetList.value[i].meetRequire}` === '0' && !quantityTargetList.value[i].reason) { ElMessage.warning(`量传指标表格第${i + 1}行范围未写明`) return false } } for (let i = 0; i < notQuantityTargetList.value.length; i++) { if (`${notQuantityTargetList.value[i].meetRequire}` === '0' && !notQuantityTargetList.value[i].reason) { ElMessage.warning(`非量传指标表格第${i + 1}行范围未写明`) return false } } return true } /** * 点击保存 * @param formEl 基本信息表单ref */ const saveForm = () => { if (!overallInfoList.value.length) { ElMessage.warning('总体信息不能为空') return false } if (!useCheckList(quantityTargetList.value, quantityTargetColumns.value, '量传指标', 'reason', 'meetRequire', 0)) { return false } if (!quantityTargetList.value.length && !notQuantityTargetList.value.length) { ElMessage.warning('量传指标和非量传指标不能同时为空') return false } if (!useCheckList(notQuantityTargetList.value, quantityTargetColumns.value, '非量传指标', 'reason', 'meetRequire', 0)) { return false } if (quantityTargetList.value.length && !form.value.quantityTargetItem) { ElMessage.warning('请填写量传指标检定项目') return false } if (notQuantityTargetList.value.length && !form.value.notQuantityTargetItem) { ElMessage.warning('请填写非量传指标检定项目') return false } if (!checkTableList()) { return false } if (!ruleFormRef || !certFormRef || !resultRulesRef) { return } Promise.all([ruleFormRef.value.validate(), certFormRef.value.validate(), resultRulesRef.value.validate(), equipmentRef.value.validate()]).then(() => { ElMessageBox.confirm( '确认保存吗?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }, ).then(() => { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.8)', }) const quantityTargetListParam = quantityTargetList.value.map((item) => { return { ...item, quantityTarget: '1', item: form.value.quantityTargetItem, } }) const notQuantityTargetListParam = notQuantityTargetList.value.map((item) => { return { ...item, quantityTarget: '2', item: form.value.notQuantityTargetItem, } }) const list = quantityTargetListParam.concat(notQuantityTargetListParam) const params = { ...form.value, id: infoId.value, // confirmName: `${form.value.planYear}年${form.value.planGroup}组测量设备测试、校准或检定结果确认登记表`, quantityList: list, processId: props.processId, mainList: overallInfoList.value, // 总体信息数据 } if (props.pageType === 'add') { // 新建 addResultConfirmList(params).then((res) => { loading.close() form.value.confirmNo = res.data.confirmNo // 计划表编号 infoId.value = res.data.id // id emits('addSuccess', infoId.value) ElMessage.success('已保存') }).catch(() => { loading.close() }) } else if (props.pageType === 'edit') { // 编辑 console.log(props.approvalStatusName) if (props.approvalStatusName === '草稿箱' || props.approvalStatusName === '全部') { updateResultConfirmList(params).then((res) => { loading.close() emits('addSuccess', infoId.value) ElMessage.success('已保存') }).catch(() => { loading.close() }) } else { // '未通过' || '已取消' failUpdateResultConfirmList(params).then((res) => { loading.close() emits('submitSuccess') fetchInfo() ElMessage.success('已保存') }).catch(() => { loading.close() }) } } }) }) } // ----------------------------------------------提交-------------------------------------------- // 提交 /** * * @param processId 流程实例id * @param id */ const submitForm = (processId: string, id: string) => { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) submit({ id, formId: SCHEDULE.TRACE_RESULT_VERIFICATION_APPROVAL }).then((res) => { ElMessage.success('已提交') emits('submitSuccess') loading.close() }) } // -----------------------------------------获取详情------------------------------------------ // 获取详情 function fetchInfo() { loading.value = true getInfo({ id: infoId.value }).then((res) => { loading.value = false for (const prop in form.value) { form.value[prop] = res.data[prop] } form.value.planYear = `${res.data.planYear}` const tempList = res.data.quantityList.map((item: { editable: Boolean }) => { return { ...item, editable: props.pageType !== 'detail', } }) // 处理量传指标与非量传指标的数据 quantityTargetList.value = tempList.filter((item: { quantityTarget: string }) => item.quantityTarget === '1') // 量传指标 notQuantityTargetList.value = tempList.filter((item: { quantityTarget: string }) => item.quantityTarget === '2') // 非量传指标 if (quantityTargetList.value && quantityTargetList.value.length) { form.value.quantityTargetItem = quantityTargetList.value[0].item! // 量传指标检定项目 } if (notQuantityTargetList.value && notQuantityTargetList.value.length) { form.value.notQuantityTargetItem = notQuantityTargetList.value[0].item! // 非量传指标检定项目 } overallInfoList.value = res.data.mainList // 总体信息 }) } // 监听测试、校准或检定日期变化,有效期在测试、校准或检定日期基础上增加一年 const changeTraceDate = (date: string) => { form.value.validDate = dayjs(date).add(1, 'year').format('YYYY-MM-DD') } // ---------------------------------------------钩子---------------------------------------------- watch(() => props.id, (newValue) => { infoId.value = newValue! if (infoId.value) { fetchInfo() // 获取详情信息 } }, { immediate: true }) const route = useRoute() onMounted(() => { getDict() form.value.createUserId = user.id// 创建人id form.value.createUserName = user.name // 创建人名字 form.value.createTime = dayjs().format('YYYY-MM-DD HH:mm:ss')// 创建时间 if (props.pageType !== 'add') { fetchInfo() // 获取详情信息 } else { // 新建 form.value.labCode = route.query.labCode as string // 实验室 form.value.labCodeName = route.query.labCodeName as string // 实验室名称 form.value.groupCode = route.query.groupCode as string // 部门 form.value.groupCodeName = route.query.groupCodeName as string // 部门名称 form.value.planGroup = route.query.planGroup as string // 计划表部门 form.value.planYear = route.query.planYear as string // 计划表年份 form.value.equipmentId = route.query.equipmentId as string // 设备id form.value.equipmentNo = route.query.equipmentNo as string // 统一编号 form.value.equipmentName = route.query.equipmentName as string // 设备名称 form.value.model = route.query.model as string // 规格型号 form.value.manufactureNo = route.query.manufactureNo as string // 出厂编号 form.value.manufacturer = route.query.manufacturer as string // 生产厂家 form.value.standardNo = route.query.standardNo as string // 所属测量标准号 form.value.standardName = route.query.standardName as string // 所属测量标准名称 form.value.directorName = route.query.directorName as string // 负责人 form.value.confirmName = `${route.query.planYear}年${route.query.planGroup}组测量设备测试、校准或检定结果确认登记表` form.value.planId = route.query.planId as string // 溯源计划id fetchEquipmentDetail(route.query.equipmentId as string) // 获取量传指标、非量传指标 } }) defineExpose({ saveForm, submitForm, fetchInfo }) </script> <template> <div class="result-confirm"> <detail-block v-loading="loading" title=""> <el-form ref="ruleFormRef" :model="form" :label-width="120" label-position="right" :rules="rules" > <el-row :gutter="24"> <el-col :span="6"> <el-form-item label="文件编号:" prop="confirmNo"> <el-input v-model="form.confirmNo" disabled placeholder="系统自动生成" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="文件名称:" prop="confirmName"> <el-input v-model="form.confirmName" disabled placeholder="文件名称" /> </el-form-item> </el-col> <!-- <el-col :span="12" style="display: flex;line-height: 32px;"> <el-form-item label="文件名称:" /> <el-form-item label-width="0" prop="planYear" style="width: 90px;"> <el-date-picker v-model="form.planYear" type="year" placeholder="选择年" format="YYYY" value-format="YYYY" disabled /> </el-form-item> <span style="margin: 0 8px;font-size: 14px;color: #606266;">年</span> <el-form-item label-width="0" prop="planGroup" style="width: 90px;"> <el-input v-model="form.planGroup" disabled placeholder="输入组" /> </el-form-item> <span style="margin: 0 8px;font-size: 14px;color: #606266;">组测量设备测试、校准或检定结果确认登记表</span> </el-col> --> <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="创建时间:" prop="createTime"> <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 /> </el-form-item> </el-col> </el-row> </el-form> </detail-block> <detail-block v-loading="loading" title="测量设备基本信息"> <el-form ref="equipmentRef" :model="form" :label-width="120" label-position="right" :rules="rules" > <el-row :gutter="24"> <el-col :span="6"> <el-form-item label="统一编号:" prop="equipmentNo"> <el-input v-model="form.equipmentNo" :placeholder="pageType === 'detail' ? '' : '统一编号'" :class="{ 'detail-input': pageType === 'detail' }" disabled /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="设备名称:" prop="equipmentName"> <el-input v-model="form.equipmentName" disabled placeholder="设备名称" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="规格型号" prop="model"> <el-input v-model.trim="form.model" placeholder="规格型号" disabled class="full-width-input" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="出厂编号:" prop="manufactureNo"> <el-input v-model.trim="form.manufactureNo" placeholder="出厂编号" class="detail-input" disabled /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="生产厂家:" prop="manufacturer"> <el-input v-model.trim="form.manufacturer" placeholder="生产厂家" class="detail-input" disabled /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="实验室" prop="labCode"> <el-select v-model="form.labCode" :placeholder="pageType === 'detail' ? ' ' : '实验室'" disabled class="full-width-input" > <el-option v-for="item in labCodeList" :key="item.id" :label="item.name" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="部门" prop="groupCode"> <el-select v-model="form.groupCode" :placeholder="pageType === 'detail' ? ' ' : '部门'" disabled class="full-width-input" > <el-option v-for="item in groupCodeList" :key="item.id" :label="item.name" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="负责人:" prop="directorName"> <el-input v-model.trim="form.directorName" placeholder="负责人" class="detail-input" disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="所属测量标准名称:" prop="standardName" label-width="140px"> <el-input v-model.trim="form.standardName" placeholder="所属测量标准名称" class="detail-input" disabled type="textarea" autosize /> </el-form-item> </el-col> </el-row> </el-form> </detail-block> <detail-block v-loading="loading" title="证书相关要素确认"> <detail-block title="总体信息"> <template v-if="pageType !== 'detail'" #btns> <el-button type="primary" @click="addOverallInfo"> 增加行 </el-button> <el-button type="info" @click="deleteOverallInfo"> 删除行 </el-button> </template> <input v-show="false" ref="fileRef" type="file" @change="onFileChange"> <el-table ref="overallInfoTableRef" :data="overallInfoList" border style="width: 100%;" @selection-change="handleSelectionOverallInfoChange" > <el-table-column v-if="pageType !== 'detail'" type="selection" width="38" /> <el-table-column align="center" label="序号" width="80" type="index" /> <el-table-column v-for="item in overallInfoColumns" :key="item.value" :prop="item.value" :label="item.text" align="center" > <template #header> <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span> </template> <template #default="scope"> <el-radio-group v-if="item.value === 'measureCategory'" v-model="scope.row[item.value]" :disabled="pageType === 'detail'"> <el-radio label="1"> 测试 </el-radio> <el-radio label="2"> 校准 </el-radio> <el-radio label="3"> 检定 </el-radio> </el-radio-group> <el-radio-group v-if="(item.value === 'labelConsistent' || item.value === 'supplierConsistent' || item.value === 'diagramConsistent')" v-model="scope.row[item.value]" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> <show-photo v-if="item.value === 'certificateFile'" :minio-file-name="scope.row[item.value]" /> <el-button v-if="item.value === 'certificateFile' && pageType !== 'detail'" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-left': scope.row.certificateFile === '' ? '0px' : '20px' }" @click="upload(scope.$index)" > {{ scope.row.certificateFile === '' ? '上传' : '更换附件' }} </el-button> <el-input v-if="(item.value === 'certificateNo' || item.value === 'traceCompany') && pageType !== 'detail'" v-model="scope.row[item.value]" type="textarea" autosize :placeholder="`${item.text}`" class="input" /> </template> </el-table-column> </el-table> </detail-block> <el-form ref="certFormRef" :model="form" :label-width="200" label-position="right" :rules="rules" > <el-row :gutter="24"> <el-divider content-position="left"> <span style="font-weight: 600;">委托方</span> </el-divider> <el-col :span="8"> <el-form-item label="委托方名称是否与实际相符:" prop="customerMatch"> <el-radio-group v-model="form.customerMatch" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="委托方地址是否与实际相符:" prop="customerAddressMatch"> <el-radio-group v-model="form.customerAddressMatch" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> </el-form-item> </el-col> <el-divider content-position="left"> <span style="font-weight: 600;">被检件</span> </el-divider> <el-col :span="8"> <el-form-item label="被检件名称是否正确:" prop="equipmentCorrect"> <el-radio-group v-model="form.equipmentCorrect" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="被检件型号是否正确:" prop="equipmentModelCorrect"> <el-radio-group v-model="form.equipmentModelCorrect" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="被检件编号是否正确:" prop="equipmentNoCorrect"> <el-radio-group v-model="form.equipmentNoCorrect" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="被检件生产厂家是否正确:" prop="equipmentManufacturerCorrect"> <el-radio-group v-model="form.equipmentManufacturerCorrect" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> </el-form-item> </el-col> <el-divider content-position="left"> <span style="font-weight: 600;">测量设备</span> </el-divider> <el-col :span="8"> <el-form-item label="测量设备开展检定工作时是否在有效期内:" label-width="280px" prop="onValid"> <el-radio-group v-model="form.onValid" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> </el-form-item> </el-col> <el-col v-if="form.onValid === 0" :span="16"> <el-form-item label="否则列出:" prop="denyInfo"> <el-input v-model="form.denyInfo" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-divider content-position="left"> <span style="font-weight: 600;">依据技术文件</span> </el-divider> <el-col :span="24"> <el-form-item label="依据文件是否正确:" prop="fileCorrect"> <el-radio-group v-model="form.fileCorrect" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="编号1:" prop="fileNoOne"> <el-input v-model="form.fileNoOne" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入编号'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="名称1:" prop="fileNoNameOne"> <el-input v-model="form.fileNoNameOne" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入名称'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="编号2:" prop="fileNoTwo"> <el-input v-model="form.fileNoTwo" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入编号'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="名称2:" prop="fileNoNameTwo"> <div style="display: flex;flex-wrap: nowrap;"> <el-input v-model="form.fileNoNameTwo" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入名称'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" style="flex: 1;" /> <icon-button v-if="!showFileTree && pageType !== 'detail'" style="margin-left: 10px;" size="20" icon="icon-add-circle" title="新建" type="primary" @click="addFile" /> </div> </el-form-item> </el-col> <el-col v-if="showFileTree" :span="8"> <el-form-item label="编号3:" prop="fileNoThree"> <el-input v-model="form.fileNoThree" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入编号'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> <el-col v-if="showFileTree" :span="8"> <el-form-item label="名称3:" prop="fileNoNameThree"> <div style="display: flex;flex-wrap: nowrap;"> <el-input v-model="form.fileNoNameThree" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入名称'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> <icon-button v-if="showFileTree && !showFileFour && pageType !== 'detail'" style="margin-left: 10px;" size="20" icon="icon-reduce-circle" title="移除" type="primary" @click="removeFile" /> <icon-button v-if="!showFileFour && pageType !== 'detail'" style="margin-left: 10px;" size="20" icon="icon-add-circle" title="新建" type="primary" @click="addFile" /> </div> </el-form-item> </el-col> <el-col v-if="showFileFour" :span="8"> <el-form-item label="编号4:" prop="fileNoFour"> <el-input v-model="form.fileNoFour" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入编号'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> <el-col v-if="showFileFour" :span="8"> <el-form-item label="名称4:" prop="fileNoNameFour"> <div style="display: flex;flex-wrap: nowrap;"> <el-input v-model="form.fileNoNameFour" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入名称'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> <icon-button v-if="showFileFour && pageType !== 'detail'" style="margin-left: 10px;" size="20" icon="icon-reduce-circle" title="移除" type="primary" @click="removeFile" /> </div> </el-form-item> </el-col> <el-divider content-position="left"> <span style="font-weight: 600;">结论</span> </el-divider> <el-col :span="8"> <el-form-item label="结论:" prop="conclusion"> <el-select v-model="form.conclusion" :placeholder="pageType === 'detail' ? ' ' : '请选择结论'" :disabled="pageType === 'detail'" class="full-width-input" > <el-option v-for="item of meterIdentifyDict" :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="resultCorrect"> <el-radio-group v-model="form.resultCorrect" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="测试、校准或检定日期:" prop="traceDate"> <el-date-picker v-model="form.traceDate" type="date" :placeholder="pageType === 'detail' ? ' ' : '测试、校准或检定日期'" class="full-width-input" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" format="YYYY-MM-DD" value-format="YYYY-MM-DD" @change="changeTraceDate" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="日期是否与粘贴标识一致:" prop="dateCorrect"> <el-radio-group v-model="form.dateCorrect" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="有效期:" prop="validDate"> <el-date-picker v-model="form.validDate" type="date" :placeholder="pageType === 'detail' ? ' ' : '有效期'" class="full-width-input" :class="{ 'detail-input': pageType === 'detail' }" :disabled="pageType === 'detail'" format="YYYY-MM-DD" value-format="YYYY-MM-DD" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="有效期是否正确:" prop="validDateCorrect"> <el-radio-group v-model="form.validDateCorrect" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> </el-form-item> </el-col> <el-divider content-position="left"> <span style="font-weight: 600;">签章</span> </el-divider> <el-col :span="8"> <el-form-item label="签名信息是否齐全:" prop="signComplete"> <el-radio-group v-model="form.signComplete" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="是否盖有有效印章:" prop="sealComplete"> <el-radio-group v-model="form.sealComplete" :disabled="pageType === 'detail'"> <el-radio :label="1"> 是 </el-radio> <el-radio :label="0"> 否 </el-radio> </el-radio-group> </el-form-item> </el-col> </el-row> </el-form> </detail-block> <detail-block v-loading="loading" title="相关数据信息确认"> <detail-block title="量传指标"> <div> <div class="tech-file"> <span class="file-text">检定项目: <span v-if="pageType === 'detail'"> {{ form.quantityTargetItem }} </span></span> <el-input v-if="pageType !== 'detail'" v-model.trim="form.quantityTargetItem" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入检定项目'" :disabled="pageType === 'detail'" style="width: 50%;" /> </div> </div> <template v-if="pageType !== 'detail'" #btns> <el-button type="primary" @click="addRow('quantityTarget')"> 增加行 </el-button> <el-button type="info" @click="deleteRow('quantityTarget')"> 删除行 </el-button> </template> <el-table ref="techRef" :data="quantityTargetList" border style="width: 100%;" @selection-change="handleTechSelectionQuantityTargetChange" @row-dblclick="rowDblclickQuantityTarget" > <el-table-column v-if="pageType !== 'detail'" type="selection" width="38" /> <el-table-column align="center" label="序号" width="80" type="index" /> <el-table-column v-for="item in quantityTargetColumns" :key="item.value" :prop="item.value" :label="item.text" align="center" > <template #header> <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span> </template> <template #default="scope"> <span v-if="pageType === 'detail' && item.value !== 'meetRequire'">{{ scope.row[item.value] }}</span> <span v-if="pageType === 'detail' && item.value === 'meetRequire'">{{ scope.row[item.value] === 0 ? '不满足' : scope.row[item.value] === 1 ? '满足' : '未知' }}</span> <el-input v-if="pageType !== 'detail' && item.value !== 'meetRequire'" v-model="scope.row[item.value]" :placeholder="`${item.text}`" class="input" /> <el-radio-group v-if="pageType !== 'detail' && item.value === 'meetRequire'" v-model="scope.row[item.value]" :disabled="pageType === 'detail'"> <el-radio :label="1"> 满足 </el-radio> <el-radio :label="0"> 不满足 </el-radio> </el-radio-group> </template> </el-table-column> </el-table> </detail-block> <detail-block title="非量传指标"> <div class="tech-file"> <span class="file-text">检定项目: <span v-if="pageType === 'detail'">{{ form.notQuantityTargetItem }}</span></span> <el-input v-if="pageType !== 'detail'" v-model.trim="form.notQuantityTargetItem" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入检定项目'" :disabled="pageType === 'detail'" style="width: 50%;" /> </div> <template v-if="pageType !== 'detail'" #btns> <el-button type="primary" @click="addRow('notQuantityTarget')"> 增加行 </el-button> <el-button type="info" @click="deleteRow('notQuantityTarget')"> 删除行 </el-button> </template> <el-table ref="techRef" :data="notQuantityTargetList" border style="width: 100%;" @selection-change="handleTechSelectionNotQuantityTargetChange" @row-dblclick="rowDblclickNotQuantityTarget" > <el-table-column v-if="pageType !== 'detail'" type="selection" width="38" /> <el-table-column align="center" label="序号" width="80" type="index" /> <el-table-column v-for="item in quantityTargetColumns" :key="item.value" :prop="item.value" :label="item.text" align="center" > <template #header> <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span> </template> <template #default="scope"> <span v-if="pageType === 'detail' && item.value !== 'meetRequire'">{{ scope.row[item.value] }}</span> <span v-if="pageType === 'detail' && item.value === 'meetRequire'">{{ scope.row[item.value] === 0 ? '不满足' : scope.row[item.value] === 1 ? '满足' : '未知' }}</span> <el-input v-if="pageType !== 'detail' && item.value !== 'meetRequire'" v-model="scope.row[item.value]" :placeholder="`${item.text}`" class="input" /> <el-radio-group v-if="pageType !== 'detail' && item.value === 'meetRequire'" v-model="scope.row[item.value]" :disabled="pageType === 'detail'"> <el-radio :label="1"> 满足 </el-radio> <el-radio :label="0"> 限用 </el-radio> </el-radio-group> </template> </el-table-column> </el-table> </detail-block> </detail-block> <detail-block v-loading="loading" title=""> <el-form ref="resultRulesRef" :model="form" :label-width="120" label-position="right" :rules="rules" > <el-row :gutter="24"> <el-col :span="16"> <el-form-item label="结果确认结论:" prop="meterIdentifyName"> <el-input v-model="form.meterIdentifyName" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入结果确认结论'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-col :span="16"> <el-form-item label="限用范围:"> <el-input v-model="form.limitScope" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入限用范围'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-col :span="16"> <el-form-item label="备注:"> <el-input v-model="form.remark" type="textarea" autosize :placeholder="pageType === 'detail' ? '' : '请输入限用备注'" :disabled="pageType === 'detail'" :class="{ 'detail-input': pageType === 'detail' }" /> </el-form-item> </el-col> </el-row> </el-form> </detail-block> </div> </template> <style lang="scss" scoped> .tech-file { display: flex; align-items: center; margin-left: 20px; margin-bottom: 10px; .file-text { white-space: nowrap; margin-right: 10px; font-size: 14px; color: #60627f; } } </style> <style lang="scss"> .result-confirm { .el-radio__label { display: block !important; } } </style>