Commit 4f84182dabd8baafe750036dc4b7eefb45491e2e

Authored by YunaiV
1 parent 910bb6ca

【代码优化】IoT:简化 isTriggerConditionParameterMatched 方法,完善注释,提升可读性(虽然多了一些计算)

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][消息({}) 规则场景编号({}) 的触发器({}) 的匹配表达式({}/{}) 计算异常]",