feat: 反应器配置编辑页面

This commit is contained in:
Asoka.Wang 2025-06-16 11:42:26 +08:00
parent bdd217f696
commit 8d95ef8628
4 changed files with 684 additions and 220 deletions

View File

@ -126,3 +126,8 @@ export const AppType = {
MVC: { name: 'MVC', value: 2, desc: '' },
}
export const EnumPressureUnit = {
Mpa: { name: 'mbar', value: 'mbar', desc: 'mbar' },
Psi: { name: 'psi', value: 'psi', desc: 'psi' },
Kpa: { name: 'kPa', value: 'kPa', desc: 'kPa' },
}

View File

@ -95,6 +95,74 @@ export interface ReactorDto {
modifiedTime?: string | null
}
/** 反应器添加和更新输入接口 */
export interface ReactorAddInputAndUpdateInput {
/** 设备编号 */
deviceNo?: string | null
/** 资产编号 */
assetNo?: string | null
/** 产品ID */
productID?: string | null
/** 型号 */
model?: string | null
/** 规格 */
specification?: string | null
/** 容量g */
capacity?: number
/** 房间ID */
roomID?: number
/** 负责人ID */
principalId?: number
/** 设备状态 */
deviceStatus?: DeviceStatusEnum
/** 维护标志 */
maintenanceFlag?: MaintenanceFlagEnum
/** 维护时间 */
maintenanceTime?: string | null
/** 压力单位 */
pressureUnit?: string | null
/** 反应器地秤ID */
equScaleId?: number
/** 补料秤ID */
feedingScaleId?: number
/** 继电器ID */
relayID?: number
/** 报警器ID */
equAlarmId?: number
/** 警告下限 */
warningLowerLimit?: number
/** 警告上限 */
warningUpperLimit?: number
/** 错误码 */
errorCode?: string | null
/** 是否外置泵 */
isExternalPump?: boolean
/** OPC IP */
opcip?: string | null
/** OPC 端口 */
opcPort?: string | null
/** 排序 */
sort?: number
/** 主键Id */
id?: number
/** 泵1配置 */
pump1: PumpConfig
/** 泵2配置 */
pump2: PumpConfig
/** 泵3配置 */
pump3: PumpConfig
/** 泵4配置 */
pump4: PumpConfig
/** 泵5配置 */
pump5: PumpConfig
/** 泵6配置 */
pump6: PumpConfig
/** 泵7配置 */
pump7: PumpConfig
/** 泵8配置 */
pump8: PumpConfig
}
// 反应器类型枚举项
export interface ReactorTypeEnumItem {
/** 枚举值 */
@ -105,10 +173,39 @@ export interface ReactorTypeEnumItem {
label: string
}
/** 泵配置接口 */
export interface PumpConfig {
/** 速度 */
speed?: number
/** 超时时间 */
timeout: number
/** 异常信息 */
exception: string
/** 错误码 */
errorCode: string
/** 是否喂料 */
isFeeding: boolean
/** 速度偏移 */
speedOffset: number
/** 配置ID */
configId?: number
}
/** 默认泵配置 */
export const defaultPumpConfig: PumpConfig = {
speed: undefined,
timeout: 0,
exception: '',
errorCode: '',
isFeeding: true,
speedOffset: 0,
configId: undefined
}
// API 类型定义
export type ReactorPageInput = ServiceRequestPage<ReactorFilter>;
export type ReactorPageResponse = ServiceResponse<PageResponse<ReactorDto>>;
export type ReactorOutput = ServiceResponse<ReactorDto[]>;
export type ReactorAddInput = ReactorDto;
export type ReactorUpdateInput = ReactorDto;
export type ReactorTypeEnumListOutput = ServiceResponse<ReactorTypeEnumItem[]>;
export type ReactorTypeEnumListOutput = ServiceResponse<ReactorTypeEnumItem[]>;

View File

@ -1,20 +1,7 @@
<template>
<el-dialog
v-model="dialogVisible"
:title="form.id ? '编辑反应器' : '新增反应器'"
width="900px"
:close-on-click-modal="false"
:close-on-press-escape="false"
destroy-on-close
class="reactor-form-dialog"
>
<el-form
ref="formRef"
:model="form"
:rules="rules"
label-width="100px"
class="reactor-form"
>
<el-dialog v-model="dialogVisible" :title="form.id ? '编辑反应器' : '新增反应器'" width="900px" :close-on-click-modal="false"
:close-on-press-escape="false" destroy-on-close draggable class="reactor-form-dialog">
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px" class="reactor-form">
<el-tabs v-model="activeTab" class="reactor-tabs">
<el-tab-pane label="基本信息" name="basic">
<el-row :gutter="20">
@ -23,19 +10,24 @@
<el-input v-model="form.deviceNo" placeholder="请输入设备编号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="反应器名称" prop="productID">
<el-input v-model="form.productID" placeholder="请输入反应器名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资产编号" prop="assetNo">
<el-input v-model="form.assetNo" placeholder="请输入资产编号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="产品编号" prop="productID">
<el-input v-model="form.productID" placeholder="请输入产品编号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备型号" prop="model">
<el-input v-model="form.model" placeholder="请输入设备型号" />
<el-select v-model="form.model" placeholder="请选择设备型号" style="width: 100%" filterable allow-create>
<el-option v-for="item in state.deviceModelOptions" :key="item.id" :label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
@ -44,66 +36,52 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="容量" prop="capacity">
<el-form-item label="容量(g)" prop="capacity">
<el-input-number v-model="form.capacity" :min="0" :step="1" style="width: 100%" placeholder="请输入容量" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="房间" prop="roomID">
<el-select v-model="form.roomID" placeholder="请选择房间" style="width: 100%">
<el-option
v-for="item in roomOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
<el-option v-for="item in state.roomOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责人" prop="principalId">
<el-select v-model="form.principalId" placeholder="请选择负责人" style="width: 100%">
<el-option
v-for="item in principalOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
<el-form-item label="设备负责人" prop="principalId">
<el-select v-model="form.principalId" placeholder="请选择设备负责人" style="width: 100%">
<el-option v-for="item in state.principalOptions" :key="item.id" :label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="压力单位" prop="pressureUnit">
<el-select v-model="form.pressureUnit" placeholder="请选择压力单位" class="w100">
<el-option v-for="item in state.pressureUnitOptions" :key="item.label" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备状态" prop="deviceStatus">
<el-select v-model="form.deviceStatus" placeholder="请选择设备状态" style="width: 100%">
<el-option
v-for="item in deviceStatusOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-tag>
{{ getDeviceStatusDesc(form.deviceStatus ?? 1) }}
</el-tag>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="维护标志" prop="maintenanceFlag">
<el-select v-model="form.maintenanceFlag" placeholder="请选择维护标志" style="width: 100%">
<el-option
v-for="item in maintenanceFlagOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
<el-form-item label="维护标记">
<el-switch v-model="form.maintenanceFlag" active-text="维护中" inactive-text="正常" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="排序" prop="sort">
<el-input-number v-model="form.sort" :min="0" :step="1" style="width: 100%" placeholder="请输入排序" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否维护中" prop="isMaintenance">
<el-switch v-model="form.isMaintenance" />
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
<el-form-item label="维修完成时间" v-if="form.maintenanceFlag">
<el-date-picker v-model="form.maintenanceTime" type="date" placeholder="预计完成时间" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" style="width: 180px" />
</el-form-item>
</el-col>
</el-row>
@ -111,38 +89,44 @@
<el-tab-pane label="设备配置" name="config">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="地秤ID" prop="equScaleId">
<el-input-number v-model="form.equScaleId" :min="0" :step="1" style="width: 100%" placeholder="请输入地秤ID" />
<el-form-item label="反应器地秤" prop="equScaleId">
<el-select v-model="form.equScaleId" placeholder="请选择反应器地秤" class="w100">
<el-option v-for="item in state.equScaleOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="补料秤ID" prop="feedingScaleId">
<el-input-number v-model="form.feedingScaleId" :min="0" :step="1" style="width: 100%" placeholder="请输入补料秤ID" />
<el-form-item label="补料地秤" prop="feedingScaleId">
<el-select v-model="form.feedingScaleId" placeholder="请选择补料地秤" class="w100">
<el-option v-for="item in state.feedingScaleOptions" :key="item.id" :label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="继电器ID" prop="relayID">
<el-input-number v-model="form.relayID" :min="0" :step="1" style="width: 100%" placeholder="请输入继电器ID" />
<el-form-item label="继电器" prop="relayID">
<el-select v-model="form.relayID" placeholder="请选择继电器" class="w100">
<el-option v-for="item in state.relayOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报警器ID" prop="equAlarmId">
<el-input-number v-model="form.equAlarmId" :min="0" :step="1" style="width: 100%" placeholder="请输入报警器ID" />
<el-form-item label="报警器" prop="equAlarmId">
<el-select v-model="form.equAlarmId" placeholder="请选择报警器" class="w100">
<el-option v-for="item in state.equAlarmOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="警告下限" prop="warningLowerLimit">
<el-input-number v-model="form.warningLowerLimit" :min="0" :step="1" style="width: 100%" placeholder="请输入警告下限" />
<el-form-item label="警告下限(g)" prop="warningLowerLimit">
<el-input-number v-model="form.warningLowerLimit" :min="0" :step="1" style="width: 100%"
placeholder="请输入警告下限" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="警告上限" prop="warningUpperLimit">
<el-input-number v-model="form.warningUpperLimit" :min="0" :step="1" style="width: 100%" placeholder="请输入警告上限" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否外置泵" prop="isExternalPump">
<el-switch v-model="form.isExternalPump" />
<el-form-item label="警告上限(g)" prop="warningUpperLimit">
<el-input-number v-model="form.warningUpperLimit" :min="0" :step="1" style="width: 100%"
placeholder="请输入警告上限" />
</el-form-item>
</el-col>
<el-col :span="12">
@ -155,51 +139,254 @@
<el-input v-model="form.opcPort" placeholder="请输入OPC 端口" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="需要外置泵" prop="isExternalPump">
<el-switch v-model="form.isExternalPump" />
</el-form-item>
</el-col>
</el-row>
</el-tab-pane>
<el-tab-pane label="泵配置" name="pumpConfig">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="泵1速度" prop="pump1.speed">
<el-input-number v-model="form.pump1.speed" :min="0" :step="1" style="width: 100%"
placeholder="请输入泵1速度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵1配置" prop="pump1.configId">
<el-select
v-model="form.pump1.configId"
placeholder="请选择泵1配置"
style="width: 100%"
filterable
>
<el-option
v-for="item in state.pumpConfigOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵2速度" prop="pump2.speed">
<el-input-number v-model="form.pump2.speed" :min="0" :step="1" style="width: 100%"
placeholder="请输入泵2速度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵2配置" prop="pump2.configId">
<el-select
v-model="form.pump2.configId"
placeholder="请选择泵2配置"
style="width: 100%"
filterable
>
<el-option
v-for="item in state.pumpConfigOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵3速度" prop="pump3.speed">
<el-input-number v-model="form.pump3.speed" :min="0" :step="1" style="width: 100%"
placeholder="请输入泵3速度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵3配置" prop="pump3.configId">
<el-select
v-model="form.pump3.configId"
placeholder="请选择泵3配置"
style="width: 100%"
filterable
>
<el-option
v-for="item in state.pumpConfigOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵4速度" prop="pump4.speed">
<el-input-number v-model="form.pump4.speed" :min="0" :step="1" style="width: 100%"
placeholder="请输入泵4速度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵4配置" prop="pump4.configId">
<el-select
v-model="form.pump4.configId"
placeholder="请选择泵4配置"
style="width: 100%"
filterable
>
<el-option
v-for="item in state.pumpConfigOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵5速度" prop="pump5.speed">
<el-input-number v-model="form.pump5.speed" :min="0" :step="1" style="width: 100%"
placeholder="请输入泵5速度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵5配置" prop="pump5.configId">
<el-select
v-model="form.pump5.configId"
placeholder="请选择泵5配置"
style="width: 100%"
filterable
>
<el-option
v-for="item in state.pumpConfigOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵6速度" prop="pump6.speed">
<el-input-number v-model="form.pump6.speed" :min="0" :step="1" style="width: 100%"
placeholder="请输入泵6速度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵6配置" prop="pump6.configId">
<el-select
v-model="form.pump6.configId"
placeholder="请选择泵6配置"
style="width: 100%"
filterable
>
<el-option
v-for="item in state.pumpConfigOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵7速度" prop="pump7.speed">
<el-input-number v-model="form.pump7.speed" :min="0" :step="1" style="width: 100%"
placeholder="请输入泵7速度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵7配置" prop="pump7.configId">
<el-select
v-model="form.pump7.configId"
placeholder="请选择泵7配置"
style="width: 100%"
filterable
>
<el-option
v-for="item in state.pumpConfigOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵8速度" prop="pump8.speed">
<el-input-number v-model="form.pump8.speed" :min="0" :step="1" style="width: 100%"
placeholder="请输入泵8速度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="泵8配置" prop="pump8.configId">
<el-select
v-model="form.pump8.configId"
placeholder="请选择泵8配置"
style="width: 100%"
filterable
>
<el-option
v-for="item in state.pumpConfigOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-tab-pane>
</el-tabs>
</el-form>
<template #footer>
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" :loading="loading" @click="handleSubmit"> </el-button>
<el-button @click="OnCancel" size="default"> </el-button>
<el-button type="primary" :loading="state.sureLoading" @click="submitForm" size="default"> </el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
<script setup lang="ts" name="admin/reactor/form">
import { ref, reactive, onMounted, watch, getCurrentInstance } from 'vue'
import { ElMessage } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus'
import { ReactorApi } from '/@/api/admin/reactor'
import { RoomApi } from '/@/api/admin/Room'
import { UserApi } from '/@/api/admin/User'
import type { ReactorDto } from '/@/api/types/ReactorType'
import { DeviceStatusEnum, MaintenanceFlagEnum } from '/@/api/types/ReactorType'
import { DictApi } from '/@/api/admin/Dict'
import { UspscaleApi } from '/@/api/admin/UspscaleApi'
import { UspRelayApi } from '/@/api/admin/UspRelayApi'
import { AlarmApi } from '/@/api/admin/AlarmApi'
import { UspFeedingConfigApi } from '/@/api/admin/UspFeedingConfigApi'
import {
DeviceStatusEnum,
MaintenanceFlagEnum,
ReactorAddInputAndUpdateInput,
PumpConfig,
defaultPumpConfig
} from '/@/api/types/ReactorType'
import type { ReactorTypeEnumItem } from '/@/api/types/ReactorType'
import { toOptionsByValue } from '/@/utils/enum'
import { EnumPressureUnit } from '/@/api/admin/enum-contracts'
import eventBus from '/@/utils/mitt'
const { proxy } = getCurrentInstance() as any
const props = defineProps<{
title: string
}>()
const emit = defineEmits(['ok'])
const dialogVisible = ref(false)
const formRef = ref<FormInstance>()
const activeTab = ref('basic')
const activePumpTab = ref('pump1')
const deviceStatusOptions = ref<ReactorTypeEnumItem[]>([])
const defaultPumpConfig = {
speed: 0,
timeout: 0,
exception: '',
errorCode: '',
isFeeding: true,
speedOffset: 0,
configId: 0
}
const form = reactive<ReactorDto>({
const form = reactive<ReactorAddInputAndUpdateInput>({
sort: 0,
deviceNo: '',
assetNo: '',
@ -209,14 +396,20 @@ const form = reactive<ReactorDto>({
capacity: 0,
roomID: undefined,
principalId: undefined,
deviceStatus: undefined ,
deviceStatus: 1,
maintenanceFlag: undefined,
equScaleId: 0,
feedingScaleId: 0,
relayID: 0,
maintenanceTime: '',
pressureUnit: '',
equScaleId: undefined,
feedingScaleId: undefined,
relayID: undefined,
equAlarmId: undefined,
warningLowerLimit: 0,
warningUpperLimit: 0,
errorCode: '',
isExternalPump: true,
opcip: '',
opcPort: '',
pump1: { ...defaultPumpConfig },
pump2: { ...defaultPumpConfig },
pump3: { ...defaultPumpConfig },
@ -224,73 +417,116 @@ const form = reactive<ReactorDto>({
pump5: { ...defaultPumpConfig },
pump6: { ...defaultPumpConfig },
pump7: { ...defaultPumpConfig },
pump8: { ...defaultPumpConfig },
isExternalPump: true,
opcip: '',
opcPort: '',
equAlarmId: 0,
status: true,
isMaintenance: false,
maintenanceTime: '',
id: 0
pump8: { ...defaultPumpConfig }
})
const state = reactive({
sureLoading: false,
roomOptions: [] as Array<{ id: number; name: string }>,
principalOptions: [] as Array<{ id: number; name: string }>,
deviceStatusOptions: [] as ReactorTypeEnumItem[],
deviceModelOptions: [] as Array<{ id: string; name: string }>,
pressureUnitOptions: toOptionsByValue(EnumPressureUnit),
equScaleOptions: [] as Array<{ id: number; name: string }>,
feedingScaleOptions: [] as Array<{ id: number; name: string }>,
relayOptions: [] as Array<{ id: number; name: string }>,
equAlarmOptions: [] as Array<{ id: number; name: string }>,
pumpConfigOptions: [] as Array<{ id: number; name: string }>,
})
const rules = reactive<FormRules>({
deviceNo: [{ required: true, message: '请输入设备编号', trigger: 'blur' }],
productID: [{ required: true, message: '请输入反应器名称', trigger: 'blur' }],
model: [{ required: true, message: '请选择设备型号', trigger: 'change' }],
assetNo: [{ required: true, message: '请输入资产编号', trigger: 'blur' }],
productID: [{ required: true, message: '请输入产品编号', trigger: 'blur' }],
model: [{ required: true, message: '请输入设备型号', trigger: 'blur' }],
specification: [{ required: true, message: '请输入规格', trigger: 'blur' }],
specification: [{ required: false, message: '请输入规格', trigger: 'blur' }],
capacity: [{ required: true, message: '请输入容量', trigger: 'blur' }],
roomID: [{ required: true, message: '请选择房间', trigger: 'change' }],
principalId: [{ required: true, message: '请选择负责人', trigger: 'change' }],
deviceStatus: [{ required: true, message: '请选择设备状态', trigger: 'change' }],
maintenanceFlag: [{ required: true, message: '请选择维护标志', trigger: 'change' }],
status: [{ required: true, message: '请选择状态', trigger: 'change' }],
isMaintenance: [{ required: true, message: '请选择是否维护中', trigger: 'change' }],
maintenanceTime: [{ required: true, message: '请选择维护时间', trigger: 'change' }],
sort: [{ required: true, message: '请输入排序', trigger: 'blur' }],
equScaleId: [{ required: true, message: '请输入地秤ID', trigger: 'blur' }],
feedingScaleId: [{ required: true, message: '请输入补料秤ID', trigger: 'blur' }],
relayID: [{ required: true, message: '请输入继电器ID', trigger: 'blur' }],
roomID: [{ required: false, message: '请选择房间', trigger: 'change' }],
principalId: [{ required: false, message: '请选择设备负责人', trigger: 'change' }],
deviceStatus: [{ required: false, message: '请选择设备状态', trigger: 'change' }],
pressureUnit: [{ required: true, message: '请选择压力单位', trigger: 'change' }],
equScaleId: [{ required: true, message: '请选择反应器地秤', trigger: 'change' }],
feedingScaleId: [{ required: false, message: '请输入补料秤ID', trigger: 'blur' }],
relayID: [{ required: false, message: '请输入继电器ID', trigger: 'blur' }],
equAlarmId: [{ required: false, message: '请输入报警器ID', trigger: 'blur' }],
warningLowerLimit: [{ required: true, message: '请输入警告下限', trigger: 'blur' }],
warningUpperLimit: [{ required: true, message: '请输入警告上限', trigger: 'blur' }],
opcip: [{ required: true, message: '请输入OPC IP', trigger: 'blur' }],
opcPort: [{ required: true, message: '请输入OPC 端口', trigger: 'blur' }],
equAlarmId: [{ required: true, message: '请输入报警器ID', trigger: 'blur' }]
'pump1.speed': [
{ required: true, message: '请输入泵1速度', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵1速度不能小于0', trigger: 'blur' }
],
'pump1.configId': [
{ required: true, message: '请输入泵1配置ID', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵1配置ID不能小于0', trigger: 'blur' }
],
'pump2.speed': [
{ required: true, message: '请输入泵2速度', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵2速度不能小于0', trigger: 'blur' }
],
'pump2.configId': [
{ required: true, message: '请输入泵2配置ID', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵2配置ID不能小于0', trigger: 'blur' }
],
'pump3.speed': [
{ required: true, message: '请输入泵3速度', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵3速度不能小于0', trigger: 'blur' }
],
'pump3.configId': [
{ required: true, message: '请输入泵3配置ID', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵3配置ID不能小于0', trigger: 'blur' }
],
'pump4.speed': [
{ required: true, message: '请输入泵4速度', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵4速度不能小于0', trigger: 'blur' }
],
'pump4.configId': [
{ required: true, message: '请输入泵4配置ID', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵4配置ID不能小于0', trigger: 'blur' }
],
'pump5.speed': [
{ required: true, message: '请输入泵5速度', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵5速度不能小于0', trigger: 'blur' }
],
'pump5.configId': [
{ required: true, message: '请输入泵5配置ID', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵5配置ID不能小于0', trigger: 'blur' }
],
'pump6.speed': [
{ required: true, message: '请输入泵6速度', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵6速度不能小于0', trigger: 'blur' }
],
'pump6.configId': [
{ required: true, message: '请输入泵6配置ID', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵6配置ID不能小于0', trigger: 'blur' }
],
'pump7.speed': [
{ required: true, message: '请输入泵7速度', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵7速度不能小于0', trigger: 'blur' }
],
'pump7.configId': [
{ required: true, message: '请输入泵7配置ID', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵7配置ID不能小于0', trigger: 'blur' }
],
'pump8.speed': [
{ required: true, message: '请输入泵8速度', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵8速度不能小于0', trigger: 'blur' }
],
'pump8.configId': [
{ required: true, message: '请输入泵8配置ID', trigger: 'blur' },
{ type: 'number', min: 0, message: '泵8配置ID不能小于0', trigger: 'blur' }
]
})
/** 获取设备状态枚举列表 */
const getDeviceStatusOptions = async () => {
try {
const res = await new ReactorApi().getDeviceStatusEnumList()
deviceStatusOptions.value = res.data ?? []
state.deviceStatusOptions = res.data ?? []
} catch (error) {
console.error('获取设备状态枚举列表失败:', error)
}
}
/** 获取设备状态描述 */
const getDeviceStatusDesc = (status: DeviceStatusEnum) => {
const statusMap = {
[DeviceStatusEnum.Normal]: '正常',
[DeviceStatusEnum.Fault]: '故障',
[DeviceStatusEnum.Offline]: '离线',
[DeviceStatusEnum.Maintenance]: '维护中'
}
return statusMap[status] || '未知'
}
/** 获取维护标志描述 */
const getMaintenanceFlagDesc = (flag: MaintenanceFlagEnum) => {
const flagMap = {
[MaintenanceFlagEnum.None]: '无',
[MaintenanceFlagEnum.Regular]: '定期维护',
[MaintenanceFlagEnum.Emergency]: '紧急维护'
}
return flagMap[flag] || '未知'
}
/** 获取房间列表 */
const getRoomOptions = async () => {
try {
@ -299,7 +535,8 @@ const getRoomOptions = async () => {
pageSize: 1000,
filter: {}
})
roomOptions.value = res.data?.list?.map((item: any) => ({
state.roomOptions = res.data?.list?.map((item: any) => ({
id: item.id,
name: item.roomName
})) || []
@ -316,24 +553,173 @@ const getPrincipalOptions = async () => {
pageSize: 1000,
filter: {}
})
principalOptions.value = res.data?.list?.map((item: any) => ({
state.principalOptions = res.data?.list?.map((item: any) => ({
id: item.id,
name: item.name
name: item.userName
})) || []
} catch (error) {
console.error('获取负责人列表失败:', error)
console.error('获取用户列表失败:', error)
}
}
/** 打开弹窗 */
const open = (row?: ReactorDto) => {
dialogVisible.value = true
if (row) {
Object.assign(form, row)
const getDeviceModelOptions = async () => {
try {
const res = await new DictApi().getList(['ReactorModel'])
state.deviceModelOptions = res.data?.reactorModel?.map((item: any) => ({
id: item.value,
name: item.name
})) || []
}
getDeviceStatusOptions()
getRoomOptions()
getPrincipalOptions()
catch (error) {
console.error('获取设备型号列表失败:', error)
}
}
const getEquAlarmOptions = async () => {
try {
const res = await new AlarmApi().getPage({
currentPage: 1,
pageSize: 1000,
filter: {}
})
state.equAlarmOptions = res.data?.list?.map((item: any) => ({
id: item.id,
name: item.deviceNo
})) || []
} catch (error) {
console.error('获取报警器列表失败:', error)
}
}
const getRelayOptions = async () => {
try {
const res = await new UspRelayApi().getPage({
currentPage: 1,
pageSize: 1000,
filter: {}
})
state.relayOptions = res.data?.list?.map((item: any) => ({
id: item.id,
name: item.deviceNo
})) || []
}
catch (error) {
console.error('获取继电器列表失败:', error)
}
}
const getEquScaleOptions = async () => {
try {
const res = await new UspscaleApi().getPage({ currentPage: 1,
pageSize: 1000,
filter: {}
})
state.equScaleOptions = res.data?.list?.filter((item: any) => item.isFeedingScale == false).map((item: any) => ({
id: item.id,
name: item.deviceNo
})) || []
state.feedingScaleOptions = res.data?.list?.filter((item: any) => item.isFeedingScale == true).map((item: any) => ({
id: item.id,
name: item.deviceNo
})) || []
}
catch (error) {
console.error('获取地秤列表失败:', error)
}
}
const getPumpConfigOptions = async () => {
try {
const res = await new UspFeedingConfigApi().getPage({
currentPage: 1,
pageSize: 1000,
filter: {
}
})
state.pumpConfigOptions = res.data?.list?.map((item: any) => ({
id: item.id,
name: item.configName
})) || []
}
catch (error) {
console.error('获取泵配置列表失败:', error)
}
}
const getDeviceStatusDesc = (status: DeviceStatusEnum) => {
return state.deviceStatusOptions.find(item => item.value === status)?.label || ''
}
/** 打开弹窗 */
const open = async (id?: number) => {
proxy.$modal.loading()
if (id && id > 0) {
const res = await new ReactorApi().get({ id }, { loading: true })
if (res?.success && res.data) {
const formData = res.data as unknown as ReactorAddInputAndUpdateInput
Object.assign(form, formData)
}
} else {
Object.assign(form, {
sort: 0,
deviceNo: '',
assetNo: '',
productID: '',
model: '',
specification: '',
capacity: 0,
roomID: undefined,
principalId: undefined,
deviceStatus: 1,
maintenanceFlag: undefined,
maintenanceTime: '',
pressureUnit: '',
equScaleId: undefined,
feedingScaleId: undefined,
relayID: undefined,
equAlarmId: undefined,
warningLowerLimit: 0,
warningUpperLimit: 0,
errorCode: '',
isExternalPump: true,
opcip: '',
opcPort: '',
pump1: { ...defaultPumpConfig },
pump2: { ...defaultPumpConfig },
pump3: { ...defaultPumpConfig },
pump4: { ...defaultPumpConfig },
pump5: { ...defaultPumpConfig },
pump6: { ...defaultPumpConfig },
pump7: { ...defaultPumpConfig },
pump8: { ...defaultPumpConfig },
})
}
proxy.$modal.closeLoading()
dialogVisible.value = true
await Promise.all([
getDeviceStatusOptions(),
getRoomOptions(),
getPrincipalOptions(),
getDeviceModelOptions(),
getEquScaleOptions(),
getRelayOptions(),
getEquAlarmOptions(),
getPumpConfigOptions()
])
}
/** 取消 */
const OnCancel = () => {
dialogVisible.value = false
formRef.value?.resetFields()
}
/** 提交表单 */
@ -341,72 +727,41 @@ const submitForm = async () => {
if (!formRef.value) return
await formRef.value.validate(async (valid) => {
if (valid) {
state.sureLoading = true //
try {
const api = new ReactorApi()
const res = form.id ? await api.update(form) : await api.add(form)
if (res.success) {
ElMessage.success(form.id ? '修改成功' : '新增成功')
dialogVisible.value = false
emit('ok')
eventBus.emit('refreshReactor')
}
} catch (error) {
console.error('提交失败:', error)
ElMessage.error('操作失败,请重试')
} finally {
state.sureLoading = false //
}
}
})
}
/** 取消 */
const cancel = () => {
dialogVisible.value = false
reset()
}
/** 重置表单 */
const reset = () => {
if (!formRef.value) return
formRef.value.resetFields()
Object.assign(form, {
sort: 0,
deviceNo: '',
assetNo: '',
productID: '',
model: '',
specification: '',
capacity: 0,
roomID: 0,
principalId: 0,
deviceStatus: DeviceStatusEnum.Normal,
maintenanceFlag: MaintenanceFlagEnum.None,
equScaleId: 0,
feedingScaleId: 0,
relayID: 0,
warningLowerLimit: 0,
warningUpperLimit: 0,
errorCode: '',
pump1: { ...defaultPumpConfig },
pump2: { ...defaultPumpConfig },
pump3: { ...defaultPumpConfig },
pump4: { ...defaultPumpConfig },
pump5: { ...defaultPumpConfig },
pump6: { ...defaultPumpConfig },
pump7: { ...defaultPumpConfig },
pump8: { ...defaultPumpConfig },
isExternalPump: true,
opcip: '',
opcPort: '',
equAlarmId: 0,
status: true,
isMaintenance: false,
maintenanceTime: '',
id: 0
})
}
// maintenanceFlag
watch(() => form.maintenanceFlag, (newValue) => {
if (newValue != undefined && newValue == 0) {
form.maintenanceTime = ''
}
})
onMounted(() => {
getDeviceStatusOptions()
getRoomOptions()
getPrincipalOptions()
getDeviceModelOptions()
getEquScaleOptions()
getRelayOptions()
getEquAlarmOptions()
getPumpConfigOptions()
})
defineExpose({
@ -450,7 +805,16 @@ defineExpose({
width: 100%;
}
:deep(.el-switch) {
margin-top: 8px;
.pump-config-section {
margin-top: 20px;
padding: 20px;
background-color: #f5f7fa;
border-radius: 4px;
h3 {
margin-bottom: 20px;
font-size: 16px;
color: #303133;
}
}
</style>

View File

@ -77,21 +77,19 @@
</template>
<script setup lang="ts">
import { ref, reactive, onMounted, onBeforeMount } from 'vue'
import { ref, reactive, onMounted, onBeforeMount, defineAsyncComponent } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { ReactorApi } from '/@/api/admin/reactor'
import { RoomApi } from '/@/api/admin/Room'
import { UserApi } from '/@/api/admin/User'
import { DictApi } from '/@/api/admin/Dict'
import eventBus from '/@/utils/mitt'
import type {
ReactorPageInput,
ReactorDto,
ReactorTypeEnumItem
} from '/@/api/types/ReactorType'
import ReactorForm from './components/reactor-form.vue'
const ReactorForm = defineAsyncComponent(() => import('./components/reactor-form.vue'))
const loading = ref(false)
const formRef = ref()
@ -158,7 +156,7 @@ const handleAdd = () => {
/** 修改按钮操作 */
const handleEdit = (row: ReactorDto) => {
state.formTitle = '编辑反应器'
formRef.value?.open(row)
formRef.value?.open(row.id)
}
/** 删除按钮操作 */