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

This commit is contained in:
YunaiV 2025-02-02 22:21:53 +08:00
parent 910bb6ca3c
commit 4f84182dab
1 changed files with 20 additions and 25 deletions

View File

@ -220,7 +220,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService {
@SuppressWarnings({"unchecked", "DataFlowIssue"}) @SuppressWarnings({"unchecked", "DataFlowIssue"})
private boolean isTriggerConditionParameterMatched(IotDeviceMessage message, IotRuleSceneDO.TriggerConditionParameter parameter, private boolean isTriggerConditionParameterMatched(IotDeviceMessage message, IotRuleSceneDO.TriggerConditionParameter parameter,
IotRuleSceneDO ruleScene, IotRuleSceneDO.Trigger trigger) { IotRuleSceneDO ruleScene, IotRuleSceneDO.Trigger trigger) {
// 计算是否匹配 // 1.1 校验操作符是否合法
IotRuleSceneTriggerConditionParameterOperatorEnum operator = IotRuleSceneTriggerConditionParameterOperatorEnum operator =
IotRuleSceneTriggerConditionParameterOperatorEnum.operatorOf(parameter.getOperator()); IotRuleSceneTriggerConditionParameterOperatorEnum.operatorOf(parameter.getOperator());
if (operator == null) { if (operator == null) {
@ -228,41 +228,36 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService {
ruleScene.getId(), trigger, parameter.getOperator()); ruleScene.getId(), trigger, parameter.getOperator());
return false; return false;
} }
// TODO @芋艿目前只支持方便转换成 string 的类型如果是 structlist 这种需要考虑下 // 1.2 校验消息是否包含对应的值
String messageValue = MapUtil.getStr((Map<String, Object>) message.getData(), parameter.getIdentifier()); String messageValue = MapUtil.getStr((Map<String, Object>) message.getData(), parameter.getIdentifier());
if (messageValue == null) { if (messageValue == null) {
return false; return false;
} }
// 2.1 构建 Spring 表达式的变量
Map<String, Object> springExpressionVariables = new HashMap<>(); Map<String, Object> springExpressionVariables = new HashMap<>();
try { try {
springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE, messageValue); springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE, messageValue);
springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE, parameter.getValue()); springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE, parameter.getValue());
if (ObjectUtils.equalsAny(operator, IotRuleSceneTriggerConditionParameterOperatorEnum.IN, List<String> parameterValues = StrUtil.splitTrim(parameter.getValue(), CharPool.COMMA);
IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_IN)) { springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_List, parameterValues);
springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_List, // 特殊解决数字的比较因为 Spring 是基于它的 compareTo 方法对数字的比较存在问题
StrUtil.split(parameter.getValue(), CharPool.COMMA)); if (ObjectUtils.equalsAny(operator, IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN,
} else if (ObjectUtils.equalsAny(operator, IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN, IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_BETWEEN,
IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_BETWEEN)) { IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN,
List<String> parameterValues = StrUtil.splitTrim(parameter.getValue(), CharPool.COMMA);
if (NumberUtil.isNumber(messageValue) && NumberUtils.isAllNumber(parameterValues)) { // 特殊解决数字的比较
springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE,
NumberUtil.parseDouble(messageValue));
springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_List,
convertList(parameterValues, NumberUtil::parseDouble));
} else {
springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_List, parameterValues);
}
} else if (ObjectUtils.equalsAny(operator, IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN,
IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN_OR_EQUALS, IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN_OR_EQUALS,
IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN, IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN,
IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN_OR_EQUALS)) { IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN_OR_EQUALS)
if (NumberUtil.isNumber(messageValue) && NumberUtil.isNumber(parameter.getValue())) { // 特殊解决数字的比较 && NumberUtil.isNumber(messageValue)
springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE, && NumberUtils.isAllNumber(parameterValues)) {
NumberUtil.parseDouble(messageValue)); springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE,
springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE, NumberUtil.parseDouble(messageValue));
NumberUtil.parseDouble(parameter.getValue())); springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE,
} NumberUtil.parseDouble(parameter.getValue()));
springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_List,
convertList(parameterValues, NumberUtil::parseDouble));
} }
// 2.2 计算 Spring 表达式
return (Boolean) SpringExpressionUtils.parseExpression(operator.getSpringExpression(), springExpressionVariables); return (Boolean) SpringExpressionUtils.parseExpression(operator.getSpringExpression(), springExpressionVariables);
} catch (Exception e) { } catch (Exception e) {
log.error("[isTriggerConditionParameterMatched][消息({}) 规则场景编号({}) 的触发器({}) 的匹配表达式({}/{}) 计算异常]", log.error("[isTriggerConditionParameterMatched][消息({}) 规则场景编号({}) 的触发器({}) 的匹配表达式({}/{}) 计算异常]",