From d7b4db9b4e08e6fd60595b4e6b871a5fd5002942 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 28 Jul 2025 21:38:27 +0800 Subject: [PATCH] =?UTF-8?q?perf=EF=BC=9A=E3=80=90IoT=20=E7=89=A9=E8=81=94?= =?UTF-8?q?=E7=BD=91=E3=80=91=E5=9C=BA=E6=99=AF=E8=81=94=E5=8A=A8=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=99=A8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/iot/rule/scene/scene.types.ts | 53 +++- .../iot/rule/scene/form/RuleSceneForm.vue | 69 +++-- .../scene/form/configs/ConditionConfig.vue | 212 ++++++++++--- .../form/configs/ConditionGroupConfig.vue | 7 +- .../configs/ConditionGroupContainerConfig.vue | 247 +++++++++++++++ .../configs/CurrentTimeConditionConfig.vue | 287 ++++++++++++++++++ .../configs/DeviceStatusConditionConfig.vue | 258 ++++++++++++++++ .../form/configs/DeviceTriggerConfig.vue | 249 +++++---------- .../form/configs/MainConditionConfig.vue | 114 +++++++ .../form/configs/SubConditionGroupConfig.vue | 220 ++++++++++++++ .../scene/form/sections/TriggerSection.vue | 226 ++++---------- .../form/selectors/ConditionTypeSelector.vue | 80 +++++ .../scene/form/selectors/DeviceSelector.vue | 127 ++++++++ .../scene/form/selectors/ProductSelector.vue | 81 +++++ .../iot/rule/scene/form/selectors/types.ts | 38 --- 15 files changed, 1815 insertions(+), 453 deletions(-) create mode 100644 src/views/iot/rule/scene/form/configs/ConditionGroupContainerConfig.vue create mode 100644 src/views/iot/rule/scene/form/configs/CurrentTimeConditionConfig.vue create mode 100644 src/views/iot/rule/scene/form/configs/DeviceStatusConditionConfig.vue create mode 100644 src/views/iot/rule/scene/form/configs/MainConditionConfig.vue create mode 100644 src/views/iot/rule/scene/form/configs/SubConditionGroupConfig.vue create mode 100644 src/views/iot/rule/scene/form/selectors/ConditionTypeSelector.vue create mode 100644 src/views/iot/rule/scene/form/selectors/DeviceSelector.vue create mode 100644 src/views/iot/rule/scene/form/selectors/ProductSelector.vue diff --git a/src/api/iot/rule/scene/scene.types.ts b/src/api/iot/rule/scene/scene.types.ts index 3ae0707f6..3ba5dd25e 100644 --- a/src/api/iot/rule/scene/scene.types.ts +++ b/src/api/iot/rule/scene/scene.types.ts @@ -46,6 +46,24 @@ const IotRuleSceneTriggerConditionParameterOperatorEnum = { NOT_NULL: { name: '非空', value: 'not null' } // 非空 } as const +// 条件类型枚举 +const IotRuleSceneTriggerConditionTypeEnum = { + DEVICE_STATUS: 1, // 设备状态 + DEVICE_PROPERTY: 2, // 设备属性 + CURRENT_TIME: 3 // 当前时间 +} as const + +// 时间运算符枚举 +const IotRuleSceneTriggerTimeOperatorEnum = { + BEFORE_TIME: { name: '在时间之前', value: 'before_time' }, // 在时间之前 + AFTER_TIME: { name: '在时间之后', value: 'after_time' }, // 在时间之后 + BETWEEN_TIME: { name: '在时间之间', value: 'between_time' }, // 在时间之间 + AT_TIME: { name: '在指定时间', value: 'at_time' }, // 在指定时间 + BEFORE_TODAY: { name: '在今日之前', value: 'before_today' }, // 在今日之前 + AFTER_TODAY: { name: '在今日之后', value: 'after_today' }, // 在今日之后 + TODAY: { name: '在今日之间', value: 'today' } // 在今日之间 +} as const + // TODO @puhui999:下面 IotAlertConfigReceiveTypeEnum、DeviceStateEnum 没用到,貌似可以删除下? const IotAlertConfigReceiveTypeEnum = { SMS: 1, // 短信 @@ -126,7 +144,7 @@ interface RuleSceneFormData { name: string description?: string status: number - triggers: TriggerFormData[] + trigger: TriggerFormData // 改为单个触发器 actions: ActionFormData[] } @@ -138,7 +156,9 @@ interface TriggerFormData { operator?: string value?: string cronExpression?: string - conditionGroups?: ConditionGroupFormData[] + // 新的条件结构 + mainCondition?: ConditionFormData // 主条件(必须满足) + conditionGroup?: ConditionGroupContainerFormData // 条件组容器(可选,与主条件为且关系) } interface ActionFormData { @@ -149,6 +169,17 @@ interface ActionFormData { alertConfigId?: number } +// 条件组容器(包含多个子条件组,子条件组间为或关系) +interface ConditionGroupContainerFormData { + subGroups: SubConditionGroupFormData[] // 子条件组数组,子条件组间为或关系 +} + +// 子条件组(内部条件为且关系) +interface SubConditionGroupFormData { + conditions: ConditionFormData[] // 条件数组,条件间为且关系 +} + +// 保留原有接口用于兼容性 interface ConditionGroupFormData { conditions: ConditionFormData[] // 注意:条件组内部的条件固定为"且"关系,条件组之间固定为"或"关系 @@ -157,12 +188,14 @@ interface ConditionGroupFormData { } interface ConditionFormData { - type: number - productId: number - deviceId: number - identifier: string - operator: string - param: string + type: number // 条件类型:1-设备状态,2-设备属性,3-当前时间 + productId?: number // 产品ID(设备状态和设备属性时必填) + deviceId?: number // 设备ID(设备状态和设备属性时必填) + identifier?: string // 标识符(设备属性时必填) + operator: string // 操作符 + param: string // 参数值 + timeValue?: string // 时间值(当前时间条件时使用) + timeValue2?: string // 第二个时间值(时间范围条件时使用) } // 主接口 @@ -210,12 +243,16 @@ export { TriggerFormData, ActionFormData, ConditionGroupFormData, + ConditionGroupContainerFormData, + SubConditionGroupFormData, ConditionFormData, IotRuleSceneTriggerTypeEnum, IotRuleSceneActionTypeEnum, IotDeviceMessageTypeEnum, IotDeviceMessageIdentifierEnum, IotRuleSceneTriggerConditionParameterOperatorEnum, + IotRuleSceneTriggerConditionTypeEnum, + IotRuleSceneTriggerTimeOperatorEnum, IotAlertConfigReceiveTypeEnum, DeviceStateEnum, CommonStatusEnum, diff --git a/src/views/iot/rule/scene/form/RuleSceneForm.vue b/src/views/iot/rule/scene/form/RuleSceneForm.vue index f4b8ca129..471ea7f89 100644 --- a/src/views/iot/rule/scene/form/RuleSceneForm.vue +++ b/src/views/iot/rule/scene/form/RuleSceneForm.vue @@ -22,7 +22,7 @@ - + @@ -45,6 +45,7 @@ import { RuleSceneFormData, IotRuleScene, IotRuleSceneActionTypeEnum, + IotRuleSceneTriggerTypeEnum, CommonStatusEnum } from '@/api/iot/rule/scene/scene.types' import { getBaseValidationRules } from '../utils/validation' @@ -77,7 +78,17 @@ const createDefaultFormData = (): RuleSceneFormData => { name: '', description: '', status: CommonStatusEnum.ENABLE, // 默认启用状态 - triggers: [], + trigger: { + type: IotRuleSceneTriggerTypeEnum.DEVICE_PROPERTY_POST, + productId: undefined, + deviceId: undefined, + identifier: undefined, + operator: undefined, + value: undefined, + cronExpression: undefined, + mainCondition: undefined, + conditionGroup: undefined + }, actions: [] } } @@ -91,23 +102,19 @@ const transformFormToApi = (formData: RuleSceneFormData): IotRuleScene => { name: formData.name, description: formData.description, status: Number(formData.status), - triggers: - formData.triggers?.map((trigger) => ({ - type: trigger.type, - productKey: trigger.productId ? `product_${trigger.productId}` : undefined, - deviceNames: trigger.deviceId ? [`device_${trigger.deviceId}`] : undefined, - cronExpression: trigger.cronExpression, - conditions: - trigger.conditionGroups?.map((group) => ({ - type: 'property', - identifier: trigger.identifier || '', - parameters: group.conditions.map((condition) => ({ - identifier: condition.identifier, - operator: condition.operator, - value: condition.param - })) - })) || [] - })) || [], + triggers: [ + { + type: formData.trigger.type, + productKey: formData.trigger.productId + ? `product_${formData.trigger.productId}` + : undefined, + deviceNames: formData.trigger.deviceId + ? [`device_${formData.trigger.deviceId}`] + : undefined, + cronExpression: formData.trigger.cronExpression, + conditions: [] // TODO: 实现新的条件转换逻辑 + } + ], actions: formData.actions?.map((action) => ({ type: action.type, @@ -131,16 +138,26 @@ const transformFormToApi = (formData: RuleSceneFormData): IotRuleScene => { * 将 API 响应数据转换为表单格式 */ const transformApiToForm = (apiData: IotRuleScene): RuleSceneFormData => { + const firstTrigger = apiData.triggers?.[0] return { ...apiData, status: Number(apiData.status), // 确保状态为数字类型 - triggers: - apiData.triggers?.map((trigger) => ({ - ...trigger, - type: Number(trigger.type), - // 为每个触发器添加唯一标识符,解决组件索引重用问题 - key: generateUUID() - })) || [], + trigger: firstTrigger + ? { + ...firstTrigger, + type: Number(firstTrigger.type) + } + : { + type: IotRuleSceneTriggerTypeEnum.DEVICE_PROPERTY_POST, + productId: undefined, + deviceId: undefined, + identifier: undefined, + operator: undefined, + value: undefined, + cronExpression: undefined, + mainCondition: undefined, + conditionGroup: undefined + }, actions: apiData.actions?.map((action) => ({ ...action, diff --git a/src/views/iot/rule/scene/form/configs/ConditionConfig.vue b/src/views/iot/rule/scene/form/configs/ConditionConfig.vue index 0a975516a..8b9b6dc15 100644 --- a/src/views/iot/rule/scene/form/configs/ConditionConfig.vue +++ b/src/views/iot/rule/scene/form/configs/ConditionConfig.vue @@ -1,60 +1,121 @@ -