huang
2 天以前 ab389a5a6b329b15a655340ba7b87bce7fd7871d
mes-web/src/views/device/DeviceEditDialog.vue
@@ -31,12 +31,16 @@
            </el-form-item>
            <el-form-item label="设备编码" prop="deviceCode">
              <el-input
                v-model="deviceForm.deviceCode"
                placeholder="请输入设备编码"
                maxlength="50"
                :disabled="isEdit"
              />
              <template v-if="isEdit">
                <el-input
                  v-model="deviceForm.deviceCode"
                  maxlength="50"
                  disabled
                />
              </template>
              <template v-else>
                <el-tag type="info">保存后自动生成</el-tag>
              </template>
            </el-form-item>
            <el-form-item label="设备类型" prop="deviceType">
@@ -50,11 +54,11 @@
              </el-select>
            </el-form-item>
            <el-form-item label="PLC类型" prop="plcType">
              <el-select v-model="deviceForm.plcType" placeholder="选择PLC类型" style="width: 100%;" clearable>
            <el-form-item label="通讯类型" prop="plcType">
              <el-select v-model="deviceForm.plcType" placeholder="选择通讯类型" style="width: 100%;" clearable>
                <el-option label="西门子 S7-1200" value="S1200" />
                <el-option label="西门子 S7-1500" value="S1500" />
                <el-option label="Modbus 控制器" value="MODBUS" />
                <el-option label="Modbus TCP" value="MODBUS" />
              </el-select>
            </el-form-item>
@@ -105,22 +109,7 @@
              />
            </el-form-item>
            <el-form-item label="通讯协议" prop="protocolType">
              <el-select
                v-model="deviceForm.protocolType"
                placeholder="选择通讯协议"
                style="width: 100%;"
                @change="handleProtocolTypeChange"
              >
                <el-option label="S7 Communication" value="S7 Communication" />
                <el-option label="Modbus TCP" value="Modbus TCP" />
                <el-option label="OPC UA" value="OPC UA" />
                <el-option label="EtherNet/IP" value="EtherNet/IP" />
                <el-option label="Profinet" value="Profinet" />
                <el-option label="其他" value="其他" />
              </el-select>
              <span class="form-tip">S7系列PLC通常使用S7 Communication协议</span>
            </el-form-item>
            <el-form-item label="超时时间(秒)" prop="timeout">
              <el-input-number
@@ -354,7 +343,7 @@
const deviceTypesLoading = ref(false)
// 设备逻辑参数(根据设备类型动态显示)
const deviceLogicParams = reactive({})
const deviceLogicParams = ref({})
const S7_PLC_TYPES = ['S1200', 'S1500']
const MODBUS_PLC_TYPES = ['MODBUS']
@@ -388,7 +377,8 @@
  description: '',
  isPrimary: false,
  enabled: true,
  extraParams: null
  extraParams: null,
  projectId: 1
})
const deviceForm = reactive(getDefaultForm())
@@ -397,14 +387,35 @@
const isEdit = computed(() => !!props.deviceData)
// 表单验证规则
const validateDeviceCode = async (rule, value, callback) => {
  if (!value) {
    // 允许留空,后台自动生成
    return callback()
  }
  try {
    const res = await deviceConfigApi.checkCode(
      value.trim(),
      isEdit.value ? props.deviceData?.id : null
    )
    if (res?.data === true) {
      callback(new Error('设备编码已存在,请更换'))
    } else {
      callback()
    }
  } catch (err) {
    console.error('检查设备编码失败', err)
    callback(new Error('设备编码校验失败,请稍后重试'))
  }
}
const deviceRules = {
  deviceName: [
    { required: true, message: '请输入设备名称', trigger: 'blur' },
    { min: 1, max: 50, message: '设备名称长度在 1 到 50 个字符', trigger: 'blur' }
  ],
  deviceCode: [
    { required: true, message: '请输入设备编码', trigger: 'blur' },
    { pattern: /^[A-Z0-9_]+$/, message: '设备编码只能包含大写字母、数字和下划线', trigger: 'blur' }
    { pattern: /^[A-Z0-9_]+$/, message: '设备编码只能包含大写字母、数字和下划线', trigger: 'blur' },
    { validator: validateDeviceCode, trigger: 'blur' }
  ],
  deviceType: [
    { required: true, message: '请选择设备类型', trigger: 'change' }
@@ -423,9 +434,7 @@
  moduleName: [
    { required: true, message: '请输入模块名称', trigger: 'blur' }
  ],
  protocolType: [
    { required: true, message: '请选择通讯协议', trigger: 'change' }
  ],
  timeout: [
    { required: true, message: '请输入超时时间', trigger: 'blur' },
    { type: 'number', min: 1, max: 300, message: '超时时间在 1 到 300 秒之间', trigger: 'blur' }
@@ -491,21 +500,7 @@
  }
})
// 处理通讯协议变化
const handleProtocolTypeChange = (value) => {
  if (!deviceForm.plcType || !value) {
    return
  }
  if (value !== 'S7 Communication' && S7_PLC_TYPES.includes(deviceForm.plcType)) {
      ElMessage.warning('S7系列PLC通常使用S7 Communication协议,请确认协议选择是否正确')
    return
    }
  if (value !== 'Modbus TCP' && MODBUS_PLC_TYPES.includes(deviceForm.plcType)) {
    ElMessage.warning('Modbus 类型PLC通常使用 Modbus TCP 协议,请确认协议选择是否正确')
  }
}
// 方法定义
// 加载设备类型列表
@@ -683,15 +678,11 @@
}
// 加载设备逻辑参数
const loadDeviceLogicParams = (deviceLogic, deviceType) => {
  // 清空现有参数
  Object.keys(deviceLogicParams).forEach(key => {
    delete deviceLogicParams[key]
  })
  // 根据设备类型加载对应的参数
const loadDeviceLogicParams = (deviceLogic) => {
  if (deviceLogic && Object.keys(deviceLogic).length > 0) {
    Object.assign(deviceLogicParams, deviceLogic)
    deviceLogicParams.value = { ...deviceLogic }
  } else {
    deviceLogicParams.value = {}
  }
}
@@ -701,9 +692,7 @@
  deviceFormRef.value?.clearValidate()
  
  // 重置设备逻辑参数
  Object.keys(deviceLogicParams).forEach(key => {
    delete deviceLogicParams[key]
  })
  deviceLogicParams.value = {}
}
const addConfigParam = () => {
@@ -778,8 +767,10 @@
  }
    // 保存设备逻辑参数(直接使用deviceLogicParams,由各个配置组件管理)
    if (deviceLogicParams && Object.keys(deviceLogicParams).length > 0) {
      extraObj.deviceLogic = { ...deviceLogicParams }
    if (deviceLogicParams.value && Object.keys(deviceLogicParams.value).length > 0) {
      extraObj.deviceLogic = { ...deviceLogicParams.value }
    } else {
      delete extraObj.deviceLogic
    }
    // 构建 configJson:将 configParams 数组转换为 JSON 字符串
@@ -806,6 +797,7 @@
      isPrimary: deviceForm.isPrimary,
      enabled: deviceForm.enabled,
      description: deviceForm.description,
      projectId: deviceForm.projectId,
      configJson: configJsonValue,  // 保存配置参数JSON
      extraParams: JSON.stringify(extraObj)
    }