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 @@ - + - - - updateConditionField('identifier', value)" - :trigger-type="triggerType" - :product-id="productId" - :device-id="deviceId" - @change="handlePropertyChange" - /> - - - - - - - updateConditionField('operator', value)" - :property-type="propertyType" - @change="handleOperatorChange" - /> - - - - - - - updateConditionField('param', value)" - :property-type="propertyType" - :operator="condition.operator" - :property-config="propertyConfig" - @validate="handleValueValidate" + + updateConditionField('type', value)" + @change="handleConditionTypeChange" /> - - - - - 条件预览 - - - {{ conditionPreview }} + + + + + + + + + + updateConditionField('productId', value)" + @change="handleProductChange" + /> + + + + + updateConditionField('deviceId', value)" + :product-id="condition.productId" + @change="handleDeviceChange" + /> + + + + + + + + + + updateConditionField('identifier', value)" + :trigger-type="triggerType" + :product-id="condition.productId" + :device-id="condition.deviceId" + @change="handlePropertyChange" + /> + + + + + + + updateConditionField('operator', value)" + :property-type="propertyType" + @change="handleOperatorChange" + /> + + + + + + + updateConditionField('param', value)" + :property-type="propertyType" + :operator="condition.operator" + :property-config="propertyConfig" + @validate="handleValueValidate" + /> + + + + + + + + + 条件预览 + + + {{ conditionPreview }} + + + + import { useVModel } from '@vueuse/core' +import ConditionTypeSelector from '../selectors/ConditionTypeSelector.vue' +import DeviceStatusConditionConfig from './DeviceStatusConditionConfig.vue' +import CurrentTimeConditionConfig from './CurrentTimeConditionConfig.vue' +import ProductSelector from '../selectors/ProductSelector.vue' +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 { ConditionFormData } from '@/api/iot/rule/scene/scene.types' +import { + ConditionFormData, + IotRuleSceneTriggerConditionTypeEnum +} from '@/api/iot/rule/scene/scene.types' /** 单个条件配置组件 */ defineOptions({ name: 'ConditionConfig' }) @@ -80,8 +149,6 @@ defineOptions({ name: 'ConditionConfig' }) interface Props { modelValue: ConditionFormData triggerType: number - productId?: number - deviceId?: number } interface Emits { @@ -94,6 +161,9 @@ const emit = defineEmits() const condition = useVModel(props, 'modelValue', emit) +// 常量定义 +const ConditionTypeEnum = IotRuleSceneTriggerConditionTypeEnum + // 状态 const propertyType = ref('string') const propertyConfig = ref(null) @@ -131,10 +201,56 @@ const getOperatorText = (operator: string) => { // 事件处理 const updateConditionField = (field: keyof ConditionFormData, value: any) => { - condition.value[field] = value + ;(condition.value as any)[field] = value emit('update:modelValue', condition.value) } +const updateCondition = (newCondition: ConditionFormData) => { + condition.value = newCondition + emit('update:modelValue', condition.value) +} + +const handleConditionTypeChange = (type: number) => { + // 清理不相关的字段 + if (type === ConditionTypeEnum.DEVICE_STATUS) { + condition.value.identifier = undefined + condition.value.timeValue = undefined + condition.value.timeValue2 = undefined + } 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 + } + + // 重置操作符和参数 + condition.value.operator = '=' + condition.value.param = '' + + updateValidationResult() +} + +const handleValidate = (result: { valid: boolean; message: string }) => { + isValid.value = result.valid + validationMessage.value = result.message + emit('validate', result) +} + +const handleProductChange = (productId: number) => { + // 产品变化时清空设备和属性 + condition.value.deviceId = undefined + condition.value.identifier = '' + updateValidationResult() +} + +const handleDeviceChange = (deviceId: number) => { + // 设备变化时清空属性 + condition.value.identifier = '' + updateValidationResult() +} + const handlePropertyChange = (propertyInfo: { type: string; config: any }) => { propertyType.value = propertyInfo.type propertyConfig.value = propertyInfo.config diff --git a/src/views/iot/rule/scene/form/configs/ConditionGroupConfig.vue b/src/views/iot/rule/scene/form/configs/ConditionGroupConfig.vue index b76d10085..dff6fe598 100644 --- a/src/views/iot/rule/scene/form/configs/ConditionGroupConfig.vue +++ b/src/views/iot/rule/scene/form/configs/ConditionGroupConfig.vue @@ -128,6 +128,7 @@ interface Props { triggerType: number productId?: number deviceId?: number + maxConditions?: number } interface Emits { @@ -141,7 +142,7 @@ const emit = defineEmits() const group = useVModel(props, 'modelValue', emit) // 配置常量 -const maxConditions = 5 +const maxConditions = computed(() => props.maxConditions || 3) // 验证状态 const conditionValidations = ref<{ [key: number]: { valid: boolean; message: string } }>({}) @@ -172,12 +173,12 @@ const addCondition = () => { group.value.conditions = [] } - if (group.value.conditions.length >= maxConditions) { + if (group.value.conditions.length >= maxConditions.value) { return } const newCondition: ConditionFormData = { - type: props.triggerType, + type: 2, // 默认为设备属性条件 productId: props.productId || 0, deviceId: props.deviceId || 0, identifier: '', diff --git a/src/views/iot/rule/scene/form/configs/ConditionGroupContainerConfig.vue b/src/views/iot/rule/scene/form/configs/ConditionGroupContainerConfig.vue new file mode 100644 index 000000000..bf365ab17 --- /dev/null +++ b/src/views/iot/rule/scene/form/configs/ConditionGroupContainerConfig.vue @@ -0,0 +1,247 @@ + + + + + + + + + 组 + + 附加条件组 + + 与主条件为且关系 + + {{ modelValue.subGroups?.length || 0 }}个子条件组 + + + + + + 添加子条件组 + + + + 删除条件组 + + + + + + + + + + + 子条件组之间为"或"关系,满足任意一组即可触发 + + + + + + + + + + + + {{ subGroupIndex + 1 }} + + 子条件组 {{ subGroupIndex + 1 }} + + 组内条件为"且"关系 + + {{ subGroup.conditions?.length || 0 }}个条件 + + + + + 删除组 + + + + updateSubGroup(subGroupIndex, value)" + :trigger-type="triggerType" + :max-conditions="maxConditionsPerGroup" + @validate="(result) => handleSubGroupValidate(subGroupIndex, result)" + /> + + + + + + + + + + 或 + + + + + + + + + + + + + + + 暂无子条件组 + 点击上方"添加子条件组"按钮开始配置 + + + + + + + diff --git a/src/views/iot/rule/scene/form/configs/CurrentTimeConditionConfig.vue b/src/views/iot/rule/scene/form/configs/CurrentTimeConditionConfig.vue new file mode 100644 index 000000000..66006d098 --- /dev/null +++ b/src/views/iot/rule/scene/form/configs/CurrentTimeConditionConfig.vue @@ -0,0 +1,287 @@ + + + + + + 当前时间条件配置 + + + + + + + updateConditionField('operator', value)" + placeholder="请选择时间条件" + class="w-full" + > + + + + + {{ option.label }} + + {{ option.category }} + + + + + + + + + + updateConditionField('timeValue', value)" + placeholder="请选择时间" + format="HH:mm:ss" + value-format="HH:mm:ss" + class="w-full" + /> + updateConditionField('timeValue', value)" + type="datetime" + placeholder="请选择日期时间" + format="YYYY-MM-DD HH:mm:ss" + value-format="YYYY-MM-DD HH:mm:ss" + class="w-full" + /> + + 无需设置时间值 + + + + + + + + updateConditionField('timeValue2', value)" + placeholder="请选择结束时间" + format="HH:mm:ss" + value-format="HH:mm:ss" + class="w-full" + /> + updateConditionField('timeValue2', value)" + type="datetime" + placeholder="请选择结束日期时间" + format="YYYY-MM-DD HH:mm:ss" + value-format="YYYY-MM-DD HH:mm:ss" + class="w-full" + /> + + + + + + + + + 条件预览 + + + {{ conditionPreview }} + + + + + + + + + + + diff --git a/src/views/iot/rule/scene/form/configs/DeviceStatusConditionConfig.vue b/src/views/iot/rule/scene/form/configs/DeviceStatusConditionConfig.vue new file mode 100644 index 000000000..f198ed9e5 --- /dev/null +++ b/src/views/iot/rule/scene/form/configs/DeviceStatusConditionConfig.vue @@ -0,0 +1,258 @@ + + + + + + 设备状态条件配置 + + + + + + + updateConditionField('productId', value)" + @change="handleProductChange" + /> + + + + + updateConditionField('deviceId', value)" + :product-id="condition.productId" + @change="handleDeviceChange" + /> + + + + + + + + + + updateConditionField('param', value)" + placeholder="请选择设备状态" + class="w-full" + > + + + + {{ option.label }} + {{ option.description }} + + + + + + + + + + updateConditionField('operator', value)" + placeholder="请选择操作符" + class="w-full" + > + + + {{ option.label }} + {{ + option.description + }} + + + + + + + + + + + + 条件预览 + + + {{ conditionPreview }} + + + + + + + + + + + diff --git a/src/views/iot/rule/scene/form/configs/DeviceTriggerConfig.vue b/src/views/iot/rule/scene/form/configs/DeviceTriggerConfig.vue index 9d26044e3..8457be290 100644 --- a/src/views/iot/rule/scene/form/configs/DeviceTriggerConfig.vue +++ b/src/views/iot/rule/scene/form/configs/DeviceTriggerConfig.vue @@ -8,118 +8,56 @@ @change="handleDeviceChange" /> - - - - - 触发条件 - - {{ trigger.conditionGroups?.length || 0 }}个条件组 - - - - - - - - - 添加条件组 - - - - - + + - - - - - 条件组之间为"或"关系,满足任意一组即可触发 - - - - - - - - - - - - {{ groupIndex + 1 }} - - 条件组 - - 组内条件为"且"关系 - - - - 删除组 - - - - updateConditionGroup(groupIndex, value)" - :trigger-type="trigger.type" - :product-id="trigger.productId" - :device-id="trigger.deviceId" - @validate="(result) => handleGroupValidate(groupIndex, result)" - /> - - - - - - - - - - 或 - - - - - - - + + 主条件配置 + 必须满足 + + + + + + + + + 附加条件组 + 与主条件为且关系 + + {{ trigger.conditionGroup?.subGroups?.length || 0 }}个子条件组 + + + + + 添加条件组 + + + + + + @@ -140,10 +78,10 @@ diff --git a/src/views/iot/rule/scene/form/configs/SubConditionGroupConfig.vue b/src/views/iot/rule/scene/form/configs/SubConditionGroupConfig.vue new file mode 100644 index 000000000..ff7bac4d3 --- /dev/null +++ b/src/views/iot/rule/scene/form/configs/SubConditionGroupConfig.vue @@ -0,0 +1,220 @@ + + + + + + + + + 暂无条件 + 点击下方按钮添加第一个条件 + + + + 添加条件 + + + + + + + + + + + + + {{ conditionIndex + 1 }} + + 条件 {{ conditionIndex + 1 }} + + + + + + + + updateCondition(conditionIndex, value)" + :trigger-type="triggerType" + @validate="(result) => handleConditionValidate(conditionIndex, result)" + /> + + + + + + + + + + + 且 + + + + + + + + + + + + 继续添加条件 + + + 最多可添加 {{ maxConditions }} 个条件 + + + + + + + diff --git a/src/views/iot/rule/scene/form/sections/TriggerSection.vue b/src/views/iot/rule/scene/form/sections/TriggerSection.vue index abf9f75f6..2cfed1b71 100644 --- a/src/views/iot/rule/scene/form/sections/TriggerSection.vue +++ b/src/views/iot/rule/scene/form/sections/TriggerSection.vue @@ -1,92 +1,46 @@ - + - - - - 触发器配置 - {{ triggers.length }}个触发器 - - - - - 添加触发器 - - + + + 触发器配置 + 场景触发器 - - - - - + + + + updateTriggerType(value)" + @change="onTriggerTypeChange" + placeholder="请选择触发事件类型" + class="w-full" + > + + + - - - - - - - 触发器 {{ index + 1 }} - - {{ getTriggerTypeName(trigger.type) }} - - - - - - 删除 - - - + + - - - - updateTriggerType(index, value)" - @change="onTriggerTypeChange(trigger, $event)" - placeholder="请选择触发类型" - class="w-full" - > - - - - - - updateTrigger(index, value)" - /> - - - updateTriggerCronExpression(index, value)" - /> - - - + + @@ -104,37 +58,17 @@ import { defineOptions({ name: 'TriggerSection' }) interface Props { - triggers: TriggerFormData[] + trigger: TriggerFormData } interface Emits { - (e: 'update:triggers', value: TriggerFormData[]): void + (e: 'update:trigger', value: TriggerFormData): void } const props = defineProps() const emit = defineEmits() -const triggers = useVModel(props, 'triggers', emit) - -/** - * 创建默认的触发器数据 - */ -const createDefaultTriggerData = (): TriggerFormData => { - return { - type: TriggerTypeEnum.DEVICE_PROPERTY_POST, // 默认为设备属性上报 - productId: undefined, - deviceId: undefined, - identifier: undefined, - operator: undefined, - value: undefined, - cronExpression: undefined, - conditionGroups: [] - } -} - - - - +const trigger = useVModel(props, 'trigger', emit) // 触发器类型选项 const triggerTypeOptions = [ @@ -160,23 +94,6 @@ const triggerTypeOptions = [ } ] -// 触发器类型映射 -const triggerTypeNames = { - [TriggerTypeEnum.DEVICE_STATE_UPDATE]: '设备状态变更', - [TriggerTypeEnum.DEVICE_PROPERTY_POST]: '属性上报', - [TriggerTypeEnum.DEVICE_EVENT_POST]: '事件上报', - [TriggerTypeEnum.DEVICE_SERVICE_INVOKE]: '服务调用', - [TriggerTypeEnum.TIMER]: '定时触发' -} - -const triggerTypeTags = { - [TriggerTypeEnum.DEVICE_STATE_UPDATE]: 'warning', - [TriggerTypeEnum.DEVICE_PROPERTY_POST]: 'primary', - [TriggerTypeEnum.DEVICE_EVENT_POST]: 'success', - [TriggerTypeEnum.DEVICE_SERVICE_INVOKE]: 'info', - [TriggerTypeEnum.TIMER]: 'danger' -} - // 工具函数 const isDeviceTrigger = (type: number) => { const deviceTriggerTypes = [ @@ -188,58 +105,47 @@ const isDeviceTrigger = (type: number) => { return deviceTriggerTypes.includes(type) } -const getTriggerTypeName = (type: number) => { - return triggerTypeNames[type] || '未知类型' -} - -const getTriggerTypeTag = (type: number) => { - return triggerTypeTags[type] || 'info' -} - // 事件处理 -const addTrigger = () => { - const newTrigger = createDefaultTriggerData() - triggers.value.push(newTrigger) +const updateTriggerType = (type: number) => { + trigger.value.type = type + onTriggerTypeChange(type) } -const removeTrigger = (index: number) => { - triggers.value.splice(index, 1) +const updateTrigger = (newTrigger: TriggerFormData) => { + trigger.value = newTrigger } -const updateTriggerType = (index: number, type: number) => { - triggers.value[index].type = type - onTriggerTypeChange(triggers.value[index], type) +const updateTriggerCronExpression = (cronExpression?: string) => { + trigger.value.cronExpression = cronExpression } -const updateTrigger = (index: number, trigger: TriggerFormData) => { - triggers.value[index] = trigger -} - -const updateTriggerCronExpression = (index: number, cronExpression?: string) => { - triggers.value[index].cronExpression = cronExpression -} - -const onTriggerTypeChange = (trigger: TriggerFormData, type: number) => { +const onTriggerTypeChange = (type: number) => { // 清理不相关的配置 if (type === TriggerTypeEnum.TIMER) { - trigger.productId = undefined - trigger.deviceId = undefined - trigger.identifier = undefined - trigger.operator = undefined - trigger.value = undefined - trigger.conditionGroups = undefined - if (!trigger.cronExpression) { - trigger.cronExpression = '0 0 12 * * ?' + trigger.value.productId = undefined + trigger.value.deviceId = undefined + trigger.value.identifier = undefined + trigger.value.operator = undefined + trigger.value.value = undefined + trigger.value.mainCondition = undefined + trigger.value.conditionGroup = undefined + if (!trigger.value.cronExpression) { + trigger.value.cronExpression = '0 0 12 * * ?' } } else { - trigger.cronExpression = undefined + trigger.value.cronExpression = undefined if (type === TriggerTypeEnum.DEVICE_STATE_UPDATE) { - trigger.conditionGroups = undefined - } else if (!trigger.conditionGroups) { - trigger.conditionGroups = [] + trigger.value.mainCondition = undefined + trigger.value.conditionGroup = undefined + } else { + // 设备属性、事件、服务触发需要条件配置 + if (!trigger.value.mainCondition) { + trigger.value.mainCondition = undefined // 等待用户配置 + } + if (!trigger.value.conditionGroup) { + trigger.value.conditionGroup = undefined // 可选的条件组 + } } } } - - diff --git a/src/views/iot/rule/scene/form/selectors/ConditionTypeSelector.vue b/src/views/iot/rule/scene/form/selectors/ConditionTypeSelector.vue new file mode 100644 index 000000000..c955ceffa --- /dev/null +++ b/src/views/iot/rule/scene/form/selectors/ConditionTypeSelector.vue @@ -0,0 +1,80 @@ + + + + + + + + {{ option.label }} + + {{ option.category }} + + + + + + diff --git a/src/views/iot/rule/scene/form/selectors/DeviceSelector.vue b/src/views/iot/rule/scene/form/selectors/DeviceSelector.vue new file mode 100644 index 000000000..9c327cd63 --- /dev/null +++ b/src/views/iot/rule/scene/form/selectors/DeviceSelector.vue @@ -0,0 +1,127 @@ + + + + + + + {{ + device.deviceName + }} + {{ device.deviceKey }} + + + + {{ getStatusText(device.status) }} + + + {{ device.activeTime ? '已激活' : '未激活' }} + + + + + + + + diff --git a/src/views/iot/rule/scene/form/selectors/ProductSelector.vue b/src/views/iot/rule/scene/form/selectors/ProductSelector.vue new file mode 100644 index 000000000..70d95964c --- /dev/null +++ b/src/views/iot/rule/scene/form/selectors/ProductSelector.vue @@ -0,0 +1,81 @@ + + + + + + + {{ + product.name + }} + {{ + product.productKey + }} + + + {{ product.status === 0 ? '正常' : '禁用' }} + + + + + + + diff --git a/src/views/iot/rule/scene/form/selectors/types.ts b/src/views/iot/rule/scene/form/selectors/types.ts index 4446d4a63..df666aea1 100644 --- a/src/views/iot/rule/scene/form/selectors/types.ts +++ b/src/views/iot/rule/scene/form/selectors/types.ts @@ -130,41 +130,3 @@ export interface PropertySelectorItem { event?: ThingModelEvent service?: ThingModelService } - -/** 数据类型枚举 */ -export enum DataTypeEnum { - INT = 'int', - FLOAT = 'float', - DOUBLE = 'double', - ENUM = 'enum', - BOOL = 'bool', - TEXT = 'text', - DATE = 'date', - STRUCT = 'struct', - ARRAY = 'array' -} - -/** 访问模式枚举 */ -export enum AccessModeEnum { - READ = 'r', - READ_write = 'rw' -} - -/** 事件类型枚举 */ -export enum EventTypeEnum { - INFO = 'info', - ALERT = 'alert', - ERROR = 'error' -} - -/** 调用类型枚举 */ -export enum CallTypeEnum { - ASYNC = 'async', - SYNC = 'sync' -} - -/** 参数方向枚举 */ -export enum ParamDirectionEnum { - INPUT = 'input', - OUTPUT = 'output' -}
{{ conditionPreview }}
暂无子条件组
点击上方"添加子条件组"按钮开始配置
暂无条件
点击下方按钮添加第一个条件