perf:【IoT 物联网】场景规则匹配优化

This commit is contained in:
puhui999 2025-08-15 17:35:01 +08:00
parent 93aaffddfe
commit 378cf1e997
6 changed files with 2 additions and 128 deletions

View File

@ -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;
}
}

View File

@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.iot.service.rule.scene.matcher;
import cn.hutool.core.util.StrUtil;
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.enums.rule.IotSceneRuleConditionLevelEnum;
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@ -43,11 +42,6 @@ public class CurrentTimeConditionMatcher extends AbstractIotSceneRuleMatcher {
return IotSceneRuleConditionTypeEnum.CURRENT_TIME;
}
@Override
public IotSceneRuleConditionLevelEnum getSupportedConditionLevel() {
return IotSceneRuleConditionLevelEnum.SECONDARY;
}
@Override
public boolean isMatched(IotDeviceMessage message, IotSceneRuleDO.TriggerCondition condition) {
// 1. 基础参数校验

View File

@ -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.util.IotDeviceMessageUtils;
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 org.springframework.stereotype.Component;
@ -27,11 +26,6 @@ public class DevicePropertyConditionMatcher extends AbstractIotSceneRuleMatcher
return IotSceneRuleConditionTypeEnum.DEVICE_PROPERTY;
}
@Override
public IotSceneRuleConditionLevelEnum getSupportedConditionLevel() {
return IotSceneRuleConditionLevelEnum.SECONDARY;
}
@Override
public boolean isMatched(IotDeviceMessage message, IotSceneRuleDO.TriggerCondition condition) {
// 1. 基础参数校验

View File

@ -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.dal.dataobject.rule.IotSceneRuleDO;
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionLevelEnum;
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
import org.springframework.stereotype.Component;
@ -26,11 +25,6 @@ public class DeviceStateConditionMatcher extends AbstractIotSceneRuleMatcher {
return IotSceneRuleConditionTypeEnum.DEVICE_STATE;
}
@Override
public IotSceneRuleConditionLevelEnum getSupportedConditionLevel() {
return IotSceneRuleConditionLevelEnum.SECONDARY;
}
@Override
public boolean isMatched(IotDeviceMessage message, IotSceneRuleDO.TriggerCondition condition) {
// 1. 基础参数校验

View File

@ -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.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.IotSceneRuleTriggerTypeEnum;
@ -58,15 +57,6 @@ public interface IotSceneRuleMatcher {
return null;
}
/**
* 获取支持的条件层级仅条件匹配器需要实现
*
* @return 条件层级枚举触发器匹配器返回 null
*/
default IotSceneRuleConditionLevelEnum getSupportedConditionLevel() {
return null;
}
/**
* 检查触发器是否匹配消息仅触发器匹配器需要实现
*

View File

@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.iot.service.rule.scene.matcher;
import cn.hutool.core.collection.CollUtil;
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.enums.rule.IotSceneRuleConditionLevelEnum;
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleTriggerTypeEnum;
import lombok.extern.slf4j.Slf4j;
@ -107,8 +106,8 @@ public class IotSceneRuleMatcherManager {
// 记录条件匹配器详情
this.conditionMatcherMap.forEach((type, matcher) ->
log.info("[IotSceneRuleMatcherManager][条件匹配器] 类型: {}, 匹配器: {}, 优先级: {}, 层级: {}",
type, matcher.getMatcherName(), matcher.getPriority(), matcher.getSupportedConditionLevel()));
log.info("[IotSceneRuleMatcherManager][条件匹配器] 类型: {}, 匹配器: {}, 优先级: {}",
type, matcher.getMatcherName(), matcher.getPriority()));
}
/**
@ -232,19 +231,6 @@ public class IotSceneRuleMatcherManager {
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("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<>();
triggerMatcherMap.forEach((type, matcher) -> {
@ -284,7 +261,6 @@ public class IotSceneRuleMatcherManager {
Map<String, Object> detail = new HashMap<>();
detail.put("matcherName", matcher.getMatcherName());
detail.put("priority", matcher.getPriority());
detail.put("level", matcher.getSupportedConditionLevel());
detail.put("enabled", matcher.isEnabled());
conditionMatcherDetails.put(type.name(), detail);
});