diff --git a/src/api/iot/product/product/index.ts b/src/api/iot/product/product/index.ts index c9f273ebe..c2a047ca9 100644 --- a/src/api/iot/product/product/index.ts +++ b/src/api/iot/product/product/index.ts @@ -16,6 +16,8 @@ export interface ProductVO { locationType: number // 设备类型 netType: number // 联网方式 codecType: string // 数据格式(编解码器类型) + protocolType?: string // 协议类型(STANDARD, MODBUS_RTU, MODBUS_TCP) + modbusSlaveId?: number // Modbus从站ID(1-247) deviceCount: number // 设备数量 createTime: Date // 创建时间 } diff --git a/src/api/iot/thingmodel/index.ts b/src/api/iot/thingmodel/index.ts index bcf9e0707..27ef6c544 100644 --- a/src/api/iot/thingmodel/index.ts +++ b/src/api/iot/thingmodel/index.ts @@ -78,6 +78,18 @@ export interface ThingModelProperty { description?: string dataSpecs?: ThingModelProperty dataSpecsList?: ThingModelProperty[] + modbusConfig?: ModbusConfig +} + +/** Modbus 配置 */ +export interface ModbusConfig { + collectionMode?: number // 数据采集模式:1-定时轮询,2-主动上报 + functionCode?: number // 功能码:0x03-读保持寄存器,0x04-读输入寄存器等(默认0x03) + registerAddress?: number // 寄存器地址(低位字节) + registerCount?: number // 寄存器数量 / 线圈数量(默认1) + pollingInterval?: number // 采集频率(秒) + fullFrame?: string // 完整的数据帧(自动生成的HEX字符串) + crcHex?: string // CRC 校验码(自动生成的HEX字符串) } /** 物模型事件 */ @@ -101,6 +113,7 @@ export interface ThingModelService { inputParams?: ThingModelParam[] outputParams?: ThingModelParam[] method?: string + modbusConfig?: ModbusConfig // 添加 Modbus 配置 } /** 物模型参数 */ @@ -197,6 +210,11 @@ export const ThingModelApi = { // 删除产品物模型 deleteThingModel: async (id: number) => { return await request.delete({ url: `/iot/thing-model/delete?id=` + id }) + }, + + // 计算 Modbus 命令(用于前端自动生成) + calculateModbusCommand: async (data: { productId: number; registerAddress: number; functionCode?: number }) => { + return await request.post({ url: `/iot/thing-model/calculate-modbus-command`, data }) } } diff --git a/src/views/iot/device/device/detail/DeviceDetailsThingModelEvent.vue b/src/views/iot/device/device/detail/DeviceDetailsThingModelEvent.vue index 04f9a9f53..5178ed7e8 100644 --- a/src/views/iot/device/device/detail/DeviceDetailsThingModelEvent.vue +++ b/src/views/iot/device/device/detail/DeviceDetailsThingModelEvent.vue @@ -131,6 +131,7 @@ const getList = async () => { if (!props.deviceId) return loading.value = true try { + queryParams.deviceId = props.deviceId const data = await DeviceApi.getDeviceMessagePairPage(queryParams) list.value = data.list total.value = data.length @@ -139,6 +140,17 @@ const getList = async () => { } } +/** 监听 deviceId 变化 */ +watch( + () => props.deviceId, + (val) => { + if (val) { + queryParams.deviceId = val + getList() + } + } +) + /** 搜索按钮操作 */ const handleQuery = () => { queryParams.pageNo = 1 diff --git a/src/views/iot/device/device/detail/DeviceDetailsThingModelProperty.vue b/src/views/iot/device/device/detail/DeviceDetailsThingModelProperty.vue index 438b529d6..e63b8d112 100644 --- a/src/views/iot/device/device/detail/DeviceDetailsThingModelProperty.vue +++ b/src/views/iot/device/device/detail/DeviceDetailsThingModelProperty.vue @@ -171,6 +171,9 @@ const queryFormRef = ref() // 搜索的表单 /** 查询列表 */ const getList = async () => { + if (!props.deviceId) { + return + } loading.value = true try { const params = { @@ -185,6 +188,16 @@ const getList = async () => { } } +/** 监听 deviceId 变化 */ +watch( + () => props.deviceId, + (val) => { + if (val) { + getList() + } + } +) + /** 前端筛选数据 */ const handleFilter = () => { if (!queryParams.keyword.trim()) { diff --git a/src/views/iot/device/device/detail/DeviceDetailsThingModelService.vue b/src/views/iot/device/device/detail/DeviceDetailsThingModelService.vue index fd8456162..37d0f780f 100644 --- a/src/views/iot/device/device/detail/DeviceDetailsThingModelService.vue +++ b/src/views/iot/device/device/detail/DeviceDetailsThingModelService.vue @@ -146,6 +146,7 @@ const getList = async () => { if (!props.deviceId) return loading.value = true try { + queryParams.deviceId = props.deviceId const data = await DeviceApi.getDeviceMessagePairPage(queryParams) list.value = data.list total.value = data.length @@ -154,6 +155,16 @@ const getList = async () => { } } +/** 监听 deviceId 变化 */ +watch( + () => props.deviceId, + (val) => { + if (val) { + queryParams.deviceId = val + getList() + } + } +) /** 搜索按钮操作 */ const handleQuery = () => { queryParams.pageNo = 1 diff --git a/src/views/iot/product/product/ProductForm.vue b/src/views/iot/product/product/ProductForm.vue index 5247e9258..2623973dd 100644 --- a/src/views/iot/product/product/ProductForm.vue +++ b/src/views/iot/product/product/ProductForm.vue @@ -83,6 +83,28 @@ {{ dict.label }} +