From 416c7f42abb8d67fbf82eaefd51120df78567d7f Mon Sep 17 00:00:00 2001 From: puhui999 Date: Tue, 25 Mar 2025 16:19:56 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91IoT:=20=E5=9C=BA=E6=99=AF=E8=81=94=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/iot/rule/scene/index.ts | 16 +- src/api/iot/rule/scene/scene.types.ts | 305 ++++++------------ src/api/iot/thingmodel/index.ts | 2 +- ...eTableSelect.vue => DeviceTableSelect.vue} | 1 - ...TableSelect.vue => ProductTableSelect.vue} | 1 - ...IoTRuleSceneForm.vue => RuleSceneForm.vue} | 48 +-- .../scene/components/ConditionSelector.vue | 106 ++++-- .../rule/scene/components/DeviceListener.vue | 112 +++---- .../components/DeviceListenerCondition.vue | 43 ++- src/views/iot/rule/scene/index.vue | 11 +- 10 files changed, 298 insertions(+), 347 deletions(-) rename src/views/iot/device/device/components/{IoTDeviceTableSelect.vue => DeviceTableSelect.vue} (99%) rename src/views/iot/product/product/components/{IoTProductTableSelect.vue => ProductTableSelect.vue} (99%) rename src/views/iot/rule/scene/{IoTRuleSceneForm.vue => RuleSceneForm.vue} (83%) diff --git a/src/api/iot/rule/scene/index.ts b/src/api/iot/rule/scene/index.ts index 16f4e7afe..7cbb438b7 100644 --- a/src/api/iot/rule/scene/index.ts +++ b/src/api/iot/rule/scene/index.ts @@ -1,15 +1,5 @@ import request from '@/config/axios' -import { IotRuleSceneTriggerConfig } from '@/api/iot/rule/scene/scene.types' - -// IoT 场景联动 VO -export interface RuleSceneVO { - id?: number // 场景编号 - name: string // 场景名称 - description?: string // 场景描述 - status: number // 场景状态 - triggers: IotRuleSceneTriggerConfig[] // 触发器数组 - actions?: any[] // 执行器数组 -} +import { IotRuleScene } from './scene.types' // IoT 场景联动 API export const RuleSceneApi = { @@ -24,12 +14,12 @@ export const RuleSceneApi = { }, // 新增场景联动 - createRuleScene: async (data: RuleSceneVO) => { + createRuleScene: async (data: IotRuleScene) => { return await request.post({ url: `/iot/rule-scene/create`, data }) }, // 修改场景联动 - updateRuleScene: async (data: RuleSceneVO) => { + updateRuleScene: async (data: IotRuleScene) => { return await request.put({ url: `/iot/rule-scene/update`, data }) }, diff --git a/src/api/iot/rule/scene/scene.types.ts b/src/api/iot/rule/scene/scene.types.ts index 6e3350878..990822b9f 100644 --- a/src/api/iot/rule/scene/scene.types.ts +++ b/src/api/iot/rule/scene/scene.types.ts @@ -1,222 +1,131 @@ /** - * 场景规则触发器配置 + * IoT 场景联动接口定义 */ -export interface IotRuleSceneTriggerConfig { - /** - * 触发类型 - * - 1: 设备触发 - * - 2: 定时触发 - */ - type: number - /** 产品标识 */ - productKey: string - /** 设备名称数组 */ - deviceNames: string[] - /** 触发条件数组。条件之间是"或"的关系 */ - conditions: IotRuleSceneTriggerCondition[] - /** CRON 表达式。当 type = 2 时必填 */ - cronExpression?: string -} -/** - * 触发条件 - */ -export interface IotRuleSceneTriggerCondition { - /** - * 消息类型 - * - property: 属性上报 - * - event: 事件上报 - */ - type: string - /** 消息标识符 */ - identifier?: string - /** 参数数组。参数之间是"或"的关系 */ - parameters: IotRuleSceneTriggerConditionParameter[] -} +// 枚举定义 +const IotRuleSceneTriggerTypeEnum = { + DEVICE: 1, // 设备触发 + TIMER: 2 // 定时触发 +} as const -/** - * 触发条件参数 - */ -export interface IotRuleSceneTriggerConditionParameter { - /** 标识符(属性、事件、服务) */ - identifier: string - /** - * 操作符 - */ - operator: string - /** - * 比较值 - * 如果有多个值,则使用 "," 分隔,类似 "1,2,3" - */ - value: string -} +const IotRuleSceneActionTypeEnum = { + DEVICE_CONTROL: 1, // 设备执行 + ALERT: 2, // 告警执行 + DATA_BRIDGE: 3 // 桥接执行 +} as const -/** - * 执行器配置 - */ -export interface IotRuleSceneActionConfig { - /** - * 执行类型 - * - 1: 设备控制 - * - 2: 数据桥接 - */ - type: number - /** 设备控制配置。当 type = 1 时必填 */ - deviceControl?: IotRuleSceneActionDeviceControl - /** 数据桥接编号。当 type = 2 时必填 */ - dataBridgeId?: number -} +const IotDeviceMessageTypeEnum = { + PROPERTY: 'property', // 属性 + SERVICE: 'service', // 服务 + EVENT: 'event' // 事件 +} as const -/** - * 执行设备控制 - */ -export interface IotRuleSceneActionDeviceControl { - /** 产品标识 */ - productKey: string - /** 设备名称数组 */ - deviceNames: string[] - /** - * 消息类型 - * - property: 属性 - * - service: 服务 - */ - type: string - /** - * 消息标识符 - * - property_set: 属性设置 - * - service_invoke: 服务调用 - */ - identifier: string - /** 具体数据 */ - data: Record -} +const IotDeviceMessageIdentifierEnum = { + PROPERTY_SET: 'set', // 属性设置 + SERVICE_INVOKE: '${identifier}' // 服务调用 +} as const -/** - * 场景规则创建/更新请求 - */ -export interface IotRuleSceneSaveReqVO { - /** 场景规则编号 */ - id?: number - /** 场景规则名称 */ - name: string - /** 场景规则状态(0=禁用 1=启用) */ - status: number - /** 触发器配置 */ - triggerConfig: IotRuleSceneTriggerConfig - /** 执行动作配置数组 */ - actionConfigs: IotRuleSceneActionConfig[] - /** 备注 */ - remark?: string +const IotRuleSceneTriggerConditionParameterOperatorEnum = { + EQUALS: { name: '等于', value: '=' }, // 等于 + NOT_EQUALS: { name: '不等于', value: '!=' }, // 不等于 + GREATER_THAN: { name: '大于', value: '>' }, // 大于 + GREATER_THAN_OR_EQUALS: { name: '大于等于', value: '>=' }, // 大于等于 + LESS_THAN: { name: '小于', value: '<' }, // 小于 + LESS_THAN_OR_EQUALS: { name: '小于等于', value: '<=' }, // 小于等于 + IN: { name: '在...之中', value: 'in' }, // 在...之中 + NOT_IN: { name: '不在...之中', value: 'not in' }, // 不在...之中 + BETWEEN: { name: '在...之间', value: 'between' }, // 在...之间 + NOT_BETWEEN: { name: '不在...之间', value: 'not between' }, // 不在...之间 + LIKE: { name: '字符串匹配', value: 'like' }, // 字符串匹配 + NOT_NULL: { name: '非空', value: 'not null' } // 非空 +} as const + +const IotAlertConfigReceiveTypeEnum = { + SMS: 1, // 短信 + MAIL: 2, // 邮箱 + NOTIFY: 3 // 通知 +} as const + +// 基础接口 +interface TenantBaseDO { + createTime?: Date // 创建时间 + updateTime?: Date // 更新时间 + creator?: string // 创建者 + updater?: string // 更新者 + deleted?: boolean // 是否删除 + tenantId?: number // 租户编号 } -/** - * 场景规则响应 - */ -export interface IotRuleSceneRespVO { - /** 场景规则编号 */ - id: number - /** 场景规则名称 */ - name: string - /** 场景规则状态(0=禁用 1=启用) */ - status: number - /** 触发器配置 */ - triggerConfig: IotRuleSceneTriggerConfig - /** 执行动作配置数组 */ - actionConfigs: IotRuleSceneActionConfig[] - /** 备注 */ - remark?: string - /** 创建时间 */ - createTime: Date +// 触发条件参数 +interface TriggerConditionParameter { + identifier: string // 标识符(属性、事件、服务) + operator: string // 操作符 + value: string // 比较值 } -/** - * 场景规则分页项 - */ -export interface IotRuleScenePageItemRespVO extends IotRuleSceneRespVO { - /** 触发次数 */ - triggerCount: number - /** 最后触发时间 */ - lastTriggerTime?: Date +// 触发条件 +interface TriggerCondition { + type: string // 消息类型 + identifier: string // 消息标识符 + parameters: TriggerConditionParameter[] // 参数数组 } -/** - * 场景规则分页请求 - */ -export interface IotRuleScenePageReqVO { - /** 场景规则名称 */ - name?: string - /** 场景规则状态(0=禁用 1=启用) */ - status?: number - /** 创建时间 */ - createTime?: [Date, Date] - /** 页码 */ - pageNo?: number - /** 每页条数 */ - pageSize?: number +// 触发器配置 +interface TriggerConfig { + type: number // 触发类型 + productKey: string // 产品标识 + deviceNames: string[] // 设备名称数组 + conditions?: TriggerCondition[] // 触发条件数组 + cronExpression?: string // CRON 表达式 } -/** - * 场景规则类型枚举 - */ -export enum IotRuleSceneTriggerTypeEnum { - /** 设备触发 */ - DEVICE = 1, - /** 定时触发 */ - TIMER = 2 +// 执行设备控制 +interface ActionDeviceControl { + productKey: string // 产品标识 + deviceNames: string[] // 设备名称数组 + type: string // 消息类型 + identifier: string // 消息标识符 + data: Record // 具体数据 } -/** - * 场景规则动作类型枚举 - */ -export enum IotRuleSceneActionTypeEnum { - /** 设备控制 */ - DEVICE_CONTROL = 1, - /** 数据桥接 */ - DATA_BRIDGE = 2 +// 告警执行配置 +interface ActionAlert { + receiveType: number // 接收方式 + phoneNumbers?: string[] // 手机号列表 + emails?: string[] // 邮箱列表 + content: string // 通知内容 } -/** - * 设备消息类型枚举 - */ -export enum IotDeviceMessageTypeEnum { - /** 属性 */ - PROPERTY = 'property', - /** 事件 */ - EVENT = 'event', - /** 服务 */ - SERVICE = 'service' +// 执行器配置 +interface ActionConfig { + type: number // 执行类型 + deviceControl?: ActionDeviceControl // 设备控制 + alert?: ActionAlert // 告警执行 + dataBridgeId?: number // 数据桥接编号 } -/** - * 设备消息标识符枚举 - */ -export enum IotDeviceMessageIdentifierEnum { - /** 属性上报 */ - PROPERTY_REPORT = 'property_report', - /** 属性设置 */ - PROPERTY_SET = 'property_set', - /** 事件上报 */ - EVENT_REPORT = 'event_report', - /** 服务调用 */ - SERVICE_INVOKE = 'service_invoke' +// 主接口 +interface IotRuleScene extends TenantBaseDO { + id: number // 场景编号 + name: string // 场景名称 + description: string // 场景描述 + status: number // 场景状态 + triggers: TriggerConfig[] // 触发器数组 + actions: ActionConfig[] // 执行器数组 } -/** - * 触发条件参数操作符枚举 - */ -export enum IotRuleSceneTriggerConditionParameterOperatorEnum { - /** 等于 */ - EQ = 'eq', - /** 大于 */ - GT = 'gt', - /** 大于等于 */ - GTE = 'gte', - /** 小于 */ - LT = 'lt', - /** 小于等于 */ - LTE = 'lte', - /** 范围 */ - BETWEEN = 'between', - /** 在列表中 */ - IN = 'in' +export { + IotRuleScene, + TriggerConfig, + TriggerCondition, + TriggerConditionParameter, + ActionConfig, + ActionDeviceControl, + ActionAlert, + IotRuleSceneTriggerTypeEnum, + IotRuleSceneActionTypeEnum, + IotDeviceMessageTypeEnum, + IotDeviceMessageIdentifierEnum, + IotRuleSceneTriggerConditionParameterOperatorEnum, + IotAlertConfigReceiveTypeEnum } diff --git a/src/api/iot/thingmodel/index.ts b/src/api/iot/thingmodel/index.ts index df188c43c..f00dfe242 100644 --- a/src/api/iot/thingmodel/index.ts +++ b/src/api/iot/thingmodel/index.ts @@ -61,7 +61,7 @@ export const ThingModelApi = { // 获得产品物模型 TSL getThingModelTSLByProductId: async (productId: number) => { return await request.get({ - url: `/iot/thing-model/tsl-by-product-id?productId=${productId}` + url: `/iot/thing-model/get-tsl?productId=${productId}` }) }, diff --git a/src/views/iot/device/device/components/IoTDeviceTableSelect.vue b/src/views/iot/device/device/components/DeviceTableSelect.vue similarity index 99% rename from src/views/iot/device/device/components/IoTDeviceTableSelect.vue rename to src/views/iot/device/device/components/DeviceTableSelect.vue index 08cce9dc5..f68194029 100644 --- a/src/views/iot/device/device/components/IoTDeviceTableSelect.vue +++ b/src/views/iot/device/device/components/DeviceTableSelect.vue @@ -1,4 +1,3 @@ -