Просмотр исходного кода

perf:【IoT 物联网】场景联动接口定义和常量定义分离

puhui999 8 месяцев назад
Родитель
Сommit
b91770aa1f

+ 132 - 65
src/api/iot/rule/scene/scene.types.ts

@@ -2,58 +2,138 @@
  * IoT 场景联动接口定义
  */
 
-// 枚举定义已迁移到 constants.ts,这里不再重复导出
-
-const IotRuleSceneActionTypeEnum = {
-  DEVICE_PROPERTY_SET: 1, // 设备属性设置,
-  DEVICE_SERVICE_INVOKE: 2, // 设备服务调用
-  ALERT_TRIGGER: 100, // 告警触发
-  ALERT_RECOVER: 101 // 告警恢复
-} as const
-
-const IotDeviceMessageTypeEnum = {
-  PROPERTY: 'property', // 属性
-  SERVICE: 'service', // 服务
-  EVENT: 'event' // 事件
-} as const
-
-// 已删除不需要的 IotDeviceMessageIdentifierEnum
-
-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 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
-
-// 已删除未使用的枚举:IotAlertConfigReceiveTypeEnum、DeviceStateEnum
-// CommonStatusEnum 已在全局定义,这里不再重复定义
+// ========== IoT物模型TSL数据类型定义 ==========
+
+/** 物模型TSL响应数据结构 */
+export interface IotThingModelTSLRespVO {
+  productId: number
+  productKey: string
+  properties: ThingModelProperty[]
+  events: ThingModelEvent[]
+  services: ThingModelService[]
+}
+
+/** 物模型属性 */
+export interface ThingModelProperty {
+  identifier: string
+  name: string
+  accessMode: string
+  required?: boolean
+  dataType: string
+  description?: string
+  dataSpecs?: ThingModelDataSpecs
+  dataSpecsList?: ThingModelDataSpecs[]
+}
+
+/** 物模型事件 */
+export interface ThingModelEvent {
+  identifier: string
+  name: string
+  required?: boolean
+  type: string
+  description?: string
+  outputParams?: ThingModelParam[]
+  method?: string
+}
+
+/** 物模型服务 */
+export interface ThingModelService {
+  identifier: string
+  name: string
+  required?: boolean
+  callType: string
+  description?: string
+  inputParams?: ThingModelParam[]
+  outputParams?: ThingModelParam[]
+  method?: string
+}
+
+/** 物模型参数 */
+export interface ThingModelParam {
+  identifier: string
+  name: string
+  direction: string
+  paraOrder?: number
+  dataType: string
+  dataSpecs?: ThingModelDataSpecs
+  dataSpecsList?: ThingModelDataSpecs[]
+}
+
+/** 数值型数据规范 */
+export interface ThingModelNumericDataSpec {
+  dataType: 'int' | 'float' | 'double'
+  max: string
+  min: string
+  step: string
+  precise?: string
+  defaultValue?: string
+  unit?: string
+  unitName?: string
+}
+
+/** 布尔/枚举型数据规范 */
+export interface ThingModelBoolOrEnumDataSpecs {
+  dataType: 'bool' | 'enum'
+  name: string
+  value: number
+}
+
+/** 文本/时间型数据规范 */
+export interface ThingModelDateOrTextDataSpecs {
+  dataType: 'text' | 'date'
+  length?: number
+  defaultValue?: string
+}
+
+/** 数组型数据规范 */
+export interface ThingModelArrayDataSpecs {
+  dataType: 'array'
+  size: number
+  childDataType: string
+  dataSpecsList?: ThingModelDataSpecs[]
+}
+
+/** 结构体型数据规范 */
+export interface ThingModelStructDataSpecs {
+  dataType: 'struct'
+  identifier: string
+  name: string
+  accessMode: string
+  required?: boolean
+  childDataType: string
+  dataSpecs?: ThingModelDataSpecs
+  dataSpecsList?: ThingModelDataSpecs[]
+}
+
+/** 数据规范联合类型 */
+export type ThingModelDataSpecs =
+  | ThingModelNumericDataSpec
+  | ThingModelBoolOrEnumDataSpecs
+  | ThingModelDateOrTextDataSpecs
+  | ThingModelArrayDataSpecs
+  | ThingModelStructDataSpecs
+
+/** 属性选择器内部使用的统一数据结构 */
+export interface PropertySelectorItem {
+  identifier: string
+  name: string
+  description?: string
+  dataType: string
+  type: number // IoTThingModelTypeEnum
+  accessMode?: string
+  required?: boolean
+  unit?: string
+  range?: string
+  eventType?: string
+  callType?: string
+  inputParams?: ThingModelParam[]
+  outputParams?: ThingModelParam[]
+  property?: ThingModelProperty
+  event?: ThingModelEvent
+  service?: ThingModelService
+}
+
+// ========== 场景联动规则相关接口定义 ==========
 
 // 基础接口(如果项目中有全局的 BaseDO,可以使用全局的)
 interface TenantBaseDO {
@@ -199,14 +279,6 @@ interface ActionDO {
   alertConfigId?: number // 告警配置编号
 }
 
-// 工具类型 - 从枚举中提取类型
-// TriggerType 现在从 constants.ts 中的枚举提取
-export type ActionType =
-  (typeof IotRuleSceneActionTypeEnum)[keyof typeof IotRuleSceneActionTypeEnum]
-export type MessageType = (typeof IotDeviceMessageTypeEnum)[keyof typeof IotDeviceMessageTypeEnum]
-export type OperatorType =
-  (typeof IotRuleSceneTriggerConditionParameterOperatorEnum)[keyof typeof IotRuleSceneTriggerConditionParameterOperatorEnum]['value']
-
 // 表单验证规则类型
 interface ValidationRule {
   required?: boolean
@@ -237,11 +309,6 @@ export {
   TriggerFormData,
   TriggerConditionFormData,
   ActionFormData,
-  IotRuleSceneActionTypeEnum,
-  IotDeviceMessageTypeEnum,
-  IotRuleSceneTriggerConditionParameterOperatorEnum,
-  IotRuleSceneTriggerConditionTypeEnum,
-  IotRuleSceneTriggerTimeOperatorEnum,
   ValidationRule,
   FormValidationRules
 }

+ 20 - 9
src/views/iot/rule/scene/form/configs/ConditionConfig.vue

@@ -121,10 +121,11 @@ import DeviceSelector from '../selectors/DeviceSelector.vue'
 import PropertySelector from '../selectors/PropertySelector.vue'
 import OperatorSelector from '../selectors/OperatorSelector.vue'
 import ValueInput from '../inputs/ValueInput.vue'
+import { TriggerConditionFormData } from '@/api/iot/rule/scene/scene.types'
 import {
-  TriggerConditionFormData,
-  IotRuleSceneTriggerConditionTypeEnum
-} from '@/api/iot/rule/scene/scene.types'
+  IotRuleSceneTriggerConditionTypeEnum,
+  IotRuleSceneTriggerConditionParameterOperatorEnum
+} from '@/views/iot/utils/constants'
 
 /** 单个条件配置组件 */
 defineOptions({ name: 'ConditionConfig' })
@@ -166,19 +167,29 @@ const handleConditionTypeChange = (type: number) => {
   // 清理不相关的字段
   if (type === ConditionTypeEnum.DEVICE_STATUS) {
     condition.value.identifier = undefined
-    condition.value.timeValue = undefined
-    condition.value.timeValue2 = undefined
+    // 清理时间相关字段(如果存在)
+    if ('timeValue' in condition.value) {
+      delete (condition.value as any).timeValue
+    }
+    if ('timeValue2' in condition.value) {
+      delete (condition.value as any).timeValue2
+    }
   } else if (type === ConditionTypeEnum.CURRENT_TIME) {
     condition.value.identifier = undefined
     condition.value.productId = undefined
     condition.value.deviceId = undefined
   } else if (type === ConditionTypeEnum.DEVICE_PROPERTY) {
-    condition.value.timeValue = undefined
-    condition.value.timeValue2 = undefined
+    // 清理时间相关字段(如果存在)
+    if ('timeValue' in condition.value) {
+      delete (condition.value as any).timeValue
+    }
+    if ('timeValue2' in condition.value) {
+      delete (condition.value as any).timeValue2
+    }
   }
 
-  // 重置操作符和参数
-  condition.value.operator = '='
+  // 重置操作符和参数,使用枚举中的默认值
+  condition.value.operator = IotRuleSceneTriggerConditionParameterOperatorEnum.EQUALS.value
   condition.value.param = ''
 
   updateValidationResult()

+ 14 - 10
src/views/iot/rule/scene/form/sections/ActionSection.vue

@@ -36,7 +36,11 @@
 
       <!-- 执行器列表 -->
       <div v-else class="space-y-16px">
-        <div v-for="(action, index) in actions" :key="`action-${index}`" class="p-16px border border-[var(--el-border-color-lighter)] rounded-6px bg-[var(--el-fill-color-blank)]">
+        <div
+          v-for="(action, index) in actions"
+          :key="`action-${index}`"
+          class="p-16px border border-[var(--el-border-color-lighter)] rounded-6px bg-[var(--el-fill-color-blank)]"
+        >
           <div class="flex items-center justify-between mb-16px">
             <div class="flex items-center gap-8px">
               <Icon icon="ep:setting" class="text-[var(--el-color-success)] text-16px" />
@@ -92,7 +96,9 @@
           <Icon icon="ep:plus" />
           继续添加执行器
         </el-button>
-        <span class="block mt-8px text-12px text-[var(--el-text-color-secondary)]"> 最多可添加 {{ maxActions }} 个执行器 </span>
+        <span class="block mt-8px text-12px text-[var(--el-text-color-secondary)]">
+          最多可添加 {{ maxActions }} 个执行器
+        </span>
       </div>
 
       <!-- 验证结果 -->
@@ -113,10 +119,8 @@ import { useVModel } from '@vueuse/core'
 import ActionTypeSelector from '../selectors/ActionTypeSelector.vue'
 import DeviceControlConfig from '../configs/DeviceControlConfig.vue'
 import AlertConfig from '../configs/AlertConfig.vue'
-import {
-  ActionFormData,
-  IotRuleSceneActionTypeEnum as ActionTypeEnum
-} from '@/api/iot/rule/scene/scene.types'
+import { ActionFormData } from '@/api/iot/rule/scene/scene.types'
+import { IotRuleSceneActionTypeEnum as ActionTypeEnum } from '@/views/iot/utils/constants'
 
 /** 执行器配置组件 */
 defineOptions({ name: 'ActionSection' })
@@ -173,11 +177,13 @@ const actionTypeTags = {
 
 // 工具函数
 const isDeviceAction = (type: number) => {
-  return [ActionTypeEnum.DEVICE_PROPERTY_SET, ActionTypeEnum.DEVICE_SERVICE_INVOKE].includes(type)
+  return [ActionTypeEnum.DEVICE_PROPERTY_SET, ActionTypeEnum.DEVICE_SERVICE_INVOKE].includes(
+    type as any
+  )
 }
 
 const isAlertAction = (type: number) => {
-  return [ActionTypeEnum.ALERT_TRIGGER, ActionTypeEnum.ALERT_RECOVER].includes(type)
+  return [ActionTypeEnum.ALERT_TRIGGER, ActionTypeEnum.ALERT_RECOVER].includes(type as any)
 }
 
 const getActionTypeName = (type: number) => {
@@ -277,5 +283,3 @@ watch(
   }
 )
 </script>
-
-

+ 11 - 4
src/views/iot/rule/scene/form/selectors/ActionTypeSelector.vue

@@ -17,10 +17,17 @@
         >
           <div class="flex items-center justify-between w-full py-4px">
             <div class="flex items-center gap-12px flex-1">
-              <Icon :icon="option.icon" class="text-18px text-[var(--el-color-primary)] flex-shrink-0" />
+              <Icon
+                :icon="option.icon"
+                class="text-18px text-[var(--el-color-primary)] flex-shrink-0"
+              />
               <div class="flex-1">
-                <div class="text-14px font-500 text-[var(--el-text-color-primary)] mb-2px">{{ option.label }}</div>
-                <div class="text-12px text-[var(--el-text-color-secondary)] leading-relaxed">{{ option.description }}</div>
+                <div class="text-14px font-500 text-[var(--el-text-color-primary)] mb-2px">{{
+                  option.label
+                }}</div>
+                <div class="text-12px text-[var(--el-text-color-secondary)] leading-relaxed">{{
+                  option.description
+                }}</div>
               </div>
             </div>
             <el-tag :type="option.tag" size="small">
@@ -35,7 +42,7 @@
 
 <script setup lang="ts">
 import { useVModel } from '@vueuse/core'
-import { IotRuleSceneActionTypeEnum } from '@/api/iot/rule/scene/scene.types'
+import { IotRuleSceneActionTypeEnum } from '@/views/iot/utils/constants'
 
 /** 执行器类型选择组件 */
 defineOptions({ name: 'ActionTypeSelector' })

+ 1 - 1
src/views/iot/rule/scene/form/selectors/ConditionTypeSelector.vue

@@ -24,7 +24,7 @@
 </template>
 
 <script setup lang="ts">
-import { IotRuleSceneTriggerConditionTypeEnum } from '@/api/iot/rule/scene/scene.types'
+import { IotRuleSceneTriggerConditionTypeEnum } from '@/views/iot/utils/constants'
 
 /** 条件类型选择器组件 */
 defineOptions({ name: 'ConditionTypeSelector' })

+ 43 - 34
src/views/iot/rule/scene/form/selectors/OperatorSelector.vue

@@ -35,6 +35,7 @@
 
 <script setup lang="ts">
 import { useVModel } from '@vueuse/core'
+import { IotRuleSceneTriggerConditionParameterOperatorEnum } from '@/views/iot/utils/constants'
 
 /** 操作符选择器组件 */
 defineOptions({ name: 'OperatorSelector' })
@@ -51,95 +52,103 @@ const emit = defineEmits<{
 
 const localValue = useVModel(props, 'modelValue', emit)
 
-// 所有操作符定义
+// 基于枚举的操作符定义
 const allOperators = [
   {
-    value: '=',
-    label: '等于',
+    value: IotRuleSceneTriggerConditionParameterOperatorEnum.EQUALS.value,
+    label: IotRuleSceneTriggerConditionParameterOperatorEnum.EQUALS.name,
     symbol: '=',
     description: '值完全相等时触发',
     example: 'temperature = 25',
     supportedTypes: ['int', 'float', 'double', 'string', 'bool', 'enum']
   },
   {
-    value: '!=',
-    label: '不等于',
+    value: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_EQUALS.value,
+    label: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_EQUALS.name,
     symbol: '≠',
     description: '值不相等时触发',
     example: 'power != false',
     supportedTypes: ['int', 'float', 'double', 'string', 'bool', 'enum']
   },
   {
-    value: '>',
-    label: '大于',
+    value: IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN.value,
+    label: IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN.name,
     symbol: '>',
     description: '值大于指定值时触发',
     example: 'temperature > 30',
     supportedTypes: ['int', 'float', 'double', 'date']
   },
   {
-    value: '>=',
-    label: '大于等于',
+    value: IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN_OR_EQUALS.value,
+    label: IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN_OR_EQUALS.name,
     symbol: '≥',
     description: '值大于或等于指定值时触发',
     example: 'humidity >= 80',
     supportedTypes: ['int', 'float', 'double', 'date']
   },
   {
-    value: '<',
-    label: '小于',
+    value: IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN.value,
+    label: IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN.name,
     symbol: '<',
     description: '值小于指定值时触发',
     example: 'temperature < 10',
     supportedTypes: ['int', 'float', 'double', 'date']
   },
   {
-    value: '<=',
-    label: '小于等于',
+    value: IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN_OR_EQUALS.value,
+    label: IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN_OR_EQUALS.name,
     symbol: '≤',
     description: '值小于或等于指定值时触发',
     example: 'battery <= 20',
     supportedTypes: ['int', 'float', 'double', 'date']
   },
   {
-    value: 'in',
-    label: '包含于',
+    value: IotRuleSceneTriggerConditionParameterOperatorEnum.IN.value,
+    label: IotRuleSceneTriggerConditionParameterOperatorEnum.IN.name,
     symbol: '∈',
     description: '值在指定列表中时触发',
     example: 'status in [1,2,3]',
     supportedTypes: ['int', 'float', 'string', 'enum']
   },
   {
-    value: 'between',
-    label: '介于',
+    value: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_IN.value,
+    label: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_IN.name,
+    symbol: '∉',
+    description: '值不在指定列表中时触发',
+    example: 'status not in [1,2,3]',
+    supportedTypes: ['int', 'float', 'string', 'enum']
+  },
+  {
+    value: IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN.value,
+    label: IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN.name,
     symbol: '⊆',
     description: '值在指定范围内时触发',
     example: 'temperature between 20,30',
     supportedTypes: ['int', 'float', 'double', 'date']
   },
   {
-    value: 'contains',
-    label: '包含',
-    symbol: '',
-    description: '字符串包含指定内容时触发',
-    example: 'message contains "error"',
-    supportedTypes: ['string']
+    value: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_BETWEEN.value,
+    label: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_BETWEEN.name,
+    symbol: '',
+    description: '值不在指定范围内时触发',
+    example: 'temperature not between 20,30',
+    supportedTypes: ['int', 'float', 'double', 'date']
   },
   {
-    value: 'startsWith',
-    label: '开始于',
-    symbol: '',
-    description: '字符串以指定内容开始时触发',
-    example: 'deviceName startsWith "sensor"',
+    value: IotRuleSceneTriggerConditionParameterOperatorEnum.LIKE.value,
+    label: IotRuleSceneTriggerConditionParameterOperatorEnum.LIKE.name,
+    symbol: '',
+    description: '字符串匹配指定模式时触发',
+    example: 'message like "%error%"',
     supportedTypes: ['string']
   },
   {
-    value: 'endsWith',
-    label: '结束于',
-    symbol: '',
-    description: '字符串以指定内容结束时触发',
-    example: 'fileName endsWith ".log"',
-    supportedTypes: ['string']
+    value: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_NULL.value,
+    label: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_NULL.name,
+    symbol: '≠∅',
+    description: '值非空时触发',
+    example: 'data not null',
+    supportedTypes: ['int', 'float', 'double', 'string', 'bool', 'enum', 'date']
   }
 ]
 

+ 1 - 1
src/views/iot/rule/scene/form/selectors/PropertySelector.vue

@@ -129,7 +129,7 @@ import { useVModel } from '@vueuse/core'
 import { InfoFilled } from '@element-plus/icons-vue'
 import { IotRuleSceneTriggerTypeEnum, IoTThingModelTypeEnum } from '@/views/iot/utils/constants'
 import { ThingModelApi } from '@/api/iot/thingmodel'
-import type { IotThingModelTSLRespVO, PropertySelectorItem } from './types'
+import type { IotThingModelTSLRespVO, PropertySelectorItem } from '@/api/iot/rule/scene/scene.types'
 
 /** 属性选择器组件 */
 defineOptions({ name: 'PropertySelector' })

+ 0 - 132
src/views/iot/rule/scene/form/selectors/types.ts

@@ -1,132 +0,0 @@
-// IoT物模型TSL数据类型定义
-
-// TODO @puhui999:看看这些里面,是不是一些已经有了哈?可以复用下~
-
-/** 物模型TSL响应数据结构 */
-export interface IotThingModelTSLRespVO {
-  productId: number
-  productKey: string
-  properties: ThingModelProperty[]
-  events: ThingModelEvent[]
-  services: ThingModelService[]
-}
-
-/** 物模型属性 */
-export interface ThingModelProperty {
-  identifier: string
-  name: string
-  accessMode: string
-  required?: boolean
-  dataType: string
-  description?: string
-  dataSpecs?: ThingModelDataSpecs
-  dataSpecsList?: ThingModelDataSpecs[]
-}
-
-/** 物模型事件 */
-export interface ThingModelEvent {
-  identifier: string
-  name: string
-  required?: boolean
-  type: string
-  description?: string
-  outputParams?: ThingModelParam[]
-  method?: string
-}
-
-/** 物模型服务 */
-export interface ThingModelService {
-  identifier: string
-  name: string
-  required?: boolean
-  callType: string
-  description?: string
-  inputParams?: ThingModelParam[]
-  outputParams?: ThingModelParam[]
-  method?: string
-}
-
-/** 物模型参数 */
-export interface ThingModelParam {
-  identifier: string
-  name: string
-  direction: string
-  paraOrder?: number
-  dataType: string
-  dataSpecs?: ThingModelDataSpecs
-  dataSpecsList?: ThingModelDataSpecs[]
-}
-
-/** 数值型数据规范 */
-export interface ThingModelNumericDataSpec {
-  dataType: 'int' | 'float' | 'double'
-  max: string
-  min: string
-  step: string
-  precise?: string
-  defaultValue?: string
-  unit?: string
-  unitName?: string
-}
-
-/** 布尔/枚举型数据规范 */
-export interface ThingModelBoolOrEnumDataSpecs {
-  dataType: 'bool' | 'enum'
-  name: string
-  value: number
-}
-
-/** 文本/时间型数据规范 */
-export interface ThingModelDateOrTextDataSpecs {
-  dataType: 'text' | 'date'
-  length?: number
-  defaultValue?: string
-}
-
-/** 数组型数据规范 */
-export interface ThingModelArrayDataSpecs {
-  dataType: 'array'
-  size: number
-  childDataType: string
-  dataSpecsList?: ThingModelDataSpecs[]
-}
-
-/** 结构体型数据规范 */
-export interface ThingModelStructDataSpecs {
-  dataType: 'struct'
-  identifier: string
-  name: string
-  accessMode: string
-  required?: boolean
-  childDataType: string
-  dataSpecs?: ThingModelDataSpecs
-  dataSpecsList?: ThingModelDataSpecs[]
-}
-
-/** 数据规范联合类型 */
-export type ThingModelDataSpecs =
-  | ThingModelNumericDataSpec
-  | ThingModelBoolOrEnumDataSpecs
-  | ThingModelDateOrTextDataSpecs
-  | ThingModelArrayDataSpecs
-  | ThingModelStructDataSpecs
-
-/** 属性选择器内部使用的统一数据结构 */
-export interface PropertySelectorItem {
-  identifier: string
-  name: string
-  description?: string
-  dataType: string
-  type: number // IoTThingModelTypeEnum
-  accessMode?: string
-  required?: boolean
-  unit?: string
-  range?: string
-  eventType?: string
-  callType?: string
-  inputParams?: ThingModelParam[]
-  outputParams?: ThingModelParam[]
-  property?: ThingModelProperty
-  event?: ThingModelEvent
-  service?: ThingModelService
-}

+ 51 - 0
src/views/iot/utils/constants.ts

@@ -249,3 +249,54 @@ export const isDeviceTrigger = (type: number): boolean => {
   ] as number[]
   return deviceTriggerTypes.includes(type)
 }
+
+// ========== 场景联动规则执行器相关常量 ==========
+
+/** IoT 场景联动执行器类型枚举 */
+export const IotRuleSceneActionTypeEnum = {
+  DEVICE_PROPERTY_SET: 1, // 设备属性设置
+  DEVICE_SERVICE_INVOKE: 2, // 设备服务调用
+  ALERT_TRIGGER: 100, // 告警触发
+  ALERT_RECOVER: 101 // 告警恢复
+} as const
+
+/** IoT 设备消息类型枚举 */
+export const IotDeviceMessageTypeEnum = {
+  PROPERTY: 'property', // 属性
+  SERVICE: 'service', // 服务
+  EVENT: 'event' // 事件
+} as const
+
+/** IoT 场景联动触发条件参数操作符枚举 */
+export 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
+
+/** IoT 场景联动触发条件类型枚举 */
+export const IotRuleSceneTriggerConditionTypeEnum = {
+  DEVICE_STATUS: 1, // 设备状态
+  DEVICE_PROPERTY: 2, // 设备属性
+  CURRENT_TIME: 3 // 当前时间
+} as const
+
+/** IoT 场景联动触发时间操作符枚举 */
+export 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