Commit 4f84182dabd8baafe750036dc4b7eefb45491e2e
1 parent
910bb6ca
【代码优化】IoT:简化 isTriggerConditionParameterMatched 方法,完善注释,提升可读性(虽然多了一些计算)
Showing
1 changed file
with
20 additions
and
25 deletions
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/IotRuleSceneServiceImpl.java
| @@ -220,7 +220,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | @@ -220,7 +220,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | ||
| 220 | @SuppressWarnings({"unchecked", "DataFlowIssue"}) | 220 | @SuppressWarnings({"unchecked", "DataFlowIssue"}) |
| 221 | private boolean isTriggerConditionParameterMatched(IotDeviceMessage message, IotRuleSceneDO.TriggerConditionParameter parameter, | 221 | private boolean isTriggerConditionParameterMatched(IotDeviceMessage message, IotRuleSceneDO.TriggerConditionParameter parameter, |
| 222 | IotRuleSceneDO ruleScene, IotRuleSceneDO.Trigger trigger) { | 222 | IotRuleSceneDO ruleScene, IotRuleSceneDO.Trigger trigger) { |
| 223 | - // 计算是否匹配 | 223 | + // 1.1 校验操作符是否合法 |
| 224 | IotRuleSceneTriggerConditionParameterOperatorEnum operator = | 224 | IotRuleSceneTriggerConditionParameterOperatorEnum operator = |
| 225 | IotRuleSceneTriggerConditionParameterOperatorEnum.operatorOf(parameter.getOperator()); | 225 | IotRuleSceneTriggerConditionParameterOperatorEnum.operatorOf(parameter.getOperator()); |
| 226 | if (operator == null) { | 226 | if (operator == null) { |
| @@ -228,41 +228,36 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | @@ -228,41 +228,36 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { | ||
| 228 | ruleScene.getId(), trigger, parameter.getOperator()); | 228 | ruleScene.getId(), trigger, parameter.getOperator()); |
| 229 | return false; | 229 | return false; |
| 230 | } | 230 | } |
| 231 | - // TODO @芋艿:目前只支持方便转换成 string 的类型,如果是 struct、list 这种,需要考虑下 | 231 | + // 1.2 校验消息是否包含对应的值 |
| 232 | String messageValue = MapUtil.getStr((Map<String, Object>) message.getData(), parameter.getIdentifier()); | 232 | String messageValue = MapUtil.getStr((Map<String, Object>) message.getData(), parameter.getIdentifier()); |
| 233 | if (messageValue == null) { | 233 | if (messageValue == null) { |
| 234 | return false; | 234 | return false; |
| 235 | } | 235 | } |
| 236 | + | ||
| 237 | + // 2.1 构建 Spring 表达式的变量 | ||
| 236 | Map<String, Object> springExpressionVariables = new HashMap<>(); | 238 | Map<String, Object> springExpressionVariables = new HashMap<>(); |
| 237 | try { | 239 | try { |
| 238 | springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE, messageValue); | 240 | springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE, messageValue); |
| 239 | springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE, parameter.getValue()); | 241 | springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE, parameter.getValue()); |
| 240 | - if (ObjectUtils.equalsAny(operator, IotRuleSceneTriggerConditionParameterOperatorEnum.IN, | ||
| 241 | - IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_IN)) { | ||
| 242 | - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_List, | ||
| 243 | - StrUtil.split(parameter.getValue(), CharPool.COMMA)); | ||
| 244 | - } else if (ObjectUtils.equalsAny(operator, IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN, | ||
| 245 | - IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_BETWEEN)) { | ||
| 246 | - List<String> parameterValues = StrUtil.splitTrim(parameter.getValue(), CharPool.COMMA); | ||
| 247 | - if (NumberUtil.isNumber(messageValue) && NumberUtils.isAllNumber(parameterValues)) { // 特殊:解决数字的比较 | ||
| 248 | - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE, | ||
| 249 | - NumberUtil.parseDouble(messageValue)); | ||
| 250 | - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_List, | ||
| 251 | - convertList(parameterValues, NumberUtil::parseDouble)); | ||
| 252 | - } else { | ||
| 253 | - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_List, parameterValues); | ||
| 254 | - } | ||
| 255 | - } else if (ObjectUtils.equalsAny(operator, IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN, | 242 | + List<String> parameterValues = StrUtil.splitTrim(parameter.getValue(), CharPool.COMMA); |
| 243 | + springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_List, parameterValues); | ||
| 244 | + // 特殊:解决数字的比较。因为 Spring 是基于它的 compareTo 方法,对数字的比较存在问题! | ||
| 245 | + if (ObjectUtils.equalsAny(operator, IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN, | ||
| 246 | + IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_BETWEEN, | ||
| 247 | + IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN, | ||
| 256 | IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN_OR_EQUALS, | 248 | IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN_OR_EQUALS, |
| 257 | IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN, | 249 | IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN, |
| 258 | - IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN_OR_EQUALS)) { | ||
| 259 | - if (NumberUtil.isNumber(messageValue) && NumberUtil.isNumber(parameter.getValue())) { // 特殊:解决数字的比较 | ||
| 260 | - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE, | ||
| 261 | - NumberUtil.parseDouble(messageValue)); | ||
| 262 | - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE, | ||
| 263 | - NumberUtil.parseDouble(parameter.getValue())); | ||
| 264 | - } | 250 | + IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN_OR_EQUALS) |
| 251 | + && NumberUtil.isNumber(messageValue) | ||
| 252 | + && NumberUtils.isAllNumber(parameterValues)) { | ||
| 253 | + springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE, | ||
| 254 | + NumberUtil.parseDouble(messageValue)); | ||
| 255 | + springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE, | ||
| 256 | + NumberUtil.parseDouble(parameter.getValue())); | ||
| 257 | + springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_List, | ||
| 258 | + convertList(parameterValues, NumberUtil::parseDouble)); | ||
| 265 | } | 259 | } |
| 260 | + // 2.2 计算 Spring 表达式 | ||
| 266 | return (Boolean) SpringExpressionUtils.parseExpression(operator.getSpringExpression(), springExpressionVariables); | 261 | return (Boolean) SpringExpressionUtils.parseExpression(operator.getSpringExpression(), springExpressionVariables); |
| 267 | } catch (Exception e) { | 262 | } catch (Exception e) { |
| 268 | log.error("[isTriggerConditionParameterMatched][消息({}) 规则场景编号({}) 的触发器({}) 的匹配表达式({}/{}) 计算异常]", | 263 | log.error("[isTriggerConditionParameterMatched][消息({}) 规则场景编号({}) 的触发器({}) 的匹配表达式({}/{}) 计算异常]", |