From 1ce562601f279181599bc20deb0b2d5df30370eb Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 25 Jan 2026 18:50:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(iot):=E3=80=90=E7=BD=91=E5=85=B3=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=EF=BC=9A80%=E3=80=91=E5=8A=A8=E6=80=81=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E7=9A=84=E5=88=9D=E6=AD=A5=E5=AE=9E=E7=8E=B0=EF=BC=88?= =?UTF-8?q?=E5=B7=B2=E6=B5=8B=E8=AF=95=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/iot/device/device/index.ts | 33 +- .../src/api/iot/product/product/index.ts | 11 +- .../src/views/iot/device/device/data.ts | 18 +- .../device/device/detail/modules/config.vue | 3 +- .../device/device/detail/modules/message.vue | 3 +- .../device/detail/modules/simulator.vue | 2 +- .../device/detail/modules/sub-device.vue | 339 +++++++++++++----- .../detail/modules/thing-model-event.vue | 2 +- .../detail/modules/thing-model-service.vue | 2 +- .../iot/product/product/components/index.ts | 1 + .../iot/product/product/components/select.vue | 57 +++ .../src/views/iot/product/product/data.ts | 13 +- .../product/product/detail/modules/info.vue | 38 +- .../iot/product/product/modules/form.vue | 2 + .../rule/components/source-config-form.vue | 6 +- .../web-antd/src/views/iot/utils/constants.ts | 45 +-- packages/constants/src/biz-iot-enum.ts | 105 +++++- 17 files changed, 507 insertions(+), 173 deletions(-) create mode 100644 apps/web-antd/src/views/iot/product/product/components/index.ts create mode 100644 apps/web-antd/src/views/iot/product/product/components/select.vue diff --git a/apps/web-antd/src/api/iot/device/device/index.ts b/apps/web-antd/src/api/iot/device/device/index.ts index 1ce230f94..ca2a17ada 100644 --- a/apps/web-antd/src/api/iot/device/device/index.ts +++ b/apps/web-antd/src/api/iot/device/device/index.ts @@ -21,7 +21,6 @@ export namespace IotDeviceApi { offlineTime?: Date; // 最后离线时间 activeTime?: Date; // 设备激活时间 deviceSecret?: string; // 设备密钥,用于设备认证 - authType?: string; // 认证类型(如一机一密、动态注册) config?: string; // 设备配置 latitude?: number; // 设备位置的纬度 longitude?: number; // 设备位置的经度 @@ -201,3 +200,35 @@ export function getDeviceMessagePairPage(params: PageParam) { export function sendDeviceMessage(params: IotDeviceApi.DeviceMessageSendReq) { return requestClient.post('/iot/device/message/send', params); } + +/** 绑定子设备到网关设备 */ +export function bindDeviceGateway(gatewayId: number, subIds: number[]) { + return requestClient.put('/iot/device/bind-gateway', { + gatewayId, + subIds, + }); +} + +/** 解绑子设备与网关设备 */ +export function unbindDeviceGateway(gatewayId: number, subIds: number[]) { + return requestClient.put('/iot/device/unbind-gateway', { + gatewayId, + subIds, + }); +} + +/** 获取网关设备的子设备列表 */ +export function getSubDeviceList(gatewayId: number) { + return requestClient.get( + '/iot/device/sub-device-list', + { params: { gatewayId } }, + ); +} + +/** 获取未绑定的子设备分页 */ +export function getUnboundSubDevicePage(params: PageParam) { + return requestClient.get>( + '/iot/device/unbound-sub-device-page', + { params }, + ); +} diff --git a/apps/web-antd/src/api/iot/product/product/index.ts b/apps/web-antd/src/api/iot/product/product/index.ts index 4109db34b..335819dd3 100644 --- a/apps/web-antd/src/api/iot/product/product/index.ts +++ b/apps/web-antd/src/api/iot/product/product/index.ts @@ -8,6 +8,7 @@ export namespace IotProductApi { id?: number; // 产品编号 name: string; // 产品名称 productKey?: string; // 产品标识 + productSecret?: string; // 产品密钥 protocolId?: number; // 协议编号 protocolType?: number; // 接入协议类型 categoryId?: number; // 产品所属品类标识符 @@ -21,6 +22,7 @@ export namespace IotProductApi { codecType?: string; // 数据格式(编解码器类型) dataFormat?: number; // 数据格式 validateType?: number; // 认证方式 + registerEnabled?: boolean; // 是否开启动态注册 deviceCount?: number; // 设备数量 createTime?: Date; // 创建时间 } @@ -67,8 +69,13 @@ export function updateProductStatus(id: number, status: number) { } /** 查询产品(精简)列表 */ -export function getSimpleProductList() { - return requestClient.get('/iot/product/simple-list'); +export function getSimpleProductList(deviceType?: number) { + return requestClient.get( + '/iot/product/simple-list', + { + params: { deviceType }, + }, + ); } /** 根据 ProductKey 获取产品信息 */ diff --git a/apps/web-antd/src/views/iot/device/device/data.ts b/apps/web-antd/src/views/iot/device/device/data.ts index 456adb657..c53c0e207 100644 --- a/apps/web-antd/src/views/iot/device/device/data.ts +++ b/apps/web-antd/src/views/iot/device/device/data.ts @@ -1,11 +1,10 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import { DeviceTypeEnum, DICT_TYPE } from '@vben/constants'; +import { DICT_TYPE } from '@vben/constants'; import { getDictOptions } from '@vben/hooks'; import { z } from '#/adapter/form'; -import { getSimpleDeviceList } from '#/api/iot/device/device'; import { getSimpleDeviceGroupList } from '#/api/iot/device/group'; import { getSimpleProductList } from '#/api/iot/product/product'; @@ -64,21 +63,6 @@ export function useBasicFormSchema(): VbenFormSchema[] { '支持英文字母、数字、下划线(_)、中划线(-)、点号(.)、半角冒号(:)和特殊字符@', ), }, - { - fieldName: 'gatewayId', - label: '网关设备', - component: 'ApiSelect', - componentProps: { - api: () => getSimpleDeviceList(DeviceTypeEnum.GATEWAY), - labelField: 'deviceName', - valueField: 'id', - placeholder: '子设备可选择父设备', - }, - dependencies: { - triggerFields: ['deviceType'], - show: (values) => values.deviceType === DeviceTypeEnum.GATEWAY_SUB, - }, - }, ]; } diff --git a/apps/web-antd/src/views/iot/device/device/detail/modules/config.vue b/apps/web-antd/src/views/iot/device/device/detail/modules/config.vue index 072a1ff77..0f773d21d 100644 --- a/apps/web-antd/src/views/iot/device/device/detail/modules/config.vue +++ b/apps/web-antd/src/views/iot/device/device/detail/modules/config.vue @@ -4,10 +4,11 @@ import type { IotDeviceApi } from '#/api/iot/device/device'; import { computed, ref, watchEffect } from 'vue'; +import { IotDeviceMessageMethodEnum } from '@vben/constants'; + import { Alert, Button, message, Textarea } from 'ant-design-vue'; import { sendDeviceMessage, updateDevice } from '#/api/iot/device/device'; -import { IotDeviceMessageMethodEnum } from '#/views/iot/utils/constants'; defineOptions({ name: 'DeviceDetailConfig' }); diff --git a/apps/web-antd/src/views/iot/device/device/detail/modules/message.vue b/apps/web-antd/src/views/iot/device/device/detail/modules/message.vue index 81e4d137d..04d07f3c0 100644 --- a/apps/web-antd/src/views/iot/device/device/detail/modules/message.vue +++ b/apps/web-antd/src/views/iot/device/device/detail/modules/message.vue @@ -11,7 +11,7 @@ import { } from 'vue'; import { Page } from '@vben/common-ui'; -import { DICT_TYPE } from '@vben/constants'; +import { DICT_TYPE, IotDeviceMessageMethodEnum } from '@vben/constants'; import { IconifyIcon } from '@vben/icons'; import { formatDateTime } from '@vben/utils'; @@ -19,7 +19,6 @@ import { Button, Select, Space, Switch, Tag } from 'ant-design-vue'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { getDeviceMessagePage } from '#/api/iot/device/device'; -import { IotDeviceMessageMethodEnum } from '#/views/iot/utils/constants'; const props = defineProps<{ deviceId: number; diff --git a/apps/web-antd/src/views/iot/device/device/detail/modules/simulator.vue b/apps/web-antd/src/views/iot/device/device/detail/modules/simulator.vue index fd01dae8d..ceb5b336a 100644 --- a/apps/web-antd/src/views/iot/device/device/detail/modules/simulator.vue +++ b/apps/web-antd/src/views/iot/device/device/detail/modules/simulator.vue @@ -9,6 +9,7 @@ import type { ThingModelData } from '#/api/iot/thingmodel'; import { computed, ref } from 'vue'; import { ContentWrap } from '@vben/common-ui'; +import { IotDeviceMessageMethodEnum } from '@vben/constants'; import { IconifyIcon } from '@vben/icons'; import { @@ -26,7 +27,6 @@ import { import { sendDeviceMessage } from '#/api/iot/device/device'; import { DeviceStateEnum, - IotDeviceMessageMethodEnum, IoTThingModelTypeEnum, } from '#/views/iot/utils/constants'; diff --git a/apps/web-antd/src/views/iot/device/device/detail/modules/sub-device.vue b/apps/web-antd/src/views/iot/device/device/detail/modules/sub-device.vue index 7ad04ae89..67bb69daa 100644 --- a/apps/web-antd/src/views/iot/device/device/detail/modules/sub-device.vue +++ b/apps/web-antd/src/views/iot/device/device/detail/modules/sub-device.vue @@ -1,20 +1,23 @@