Explorar o código

规则引擎日志修改/增加告警

xiwa %!s(int64=3) %!d(string=hai) anos
pai
achega
ecc37b996a

+ 0 - 13
dao/src/main/java/cc/iotkit/dao/DeviceEventRepository.java

@@ -1,13 +0,0 @@
-package cc.iotkit.dao;
-
-import cc.iotkit.model.device.message.DeviceEvent;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.mongodb.repository.MongoRepository;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public interface DeviceEventRepository extends MongoRepository<DeviceEvent, String> {
-
-    Page<DeviceEvent> findByDeviceId(String deviceId, Pageable pageable);
-}

+ 1 - 25
manager/src/main/java/cc/iotkit/manager/controller/api/DeviceController.java

@@ -10,10 +10,8 @@ import cc.iotkit.manager.model.vo.AppPageNode;
 import cc.iotkit.manager.service.AppDesignService;
 import cc.iotkit.manager.service.DeviceService;
 import cc.iotkit.manager.utils.AuthUtil;
-import cc.iotkit.model.*;
-import cc.iotkit.model.device.message.DeviceEvent;
+import cc.iotkit.model.InvokeResult;
 import cc.iotkit.model.device.DeviceInfo;
-import cc.iotkit.model.mq.Request;
 import cc.iotkit.model.space.SpaceDevice;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -115,28 +113,6 @@ public class DeviceController {
             return result;
         }
 
-        try {
-            //记录用户操作日志
-            Request request = new Request();
-            if (StringUtils.isNotBlank(args)) {
-                request.setParams(JsonUtil.parse(args, Map.class));
-            }
-            userActionLogRepository.save(UserActionLog.builder()
-                    .uid(AuthUtil.getUserId())
-                    .type(UserActionLog.Type.DEVICE_CONTROL.getValue())
-                    .target(device.getName())
-                    .log(DeviceEvent.builder()
-                            .deviceId(deviceId)
-                            .identifier(service)
-                            .request(request)
-                            .type(service.equals("set") ? "property" : "service")
-                            .createAt(System.currentTimeMillis())
-                            .build())
-                    .result(result.getRequestId())
-                    .createAt(System.currentTimeMillis()).build());
-        } catch (Throwable e) {
-            log.error("save log error", e);
-        }
         return result;
     }
 

+ 0 - 102
manager/src/main/java/cc/iotkit/manager/controller/api/MessageController.java

@@ -1,102 +0,0 @@
-package cc.iotkit.manager.controller.api;
-
-import cc.iotkit.dao.DeviceCache;
-import cc.iotkit.dao.ProductCache;
-import cc.iotkit.dao.UserActionLogRepository;
-import cc.iotkit.manager.model.vo.MessageVo;
-import cc.iotkit.manager.utils.AuthUtil;
-import cc.iotkit.model.device.message.DeviceEvent;
-import cc.iotkit.model.device.DeviceInfo;
-import cc.iotkit.model.product.ThingModel;
-import cc.iotkit.model.UserActionLog;
-import io.swagger.annotations.ApiOperation;
-import org.joda.time.DateTime;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Example;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-@RestController("api-msg")
-@RequestMapping("/api/message")
-public class MessageController {
-
-    @Autowired
-    private UserActionLogRepository userActionLogRepository;
-    @Autowired
-    private ProductCache productCache;
-    @Autowired
-    private DeviceCache deviceCache;
-
-    @ApiOperation("取系统消息")
-    @PostMapping("/getSysMessages")
-    public List<MessageVo> getSysMessages() {
-        return new ArrayList<>();
-    }
-
-    @ApiOperation("取设备消息")
-    @PostMapping("/getDeviceMessages")
-    public List<MessageVo> getDeviceMessages() {
-        List<UserActionLog> logs = userActionLogRepository.findAll(
-                Example.of(UserActionLog.builder()
-                        .uid(AuthUtil.getUserId())
-                        .type(UserActionLog.Type.DEVICE_CONTROL.getValue())
-                        .build()),
-                PageRequest.of(1, 20, Sort.by(Sort.Order.desc("createAt")))
-        ).getContent();
-
-        List<MessageVo> messages = new ArrayList<>();
-        logs.forEach(log -> messages.add(
-                new MessageVo(
-                        getDeviceMsg(log.getTarget(), log.getLog()),
-                        new DateTime(log.getCreateAt()).toString("MM-dd HH:mm")
-                )
-                )
-        );
-        return messages;
-    }
-
-    private String getDeviceMsg(String target, Object log) {
-        StringBuffer logMsg = new StringBuffer();
-        if (log instanceof DeviceEvent) {
-            DeviceEvent de = (DeviceEvent) log;
-            DeviceInfo device = deviceCache.findByDeviceId(de.getDeviceId());
-            ThingModel thingModel = productCache.getThingModel(device.getProductKey());
-            if (thingModel == null) {
-                return logMsg.toString();
-            }
-            ThingModel.Model model = thingModel.getModel();
-            logMsg.append("将【").append(target).append("】");
-
-            String identifier = de.getIdentifier();
-            if (de.getType().equals("property")) {
-                Object params = de.getRequest().getParams();
-                if (params instanceof Map) {
-                    ((Map<?, ?>) params).forEach((key, value) -> {
-                        Optional<ThingModel.Property> property =
-                                model.getProperties().stream()
-                                        .filter((p) -> p.getIdentifier().equals(key))
-                                        .findAny();
-                        property.ifPresent(prop ->
-                                logMsg.append(String.format("设置【%s】为%s", prop.getName(), value)));
-                    });
-                }
-            } else {
-                model.getServices().forEach(service -> {
-                    if (service.getIdentifier().equals(identifier)) {
-                        logMsg.append(service.getName());
-                    }
-                });
-            }
-        }
-        return logMsg.toString();
-    }
-
-}

+ 58 - 0
model/src/main/java/cc/iotkit/model/alert/AlertConfig.java

@@ -0,0 +1,58 @@
+package cc.iotkit.model.alert;
+
+import cc.iotkit.model.Owned;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * 告警配置
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Document
+public class AlertConfig implements Owned {
+    public static final String TYPE_EMAIL="email";
+    public static final String TYPE_DINGDING_ROBOT="dingding_robot";
+
+    @Id
+    private String id;
+
+    /**
+     * 配置所属用户
+     */
+    private String uid;
+
+    /**
+     * 告警器类型
+     */
+    private String type;
+
+    /**
+     * 告警配置标题
+     */
+    private String title;
+
+    /**
+     * 告警器参数配置
+     */
+    private String config;
+
+    /**
+     * 告警内容模板
+     */
+    private String template;
+
+    /**
+     * 是否启用
+     */
+    private boolean enable;
+
+    private Long createAt;
+
+}

+ 0 - 31
model/src/main/java/cc/iotkit/model/device/message/DeviceEvent.java

@@ -1,31 +0,0 @@
-package cc.iotkit.model.device.message;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import org.springframework.data.annotation.Id;
-import org.springframework.data.mongodb.core.mapping.Document;
-import cc.iotkit.model.mq.Request;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-@Document
-public class DeviceEvent {
-
-    @Id
-    private String id;
-
-    private String deviceId;
-
-    private String identifier;
-
-    private Request<?> request;
-
-    private String type;
-
-    private Long createAt;
-
-}

+ 0 - 16
model/src/main/java/cc/iotkit/model/device/message/DeviceRegister.java

@@ -1,16 +0,0 @@
-package cc.iotkit.model.device.message;
-
-import lombok.Data;
-
-@Data
-public class DeviceRegister {
-
-    private String id;
-
-    private String productKey;
-
-    private String deviceName;
-
-    private String model;
-
-}

+ 4 - 1
rule-engine/src/main/java/cc/iotkit/ruleengine/action/Action.java

@@ -10,5 +10,8 @@ public interface Action<T> {
 
     List<T> getServices();
 
-    void execute(ThingModelMessage msg);
+    /**
+     * 执行动作返回执行动作内容
+     */
+    List<String> execute(ThingModelMessage msg);
 }

+ 36 - 0
rule-engine/src/main/java/cc/iotkit/ruleengine/action/AlertAction.java

@@ -0,0 +1,36 @@
+package cc.iotkit.ruleengine.action;
+
+import cc.iotkit.model.device.message.ThingModelMessage;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class AlertAction implements Action<AlertService<?>> {
+
+    public static final String TYPE = "http";
+
+    private String type;
+
+    private List<AlertService<?>> services;
+
+    @Override
+    public String getType() {
+        return TYPE;
+    }
+
+    @Override
+    public List<String> execute(ThingModelMessage msg) {
+        List<String> results = new ArrayList<>();
+        for (AlertService<?> service : services) {
+            results.add(service.execute(msg));
+        }
+        return results;
+    }
+
+}

+ 30 - 0
rule-engine/src/main/java/cc/iotkit/ruleengine/action/AlertService.java

@@ -0,0 +1,30 @@
+package cc.iotkit.ruleengine.action;
+
+import cc.iotkit.model.device.message.ThingModelMessage;
+import cc.iotkit.ruleengine.alert.Alerter;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Map;
+
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Data
+public class AlertService<T extends Alerter> extends ScriptService {
+    private String configId;
+
+    private T alert;
+
+    @SneakyThrows
+    public String execute(ThingModelMessage msg) {
+        //执行转换脚本
+        Map result = execScript(msg);
+        if (result == null) {
+            log.warn("execScript result is null");
+            return "execScript result is null";
+        }
+        return alert.send(result);
+    }
+}

+ 6 - 1
rule-engine/src/main/java/cc/iotkit/ruleengine/action/DeviceAction.java

@@ -1,10 +1,12 @@
 package cc.iotkit.ruleengine.action;
 
+import cc.iotkit.common.utils.JsonUtil;
 import cc.iotkit.model.device.message.ThingModelMessage;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.util.ArrayList;
 import java.util.List;
 
 @NoArgsConstructor
@@ -26,10 +28,13 @@ public class DeviceAction implements Action<DeviceActionService.Service> {
     }
 
     @Override
-    public void execute(ThingModelMessage msg) {
+    public List<String> execute(ThingModelMessage msg) {
+        List<String> results = new ArrayList<>();
         for (DeviceActionService.Service service : services) {
             deviceActionService.invoke(service);
+            results.add(JsonUtil.toJsonString(service));
         }
+        return results;
     }
 
 }

+ 5 - 2
rule-engine/src/main/java/cc/iotkit/ruleengine/action/HttpAction.java

@@ -5,6 +5,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.util.ArrayList;
 import java.util.List;
 
 @NoArgsConstructor
@@ -24,10 +25,12 @@ public class HttpAction implements Action<HttpService> {
     }
 
     @Override
-    public void execute(ThingModelMessage msg) {
+    public List<String> execute(ThingModelMessage msg) {
+        List<String> results = new ArrayList<>();
         for (HttpService service : services) {
-            service.execute(msg);
+            results.add(service.execute(msg));
         }
+        return results;
     }
 
 }

+ 20 - 24
rule-engine/src/main/java/cc/iotkit/ruleengine/action/HttpService.java

@@ -2,46 +2,35 @@ package cc.iotkit.ruleengine.action;
 
 import cc.iotkit.common.utils.JsonUtil;
 import cc.iotkit.model.device.message.ThingModelMessage;
-import jdk.nashorn.api.scripting.NashornScriptEngine;
-import jdk.nashorn.api.scripting.ScriptObjectMirror;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.*;
 import org.apache.commons.beanutils.BeanUtils;
 
-import javax.script.ScriptEngineManager;
 import java.io.IOException;
 import java.util.Map;
 
+@EqualsAndHashCode(callSuper = true)
 @Slf4j
 @Data
-public class HttpService {
-    private final NashornScriptEngine engine = (NashornScriptEngine) (new ScriptEngineManager())
-            .getEngineByName("nashorn");
-
-    private String script;
-
+public class HttpService extends ScriptService {
     private String url;
 
-    private ScriptObjectMirror scriptObject;
-
-    private OkHttpClient httpClient = new OkHttpClient();
+    private final OkHttpClient httpClient = new OkHttpClient();
 
     @SneakyThrows
-    public void execute(ThingModelMessage msg) {
-        if (scriptObject == null) {
-            scriptObject = (ScriptObjectMirror) engine.eval("new (function(){" + script + "})()");
-        }
+    public String execute(ThingModelMessage msg) {
         //执行转换脚本
-        ScriptObjectMirror result = (ScriptObjectMirror) engine.invokeMethod(scriptObject, "translate", msg);
-        Object objResult = JsonUtil.toObject(result);
-        if (!(objResult instanceof Map)) {
-            return;
+        Map result = execScript(msg);
+        if (result == null) {
+            log.warn("execScript result is null");
+            return "execScript result is null";
         }
 
         HttpData httpData = new HttpData();
-        BeanUtils.populate(httpData, (Map) objResult);
+        BeanUtils.populate(httpData, result);
 
         //组装http请求
         String url = this.url + httpData.getPath();
@@ -59,17 +48,24 @@ public class HttpService {
                 httpData.getBody().toString());
 
         Request request = builder.method(httpData.getMethod().toUpperCase(), requestBody).build();
-        log.info("send http request:{} ,{}", url, JsonUtil.toJsonString(objResult));
+        String requestDataStr = JsonUtil.toJsonString(result);
+        log.info("send http request:{} ,{}", url, requestDataStr);
 
+        String responseBody = "";
+        int responseCode;
         //发送请求
         try (Response response = httpClient.newCall(request).execute()) {
             ResponseBody body = response.body();
-            String content = body == null ? "" : body.string();
-            log.info("send result,code:{},response:{}", response.code(), content);
+            responseCode = response.code();
+            responseBody = body == null ? "" : body.string();
+            log.info("send result,code:{},response:{}", responseCode, responseBody);
         } catch (IOException e) {
             throw new RuntimeException("send request failed", e);
         }
 
+        return String.format("send request,url:%s,method:%s,receive response,code:%s,body:%s",
+                url, requestDataStr, responseCode, responseBody);
+
     }
 
     @Data

+ 41 - 0
rule-engine/src/main/java/cc/iotkit/ruleengine/action/ScriptService.java

@@ -0,0 +1,41 @@
+package cc.iotkit.ruleengine.action;
+
+import cc.iotkit.common.utils.JsonUtil;
+import cc.iotkit.model.device.message.ThingModelMessage;
+import jdk.nashorn.api.scripting.NashornScriptEngine;
+import jdk.nashorn.api.scripting.ScriptObjectMirror;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.script.ScriptEngineManager;
+import java.util.Map;
+
+@Slf4j
+@Data
+public class ScriptService {
+
+    private final NashornScriptEngine engine = (NashornScriptEngine) (new ScriptEngineManager())
+            .getEngineByName("nashorn");
+
+    private String script;
+
+    private ScriptObjectMirror scriptObject;
+
+    public Map execScript(ThingModelMessage msg) {
+        try {
+            if (scriptObject == null) {
+                scriptObject = (ScriptObjectMirror) engine.eval("new (function(){" + script + "})()");
+            }
+            //执行转换脚本
+            ScriptObjectMirror result = (ScriptObjectMirror) engine.invokeMethod(scriptObject, "translate", msg);
+            Object objResult = JsonUtil.toObject(result);
+            if (!(objResult instanceof Map)) {
+                return null;
+            }
+            return (Map) objResult;
+        } catch (Throwable e) {
+            log.error("run script error", e);
+            return null;
+        }
+    }
+}

+ 16 - 0
rule-engine/src/main/java/cc/iotkit/ruleengine/alert/Alerter.java

@@ -0,0 +1,16 @@
+package cc.iotkit.ruleengine.alert;
+
+import java.util.Map;
+
+/**
+ * 报警器
+ */
+public interface Alerter {
+
+    void setConfig(String config);
+
+    void setTemplate(String template);
+
+    String send(Map<String, Object> data);
+
+}

+ 23 - 0
rule-engine/src/main/java/cc/iotkit/ruleengine/alert/DingdRobotAlerter.java

@@ -0,0 +1,23 @@
+package cc.iotkit.ruleengine.alert;
+
+import java.util.Map;
+
+/**
+ * 钉钉机器人告警器
+ */
+public class DingdRobotAlerter implements Alerter {
+    @Override
+    public void setConfig(String config) {
+
+    }
+
+    @Override
+    public void setTemplate(String template) {
+
+    }
+
+    @Override
+    public String send(Map<String, Object> data) {
+        return "send dingding robot msg";
+    }
+}

+ 28 - 0
rule-engine/src/main/java/cc/iotkit/ruleengine/alert/EmailAlerter.java

@@ -0,0 +1,28 @@
+package cc.iotkit.ruleengine.alert;
+
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * 邮件告警器
+ */
+@Data
+public class EmailAlerter implements Alerter {
+
+
+    @Override
+    public void setConfig(String config) {
+
+    }
+
+    @Override
+    public void setTemplate(String template) {
+
+    }
+
+    @Override
+    public String send(Map<String, Object> data) {
+        return "send email";
+    }
+}

+ 10 - 3
rule-engine/src/main/java/cc/iotkit/ruleengine/rule/RuleExecutor.java

@@ -1,5 +1,6 @@
 package cc.iotkit.ruleengine.rule;
 
+import cc.iotkit.common.utils.JsonUtil;
 import cc.iotkit.dao.RuleLogRepository;
 import cc.iotkit.model.device.message.ThingModelMessage;
 import cc.iotkit.model.rule.RuleLog;
@@ -11,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
@@ -45,7 +47,10 @@ public class RuleExecutor {
             }
             ruleLog.setState(RuleLog.STATE_MATCHED_FILTER);
 
-            doActions(rule, message);
+            //执行动作返回执行内容
+            List<String> results = doActions(rule, message);
+            //保存动作内容和状态
+            ruleLog.setContent(JsonUtil.toJsonString(results));
             ruleLog.setState(RuleLog.STATE_EXECUTED_ACTION);
             ruleLog.setSuccess(true);
             log.info("rule execution completed,id:{}", rule.getId());
@@ -81,10 +86,12 @@ public class RuleExecutor {
         return true;
     }
 
-    private void doActions(Rule rule, ThingModelMessage msg) {
+    private List<String> doActions(Rule rule, ThingModelMessage msg) {
+        List<String> results = new ArrayList<>();
         for (Action<?> action : rule.getActions()) {
-            action.execute(msg);
+            results.addAll(action.execute(msg));
         }
+        return results;
     }
 
 }