Commit 1ad4e08cb83ce4b1d1fdeb53df07715de44bd9a3
1 parent
a17d4bb2
reactor:【IoT 物联网】增加 IotRuleScene2DO 新的定义,对标阿里云 IoT 的「事件响应」
Showing
12 changed files
with
399 additions
and
45 deletions
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceMessageTypeEnum.java
| @@ -9,6 +9,7 @@ import java.util.Arrays; | @@ -9,6 +9,7 @@ import java.util.Arrays; | ||
| 9 | /** | 9 | /** |
| 10 | * IoT 设备消息类型枚举 | 10 | * IoT 设备消息类型枚举 |
| 11 | */ | 11 | */ |
| 12 | +@Deprecated | ||
| 12 | @Getter | 13 | @Getter |
| 13 | @RequiredArgsConstructor | 14 | @RequiredArgsConstructor |
| 14 | public enum IotDeviceMessageTypeEnum implements ArrayValuable<String> { | 15 | public enum IotDeviceMessageTypeEnum implements ArrayValuable<String> { |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/rule/IotRuleSceneActionTypeEnum.java
| @@ -15,8 +15,33 @@ import java.util.Arrays; | @@ -15,8 +15,33 @@ import java.util.Arrays; | ||
| 15 | @Getter | 15 | @Getter |
| 16 | public enum IotRuleSceneActionTypeEnum implements ArrayValuable<Integer> { | 16 | public enum IotRuleSceneActionTypeEnum implements ArrayValuable<Integer> { |
| 17 | 17 | ||
| 18 | - DEVICE_CONTROL(1), // 设备执行 | 18 | + // TODO @芋艿:后续“对应”部分,要 @下,等包结构梳理完; |
| 19 | + /** | ||
| 20 | + * 设备属性设置 | ||
| 21 | + * | ||
| 22 | + * 对应 IotDeviceMessageMethodEnum.DEVICE_PROPERTY_SET | ||
| 23 | + */ | ||
| 24 | + DEVICE_PROPERTY_SET(1), | ||
| 25 | + /** | ||
| 26 | + * 设备服务调用 | ||
| 27 | + * | ||
| 28 | + * 对应 IotDeviceMessageMethodEnum.DEVICE_SERVICE_INVOKE | ||
| 29 | + */ | ||
| 30 | + DEVICE_SERVICE_INVOKE(2), | ||
| 31 | + | ||
| 32 | + /** | ||
| 33 | + * 告警触发 | ||
| 34 | + */ | ||
| 35 | + ALERT_TRIGGER(100), | ||
| 36 | + /** | ||
| 37 | + * 告警恢复 | ||
| 38 | + */ | ||
| 39 | + ALERT_RECOVER(101), | ||
| 40 | + | ||
| 41 | + @Deprecated | ||
| 19 | ALERT(2), // 告警执行 | 42 | ALERT(2), // 告警执行 |
| 43 | + | ||
| 44 | + @Deprecated | ||
| 20 | DATA_BRIDGE(3); // 桥接执行 | 45 | DATA_BRIDGE(3); // 桥接执行 |
| 21 | 46 | ||
| 22 | private final Integer type; | 47 | private final Integer type; |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/rule/IotRuleSceneTriggerConditionParameterOperatorEnum.java renamed to yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/rule/IotRuleSceneConditionOperatorEnum.java
| @@ -8,13 +8,13 @@ import lombok.RequiredArgsConstructor; | @@ -8,13 +8,13 @@ import lombok.RequiredArgsConstructor; | ||
| 8 | import java.util.Arrays; | 8 | import java.util.Arrays; |
| 9 | 9 | ||
| 10 | /** | 10 | /** |
| 11 | - * IoT 场景触发条件参数的操作符枚举 | 11 | + * IoT 场景触发条件的操作符枚举 |
| 12 | * | 12 | * |
| 13 | * @author 芋道源码 | 13 | * @author 芋道源码 |
| 14 | */ | 14 | */ |
| 15 | @RequiredArgsConstructor | 15 | @RequiredArgsConstructor |
| 16 | @Getter | 16 | @Getter |
| 17 | -public enum IotRuleSceneTriggerConditionParameterOperatorEnum implements ArrayValuable<String> { | 17 | +public enum IotRuleSceneConditionOperatorEnum implements ArrayValuable<String> { |
| 18 | 18 | ||
| 19 | EQUALS("=", "#source == #value"), | 19 | EQUALS("=", "#source == #value"), |
| 20 | NOT_EQUALS("!=", "!(#source == #value)"), | 20 | NOT_EQUALS("!=", "!(#source == #value)"), |
| @@ -32,12 +32,28 @@ public enum IotRuleSceneTriggerConditionParameterOperatorEnum implements ArrayVa | @@ -32,12 +32,28 @@ public enum IotRuleSceneTriggerConditionParameterOperatorEnum implements ArrayVa | ||
| 32 | NOT_BETWEEN("not between", "(#source < #values.get(0)) || (#source > #values.get(1))"), | 32 | NOT_BETWEEN("not between", "(#source < #values.get(0)) || (#source > #values.get(1))"), |
| 33 | 33 | ||
| 34 | LIKE("like", "#source.contains(#value)"), // 字符串匹配 | 34 | LIKE("like", "#source.contains(#value)"), // 字符串匹配 |
| 35 | - NOT_NULL("not null", "#source != null && #source.length() > 0"); // 非空 | 35 | + NOT_NULL("not null", "#source != null && #source.length() > 0"), // 非空 |
| 36 | + | ||
| 37 | + // ========== 特殊:不放在字典里 ========== | ||
| 38 | + | ||
| 39 | + // TODO @puhui999:@芋艿:需要测试下 | ||
| 40 | + DATE_TIME_GREATER_THAN("date_time_>", "#source > #value"), // 在时间之后:时间戳 | ||
| 41 | + DATE_TIME_LESS_THAN("date_time_<", "#source < #value"), // 在时间之前:时间戳 | ||
| 42 | + DATE_TIME_BETWEEN("date_time_between", // 在时间之间:时间戳 | ||
| 43 | + "(#source >= #values.get(0)) && (#source <= #values.get(1))"), | ||
| 44 | + | ||
| 45 | + // TODO @puhui999:@芋艿:需要测试下 | ||
| 46 | + TIME_GREATER_THAN("time_>", "#source.isAfter(#value)"), // 在当日时间之后:HH:mm:ss | ||
| 47 | + TIME_LESS_THAN("time_<", "#source.isBefore(#value)"), // 在当日时间之前:HH:mm:ss | ||
| 48 | + TIME_BETWEEN("time_between", // 在当日时间之间:HH:mm:ss | ||
| 49 | + "(#source >= #values.get(0)) && (#source <= #values.get(1))"), | ||
| 50 | + | ||
| 51 | + ; | ||
| 36 | 52 | ||
| 37 | private final String operator; | 53 | private final String operator; |
| 38 | private final String springExpression; | 54 | private final String springExpression; |
| 39 | 55 | ||
| 40 | - public static final String[] ARRAYS = Arrays.stream(values()).map(IotRuleSceneTriggerConditionParameterOperatorEnum::getOperator).toArray(String[]::new); | 56 | + public static final String[] ARRAYS = Arrays.stream(values()).map(IotRuleSceneConditionOperatorEnum::getOperator).toArray(String[]::new); |
| 41 | 57 | ||
| 42 | /** | 58 | /** |
| 43 | * Spring 表达式 - 原始值 | 59 | * Spring 表达式 - 原始值 |
| @@ -52,7 +68,7 @@ public enum IotRuleSceneTriggerConditionParameterOperatorEnum implements ArrayVa | @@ -52,7 +68,7 @@ public enum IotRuleSceneTriggerConditionParameterOperatorEnum implements ArrayVa | ||
| 52 | */ | 68 | */ |
| 53 | public static final String SPRING_EXPRESSION_VALUE_LIST = "values"; | 69 | public static final String SPRING_EXPRESSION_VALUE_LIST = "values"; |
| 54 | 70 | ||
| 55 | - public static IotRuleSceneTriggerConditionParameterOperatorEnum operatorOf(String operator) { | 71 | + public static IotRuleSceneConditionOperatorEnum operatorOf(String operator) { |
| 56 | return ArrayUtil.firstMatch(item -> item.getOperator().equals(operator), values()); | 72 | return ArrayUtil.firstMatch(item -> item.getOperator().equals(operator), values()); |
| 57 | } | 73 | } |
| 58 | 74 |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/rule/IotRuleSceneConditionTypeEnum.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.enums.rule; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.core.ArrayValuable; | ||
| 4 | +import lombok.Getter; | ||
| 5 | +import lombok.RequiredArgsConstructor; | ||
| 6 | + | ||
| 7 | +import java.util.Arrays; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * IoT 条件类型枚举 | ||
| 11 | + * | ||
| 12 | + * @author 芋道源码 | ||
| 13 | + */ | ||
| 14 | +@RequiredArgsConstructor | ||
| 15 | +@Getter | ||
| 16 | +public enum IotRuleSceneConditionTypeEnum implements ArrayValuable<Integer> { | ||
| 17 | + | ||
| 18 | + DEVICE_STATE(1, "设备状态"), | ||
| 19 | + DEVICE_PROPERTY(2, "设备属性"), | ||
| 20 | + | ||
| 21 | + CURRENT_TIME(100, "当前时间"), | ||
| 22 | + | ||
| 23 | + ; | ||
| 24 | + | ||
| 25 | + private final Integer type; | ||
| 26 | + private final String name; | ||
| 27 | + | ||
| 28 | + public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotRuleSceneConditionTypeEnum::getType).toArray(Integer[]::new); | ||
| 29 | + | ||
| 30 | + @Override | ||
| 31 | + public Integer[] array() { | ||
| 32 | + return ARRAYS; | ||
| 33 | + } | ||
| 34 | + | ||
| 35 | +} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/rule/IotRuleSceneTriggerTypeEnum.java
| @@ -9,14 +9,47 @@ import java.util.Arrays; | @@ -9,14 +9,47 @@ import java.util.Arrays; | ||
| 9 | /** | 9 | /** |
| 10 | * IoT 场景流转的触发类型枚举 | 10 | * IoT 场景流转的触发类型枚举 |
| 11 | * | 11 | * |
| 12 | + * 为什么不直接使用 IotDeviceMessageMethodEnum 呢? | ||
| 13 | + * 原因是,物模型属性上报,存在批量上报的情况,不只对应一个 method!!! | ||
| 14 | + * | ||
| 12 | * @author 芋道源码 | 15 | * @author 芋道源码 |
| 13 | */ | 16 | */ |
| 14 | @RequiredArgsConstructor | 17 | @RequiredArgsConstructor |
| 15 | @Getter | 18 | @Getter |
| 16 | public enum IotRuleSceneTriggerTypeEnum implements ArrayValuable<Integer> { | 19 | public enum IotRuleSceneTriggerTypeEnum implements ArrayValuable<Integer> { |
| 17 | 20 | ||
| 18 | - DEVICE(1), // 设备触发 | ||
| 19 | - TIMER(2); // 定时触发 | 21 | + @Deprecated |
| 22 | + DEVICE(1), // 设备触发 // TODO @puhui999:@芋艿:这个可以作废 | ||
| 23 | + | ||
| 24 | + // TODO @芋艿:后续“对应”部分,要 @下,等包结构梳理完; | ||
| 25 | + /** | ||
| 26 | + * 设备上下线变更 | ||
| 27 | + * | ||
| 28 | + * 对应 IotDeviceMessageMethodEnum.STATE_UPDATE | ||
| 29 | + */ | ||
| 30 | + DEVICE_STATE_UPDATE(1), | ||
| 31 | + /** | ||
| 32 | + * 物模型属性上报 | ||
| 33 | + * | ||
| 34 | + * 对应 IotDeviceMessageMethodEnum.DEVICE_PROPERTY_POST | ||
| 35 | + */ | ||
| 36 | + DEVICE_PROPERTY_POST(2), | ||
| 37 | + /** | ||
| 38 | + * 设备事件上报 | ||
| 39 | + * | ||
| 40 | + * 对应 IotDeviceMessageMethodEnum.DEVICE_EVENT_POST | ||
| 41 | + */ | ||
| 42 | + DEVICE_EVENT_POST(3), | ||
| 43 | + /** | ||
| 44 | + * 设备服务调用 | ||
| 45 | + * | ||
| 46 | + * 对应 IotDeviceMessageMethodEnum.DEVICE_SERVICE_INVOKE | ||
| 47 | + */ | ||
| 48 | + DEVICE_SERVICE_INVOKE(4), | ||
| 49 | + | ||
| 50 | + TIMER(100) // 定时触发 | ||
| 51 | + | ||
| 52 | + ; | ||
| 20 | 53 | ||
| 21 | private final Integer type; | 54 | private final Integer type; |
| 22 | 55 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotAlertConfig.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotAlertConfigDO.java
| @@ -23,7 +23,7 @@ import java.util.List; | @@ -23,7 +23,7 @@ import java.util.List; | ||
| 23 | @Builder | 23 | @Builder |
| 24 | @NoArgsConstructor | 24 | @NoArgsConstructor |
| 25 | @AllArgsConstructor | 25 | @AllArgsConstructor |
| 26 | -public class IotAlertConfig extends BaseDO { | 26 | +public class IotAlertConfigDO extends BaseDO { |
| 27 | 27 | ||
| 28 | /** | 28 | /** |
| 29 | * 配置编号 | 29 | * 配置编号 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotAlertRecordDO.java
| @@ -34,13 +34,13 @@ public class IotAlertRecordDO extends BaseDO { | @@ -34,13 +34,13 @@ public class IotAlertRecordDO extends BaseDO { | ||
| 34 | /** | 34 | /** |
| 35 | * 告警名称 | 35 | * 告警名称 |
| 36 | * | 36 | * |
| 37 | - * 冗余 {@link IotAlertConfig#getName()} | 37 | + * 冗余 {@link IotAlertConfigDO#getName()} |
| 38 | */ | 38 | */ |
| 39 | private Long configId; | 39 | private Long configId; |
| 40 | /** | 40 | /** |
| 41 | * 告警名称 | 41 | * 告警名称 |
| 42 | * | 42 | * |
| 43 | - * 冗余 {@link IotAlertConfig#getName()} | 43 | + * 冗余 {@link IotAlertConfigDO#getName()} |
| 44 | */ | 44 | */ |
| 45 | private String name; | 45 | private String name; |
| 46 | 46 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotRuleScene2DO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.dal.dataobject.rule; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; | ||
| 4 | +import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage; | ||
| 5 | +import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; | ||
| 6 | +import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; | ||
| 7 | +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO; | ||
| 8 | +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum; | ||
| 9 | +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneConditionOperatorEnum; | ||
| 10 | +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneConditionTypeEnum; | ||
| 11 | +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum; | ||
| 12 | +import com.baomidou.mybatisplus.annotation.KeySequence; | ||
| 13 | +import com.baomidou.mybatisplus.annotation.TableField; | ||
| 14 | +import com.baomidou.mybatisplus.annotation.TableId; | ||
| 15 | +import com.baomidou.mybatisplus.annotation.TableName; | ||
| 16 | +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | ||
| 17 | +import lombok.AllArgsConstructor; | ||
| 18 | +import lombok.Builder; | ||
| 19 | +import lombok.Data; | ||
| 20 | +import lombok.NoArgsConstructor; | ||
| 21 | + | ||
| 22 | +import java.util.List; | ||
| 23 | + | ||
| 24 | +// TODO @puhui999:还是在 IotRuleSceneDO 里搞,这里主要可以看到变化字段哈。 | ||
| 25 | +/** | ||
| 26 | + * IoT 场景联动 DO | ||
| 27 | + * | ||
| 28 | + * @author 芋道源码 | ||
| 29 | + */ | ||
| 30 | +@TableName(value = "iot_rule_scene2", autoResultMap = true) | ||
| 31 | +@KeySequence("iot_rule_scene_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | ||
| 32 | +@Data | ||
| 33 | +@Builder | ||
| 34 | +@NoArgsConstructor | ||
| 35 | +@AllArgsConstructor | ||
| 36 | +public class IotRuleScene2DO extends TenantBaseDO { | ||
| 37 | + | ||
| 38 | + /** | ||
| 39 | + * 设备编号 - 全部设备 | ||
| 40 | + */ | ||
| 41 | + public static final Long DEVICE_ID_ALL = 0L; | ||
| 42 | + | ||
| 43 | + /** | ||
| 44 | + * 场景编号 | ||
| 45 | + */ | ||
| 46 | + @TableId | ||
| 47 | + private Long id; | ||
| 48 | + /** | ||
| 49 | + * 场景名称 | ||
| 50 | + */ | ||
| 51 | + private String name; | ||
| 52 | + /** | ||
| 53 | + * 场景描述 | ||
| 54 | + */ | ||
| 55 | + private String description; | ||
| 56 | + /** | ||
| 57 | + * 场景状态 | ||
| 58 | + * | ||
| 59 | + * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} | ||
| 60 | + */ | ||
| 61 | + private Integer status; | ||
| 62 | + | ||
| 63 | + /** | ||
| 64 | + * 场景定义配置 | ||
| 65 | + */ | ||
| 66 | + @TableField(typeHandler = JacksonTypeHandler.class) | ||
| 67 | + private List<Trigger> triggers; | ||
| 68 | + | ||
| 69 | + /** | ||
| 70 | + * 场景动作配置 | ||
| 71 | + */ | ||
| 72 | + @TableField(typeHandler = JacksonTypeHandler.class) | ||
| 73 | + private List<Action> actions; | ||
| 74 | + | ||
| 75 | + /** | ||
| 76 | + * 场景定义配置 | ||
| 77 | + */ | ||
| 78 | + @Data | ||
| 79 | + public static class Trigger { | ||
| 80 | + | ||
| 81 | + // ========== 事件部分 ========== | ||
| 82 | + | ||
| 83 | + /** | ||
| 84 | + * 场景事件类型 | ||
| 85 | + * | ||
| 86 | + * 枚举 {@link IotRuleSceneTriggerTypeEnum} | ||
| 87 | + * 1. {@link IotRuleSceneTriggerTypeEnum#DEVICE_STATE_UPDATE} 时,operator 非空,并且 value 为在线状态 | ||
| 88 | + * 2. {@link IotRuleSceneTriggerTypeEnum#DEVICE_PROPERTY_POST} | ||
| 89 | + * {@link IotRuleSceneTriggerTypeEnum#DEVICE_EVENT_POST} 时,identifier、operator 非空,并且 value 为属性值 | ||
| 90 | + * 3. {@link IotRuleSceneTriggerTypeEnum#DEVICE_EVENT_POST} | ||
| 91 | + * {@link IotRuleSceneTriggerTypeEnum#DEVICE_SERVICE_INVOKE} 时,identifier 非空,但是 operator、value 为空 | ||
| 92 | + * 4. {@link IotRuleSceneTriggerTypeEnum#TIMER} 时,conditions 非空,并且设备无关(无需 productId、deviceId 字段) | ||
| 93 | + */ | ||
| 94 | + private Integer type; | ||
| 95 | + | ||
| 96 | + /** | ||
| 97 | + * 产品编号 | ||
| 98 | + * | ||
| 99 | + * 关联 {@link IotProductDO#getId()} | ||
| 100 | + */ | ||
| 101 | + private Long productId; | ||
| 102 | + /** | ||
| 103 | + * 设备编号 | ||
| 104 | + * | ||
| 105 | + * 关联 {@link IotDeviceDO#getId()} | ||
| 106 | + * 特殊:如果为 0,则是全部 | ||
| 107 | + */ | ||
| 108 | + private Long deviceId; | ||
| 109 | + /** | ||
| 110 | + * 物模型标识符 | ||
| 111 | + * | ||
| 112 | + * 对应:{@link IotThingModelDO#getIdentifier()} | ||
| 113 | + */ | ||
| 114 | + private String identifier; | ||
| 115 | + /** | ||
| 116 | + * 操作符 | ||
| 117 | + * | ||
| 118 | + * 枚举 {@link IotRuleSceneConditionOperatorEnum} | ||
| 119 | + */ | ||
| 120 | + private String operator; | ||
| 121 | + /** | ||
| 122 | + * 参数(属性值、在线状态) | ||
| 123 | + * | ||
| 124 | + * 如果有多个值,则使用 "," 分隔,类似 "1,2,3"。 | ||
| 125 | + * 例如说,{@link IotRuleSceneConditionOperatorEnum#IN}、{@link IotRuleSceneConditionOperatorEnum#BETWEEN} | ||
| 126 | + */ | ||
| 127 | + private String value; | ||
| 128 | + | ||
| 129 | + /** | ||
| 130 | + * CRON 表达式 | ||
| 131 | + */ | ||
| 132 | + private String cronExpression; | ||
| 133 | + | ||
| 134 | + // ========== 条件部分 ========== | ||
| 135 | + | ||
| 136 | + /** | ||
| 137 | + * 触发条件分组(状态条件分组)的数组 | ||
| 138 | + * | ||
| 139 | + * 第一层 List:分组与分组之间,是“或”的关系 | ||
| 140 | + * 第二层 List:条件与条件之间,是“且”的关系 | ||
| 141 | + */ | ||
| 142 | + private List<List<TriggerCondition>> conditionGroups; | ||
| 143 | + | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + /** | ||
| 147 | + * 触发条件(状态条件) | ||
| 148 | + */ | ||
| 149 | + @Data | ||
| 150 | + public static class TriggerCondition { | ||
| 151 | + | ||
| 152 | + /** | ||
| 153 | + * 触发条件类型 | ||
| 154 | + * | ||
| 155 | + * 枚举 {@link IotRuleSceneConditionTypeEnum} | ||
| 156 | + * 1. {@link IotRuleSceneConditionTypeEnum#DEVICE_STATE} 时,operator 非空,并且 value 为在线状态 | ||
| 157 | + * 2. {@link IotRuleSceneConditionTypeEnum#DEVICE_PROPERTY} 时,identifier、operator 非空,并且 value 为属性值 | ||
| 158 | + * 3. {@link IotRuleSceneConditionTypeEnum#CURRENT_TIME} 时,operator 非空(使用 DATE_TIME_ 和 TIME_ 部分),并且 value 非空 | ||
| 159 | + */ | ||
| 160 | + private Integer type; | ||
| 161 | + | ||
| 162 | + /** | ||
| 163 | + * 产品编号 | ||
| 164 | + * | ||
| 165 | + * 关联 {@link IotProductDO#getId()} | ||
| 166 | + */ | ||
| 167 | + private Long productId; | ||
| 168 | + /** | ||
| 169 | + * 设备编号 | ||
| 170 | + * | ||
| 171 | + * 关联 {@link IotDeviceDO#getId()} | ||
| 172 | + */ | ||
| 173 | + private Long deviceId; | ||
| 174 | + /** | ||
| 175 | + * 标识符(属性) | ||
| 176 | + * | ||
| 177 | + * 关联 {@link IotThingModelDO#getIdentifier()} | ||
| 178 | + */ | ||
| 179 | + private String identifier; | ||
| 180 | + /** | ||
| 181 | + * 操作符 | ||
| 182 | + * | ||
| 183 | + * 枚举 {@link IotRuleSceneConditionOperatorEnum} | ||
| 184 | + */ | ||
| 185 | + private String operator; | ||
| 186 | + /** | ||
| 187 | + * 参数 | ||
| 188 | + * | ||
| 189 | + * 如果有多个值,则使用 "," 分隔,类似 "1,2,3"。 | ||
| 190 | + * 例如说,{@link IotRuleSceneConditionOperatorEnum#IN}、{@link IotRuleSceneConditionOperatorEnum#BETWEEN} | ||
| 191 | + */ | ||
| 192 | + private String param; | ||
| 193 | + | ||
| 194 | + } | ||
| 195 | + | ||
| 196 | + /** | ||
| 197 | + * 场景动作配置 | ||
| 198 | + */ | ||
| 199 | + @Data | ||
| 200 | + public static class Action { | ||
| 201 | + | ||
| 202 | + /** | ||
| 203 | + * 执行类型 | ||
| 204 | + * | ||
| 205 | + * 枚举 {@link IotRuleSceneActionTypeEnum} | ||
| 206 | + * 1. {@link IotRuleSceneActionTypeEnum#DEVICE_PROPERTY_SET} 时,params 非空 | ||
| 207 | + * {@link IotRuleSceneActionTypeEnum#DEVICE_SERVICE_INVOKE} 时,params 非空 | ||
| 208 | + * 2. {@link IotRuleSceneActionTypeEnum#ALERT_TRIGGER} 时,alertConfigId 为空,因为是 {@link IotAlertConfigDO} 里面关联它 | ||
| 209 | + * 3. {@link IotRuleSceneActionTypeEnum#ALERT_RECOVER} 时,alertConfigId 非空 | ||
| 210 | + */ | ||
| 211 | + private Integer type; | ||
| 212 | + | ||
| 213 | + /** | ||
| 214 | + * 产品编号 | ||
| 215 | + * | ||
| 216 | + * 关联 {@link IotProductDO#getId()} | ||
| 217 | + */ | ||
| 218 | + private Long productId; | ||
| 219 | + /** | ||
| 220 | + * 设备编号 | ||
| 221 | + * | ||
| 222 | + * 关联 {@link IotDeviceDO#getId()} | ||
| 223 | + */ | ||
| 224 | + private Long deviceId; | ||
| 225 | + /** | ||
| 226 | + * 请求参数 | ||
| 227 | + * | ||
| 228 | + * 一般来说,对应 {@link IotDeviceMessage#getParams()} 请求参数 | ||
| 229 | + */ | ||
| 230 | + private Object params; | ||
| 231 | + | ||
| 232 | + /** | ||
| 233 | + * 告警配置编号 | ||
| 234 | + * | ||
| 235 | + * 关联 {@link IotAlertConfigDO#getId()} | ||
| 236 | + */ | ||
| 237 | + private Long alertConfigId; | ||
| 238 | + | ||
| 239 | + } | ||
| 240 | + | ||
| 241 | +} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotRuleSceneDO.java
| @@ -7,7 +7,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO; | @@ -7,7 +7,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO; | ||
| 7 | import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum; | 7 | import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum; |
| 8 | import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum; | 8 | import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum; |
| 9 | import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum; | 9 | import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum; |
| 10 | -import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerConditionParameterOperatorEnum; | 10 | +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneConditionOperatorEnum; |
| 11 | import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum; | 11 | import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum; |
| 12 | import com.baomidou.mybatisplus.annotation.KeySequence; | 12 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 13 | import com.baomidou.mybatisplus.annotation.TableField; | 13 | import com.baomidou.mybatisplus.annotation.TableField; |
| @@ -163,7 +163,7 @@ public class IotRuleSceneDO extends TenantBaseDO { | @@ -163,7 +163,7 @@ public class IotRuleSceneDO extends TenantBaseDO { | ||
| 163 | /** | 163 | /** |
| 164 | * 操作符 | 164 | * 操作符 |
| 165 | * | 165 | * |
| 166 | - * 枚举 {@link IotRuleSceneTriggerConditionParameterOperatorEnum} | 166 | + * 枚举 {@link IotRuleSceneConditionOperatorEnum} |
| 167 | */ | 167 | */ |
| 168 | private String operator; | 168 | private String operator; |
| 169 | 169 | ||
| @@ -171,7 +171,7 @@ public class IotRuleSceneDO extends TenantBaseDO { | @@ -171,7 +171,7 @@ public class IotRuleSceneDO extends TenantBaseDO { | ||
| 171 | * 比较值 | 171 | * 比较值 |
| 172 | * | 172 | * |
| 173 | * 如果有多个值,则使用 "," 分隔,类似 "1,2,3"。 | 173 | * 如果有多个值,则使用 "," 分隔,类似 "1,2,3"。 |
| 174 | - * 例如说,{@link IotRuleSceneTriggerConditionParameterOperatorEnum#IN}、{@link IotRuleSceneTriggerConditionParameterOperatorEnum#BETWEEN} | 174 | + * 例如说,{@link IotRuleSceneConditionOperatorEnum#IN}、{@link IotRuleSceneConditionOperatorEnum#BETWEEN} |
| 175 | */ | 175 | */ |
| 176 | private String value; | 176 | private String value; |
| 177 | 177 | ||
| @@ -193,7 +193,7 @@ public class IotRuleSceneDO extends TenantBaseDO { | @@ -193,7 +193,7 @@ public class IotRuleSceneDO extends TenantBaseDO { | ||
| 193 | /** | 193 | /** |
| 194 | * 设备控制 | 194 | * 设备控制 |
| 195 | * | 195 | * |
| 196 | - * 必填:当 {@link #type} 为 {@link IotRuleSceneActionTypeEnum#DEVICE_CONTROL} 时 | 196 | + * 必填:当 {@link #type} 为 {@link IotRuleSceneActionTypeEnum#DEVICE_PROPERTY_SET} 时 |
| 197 | */ | 197 | */ |
| 198 | private ActionDeviceControl deviceControl; | 198 | private ActionDeviceControl deviceControl; |
| 199 | 199 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/IotRuleSceneServiceImpl.java
| @@ -23,7 +23,7 @@ import cn.iocoder.yudao.module.iot.dal.mysql.rule.IotRuleSceneMapper; | @@ -23,7 +23,7 @@ import cn.iocoder.yudao.module.iot.dal.mysql.rule.IotRuleSceneMapper; | ||
| 23 | import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum; | 23 | import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum; |
| 24 | import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum; | 24 | import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum; |
| 25 | import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum; | 25 | import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum; |
| 26 | -import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerConditionParameterOperatorEnum; | 26 | +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneConditionOperatorEnum; |
| 27 | import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum; | 27 | import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum; |
| 28 | import cn.iocoder.yudao.module.iot.framework.job.core.IotSchedulerManager; | 28 | import cn.iocoder.yudao.module.iot.framework.job.core.IotSchedulerManager; |
| 29 | import cn.iocoder.yudao.module.iot.job.rule.IotRuleSceneJob; | 29 | import cn.iocoder.yudao.module.iot.job.rule.IotRuleSceneJob; |
| @@ -127,57 +127,57 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | @@ -127,57 +127,57 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | ||
| 127 | condition01.setParameters(CollUtil.newArrayList()); | 127 | condition01.setParameters(CollUtil.newArrayList()); |
| 128 | // IotRuleSceneDO.TriggerConditionParameter parameter010 = new IotRuleSceneDO.TriggerConditionParameter(); | 128 | // IotRuleSceneDO.TriggerConditionParameter parameter010 = new IotRuleSceneDO.TriggerConditionParameter(); |
| 129 | // parameter010.setIdentifier("width"); | 129 | // parameter010.setIdentifier("width"); |
| 130 | -// parameter010.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.EQUALS.getOperator()); | 130 | +// parameter010.setOperator(IotRuleSceneConditionOperatorEnum.EQUALS.getOperator()); |
| 131 | // parameter010.setValue("abc"); | 131 | // parameter010.setValue("abc"); |
| 132 | // condition01.getParameters().add(parameter010); | 132 | // condition01.getParameters().add(parameter010); |
| 133 | IotRuleSceneDO.TriggerConditionParameter parameter011 = new IotRuleSceneDO.TriggerConditionParameter(); | 133 | IotRuleSceneDO.TriggerConditionParameter parameter011 = new IotRuleSceneDO.TriggerConditionParameter(); |
| 134 | parameter011.setIdentifier("width"); | 134 | parameter011.setIdentifier("width"); |
| 135 | - parameter011.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.EQUALS.getOperator()); | 135 | + parameter011.setOperator(IotRuleSceneConditionOperatorEnum.EQUALS.getOperator()); |
| 136 | parameter011.setValue("1"); | 136 | parameter011.setValue("1"); |
| 137 | condition01.getParameters().add(parameter011); | 137 | condition01.getParameters().add(parameter011); |
| 138 | IotRuleSceneDO.TriggerConditionParameter parameter012 = new IotRuleSceneDO.TriggerConditionParameter(); | 138 | IotRuleSceneDO.TriggerConditionParameter parameter012 = new IotRuleSceneDO.TriggerConditionParameter(); |
| 139 | parameter012.setIdentifier("width"); | 139 | parameter012.setIdentifier("width"); |
| 140 | - parameter012.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_EQUALS.getOperator()); | 140 | + parameter012.setOperator(IotRuleSceneConditionOperatorEnum.NOT_EQUALS.getOperator()); |
| 141 | parameter012.setValue("2"); | 141 | parameter012.setValue("2"); |
| 142 | condition01.getParameters().add(parameter012); | 142 | condition01.getParameters().add(parameter012); |
| 143 | IotRuleSceneDO.TriggerConditionParameter parameter013 = new IotRuleSceneDO.TriggerConditionParameter(); | 143 | IotRuleSceneDO.TriggerConditionParameter parameter013 = new IotRuleSceneDO.TriggerConditionParameter(); |
| 144 | parameter013.setIdentifier("width"); | 144 | parameter013.setIdentifier("width"); |
| 145 | - parameter013.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN.getOperator()); | 145 | + parameter013.setOperator(IotRuleSceneConditionOperatorEnum.GREATER_THAN.getOperator()); |
| 146 | parameter013.setValue("0"); | 146 | parameter013.setValue("0"); |
| 147 | condition01.getParameters().add(parameter013); | 147 | condition01.getParameters().add(parameter013); |
| 148 | IotRuleSceneDO.TriggerConditionParameter parameter014 = new IotRuleSceneDO.TriggerConditionParameter(); | 148 | IotRuleSceneDO.TriggerConditionParameter parameter014 = new IotRuleSceneDO.TriggerConditionParameter(); |
| 149 | parameter014.setIdentifier("width"); | 149 | parameter014.setIdentifier("width"); |
| 150 | - parameter014.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN_OR_EQUALS.getOperator()); | 150 | + parameter014.setOperator(IotRuleSceneConditionOperatorEnum.GREATER_THAN_OR_EQUALS.getOperator()); |
| 151 | parameter014.setValue("0"); | 151 | parameter014.setValue("0"); |
| 152 | condition01.getParameters().add(parameter014); | 152 | condition01.getParameters().add(parameter014); |
| 153 | IotRuleSceneDO.TriggerConditionParameter parameter015 = new IotRuleSceneDO.TriggerConditionParameter(); | 153 | IotRuleSceneDO.TriggerConditionParameter parameter015 = new IotRuleSceneDO.TriggerConditionParameter(); |
| 154 | parameter015.setIdentifier("width"); | 154 | parameter015.setIdentifier("width"); |
| 155 | - parameter015.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN.getOperator()); | 155 | + parameter015.setOperator(IotRuleSceneConditionOperatorEnum.LESS_THAN.getOperator()); |
| 156 | parameter015.setValue("2"); | 156 | parameter015.setValue("2"); |
| 157 | condition01.getParameters().add(parameter015); | 157 | condition01.getParameters().add(parameter015); |
| 158 | IotRuleSceneDO.TriggerConditionParameter parameter016 = new IotRuleSceneDO.TriggerConditionParameter(); | 158 | IotRuleSceneDO.TriggerConditionParameter parameter016 = new IotRuleSceneDO.TriggerConditionParameter(); |
| 159 | parameter016.setIdentifier("width"); | 159 | parameter016.setIdentifier("width"); |
| 160 | - parameter016.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN_OR_EQUALS.getOperator()); | 160 | + parameter016.setOperator(IotRuleSceneConditionOperatorEnum.LESS_THAN_OR_EQUALS.getOperator()); |
| 161 | parameter016.setValue("2"); | 161 | parameter016.setValue("2"); |
| 162 | condition01.getParameters().add(parameter016); | 162 | condition01.getParameters().add(parameter016); |
| 163 | IotRuleSceneDO.TriggerConditionParameter parameter017 = new IotRuleSceneDO.TriggerConditionParameter(); | 163 | IotRuleSceneDO.TriggerConditionParameter parameter017 = new IotRuleSceneDO.TriggerConditionParameter(); |
| 164 | parameter017.setIdentifier("width"); | 164 | parameter017.setIdentifier("width"); |
| 165 | - parameter017.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.IN.getOperator()); | 165 | + parameter017.setOperator(IotRuleSceneConditionOperatorEnum.IN.getOperator()); |
| 166 | parameter017.setValue("1,2,3"); | 166 | parameter017.setValue("1,2,3"); |
| 167 | condition01.getParameters().add(parameter017); | 167 | condition01.getParameters().add(parameter017); |
| 168 | IotRuleSceneDO.TriggerConditionParameter parameter018 = new IotRuleSceneDO.TriggerConditionParameter(); | 168 | IotRuleSceneDO.TriggerConditionParameter parameter018 = new IotRuleSceneDO.TriggerConditionParameter(); |
| 169 | parameter018.setIdentifier("width"); | 169 | parameter018.setIdentifier("width"); |
| 170 | - parameter018.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_IN.getOperator()); | 170 | + parameter018.setOperator(IotRuleSceneConditionOperatorEnum.NOT_IN.getOperator()); |
| 171 | parameter018.setValue("0,2,3"); | 171 | parameter018.setValue("0,2,3"); |
| 172 | condition01.getParameters().add(parameter018); | 172 | condition01.getParameters().add(parameter018); |
| 173 | IotRuleSceneDO.TriggerConditionParameter parameter019 = new IotRuleSceneDO.TriggerConditionParameter(); | 173 | IotRuleSceneDO.TriggerConditionParameter parameter019 = new IotRuleSceneDO.TriggerConditionParameter(); |
| 174 | parameter019.setIdentifier("width"); | 174 | parameter019.setIdentifier("width"); |
| 175 | - parameter019.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN.getOperator()); | 175 | + parameter019.setOperator(IotRuleSceneConditionOperatorEnum.BETWEEN.getOperator()); |
| 176 | parameter019.setValue("1,3"); | 176 | parameter019.setValue("1,3"); |
| 177 | condition01.getParameters().add(parameter019); | 177 | condition01.getParameters().add(parameter019); |
| 178 | IotRuleSceneDO.TriggerConditionParameter parameter020 = new IotRuleSceneDO.TriggerConditionParameter(); | 178 | IotRuleSceneDO.TriggerConditionParameter parameter020 = new IotRuleSceneDO.TriggerConditionParameter(); |
| 179 | parameter020.setIdentifier("width"); | 179 | parameter020.setIdentifier("width"); |
| 180 | - parameter020.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_BETWEEN.getOperator()); | 180 | + parameter020.setOperator(IotRuleSceneConditionOperatorEnum.NOT_BETWEEN.getOperator()); |
| 181 | parameter020.setValue("2,3"); | 181 | parameter020.setValue("2,3"); |
| 182 | condition01.getParameters().add(parameter020); | 182 | condition01.getParameters().add(parameter020); |
| 183 | trigger01.getConditions().add(condition01); | 183 | trigger01.getConditions().add(condition01); |
| @@ -194,7 +194,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | @@ -194,7 +194,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | ||
| 194 | condition03.setParameters(CollUtil.newArrayList()); | 194 | condition03.setParameters(CollUtil.newArrayList()); |
| 195 | IotRuleSceneDO.TriggerConditionParameter parameter030 = new IotRuleSceneDO.TriggerConditionParameter(); | 195 | IotRuleSceneDO.TriggerConditionParameter parameter030 = new IotRuleSceneDO.TriggerConditionParameter(); |
| 196 | parameter030.setIdentifier("width"); | 196 | parameter030.setIdentifier("width"); |
| 197 | - parameter030.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.EQUALS.getOperator()); | 197 | + parameter030.setOperator(IotRuleSceneConditionOperatorEnum.EQUALS.getOperator()); |
| 198 | parameter030.setValue("1"); | 198 | parameter030.setValue("1"); |
| 199 | trigger01.getConditions().add(condition03); | 199 | trigger01.getConditions().add(condition03); |
| 200 | ruleScene01.getTriggers().add(trigger01); | 200 | ruleScene01.getTriggers().add(trigger01); |
| @@ -202,7 +202,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | @@ -202,7 +202,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | ||
| 202 | ruleScene01.setActions(CollUtil.newArrayList()); | 202 | ruleScene01.setActions(CollUtil.newArrayList()); |
| 203 | // 设备控制 | 203 | // 设备控制 |
| 204 | IotRuleSceneDO.ActionConfig action01 = new IotRuleSceneDO.ActionConfig(); | 204 | IotRuleSceneDO.ActionConfig action01 = new IotRuleSceneDO.ActionConfig(); |
| 205 | - action01.setType(IotRuleSceneActionTypeEnum.DEVICE_CONTROL.getType()); | 205 | + action01.setType(IotRuleSceneActionTypeEnum.DEVICE_PROPERTY_SET.getType()); |
| 206 | IotRuleSceneDO.ActionDeviceControl actionDeviceControl01 = new IotRuleSceneDO.ActionDeviceControl(); | 206 | IotRuleSceneDO.ActionDeviceControl actionDeviceControl01 = new IotRuleSceneDO.ActionDeviceControl(); |
| 207 | actionDeviceControl01.setProductKey("4aymZgOTOOCrDKRT"); | 207 | actionDeviceControl01.setProductKey("4aymZgOTOOCrDKRT"); |
| 208 | actionDeviceControl01.setDeviceNames(ListUtil.of("small")); | 208 | actionDeviceControl01.setDeviceNames(ListUtil.of("small")); |
| @@ -266,7 +266,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | @@ -266,7 +266,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | ||
| 266 | scene.setTriggers(ListUtil.toList(triggerConfig)); | 266 | scene.setTriggers(ListUtil.toList(triggerConfig)); |
| 267 | // 动作 | 267 | // 动作 |
| 268 | IotRuleSceneDO.ActionConfig action01 = new IotRuleSceneDO.ActionConfig(); | 268 | IotRuleSceneDO.ActionConfig action01 = new IotRuleSceneDO.ActionConfig(); |
| 269 | - action01.setType(IotRuleSceneActionTypeEnum.DEVICE_CONTROL.getType()); | 269 | + action01.setType(IotRuleSceneActionTypeEnum.DEVICE_PROPERTY_SET.getType()); |
| 270 | IotRuleSceneDO.ActionDeviceControl iotRuleSceneActionDeviceControl01 = new IotRuleSceneDO.ActionDeviceControl(); | 270 | IotRuleSceneDO.ActionDeviceControl iotRuleSceneActionDeviceControl01 = new IotRuleSceneDO.ActionDeviceControl(); |
| 271 | iotRuleSceneActionDeviceControl01.setProductKey("4aymZgOTOOCrDKRT"); | 271 | iotRuleSceneActionDeviceControl01.setProductKey("4aymZgOTOOCrDKRT"); |
| 272 | iotRuleSceneActionDeviceControl01.setDeviceNames(ListUtil.of("small")); | 272 | iotRuleSceneActionDeviceControl01.setDeviceNames(ListUtil.of("small")); |
| @@ -366,8 +366,8 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | @@ -366,8 +366,8 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | ||
| 366 | private boolean isTriggerConditionParameterMatched(IotDeviceMessage message, IotRuleSceneDO.TriggerConditionParameter parameter, | 366 | private boolean isTriggerConditionParameterMatched(IotDeviceMessage message, IotRuleSceneDO.TriggerConditionParameter parameter, |
| 367 | IotRuleSceneDO ruleScene, IotRuleSceneDO.TriggerConfig trigger) { | 367 | IotRuleSceneDO ruleScene, IotRuleSceneDO.TriggerConfig trigger) { |
| 368 | // 1.1 校验操作符是否合法 | 368 | // 1.1 校验操作符是否合法 |
| 369 | - IotRuleSceneTriggerConditionParameterOperatorEnum operator = | ||
| 370 | - IotRuleSceneTriggerConditionParameterOperatorEnum.operatorOf(parameter.getOperator()); | 369 | + IotRuleSceneConditionOperatorEnum operator = |
| 370 | + IotRuleSceneConditionOperatorEnum.operatorOf(parameter.getOperator()); | ||
| 371 | if (operator == null) { | 371 | if (operator == null) { |
| 372 | log.error("[isTriggerConditionParameterMatched][规则场景编号({}) 的触发器({}) 存在错误的操作符({})]", | 372 | log.error("[isTriggerConditionParameterMatched][规则场景编号({}) 的触发器({}) 存在错误的操作符({})]", |
| 373 | ruleScene.getId(), trigger, parameter.getOperator()); | 373 | ruleScene.getId(), trigger, parameter.getOperator()); |
| @@ -382,24 +382,24 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | @@ -382,24 +382,24 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | ||
| 382 | // 2.1 构建 Spring 表达式的变量 | 382 | // 2.1 构建 Spring 表达式的变量 |
| 383 | Map<String, Object> springExpressionVariables = new HashMap<>(); | 383 | Map<String, Object> springExpressionVariables = new HashMap<>(); |
| 384 | try { | 384 | try { |
| 385 | - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE, messageValue); | ||
| 386 | - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE, parameter.getValue()); | 385 | + springExpressionVariables.put(IotRuleSceneConditionOperatorEnum.SPRING_EXPRESSION_SOURCE, messageValue); |
| 386 | + springExpressionVariables.put(IotRuleSceneConditionOperatorEnum.SPRING_EXPRESSION_VALUE, parameter.getValue()); | ||
| 387 | List<String> parameterValues = StrUtil.splitTrim(parameter.getValue(), CharPool.COMMA); | 387 | List<String> parameterValues = StrUtil.splitTrim(parameter.getValue(), CharPool.COMMA); |
| 388 | - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_LIST, parameterValues); | 388 | + springExpressionVariables.put(IotRuleSceneConditionOperatorEnum.SPRING_EXPRESSION_VALUE_LIST, parameterValues); |
| 389 | // 特殊:解决数字的比较。因为 Spring 是基于它的 compareTo 方法,对数字的比较存在问题! | 389 | // 特殊:解决数字的比较。因为 Spring 是基于它的 compareTo 方法,对数字的比较存在问题! |
| 390 | - if (ObjectUtils.equalsAny(operator, IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN, | ||
| 391 | - IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_BETWEEN, | ||
| 392 | - IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN, | ||
| 393 | - IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN_OR_EQUALS, | ||
| 394 | - IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN, | ||
| 395 | - IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN_OR_EQUALS) | 390 | + if (ObjectUtils.equalsAny(operator, IotRuleSceneConditionOperatorEnum.BETWEEN, |
| 391 | + IotRuleSceneConditionOperatorEnum.NOT_BETWEEN, | ||
| 392 | + IotRuleSceneConditionOperatorEnum.GREATER_THAN, | ||
| 393 | + IotRuleSceneConditionOperatorEnum.GREATER_THAN_OR_EQUALS, | ||
| 394 | + IotRuleSceneConditionOperatorEnum.LESS_THAN, | ||
| 395 | + IotRuleSceneConditionOperatorEnum.LESS_THAN_OR_EQUALS) | ||
| 396 | && NumberUtil.isNumber(messageValue) | 396 | && NumberUtil.isNumber(messageValue) |
| 397 | && NumberUtils.isAllNumber(parameterValues)) { | 397 | && NumberUtils.isAllNumber(parameterValues)) { |
| 398 | - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE, | 398 | + springExpressionVariables.put(IotRuleSceneConditionOperatorEnum.SPRING_EXPRESSION_SOURCE, |
| 399 | NumberUtil.parseDouble(messageValue)); | 399 | NumberUtil.parseDouble(messageValue)); |
| 400 | - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE, | 400 | + springExpressionVariables.put(IotRuleSceneConditionOperatorEnum.SPRING_EXPRESSION_VALUE, |
| 401 | NumberUtil.parseDouble(parameter.getValue())); | 401 | NumberUtil.parseDouble(parameter.getValue())); |
| 402 | - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_LIST, | 402 | + springExpressionVariables.put(IotRuleSceneConditionOperatorEnum.SPRING_EXPRESSION_VALUE_LIST, |
| 403 | convertList(parameterValues, NumberUtil::parseDouble)); | 403 | convertList(parameterValues, NumberUtil::parseDouble)); |
| 404 | } | 404 | } |
| 405 | // 2.2 计算 Spring 表达式 | 405 | // 2.2 计算 Spring 表达式 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/IotRuleSceneDeviceControlAction.java
| @@ -49,7 +49,7 @@ public class IotRuleSceneDeviceControlAction implements IotRuleSceneAction { | @@ -49,7 +49,7 @@ public class IotRuleSceneDeviceControlAction implements IotRuleSceneAction { | ||
| 49 | 49 | ||
| 50 | @Override | 50 | @Override |
| 51 | public IotRuleSceneActionTypeEnum getType() { | 51 | public IotRuleSceneActionTypeEnum getType() { |
| 52 | - return IotRuleSceneActionTypeEnum.DEVICE_CONTROL; | 52 | + return IotRuleSceneActionTypeEnum.DEVICE_PROPERTY_SET; |
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | } | 55 | } |
yudao-module-iot/yudao-module-iot-core/src/main/java/cn/iocoder/yudao/module/iot/core/enums/IotDeviceMessageMethodEnum.java
| @@ -19,9 +19,12 @@ public enum IotDeviceMessageMethodEnum implements ArrayValuable<String> { | @@ -19,9 +19,12 @@ public enum IotDeviceMessageMethodEnum implements ArrayValuable<String> { | ||
| 19 | 19 | ||
| 20 | // ========== 设备状态 ========== | 20 | // ========== 设备状态 ========== |
| 21 | 21 | ||
| 22 | + // TODO @芋艿:要合并下;thing.state.update | ||
| 22 | STATE_ONLINE("thing.state.online", "设备上线", true), | 23 | STATE_ONLINE("thing.state.online", "设备上线", true), |
| 23 | STATE_OFFLINE("thing.state.offline", "设备下线", true), | 24 | STATE_OFFLINE("thing.state.offline", "设备下线", true), |
| 24 | 25 | ||
| 26 | + STATE_UPDATE("thing.state.update", "设备状态更新", true), | ||
| 27 | + | ||
| 25 | // ========== 设备属性 ========== | 28 | // ========== 设备属性 ========== |
| 26 | // 可参考:https://help.aliyun.com/zh/iot/user-guide/device-properties-events-and-services | 29 | // 可参考:https://help.aliyun.com/zh/iot/user-guide/device-properties-events-and-services |
| 27 | 30 |