<!-- 新增温湿度网络传感器 --> <script lang="ts" setup name="AddTemperatureHumidity"> 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 { ITemperatureHumidityForm } 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<ITemperatureHumidityForm>({ deviceId: '', // 智能模型表id deviceName: '温湿度网络传感器', // 智能模型名称 deviceNo: '', // 智能模型编号 humidityAlarmHigh: 0, // 湿度报警上限(%) ip: '', // ip maxHumidity: 0, // 湿度上限(%) maxTemperature: 0, // 温度上限(℃) minHumidity: 0, // 湿度下限(%) minTemperature: 0, // 温度下限(℃) port: '', // 端口 saveInterval: 0, // 保存间隔(分) temperatureAlarmHigh: 0, // 温度报警上限(℃) }) // 表单 // 自定义校验规则--温度上限比温度下限大 const maxTemperatureValid = (rule: any, value: any, callback: any) => { if (`${value}` === '' || `${value}` === 'null') { return callback(new Error('温度上限不能为空')) } if (form.value.maxTemperature < form.value.minTemperature) { return callback(new Error('温度上限应大于温度下限')) } callback() } // 自定义校验规则--湿度上限比湿度下限大 const maxHumidityValid = (rule: any, value: any, callback: any) => { if (`${value}` === '' || `${value}` === 'null') { return callback(new Error('湿度上限不能为空')) } if (form.value.maxTemperature < form.value.minTemperature) { return callback(new Error('温度上限应大于温度下限')) } callback() } const rules = ref<FormRules>({ deviceNo: [{ required: true, message: '智能模型编号不能为空', trigger: 'blur' }], humidityAlarmHigh: [{ required: true, message: '湿度报警上限不能为空', trigger: 'blur' }], temperatureAlarmHigh: [{ required: true, message: '温度报警上限不能为空', trigger: 'blur' }], ip: [{ required: true, message: 'ip地址不能为空', trigger: 'blur' }], port: [{ required: true, message: '端口不能为空', trigger: 'blur' }], minTemperature: [{ required: true, message: '温度下限不能为空', trigger: 'blur' }], maxTemperature: [{ required: true, validator: maxTemperatureValid, trigger: 'blur' }], minHumidity: [{ required: true, message: '湿度下限不能为空', trigger: 'blur' }], maxHumidity: [{ required: true, validator: maxHumidityValid, 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: '', // 智能模型编号 humidityAlarmHigh: 0, // 湿度报警上限(%) ip: '', // ip minTemperature: 0, // 温度下限(℃) maxTemperature: 0, // 温度上限(℃) minHumidity: 0, // 湿度下限(%) maxHumidity: 0, // 湿度上限(%) port: '', // 端口 saveInterval: 0, // 保存间隔(分) temperatureAlarmHigh: 0, // 温度报警上限(℃) } } const deviceType = ref('temperatureHumidity') // ---------------------------------------获取智能模型列表----------------------------------------------- const deviceList = ref([]) as any // 智能模型列表 // 查询条件 const listQuery: Ref<IListQuery> = ref({ deptId: '', // 负责部门id(西昌组织下拉选择) deviceName: '', // 智能模型名称 deviceNo: '', // 智能模型编号 deviceStatus: '', // 在线状态(1在线0离线) deviceType: '1', // 智能模型类型(字典code) 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.humidityAlarmHigh = row.humidityAlarmHigh // 湿度报警上限 form.value.temperatureAlarmHigh = row.temperatureAlarmHigh // 温度报警上限 form.value.ip = row.ip // ip form.value.minTemperature = row.minTemperature // 温度下限 form.value.maxTemperature = row.maxTemperature // 温度上限 form.value.minHumidity = row.minHumidity // 湿度下限 form.value.maxHumidity = row.maxHumidity // 湿度上限 form.value.port = row.port // 端口 form.value.saveInterval = row.saveInterval // 保存间隔(分) infoId.value = row.id // 主键 } else if (pageTypeParam === 'add') { clear() infoId.value = '' // 主键 } 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="600px" class="container" @close="resetForm"> <el-form ref="ruleFormRef" v-loading="loading" :model="form" :rules="rules" label-position="right" label-width="140px"> <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" style="display: flex;justify-content: flex-start;"> <el-form-item label="温度区间(℃):" prop="minTemperature"> <el-input-number v-model="form.minTemperature" :placeholder="pageType === 'detail' ? '' : '温度下限'" :disabled="pageType === 'detail'" style="width: 185px;" /> </el-form-item> <span style="margin-left: 10px;line-height: 30px;"> —— </span> <el-form-item label-width="10" prop="maxTemperature"> <el-input-number v-model="form.maxTemperature" :placeholder="pageType === 'detail' ? '' : '温度上限'" :disabled="pageType === 'detail'" :max="100" style="width: 185px;" /> </el-form-item> </el-col> <el-col :span="24" style="display: flex;justify-content: flex-start;"> <el-form-item label="湿度区间(%):" prop="minHumidity"> <el-input-number v-model="form.minHumidity" :placeholder="pageType === 'detail' ? '' : '湿度下限'" :disabled="pageType === 'detail'" :min="0" style="width: 185px;" /> </el-form-item> <span style="margin-left: 10px;line-height: 30px;"> —— </span> <el-form-item label-width="10" prop="maxHumidity"> <el-input-number v-model="form.maxHumidity" :placeholder="pageType === 'detail' ? '' : '湿度上限'" :disabled="pageType === 'detail'" style="width: 185px;" :max="100" /> </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 :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-col :span="24"> <el-form-item label="温度报警上限(℃):" prop="temperatureAlarmHigh"> <el-input-number v-model="form.temperatureAlarmHigh" :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="humidityAlarmHigh"> <el-input-number v-model="form.humidityAlarmHigh" :placeholder="pageType === 'detail' ? '' : '湿度报警上限'" :disabled="pageType === 'detail'" style="width: 185px;" :max="100" /> </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>