Browse Source

合并代码

gaoyu 3 years ago
parent
commit
c25cd4d2f8
27 changed files with 1931 additions and 206 deletions
  1. 1 1
      src/main/java/com/persagy/apm/dmpalarm/config/DmpMessageAspect.java
  2. 37 3
      src/main/java/com/persagy/apm/dmpalarm/controller/AlarmCommentController.java
  3. 85 3
      src/main/java/com/persagy/apm/dmpalarm/controller/AlarmConfigController.java
  4. 25 2
      src/main/java/com/persagy/apm/dmpalarm/controller/AlarmItemController.java
  5. 16 6
      src/main/java/com/persagy/apm/dmpalarm/controller/AlarmLogController.java
  6. 3 1
      src/main/java/com/persagy/apm/dmpalarm/controller/AlarmRecordController.java
  7. 31 6
      src/main/java/com/persagy/apm/dmpalarm/controller/AlarmTargetController.java
  8. 18 2
      src/main/java/com/persagy/apm/dmpalarm/criteria/CriteriaUtils.java
  9. 30 2
      src/main/java/com/persagy/apm/dmpalarm/model/AlarmConfig.java
  10. 2 1
      src/main/java/com/persagy/apm/dmpalarm/model/AlarmItem.java
  11. 7 3
      src/main/java/com/persagy/apm/dmpalarm/model/AlarmTarget.java
  12. 9 1
      src/main/java/com/persagy/apm/dmpalarm/service/IAlarmCommentService.java
  13. 25 3
      src/main/java/com/persagy/apm/dmpalarm/service/IAlarmConfigService.java
  14. 20 1
      src/main/java/com/persagy/apm/dmpalarm/service/IAlarmItemService.java
  15. 12 0
      src/main/java/com/persagy/apm/dmpalarm/service/IAlarmLogService.java
  16. 28 2
      src/main/java/com/persagy/apm/dmpalarm/service/IAlarmTargetService.java
  17. 50 0
      src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmCommentServiceImpl.java
  18. 808 2
      src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmConfigServiceImpl.java
  19. 185 2
      src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmItemServiceImpl.java
  20. 102 25
      src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmLogServiceImpl.java
  21. 35 60
      src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmRecordServiceImpl.java
  22. 322 4
      src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmTargetServiceImpl.java
  23. 4 0
      src/main/java/com/persagy/apm/dmpalarm/service/impl/BaseServiceImpl.java
  24. 73 73
      src/main/resources/bootstrap.yml
  25. 1 1
      src/main/resources/mapper/AlarmConfigMapper.xml
  26. 1 1
      src/main/resources/mapper/AlarmItemMapper.xml
  27. 1 1
      src/main/resources/mapper/AlarmTargetMapper.xml

+ 1 - 1
src/main/java/com/persagy/apm/dmpalarm/config/DmpMessageAspect.java

@@ -23,7 +23,7 @@ public class DmpMessageAspect {
 	@Autowired
 	private MessageProcesser messageProcesser;
 
-	@Pointcut("execution(public * com.persagy.dmp.*.controller.*.*(..))")
+	@Pointcut("execution(public * com.persagy.apm.*.controller.*.*(..))")
 	public void controllerPoint() {
 	}
 

+ 37 - 3
src/main/java/com/persagy/apm/dmpalarm/controller/AlarmCommentController.java

@@ -1,7 +1,15 @@
 package com.persagy.apm.dmpalarm.controller;
 
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.jms.MessageProcesser;
+import com.persagy.apm.dmpalarm.model.AlarmComment;
+import com.persagy.apm.dmpalarm.model.DmpMessage;
+import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -9,18 +17,44 @@ import com.persagy.apm.dmpalarm.service.IAlarmCommentService;
 
 import io.swagger.annotations.Api;
 
+import javax.annotation.Resource;
+
 /**
  * 报警批注控制层
+ *
  * @author lixing
  * @version V1.0 2021-12-09 10:43:56
  */
-@Api(tags = "报警批注") 
+@Api(tags = "报警批注")
 @Validated
 @RestController
 @RequestMapping("/alarm/comment")
 public class AlarmCommentController {
-    @Autowired
+    @Resource
     private IAlarmCommentService alarmCommentService;
- 
+    @Resource
+    private MessageProcesser messageProcesser;
+
+    @PostMapping("/query")
+    public PagedResponse<AlarmComment> query(@RequestBody JsonCriteria criteria) {
+        return alarmCommentService.query(criteria);
+    }
+
+    @PostMapping("/create")
+    public MapResponse create(@RequestBody AlarmComment param) {
+        return alarmCommentService.create(param);
+    }
+
+    @PostMapping("/sendMessage")
+    public MapResponse update(@RequestBody AlarmComment param) {
+        for (int i = 0; i < 2000; i++) {
+            DmpMessage dmpMessage = new DmpMessage();
+            dmpMessage.setMid(String.valueOf(i));
+            dmpMessage.setType("sleep");
+            messageProcesser.convertAndSend(dmpMessage);
+        }
+        return new MapResponse();
+    }
+
 }
 

+ 85 - 3
src/main/java/com/persagy/apm/dmpalarm/controller/AlarmConfigController.java

@@ -1,7 +1,13 @@
 package com.persagy.apm.dmpalarm.controller;
 
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.model.AlarmConfig;
+import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -9,19 +15,95 @@ import com.persagy.apm.dmpalarm.service.IAlarmConfigService;
 
 import io.swagger.annotations.Api;
 
+import javax.annotation.Resource;
+import java.util.List;
+
 /**
  * 报警定义控制层
+ *
  * @author lixing
  * @version V1.0 2021-12-09 10:43:56
  */
-@Api(tags = "报警定义") 
+@Api(tags = "报警定义")
 @Validated
 @RestController
 @RequestMapping("/alarm/config")
 public class AlarmConfigController {
-    @Autowired
+    @Resource
     private IAlarmConfigService alarmConfigService;
 
-	 
+    @PostMapping("/query")
+    public PagedResponse<AlarmConfig> query(@RequestBody JsonCriteria criteria) {
+        return alarmConfigService.query(criteria);
+    }
+
+    @PostMapping("/create")
+    public MapResponse create(@RequestBody AlarmConfig alarmConfig) {
+        return alarmConfigService.create(alarmConfig);
+    }
+
+    /**
+     * @description: 批量创建报警定义
+     * @param: param
+     * @return: com.persagy.common.web.MapResponse
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/22 2:37 下午
+     * @version: V1.0
+     */
+    @PostMapping("/batch_create")
+    public MapResponse batchCreate(@RequestBody AlarmConfig alarmConfig) {
+        List<AlarmConfig> configModels = alarmConfig.getAlarmConfigs();
+        if (configModels == null) {
+            MapResponse response = new MapResponse();
+            response.setFail("请传入要创建的报警定义!");
+            return response;
+        }
+        return alarmConfigService.batchCreate(configModels);
+    }
+
+    @PostMapping("/update")
+    public MapResponse update(@RequestBody AlarmConfig param) {
+        return alarmConfigService.update(param);
+    }
+
+    /**
+     * @description: 批量更新报警定义
+     * @param: param
+     * @return: com.persagy.common.web.MapResponse
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/22 2:37 下午
+     * @version: V1.0
+     */
+    @PostMapping("/batch_update")
+    public MapResponse batchUpdate(@RequestBody AlarmConfig alarmConfig) {
+        List<AlarmConfig> configModels = alarmConfig.getAlarmConfigs();
+        if (configModels == null) {
+            MapResponse response = new MapResponse();
+            response.setFail("请传入要修改的报警定义!");
+            return response;
+        }
+        return alarmConfigService.batchUpdate(configModels);
+    }
+
+    @PostMapping("/delete")
+    public MapResponse delete(@RequestBody AlarmConfig alarmConfig) {
+        return alarmConfigService.delete(alarmConfig);
+    }
+
+    @PostMapping("/batch_delete")
+    public MapResponse batchDelete(@RequestBody AlarmConfig alarmConfig) {
+        return alarmConfigService.batchDelete(alarmConfig);
+    }
+
+
+    @PostMapping("/init")
+    public MapResponse init(@RequestBody AlarmConfig alarmConfig) {
+        return alarmConfigService.init(alarmConfig);
+    }
+
 }
 

+ 25 - 2
src/main/java/com/persagy/apm/dmpalarm/controller/AlarmItemController.java

@@ -1,7 +1,13 @@
 package com.persagy.apm.dmpalarm.controller;
 
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.model.AlarmItem;
+import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -9,6 +15,8 @@ import com.persagy.apm.dmpalarm.service.IAlarmItemService;
 
 import io.swagger.annotations.Api;
 
+import javax.annotation.Resource;
+
 /**
  * 报警条目控制层
  * @author lixing
@@ -19,8 +27,23 @@ import io.swagger.annotations.Api;
 @RestController
 @RequestMapping("/alarm/item")
 public class AlarmItemController {
-    @Autowired
+    @Resource
     private IAlarmItemService alarmItemService;
- 
+
+
+    @PostMapping("/query")
+    public PagedResponse<AlarmItem> query(@RequestBody JsonCriteria criteria) {
+        return alarmItemService.query(criteria);
+    }
+
+    @PostMapping("/create")
+    public MapResponse create(@RequestBody AlarmItem param){
+        return alarmItemService.create(param);
+    }
+
+    @PostMapping("/update")
+    public MapResponse update(@RequestBody AlarmItem param){
+        return alarmItemService.update(param);
+    }
 }
 

+ 16 - 6
src/main/java/com/persagy/apm/dmpalarm/controller/AlarmLogController.java

@@ -1,5 +1,7 @@
 package com.persagy.apm.dmpalarm.controller;
 
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -13,22 +15,30 @@ import com.persagy.apm.dmpalarm.web.MapResponse;
 
 import io.swagger.annotations.Api;
 
+import javax.annotation.Resource;
+
 /**
  * 报警日志控制层
+ *
  * @author lixing
  * @version V1.0 2021-12-09 10:43:56
  */
-@Api(tags = "报警日志") 
+@Api(tags = "报警日志")
 @Validated
 @RestController
 @RequestMapping("/alarm/log")
 public class AlarmLogController {
-    @Autowired
+    @Resource
     private IAlarmLogService alarmLogService;
-    
+
+    @PostMapping("/query")
+    public PagedResponse<AlarmLog> query(@RequestBody JsonCriteria criteria) {
+        return alarmLogService.query(criteria);
+    }
+
     @PostMapping("/create")
-	public MapResponse create(@RequestBody AlarmLog param){
-		return alarmLogService.create(param);
-	}
+    public MapResponse create(@RequestBody AlarmLog param) {
+        return alarmLogService.create(param);
+    }
 }
 

+ 3 - 1
src/main/java/com/persagy/apm/dmpalarm/controller/AlarmRecordController.java

@@ -15,6 +15,8 @@ import com.persagy.apm.dmpalarm.web.PagedResponse;
 
 import io.swagger.annotations.Api;
 
+import javax.annotation.Resource;
+
 /**
  * 报警记录控制层
  * 
@@ -27,7 +29,7 @@ import io.swagger.annotations.Api;
 @RequestMapping("/alarm/record")
 public class AlarmRecordController {
 
-	@Autowired
+	@Resource
 	private IAlarmRecordService alarmRecordService;
 
 	@PostMapping("/query")

+ 31 - 6
src/main/java/com/persagy/apm/dmpalarm/controller/AlarmTargetController.java

@@ -1,26 +1,51 @@
 package com.persagy.apm.dmpalarm.controller;
 
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.model.AlarmTarget;
+import com.persagy.apm.dmpalarm.service.IAlarmTargetService;
+import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
+import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.persagy.apm.dmpalarm.service.IAlarmTargetService;
-
-import io.swagger.annotations.Api;
+import javax.annotation.Resource;
 
 /**
  * 报警匹配条件控制层
+ *
  * @author lixing
  * @version V1.0 2021-12-09 10:43:56
  */
-@Api(tags = "报警匹配条件") 
+@Api(tags = "报警匹配条件")
 @Validated
 @RestController
 @RequestMapping("/alarm/target")
 public class AlarmTargetController {
-    @Autowired
+    @Resource
     private IAlarmTargetService alarmTargetService;
- 
+
+    @PostMapping("/query")
+    public PagedResponse<AlarmTarget> query(@RequestBody JsonCriteria criteria) {
+        return alarmTargetService.query(criteria);
+    }
+    @PostMapping("/create")
+    public MapResponse create(@RequestBody AlarmTarget param) {
+        return alarmTargetService.create(param);
+    }
+
+    @PostMapping("/update")
+    public MapResponse update(@RequestBody AlarmTarget param) {
+        return alarmTargetService.update(param);
+    }
+
+    @PostMapping("/delete")
+    public MapResponse delete(@RequestBody AlarmTarget param) {
+        return alarmTargetService.delete(param);
+    }
 }
 

+ 18 - 2
src/main/java/com/persagy/apm/dmpalarm/criteria/CriteriaUtils.java

@@ -10,6 +10,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.persagy.apm.dmpalarm.model.AlarmLog;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
 import org.springframework.stereotype.Component;
 
 import com.alibaba.fastjson.JSONObject;
@@ -120,6 +124,19 @@ public class CriteriaUtils {
 		return new QueryWrapper<T>(t);
 	}
 
+	public <T> PagedResponse<T> getPagedResponse(JsonCriteria criteria , Class<T> classes , QueryWrapper<T> queryWrapper , BaseMapper<T> baseMapper){
+		PagedResponse<T> pagedResponse = new PagedResponse<>();
+		if (criteria.isOnlyCount()) {
+			Integer count = baseMapper.selectCount(queryWrapper);
+			pagedResponse.setCount(count.longValue());
+		} else {
+			Page<T> page = baseMapper.selectPage(new Page<>(criteria.getPage(), criteria.getSize()), queryWrapper);
+			pagedResponse.setCount(page.getTotal());
+			pagedResponse.setData(page.getRecords());
+		}
+		return pagedResponse;
+	}
+
 	/**
 	 * 类型转换
 	 * 
@@ -147,8 +164,7 @@ public class CriteriaUtils {
 	}
 	/**
 	 * 批量类型转换
-	 * 
-	 * @param obj
+	 *
 	 * @return
 	 */
 	private Collection<?> typeConversion(Collection<?> coll, String typeName) {

+ 30 - 2
src/main/java/com/persagy/apm/dmpalarm/model/AlarmConfig.java

@@ -1,5 +1,6 @@
 package com.persagy.apm.dmpalarm.model;
 
+import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -7,6 +8,7 @@ import lombok.EqualsAndHashCode;
 import com.persagy.apm.common.model.entity.AuditableEntity;
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 报警定义(AlarmConfig)实体类
@@ -47,7 +49,7 @@ public class AlarmConfig extends AuditableEntity<AlarmConfig> implements Seriali
     private String remark;
     
     @ApiModelProperty("触发条件")
-    private Object condition;
+    private JSONObject condition;
     
     @ApiModelProperty("屏蔽状态 1-open、0- 屏蔽")
     private Integer open;
@@ -69,7 +71,33 @@ public class AlarmConfig extends AuditableEntity<AlarmConfig> implements Seriali
     
     @ApiModelProperty("更新时间")
     private Date updateTime;
-    
+
+    private List<AlarmConfig> alarmConfigs;
+
+    /**
+     * @description: <p>报警定义唯一标识; 当报警条目和报警匹配条件变化时会重新生成报警定义,
+     * 因此在与其他系统进行通讯时,一般不使用报警定义的id作为其唯一标识,而是使用itemCode + objID作为其唯一标识</p>
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/26 11:25 上午
+     * @version: V1.0
+     */
+    @Data
+    public class AlarmConfigUnique {
+        private String itemCode;
+        private String objId;
+        private String targetId;
+
+        AlarmConfigUnique(String itemCode, String objId, String targetId) {
+            this.itemCode = itemCode;
+            this.objId = objId;
+            this.targetId = targetId;
+        }
+    }
+
+    public AlarmConfigUnique getAlarmConfigUnique() {
+        return new AlarmConfigUnique(this.itemCode, this.objId, this.targetId);
+    }
 
     public static String PROP_OBJ_ID = "obj_id";
     public static String PROP_CLASS_CODE = "class_code";

+ 2 - 1
src/main/java/com/persagy/apm/dmpalarm/model/AlarmItem.java

@@ -1,5 +1,6 @@
 package com.persagy.apm.dmpalarm.model;
 
+import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -35,7 +36,7 @@ public class AlarmItem extends AuditableEntity<AlarmItem> implements Serializabl
     private String remark;
     
     @ApiModelProperty("触发条件")
-    private Object condition;
+    private JSONObject condition;
     
     @ApiModelProperty("处理算法")
     private String dealFun;

+ 7 - 3
src/main/java/com/persagy/apm/dmpalarm/model/AlarmTarget.java

@@ -1,5 +1,6 @@
 package com.persagy.apm.dmpalarm.model;
 
+import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -13,11 +14,12 @@ import java.util.Date;
  * @author lixing
  * @version V1.0 2021-12-09 10:44:53
  */
-@EqualsAndHashCode(callSuper = true)
 @Data
 @ApiModel(description = "报警匹配条件")
-public class AlarmTarget extends AuditableEntity<AlarmTarget> implements Serializable {
+public class AlarmTarget implements Serializable {
     private static final long serialVersionUID = 584249238241159229L;
+    @ApiModelProperty("主键")
+    private String id;
 
     @ApiModelProperty("报警条目id")
     private String itemCode;
@@ -26,7 +28,7 @@ public class AlarmTarget extends AuditableEntity<AlarmTarget> implements Seriali
     private String classCode;
     
     @ApiModelProperty("触发条件")
-    private Object condition;
+    private JSONObject condition;
     
     @ApiModelProperty("报警等级")
     private String level;
@@ -54,6 +56,8 @@ public class AlarmTarget extends AuditableEntity<AlarmTarget> implements Seriali
     
     @ApiModelProperty("集团编码")
     private String groupCode;
+
+    private Integer valid;
     
 
     public static String PROP_ITEM_CODE = "item_code";

+ 9 - 1
src/main/java/com/persagy/apm/dmpalarm/service/IAlarmCommentService.java

@@ -1,5 +1,10 @@
 package com.persagy.apm.dmpalarm.service;
 
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.model.AlarmComment;
+import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
+
 /**
  * 报警批注(AlarmComment) service接口
  *
@@ -7,5 +12,8 @@ package com.persagy.apm.dmpalarm.service;
  * @version V1.0 2021-12-09 10:44:19
  */
 public interface IAlarmCommentService  {
-    
+
+    public PagedResponse<AlarmComment> query(JsonCriteria criteria);
+
+    public MapResponse create(AlarmComment param);
 }

+ 25 - 3
src/main/java/com/persagy/apm/dmpalarm/service/IAlarmConfigService.java

@@ -1,12 +1,34 @@
 package com.persagy.apm.dmpalarm.service;
 
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.model.AlarmConfig;
+import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
+
+import java.util.List;
+
 /**
  * 报警定义(AlarmConfig) service接口
  *
  * @author lixing
  * @version V1.0 2021-12-09 10:44:19
  */
-public interface IAlarmConfigService  {
-    
- 
+public interface IAlarmConfigService {
+
+
+    public PagedResponse<AlarmConfig> query(JsonCriteria criteria);
+
+    public MapResponse create(AlarmConfig alarmConfig);
+
+    public MapResponse batchCreate(List<AlarmConfig> alarmConfigList);
+
+    public MapResponse batchUpdate(List<AlarmConfig> alarmConfigList);
+
+    public MapResponse batchDelete(AlarmConfig alarmConfig);
+
+    public MapResponse update(AlarmConfig param);
+
+    public  MapResponse delete(AlarmConfig alarmConfig);
+
+    public  MapResponse init(AlarmConfig alarmConfig);
 }

+ 20 - 1
src/main/java/com/persagy/apm/dmpalarm/service/IAlarmItemService.java

@@ -1,5 +1,13 @@
 package com.persagy.apm.dmpalarm.service;
 
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.model.AlarmItem;
+import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
+
+import java.util.List;
+import java.util.Map;
+
 /**
  * 报警条目(AlarmItem) service接口
  *
@@ -7,5 +15,16 @@ package com.persagy.apm.dmpalarm.service;
  * @version V1.0 2021-12-09 10:44:19
  */
 public interface IAlarmItemService  {
-  
+
+   public Map<String, AlarmItem> getItemCodeModelMap(List<String> itemCodeList);
+
+   public AlarmItem getAlarmItemByItemCode(String itemCode, String projectId, String groupCode, String appId);
+
+   public PagedResponse<AlarmItem> query(JsonCriteria criteria);
+
+   public MapResponse create(AlarmItem param);
+
+   public  MapResponse update(AlarmItem param);
+
+   public List<AlarmItem> queryList(JsonCriteria criteria);
 }

+ 12 - 0
src/main/java/com/persagy/apm/dmpalarm/service/IAlarmLogService.java

@@ -1,7 +1,13 @@
 package com.persagy.apm.dmpalarm.service;
 
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
 import com.persagy.apm.dmpalarm.model.AlarmLog;
 import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 报警日志(AlarmLog) service接口
@@ -12,4 +18,10 @@ import com.persagy.apm.dmpalarm.web.MapResponse;
 public interface IAlarmLogService  {
     
 	public MapResponse create(AlarmLog alarmLog);
+
+    public PagedResponse<AlarmLog> query(JsonCriteria criteria);
+
+    public Map<String, List<AlarmLog>> getAlarmLogMap(List<String> recordIdList);
+
+    public Date getIgnoreAlarmTime(String recordId);
 }

+ 28 - 2
src/main/java/com/persagy/apm/dmpalarm/service/IAlarmTargetService.java

@@ -1,5 +1,16 @@
 package com.persagy.apm.dmpalarm.service;
 
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.model.AlarmItem;
+import com.persagy.apm.dmpalarm.model.AlarmTarget;
+import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
+
+import java.util.List;
+import java.util.Map;
+
 /**
  * 报警匹配条件(AlarmTarget) service接口
  *
@@ -7,6 +18,21 @@ package com.persagy.apm.dmpalarm.service;
  * @version V1.0 2021-12-09 10:44:19
  */
 public interface IAlarmTargetService  {
-    
-   
+
+
+    public PagedResponse<AlarmTarget> query(JsonCriteria criteria);
+
+    public MapResponse create(AlarmTarget param);
+
+    public MapResponse update(AlarmTarget param);
+
+    public MapResponse delete(AlarmTarget param);
+
+    public JSONObject getCondition(AlarmTarget targetModel, AlarmItem itemModel);
+
+    public List<AlarmTarget> getAlarmTargetsByItemCode(String itemCode, String projectId);
+
+    public AlarmTarget get(String targetId);
+
+    public Map<String, AlarmItem> getItemCodeModelMapByModelList(List<AlarmTarget> targets);
 }

+ 50 - 0
src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmCommentServiceImpl.java

@@ -1,9 +1,24 @@
 package com.persagy.apm.dmpalarm.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.persagy.apm.dmpalarm.criteria.CriteriaUtils;
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.utils.CheckRequiredParam;
+import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import com.persagy.apm.dmpalarm.model.AlarmComment;
 import com.persagy.apm.dmpalarm.service.IAlarmCommentService;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
 
 /**
  * 报警批注(AlarmComment) service层
@@ -12,6 +27,41 @@ import com.persagy.apm.dmpalarm.service.IAlarmCommentService;
  * @version V1.0 2021-12-09 10:44:19
  */
 @Service
+@Slf4j
 public class AlarmCommentServiceImpl extends BaseServiceImpl<AlarmComment> implements IAlarmCommentService {
+    @Resource
+    private CriteriaUtils criteriaUtils;
+
+    public PagedResponse<AlarmComment> query(JsonCriteria criteria) {
+        QueryWrapper<AlarmComment> queryWrapper = criteriaUtils.handleAlarmConditions(criteria, AlarmComment.class);
+        try {
+            return criteriaUtils.getPagedResponse(criteria, AlarmComment.class, queryWrapper, getBaseMapper());
+        } catch (Exception e) {
+            log.error("alarmComment query page error JsonCriteria is  {}",criteria.toString(),e);
+        }
+        return new PagedResponse<>();
+    }
 
+    @Transactional
+    public MapResponse create(AlarmComment entity) {
+        MapResponse response = new MapResponse();
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        // 必填项校验
+        String checkResult = CheckRequiredParam.check(entity, "recordId", "content");
+        if (!StringUtils.isEmpty(checkResult)) {
+            response.setFail(checkResult);
+            return response;
+        }
+        entity.setId(UUID.randomUUID().toString());
+        entity.setCreateUser(alarmParam.userId);
+        entity.setProjectId(alarmParam.projectId);
+        entity.setGroupCode(alarmParam.groupCode);
+        entity.setCreateTime(new Date());
+        save(entity);
+        response.add("id", entity.getId());
+        return response;
+    }
 }

+ 808 - 2
src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmConfigServiceImpl.java

@@ -1,9 +1,37 @@
 package com.persagy.apm.dmpalarm.service.impl;
 
-import org.springframework.stereotype.Service;
-
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Lists;
+import com.persagy.apm.dmpalarm.config.DmpParameterStorage;
+import com.persagy.apm.dmpalarm.criteria.CriteriaUtils;
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.enumeration.EnumAlarmMessageType;
+import com.persagy.apm.dmpalarm.jms.MessageProcesser;
 import com.persagy.apm.dmpalarm.model.AlarmConfig;
+import com.persagy.apm.dmpalarm.model.AlarmItem;
+import com.persagy.apm.dmpalarm.model.AlarmTarget;
+import com.persagy.apm.dmpalarm.model.DmpMessage;
 import com.persagy.apm.dmpalarm.service.IAlarmConfigService;
+import com.persagy.apm.dmpalarm.service.IAlarmItemService;
+import com.persagy.apm.dmpalarm.service.IAlarmTargetService;
+import com.persagy.apm.dmpalarm.service.IPhysicalWorldService;
+import com.persagy.apm.dmpalarm.utils.CheckRequiredParam;
+import com.persagy.apm.dmpalarm.utils.DatePatternStyle;
+import com.persagy.apm.dmpalarm.web.BaseResponse;
+import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 报警定义(AlarmConfig) service层
@@ -12,6 +40,784 @@ import com.persagy.apm.dmpalarm.service.IAlarmConfigService;
  * @version V1.0 2021-12-09 10:44:19
  */
 @Service
+@Slf4j
 public class AlarmConfigServiceImpl extends BaseServiceImpl<AlarmConfig> implements IAlarmConfigService {
+    @Resource
+    private MessageProcesser messageProcesser;
+    // @Resource
+    //private AlarmConfigRepository alarmConfigRepository;
+    @Resource
+    private IAlarmItemService alarmItemService;
+    @Resource
+    private IAlarmTargetService alarmTargetService;
+    @Resource
+    private IPhysicalWorldService physicalWorldService;
+    @Resource
+    private CriteriaUtils criteriaUtils;
+
+    public PagedResponse<AlarmConfig> query(JsonCriteria criteria) {
+        QueryWrapper<AlarmConfig> queryWrapper = criteriaUtils.handleAlarmConditions(criteria, AlarmConfig.class);
+        return criteriaUtils.getPagedResponse(criteria, AlarmConfig.class, queryWrapper, getBaseMapper());
+    }
+
+    /**
+     * @description: 当新增对象时,自动生成对应的报警定义
+     * @param: objId 对象id
+     * @param: classCode 对象分类
+     * @param: projectId 项目id
+     * @return: com.persagy.common.web.BaseResponse
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/20 11:30 上午
+     * @version: V1.0
+     */
+    @Transactional
+    public BaseResponse createOnAddObj(String objId, String classCode, String projectId) {
+        BaseResponse response = new BaseResponse();
+        /* 查询根据对象类型查询对应的报警匹配条件 */
+        JsonCriteria criteria = new JsonCriteria();
+        criteria.getCriteria().put("classCode", classCode);
+        criteria.getCriteria().put("projectId", projectId);
+        PagedResponse<AlarmTarget> pagedTargets = alarmTargetService.query(criteria);
+        List<AlarmTarget> targets = pagedTargets.getData();
+        /* 拼装报警定义对象 */
+        if (!CollectionUtils.isEmpty(targets)) {
+            Map<String, AlarmItem> itemCodeModelMap = alarmTargetService.getItemCodeModelMapByModelList(targets);
+            List<AlarmConfig> alarmConfigs = new ArrayList<>(targets.size());
+            for (AlarmTarget targetModel : targets) {
+                /* 拼装报警定义实体 */
+                AlarmItem itemModel = itemCodeModelMap.get(targetModel.getItemCode());
+                // 报警触发条件
+                AlarmConfig entity = generateAlarmConfigEntity(objId, targetModel, itemModel);
+                alarmConfigs.add(entity);
+            }
+            DmpMessage createdMessage = saveAll(alarmConfigs);
+            if (createdMessage != null) {
+                messageProcesser.convertAndSend(createdMessage);
+            }
+            response.setMessage("成功创建对象的相关报警定义,生成条数:" + alarmConfigs.size());
+        } else {
+            response.setMessage("没有查找到对应的匹配条件,不生成报警定义");
+        }
+        return response;
+    }
+
+    /**
+     * @description: 生成报警定义对象
+     * @param: objId 对象id
+     * @param: targetModel 匹配条件
+     * @param: itemModel 报警条目
+     * @return: com.persagy.dmp.alarm.entity.AlarmConfig
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/21 11:09 上午
+     * @version: V1.0
+     */
+    private AlarmConfig generateAlarmConfigEntity(String objId, AlarmTarget targetModel, AlarmItem itemModel) {
+        return generateAlarmConfigEntity(objId, targetModel, itemModel, null);
+    }
+
+    /**
+     * @description: 生成报警定义对象
+     * @param: objId 对象id
+     * @param: targetModel 匹配条件
+     * @param: itemModel 报警条目
+     * @param: condition 触发条件
+     * @return: com.persagy.dmp.alarm.entity.AlarmConfig
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/21 11:09 上午
+     * @version: V1.0
+     */
+    private AlarmConfig generateAlarmConfigEntity(String objId, AlarmTarget targetModel, AlarmItem itemModel, JSONObject condition) {
+        if (condition == null) {
+            condition = alarmTargetService.getCondition(targetModel, itemModel);
+        }
+        AlarmConfig entity = new AlarmConfig();
+        entity.setId(UUID.randomUUID().toString());
+        entity.setObjId(objId);
+        entity.setTargetId(targetModel.getId());
+        entity.setClassCode(targetModel.getClassCode());
+        entity.setProjectId(targetModel.getProjectId());
+        entity.setItemCode(targetModel.getItemCode());
+        entity.setCategory(itemModel.getCategory());
+        entity.setLevel(targetModel.getLevel());
+        entity.setRemark(itemModel.getRemark());
+        entity.setGroupCode(targetModel.getGroupCode());
+        entity.setCondition(condition);
+        entity.setOpen(targetModel.getOpen());
+        entity.setConcern(targetModel.getConcern());
+        entity.setUserDefined(0);
+        entity.setCreateUser("System");
+        entity.setCreateTime(new Date());
+        entity.setValid(1);
+        return entity;
+    }
+
+    /**
+     * @description: 当报警条目修改时,批量更新对应的报警定义
+     * @param: itemCode 报警条目编码
+     * @param: projectId 项目id
+     * @param: groupCode 集团编码
+     * @return: com.persagy.common.web.MapResponse
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/20 11:30 上午
+     * @version: V1.0
+     */
+    @Transactional
+    public MapResponse batchUpdateWhenItemUpdate(String itemCode, String projectId, String groupCode) {
+        MapResponse response = new MapResponse();
+        // 查询报警条目
+        AlarmItem itemModel = alarmItemService.getAlarmItemByItemCode(itemCode, projectId, groupCode, null);
+        if (itemModel == null) {
+            response.setFail("自动生成报警定义失败,获取不到对应的报警条目!itemCode:" + itemCode);
+            return response;
+        }
+        /* 获取报警条目对应的所有匹配条件 */
+        List<AlarmTarget> AlarmTargets = alarmTargetService.getAlarmTargetsByItemCode(itemCode, projectId);
+        if (CollectionUtils.isEmpty(AlarmTargets)) {
+            return response;
+        }
+
+        List<String> classCodes = AlarmTargets.stream().map(AlarmTarget::getClassCode).collect(Collectors.toList());
+        try {
+            /* 获取这些匹配条件对应的设备 */
+            Map<String, Set<String>> codeIdListMap = physicalWorldService.queryCodeIdListMapByClassCodes(projectId, groupCode, classCodes);
+            /* 获取要删除和重新生成的报警定义 */
+            List<AlarmConfig> alarmConfigs2Delete = Lists.newArrayList();
+            List<AlarmConfig> alarmConfigs2Create = Lists.newArrayList();
+            // 按照匹配条件统计要修改的报警定义列表
+            for (AlarmTarget AlarmTarget : AlarmTargets) {
+                String classCode = AlarmTarget.getClassCode();
+                Set<String> objIds = codeIdListMap.get(classCode);
+                Map<String, List<AlarmConfig>> statisticsMap = statisticConfigs2Update(objIds, projectId, AlarmTarget, itemModel);
+                if (statisticsMap == null) {
+                    continue;
+                }
+                if (!CollectionUtils.isEmpty(statisticsMap.get("deleted"))) {
+                    alarmConfigs2Delete.addAll(statisticsMap.get("deleted"));
+                }
+
+                if (!CollectionUtils.isEmpty(statisticsMap.get("created"))) {
+                    alarmConfigs2Create.addAll(statisticsMap.get("created"));
+                }
+            }
+            DmpMessage message = saveAndDeleteAll(alarmConfigs2Create, alarmConfigs2Delete);
+            if (message != null) {
+                messageProcesser.convertAndSend(message);
+            }
+            return response;
+        } catch (Exception e) {
+            response.setFail("调用物理世界接口获取设备类型下的设备失败!");
+            e.printStackTrace();
+            return response;
+        }
+    }
+
+    /**
+     * @description: 当报警匹配条件修改时,批量更新对应的报警定义
+     * @param: itemCode 报警条目编码
+     * @param: classCode 对象类型编码
+     * @param: projectId 项目id
+     * @param: groupCode 集团编码
+     * @return: com.persagy.common.web.MapResponse
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/20 11:30 上午
+     * @version: V1.0
+     */
+    @Transactional
+    public MapResponse batchUpdateWhenTargetUpdate(String targetId, String projectId, String groupCode, String appId) {
+        MapResponse response = new MapResponse();
+        AlarmTarget alarmTarget = alarmTargetService.get(targetId);
+        if (alarmTarget == null) {
+            response.setFail("自动生成报警定义失败,获取不到对应的报警匹配条件!targetId:" + targetId);
+            return response;
+        }
+        String itemCode = alarmTarget.getItemCode();
+        String classCode = alarmTarget.getClassCode();
+
+        /* 获取到报警匹配条件和报警条目对象 */
+        AlarmItem itemModel = alarmItemService.getAlarmItemByItemCode(itemCode, projectId, groupCode, appId);
+        if (itemModel == null) {
+            response.setFail("自动生成报警定义失败,获取不到对应的报警条目!itemCode:" + itemCode);
+            return response;
+        }
+
+        Set<String> objIds = new HashSet<>();
+        try {
+            /* 查询设备类型下的所有设备 */
+            objIds = physicalWorldService.queryObjectIdListByClassCode(projectId, groupCode, classCode);
+        } catch (Exception e) {
+            response.setFail("调用物理世界接口获取设备类型下的设备失败!");
+            e.printStackTrace();
+            return response;
+        }
+        // 统计需要删除和需要重新生成的报警定义
+        Map<String, List<AlarmConfig>> statisticMap = statisticConfigs2Update(objIds, projectId, alarmTarget, itemModel);
+        if (statisticMap == null) {
+            return response;
+        }
+        /* 删掉需要删除的报警定义,生成需要重新生成的报警定义 */
+        List<AlarmConfig> deletedAlarmConfigs = statisticMap.get("deleted");
+        List<AlarmConfig> createdAlarmConfigs = statisticMap.get("created");
+        DmpMessage message = saveAndDeleteAll(createdAlarmConfigs, deletedAlarmConfigs);
+        if (message != null) {
+            messageProcesser.convertAndSend(message);
+        }
+        return response;
+    }
+
+    /**
+     * @return DmpMessage
+     * @description: 删除报警定义,并推送删除消息
+     * @param: deletedAlarmConfigs
+     * @return: void
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/26 11:14 上午
+     * @version: V1.0
+     */
+    private DmpMessage deleteAll(List<AlarmConfig> deletedAlarmConfigs) {
+        if (!CollectionUtils.isEmpty(deletedAlarmConfigs)) {
+            DmpMessage message = generateMessage(null, deletedAlarmConfigs);
+            removeByIds(deletedAlarmConfigs.stream().map(AlarmConfig::getId).collect(Collectors.toList()));
+            return message;
+        }
+        return null;
+    }
+
+    /**
+     * @description: 创建报警定义,并推送创建消息
+     * @param: createdAlarmConfigs
+     * @return: com.persagy.dmp.rwd.model.DmpMessage
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/26 10:18 下午
+     * @version: V1.0
+     */
+    private DmpMessage saveAll(List<AlarmConfig> createdAlarmConfigs) {
+        if (!CollectionUtils.isEmpty(createdAlarmConfigs)) {
+            DmpMessage message = generateMessage(createdAlarmConfigs, null);
+            saveBatch(createdAlarmConfigs);
+            return message;
+        }
+        return null;
+    }
+
+    /**
+     * @description: 创建、删除报警定义,并推送相关消息
+     * @param: createdConfigs
+     * @param: deletedConfigs
+     * @return: com.persagy.dmp.rwd.model.DmpMessage
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/26 10:20 下午
+     * @version: V1.0
+     */
+    private DmpMessage saveAndDeleteAll(List<AlarmConfig> createdConfigs, List<AlarmConfig> deletedConfigs) {
+        DmpMessage message = generateMessage(createdConfigs, deletedConfigs);
+        /* 先删后加 */
+        if (!CollectionUtils.isEmpty(deletedConfigs)) {
+            removeByIds(deletedConfigs.stream().map(AlarmConfig::getId).collect(Collectors.toList()));
+        }
+        if (!CollectionUtils.isEmpty(createdConfigs)) {
+            saveBatch(createdConfigs);
+        }
+        return message;
+    }
+
+
+    /**
+     * @description: 报警定义变动,生成需要推送的消息
+     * @param: createdConfigs 新增的报警定义
+     * @param: deletedConfigs 删除的报警定义
+     * @return: com.persagy.dmp.rwd.model.DmpMessage
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/26 11:34 上午
+     * @version: V1.0
+     */
+    private DmpMessage generateMessage(List<AlarmConfig> createdConfigs, List<AlarmConfig> deletedConfigs) {
+        List<AlarmConfig.AlarmConfigUnique> createdConfigUniques = null;
+        List<AlarmConfig.AlarmConfigUnique> deletedConfigUniques = null;
+        if (!CollectionUtils.isEmpty(createdConfigs)) {
+            createdConfigUniques = createdConfigs.stream().map(
+                    AlarmConfig::getAlarmConfigUnique).collect(Collectors.toList());
+        }
+        if (!CollectionUtils.isEmpty(deletedConfigs)) {
+            deletedConfigUniques = deletedConfigs.stream().map(
+                    AlarmConfig::getAlarmConfigUnique).collect(Collectors.toList());
+        }
+        if (!CollectionUtils.isEmpty(createdConfigUniques) || !CollectionUtils.isEmpty(deletedConfigUniques)) {
+            DmpMessage msg = new DmpMessage();
+            msg.setMid(UUID.randomUUID().toString());
+            msg.setType(EnumAlarmMessageType.ALARM_CONFIGS_CHANGE.getValue());
+            msg.setGroupCode(DmpParameterStorage.getGroupCode());
+            msg.setProjectId(DmpParameterStorage.getProjectId());
+            msg.add("createdConfigUniques", createdConfigUniques);
+            msg.add("deletedConfigUniques", deletedConfigUniques);
+            msg.setAppId(DmpParameterStorage.getAppId());
+            msg.setSendTime(DateUtil.format(new Date(), DatePatternStyle.PATTERN_YYYYMMDDHHMMSS));
+            return msg;
+        }
+        return null;
+    }
+
+    /**
+     * @description: 按照报警匹配条件统计需要删除和重新创建的报警定义
+     * @param: objIds 设备id列表
+     * @param: projectId 项目id
+     * @param: AlarmTarget 报警匹配条件
+     * @param: itemModel 报警条目
+     * @return: java.util.Map<java.lang.String, java.util.List < com.persagy.dmp.alarm.entity.AlarmConfig>>
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/21 2:50 下午
+     * @version: V1.0
+     */
+    private Map<String, List<AlarmConfig>> statisticConfigs2Update(
+            Set<String> objIds, String projectId, AlarmTarget AlarmTarget, AlarmItem itemModel) {
+        log.info("设备id列表:" + objIds);
+        if (objIds == null) {
+            return null;
+        }
+        /* 查询这些设备的报警定义 */
+        JsonCriteria criteria = new JsonCriteria();
+        criteria.getCriteria().put("objId", Lists.newArrayList(objIds));
+        criteria.getCriteria().put("targetId", AlarmTarget.getId());
+        criteria.getCriteria().put("itemCode", itemModel.getCode());
+        criteria.getCriteria().put("projectId", projectId);
+        List<AlarmConfig> configModels = queryList(criteria);
+        // configModels为空,是因为查询发生了错误,正常情况下没有数据configModels也不是null
+        if (configModels == null) {
+            return null;
+        }
+        /* 确认要更新的范围,自定义的报警定义不处理 */
+        // 用户自定义的报警定义
+        List<AlarmConfig> userDefinedAlarmConfigs = configModels.stream().filter(
+                configModel -> configModel.getUserDefined() == 1
+        ).collect(Collectors.toList());
+        // 自动生成的报警定义
+        List<AlarmConfig> autoAlarmConfigs = configModels.stream().filter(
+                configModel -> configModel.getUserDefined() != 1
+        ).collect(Collectors.toList());
+        /* 获取本次需要自动生成报警定义的对象id列表 */
+        Set<String> userDefinedObjIds = userDefinedAlarmConfigs.stream().map(AlarmConfig::getObjId).collect(Collectors.toSet());
+        objIds.removeAll(userDefinedObjIds);
+        /* 删掉自动生成的报警定义,按照新的匹配条件生成新的报警定义 */
+        Map<String, List<AlarmConfig>> statisticMap = new HashMap<>();
+        statisticMap.put("deleted", autoAlarmConfigs);
+
+        if (!CollectionUtils.isEmpty(objIds)) {
+            JSONObject condition = alarmTargetService.getCondition(AlarmTarget, itemModel);
+            List<AlarmConfig> alarmConfigs = new ArrayList<>();
+            for (String objId : objIds) {
+                AlarmConfig alarmConfig = generateAlarmConfigEntity(objId, AlarmTarget, itemModel, condition);
+                alarmConfigs.add(alarmConfig);
+            }
+            statisticMap.put("created", alarmConfigs);
+        }
+        return statisticMap;
+    }
+
+    public AlarmConfig get(String id) {
+        return getById(id);
+    }
+
+    @Transactional
+    public MapResponse update(AlarmConfig param) {
+        MapResponse response = new MapResponse();
+        AlarmConfig alarmConfig = get(param.getId());
+        if (alarmConfig == null) {
+            response.setFail("无法获取到要更新的数据!");
+            return response;
+        }
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        updateEntityByParam(param, alarmConfig);
+        //		// 发生更新后,报警定义的自定义状态修改为1
+        //		alarmConfig.setUserDefined(1);
+        alarmConfig.setUpdateUser(alarmParam.userId);
+        alarmConfig.setUpdateTime(new Date());
+        save(alarmConfig);
+        response.add("id", alarmConfig.getId());
+        // 报警定义发生变化,向mq推送消息
+        DmpMessage msg = getUpdateConfigsDmpMessage(Lists.newArrayList(alarmConfig));
+        if (msg != null) {
+            response.add(msg);
+        }
+        return response;
+    }
+
+    /**
+     * 获取更新报警定义消息
+     *
+     * @param alarmConfigList 更新的报警定义id
+     * @return 更新消息
+     * @author lixing
+     * @version V1.0 2021/3/27 3:30 下午
+     */
+    private DmpMessage getUpdateConfigsDmpMessage(List<AlarmConfig> alarmConfigList) {
+        if (CollectionUtils.isEmpty(alarmConfigList)) {
+            return null;
+        }
+        DmpMessage msg = new DmpMessage();
+        msg.setMid(UUID.randomUUID().toString());
+        msg.setType(EnumAlarmMessageType.ALARM_CONFIGS_CHANGE.getValue());
+        msg.setGroupCode(DmpParameterStorage.getGroupCode());
+        msg.setProjectId(DmpParameterStorage.getProjectId());
+        List<AlarmConfig.AlarmConfigUnique> alarmConfigUniqueList = alarmConfigList.stream().
+                map(AlarmConfig::getAlarmConfigUnique).collect(Collectors.toList());
+        msg.add("updatedConfigUniques", alarmConfigUniqueList);
+        msg.setAppId(DmpParameterStorage.getAppId());
+        msg.setSendTime(DateUtil.format(new Date(), DatePatternStyle.PATTERN_YYYYMMDDHHMMSS));
+        return msg;
+    }
+
+
+    /**
+     * @description: 根据更新条件更新实体
+     * @param: param
+     * @param: alarmConfig
+     * @return: void
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/22 2:52 下午
+     * @version: V1.0
+     */
+    private void updateEntityByParam(AlarmConfig param, AlarmConfig alarmConfig) {
+        // 报警等级
+        if (param.getLevel() != null && !param.getLevel().isEmpty()) {
+            alarmConfig.setLevel(param.getLevel());
+        }
+        // 触发条件
+        if (param.getCondition() != null && !param.getCondition().isEmpty()) {
+            alarmConfig.setCondition(param.getCondition());
+        }
+        // 备注
+        if (param.getRemark() != null && !param.getRemark().isEmpty()) {
+            alarmConfig.setRemark(param.getRemark());
+        }
+        // 是否重点关注
+        if (param.getConcern() != null) {
+            alarmConfig.setConcern(param.getConcern());
+        }
+        // 是否屏蔽
+        if (param.getOpen() != null) {
+            alarmConfig.setOpen(param.getOpen());
+        }
+        // 报警定义的自定义状态
+        if (param.getUserDefined() != null) {
+            alarmConfig.setUserDefined(param.getUserDefined());
+        }
+    }
+
+    /**
+     * @description: 删除设备时,同时删除设备对应的报警定义
+     * @param: objId 对象id
+     * @param: projectId 项目id
+     * @return: com.persagy.common.web.MapResponse
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/20 9:51 下午
+     * @version: V1.0
+     */
+    @Transactional
+    public MapResponse deleteOnRemoveObj(String objId, String projectId) {
+        /* 查询设备相关的报警定义 */
+        JsonCriteria criteria = new JsonCriteria();
+        criteria.getCriteria().put("objId", objId);
+        criteria.getCriteria().put("projectId", projectId);
+        MapResponse response = new MapResponse();
+        deleteByCriteria(criteria);
+        return response;
+    }
+
+    /**
+     * @description: 条件查询
+     * @param: criteria
+     * @return: java.util.List<com.persagy.dmp.alarm.model.AlarmConfig>
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/21 2:22 下午
+     * @version: V1.0
+     */
+    private List<AlarmConfig> queryList(JsonCriteria criteria) {
+        PagedResponse<AlarmConfig> pagedResponse = query(criteria);
+        if (pagedResponse == null) {
+            return null;
+        }
+        return pagedResponse.getData();
+    }
+
+    /**
+     * @description: 初始化所有报警定义
+     * @param: param
+     * @return: com.persagy.common.web.MapResponse
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/21 3:08 下午
+     * @version: V1.0
+     */
+    @Transactional
+    public MapResponse init(AlarmConfig param) {
+        MapResponse response = new MapResponse();
+        if (StringUtils.isEmpty(param.getProjectId())) {
+            response.setFail("项目id必填!");
+        }
+        JsonCriteria criteria = new JsonCriteria();
+        ;
+
+        List<AlarmItem> AlarmItems = alarmItemService.queryList(criteria);
+        for (AlarmItem AlarmItem : AlarmItems) {
+            batchUpdateWhenItemUpdate(AlarmItem.getCode(), param.getProjectId(), param.getGroupCode());
+        }
+        return response;
+    }
+
+    /**
+     * @description: 批量更新报警定义
+     * @param: param
+     * @return: com.persagy.common.web.MapResponse
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/22 2:38 下午
+     * @version: V1.0
+     */
+    @Transactional
+    public MapResponse batchUpdate(List<AlarmConfig> params) {
+        MapResponse response = new MapResponse();
+        if (params == null) {
+            response.setFail("请传入要修改的报警定义!");
+            return response;
+        }
+
+        // 一次最多更新200条数据
+        if (params.size() > 200) {
+            response.setFail("一次最多更新200条数据");
+            return response;
+        }
+
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+
+        /* 更新报警定义对象 */
+        Date date = new Date();
+        List<AlarmConfig> configs = Lists.newArrayListWithCapacity(params.size());
+        for (AlarmConfig param : params) {
+            String checkResult = CheckRequiredParam.check(param, "id");
+            if (!StringUtils.isEmpty(checkResult)) {
+                response.setFail(checkResult);
+                return response;
+            }
+
+            AlarmConfig alarmConfig = getById(param.getId());
+            updateEntityByParam(param, alarmConfig);
+            configs.add(alarmConfig);
+        }
+        saveBatch(configs);
+        DmpMessage updateConfigsDmpMessage = getUpdateConfigsDmpMessage(configs);
+        messageProcesser.convertAndSend(updateConfigsDmpMessage);
+        Date date1 = new Date();
+        System.out.println("执行时间:" + (date1.getTime() - date.getTime()));
+        return response;
+    }
+
+    /**
+     * @description: 创建报警定义
+     * @param: param
+     * @return: com.persagy.common.web.MapResponse
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/11/25 9:38 上午
+     * @version: V1.0
+     */
+    public MapResponse create(AlarmConfig param) {
+        MapResponse response = new MapResponse();
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        AlarmConfig entity = initAlarmConfigEntity(param, alarmParam, response);
+        if (entity == null) {
+            return response;
+        }
+        save(entity);
+        // 发送报警定义创建消息
+        DmpMessage msg = generateMessage(Lists.newArrayList(entity), null);
+        messageProcesser.convertAndSend(msg);
+        response.add("id", entity.getId());
+        return response;
+    }
+
+    private AlarmConfig initAlarmConfigEntity(AlarmConfig entity, AlarmParam alarmParam, MapResponse response) {
+        // 必填项校验
+        String checkResult = CheckRequiredParam.check(entity,
+                "objId", "classCode", "itemCode", "condition", "level");
+
+        if (!StringUtils.isEmpty(checkResult)) {
+            response.setFail(checkResult);
+            return null;
+        }
+        entity.setId(UUID.randomUUID().toString());
+        entity.setCreateUser(alarmParam.userId);
+        entity.setCreateTime(new Date());
+        entity.setValid(1);
+        entity.setProjectId(alarmParam.projectId);
+        entity.setGroupCode(alarmParam.groupCode);
+        return entity;
+    }
+
+    /**
+     * 批量创建报警定义
+     *
+     * @param configModels 报警定义列表
+     * @return 报警定义id列表
+     * @author lixing
+     * @version V1.0 2021/10/11 8:08 下午
+     */
+    public MapResponse batchCreate(List<AlarmConfig> configModels) {
+        MapResponse response = new MapResponse();
+        if (configModels == null) {
+            response.setFail("请传入要创建的报警定义!");
+            return response;
+        }
+
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        Date date = new Date();
+        List<AlarmConfig> configs = new ArrayList<>(configModels.size());
+        for (AlarmConfig configModel : configModels) {
+            AlarmConfig entity = initAlarmConfigEntity(configModel, alarmParam, response);
+            if (entity == null) {
+                response.setFail("批量创建报警条件失败,参数中存在null对象");
+                return response;
+            }
+            configs.add(entity);
+        }
+        try {
+            saveBatch(configs);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        Date date1 = new Date();
+        System.out.println("报警定义存储完成,耗时:" + (date1.getTime() - date.getTime()));
+        DmpMessage msg = generateMessage(configs, null);
+        messageProcesser.convertAndSend(msg);
+        List<String> ids = configs.stream().map(AlarmConfig::getId).collect(Collectors.toList());
+        date1 = new Date();
+        System.out.println("执行时间:" + (date1.getTime() - date.getTime()));
+        response.add("ids", ids);
+        return response;
+    }
+
+    /**
+     * @description: 报警匹配条件删除时,删除对应的报警定义
+     * @param: targetId
+     * @param: projectId
+     * @param: groupCode
+     * @return: com.persagy.common.web.MapResponse
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/12/10 11:45 上午
+     * @version: V1.0
+     */
+    @Transactional
+    public MapResponse batchDeleteWhenTargetDelete(String targetId, String projectId, String groupCode) {
+        MapResponse mapResponse = new MapResponse();
+        JsonCriteria criteria = new JsonCriteria();
+        criteria.getCriteria().put("targetId", targetId);
+        criteria.getCriteria().put("projectId", projectId);
+        criteria.getCriteria().put("groupCode", groupCode);
+        // 非用户自定义的
+        criteria.getCriteria().put("userDefined", 0);
+        deleteByCriteria(criteria);
+        return mapResponse;
+    }
+
+    /**
+     * @description: 根据条件删除
+     * @param: criteria
+     * @return: void
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/12/10 2:04 下午
+     * @version: V1.0
+     */
+    private void deleteByCriteria(JsonCriteria criteria) {
+        List<AlarmConfig> configs = queryList(criteria);
+        if (configs == null) {
+            return;
+        }
+        DmpMessage deletedMessage = deleteAll(configs);
+        if (deletedMessage != null) {
+            messageProcesser.convertAndSend(deletedMessage);
+        }
+    }
+
+    /**
+     * 删除报警定义,真删
+     *
+     * @param param 报警定义对象AlarmConfig,只取id
+     * @return 是否删除成功
+     * @author lixing
+     * @version V1.0 2021/3/20 10:49 上午
+     */
+    public MapResponse delete(AlarmConfig param) {
+        JsonCriteria criteria = new JsonCriteria();
+        criteria.getCriteria().put("id", param.getId());
+        deleteByCriteria(criteria);
+        return new MapResponse();
+    }
+
+    /**
+     * 批量删除报警定义,真删
+     *
+     * @param param 批量删除对象AlarmConfigs
+     * @return 是否删除成功
+     * @author lixing
+     * @version V1.0 2021/3/20 10:59 上午
+     */
+    @Transactional
+    public MapResponse batchDelete(AlarmConfig param) {
+        MapResponse response = new MapResponse();
+        List<AlarmConfig> alarmConfigs = param.getAlarmConfigs();
+        if (CollectionUtils.isEmpty(alarmConfigs)) {
+            response.setFail("批量删除报警定义,没有传入需要删除的对象");
+            return response;
+        }
+
+        List<String> configIds = alarmConfigs.stream().map(AlarmConfig::getId).collect(Collectors.toList());
+        JsonCriteria criteria = new JsonCriteria();
+        criteria.getCriteria().put("id", configIds);
+        deleteByCriteria(criteria);
 
+        return response;
+    }
 }

+ 185 - 2
src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmItemServiceImpl.java

@@ -1,9 +1,31 @@
 package com.persagy.apm.dmpalarm.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.apm.dmpalarm.criteria.CriteriaUtils;
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.enumeration.EnumAlarmMessageType;
+import com.persagy.apm.dmpalarm.model.DmpMessage;
+import com.persagy.apm.dmpalarm.utils.DatePatternStyle;
+import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 
 import com.persagy.apm.dmpalarm.model.AlarmItem;
 import com.persagy.apm.dmpalarm.service.IAlarmItemService;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 报警条目(AlarmItem) service层
@@ -12,7 +34,168 @@ import com.persagy.apm.dmpalarm.service.IAlarmItemService;
  * @version V1.0 2021-12-09 10:44:19
  */
 @Service
+@Slf4j
 public class AlarmItemServiceImpl extends BaseServiceImpl<AlarmItem>
-    implements IAlarmItemService {
-   
+        implements IAlarmItemService {
+    @Resource
+    private CriteriaUtils criteriaUtils;
+
+
+    @Override
+    public PagedResponse<AlarmItem> query(JsonCriteria criteria) {
+        // 报警条目查询中的0代表的是通用
+        try {
+            addDefaultQueryCondition(criteria, "projectId", "0");
+            addDefaultQueryCondition(criteria, "groupCode", "0");
+            addDefaultQueryCondition(criteria, "appId", "0");
+            QueryWrapper<AlarmItem> queryWrapper = criteriaUtils.handleAlarmConditions(criteria, AlarmItem.class);
+            return criteriaUtils.getPagedResponse(criteria, AlarmItem.class, queryWrapper, getBaseMapper());
+        } catch (Exception e) {
+            log.error("AlarmItem query page error JsonCriteria is {}",criteria.toString(), e);
+        }
+        return new PagedResponse<>();
+    }
+
+    /**
+     * @description: 添加默认查询条件
+     * 例如:当传入的查询条件中projectId = 1时,实际需要查询projectId = [0, 1]的数据,使用此方法将0添加到查询条件中
+     * @param: criteria
+     * @param: paramName
+     * @param: defaultCondition
+     * @return: void
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/12/5 5:29 下午
+     * @version: V1.0
+     */
+    private void addDefaultQueryCondition(JsonCriteria criteria, String paramName, String defaultCondition) {
+        // 这里不校验已有查询条件和默认查询条件是否重复
+        JSONObject queryBody = criteria.getCriteria();
+        Object obj = queryBody.get(paramName);
+        if (obj == null) {
+            queryBody.put(paramName, defaultCondition);
+        } else if (obj instanceof JSONArray || obj instanceof List) {
+            ((JSONArray) obj).add(defaultCondition);
+        } else {
+            List<String> conditions = new ArrayList<>();
+            conditions.add(defaultCondition);
+            conditions.add(obj.toString());
+            queryBody.put(paramName, conditions);
+        }
+    }
+
+    @Transactional
+    @Override
+    public MapResponse create(AlarmItem entity) {
+        MapResponse response = new MapResponse();
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+
+        entity.setCreateUser(alarmParam.userId);
+        entity.setCreateTime(new Date());
+        save(entity);
+        response.add("id", entity.getId());
+        /* 拼装需要推送至消息队列的消息 */
+        DmpMessage msg = new DmpMessage();
+        msg.setMid(UUID.randomUUID().toString());
+        msg.setType(EnumAlarmMessageType.ALARM_ITEM_CREATE.getValue());
+        msg.setGroupCode(alarmParam.groupCode);
+        msg.setProjectId(alarmParam.projectId);
+        msg.setTargetId(entity.getId());
+        msg.setStr1(entity.getCode());
+        msg.setAppId(alarmParam.appId);
+        msg.setSendTime(DateUtil.format(new Date(), DatePatternStyle.PATTERN_YYYYMMDDHHMMSS));
+        response.add(msg);
+        return response;
+    }
+
+    @Transactional
+    @Override
+    public MapResponse update(AlarmItem entity) {
+        MapResponse response = new MapResponse();
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        entity.setUpdateUser(alarmParam.userId);
+        entity.setUpdateTime(new Date());
+        save(entity);
+        response.add("id", entity.getId());
+        /* 拼装需要推送至消息队列的消息 */
+        DmpMessage msg = new DmpMessage();
+        msg.setMid(UUID.randomUUID().toString());
+        msg.setType(EnumAlarmMessageType.ALARM_ITEM_UPDATE.getValue());
+        msg.setGroupCode(alarmParam.groupCode);
+        msg.setProjectId(alarmParam.projectId);
+        msg.setTargetId(entity.getId());
+        msg.setStr1(entity.getCode());
+        msg.setAppId(alarmParam.appId);
+        msg.setSendTime(DateUtil.format(new Date(), DatePatternStyle.PATTERN_YYYYMMDDHHMMSS));
+        response.add(msg);
+        return response;
+    }
+
+    /**
+     * @description: 根据itemCodes获取itemCode, alarmItem的映射map
+     * @param: itemCodes 报警条目编码列表
+     * @return: java.util.HashMap<java.lang.String, com.persagy.dmp.alarm.model.AlarmItem>
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/20 2:25 下午
+     * @version: V1.0
+     */
+    public Map<String, AlarmItem> getItemCodeModelMap(List<String> itemCodes) {
+        HashMap<String, AlarmItem> itemCodeModelMap = new HashMap<>();
+        if (CollectionUtils.isEmpty(itemCodes)) {
+            return itemCodeModelMap;
+        }
+        JsonCriteria criteria = new JsonCriteria();
+        criteria.getCriteria().put("itemCode", itemCodes);
+        PagedResponse<AlarmItem> response = query(criteria);
+        if (response == null) {
+            return itemCodeModelMap;
+        }
+        List<AlarmItem> data = response.getData();
+        if (CollectionUtils.isEmpty(data)) {
+            return itemCodeModelMap;
+        }
+        return data.stream().collect(
+                Collectors.toMap(AlarmItem::getCode, itemModel -> itemModel, (k1, k2) -> k1)
+        );
+    }
+
+    public AlarmItem getAlarmItemByItemCode(String itemCode, String projectId, String groupCode, String appId) {
+        JsonCriteria criteria = new JsonCriteria();
+        criteria.getCriteria().put("code", itemCode);
+        if (StringUtils.isNotEmpty(projectId)) {
+            criteria.getCriteria().put("projectId", projectId);
+        }
+        if (StringUtils.isNotEmpty(groupCode)) {
+            criteria.getCriteria().put("groupCode", groupCode);
+        }
+        if (StringUtils.isNotEmpty(appId)) {
+            criteria.getCriteria().put("appId", appId);
+        }
+        List<AlarmItem> AlarmItems = queryList(criteria);
+        if (CollectionUtils.isEmpty(AlarmItems)) {
+            return null;
+        }
+        return AlarmItems.get(0);
+    }
+    @Override
+    public List<AlarmItem> queryList(JsonCriteria criteria) {
+        PagedResponse<AlarmItem> pagedResponse = query(criteria);
+        if (pagedResponse == null) {
+            return null;
+        }
+        List<AlarmItem> data = pagedResponse.getData();
+        if (CollectionUtils.isEmpty(data)) {
+            return null;
+        }
+        return data;
+    }
 }

+ 102 - 25
src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmLogServiceImpl.java

@@ -1,14 +1,18 @@
 package com.persagy.apm.dmpalarm.service.impl;
 
-import java.util.Date;
-import java.util.UUID;
-
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.enumeration.EnumAlarmLogType;
 import com.persagy.apm.dmpalarm.model.AlarmLog;
 import com.persagy.apm.dmpalarm.service.IAlarmLogService;
 import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
 
 /**
  * 报警日志(AlarmLog) service层
@@ -16,27 +20,100 @@ import com.persagy.apm.dmpalarm.web.MapResponse;
  * @author lixing
  * @version V1.0 2021-12-09 10:44:19
  */
+@Slf4j
 @Service
 public class AlarmLogServiceImpl extends BaseServiceImpl<AlarmLog> implements IAlarmLogService {
 
-	@Override
-	@Transactional
-	public MapResponse create(AlarmLog param) {
-		MapResponse response = new MapResponse();
-		AlarmParam alarmParam = prepareParam(response);
-		if (alarmParam == null) {
-			return response;
-		}
-		AlarmLog entity = param;
-		entity.setId(UUID.randomUUID().toString());
-		entity.setCreateTime(new Date());
-		entity.setProjectId(alarmParam.projectId);
-		entity.setGroupCode(alarmParam.groupCode);
-		entity.setCreateUser(alarmParam.userId);
-		save(entity);
-		response.add("id", entity.getId());
-		return response;
-
-	}
+    @Override
+    @Transactional
+    public MapResponse create(AlarmLog entity) {
+        MapResponse response = new MapResponse();
+        try {
+            AlarmParam alarmParam = prepareParam(response);
+            if (alarmParam == null) {
+                return response;
+            }
+            entity.setId(UUID.randomUUID().toString());
+            entity.setCreateTime(new Date());
+            entity.setProjectId(alarmParam.projectId);
+            entity.setGroupCode(alarmParam.groupCode);
+            entity.setCreateUser(alarmParam.userId);
+            save(entity);
+            response.add("id", entity.getId());
+        } catch (Exception e) {
+           log.error("alarmLog create error" ,e);
+        }
+        return response;
+    }
+
+    @Override
+    public PagedResponse<AlarmLog> query(JsonCriteria criteria) {
+        try {
+            QueryWrapper<AlarmLog> queryWrapper = criteriaUtils.handleAlarmConditions(criteria, AlarmLog.class);
+            return  criteriaUtils.getPagedResponse(criteria, AlarmLog.class, queryWrapper, baseMapper);
+        } catch (Exception e) {
+           log.error("alarmLog query page error JsonCriteria is {}",criteria.toString(),e);
+        }
+        return new PagedResponse<>();
+    }
+    /**
+     * 根据报警记录id批量获取 日志信息集合
+     * @param recordIdList  记录id
+     * @return map
+     */
+    @Override
+    public Map<String,List<AlarmLog>> getAlarmLogMap(List<String> recordIdList) {
+        JsonCriteria criteria=new JsonCriteria();
+        criteria.getCriteria().put("recordId",recordIdList);
+        QueryWrapper<AlarmLog> queryWrapper = criteriaUtils.handleAlarmConditions(criteria, AlarmLog.class);
+        PagedResponse<AlarmLog> resp = criteriaUtils.getPagedResponse(criteria, AlarmLog.class, queryWrapper, getBaseMapper());
+        List<AlarmLog> logs = resp.getData();
+        if (CollectionUtils.isEmpty(logs)) {
+            return new HashMap<>();
+        } else {
+            Map<String,List<AlarmLog>> alarmLogListMap = new HashMap<>();
+            logs.forEach(alarmLog -> {
+                if (!alarmLogListMap.containsKey(alarmLog.getRecordId())){
+                    alarmLogListMap.put(alarmLog.getRecordId(),new ArrayList<>());
+                }
+                alarmLogListMap.get(alarmLog.getRecordId()).add(alarmLog);
+            });
+            return alarmLogListMap;
+        }
+    }
+
+    /**
+     * 获取忽略报警的时间
+     * @param recordId
+     * @return
+     */
+    @Override
+    public Date getIgnoreAlarmTime(String recordId) {
+        // 已忽略
+        int after = 1;
+        return getCreateTime(recordId, EnumAlarmLogType.TREATMODE, after);
+    }
+
+    /**
+     * 查询日志创建时间
+     * @param recordId 报警记录id
+     * @param type 日志了下
+     * @param after
+     * @return
+     */
+    private Date getCreateTime(String recordId, EnumAlarmLogType type, int after) {
+        JsonCriteria criteria=new JsonCriteria();
+        criteria.getCriteria().put("recordId", recordId);
+        criteria.getCriteria().put("type", type);
+        criteria.getCriteria().put("after", after);
+        QueryWrapper<AlarmLog> queryWrapper = criteriaUtils.handleAlarmConditions(criteria, AlarmLog.class);
+        PagedResponse<AlarmLog> resp = criteriaUtils.getPagedResponse(criteria, AlarmLog.class, queryWrapper, getBaseMapper());
+        List<AlarmLog> logs = resp.getData();
+        if (CollectionUtils.isEmpty(logs)) {
+            return null;
+        } else {
+            return logs.get(0).getCreateTime();
+        }
+    }
 
 }

+ 35 - 60
src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmRecordServiceImpl.java

@@ -1,28 +1,11 @@
 package com.persagy.apm.dmpalarm.service.impl;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.persagy.apm.dmpalarm.config.DmpParameterStorage;
-import com.persagy.apm.dmpalarm.criteria.CriteriaUtils;
 import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
-import com.persagy.apm.dmpalarm.dao.AlarmRecordMapper;
-import com.persagy.apm.dmpalarm.enumeration.EnumAlarmListType;
-import com.persagy.apm.dmpalarm.enumeration.EnumAlarmLogType;
-import com.persagy.apm.dmpalarm.enumeration.EnumAlarmMessageType;
-import com.persagy.apm.dmpalarm.enumeration.EnumAlarmState;
-import com.persagy.apm.dmpalarm.enumeration.EnumAlarmTreatState;
+import com.persagy.apm.dmpalarm.enumeration.*;
 import com.persagy.apm.dmpalarm.json.JacksonMapper;
 import com.persagy.apm.dmpalarm.model.AlarmLog;
 import com.persagy.apm.dmpalarm.model.AlarmRecord;
@@ -33,9 +16,14 @@ import com.persagy.apm.dmpalarm.utils.CheckRequiredParam;
 import com.persagy.apm.dmpalarm.utils.DatePatternStyle;
 import com.persagy.apm.dmpalarm.web.MapResponse;
 import com.persagy.apm.dmpalarm.web.PagedResponse;
-
-import cn.hutool.core.date.DateUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
 
 /**
  * 报警记录(AlarmRecord) service层
@@ -47,48 +35,39 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 public class AlarmRecordServiceImpl extends BaseServiceImpl<AlarmRecord> implements IAlarmRecordService {
 
-	@Autowired
-	private CriteriaUtils criteriaUtils;
-	@Autowired
+	@Resource
 	private IAlarmLogService alarmLogService;
-	@Autowired
-	private AlarmRecordMapper alarmRecordMapper;
+
 
 	@Override
 	public PagedResponse<AlarmRecord> query(JsonCriteria jsonCriteria) {
-		QueryWrapper<AlarmRecord> queryWrapper = criteriaUtils.handleAlarmConditions(jsonCriteria, AlarmRecord.class);
-		this.addAlarmQueryCondition(jsonCriteria.getCriteria(), queryWrapper);
-		PagedResponse<AlarmRecord> pagedResponse = new PagedResponse<>();
-		if (jsonCriteria.isOnlyCount()) {
-			Integer count = baseMapper.selectCount(queryWrapper);
-			pagedResponse.setCount(count.longValue());
-		} else {
-			Page<AlarmRecord> page = baseMapper.selectPage(new Page<>(jsonCriteria.getPage(), jsonCriteria.getSize()),
-					queryWrapper);
-			pagedResponse.setCount(page.getTotal());
-			pagedResponse.setData(page.getRecords());
+		try {
+			QueryWrapper<AlarmRecord> queryWrapper = criteriaUtils.handleAlarmConditions(jsonCriteria, AlarmRecord.class);
+			this.addAlarmQueryCondition(jsonCriteria.getCriteria(), queryWrapper);
+			return criteriaUtils.getPagedResponse(jsonCriteria, AlarmRecord.class, queryWrapper, baseMapper);
+		} catch (Exception e) {
+			log.error("alarmRecord query page error JsonCriteria is {}",jsonCriteria.toString(),e);
 		}
-		return pagedResponse;
+		return new PagedResponse<>();
 	}
 
 	/**
 	 * 添加查询报警条件 CURRENT 当前报警 HISTORY 历史报警
 	 * 
-	 * @param <T>
-	 * 
-	 * @param jsonObject
-	 * @param alarmRecordWrappers
+	 * @param <T> entity object
+	 * @param criteria JSONObject
+	 * @param queryWrappers query alarm criteria
 	 */
 	private <T> void addAlarmQueryCondition(JSONObject criteria, QueryWrapper<T> queryWrappers) {
 		String listType = criteria.getString("listType");
 		if (EnumAlarmListType.CURRENT.name().equals(listType)) {
-			queryWrappers.and(andw -> andw.eq(AlarmRecord.PROP_STATE, EnumAlarmState.UN_HANDLE.getType())
+			queryWrappers.and(andWrapper -> andWrapper.eq(AlarmRecord.PROP_STATE, EnumAlarmState.UN_HANDLE.getType())
 					.or(orw -> orw.eq(AlarmRecord.PROP_TREAT_STATE, EnumAlarmState.UN_HANDLE.getType())
 							.eq(AlarmRecord.PROP_TREAT_STATE, EnumAlarmTreatState.HANDLING.getType())));
 		}
 
 		if (EnumAlarmListType.HISTORY.name().equals(listType)) {
-			queryWrappers.and(andw -> andw.eq(AlarmRecord.PROP_STATE, EnumAlarmState.END.getType())
+			queryWrappers.and(andWrapper -> andWrapper.eq(AlarmRecord.PROP_STATE, EnumAlarmState.END.getType())
 					.or(orw -> orw.eq(AlarmRecord.PROP_STATE, EnumAlarmState.EXPIRE.getType())
 							.eq(AlarmRecord.PROP_TREAT_STATE, EnumAlarmTreatState.DONE.getType())));
 
@@ -97,7 +76,7 @@ public class AlarmRecordServiceImpl extends BaseServiceImpl<AlarmRecord> impleme
 
 	@Override
 	@Transactional
-	public MapResponse create(AlarmRecord param) {
+	public MapResponse create(AlarmRecord entity) {
 
 		MapResponse response = new MapResponse();
 		AlarmParam alarmParam = prepareParam(response);
@@ -105,7 +84,7 @@ public class AlarmRecordServiceImpl extends BaseServiceImpl<AlarmRecord> impleme
 			return response;
 		}
 		// 必填项校验
-		String checkResult = CheckRequiredParam.check(param, "itemCode", "objId", "level");
+		String checkResult = CheckRequiredParam.check(entity, "itemCode", "objId", "level");
 		if (!StringUtils.isEmpty(checkResult)) {
 			response.setFail(checkResult);
 			return response;
@@ -113,21 +92,20 @@ public class AlarmRecordServiceImpl extends BaseServiceImpl<AlarmRecord> impleme
 
 		String id = UUID.randomUUID().toString();
 		// 如果创建时,入参包含id,则使用入参中的id。但需要先校验id是否已存在
-		if (!StringUtils.isEmpty(param.getId())) {
+		if (!StringUtils.isEmpty(entity.getId())) {
 
-			AlarmRecord alarmRecord = getById(param.getId());
+			AlarmRecord alarmRecord = getById(entity.getId());
 			if (null != alarmRecord) {
 				response.setFail("已存在相同id的报警记录!创建失败!");
 				return response;
 			} else {
-				id = param.getId();
+				id = entity.getId();
 			}
 		}
-		AlarmRecord entity = param;
 		entity.setId(id);
 		entity.setCreateUser(alarmParam.userId);
-		if (param.getCreateTime() != null) {
-			entity.setCreateTime(param.getCreateTime());
+		if (entity.getCreateTime() != null) {
+			entity.setCreateTime(entity.getCreateTime());
 		} else {
 			entity.setCreateTime(new Date());
 		}
@@ -144,6 +122,10 @@ public class AlarmRecordServiceImpl extends BaseServiceImpl<AlarmRecord> impleme
 		DmpMessage msg = new DmpMessage();
 		msg.setMid(UUID.randomUUID().toString());
 		msg.setType(EnumAlarmMessageType.ALARM_RECORD_CREATE.getValue());
+		return getMapResponse(entity, response, msg);
+	}
+
+	private MapResponse getMapResponse(AlarmRecord entity, MapResponse response, DmpMessage msg) {
 		msg.setGroupCode(DmpParameterStorage.getGroupCode());
 		msg.setProjectId(DmpParameterStorage.getProjectId());
 		msg.setTargetId(entity.getId());
@@ -256,14 +238,7 @@ public class AlarmRecordServiceImpl extends BaseServiceImpl<AlarmRecord> impleme
 		DmpMessage msg = new DmpMessage();
 		msg.setMid(UUID.randomUUID().toString());
 		msg.setType(EnumAlarmMessageType.ALARM_RECORD_UPDATE.getValue());
-		msg.setGroupCode(DmpParameterStorage.getGroupCode());
-		msg.setProjectId(DmpParameterStorage.getProjectId());
-		msg.setTargetId(alarmRecord.getId());
-		msg.add("obj", JacksonMapper.toSimpleJson(alarmRecord));
-		msg.setAppId(DmpParameterStorage.getAppId());
-		msg.setSendTime(DateUtil.format(new Date(), DatePatternStyle.PATTERN_YYYYMMDDHHMMSS));
-		response.add(msg);
-		return response;
+		return getMapResponse(alarmRecord, response, msg);
 
 	}
 

+ 322 - 4
src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmTargetServiceImpl.java

@@ -1,9 +1,31 @@
 package com.persagy.apm.dmpalarm.service.impl;
 
-import org.springframework.stereotype.Service;
-
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.persagy.apm.dmpalarm.config.DmpParameterStorage;
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.enumeration.EnumAlarmMessageType;
+import com.persagy.apm.dmpalarm.model.AlarmItem;
 import com.persagy.apm.dmpalarm.model.AlarmTarget;
+import com.persagy.apm.dmpalarm.model.DmpMessage;
+import com.persagy.apm.dmpalarm.service.IAlarmItemService;
 import com.persagy.apm.dmpalarm.service.IAlarmTargetService;
+import com.persagy.apm.dmpalarm.utils.DatePatternStyle;
+import com.persagy.apm.dmpalarm.web.MapResponse;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
+import com.persagy.common.utils.DateUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
 
 /**
  * 报警匹配条件(AlarmTarget) service层
@@ -12,7 +34,303 @@ import com.persagy.apm.dmpalarm.service.IAlarmTargetService;
  * @version V1.0 2021-12-09 10:44:19
  */
 @Service
+@Slf4j
 public class AlarmTargetServiceImpl extends BaseServiceImpl<AlarmTarget>
-    implements IAlarmTargetService {
-   
+        implements IAlarmTargetService {
+    @Resource
+    private IAlarmItemService alarmItemService;
+
+    public PagedResponse<AlarmTarget> query(JsonCriteria criteria) {
+        try {
+            // 默认查询未删除的数据
+            criteria.getCriteria().put("valid", 1);
+            QueryWrapper<AlarmTarget> queryWrapper = criteriaUtils.handleAlarmConditions(criteria, AlarmTarget.class);
+            PagedResponse<AlarmTarget> resp = criteriaUtils.getPagedResponse(criteria, AlarmTarget.class, queryWrapper, getBaseMapper());
+            PagedResponse<AlarmTarget> result = new PagedResponse<>();
+            result.setCount(resp.getCount());
+            List<AlarmTarget> dataList = resp.getData();
+            if (dataList != null && dataList.size() > 0) {
+                Map<String, AlarmItem> itemCodeModelMap = getItemCodeModelMap(dataList);
+                List<AlarmTarget> collect = dataList.stream().map(entity -> {
+                    // 获取报警条目的触发条件
+                    String itemCode = entity.getItemCode();
+                    entity.setCondition(getCondition(entity, itemCodeModelMap.get(itemCode)));
+                    return entity;
+                }).collect(Collectors.toList());
+                result.setData(collect);
+            }
+            return result;
+        } catch (Exception e) {
+           log.error("alarmTarget query page error JsonCriteria is {}",criteria.toString(),e);
+        }
+        return new PagedResponse<>();
+    }
+
+    @Transactional
+    public MapResponse create(AlarmTarget entity) {
+        MapResponse response = new MapResponse();
+
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        if (org.springframework.util.StringUtils.isEmpty(entity.getItemCode())) {
+            response.setFail("报警条目编码必填");
+        }
+        if (org.springframework.util.StringUtils.isEmpty(entity.getClassCode())) {
+            response.setFail("对象类型编码必填");
+        }
+
+        // 获取设备条目对象
+        AlarmItem alarmItem = alarmItemService.getAlarmItemByItemCode(entity.getItemCode(), alarmParam.projectId, alarmParam.groupCode, alarmParam.appId);
+        if (alarmItem == null) {
+            response.setFail("无法获取到对应的报警条目,创建失败!");
+            return response;
+        }
+
+        entity.setId(UUID.randomUUID().toString());
+        entity.setCreateUser(alarmParam.userId);
+        entity.setCreateTime(new Date());
+        entity.setProjectId(alarmParam.projectId);
+        entity.setGroupCode(alarmParam.groupCode);
+        // 继承alarmItem的一些属性
+        if (org.springframework.util.StringUtils.isEmpty(entity.getLevel())) {
+            entity.setLevel(alarmItem.getLevel());
+        }
+        save(entity);
+        response.add("id", entity.getId());
+        /* 拼装需要推送至消息队列的消息 */
+        DmpMessage msg = new DmpMessage();
+        msg.setMid(UUID.randomUUID().toString());
+        msg.setType(EnumAlarmMessageType.ALARM_TARGET_CREATE.getValue());
+        msg.setGroupCode(alarmParam.groupCode);
+        msg.setProjectId(alarmParam.projectId);
+        msg.setTargetId(entity.getId());
+        msg.setStr1(entity.getItemCode());
+        msg.setStr2(entity.getClassCode());
+        msg.setAppId(alarmParam.appId);
+        msg.setSendTime(DateUtil.format(new Date(), DatePatternStyle.PATTERN_YYYYMMDDHHMMSS));
+        response.add(msg);
+        return response;
+    }
+
+
+    /**
+     * @description: 判断匹配条件更新是否会影响报警定义
+     * @param: param 匹配条件更新信息
+     * @param: alarmTarget 匹配条件字段
+     * @return: boolean
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/22 8:55 下午
+     * @version: V1.0
+     */
+    private boolean influenceConfigs(AlarmTarget param, AlarmTarget alarmTarget) {
+//        boolean itemCodeChange = !StringUtils.isEmpty(param.getItemCode()) &&
+//                !param.getItemCode().equals(alarmTarget.getItemCode());
+        boolean levelChange = !org.springframework.util.StringUtils.isEmpty(param.getLevel()) &&
+                !param.getLevel().equals(alarmTarget.getLevel());
+        boolean classCodeChange = !org.springframework.util.StringUtils.isEmpty(param.getClassCode()) &&
+                !param.getClassCode().equals(alarmTarget.getClassCode());
+        boolean concernChange = param.getConcern() != null &&
+                !param.getConcern().equals(alarmTarget.getConcern());
+        boolean openChange = param.getOpen() != null &&
+                !param.getOpen().equals(alarmTarget.getOpen());
+        boolean conditionChange = !StringUtils.isEmpty(param.getCondition()) &&
+                !param.getCondition().equals(alarmTarget.getCondition());
+
+        return levelChange || classCodeChange || concernChange || openChange || conditionChange;
+    }
+
+    @Transactional
+    public MapResponse update(AlarmTarget param) {
+        MapResponse response = new MapResponse();
+        AlarmTarget alarmTarget = getById(param.getId());
+        if (alarmTarget == null) {
+            response.setFail("无法获取到要更新的数据!");
+            return response;
+        }
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        /* 判断是否会影响报警定义 */
+        boolean influenceConfigs = influenceConfigs(param, alarmTarget);
+
+        if (param.getItemCode() != null && !param.getItemCode().isEmpty()) {
+            alarmTarget.setItemCode(param.getItemCode());
+        }
+//        if (param.getClassCode() != null && !param.getClassCode().isEmpty()) {
+//            alarmTarget.setClassCode(param.getClassCode());
+//        }
+        if (param.getLevel() != null && !param.getLevel().isEmpty()) {
+            alarmTarget.setLevel(param.getLevel());
+        }
+        if (param.getConcern() != null) {
+            alarmTarget.setConcern(param.getConcern());
+        }
+        if (param.getOpen() != null) {
+            alarmTarget.setOpen(param.getOpen());
+        }
+        if (param.getCondition() != null && !param.getCondition().isEmpty()) {
+            alarmTarget.setCondition(param.getCondition());
+        }
+        if (param.getValid() != null) {
+            alarmTarget.setValid(param.getValid());
+        }
+        alarmTarget.setUpdateUser(alarmParam.userId);
+        alarmTarget.setUpdateTime(new Date());
+        save(alarmTarget);
+        response.add("id", alarmTarget.getId());
+        if (influenceConfigs) {
+            /* 拼装需要推送至消息队列的消息 */
+            DmpMessage msg = new DmpMessage();
+            msg.setMid(UUID.randomUUID().toString());
+            msg.setType(EnumAlarmMessageType.ALARM_TARGET_UPDATE.getValue());
+            msg.setGroupCode(alarmParam.groupCode);
+            msg.setProjectId(alarmParam.projectId);
+            msg.setTargetId(alarmTarget.getId());
+            msg.setStr1(alarmTarget.getItemCode());
+            msg.setStr2(alarmTarget.getClassCode());
+            msg.setAppId(alarmParam.appId);
+            msg.setSendTime(DateUtil.format(new Date(), DatePatternStyle.PATTERN_YYYYMMDDHHMMSS));
+            response.add(msg);
+        }
+        return response;
+    }
+
+    @Transactional
+    public MapResponse delete(AlarmTarget param) {
+        MapResponse response = new MapResponse();
+        param.setValid(0);
+        update(param);
+
+        /* 拼装需要推送至消息队列的消息 */
+        DmpMessage msg = new DmpMessage();
+        msg.setMid(UUID.randomUUID().toString());
+        msg.setType(EnumAlarmMessageType.ALARM_TARGET_DELETE.getValue());
+        msg.setGroupCode(DmpParameterStorage.getGroupCode());
+        msg.setProjectId(DmpParameterStorage.getProjectId());
+        msg.setTargetId(param.getId());
+        msg.setStr1(param.getItemCode());
+        msg.setStr2(param.getClassCode());
+        msg.setAppId(DmpParameterStorage.getAppId());
+        msg.setSendTime(DateUtil.format(new Date(), DatePatternStyle.PATTERN_YYYYMMDDHHMMSS));
+        response.add(msg);
+        return response;
+    }
+
+    /**
+     * @description: 根据给定的一组target,获取target所属的报警条目itemCode, alarmItem的映射map
+     * @param: targetModelList
+     * @return: java.util.HashMap<java.lang.String, com.persagy.dmp.alarm.model.AlarmItem>
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/20 2:32 下午
+     * @version: V1.0
+     */
+    @Override
+    public Map<String, AlarmItem> getItemCodeModelMapByModelList(List<AlarmTarget> targetModelList) {
+        List<String> itemCodeList = targetModelList.stream().map(AlarmTarget::getItemCode).collect(Collectors.toList());
+        return alarmItemService.getItemCodeModelMap(itemCodeList);
+    }
+
+    /**
+     * @description: 根据给定的一组target,获取target所属的报警条目itemCode, alarmItem的映射map
+     * @param: targetList
+     * @return: java.util.HashMap<java.lang.String, com.persagy.dmp.alarm.model.AlarmItem>
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/20 2:45 下午
+     * @version: V1.0
+     */
+    public Map<String, AlarmItem> getItemCodeModelMap(List<AlarmTarget> targetList) {
+        List<String> itemCodeList = targetList.stream().map(AlarmTarget::getItemCode).collect(Collectors.toList());
+        return alarmItemService.getItemCodeModelMap(itemCodeList);
+    }
+
+    /**
+     * @description: 获取匹配条件的触发条件:匹配条件自己的触发条件与所属报警条目的触发条件取并集
+     * @param: AlarmTarget 匹配条件对象
+     * @param: AlarmItem 报警条目对象
+     * @return: ObjectNode
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/20 2:07 下午
+     * @version: V1.0
+     */
+    @Override
+    public JSONObject getCondition(AlarmTarget AlarmTarget, AlarmItem alarmItem) {
+        JSONObject result = null;
+        if (AlarmTarget != null && AlarmTarget.getCondition() != null) {
+            result = AlarmTarget.getCondition();
+        } else if (alarmItem != null) {
+            result = alarmItem.getCondition();
+        }
+        return result;
+    }
+
+    /**
+     * @description: 根据报警条目编码和设备类型编码获取匹配条件对象
+     * @param: itemCode 报警条目编码
+     * @param: classCode 设备类型编码
+     * @param: projectId 项目id
+     * @return: com.persagy.dmp.alarm.model.AlarmTarget
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/21 11:53 上午
+     * @version: V1.0
+     */
+    public AlarmTarget getAlarmTarget(String itemCode, String classCode, String projectId) {
+        JsonCriteria criteria = new JsonCriteria();
+        criteria.getCriteria().put("itemCode", itemCode);
+        criteria.getCriteria().put("classCode", classCode);
+        criteria.getCriteria().put("projectId", projectId);
+        PagedResponse<AlarmTarget> pagedResponse = query(criteria);
+        if (pagedResponse == null) {
+            return null;
+        }
+        List<AlarmTarget> data = pagedResponse.getData();
+        if (CollectionUtils.isEmpty(data)) {
+            return null;
+        }
+        return data.get(0);
+    }
+
+    /**
+     * @description: 根据报警条目编码获取匹配条件对象
+     * @param: itemCode 报警条目编码
+     * @param: projectId 项目id
+     * @return: java.util.List<com.persagy.dmp.alarm.model.AlarmTarget>
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/21 12:13 下午
+     * @version: V1.0
+     */
+    @Override
+    public List<AlarmTarget> getAlarmTargetsByItemCode(String itemCode, String projectId) {
+        JsonCriteria criteria = new JsonCriteria();
+        criteria.getCriteria().put("itemCode", itemCode);
+        criteria.getCriteria().put("projectId", projectId);
+        PagedResponse<AlarmTarget> pagedResponse = query(criteria);
+        if (pagedResponse == null) {
+            return null;
+        }
+        List<AlarmTarget> data = pagedResponse.getData();
+        if (CollectionUtils.isEmpty(data)) {
+            return null;
+        }
+        return data;
+    }
+
+    @Override
+    public AlarmTarget get(String targetId) {
+        return getById(targetId);
+    }
 }

+ 4 - 0
src/main/java/com/persagy/apm/dmpalarm/service/impl/BaseServiceImpl.java

@@ -1,5 +1,6 @@
 package com.persagy.apm.dmpalarm.service.impl;
 
+import com.persagy.apm.dmpalarm.criteria.CriteriaUtils;
 import org.apache.poi.ss.formula.functions.T;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -7,9 +8,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.persagy.apm.dmpalarm.config.DmpParameterStorage;
 import com.persagy.apm.dmpalarm.service.IBaseService;
 import com.persagy.apm.dmpalarm.web.BaseResponse;
+import org.springframework.beans.factory.annotation.Autowired;
 
 @SuppressWarnings("hiding")
 public class BaseServiceImpl<T> extends ServiceImpl<BaseMapper<T>, T>{
+	@Autowired
+	protected CriteriaUtils criteriaUtils;
 
 	protected static class AlarmParam {
 		String groupCode;

+ 73 - 73
src/main/resources/bootstrap.yml

@@ -1,73 +1,73 @@
-server:
-  port:
-    9979
-spring:
-  application:
-    name: energy-dmp-alarm
-  profiles:
    active: dev
  cloud:
-    config:
        profile: prod
-        uri: http://192.168.100.102:32435
-  jackson:
-    serialization:
-      # 统一将时间都转为时间戳
-      write-dates-as-timestamps: true
-    # 设置时间戳的时区
-    time-zone: Asia/Shanghai
-  datasource:
-    url: jdbc:mysql://${mysql.ip}:${mysql.port}/${mysql.database}?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
-    dynamic:
-      primary: master
-      strict: false
-      datasource:
-        master:
-          schema: classpath*:db/init/table.sql
-          data: classpath*:db/init/data.sql
-          continue-on-error: true
-          # MYSQL_SCHEMA建议使用默认值。如果有特殊需求,建议在环境变量中配置该值
-          url: jdbc:mysql://${mysql.ip}:${mysql.port}/${mysql.database}?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
-          username: ${MYSQL_USERNAME:${spring.datasource.username}}
-          password: ${MYSQL_PASSWORD:${spring.datasource.password}}
-          driver-class-name: com.mysql.cj.jdbc.Driver
-feign:
-  compression:
-    response:
-      # feign返回结果不压缩
-      enabled: false
-    request:
-      # feign请求参数不压缩
-      enabled: false
-
-integrated:
-  swagger:
-    # 接口文档版本
-    version: v1.0.0
-    # 接口访问地址
-    termsOfServiceUrl: localhost
-    # 作者信息
-    contact:
-      name: lixing
-    # 只展示com.persagy包下的接口, 不展示swagger默认的接口
-    basePackage: com.persagy
-    # 接口文档简介
-    description: --
-    # 接口文档名称
-    title: energy-dmp-alarm 接口文档
-
-# 不打印sql
-mybatis-plus:
-  configuration:
-   # log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
-     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-
-eureka:
-  client:
-    register-with-eureka: ${REGISTER_WITH_EUREKA:true}
-
-# com.persagy包的日志等级为info
-logging:
-  config: classpath:logback-spring.xml
-  level:
-    com:
-      persagy: info
-
-
+server:
+  port:
+    9979
+spring:
+  application:
+    name: energy-dmp-alarm
+  profiles:
    active: dev
  cloud:
+    config:
        profile: prod
+        uri: http://192.168.100.102:32435
+  jackson:
+    serialization:
+      # 统一将时间都转为时间戳
+      write-dates-as-timestamps: true
+    # 设置时间戳的时区
+    time-zone: Asia/Shanghai
+  datasource:
+    url: jdbc:mysql://${mysql.ip}:${mysql.port}/${mysql.database}?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
+    dynamic:
+      primary: master
+      strict: false
+      datasource:
+        master:
+          schema: classpath*:db/init/table.sql
+          data: classpath*:db/init/data.sql
+          continue-on-error: true
+          # MYSQL_SCHEMA建议使用默认值。如果有特殊需求,建议在环境变量中配置该值
+          url: jdbc:mysql://${mysql.ip}:${mysql.port}/${mysql.database}?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
+          username: ${MYSQL_USERNAME:${spring.datasource.username}}
+          password: ${MYSQL_PASSWORD:${spring.datasource.password}}
+          driver-class-name: com.mysql.cj.jdbc.Driver
+feign:
+  compression:
+    response:
+      # feign返回结果不压缩
+      enabled: false
+    request:
+      # feign请求参数不压缩
+      enabled: false
+
+integrated:
+  swagger:
+    # 接口文档版本
+    version: v1.0.0
+    # 接口访问地址
+    termsOfServiceUrl: localhost
+    # 作者信息
+    contact:
+      name: lixing
+    # 只展示com.persagy包下的接口, 不展示swagger默认的接口
+    basePackage: com.persagy
+    # 接口文档简介
+    description: --
+    # 接口文档名称
+    title: energy-dmp-alarm 接口文档
+
+# 不打印sql
+mybatis-plus:
+  configuration:
+   # log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
+     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+eureka:
+  client:
+    register-with-eureka: ${REGISTER_WITH_EUREKA:true}
+
+# com.persagy包的日志等级为info
+logging:
+  config: classpath:logback-spring.xml
+  level:
+    com:
+      persagy: info
+
+

+ 1 - 1
src/main/resources/mapper/AlarmConfigMapper.xml

@@ -12,7 +12,7 @@
 		<result column="category" property="category" />
 		<result column="level" property="level" />
 		<result column="remark" property="remark" />
-		<result column="condition" property="condition" />
+		<result column="condition" property="condition" typeHandler="com.persagy.apm.dmpalarm.config.MybatisJsonHandler" />
 		<result column="open" property="open" />
 		<result column="concern" property="concern" />
 		<result column="user_defined" property="userDefined" />

+ 1 - 1
src/main/resources/mapper/AlarmItemMapper.xml

@@ -8,7 +8,7 @@
 		<result column="category" property="category" />
 		<result column="level" property="level" />
 		<result column="remark" property="remark" />
-		<result column="condition" property="condition" />
+		<result column="condition" property="condition" typeHandler="com.persagy.apm.dmpalarm.config.MybatisJsonHandler"/>
 		<result column="deal_fun" property="dealFun" />
 		<result column="create_user" property="createUser" />
 		<result column="project_id" property="projectId" />

+ 1 - 1
src/main/resources/mapper/AlarmTargetMapper.xml

@@ -5,7 +5,7 @@
 		<result column="id" property="id" />
 		<result column="item_code" property="itemCode" />
 		<result column="class_code" property="classCode" />
-		<result column="condition" property="condition" />
+		<result column="condition" property="condition" typeHandler="com.persagy.apm.dmpalarm.config.MybatisJsonHandler" />
 		<result column="level" property="level" />
 		<result column="concern" property="concern" />
 		<result column="open" property="open" />