lishuangjiang@potevio.com преди 2 години
родител
ревизия
3c5e897fd9
променени са 26 файла, в които са добавени 309 реда и са изтрити 30 реда
  1. 15 0
      iot-dao/iot-data-model/src/main/java/cc/iotkit/model/alert/AlertConfig.java
  2. 21 0
      iot-dao/iot-data-model/src/main/java/cc/iotkit/model/alert/AlertRecord.java
  3. 1 1
      iot-dao/iot-data-model/src/main/java/cc/iotkit/model/rule/RuleAction.java
  4. 2 0
      iot-dao/iot-data-service/src/main/java/cc/iotkit/data/manager/IAlertRecordData.java
  5. 0 3
      iot-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbAlertRecord.java
  6. 6 0
      iot-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/AlertRecordDataImpl.java
  7. 33 0
      iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/AlertMessageEventListener.java
  8. 19 0
      iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/AlertService.java
  9. 5 0
      iot-module/iot-message-notify/pom.xml
  10. 4 2
      iot-module/iot-message-notify/src/main/java/cc/iotkit/message/listener/DingTalkEventListener.java
  11. 14 6
      iot-module/iot-message-notify/src/main/java/cc/iotkit/message/listener/EmailEventListener.java
  12. 4 3
      iot-module/iot-message-notify/src/main/java/cc/iotkit/message/listener/MessageEventListener.java
  13. 4 2
      iot-module/iot-message-notify/src/main/java/cc/iotkit/message/listener/QyWechatEventListener.java
  14. 13 0
      iot-module/iot-message-notify/src/main/java/cc/iotkit/message/model/DingTalkConfig.java
  15. 18 1
      iot-module/iot-message-notify/src/main/java/cc/iotkit/message/model/Message.java
  16. 13 0
      iot-module/iot-message-notify/src/main/java/cc/iotkit/message/model/QyWechatConfig.java
  17. 37 0
      iot-module/iot-message-notify/src/main/java/cc/iotkit/message/notify/EventManager.java
  18. 10 0
      iot-module/iot-message-notify/src/main/java/cc/iotkit/message/notify/EventType.java
  19. 3 2
      iot-module/iot-message-notify/src/main/java/cc/iotkit/message/service/MessageService.java
  20. 4 0
      iot-module/iot-rule-engine/pom.xml
  21. 1 0
      iot-module/iot-rule-engine/src/main/java/cc/iotkit/ruleengine/action/ScriptService.java
  22. 4 4
      iot-module/iot-rule-engine/src/main/java/cc/iotkit/ruleengine/action/alert/AlertAction.java
  23. 12 3
      iot-module/iot-rule-engine/src/main/java/cc/iotkit/ruleengine/action/alert/AlertService.java
  24. 64 2
      iot-module/iot-rule-engine/src/main/java/cc/iotkit/ruleengine/rule/RuleManager.java
  25. 1 1
      iot-starter/src/main/java/cc/iotkit/Application.java
  26. 1 0
      iot-starter/src/main/java/cc/iotkit/config/EmbeddedRedisConfig.java

+ 15 - 0
iot-dao/iot-data-model/src/main/java/cc/iotkit/model/alert/AlertConfig.java

@@ -71,4 +71,19 @@ public class AlertConfig implements Owned<Long> {
      */
     private Long createAt;
 
+    /**
+     * 创建部门
+     */
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    private Long createBy;
+
+    /**
+     * 更新者
+     */
+    private Long updateBy;
+
 }

+ 21 - 0
iot-dao/iot-data-model/src/main/java/cc/iotkit/model/alert/AlertRecord.java

@@ -15,6 +15,9 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.persistence.Column;
+import java.util.Date;
+
 /**
  * 告警配置
  */
@@ -62,4 +65,22 @@ public class AlertRecord implements Owned<Long> {
     private Boolean readFlg;
 
 
+    /**
+     * 创建部门
+     */
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    private Long createBy;
+
+    /**
+     * 更新者
+     */
+    private Long updateBy;
+
+
+
+
 }

+ 1 - 1
iot-dao/iot-data-model/src/main/java/cc/iotkit/model/rule/RuleAction.java

@@ -30,7 +30,7 @@ public class RuleAction {
     /**
      * 告警消息
      */
-    public static final String TYPE_ALARM = "alarm";
+    public static final String TYPE_ALARM = "alert";
 
     /**
      * 场景控制

+ 2 - 0
iot-dao/iot-data-service/src/main/java/cc/iotkit/data/manager/IAlertRecordData.java

@@ -21,4 +21,6 @@ public interface IAlertRecordData extends ICommonData<AlertRecord, Long> {
   Paging<AlertRecord> selectAlertConfigPage(PageRequest<AlertRecord> request);
 
   Paging<AlertRecord> selectAlertRecordPage(PageRequest<AlertRecord> request);
+
+    void addAlert(AlertRecord alertRecord);
 }

+ 0 - 3
iot-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbAlertRecord.java

@@ -22,9 +22,6 @@ import javax.persistence.*;
 @Entity
 @Table(name = "alert_record")
 @AutoMapper(target= AlertRecord.class)
-@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
-@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
-@EntityListeners(TenantListener.class)
 public class TbAlertRecord extends BaseEntity implements TenantAware {
 
     @Id

+ 6 - 0
iot-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/AlertRecordDataImpl.java

@@ -79,4 +79,10 @@ public class AlertRecordDataImpl implements IAlertRecordData, IJPACommData<Alert
                 .and(StringUtils.isNotEmpty(data.getName()), () -> tbAlertRecord.name.like("%"+data.getName()+"%"))
                 .build();
     }
+
+
+    @Override
+    public void addAlert(AlertRecord alertRecord) {
+        alertRecordRepository.save(MapstructUtils.convert(alertRecord,TbAlertRecord.class));
+    }
 }

+ 33 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/AlertMessageEventListener.java

@@ -0,0 +1,33 @@
+package cc.iotkit.manager.service;
+
+import cc.iotkit.data.manager.IAlertConfigData;
+import cc.iotkit.message.event.MessageEvent;
+import cc.iotkit.message.listener.MessageEventListener;
+import cc.iotkit.message.model.Message;
+import cc.iotkit.model.alert.AlertConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author sjg
+ */
+@Slf4j
+@Component
+public class AlertMessageEventListener implements MessageEventListener {
+
+    @Autowired
+    private IAlertConfigData alertConfigData;
+
+    @Autowired
+    private AlertService alertService;
+
+    @Override
+    @EventListener(classes = MessageEvent.class)
+    public void doEvent(MessageEvent event) {
+        Message message = event.getMessage();
+        AlertConfig alertConfig = alertConfigData.findById(message.getAlertConfigId());
+        alertService.addAlert(alertConfig, message.getFormatContent());
+    }
+}

+ 19 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/AlertService.java

@@ -14,6 +14,7 @@ import cc.iotkit.common.api.Paging;
 import cc.iotkit.common.api.Request;
 import cc.iotkit.common.satoken.utils.AuthUtil;
 import cc.iotkit.common.satoken.utils.LoginHelper;
+import cc.iotkit.common.utils.StringUtils;
 import cc.iotkit.data.manager.IAlertConfigData;
 import cc.iotkit.data.manager.IAlertRecordData;
 import cc.iotkit.manager.dto.vo.ruleinfo.RuleInfoVo;
@@ -24,6 +25,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Objects;
+
 @Slf4j
 @Service
 public class AlertService {
@@ -54,4 +57,20 @@ public class AlertService {
     public Paging<AlertRecord> selectAlertRecordPage(PageRequest<AlertRecord> request) {
         return alertRecordData.selectAlertRecordPage(request);
     }
+
+    public void addAlert(AlertConfig config, String content) {
+        AlertRecord alertRecord = AlertRecord.builder()
+                .tenantId(config.getTenantId())
+                .uid(config.getUid())
+                .createDept(config.getCreateDept())
+                .createBy(config.getCreateBy())
+                .updateBy(config.getUpdateBy())
+                .level(config.getLevel())
+                .name(config.getName())
+                .readFlg(false)
+                .alertTime(System.currentTimeMillis())
+                .details(content)
+                .build();
+        alertRecordData.save(alertRecord);
+    }
 }

+ 5 - 0
iot-module/iot-message-notify/pom.xml

@@ -13,6 +13,11 @@
 
     <dependencies>
 
+        <dependency>
+            <groupId>cc.iotkit</groupId>
+            <artifactId>iot-common-core</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>io.vertx</groupId>
             <artifactId>vertx-web-client</artifactId>

+ 4 - 2
iot-module/iot-message-notify/src/main/java/cc/iotkit/message/listener/DingTalkEventListener.java

@@ -1,6 +1,7 @@
 package cc.iotkit.message.listener;
 
 import cc.iotkit.message.config.VertxManager;
+import cc.iotkit.message.event.MessageEvent;
 import cc.iotkit.message.model.DingTalkMessage;
 import cc.iotkit.message.model.Message;
 import io.vertx.ext.web.client.WebClient;
@@ -19,8 +20,9 @@ public class DingTalkEventListener implements MessageEventListener {
     private String baseUrl = "https://oapi.dingtalk.com/robot/send?access_token=%s";
 
     @Override
-    @EventListener(condition = "message.channel()='DingTalk'")
-    public void doEvent(Message message) {
+    @EventListener(classes = MessageEvent.class, condition = "#event.message.channel=='DingTalk'")
+    public void doEvent(MessageEvent event) {
+        Message message = event.getMessage();
         WebClient client = WebClient.create(VertxManager.INSTANCE.getVertx());
         String url = String.format(baseUrl, message.getKey());
         DingTalkMessage qyWechatMessage = DingTalkMessage.builder()

+ 14 - 6
iot-module/iot-message-notify/src/main/java/cc/iotkit/message/listener/EmailEventListener.java

@@ -1,5 +1,7 @@
 package cc.iotkit.message.listener;
 
+import cc.iotkit.common.utils.JsonUtils;
+import cc.iotkit.message.event.MessageEvent;
 import cc.iotkit.message.model.EmailConfig;
 import cc.iotkit.message.model.Message;
 import lombok.extern.slf4j.Slf4j;
@@ -22,9 +24,12 @@ import java.util.Properties;
 public class EmailEventListener implements MessageEventListener {
 
     @Override
-    @EventListener(condition = "message.channel()='Email'")
-    public void doEvent(Message message) {
-        EmailConfig emailConfig = new EmailConfig();
+    @EventListener(classes = MessageEvent.class, condition = "#event.message.channel=='Email'")
+    public void doEvent(MessageEvent event) {
+        Message message = event.getMessage();
+        String channelConfig = message.getChannelConfig();
+        EmailConfig emailConfig = JsonUtils.parse(channelConfig, EmailConfig.class);
+//        EmailConfig emailConfig = new EmailConfig();
         JavaMailSenderImpl jms = new JavaMailSenderImpl();
         jms.setHost(emailConfig.getHost());
         jms.setUsername(emailConfig.getUserName());
@@ -35,19 +40,22 @@ public class EmailEventListener implements MessageEventListener {
         jms.setJavaMailProperties(p);
         MimeMessage mimeMessage = jms.createMimeMessage();
         try {
-            String content = getContent(message);
+//            String content = getContent(message);
+            String content = message.getFormatContent();
             MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
             //收件人
             String[] split = emailConfig.getTo().split(",");
             messageHelper.setTo(split);
+//            //标题
+//            messageHelper.setSubject(emailConfig.getTitle());
             //标题
-            messageHelper.setSubject(emailConfig.getTitle());
+            messageHelper.setSubject(content.substring(0, Math.min(20, content.length())));
             //内容
             messageHelper.setText(content, true);
             //发件人
             messageHelper.setFrom(emailConfig.getFrom());
             jms.send(mimeMessage);
-        } catch (MessagingException e) {
+        } catch (Exception e) {
             log.error("发送邮件失败.", e);
         }
     }

+ 4 - 3
iot-module/iot-message-notify/src/main/java/cc/iotkit/message/listener/MessageEventListener.java

@@ -1,5 +1,6 @@
 package cc.iotkit.message.listener;
 
+import cc.iotkit.message.event.MessageEvent;
 import cc.iotkit.message.model.Message;
 
 import java.util.Map;
@@ -11,13 +12,13 @@ import java.util.Map;
  **/
 public interface MessageEventListener {
 
-    void doEvent(Message message);
+    void doEvent(MessageEvent event);
 
     default String getContent(Message message) {
         String content = message.getContent();
-        Map<String, String> param = message.getParam();
+        Map<String, Object> param = message.getParam();
         for (String key : param.keySet()) {
-            content = content.replaceAll("${" + key + "}", param.get(key));
+            content = content.replaceAll("${" + key + "}", param.get(key).toString());
         }
         return content;
     }

+ 4 - 2
iot-module/iot-message-notify/src/main/java/cc/iotkit/message/listener/QyWechatEventListener.java

@@ -1,6 +1,7 @@
 package cc.iotkit.message.listener;
 
 import cc.iotkit.message.config.VertxManager;
+import cc.iotkit.message.event.MessageEvent;
 import cc.iotkit.message.model.Message;
 import cc.iotkit.message.model.QyWechatMessage;
 import io.vertx.ext.web.client.WebClient;
@@ -20,8 +21,9 @@ public class QyWechatEventListener implements MessageEventListener {
     private String baseUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=%s";
 
     @Override
-    @EventListener(condition = "message.channel()='QyWechat'")
-    public void doEvent(Message message) {
+    @EventListener(classes = MessageEvent.class, condition = "#event.message.channel=='QyWechat'")
+    public void doEvent(MessageEvent event) {
+        Message message = event.getMessage();
         WebClient client = WebClient.create(VertxManager.INSTANCE.getVertx());
         String url = String.format(baseUrl, message.getKey());
         QyWechatMessage qyWechatMessage = QyWechatMessage.builder()

+ 13 - 0
iot-module/iot-message-notify/src/main/java/cc/iotkit/message/model/DingTalkConfig.java

@@ -0,0 +1,13 @@
+package cc.iotkit.message.model;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author sjg
+ */
+@Data
+public class DingTalkConfig implements Serializable {
+    private String dingTalkWebhook;
+}

+ 18 - 1
iot-module/iot-message-notify/src/main/java/cc/iotkit/message/model/Message.java

@@ -1,6 +1,9 @@
 package cc.iotkit.message.model;
 
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.util.Map;
 
@@ -10,10 +13,24 @@ import java.util.Map;
  * description:
  **/
 @Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
 public class Message {
     private String key;
     private String content;
-    private Map<String, String> param;
+    private Map<String, Object> param;
     private Long channelId;
     private String channel;
+    private String channelConfig;
+    private Long alertConfigId;
+
+    public String getFormatContent() {
+        String fmt = content;
+        for (String key : param.keySet()) {
+            Object val = param.get(key);
+            fmt = fmt.replace("${" + key + "}", val == null ? "" : val.toString());
+        }
+        return fmt;
+    }
 }

+ 13 - 0
iot-module/iot-message-notify/src/main/java/cc/iotkit/message/model/QyWechatConfig.java

@@ -0,0 +1,13 @@
+package cc.iotkit.message.model;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author sjg
+ */
+@Data
+public class QyWechatConfig implements Serializable {
+    private String qyWechatWebhook;
+}

+ 37 - 0
iot-module/iot-message-notify/src/main/java/cc/iotkit/message/notify/EventManager.java

@@ -0,0 +1,37 @@
+package cc.iotkit.message.notify;
+
+import cc.iotkit.message.event.MessageEvent;
+import cc.iotkit.message.listener.MessageEventListener;
+import cc.iotkit.message.model.Message;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * author: 石恒
+ * date: 2023-05-08 15:17
+ * description:
+ **/
+public class EventManager {
+
+    Map<Enum<EventType>, List<MessageEventListener>> listeners = new HashMap<>();
+
+    public void subscribe(Enum<EventType> eventType, MessageEventListener listener) {
+        List<MessageEventListener> users = listeners.get(eventType);
+        users.add(listener);
+    }
+
+    public void unsubscribe(Enum<EventType> eventType, MessageEventListener listener) {
+        List<MessageEventListener> users = listeners.get(eventType);
+        users.remove(listener);
+    }
+
+    public void notify(Enum<EventType> eventType, Message result) {
+        List<MessageEventListener> users = listeners.get(eventType);
+        for (MessageEventListener listener : users) {
+            listener.doEvent(new MessageEvent(result));
+        }
+    }
+
+}

+ 10 - 0
iot-module/iot-message-notify/src/main/java/cc/iotkit/message/notify/EventType.java

@@ -0,0 +1,10 @@
+package cc.iotkit.message.notify;
+
+/**
+ * author: 石恒
+ * date: 2023-05-08 15:21
+ * description:
+ **/
+public enum EventType {
+    MQ, Message
+}

+ 3 - 2
iot-module/iot-message-notify/src/main/java/cc/iotkit/message/service/MessageService.java

@@ -3,6 +3,7 @@ package cc.iotkit.message.service;
 import cc.iotkit.message.event.MessageEvent;
 import cc.iotkit.message.model.Message;
 import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 
@@ -11,12 +12,12 @@ import javax.annotation.Resource;
  * date: 2023-05-08 16:02
  * description:
  **/
+@Service
 public class MessageService {
     @Resource
     private ApplicationEventPublisher applicationEventPublisher;
 
-    public void sendMessage() {
-        Message message = new Message();
+    public void sendMessage(Message message) {
         applicationEventPublisher.publishEvent(new MessageEvent(message));
     }
 

+ 4 - 0
iot-module/iot-rule-engine/pom.xml

@@ -103,6 +103,10 @@
             <groupId>io.vertx</groupId>
             <artifactId>vertx-kafka-client</artifactId>
         </dependency>
+        <dependency>
+            <groupId>cc.iotkit</groupId>
+            <artifactId>iot-message-notify</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 1 - 0
iot-module/iot-rule-engine/src/main/java/cc/iotkit/ruleengine/action/ScriptService.java

@@ -30,6 +30,7 @@ public class ScriptService {
     private IDeviceInfoData deviceInfoData;
 
     public void setScript(String script) {
+        this.script=script;
         scriptEngine.setScript(script);
     }
 

+ 4 - 4
iot-module/iot-rule-engine/src/main/java/cc/iotkit/ruleengine/action/alert/AlertAction.java

@@ -21,13 +21,13 @@ import java.util.List;
 @NoArgsConstructor
 @AllArgsConstructor
 @Data
-public class AlertAction implements Action<AlertService<?>> {
+public class AlertAction implements Action<AlertService> {
 
-    public static final String TYPE = "alarm";
+    public static final String TYPE = "alert";
 
     private String type;
 
-    private List<AlertService<?>> services;
+    private List<AlertService> services;
 
     @Override
     public String getType() {
@@ -37,7 +37,7 @@ public class AlertAction implements Action<AlertService<?>> {
     @Override
     public List<String> execute(ThingModelMessage msg) {
         List<String> results = new ArrayList<>();
-        for (AlertService<?> service : services) {
+        for (AlertService service : services) {
             results.add(service.execute(msg));
         }
         return results;

+ 12 - 3
iot-module/iot-rule-engine/src/main/java/cc/iotkit/ruleengine/action/alert/AlertService.java

@@ -10,6 +10,8 @@
 package cc.iotkit.ruleengine.action.alert;
 
 import cc.iotkit.common.thing.ThingModelMessage;
+import cc.iotkit.message.model.Message;
+import cc.iotkit.message.service.MessageService;
 import cc.iotkit.ruleengine.action.ScriptService;
 import cc.iotkit.ruleengine.alert.Alerter;
 import com.fasterxml.jackson.core.type.TypeReference;
@@ -24,9 +26,13 @@ import java.util.Map;
 @Slf4j
 @Data
 public class AlertService<T extends Alerter> extends ScriptService {
-    private String configId;
+//    private String configId;
+//
+//    private T alert;
 
-    private T alert;
+    private Message message;
+
+    private MessageService messageService;
 
     @SneakyThrows
     public String execute(ThingModelMessage msg) {
@@ -37,6 +43,9 @@ public class AlertService<T extends Alerter> extends ScriptService {
             log.warn("execScript result is null");
             return "execScript result is null";
         }
-        return alert.send(result);
+        message.setParam(result);
+        messageService.sendMessage(message);
+        return "ok";
+//        return alert.send(result);
     }
 }

+ 64 - 2
iot-module/iot-rule-engine/src/main/java/cc/iotkit/ruleengine/rule/RuleManager.java

@@ -13,12 +13,19 @@ import cc.iotkit.common.api.PageRequest;
 import cc.iotkit.common.api.Paging;
 import cc.iotkit.common.utils.JsonUtils;
 import cc.iotkit.common.utils.StringUtils;
-import cc.iotkit.data.manager.IDeviceInfoData;
-import cc.iotkit.data.manager.IRuleInfoData;
+import cc.iotkit.data.manager.*;
+import cc.iotkit.message.model.Message;
+import cc.iotkit.message.service.MessageService;
+import cc.iotkit.model.alert.AlertConfig;
+import cc.iotkit.model.notify.Channel;
+import cc.iotkit.model.notify.ChannelConfig;
+import cc.iotkit.model.notify.ChannelTemplate;
 import cc.iotkit.model.rule.FilterConfig;
 import cc.iotkit.model.rule.RuleAction;
 import cc.iotkit.model.rule.RuleInfo;
 import cc.iotkit.ruleengine.action.Action;
+import cc.iotkit.ruleengine.action.alert.AlertAction;
+import cc.iotkit.ruleengine.action.alert.AlertService;
 import cc.iotkit.ruleengine.action.device.DeviceAction;
 import cc.iotkit.ruleengine.action.device.DeviceActionService;
 import cc.iotkit.ruleengine.action.http.HttpAction;
@@ -68,6 +75,21 @@ public class RuleManager {
     @Autowired
     private DeviceActionService deviceActionService;
 
+    @Autowired
+    private IAlertConfigData alertConfigData;
+
+    @Autowired
+    private IChannelTemplateData channelTemplateData;
+
+    @Autowired
+    private IChannelConfigData channelConfigData;
+
+    @Autowired
+    private IChannelData channelData;
+
+    @Autowired
+    private MessageService messageService;
+
     public RuleManager() {
         ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
         executorService.schedule(this::initRules, 1, TimeUnit.SECONDS);
@@ -196,6 +218,46 @@ public class RuleManager {
                 service.initLink(ruleId);
             }
             return tcpAction;
+        } else if (AlertAction.TYPE.equals(type)) {
+            List<AlertConfig> alertConfigs = alertConfigData.findAllByCondition(AlertConfig.builder()
+                    .ruleInfoId(ruleId)
+                    .build());
+
+            AlertAction alertAction = parse(config, AlertAction.class);
+            String script = alertAction.getServices().get(0).getScript();
+
+            List<AlertService> alertServices = new ArrayList<>();
+            for (AlertConfig alertConfig : alertConfigs) {
+                if (alertConfig.getEnable() != null && !alertConfig.getEnable()) {
+                    continue;
+                }
+
+                AlertService service = new AlertService();
+                service.setScript(script);
+                service.setDeviceInfoData(deviceInfoData);
+                service.setMessageService(messageService);
+
+                ChannelTemplate channelTemplate = channelTemplateData.findById(Long.parseLong(alertConfig.getMessageTemplateId()));
+                Long channelConfigId = channelTemplate.getChannelConfigId();
+
+                Message message = Message.builder()
+                        .content(channelTemplate.getContent())
+                        .alertConfigId(alertConfig.getId())
+                        .build();
+
+                if (channelConfigId != null) {
+                    ChannelConfig channelConfig = channelConfigData.findById(channelTemplate.getChannelConfigId());
+                    Channel channel = channelData.findById(channelConfig.getChannelId());
+                    message.setChannel(channel.getCode());
+                    message.setChannelId(channel.getId());
+                    message.setChannelConfig(channelConfig.getParam());
+                }
+
+                service.setMessage(message);
+                alertServices.add(service);
+            }
+            alertAction.setServices(alertServices);
+            return alertAction;
         }
         return null;
     }

+ 1 - 1
iot-starter/src/main/java/cc/iotkit/Application.java

@@ -31,7 +31,7 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc;
 public class Application implements SpringBootstrap {
 
     public static void main(String[] args) {
-        System.setProperty("disabledEmbeddedEs", "true");
+//        System.setProperty("disabledEmbeddedEs", "true");
         System.setProperty("disabledEmbeddedRedis", "true");
         if (EmbeddedElasticSearchConfig.embeddedEnable()) {
             EmbeddedElasticSearchConfig.startEmbeddedElasticSearch();

+ 1 - 0
iot-starter/src/main/java/cc/iotkit/config/EmbeddedRedisConfig.java

@@ -22,6 +22,7 @@ public class EmbeddedRedisConfig {
     public static void startEmbeddedRedisServer() {
         RedisServer redisServer;
         String os = System.getProperty("os.name").toLowerCase();
+        log.info("start embedded Redis Server ");
         if (os.contains("windows")) {
             redisServer = RedisServer.builder().setting("maxheap 200m")
                     .port(6379)