<!-- 新增氧气传感器、烟雾报警器 --> <script lang="ts" setup name="AddOxygenSmoke"> import type { FormInstance, FormRules } from 'element-plus' import type { Ref } from 'vue' import { ElLoading, ElMessage } from 'element-plus' import type { IListQuery } from '../list/list-interface' import type { IOxygenSmokeList } from './config-interface' import { getDeviceList } from '@/api/laboratory/equipment/list' import { addConfigList, updateConfigList } from '@/api/laboratory/equipment/config' import useUserStore from '@/store/modules/user' const emits = defineEmits(['refresh']) const textMap: { [key: string ]: string } = { edit: '编辑', add: '新建', detail: '详情', }// 字典 const user = useUserStore() // 用户信息 const ruleFormRef = ref<FormInstance>() // from组件 const form = ref<IOxygenSmokeList>({ deviceId: '', // 设备表id deviceName: '', // 设备名称 deviceNo: '', // 设备编号 ip: '', // ip port: '', // 端口 saveInterval: 0, // 保存间隔(分) densityAlarmHigh: 0, // 氧气浓度报警上限(ppm) valueAlarmHigh: 0, // 烟雾值报警上限(毫克/立方米) }) // 表单 const rules = ref<FormRules>({ deviceNo: [{ required: true, message: '设备编号不能为空', trigger: 'blur' }], densityAlarmHigh: [{ required: true, message: '氧气浓度报警阈值不能为空', trigger: 'blur' }], valueAlarmHigh: [{ required: true, message: '烟雾值报警阈值不能为空', trigger: 'blur' }], ip: [{ required: true, message: 'ip地址不能为空', trigger: 'blur' }], port: [{ required: true, message: '端口不能为空', trigger: 'blur' }], saveInterval: [{ required: true, message: '保存间隔不能为空', trigger: 'blur' }], }) // 表单验证规则 const dialogVisible = ref(false) // 弹窗显示 const pageType = ref('') // 页面类型 add新增、edit编辑 const infoId = ref('') // id,主键 const loading = ref(false) const selectedDevice = ref([]) as any // 已经选择的设备,设备编号需要过滤掉 // ----------------------------------------方法------------------------------------------------- // 清空表单 const clear = () => { form.value = { deviceId: '', // 设备表id deviceName: '', // 设备名称 deviceNo: '', // 设备编号 ip: '', // ip port: '', // 端口 saveInterval: 0, // 保存间隔(分) densityAlarmHigh: 0, // 氧气浓度报警上限(ppm) valueAlarmHigh: 0, // 烟雾值报警上限(毫克/立方米) } } const deviceType = ref('oxygen') // ---------------------------------------获取设备列表----------------------------------------------- const deviceList = ref([]) as any // 设备列表 // 查询条件 const listQuery: Ref<IListQuery> = ref({ deptId: '', // 负责部门id(西昌组织下拉选择) deviceName: '', // 设备名称 deviceNo: '', // 设备编号 deviceType: '', // 设备类型(字典code) deviceStatus: '', // 在线状态(1在线0离线) userId: '', // 负责人id(西昌组织下人员下拉选择) labName: user.lab, // 所属实验室 ids: [], limit: 999999, offset: 1, }) // 数据查询 function fetchData(isNowPage = false) { if (!isNowPage) { // 是否显示当前页,否则跳转第一页 listQuery.value.offset = 1 } getDeviceList(listQuery.value).then((response) => { deviceList.value = response.data.rows // 过滤掉已经配置过的设备 selectedDevice.value.forEach((e: { deviceNo: string }) => { const index = deviceList.value.findIndex((item: { deviceNo: string }) => item.deviceNo === e.deviceNo) if (index !== -1) { deviceList.value.splice(index, 1) } }) }) } // ------------------------------------------------------------------------------------------------- // 弹窗初始化 const initDialog = (pageTypeParam = 'detail', type: string, row: any, list: any) => { dialogVisible.value = true // 打开弹窗 pageType.value = pageTypeParam // 页面类型 deviceType.value = type // 设备类型 selectedDevice.value = list if (pageTypeParam === 'edit' || pageTypeParam === 'detail') { // 编辑时初始化数据 form.value.deviceId = row.deviceId // 设备表id form.value.deviceNo = row.deviceNo // 地点编号 form.value.densityAlarmHigh = row.densityAlarmHigh // 氧气浓度报警上限(ppm) form.value.valueAlarmHigh = row.valueAlarmHigh // 烟雾值报警上限(毫克/立方米) form.value.ip = row.ip // ip form.value.port = row.port // 端口 form.value.saveInterval = row.saveInterval // 保存间隔(分) infoId.value = row.id // 主键 } else if (pageTypeParam === 'add') { clear() infoId.value = '' // 主键 } form.value.deviceName = type === 'oxygen' ? '氧气传感器' : '烟雾报警器' // 设备名称 listQuery.value.deviceType = type === 'oxygen' ? '3' : '4' fetchData() // 获取设备列表 } // 设备编号选中值变化 const handleChangeSelect = (id: string) => { const obj = deviceList.value.find((i: { id: string }) => i.id === id) form.value.deviceNo = obj.deviceNo // 设备编号 // form.value.deviceName = obj.deviceName // 设备名称 form.value.deviceId = id // 设备id } // 提交 const submitForm = async (formEl: FormInstance | undefined) => { ruleFormRef.value!.validate((valid: boolean) => { if (valid) { const params = { ...form.value, id: infoId.value, } loading.value = true // 新建 if (pageType.value === 'add') { // 新建 addConfigList(params, deviceType.value).then((res) => { ElMessage.success('保存成功') pageType.value = 'detail' loading.value = false resetForm(ruleFormRef.value) emits('refresh') }).catch(() => { loading.value = false resetForm(ruleFormRef.value) }) } // 保存 else if (pageType.value === 'edit') { // 编辑 updateConfigList(params, deviceType.value).then((res) => { ElMessage.success('保存成功') pageType.value = 'detail' loading.value = false emits('refresh') resetForm(ruleFormRef.value) }).catch(() => { loading.value = false resetForm(ruleFormRef.value) }) } } else { console.log('表单校验不通过') } }) } // 取消 function resetForm(formEl: FormInstance | undefined) { formEl?.resetFields() dialogVisible.value = false } defineExpose({ initDialog }) </script> <template> <el-dialog v-if="dialogVisible" v-model="dialogVisible" :title="`设备配置-${textMap[pageType]}`" append-to-body width="700px" class="container" @close="resetForm"> <el-form ref="ruleFormRef" v-loading="loading" :model="form" :rules="rules" label-position="right" label-width="180px"> <el-row :gutter="24"> <el-col :span="24"> <el-form-item label="设备编号:" prop="deviceNo"> <el-select v-model="form.deviceNo" placeholder="请选择设备编号" filterable clearable :disabled="pageType === 'detail'" style="width: 100%;" @change="handleChangeSelect" > <el-option v-for="item in deviceList" :key="item.id" :label="item.name" :value="item.id"> <span style="float: left;">{{ item.deviceNo }}</span> <span style="float: right; color: #8492a6; font-size: 13px;">{{ item.deviceName }}</span> </el-option> </el-select> </el-form-item> </el-col> <el-col :span="24"> <el-form-item label="设备类型:" prop="deviceName"> <el-input v-model.trim="form.deviceName" placeholder="设备类型" disabled /> </el-form-item> </el-col> <el-col :span="24"> <el-form-item label="IP地址:" prop="ip"> <el-input v-model.trim="form.ip" placeholder="IP地址" :disabled="pageType === 'detail'" clearable /> </el-form-item> </el-col> <el-col :span="24"> <el-form-item label="端口:" prop="port"> <el-input v-model.trim="form.port" placeholder="端口" :disabled="pageType === 'detail'" clearable /> </el-form-item> </el-col> <el-col v-if="deviceType === 'oxygen'" :span="24"> <el-form-item label="氧气浓度报警阈值(ppm):" prop="densityAlarmHigh"> <el-input-number v-model="form.densityAlarmHigh" :placeholder="pageType === 'detail' ? '' : '氧气浓度报警阈值'" style="width: 185px;" :disabled="pageType === 'detail'" :max="100" /> </el-form-item> </el-col> <el-col v-if="deviceType === 'smoke'" :span="24"> <el-form-item label="烟雾值报警阈值(毫克/立方米):" prop="valueAlarmHigh"> <el-input-number v-model="form.valueAlarmHigh" :placeholder="pageType === 'detail' ? '' : '烟雾值报警阈值'" style="width: 185px;" :disabled="pageType === 'detail'" :max="100" /> </el-form-item> </el-col> <el-col :span="24"> <el-form-item label="保存间隔(分):" prop="saveInterval"> <el-input-number v-model="form.saveInterval" :placeholder="pageType === 'detail' ? '' : '保存间隔(分)'" :disabled="pageType === 'detail'" :step="1" style="width: 185px;" :precision="0" :min="0" /> </el-form-item> </el-col> </el-row> </el-form> <template #footer> <div class="dialog-footer footer"> <el-button :loading="loading" type="primary" @click="submitForm(ruleFormRef)"> 确定 </el-button> <el-button :disabled="loading" type="info" @click="resetForm(ruleFormRef)"> 取消 </el-button> </div> </template> </el-dialog> </template>