【代码优化】IoT:简化 isTriggerConditionParameterMatched 方法,完善注释,提升可读性(虽然多了一些计算)
This commit is contained in:
parent
910bb6ca3c
commit
4f84182dab
|
@ -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 的类型,如果是 struct、list 这种,需要考虑下
|
// 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][消息({}) 规则场景编号({}) 的触发器({}) 的匹配表达式({}/{}) 计算异常]",
|
||||||
|
|
Loading…
Reference in New Issue