<!-- 检定项分类管理详情 --> <script lang="ts" setup name="BusinessMeasureClassificationDetail"> import { ref } from 'vue' import { ElLoading, ElMessage } from 'element-plus' import type { IForm } from './classification-interface' import useUserStore from '@/store/modules/user' import { getDictByCode } from '@/api/system/dict' import type { dictType } from '@/global' import { UploadFile } from '@/api/file' import showPhoto from '@/components/showPhoto/index.vue' import { getLocationList } from '@/api/business/taskMeasure/measureData' import { addClassification, updateClassification } from '@/api/business/measure/classification' import selectTechFiles from '@/views/equipement/standard/book/dialog/selectTechFiles.vue' import { useSolveTemperatureHumidity } from '@/views/equipement/standard/book/components/useSolveTemperatureHumidity' const user = useUserStore() // 用户信息 const textMap: { [key: string]: string } = { edit: '编辑', add: '新建', detail: '详情', }// 字典 const $router = useRouter() // 关闭页面使用 const $route = useRoute() // 路由参数 const pageType = ref('add') // 页面类型: add, edit, detail const infoId = ref('') // 列表id const ruleFormRef = ref() // 表单ref const form = ref<IForm>({ categoryNo: '', // 检定项分类编号 categoryName: '', // 检定项分类名称 deviceType: '', // 智能模型分类(检校分类) deviceTypeName: '', // 智能模型分类(检校分类)名称 belongStandardEquipment: '', // 检校标准装置 belongStandardEquipmentName: '', // 检校标准装置名称 measureCategory: '', // 检校类别 measureCategoryName: '', // 检校类别名称 technologyFile: '', // 依据技术文件 technologyFileArr: [], // 依据技术文件 labLocation: [], // 地点 labH: '', // 选择海口实验室时海口实验室名字 labX: '', // 选择西昌实验室时西昌实验室名字 wiringDiagram: '', // 接线图上传 wiringIllustrate: '', // 接线说明 humidityLower: '', // 湿度下限 humidityUpper: '', // 湿度上限 temperatureLower: '', // 温度下限 temperatureUpper: '', // 温度上限 }) // 校验规则 const formRules = ref({ measureCategory: [{ required: true, message: '检校类别不能为空', trigger: ['blur', 'change'] }], technologyFile: [{ required: true, message: '依据技术文件不能为空', trigger: ['blur', 'change'] }], labLocation: [{ required: true, message: '地点不能为空', trigger: ['blur', 'change'] }], labX: [{ required: true, message: '西昌实验室名字不能为空', trigger: ['blur', 'change'] }], labH: [{ required: true, message: '海口实验室名字不能为空', trigger: ['blur', 'change'] }], technologyFileArr: [{ required: true, message: '依据的技术文件不能为空', trigger: ['blur', 'change'] }], }) // -------------------------------------------字典------------------------------------------ const deviceTypeList = ref<dictType[]>([])// 智能模型分类 const standardList = ref<dictType[]>([])// 检校标准装置 const measureCategoryList = ref<dictType[]>([])// 检校类别 const labXList = ref([]) as any// 西昌实验室 const labHList = ref([]) as any// 海口实验室 function getDict() { // 检校类别 getDictByCode('measureCategory').then((response) => { measureCategoryList.value = response.data }) // 智能模型分类 getDictByCode('eqptDeviceType').then((response) => { deviceTypeList.value = response.data }) // 检校标准库 getDictByCode('bizStandardEquipmentType').then((response) => { standardList.value = response.data }) // 测试、校准或检定地点 getLocationList({ locationName: '', // 地点名称 locationNo: '', // 地点编号 // labName: user.bizLabCode === 'H' ? '海口实验室' : user.bizLabCode === 'X' ? '西昌实验室' : '', limit: 999999, offset: 1, }).then((res) => { labXList.value = res.data.rows.filter((item: { locationLab: string }) => item.locationLab === '西昌实验室') labHList.value = res.data.rows.filter((item: { locationLab: string }) => item.locationLab === '海口实验室') }) } // ----------------------------------路由参数------------------------------------------------ if ($route.params && $route.params.type) { pageType.value = $route.params.type as string console.log(pageType.value) if ($route.params.id) { infoId.value = $route.params.id as string } } // -------------------------------------------选择依据的技术文件-------------------------------------- const delFile = (index: number) => { form.value.technologyFileArr.splice(index, 1) form.value.technologyFileArr = form.value.technologyFileArr.map((item: any) => { return item }) } const selectTechFilesRef = ref() // 选择依据的技术文件组件ref // 点击选择 const handleSelectTechFiles = () => { selectTechFilesRef.value.initDialog(true) } const technologyFileArrAllData = ref([]) // 选好的依据的技术文件 // 选好技术文件 const confirmSelect = (value: any) => { form.value.technologyFileArr = value.map((item: { file: string }) => item.file) technologyFileArrAllData.value = value.map((item: { id: string }) => { return { ...item, technologyFileId: item.id, } }) } // --------------------------------------------接线图上传------------------------------------- // -------------------------------------------文件上传-------------------------------------- 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) { form.value.wiringDiagram = res.data[0] // 重置当前验证 ElMessage.success('文件上传成功') loading.close() } else { ElMessage.error(res.message) loading.close() } }) } } const upload = () => { fileRef.value.click() } // ------------------------------------------------------------------------------------------ // 关闭新增页面的回调 const close = () => { $router.back() } // 保存 const save = () => { ruleFormRef.value!.validate((valid: boolean) => { if (valid) { const loading = ElLoading.service({ lock: true, background: 'rgba(255, 255, 255, 0.8)', }) const labLocation = form.value.labX + form.value.labH // =======依据的技术文件用分号隔开================ let tempFile = '' form.value.technologyFileArr.forEach((item: any, index: number) => { if (index === form.value.technologyFileArr.length - 1) { // 最后一个 tempFile += `${item}` } else { tempFile += `${item};` } }) console.log(tempFile) form.value.technologyFile = tempFile // ============================================== if (pageType.value === 'add') { // 新建 addClassification({ ...form.value, labLocation }).then((res) => { ElMessage.success('保存成功') form.value.categoryNo = res.data.categoryNo // 检定项分类编号 pageType.value = 'detail' loading.close() }).catch(() => { loading.close() }) } // 保存 else if (pageType.value === 'edit') { // 编辑 updateClassification({ ...form.value, id: infoId.value, labLocation }).then((res) => { ElMessage.success('保存成功') pageType.value = 'detail' loading.close() }).catch(() => { loading.close() }) } } else { console.log('表单校验不通过') } }) } // 点击编辑 const edit = () => { pageType.value = 'edit' } // -------------------------------------钩子----------------------------------------------------- watch(() => technologyFileArrAllData.value, (newValue) => { console.log('------', newValue) // const list = newValue.filter((item: { fileNo: string }) => item.fileNo) // console.log('监听到依据的技术文件的修改', list, list.length) if (newValue.length) { const { minTemperature, maxTemperature, minHumidity, maxHumidity } = useSolveTemperatureHumidity(newValue) form.value.humidityLower = minHumidity// 湿度下限 form.value.humidityUpper = maxHumidity// 湿度上限 form.value.temperatureLower = minTemperature // 温度下限 form.value.temperatureUpper = maxTemperature // 温度上限 console.log('温度下限', form.value.temperatureLower) console.log('温度上限', form.value.temperatureUpper) console.log('湿度下限', form.value.humidityLower) console.log('湿度上限', form.value.humidityUpper) } }, { deep: true }) onMounted(async () => { getDict() if (pageType.value !== 'add') { form.value = { ...$route.query as any } form.value.labLocation = [] if ($route.query.labX) { form.value.labLocation.push('西昌') } if ($route.query.labH) { form.value.labLocation.push('海口') } form.value.technologyFileArr = form.value.technologyFile.split(';') } }) </script> <template> <app-container class="business-measure-classification"> <detail-page :title="`检定项分类管理-${textMap[pageType]}`"> <template #btns> <el-button v-if="pageType === 'detail'" type="primary" @click="edit"> 编辑 </el-button> <el-button v-if="pageType !== 'detail'" type="primary" @click="save"> 保存 </el-button> <el-button type="info" @click="close"> 关闭 </el-button> </template> <el-form ref="ruleFormRef" :model="form" label-width="130" label-position="right" :rules="formRules" > <el-row :gutter="24"> <el-col :span="6"> <el-form-item label="检定项分类编号:" prop="categoryNo"> <el-input v-model="form.categoryNo" class="full-width-input" disabled placeholder="系统自动生成" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="智能模型分类:" prop="deviceType"> <el-select v-model="form.deviceType" placeholder="智能模型分类" class="short-input" filterable :disabled="pageType !== 'add'" > <el-option v-for="item in deviceTypeList" :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="categoryName"> <el-input v-model="form.categoryName" class="full-width-input" :disabled="pageType !== 'add'" placeholder="请输入检定项分类名称" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="归属标准库:" prop="belongStandardEquipment"> <el-select v-model="form.belongStandardEquipment" placeholder="归属标准库" class="short-input" filterable :disabled="pageType !== 'add'" > <el-option v-for="item in standardList" :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="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="6"> <el-form-item label="地点:" prop="labLocation"> <!-- <el-radio-group v-model="form.labLocation" :disabled="pageType === 'detail'"> <el-radio label="西昌"> 西昌 </el-radio> <el-radio label="海口"> 海口 </el-radio> </el-radio-group> --> <el-checkbox-group v-model="form.labLocation" :disabled="pageType === 'detail'"> <el-checkbox label="西昌" name="labLocation" /> <el-checkbox label="海口" name="labLocation" /> </el-checkbox-group> </el-form-item> </el-col> <el-col v-if="form.labLocation.length > 1 || (form.labLocation[0] === '西昌' && form.labLocation.length === 1)" :span="6"> <el-form-item label="西昌实验室:" prop="labX"> <el-select v-model="form.labX" placeholder="请选择西昌实验室" filterable :disabled="pageType === 'detail'" > <el-option v-for="item in labXList" :key="item.id" :label="item.locationName" :value="item.locationName" /> </el-select> </el-form-item> </el-col> <el-col v-if="form.labLocation.length > 1 || (form.labLocation[0] === '海口' && form.labLocation.length === 1)" :span="6"> <el-form-item label="海口实验室:" prop="labH"> <el-select v-model="form.labH" placeholder="请选择海口实验室" filterable :disabled="pageType === 'detail'" > <el-option v-for="item in labHList" :key="item.id" :label="item.locationName" :value="item.locationName" /> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="24" class="marg"> <el-col :span="24"> <el-form-item label="依据的技术文件:" prop="technologyFileArr"> <el-button v-if="pageType !== 'detail'" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-right': '20px' }" @click="handleSelectTechFiles"> {{ !form.technologyFileArr.length ? '选择' : '选择' }} </el-button> <div v-for="(item, index) in form.technologyFileArr" :key="index" style="display: flex;"> <show-photo :minio-file-name="item" style="margin-right: 10px;"> <span v-if="pageType !== 'detail'" class="photo-close" @click="delFile(index)">×</span> </show-photo> </div> <span v-if="pageType === 'detail' && !form.technologyFileArr.length">无</span> <!-- <input v-show="pageType === ''" ref="fileRef" type="file" name="upload" multiple @change="onFileChange"> --> </el-form-item> </el-col> </el-row> <el-row :gutter="24" class="marg"> <el-col :span="12"> <el-form-item label="温度范围(℃):" label-width="200px" prop="temperatureRange"> <span v-if="(`${form.temperatureLower}` || `${form.temperatureUpper}`) || (Number(form.temperatureLower) <= Number(form.temperatureUpper))"> <span>{{ form.temperatureLower }}</span> <span v-if="`${form.temperatureLower}` || `${form.temperatureUpper}`">~</span> <span>{{ form.temperatureUpper }}</span> </span> <span v-if="(`${form.temperatureLower}` && `${form.temperatureUpper}`) && (Number(form.temperatureLower) > Number(form.temperatureUpper))">温度无交集,请检查依据的技术文件</span> <span v-if="`${form.temperatureLower}` === '' && `${form.temperatureUpper}` === ''">无</span> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="相对温度范围(%RH):" label-width="200px" prop="humidityRange"> <span v-if="(`${form.humidityLower}` || `${form.humidityUpper}`) || (Number(form.humidityLower) <= Number(form.humidityUpper))"> <span>{{ form.humidityLower }}</span> <span v-if="`${form.humidityLower}` || `${form.humidityUpper}`">~</span> <span>{{ form.humidityUpper }}</span> </span> <span v-if="(`${form.humidityLower}` && `${form.humidityUpper}`) && (Number(form.humidityLower) > Number(form.humidityUpper))">湿度无交集,请检查依据的技术文件</span> <span v-if="`${form.humidityLower}` === '' && `${form.humidityUpper}` === ''">无</span> </el-form-item> </el-col> </el-row> <el-row :gutter="24" class="marg"> <el-col :span="24"> <el-form-item label="接线图上传:"> <show-photo v-if="form.wiringDiagram" :minio-file-name="form.wiringDiagram" /> <span v-else-if="pageType === 'detail'">无</span> <input v-show="pageType === ''" ref="fileRef" type="file" @change="onFileChange" > <el-button v-if="pageType !== 'detail'" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-left': form.wiringDiagram === '' ? '0px' : '20px' }" @click="upload" > {{ form.wiringDiagram === '' ? '选择' : '更换附件' }} </el-button> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-col :span="12"> <el-form-item label="接线说明:" prop="wiringIllustrate"> <el-input v-model="form.wiringIllustrate" class="full-width-input" autosize type="textarea" :disabled="pageType === 'detail'" :placeholder="pageType === 'detail' ? ' ' : '请填写接线说明'" /> </el-form-item> </el-col> </el-row> </el-form> </detail-page> </app-container> <!-- 选择依据的技术文件--选择所依据的技术文件(/资源管理/技术文件/现行测试校准检定方法) --> <select-tech-files ref="selectTechFilesRef" @confirm="confirmSelect" /> </template> <style lang="scss" scoped> .link { text-decoration: underline; color: #3d7eff; cursor: pointer; } .file-area { display: flex; align-items: center; font-size: 14px; color: #60627f; margin-bottom: 10px; margin-left: 40px; white-space: nowrap; .tech-file { display: flex; align-items: center; margin-left: 20px; .file-text { margin-right: 10px; } } } </style> <style lang="scss"> .business-measure-classification { .el-radio__label { display: block !important; } } </style>