perf:【IoT 物联网】场景规则匹配优化
This commit is contained in:
@@ -1,74 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.iot.enums.rule;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Getter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* IoT 场景规则条件层级枚举
|
|
||||||
* <p>
|
|
||||||
* 用于区分主条件(触发器级别)和子条件(条件分组级别)
|
|
||||||
*
|
|
||||||
* @author HUIHUI
|
|
||||||
*/
|
|
||||||
@AllArgsConstructor
|
|
||||||
@Getter
|
|
||||||
public enum IotSceneRuleConditionLevelEnum {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 主条件 - 触发器级别的条件
|
|
||||||
* 用于判断触发器本身是否匹配(如消息类型、设备标识等)
|
|
||||||
*/
|
|
||||||
PRIMARY(1, "主条件"),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 子条件 - 条件分组级别的条件
|
|
||||||
* 用于判断具体的业务条件(如设备状态、属性值、时间条件等)
|
|
||||||
*/
|
|
||||||
SECONDARY(2, "子条件");
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 条件层级
|
|
||||||
*/
|
|
||||||
private final Integer level;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 条件层级名称
|
|
||||||
*/
|
|
||||||
private final String name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据层级值获取枚举
|
|
||||||
*
|
|
||||||
* @param level 层级值
|
|
||||||
* @return 条件层级枚举
|
|
||||||
*/
|
|
||||||
public static IotSceneRuleConditionLevelEnum levelOf(Integer level) {
|
|
||||||
if (level == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
for (IotSceneRuleConditionLevelEnum levelEnum : values()) {
|
|
||||||
if (levelEnum.getLevel().equals(level)) {
|
|
||||||
return levelEnum;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 判断是否为主条件
|
|
||||||
*
|
|
||||||
* @return 是否为主条件
|
|
||||||
*/
|
|
||||||
public boolean isPrimary() {
|
|
||||||
return this == PRIMARY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 判断是否为子条件
|
|
||||||
*
|
|
||||||
* @return 是否为子条件
|
|
||||||
*/
|
|
||||||
public boolean isSecondary() {
|
|
||||||
return this == SECONDARY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.iot.service.rule.scene.matcher;
|
|||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
|
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
|
||||||
import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotSceneRuleDO;
|
import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotSceneRuleDO;
|
||||||
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionLevelEnum;
|
|
||||||
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
|
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@@ -43,11 +42,6 @@ public class CurrentTimeConditionMatcher extends AbstractIotSceneRuleMatcher {
|
|||||||
return IotSceneRuleConditionTypeEnum.CURRENT_TIME;
|
return IotSceneRuleConditionTypeEnum.CURRENT_TIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public IotSceneRuleConditionLevelEnum getSupportedConditionLevel() {
|
|
||||||
return IotSceneRuleConditionLevelEnum.SECONDARY;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isMatched(IotDeviceMessage message, IotSceneRuleDO.TriggerCondition condition) {
|
public boolean isMatched(IotDeviceMessage message, IotSceneRuleDO.TriggerCondition condition) {
|
||||||
// 1. 基础参数校验
|
// 1. 基础参数校验
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.iot.service.rule.scene.matcher;
|
|||||||
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
|
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
|
||||||
import cn.iocoder.yudao.module.iot.core.util.IotDeviceMessageUtils;
|
import cn.iocoder.yudao.module.iot.core.util.IotDeviceMessageUtils;
|
||||||
import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotSceneRuleDO;
|
import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotSceneRuleDO;
|
||||||
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionLevelEnum;
|
|
||||||
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
|
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -27,11 +26,6 @@ public class DevicePropertyConditionMatcher extends AbstractIotSceneRuleMatcher
|
|||||||
return IotSceneRuleConditionTypeEnum.DEVICE_PROPERTY;
|
return IotSceneRuleConditionTypeEnum.DEVICE_PROPERTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public IotSceneRuleConditionLevelEnum getSupportedConditionLevel() {
|
|
||||||
return IotSceneRuleConditionLevelEnum.SECONDARY;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isMatched(IotDeviceMessage message, IotSceneRuleDO.TriggerCondition condition) {
|
public boolean isMatched(IotDeviceMessage message, IotSceneRuleDO.TriggerCondition condition) {
|
||||||
// 1. 基础参数校验
|
// 1. 基础参数校验
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.iot.service.rule.scene.matcher;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
|
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
|
||||||
import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotSceneRuleDO;
|
import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotSceneRuleDO;
|
||||||
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionLevelEnum;
|
|
||||||
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
|
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -26,11 +25,6 @@ public class DeviceStateConditionMatcher extends AbstractIotSceneRuleMatcher {
|
|||||||
return IotSceneRuleConditionTypeEnum.DEVICE_STATE;
|
return IotSceneRuleConditionTypeEnum.DEVICE_STATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public IotSceneRuleConditionLevelEnum getSupportedConditionLevel() {
|
|
||||||
return IotSceneRuleConditionLevelEnum.SECONDARY;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isMatched(IotDeviceMessage message, IotSceneRuleDO.TriggerCondition condition) {
|
public boolean isMatched(IotDeviceMessage message, IotSceneRuleDO.TriggerCondition condition) {
|
||||||
// 1. 基础参数校验
|
// 1. 基础参数校验
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.iot.service.rule.scene.matcher;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
|
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
|
||||||
import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotSceneRuleDO;
|
import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotSceneRuleDO;
|
||||||
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionLevelEnum;
|
|
||||||
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
|
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
|
||||||
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleTriggerTypeEnum;
|
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleTriggerTypeEnum;
|
||||||
|
|
||||||
@@ -58,15 +57,6 @@ public interface IotSceneRuleMatcher {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取支持的条件层级(仅条件匹配器需要实现)
|
|
||||||
*
|
|
||||||
* @return 条件层级枚举,触发器匹配器返回 null
|
|
||||||
*/
|
|
||||||
default IotSceneRuleConditionLevelEnum getSupportedConditionLevel() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查触发器是否匹配消息(仅触发器匹配器需要实现)
|
* 检查触发器是否匹配消息(仅触发器匹配器需要实现)
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.iot.service.rule.scene.matcher;
|
|||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
|
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
|
||||||
import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotSceneRuleDO;
|
import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotSceneRuleDO;
|
||||||
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionLevelEnum;
|
|
||||||
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
|
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
|
||||||
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleTriggerTypeEnum;
|
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleTriggerTypeEnum;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -107,8 +106,8 @@ public class IotSceneRuleMatcherManager {
|
|||||||
|
|
||||||
// 记录条件匹配器详情
|
// 记录条件匹配器详情
|
||||||
this.conditionMatcherMap.forEach((type, matcher) ->
|
this.conditionMatcherMap.forEach((type, matcher) ->
|
||||||
log.info("[IotSceneRuleMatcherManager][条件匹配器] 类型: {}, 匹配器: {}, 优先级: {}, 层级: {}",
|
log.info("[IotSceneRuleMatcherManager][条件匹配器] 类型: {}, 匹配器: {}, 优先级: {}",
|
||||||
type, matcher.getMatcherName(), matcher.getPriority(), matcher.getSupportedConditionLevel()));
|
type, matcher.getMatcherName(), matcher.getPriority()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -232,19 +231,6 @@ public class IotSceneRuleMatcherManager {
|
|||||||
return conditionMatcherMap.get(conditionType);
|
return conditionMatcherMap.get(conditionType);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据条件层级获取匹配器列表
|
|
||||||
*
|
|
||||||
* @param level 条件层级
|
|
||||||
* @return 匹配器列表
|
|
||||||
*/
|
|
||||||
public List<IotSceneRuleMatcher> getMatchersByLevel(IotSceneRuleConditionLevelEnum level) {
|
|
||||||
return allMatchers.stream()
|
|
||||||
.filter(matcher -> matcher.getMatcherType() == IotSceneRuleMatcher.MatcherType.CONDITION)
|
|
||||||
.filter(matcher -> matcher.getSupportedConditionLevel() == level)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取所有匹配器的统计信息
|
* 获取所有匹配器的统计信息
|
||||||
*
|
*
|
||||||
@@ -258,15 +244,6 @@ public class IotSceneRuleMatcherManager {
|
|||||||
statistics.put("supportedTriggerTypes", getSupportedTriggerTypes());
|
statistics.put("supportedTriggerTypes", getSupportedTriggerTypes());
|
||||||
statistics.put("supportedConditionTypes", getSupportedConditionTypes());
|
statistics.put("supportedConditionTypes", getSupportedConditionTypes());
|
||||||
|
|
||||||
// 按层级统计条件匹配器
|
|
||||||
Map<IotSceneRuleConditionLevelEnum, Long> levelStats = allMatchers.stream()
|
|
||||||
.filter(matcher -> matcher.getMatcherType() == IotSceneRuleMatcher.MatcherType.CONDITION)
|
|
||||||
.collect(Collectors.groupingBy(
|
|
||||||
IotSceneRuleMatcher::getSupportedConditionLevel,
|
|
||||||
Collectors.counting()
|
|
||||||
));
|
|
||||||
statistics.put("conditionLevelStatistics", levelStats);
|
|
||||||
|
|
||||||
// 触发器匹配器详情
|
// 触发器匹配器详情
|
||||||
Map<String, Object> triggerMatcherDetails = new HashMap<>();
|
Map<String, Object> triggerMatcherDetails = new HashMap<>();
|
||||||
triggerMatcherMap.forEach((type, matcher) -> {
|
triggerMatcherMap.forEach((type, matcher) -> {
|
||||||
@@ -284,7 +261,6 @@ public class IotSceneRuleMatcherManager {
|
|||||||
Map<String, Object> detail = new HashMap<>();
|
Map<String, Object> detail = new HashMap<>();
|
||||||
detail.put("matcherName", matcher.getMatcherName());
|
detail.put("matcherName", matcher.getMatcherName());
|
||||||
detail.put("priority", matcher.getPriority());
|
detail.put("priority", matcher.getPriority());
|
||||||
detail.put("level", matcher.getSupportedConditionLevel());
|
|
||||||
detail.put("enabled", matcher.isEnabled());
|
detail.put("enabled", matcher.isEnabled());
|
||||||
conditionMatcherDetails.put(type.name(), detail);
|
conditionMatcherDetails.put(type.name(), detail);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user