|
|
@@ -1,12 +1,15 @@
|
|
|
package org.jetlinks.community.rule.engine.model;
|
|
|
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
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.RuleInstanceEntity;
|
|
|
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.RuleEngineModelParser;
|
|
|
import org.jetlinks.rule.engine.api.model.RuleLink;
|
|
|
import org.jetlinks.rule.engine.api.model.RuleModel;
|
|
|
import org.jetlinks.rule.engine.api.model.RuleNodeModel;
|
|
|
@@ -29,6 +32,7 @@ import java.util.stream.Collectors;
|
|
|
@Component
|
|
|
public class RuleSceneModelParser implements RuleModelParserStrategy {
|
|
|
public static String format = "rule_scene";
|
|
|
+
|
|
|
@Override
|
|
|
public String getFormat() {
|
|
|
return format;
|
|
|
@@ -36,11 +40,12 @@ public class RuleSceneModelParser implements RuleModelParserStrategy {
|
|
|
|
|
|
@Override
|
|
|
public RuleModel parse(String modelDefineString) {
|
|
|
- RuleSceneEntity rule= JSONUtil.toBean(modelDefineString,RuleSceneEntity.class);
|
|
|
+ DeviceAlarmRule rule= JSONUtil.toBean(modelDefineString, DeviceAlarmRule.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();
|
|
|
//处理定时触发
|
|
|
{
|
|
|
@@ -52,10 +57,6 @@ public class RuleSceneModelParser implements RuleModelParserStrategy {
|
|
|
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));
|
|
|
@@ -86,12 +87,12 @@ public class RuleSceneModelParser implements RuleModelParserStrategy {
|
|
|
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()));
|
|
|
+ conditionNode.addConfiguration("rule", rule.getTriggers());
|
|
|
+// conditionNode.setConfiguration(Collections.singletonMap("rule", rule.getTriggers()));
|
|
|
model.getNodes().add(conditionNode);
|
|
|
if (CollectionUtils.isNotEmpty(actions)) {
|
|
|
int index = 0;
|
|
|
@@ -118,4 +119,97 @@ public class RuleSceneModelParser implements RuleModelParserStrategy {
|
|
|
}
|
|
|
return model;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设备触发
|
|
|
+ */
|
|
|
+ private void handlerDeviceTrigger(List<DeviceAlarmRule.Trigger> deviceTriggers,RuleModel model){
|
|
|
+ if(!CollectionUtil.isEmpty(deviceTriggers)){
|
|
|
+ int index = 0;
|
|
|
+ for (DeviceAlarmRule.Trigger trigger : deviceTriggers) {
|
|
|
+ DeviceMessage msg = trigger.getType().createMessage(trigger).orElse(null);
|
|
|
+ if (msg == null) {
|
|
|
+ throw new UnsupportedOperationException("不支持定时条件类型:" + trigger.getType());
|
|
|
+ }
|
|
|
+ RuleNodeModel node = new RuleNodeModel();
|
|
|
+ node.setId("device:" + (++index));
|
|
|
+ node.setName("设备触发发送消息");
|
|
|
+ node.setExecutor("device_alarm");
|
|
|
+ node.setConfiguration(Collections.singletonMap("rule", 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("device_alarm_action:" + (++index));
|
|
|
+ messageSender.setName("设备触发发送消息");
|
|
|
+ messageSender.setExecutor("device-message-sender");
|
|
|
+ messageSender.setConfiguration(FastBeanCopier.copy(senderConfig, new HashMap<>()));
|
|
|
+
|
|
|
+ RuleLink link = new RuleLink();
|
|
|
+ link.setId(node.getId().concat(":").concat(messageSender.getId()));
|
|
|
+ link.setName("执行动作:" + index);
|
|
|
+ link.setSource(node);
|
|
|
+ link.setTarget(messageSender);
|
|
|
+ node.getOutputs().add(link);
|
|
|
+ messageSender.getInputs().add(link);
|
|
|
+ model.getNodes().add(node);
|
|
|
+ model.getNodes().add(messageSender);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 产品触发
|
|
|
+ */
|
|
|
+ private void handlerProductTrigger(List<DeviceAlarmRule.Trigger> productTriggers,RuleModel model){
|
|
|
+ if(!CollectionUtil.isEmpty(productTriggers)){
|
|
|
+ if(!CollectionUtil.isEmpty(productTriggers)){
|
|
|
+ int index = 0;
|
|
|
+ for (DeviceAlarmRule.Trigger trigger : productTriggers) {
|
|
|
+ DeviceMessage msg = trigger.getType().createMessage(trigger).orElse(null);
|
|
|
+ if (msg == null) {
|
|
|
+ throw new UnsupportedOperationException("不支持定时条件类型:" + trigger.getType());
|
|
|
+ }
|
|
|
+ RuleNodeModel node = new RuleNodeModel();
|
|
|
+ node.setId("device:" + (++index));
|
|
|
+ node.setName("产品触发发送消息");
|
|
|
+ node.setExecutor("device_alarm");
|
|
|
+ node.setConfiguration(Collections.singletonMap("rule", 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("device_alarm_action:" + (++index));
|
|
|
+ messageSender.setName("设备触发发送消息");
|
|
|
+ messageSender.setExecutor("device-message-sender");
|
|
|
+ messageSender.setConfiguration(FastBeanCopier.copy(senderConfig, new HashMap<>()));
|
|
|
+
|
|
|
+ RuleLink link = new RuleLink();
|
|
|
+ link.setId(node.getId().concat(":").concat(messageSender.getId()));
|
|
|
+ link.setName("执行动作:" + index);
|
|
|
+ link.setSource(node);
|
|
|
+ link.setTarget(messageSender);
|
|
|
+ node.getOutputs().add(link);
|
|
|
+ messageSender.getInputs().add(link);
|
|
|
+ model.getNodes().add(node);
|
|
|
+ model.getNodes().add(messageSender);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void handlerTrigger(){
|
|
|
+
|
|
|
+ }
|
|
|
}
|