2026-06-24 f4bd1f3c89d906131495a0aca5aaf82966378510
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package cn.iocoder.yudao.module.iot.service.rule.scene.matcher.trigger;
 
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.IotSceneRuleTriggerTypeEnum;
import cn.iocoder.yudao.module.iot.service.rule.scene.matcher.IotSceneRuleMatcherHelper;
import org.quartz.CronExpression;
import org.springframework.stereotype.Component;
 
/**
 * 定时触发器匹配器:处理定时触发的触发器匹配逻辑
 *
 * 注意:定时触发器不依赖设备消息,主要用于定时任务场景
 *
 * @author HUIHUI
 */
@Component
public class IotTimerTriggerMatcher implements IotSceneRuleTriggerMatcher {
 
    @Override
    public IotSceneRuleTriggerTypeEnum getSupportedTriggerType() {
        return IotSceneRuleTriggerTypeEnum.TIMER;
    }
 
    @Override
    public boolean matches(IotDeviceMessage message, IotSceneRuleDO.Trigger trigger) {
        // 1.1 基础参数校验
        if (!IotSceneRuleMatcherHelper.isBasicTriggerValid(trigger)) {
            IotSceneRuleMatcherHelper.logTriggerMatchFailure(message, trigger, "触发器基础参数无效");
            return false;
        }
 
        // 1.2 检查 CRON 表达式是否存在
        if (StrUtil.isBlank(trigger.getCronExpression())) {
            IotSceneRuleMatcherHelper.logTriggerMatchFailure(message, trigger, "定时触发器缺少 CRON 表达式");
            return false;
        }
 
        // 1.3 定时触发器通常不依赖具体的设备消息
        // 它是通过定时任务调度器触发的,这里主要是验证配置的有效性
        if (!CronExpression.isValidExpression(trigger.getCronExpression())) {
            IotSceneRuleMatcherHelper.logTriggerMatchFailure(message, trigger, "CRON 表达式格式无效: " + trigger.getCronExpression());
            return false;
        }
 
        IotSceneRuleMatcherHelper.logTriggerMatchSuccess(message, trigger);
        return true;
    }
 
    @Override
    public int getPriority() {
        return 50; // 最低优先级,因为定时触发器不依赖消息
    }
 
}