|
|
@@ -0,0 +1,121 @@
|
|
|
+package org.jetlinks.community.rule.engine.model;
|
|
|
+
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
+import org.apache.commons.collections.CollectionUtils;
|
|
|
+import org.hswebframework.web.bean.FastBeanCopier;
|
|
|
+import org.jetlinks.community.rule.engine.device.DeviceAlarmRule;
|
|
|
+import org.jetlinks.community.rule.engine.entity.RuleSceneEntity;
|
|
|
+import org.jetlinks.community.rule.engine.executor.DeviceMessageSendTaskExecutorProvider;
|
|
|
+import org.jetlinks.core.message.DeviceMessage;
|
|
|
+import org.jetlinks.rule.engine.api.model.RuleLink;
|
|
|
+import org.jetlinks.rule.engine.api.model.RuleModel;
|
|
|
+import org.jetlinks.rule.engine.api.model.RuleNodeModel;
|
|
|
+import org.jetlinks.rule.engine.model.RuleModelParserStrategy;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
+
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author lifang
|
|
|
+ * @version 1.0.0
|
|
|
+ * @ClassName RuleSceneEnity.java
|
|
|
+ * @Description TODO
|
|
|
+ * @createTime 2021年08月31日 15:02:00
|
|
|
+ */
|
|
|
+@Component
|
|
|
+public class RuleSceneModelParser implements RuleModelParserStrategy {
|
|
|
+ public static String format = "rule_scene";
|
|
|
+ @Override
|
|
|
+ public String getFormat() {
|
|
|
+ return format;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public RuleModel parse(String modelDefineString) {
|
|
|
+ RuleSceneEntity rule= JSONUtil.toBean(modelDefineString,RuleSceneEntity.class);
|
|
|
+ RuleModel model = new RuleModel();
|
|
|
+ model.setId(format+":"+rule.getId());
|
|
|
+ model.setName(rule.getName());
|
|
|
+ List<DeviceAlarmRule.Trigger> triggers = rule.getTriggers();
|
|
|
+ List<Action> actions = rule.getActions();
|
|
|
+ //处理定时触发
|
|
|
+ {
|
|
|
+ List<DeviceAlarmRule.Trigger> timerTriggers = triggers.stream()
|
|
|
+ .filter(trigger -> trigger.getTrigger() == DeviceAlarmRule.TriggerType.timer)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ int index = 0;
|
|
|
+ for (DeviceAlarmRule.Trigger trigger : timerTriggers) {
|
|
|
+ DeviceMessage msg = trigger.getType().createMessage(trigger).orElse(null);
|
|
|
+ if (msg == null) {
|
|
|
+ throw new UnsupportedOperationException("不支持定时条件类型:" + trigger.getType());
|
|
|
+ }
|
|
|
+ if (DeviceAlarmRule.TriggerType.timer.equals(trigger.getTrigger())) {
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ RuleNodeModel timer = new RuleNodeModel();
|
|
|
+ timer.setId("timer:" + (++index));
|
|
|
+ timer.setName("定时发送设备消息");
|
|
|
+ timer.setExecutor("timer");
|
|
|
+ timer.setConfiguration(Collections.singletonMap("cron", trigger.getCron()));
|
|
|
+
|
|
|
+ DeviceMessageSendTaskExecutorProvider.Config senderConfig = new DeviceMessageSendTaskExecutorProvider.Config();
|
|
|
+ senderConfig.setAsync(true);
|
|
|
+ senderConfig.setDeviceId(trigger.getDeviceId());
|
|
|
+ senderConfig.setProductId(trigger.getProductId());
|
|
|
+ senderConfig.setMessage(msg.toJson());
|
|
|
+
|
|
|
+ RuleNodeModel messageSender = new RuleNodeModel();
|
|
|
+ messageSender.setId("message-sender:" + (++index));
|
|
|
+ messageSender.setName("定时发送设备消息");
|
|
|
+ messageSender.setExecutor("device-message-sender");
|
|
|
+ messageSender.setConfiguration(FastBeanCopier.copy(senderConfig, new HashMap<>()));
|
|
|
+
|
|
|
+ RuleLink link = new RuleLink();
|
|
|
+ link.setId(timer.getId().concat(":").concat(messageSender.getId()));
|
|
|
+ link.setName("执行动作:" + index);
|
|
|
+ link.setSource(timer);
|
|
|
+ link.setTarget(messageSender);
|
|
|
+ timer.getOutputs().add(link);
|
|
|
+ messageSender.getInputs().add(link);
|
|
|
+ model.getNodes().add(timer);
|
|
|
+ model.getNodes().add(messageSender);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ RuleNodeModel conditionNode = new RuleNodeModel();
|
|
|
+ conditionNode.setId("conditions");
|
|
|
+ conditionNode.setName("预警条件");
|
|
|
+ conditionNode.setExecutor("device-message-sender");
|
|
|
+// conditionNode.setConfiguration(Collections.singletonMap("rule", rule.getAlarmRule()));
|
|
|
+ model.getNodes().add(conditionNode);
|
|
|
+ if (CollectionUtils.isNotEmpty(actions)) {
|
|
|
+ int index = 0;
|
|
|
+ for (Action operation : actions) {
|
|
|
+ if (!StringUtils.hasText(operation.getExecutor())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ index++;
|
|
|
+ RuleNodeModel action = new RuleNodeModel();
|
|
|
+ action.setId("device-message-sender:" + index);
|
|
|
+ action.setName("执行动作:" + index);
|
|
|
+ action.setExecutor(operation.getExecutor());
|
|
|
+ action.setConfiguration(operation.getConfiguration());
|
|
|
+
|
|
|
+ RuleLink link = new RuleLink();
|
|
|
+ link.setId(action.getId().concat(":").concat(conditionNode.getId()));
|
|
|
+ link.setName("执行动作:" + index);
|
|
|
+ link.setSource(conditionNode);
|
|
|
+ link.setTarget(action);
|
|
|
+ model.getNodes().add(action);
|
|
|
+ action.getInputs().add(link);
|
|
|
+ conditionNode.getOutputs().add(link);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return model;
|
|
|
+ }
|
|
|
+}
|