Bladeren bron

add webhook 通知配置

18339543638 4 jaren geleden
bovenliggende
commit
e5aeec58be

+ 28 - 19
jetlinks-components/notify-component/notify-webhook/src/main/java/org/jetlinks/community/notify/webhook/WebHookNotifier.java

@@ -40,22 +40,22 @@ public class WebHookNotifier extends AbstractNotifier<WebHookTemplate> {
     private HttpRequest request;
     public WebHookNotifier(NotifierProperties profile, TemplateManager templateManager) {
         super(templateManager);
-        Map<String, Object> config = profile.getConfiguration();
-        this.method = (String) Objects.requireNonNull(config.get("method"), "请求方法不能为空");
-        this.url=(String) Objects.requireNonNull(config.get("url"), "url不能为空");
-        this.connectionTimeout=(Long) Objects.requireNonNull(config.get("connectionTimeout"), "连接超时时长不能为空");
-        this.readTimeout=(Long) Objects.requireNonNull(config.get("readTimeout"), "请求超时时长不能为空");
-        switch (method){
-            case "post":
-                request = HttpUtil.createPost(url);
-                break;
-            case "get":
-                request = HttpUtil.createGet(url);
-                break;
-            default: throw new BusinessException(String.format("http不支持该方法{%s}",method));
-        }
-        request.setReadTimeout(Long.valueOf(TimeUnit.SECONDS.toMillis(readTimeout)).intValue());
-        request.setConnectionTimeout(Long.valueOf(TimeUnit.SECONDS.toMillis(connectionTimeout)).intValue());
+//        Map<String, Object> config = profile.getConfiguration();
+//        this.method = (String) Objects.requireNonNull(config.get("method"), "请求方法不能为空");
+//        this.url=(String) Objects.requireNonNull(config.get("url"), "url不能为空");
+//        this.connectionTimeout=(Long) Objects.requireNonNull(config.get("connectionTimeout"), "连接超时时长不能为空");
+//        this.readTimeout=(Long) Objects.requireNonNull(config.get("readTimeout"), "请求超时时长不能为空");
+//        switch (method){
+//            case "post":
+//                request = HttpUtil.createPost(url);
+//                break;
+//            case "get":
+//                request = HttpUtil.createGet(url);
+//                break;
+//            default: throw new BusinessException(String.format("http不支持该方法{%s}",method));
+//        }
+//        request.setReadTimeout(Long.valueOf(TimeUnit.SECONDS.toMillis(readTimeout)).intValue());
+//        request.setConnectionTimeout(Long.valueOf(TimeUnit.SECONDS.toMillis(connectionTimeout)).intValue());
         this.notifierId = profile.getId();
     }
 
@@ -85,18 +85,22 @@ public class WebHookNotifier extends AbstractNotifier<WebHookTemplate> {
     public Mono<Void> send(@Nonnull WebHookTemplate template, @Nonnull Values context) {
         return Mono.defer(()->{
                 try {
-                    Method method = request.getMethod();
+                    String method = template.getMethod();
                     switch (method){
-                        case GET:
+                        case "get":
+                            request=HttpUtil.createGet(template.getUrl());
                             Map<String, String> headers = new HashMap<>();
                             context.getAllValues().forEach((k,v)->headers.put(k,String.valueOf(v)));
                             request.addHeaders(headers);
                             break;
-                        case PUT:
+                        case "post":
+                            request=HttpUtil.createPost(template.getUrl());
                             request.body(context.toString());
                             break;
                         default:break;
                     }
+                    request.setReadTimeout(Long.valueOf(TimeUnit.SECONDS.toMillis(template.getReadTimeout())).intValue());
+                    request.setConnectionTimeout(Long.valueOf(TimeUnit.SECONDS.toMillis(template.getConnectionTimeout())).intValue());
                     HttpResponse response = request.execute();
                     if (200!=response.getStatus()) {
                         return Mono.error(new BusinessException(response.body(), response.getStatus()));
@@ -109,6 +113,11 @@ public class WebHookNotifier extends AbstractNotifier<WebHookTemplate> {
         );
     }
 
+
+    public static void main(String[] args) {
+        HttpResponse execute = HttpUtil.createGet("https://cn.bing.com/").execute();
+        System.out.println(execute);
+    }
     @Nonnull
     @Override
     public Mono<Void> close() {

+ 31 - 9
jetlinks-components/notify-component/notify-webhook/src/main/java/org/jetlinks/community/notify/webhook/WebHookNotifyProvider.java

@@ -1,6 +1,8 @@
 package org.jetlinks.community.notify.webhook;
 
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import io.vertx.core.http.HttpMethod;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.hswebframework.web.validator.ValidatorUtils;
@@ -11,12 +13,12 @@ import org.jetlinks.community.notify.template.TemplateProperties;
 import org.jetlinks.community.notify.template.TemplateProvider;
 import org.jetlinks.core.metadata.ConfigMetadata;
 import org.jetlinks.core.metadata.DefaultConfigMetadata;
-import org.jetlinks.core.metadata.types.LongType;
-import org.jetlinks.core.metadata.types.StringType;
+import org.jetlinks.core.metadata.types.*;
 import org.springframework.stereotype.Component;
 import reactor.core.publisher.Mono;
 
 import javax.annotation.Nonnull;
+import java.util.HashMap;
 
 /**
  * @author lifang
@@ -33,16 +35,36 @@ public class WebHookNotifyProvider implements NotifierProvider, TemplateProvider
     private final TemplateManager templateManager;
 
 
-    public static final DefaultConfigMetadata notifierConfig = new DefaultConfigMetadata("通知配置", "")
-        .add("url", "地址", "", new StringType().expand(ConfigMetadataConstants.required.value(true)))
-        .add("method","方法","",new StringType().expand(ConfigMetadataConstants.required.value(true)))
-        .add("connectionTimeout","连接超时时长","",new LongType().expand(ConfigMetadataConstants.required.value(true)))
-        .add("readTimeout","请求超时时长","",new LongType().expand(ConfigMetadataConstants.required.value(true)));
+    public static final DefaultConfigMetadata templateConfig = new DefaultConfigMetadata("webHook模板", "")
+        .add("url", "地址", "http(s)://", new StringType()
+            .expand(ConfigMetadataConstants.required.value(true)))
+        .add("method","方法","方法",new EnumType()
+            .addElement(EnumType.Element.of("get", "get"))
+            .addElement(EnumType.Element.of("post", "post")))
+        .add("connectionTimeout","连接超时时长","",
+            new StringType()
+                .expand(ConfigMetadataConstants.required.value(true)))
+        .add("readTimeout","请求超时时长","",
+            new StringType()
+                .expand(ConfigMetadataConstants.required.value(true)));
 
+    public static void main(String[] args) {
+        HashMap<String, String> map = new HashMap<>();
+        map.put("url","http://www.baidu.com");
+        map.put("method","get");
+        map.put("connectionTimeout","10");
+        map.put("readTimeout","10");
+        System.out.println(JSONUtil.parse(map));
+    }
+
+//    @Override
+//    public ConfigMetadata getNotifierConfigMetadata() {
+//        return notifierConfig;
+//    }
 
     @Override
-    public ConfigMetadata getNotifierConfigMetadata() {
-        return notifierConfig;
+    public ConfigMetadata getTemplateConfigMetadata() {
+        return templateConfig;
     }
 
     @Nonnull

+ 1 - 1
jetlinks-components/notify-component/notify-webhook/src/main/java/org/jetlinks/community/notify/webhook/WebHookProvider.java

@@ -15,7 +15,7 @@ import org.jetlinks.community.notify.*;
 @Getter
 @AllArgsConstructor
 public enum  WebHookProvider  implements Provider {
-    webHook("默认");
+    webHook("HTTP_CLIENT");
 
     private String name;
 

+ 6 - 8
jetlinks-components/notify-component/notify-webhook/src/main/java/org/jetlinks/community/notify/webhook/WebHookTemplate.java

@@ -2,12 +2,14 @@ package org.jetlinks.community.notify.webhook;
 
 import cn.hutool.core.util.URLUtil;
 import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
 import io.vertx.core.http.HttpMethod;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.jetlinks.community.notify.template.Template;
 
 import javax.validation.constraints.NotBlank;
+import java.util.Map;
 
 /**
  * @author lifang
@@ -22,12 +24,12 @@ public class WebHookTemplate implements Template {
     @NotBlank(message = "[url]不能为空")
     private String url;
 
-    private Long connectionTimeout;
+//    @NotBlank(message = "[method]不能为空")
+    private String method;
 
-    private Long requestTimeout;
+    private Long connectionTimeout;
 
-    @NotBlank(message = "[请求方法]不能为空")
-    private HttpMethod httpMethod;
+    private Long readTimeout;
 
     private String sslKey;
 
@@ -35,8 +37,4 @@ public class WebHookTemplate implements Template {
 
     private String description;
 
-    private boolean verify(){
-        return true;
-    }
-
 }

+ 8 - 2
jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/device/DeviceAlarmRule.java

@@ -173,7 +173,7 @@ public class DeviceAlarmRule implements Serializable {
     @Getter
     @AllArgsConstructor
     public enum TriggerType implements Serializable {
-        //设备消息
+        //设备消息 todo 产品
         device(Arrays.asList(
             MessageType.values()
         )),
@@ -191,10 +191,16 @@ public class DeviceAlarmRule implements Serializable {
     @Setter
     public static class Trigger implements Serializable {
 
-        //触发方式,定时,设备
+        //触发方式,定时,设备,产品
         @Schema(description = "触发方式")
         private TriggerType trigger = TriggerType.device;
 
+        @Schema(description = "设备id")
+        private String deviceId;
+
+        @Schema(description = "产品id")
+        private String productId;
+
         //trigger为定时任务时的cron表达式
         @Schema(description = "定时触发cron表达式")
         private String cron;

+ 25 - 0
jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/entity/RuleSceneEntity.java

@@ -0,0 +1,25 @@
+package org.jetlinks.community.rule.engine.entity;
+
+import lombok.Data;
+import org.jetlinks.community.rule.engine.device.DeviceAlarmRule;
+import org.jetlinks.community.rule.engine.model.Action;
+import java.util.*;
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName RuleScenceEntity.java
+ * @Description TODO
+ * @createTime 2021年08月31日 14:59:00
+ */
+@Data
+public class RuleSceneEntity {
+    private String id;
+
+    private String name;
+
+    private Boolean parallel;
+
+    private List<Action> actions;
+
+    private List<DeviceAlarmRule.Trigger> triggers;
+}

+ 3 - 1
jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/model/DeviceAlarmModelParser.java

@@ -1,5 +1,6 @@
 package org.jetlinks.community.rule.engine.model;
 
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import org.apache.commons.collections.CollectionUtils;
 import org.hswebframework.web.bean.FastBeanCopier;
@@ -31,7 +32,8 @@ public class DeviceAlarmModelParser implements RuleModelParserStrategy {
 
     @Override
     public RuleModel parse(String modelDefineString) {
-        DeviceAlarmEntity rule = FastBeanCopier.copy(JSON.parseObject(modelDefineString), DeviceAlarmEntity::new);
+        DeviceAlarmEntity rule = JSONUtil.toBean(modelDefineString,DeviceAlarmEntity.class);
+//        DeviceAlarmEntity rule = FastBeanCopier.copy(JSON.parseObject(modelDefineString), DeviceAlarmEntity::new);
 
         RuleModel model = new RuleModel();
         model.setId("device_alarm:".concat(rule.getId()));

+ 121 - 0
jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/model/RuleSceneModelParser.java

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

+ 1 - 0
jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/web/RuleInstanceController.java

@@ -1,5 +1,6 @@
 package org.jetlinks.community.rule.engine.web;
 
+import com.alibaba.fastjson.JSON;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;