<!-- 第一套:多功能校准源标准装置 --> <!-- 检定数据管理详情模板 --> <script lang="ts" setup name="MeasureDataTemplateDetail"> import { ref } from 'vue' import { ElLoading, ElMessage } from 'element-plus' import dayjs from 'dayjs' import type { IForm } from '../../measureData-interface' import changeRecord from '../changeRecord.vue' import selectStandard from '../../dialog/selectStandardDialog.vue' import type { IDetailMeasureList } from './first-interface' import { getUserList } from '@/api/system/user' import useUserStore from '@/store/modules/user' import { getDictByCode } from '@/api/system/dict' import type { deptType, dictType } from '@/global' import { getDeptTreeList } from '@/api/system/dept' import { toTreeList } from '@/utils/structure' import type { TableColumn } from '@/components/NormalTable/table_interface' import { getEquipmentList } from '@/api/equipment/standard/book' import { useUniqueArray } from '@/utils/useUniqueArray' import { getInfo } from '@/api/business/taskMeasure/measureData' import { getInfo as getItemInfo } from '@/api/business/measure/item' import { getClassificationList } from '@/api/business/measure/classification' const user = useUserStore() // 用户信息 const $router = useRouter() // 关闭页面使用 const $route = useRoute() // 路由参数 const ruleFormRef = ref() // 表单ref const form = ref<IForm>({ dataNo: '', // 检定数据编号 measureCategory: '', // 检校类别 measureCategoryName: '', // 检校类别名称 customerName: '', // 委托单位 traceDate: '', // 测试、校准或检定日期 measureValidDate: '', // 检定有效期 measureAddress: '', // 测试、校准或检定地点 temperature: '', // 温度 humidity: '', // 相对湿度 orderId: '', orderNo: '', // 任务单编号 technologyFile: '', // 依据的技术文件(编号、名称) createUserId: '', // 检定员id createUserName: '', // 检定员 dataSource: '', // 数据来源 conclusion: '', // 结论 restrictionInstruction: '', // 限用说明 appearanceFunctionCheck: '外观完好,工作正常', // 外观及功能性检查 }) // 校验规则 const rules = ref({ measureCategory: [{ required: true, message: '检校类别不能为空', trigger: ['blur', 'change'] }], customerName: [{ required: true, message: '委托单位不能为空', trigger: ['blur', 'change'] }], traceDate: [{ required: true, message: '测试、校准或检定日期不能为空', trigger: ['blur', 'change'] }], measureValidDate: [{ required: true, message: '检定有效期不能为空', trigger: ['blur', 'change'] }], measureAddress: [{ required: true, message: '测试、校准或检定地点不能为空', trigger: ['blur', 'change'] }], temperature: [{ required: true, message: '温度不能为空', trigger: ['blur', 'change'] }], humidity: [{ required: true, message: '相对湿度不能为空', trigger: ['blur', 'change'] }], orderNo: [{ required: true, message: '任务单编号不能为空', trigger: ['blur', 'change'] }], // technologyFile: [{ required: true, message: '依据的技术文件不能为空', trigger: ['blur', 'change'] }], createUserName: [{ required: true, message: '检定员不能为空', trigger: ['blur', 'change'] }], conclusion: [{ required: true, message: '结论不能为空', trigger: ['blur', 'change'] }], restrictionInstruction: [{ required: true, message: '限用说明不能为空', trigger: ['blur', 'change'] }], appearanceFunctionCheck: [{ required: true, message: '外观及功能性检查不能为空', trigger: ['blur', 'change'] }], }) const itemCategoryName = ref('') // 设备检定项分类名称 // -------------------------------------------路由参数------------------------------------------ const pageType = ref('add') // 页面类型: add, edit, detail const infoId = ref('') // 列表id if ($route.params && $route.params.type) { pageType.value = $route.params.type as string if ($route.params.id) { infoId.value = $route.params.id as string } } // -------------------------------------------字典---------------------------------------------+ const conclusionList = ref<dictType[]>([]) // 结论 const measureCategoryList = ref<dictType[]>([]) // 检校类别 const positionList = ref<dictType[]>([]) // 测试、校准或检定地点 const userList = ref<{ [key: string]: string }[]>([]) // 用户列表 const useDeptList = ref<deptType[]>([]) // 所属部门列表 const deptList = ref<deptType[]>([]) // 所属部门列表 // 获取字典值 async function getDict() { // 结论 getDictByCode('bizConclusion').then((response) => { conclusionList.value = response.data }) // 检校类别 getDictByCode('measureCategory').then((response) => { measureCategoryList.value = response.data }) // 测试、校准或检定地点 positionList.value = [ { id: '1', name: '地点1', value: '1', }, { id: '2', name: '地点2', value: '2', }, ] // 获取用户列表 getUserList({ offset: 1, limit: 999999 }).then((res: any) => { userList.value = res.data.rows }) // 获取部门列表 getDeptTreeList().then((res) => { deptList.value = res.data // 转成树结构 useDeptList.value = toTreeList(res.data, '0', true) }) // 获取用户列表 // getStaffList({ offset: 1, limit: 999999 }).then((res: any) => { // userList.value = res.data.rows // }) } // --------------------------------------被检件信息-------------------------------------------------------- const sampleList = ref([]) as any // 被检件 const columns = ref<TableColumn[]>([ // 表头 { text: '设备名称', value: 'sampleName', align: 'center' }, { text: '规格型号', value: 'sampleModel', align: 'center' }, { text: '出厂编号', value: 'manufactureNo', align: 'center' }, { text: '制造厂家', value: 'manufacturer', align: 'center' }, { text: '设备检定项分类', value: 'categoryName', align: 'center' }, ]) // --------------------------------------所使用的标准,主要测量设备-------------------------------------------------------- const measureDataCalibratorList = ref([]) as any // 列表 const selectStandardRef = ref() // 所使用的标准,主要测量设备组件ref const checkoutMeasureDataCalibratorList = ref([]) as any // 选中列表 const tableLoading = ref(false) // 表格loading const measureDataCalibratorColumns = ref<TableColumn[]>([ // 表头 { text: '设备名称', value: 'equipmentName', align: 'center' }, { text: '规格型号', value: 'model', align: 'center' }, { text: '出厂编号', value: 'manufactureNo', align: 'center' }, { text: '不确定度或允许误差极限或准确度等级', value: 'uncertainty', align: 'center' }, { text: '证书有效期', value: 'measureValidDate', align: 'center' }, ]) // 用标准装置id获取标准配套设备查询条件 const listQuery = ref({ standardId: '', offset: 1, limit: 999999, }) // 批量增加 const multiFilesAdd = () => { selectStandardRef.value.initDialog() } // 选好标准装置 const confirmSelectStandard = (val: any) => { if (val.length) { const allRequest = [] as any // 所有的请求 let tempEquipmentList = [] as any // 临时变量-选择的标准装置所对应的配套设备 val.forEach((item: { id: string }) => { tableLoading.value = true // 表格loading listQuery.value.standardId = item.id // 标准装置id const request = getEquipmentList(listQuery.value).then((res) => { // 请求 tempEquipmentList = tempEquipmentList.concat(res.data.rows) }) allRequest.push(request) // 集合所有请求 }) Promise.all(allRequest).then(() => { // 等待所有请求完成 let tempList = [] as any // 临时数组 tempList = tempList.concat(tempEquipmentList) measureDataCalibratorList.value = useUniqueArray(tempList) // 数组去重 tableLoading.value = false }) } } // 表格多选 const handleSelectionChange = (e: any) => { checkoutMeasureDataCalibratorList.value = e } // 删除行 const delRow = () => { if (checkoutMeasureDataCalibratorList.value.length <= 0) { ElMessage({ message: '请选中要删除的行', type: 'warning', }) } else { checkoutMeasureDataCalibratorList.value.forEach((item: any) => { measureDataCalibratorList.value.forEach((element: any, index: number) => { if (element.equipmentNo === item.equipmentNo) { measureDataCalibratorList.value.splice(index, 1) } }) }) } } // ------------------------------------------标签---------------------------------------------------------- const radioMenus = ref([ // 标签内容 { name: '检定数据', value: 'measure-data' }, { name: '历史修改记录', value: 'change-record' }, ]) const current = ref('measure-data') // 选择的tab 默认基本信息 // ---------------------------------------检定项数据表格---------------------------------------------------- const list = ref<IDetailMeasureList[]>([]) // 表格数据 const appearanceFunctionCheck = ref('') // 外观及功能性检查 const measureColumns = ref([]) as any // 表头数据 const columns_digitalMultimeterHandheld = ref([ // 数字多用表(手持)、钳形电流表、指针式万用表 { text: '参数', value: 'params', align: 'center', required: true, width: '120' }, { text: '量', value: 'capacity', align: 'center', width: '120', required: true }, { text: '单位', value: 'unit', align: 'center', width: '120', required: true }, { text: '频率', value: 'frequency', align: 'center' }, { text: '单位', value: 'frequencyUnit', align: 'center', width: '120' }, { text: '量程', value: 'rangeRange', align: 'center', required: true }, { text: '标准值', value: 'standardValue', align: 'center', required: true }, { text: '示值', value: 'indicatingValue', align: 'center', required: true }, { text: '绝对误差', value: 'absoluteError', align: 'center', required: true }, { text: '最大允许误差', value: 'maximumError', align: 'center', required: true }, { text: '分辨力', value: 'resolution', align: 'center', required: true }, ]) const columns_digitalMultimeterTable = ref([ // 数字多用表(台式) { text: '参数', value: 'params', align: 'center', required: true }, { text: '量', value: 'capacity', align: 'center', width: '120', required: true }, { text: '单位', value: 'unit', align: 'center', width: '120', required: true }, { text: '频率', value: 'frequency', align: 'center' }, { text: '单位', value: 'frequencyUnit', align: 'center', width: '120' }, { text: '量程', value: 'rangeRange', align: 'center', required: true }, { text: '标准值', value: 'standardValue', align: 'center', required: true }, { text: '两线/四线模式', value: 'lineMode', align: 'center', required: true, width: '120' }, { text: '示值', value: 'indicatingValue', align: 'center', required: true }, { text: '绝对误差', value: 'absoluteError', align: 'center', required: true }, { text: '最大允许误差', value: 'maximumError', align: 'center', required: true }, { text: '分辨力', value: 'resolution', align: 'center', required: true }, { text: '输出备注', value: 'remark', align: 'center', required: true }, ]) const columns_multifunctionalPowerParameterMeasuringInstrument = ref([ // 多功能电力参数测量仪 { text: '参数', value: 'params', align: 'center', required: true, width: '120' }, { text: '量', value: 'capacity', align: 'center', width: '120', required: true }, { text: '单位', value: 'unit', align: 'center', width: '120', required: true }, { text: '频率', value: 'frequency', align: 'center' }, { text: '单位', value: 'frequencyUnit', align: 'center', width: '120' }, { text: '标准值', value: 'standardValue', align: 'center', required: true }, { text: 'AN', value: 'an', align: 'center', required: true }, { text: 'BN', value: 'bn', align: 'center', required: true }, { text: 'CN', value: 'cn', align: 'center', required: true }, { text: '最大允许误差', value: 'maximumError', align: 'center', required: true }, { text: '△AN', value: 'deltaAn', align: 'center', required: true }, { text: '△BN', value: 'deltaBn', align: 'center', required: true }, { text: '△CN', value: 'deltaCn', align: 'center', required: true }, { text: '分辨力', value: 'resolution', align: 'center', required: true }, ]) const columns_lastFive = ref([ // 交流电压表、交流电流表、直流电压表、直流电流表、75mV电流表 { text: '参数', value: 'params', align: 'center', required: true, width: '120' }, { text: '量', value: 'capacity', align: 'center', width: '120', required: true }, { text: '单位', value: 'unit', align: 'center', width: '120', required: true }, { text: '被检表示值(单位)', value: 'measureIndicationValue', align: 'center', width: '120', required: true }, { text: ' 标准值(单位)', value: 'unit', align: 'center', width: '120', required: true }, { text: '最大允许误差(单位)', value: 'maximumError', align: 'center', required: true }, { text: '绝对误差(单位)', value: 'absoluteError', align: 'center', required: true }, { text: '分辨力', value: 'resolution', align: 'center', required: true }, ]) // -------------------------------------------获取详情信息-------------------------------------------------- // 获取页面详情信息 const fetchInfo = () => { const loading = ElLoading.service({ lock: true, background: 'rgba(255, 255, 255, 0.8)', }) getInfo({ id: infoId.value }).then((res) => { form.value = res.data loading.close() }) } /** * 新增的时候获取检定项输入数据(获取检定项分类) * @param itemId 检定项id * @param itemCategoryName 检定项分类名字 * @param measureItemDataType 检校标准装置字典 */ const fetchItemInfo = (itemId: string, itemCategoryName: string, belongStandardEquipment = '') => { const params = { id: itemId, itemCategoryName, // 检定项分类名字 measureItemDataType: belongStandardEquipment, // 检校标准装置字典code } getItemInfo(params).then((res) => { // form.value = res.data // getList.value = res.data.measureItemDataList // 检定项表格 // technicalTargetList.value = res.data.technicalTargetList // 技术指标 }) } // 获取检定项分类的技术文件 // 查询条件 const fetchClassificationListQuery = ref({ belongStandardEquipment: '', // 检校标准装置 categoryName: '', // 检定项分类名称 categoryNo: '', // 检定项分类编号 deviceType: '', // 设备分类 measureCategory: '', // 检校类别 limit: 20, offset: 1, }) // 数据查询 function fetchClassificationData(isNowPage = false, categoryName = '', belongStandardEquipment = '') { if (!isNowPage) { // 是否显示当前页,否则跳转第一页 listQuery.value.offset = 1 } fetchClassificationListQuery.value.categoryName = categoryName // 设备分类型名称 fetchClassificationListQuery.value.belongStandardEquipment = belongStandardEquipment // 检校标准装置名称 getClassificationList(fetchClassificationListQuery.value).then((response) => { if (response.data.rows.length) { form.value.technologyFile = response.data.rows[0].technologyFile.split(';') } }) } // ------------------------------------------钩子---------------------------------------------- watch(() => itemCategoryName.value, (newValue) => { if (newValue) { switch (newValue) { case '数字多用表(手持)': measureColumns.value = columns_digitalMultimeterHandheld.value break case '数字多用表(台式)': measureColumns.value = columns_digitalMultimeterTable.value break case '多功能电力参数测量仪': measureColumns.value = columns_multifunctionalPowerParameterMeasuringInstrument.value break case '钳形电流表': measureColumns.value = columns_digitalMultimeterHandheld.value break case '指针式万用表': measureColumns.value = columns_digitalMultimeterHandheld.value break default: // 交流电压表、交流电流表、直流电压表、直流电流表、75mV电流表 measureColumns.value = columns_lastFive.value break } } }, { immediate: true }) onMounted(async () => { console.log(pageType.value, 'pageType') console.log(infoId.value, 'infoId.value') getDict().then(() => { if (pageType.value === 'add') { // 从我的任务跳转过来(新增) form.value.orderId = $route.query.orderId as string // 任务单id form.value.orderNo = $route.query.orderNo as string // 任务单编号 form.value.traceDate = dayjs().format('YYYY-MM-DD') // 测试校准检定日期默认今天 form.value.measureValidDate = `${dayjs().add(Number($route.query.checkCycle), 'month').subtract(1, 'day')}` // 检定有效期--今天 + 检定周期 - 1天 form.value.measureValidDate = dayjs(form.value.measureValidDate).format('YYYY-MM-DD') sampleList.value = [{ sampleName: $route.query.sampleName, // 设备名称 sampleModel: $route.query.sampleModel, // 规格型号 manufactureNo: $route.query.manufactureNo, // 出厂编号 manufacturer: $route.query.manufacturer, // 制造厂家(生产厂家) categoryName: $route.query.itemCategoryName, // 设备检定项分类 }] console.log('$route.query.itemId', $route.query.itemId) itemCategoryName.value = $route.query.itemCategoryName as string // 设备检定项分类名称 // 新增时查依据的技术文件(编号、名称) fetchClassificationData(false, $route.query.itemCategoryName! as string, $route.query.belongStandardEquipment as string) // 新增的时候查输入值 fetchItemInfo($route.query.itemId! as string, $route.query.itemCategoryName! as string, $route.query.belongStandardEquipmentName as string) } else { // fetchInfo() } }) }) </script> <template> <!-- 表单 --> <detail-block title=""> <el-form ref="ruleFormRef" :model="form" label-width="180" label-position="right" :rules="rules" > <el-row :gutter="24"> <el-col :span="8"> <el-form-item label="检定数据编号:" prop="dataNo"> <el-input v-model="form.dataNo" disabled placeholder="系统自动生成" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="检校类别:" prop="measureCategory"> <el-select v-model="form.measureCategory" placeholder="检校类别" filterable :disabled="pageType === 'detail'" > <el-option v-for="item in measureCategoryList" :key="item.id" :label="item.name" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="委托单位:" prop="dataNo"> <el-input v-model="form.dataNo" disabled :placeholder="pageType === 'detail' ? ' ' : '系统自动生成'" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="测试、校准或检定日期:" prop="traceDate"> <el-date-picker v-model="form.traceDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" :placeholder="pageType === 'detail' ? ' ' : '请选择日期'" :disabled="pageType === 'detail'" class="full-width-input" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="检定有效期:" prop="measureValidDate"> <el-date-picker v-model="form.measureValidDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" :placeholder="pageType === 'detail' ? ' ' : '请选择日期'" :disabled="pageType === 'detail'" class="full-width-input" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="测试、校准或检定地点:" prop="measureAddress"> <el-select v-model="form.measureAddress" placeholder="测试、校准或检定地点" filterable :disabled="pageType === 'detail'" > <el-option v-for="item in positionList" :key="item.id" :label="item.name" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="温度:" prop="temperature"> <el-input v-model="form.temperature" :disabled="pageType === 'detail'" :placeholder="pageType === 'detail' ? ' ' : '请输入温度'" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="相对湿度:" prop="humidity"> <el-input v-model="form.humidity" :disabled="pageType === 'detail'" :placeholder="pageType === 'detail' ? ' ' : '请输入相对湿度'" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="任务单编号:" prop="orderNo"> <el-input v-model="form.orderNo" disabled placeholder="任务单编号" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="检定员:" prop="dacreateUserNametaNo"> <el-input v-model="form.createUserName" disabled placeholder="检定员" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="数据来源:" prop="dataSource"> <el-input v-model="form.dataSource" disabled placeholder="数据来源" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="结论:" prop="conclusion"> <el-select v-model="form.conclusion" placeholder="请选择结论" filterable :disabled="pageType === 'detail'" > <el-option v-for="item in conclusionList" :key="item.id" :label="item.name" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col v-if="form.conclusion === '除*外其余所检项目合格'" :span="16"> <el-form-item label="限用说明:" prop="restrictionInstruction"> <el-input v-model="form.restrictionInstruction" type="textarea" autosize :disabled="pageType === 'detail'" placeholder="请输入限用说明" /> </el-form-item> </el-col> </el-row> <el-row :gutter="24" class="marg"> <el-col :span="24"> <el-form-item label="依据的技术文件:" prop="technologyFile"> <div v-for="(item, index) in form.technologyFile" :key="index" style="display: flex;"> <show-photo :minio-file-name="item" /> </div> <span v-if="pageType === 'detail' && !form.technologyFile.length">无</span> </el-form-item> </el-col> </el-row> </el-form> </detail-block> <!-- 被检件信息 --> <detail-block title="被检件信息"> <el-table :data="sampleList" border style="width: 100%;" > <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" align="center" /> </el-table> </detail-block> <detail-block title="所使用的标准,主要测量设备"> <template v-if="pageType !== 'detail'" #btns> <el-button type="primary" @click="multiFilesAdd"> 批量添加 </el-button> <el-button type="info" @click="delRow"> 删除行 </el-button> </template> <el-table v-loading="tableLoading" :data="measureDataCalibratorList" border style="width: 100%;" @selection-change="handleSelectionChange" > <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 measureDataCalibratorColumns" :key="item.value" :prop="item.value" :label="item.text" :width="item.width" align="center" /> </el-table> </detail-block> <!-- 标签 --> <detail-block :title="pageType === 'add' ? '检定数据' : ''"> <el-radio-group v-if="pageType !== 'add'" v-model="current"> <el-radio-button v-for="item in radioMenus" :key="item.value" :label="item.value"> {{ item.name }} </el-radio-button> </el-radio-group> <el-form v-if="current === 'measure-data'" ref="ruleFormRef" :model="form" label-width="150" label-position="right" :rules="rules" style="margin-top: 20px;" > <el-row> <el-col :span="12"> <el-form-item label="外观及功能性检查:" prop="appearanceFunctionCheck"> <el-input v-model="form.appearanceFunctionCheck" class="full-width-input" autosize type="textarea" :disabled="pageType === 'detail'" /> </el-form-item> </el-col> </el-row> <div style="font-size: 14px;color: #606266;padding: 0 20px 20px;"> 示值误差: </div> </el-form> <!-- 检定数据表格 --> <el-table v-if="current === 'measure-data'" ref="tableRef" :data="list" border style="width: 100%;" @selection-change="handleSelectionChange" > <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 measureColumns" :key="item.value" :prop="item.value" :label="item.text" :width="item.width" align="center" /> </el-table> <!-- 历史修改记录 --> <change-record v-if="pageType !== 'add' && current === 'change-record'" :info-id="infoId" /> </detail-block> <!-- 选择标准装置组件 --> <select-standard ref="selectStandardRef" :is-multi="true" @confirm="confirmSelectStandard" /> </template> <style lang="scss" scoped> .step { line-height: 28px; font-size: 20px; color: #3d7eff; font-weight: bold; margin-bottom: 5px; width: fit-content; } </style> <style lang="scss"> .fieldtest-record-detail { .el-table thead.is-group th.el-table__cell { background: #f2f6ff; } } </style>