Browse Source

init dmp-alarm

lixing 4 years ago
parent
commit
6867829074
59 changed files with 4294 additions and 0 deletions
  1. 150 0
      dmp-alarm/pom.xml
  2. 57 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/AlarmApp.java
  3. 26 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/client/PhysicalWorldClient.java
  4. 33 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/client/PhysicalWorldFallBackFactory.java
  5. 45 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/config/DmpMessageAspect.java
  6. 32 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/config/GlobalExceptionHandler.java
  7. 75 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/config/QueryAspect.java
  8. 116 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/config/RequestLogAspect.java
  9. 63 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/config/RequestParamCheckAspect.java
  10. 46 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/config/WebConfig.java
  11. 39 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/controller/AlarmCommentController.java
  12. 90 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/controller/AlarmConfigController.java
  13. 39 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/controller/AlarmItemController.java
  14. 42 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/controller/AlarmLogController.java
  15. 39 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/controller/AlarmRecordController.java
  16. 38 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/controller/AlarmTargetController.java
  17. 61 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/entity/AlarmComment.java
  18. 123 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/entity/AlarmConfig.java
  19. 88 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/entity/AlarmItem.java
  20. 81 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/entity/AlarmLog.java
  21. 135 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/entity/AlarmRecord.java
  22. 82 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/entity/AlarmTarget.java
  23. 14 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/enumeration/EnumAlarmLogType.java
  24. 31 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/enumeration/EnumAlarmMessageType.java
  25. 13 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/enumeration/EnumAlarmRecordWithColumns.java
  26. 68 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/JmsConfig.java
  27. 14 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/MessageExecutor.java
  28. 86 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/MessageProcesser.java
  29. 38 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/executor/AlarmItemCreateExecutor.java
  30. 41 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/executor/AlarmItemUpdateExecutor.java
  31. 36 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/executor/AlarmTargetCreateExecutor.java
  32. 37 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/executor/AlarmTargetDeleteExecutor.java
  33. 37 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/executor/AlarmTargetUpdateExecutor.java
  34. 40 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/executor/InstanceObjDeleteExecutor.java
  35. 21 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmCommentModel.java
  36. 31 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmConfigModel.java
  37. 14 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmConfigModels.java
  38. 28 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmItemModel.java
  39. 28 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmLogModel.java
  40. 63 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmRecordModel.java
  41. 27 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmTargetModel.java
  42. 9 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/repository/AlarmCommentRepository.java
  43. 9 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/repository/AlarmConfigRepository.java
  44. 9 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/repository/AlarmItemRepository.java
  45. 9 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/repository/AlarmLogRepository.java
  46. 9 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/repository/AlarmRecordRepository.java
  47. 9 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/repository/AlarmTargetRepository.java
  48. 48 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmBaseService.java
  49. 74 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmCommentService.java
  50. 775 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmConfigService.java
  51. 208 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmItemService.java
  52. 149 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmLogService.java
  53. 247 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmRecordService.java
  54. 329 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmTargetService.java
  55. 78 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/PhysicalWorldService.java
  56. 101 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/util/CheckRequiredParam.java
  57. 5 0
      dmp-alarm/src/main/resources/bootstrap-aliyun-test.yml
  58. 12 0
      dmp-alarm/src/main/resources/bootstrap.yml
  59. 47 0
      dmp-alarm/src/main/resources/logback-spring.xml

+ 150 - 0
dmp-alarm/pom.xml

@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>persagy-dmp</artifactId>
+        <groupId>com.persagy</groupId>
+        <version>4.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>dmp-alarm</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-model</artifactId>
+            <version>4.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-common</artifactId>
+            <version>4.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.1.21</version>
+        </dependency>
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-apt</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-sql</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.vladmihalcea</groupId>
+            <artifactId>hibernate-types-52</artifactId>
+            <version>2.9.13</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.47</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+            <version>4.4.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.9</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <!-- 注册中心 -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+
+        <!-- 配置中心 -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-config</artifactId>
+        </dependency>
+        <!-- rabbitmq -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+
+        <!-- feign -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <!-- hystrix 熔断器 -->
+        <dependency>
+            <groupId>com.netflix.hystrix</groupId>
+            <artifactId>hystrix-javanica</artifactId>
+            <version>1.5.12</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>dmp-alarm</finalName>
+        <plugins>
+            <plugin>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-maven-plugin</artifactId>
+            <configuration>
+                <fork>true</fork>
+                <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
+            </configuration>
+            <executions>
+                <execution>
+                    <goals>
+                        <goal>repackage</goal>
+                    </goals>
+                </execution>
+            </executions>
+        </plugin>
+            <!--
+            -->
+            <plugin>
+                <groupId>com.mysema.maven</groupId>
+                <artifactId>apt-maven-plugin</artifactId>
+                <version>1.1.3</version>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>process</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>target/generated-sources</outputDirectory>
+                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 57 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/AlarmApp.java

@@ -0,0 +1,57 @@
+package com.persagy.dmp.alarm;
+
+import com.persagy.common.criteria.CriteriaUtils;
+import com.persagy.common.criteria.JpaUtils;
+import com.persagy.dmp.common.SpringUtils;
+import com.persagy.dmp.common.http.HttpUtils;
+import com.querydsl.jpa.impl.JPAQueryFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.annotation.EnableRabbit;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Bean;
+
+import javax.persistence.EntityManager;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-22
+ * @verison: 1.0
+ */
+@Slf4j
+@EnableRabbit
+@SpringCloudApplication
+@EnableFeignClients
+public class AlarmApp {
+
+	public static void main(String[] args) {
+		SpringApplication.run(AlarmApp.class, args);
+	}
+
+	@Bean
+	public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
+		return new JPAQueryFactory(entityManager);
+	}
+
+	@Bean
+	public CriteriaUtils criteriaUtils(@Autowired JPAQueryFactory jpaQueryFactory) {
+		return new CriteriaUtils(jpaQueryFactory);
+	}
+
+	@Bean
+	public JpaUtils jpaUtils(@Autowired EntityManager entityManager) {
+		return new JpaUtils(entityManager);
+	}
+
+	@Bean
+	public HttpUtils httpUtils() {
+		return new HttpUtils();
+	}
+
+	@Bean
+	public SpringUtils springUtils(){
+		return new SpringUtils();
+	}
+}

+ 26 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/client/PhysicalWorldClient.java

@@ -0,0 +1,26 @@
+package com.persagy.dmp.alarm.client;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.web.PagedResponse;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @description: 对接物理世界接口
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2020/10/20 5:04 下午
+ * @version: V1.0
+ **/
+//@FeignClient(name = "dmp-rwd", fallback = PhysicalWorldFallBackFactory.class)
+public interface PhysicalWorldClient {
+
+    @PostMapping("rwd/instance/object/query")
+    public PagedResponse<ObjectNode> queryObj(
+            @RequestParam("projectId") String projectId,
+            @RequestParam("groupCode") String groupCode,
+            @RequestBody JacksonCriteria criteria);
+}

+ 33 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/client/PhysicalWorldFallBackFactory.java

@@ -0,0 +1,33 @@
+package com.persagy.dmp.alarm.client;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.web.PagedResponse;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description:
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2020/10/26 2:04 下午
+ * @version: V1.0
+ **/
+@Slf4j
+@Component
+public class PhysicalWorldFallBackFactory implements FallbackFactory<PhysicalWorldClient> {
+
+    @Override
+    public PhysicalWorldClient create(Throwable throwable) {
+        return new PhysicalWorldClient() {
+            @Override
+            public PagedResponse<ObjectNode> queryObj(String projectId, String groupCode, JacksonCriteria criteria) {
+                // todo 抛出异常统一处理
+                log.error("物理世界接口请求失败,url: {}, projectId: {}, requestBody: {}",
+                        "/instance/object/query", projectId, criteria);
+                return null;
+            }
+        };
+    }
+}

+ 45 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/config/DmpMessageAspect.java

@@ -0,0 +1,45 @@
+package com.persagy.dmp.alarm.config;
+
+import com.persagy.common.web.BaseResponse;
+import com.persagy.dmp.alarm.jms.MessageProcesser;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-22
+ * @verison: 1.0
+ */
+@Aspect
+@Component
+public class DmpMessageAspect {
+	@Autowired
+	private MessageProcesser messageProcesser;
+
+	@Pointcut("execution(public * com.persagy.dmp.*.controller.*.*(..))")
+	public void controllerPoint() {
+	}
+
+	@AfterReturning(returning = "ret", pointcut = "controllerPoint()")
+	public void doAfterReturning(Object ret) {
+		if (ret != null) {
+			if (ret instanceof BaseResponse) {
+				BaseResponse resp = (BaseResponse) ret;
+				List<DmpMessage> messageList = resp.getMessageList();
+				if (messageList != null && messageList.size() > 0) {
+					for (DmpMessage message : messageList) {
+						messageProcesser.convertAndSend(message);
+					}
+				}
+			}
+		}
+	}
+}

+ 32 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/config/GlobalExceptionHandler.java

@@ -0,0 +1,32 @@
+package com.persagy.dmp.alarm.config;
+
+import com.persagy.common.web.MapResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @description: 全局异常处理
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2020/12/4 11:00 上午
+ * @version: V1.0
+ **/
+@RestControllerAdvice
+@Slf4j
+@Order(Ordered.HIGHEST_PRECEDENCE)
+public class GlobalExceptionHandler {
+    @ExceptionHandler(value = Exception.class)
+    MapResponse handleException(Exception e, HttpServletRequest request, HttpServletResponse response) {
+        log.error(e.getMessage());
+        MapResponse resp = new MapResponse();
+        resp.setResult("fail");
+        resp.setMessage(e.getMessage());
+        return resp;
+    }
+}

+ 75 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/config/QueryAspect.java

@@ -0,0 +1,75 @@
+package com.persagy.dmp.alarm.config;
+
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.common.web.BaseResponse;
+import com.persagy.dmp.config.DmpParameterStorage;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static com.persagy.dmp.alarm.config.RequestLogAspect.prepare;
+
+/**
+ * @description: 查询切面
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2020/12/3 9:42 上午
+ * @version: V1.0
+ */
+@Slf4j
+@Aspect
+@Component
+public class QueryAspect {
+	@Pointcut("execution(public * com.persagy.dmp.alarm.service.*.query(..))")
+	public void queryPoint() {
+	}
+
+	/**
+	 * @description: 在查询条件中增加根据项目id和集团编码
+	 * @param: joinPoint
+	 * @return: void
+	 * @exception:
+	 * @author: lixing
+	 * @company: Persagy Technology Co.,Ltd
+	 * @since: 2020/12/3 9:56 上午
+	 * @version: V1.0
+	 */
+	@Before("queryPoint()")
+	public void doBefore(JoinPoint joinPoint) {
+		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+		HttpServletRequest request = attributes.getRequest();
+
+		Object[] args = joinPoint.getArgs();
+		for (Object arg : args) {
+			if (arg instanceof JacksonCriteria) {
+				JacksonCriteria criteria = (JacksonCriteria) arg;
+				criteria.add("groupCode", request.getParameter("groupCode"));
+				/* 查询接口中,参数为0代表查询所有;报警条目查询例外,0代表查询通用*/
+				// 查询参数中不包含projectId,且param中projectId不等于0,将projectId放入查询条件
+				if (StringUtils.isEmpty(criteria.getString("projectId")) &&
+						!"0".equals(request.getParameter("projectId"))) {
+					criteria.add("projectId", request.getParameter("projectId"));
+				}
+				// 查询参数中不包含appId,且param中appId不等于0,将appId放入查询条件
+				if (StringUtils.isEmpty(criteria.getString("appId")) &&
+						!"0".equals(request.getParameter("appId"))) {
+					criteria.add("appId", request.getParameter("appId"));
+				}
+			}
+		}
+	}
+}

+ 116 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/config/RequestLogAspect.java

@@ -0,0 +1,116 @@
+package com.persagy.dmp.alarm.config;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.common.web.BaseResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @author: yaoll
+ * @date: 2020-09-22
+ * @verison: 1.0
+ */
+@Slf4j
+@Aspect
+@Component
+public class RequestLogAspect {
+
+	private static final ThreadLocal<LogData> dataStorage = new ThreadLocal();
+
+	private static final AtomicInteger flag = new AtomicInteger(10000000);
+
+
+	@Pointcut("execution(public * com.persagy.dmp.*.controller.*.*(..))")
+	public void controllerPoint() {
+	}
+
+	@Before("controllerPoint()")
+	public void doBefore(JoinPoint joinPoint) {
+		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+		HttpServletRequest request = attributes.getRequest();
+		LogData data = initFlag(request);
+		dataStorage.set(data);
+		log.info("{} REQUEST URL      : {} {}", data.intFlag, data.method, data.url);
+		log.info("{} REQUEST ARGS     : {}", data.intFlag, JacksonMapper.toSimpleJson(prepare(joinPoint)));
+	}
+
+	public static List<Object> prepare(JoinPoint joinPoint) {
+		Object[] args = joinPoint.getArgs();
+		List<Object> list = new LinkedList<>();
+		if (args != null && args.length > 0) {
+			for (Object arg : args) {
+				if (arg instanceof ServletRequest) {
+					continue;
+				}
+				if (arg instanceof ServletResponse) {
+					continue;
+				}
+				if (arg instanceof MultipartFile) {
+					continue;
+				}
+				list.add(arg);
+			}
+		}
+		return list;
+	}
+
+	@AfterReturning(returning = "ret", pointcut = "controllerPoint()")
+	public void doAfterReturning(Object ret) {
+
+		LogData data = dataStorage.get();
+		if (ret != null) {
+			if (ret instanceof BaseResponse) {
+				log.info("{} REQUEST DURATION : {} {} {}", data.intFlag, System.currentTimeMillis() - data.timestamp, ((BaseResponse) ret).getResult(), data.url);
+			} else {
+				log.info("{} REQUEST DURATION : {} {} {}", data.intFlag, System.currentTimeMillis() - data.timestamp, ret.getClass().getName(), data.url);
+			}
+		} else {
+			log.info("{} REQUEST DURATION : {} {} {}", data.intFlag, System.currentTimeMillis() - data.timestamp, "null", data.url);
+		}
+		dataStorage.remove();
+	}
+
+	@AfterThrowing(throwing = "ex", pointcut = "controllerPoint()")
+	public void doAfterThrowing(Throwable ex) {
+		LogData data = dataStorage.get();
+		log.error("{} REQUEST EXCEPTION: {} {} {}", data.intFlag, System.currentTimeMillis() - data.timestamp, data.url, ex.getMessage());
+		dataStorage.remove();
+	}
+
+	private static LogData initFlag(HttpServletRequest request) {
+		LogData data = new LogData();
+		data.timestamp = System.currentTimeMillis();
+		data.method = request.getMethod();
+
+		String requestURI = request.getRequestURI();
+		String queryString = request.getQueryString();
+		data.url = requestURI + (queryString == null ? "" : "?" + queryString);
+
+		int result = flag.addAndGet(1);
+		if (result >= 99999999) {
+			flag.set(10000000);
+		}
+		data.intFlag = result;
+		dataStorage.set(data);
+		return data;
+	}
+
+	private static class LogData {
+		Integer intFlag;
+		Long timestamp;
+		String url;
+		String method;
+	}
+}

+ 63 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/config/RequestParamCheckAspect.java

@@ -0,0 +1,63 @@
+package com.persagy.dmp.alarm.config;
+
+import com.persagy.common.criteria.JacksonCriteria;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @description: 查询切面
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2020/12/3 9:42 上午
+ * @version: V1.0
+ */
+@Slf4j
+@Aspect
+@Component
+public class RequestParamCheckAspect {
+
+	private static final String errorInfo = "request url中参数[%s]不能为空";
+	@Pointcut("execution(public * com.persagy.dmp.alarm.controller.*.*(..))")
+	public void point() {
+	}
+
+	/**
+	 * @description: 校验参数中的必填项
+	 * @param: joinPoint
+	 * @return: void
+	 * @exception:
+	 * @author: lixing
+	 * @company: Persagy Technology Co.,Ltd
+	 * @since: 2020/12/3 9:56 上午
+	 * @version: V1.0
+	 */
+	@Before("point()")
+	public void doBefore(JoinPoint joinPoint) throws Exception{
+		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+		HttpServletRequest request = attributes.getRequest();
+		String projectId = request.getParameter("projectId");
+		String groupCode = request.getParameter("groupCode");
+		String appId = request.getParameter("appId");
+		String userId = request.getParameter("userId");
+
+		if (StringUtils.isEmpty(projectId)) {
+			throw new RuntimeException(String.format(errorInfo, "projectId"));
+		}
+		if (StringUtils.isEmpty(groupCode)) {
+			throw new RuntimeException(String.format(errorInfo, "groupCode"));
+		}
+		if (StringUtils.isEmpty(userId)) {
+			throw new RuntimeException(String.format(errorInfo, "userId"));
+		}
+	}
+
+}

+ 46 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/config/WebConfig.java

@@ -0,0 +1,46 @@
+package com.persagy.dmp.alarm.config;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.config.DmpParameterStorage;
+import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
+import org.springframework.amqp.support.converter.MessageConverter;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * @author: yaoll
+ * @date: 2020-09-22
+ * @verison: 1.0
+ */
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+	@Bean
+	public DmpParameterStorage dmpParameterStorage() {
+		return new DmpParameterStorage();
+	}
+
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+		// 设置拦截的路径、不拦截的路径、优先级等等
+		registry.addInterceptor(dmpParameterStorage()).addPathPatterns("/**");
+	}
+
+	@Bean
+	public HttpMessageConverters customConverters() {
+		MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
+		converter.setObjectMapper(JacksonMapper.nonEmptyMapper);
+		return new HttpMessageConverters(converter);
+	}
+
+	// JMS 使用
+	@Bean
+	public MessageConverter customMessageConvert() {
+		return new Jackson2JsonMessageConverter();
+	}
+
+}

+ 39 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/controller/AlarmCommentController.java

@@ -0,0 +1,39 @@
+package com.persagy.dmp.alarm.controller;
+
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.web.MapResponse;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.alarm.model.AlarmCommentModel;
+import com.persagy.dmp.alarm.service.AlarmCommentService;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+@RestController
+@RequestMapping("/alarm/comment")
+public class AlarmCommentController {
+	@Autowired
+	private AlarmCommentService service;
+	
+	@PostMapping("/query")
+	public PagedResponse<AlarmCommentModel> query(@RequestBody JacksonCriteria criteria) {
+		return service.query(criteria);
+	}
+	
+	@PostMapping("/create")
+	public MapResponse create(@RequestBody AlarmCommentModel param){
+		return service.create(param);
+	}
+	
+//	@PostMapping("/update")
+//	public MapResponse update(@RequestBody AlarmCommentModel param){
+//		return service.update(param);
+//	}
+//
+//	@PostMapping("/delete")
+//	public MapResponse delete(@RequestBody AlarmCommentModel param){
+//		return service.delete(param);
+//	}
+	
+}

+ 90 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/controller/AlarmConfigController.java

@@ -0,0 +1,90 @@
+package com.persagy.dmp.alarm.controller;
+
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.web.MapResponse;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.alarm.model.AlarmConfigModel;
+import com.persagy.dmp.alarm.model.AlarmConfigModels;
+import com.persagy.dmp.alarm.service.AlarmConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+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 java.util.List;
+
+@RestController
+@RequestMapping("/alarm/config")
+public class AlarmConfigController {
+    @Autowired
+    private AlarmConfigService service;
+
+    @PostMapping("/query")
+    public PagedResponse<AlarmConfigModel> query(@RequestBody JacksonCriteria criteria) {
+        return service.query(criteria);
+    }
+
+    @PostMapping("/create")
+    public MapResponse create(@RequestBody AlarmConfigModel param) {
+        return service.create(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_create")
+    public MapResponse batchCreate(@RequestBody AlarmConfigModels configModelsObj) {
+        List<AlarmConfigModel> configModels = configModelsObj.getAlarmConfigs();
+        if (configModels == null) {
+            MapResponse response = new MapResponse();
+            response.setFail("请传入要创建的报警定义!");
+            return response;
+        }
+        return service.batchCreate(configModels);
+    }
+
+    @PostMapping("/update")
+    public MapResponse update(@RequestBody AlarmConfigModel param) {
+        return service.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 AlarmConfigModels configModelsObj) {
+        List<AlarmConfigModel> configModels = configModelsObj.getAlarmConfigs();
+        if (configModels == null) {
+            MapResponse response = new MapResponse();
+            response.setFail("请传入要修改的报警定义!");
+            return response;
+        }
+        return service.batchUpdate(configModels);
+    }
+
+    //	@PostMapping("/delete")
+    //	public MapResponse delete(@RequestBody AlarmConfigModel param){
+    //		return service.delete(param);
+    //	}
+
+
+    @PostMapping("/init")
+    public MapResponse init(@RequestBody AlarmConfigModel param) {
+        return service.init(param);
+    }
+}

+ 39 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/controller/AlarmItemController.java

@@ -0,0 +1,39 @@
+package com.persagy.dmp.alarm.controller;
+
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.web.MapResponse;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.alarm.model.AlarmItemModel;
+import com.persagy.dmp.alarm.service.AlarmItemService;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+@RestController
+@RequestMapping("/alarm/item")
+public class AlarmItemController {
+	@Autowired
+	private AlarmItemService service;
+	
+	@PostMapping("/query")
+	public PagedResponse<AlarmItemModel> query(@RequestBody JacksonCriteria criteria) {
+		return service.query(criteria);
+	}
+	
+	@PostMapping("/create")
+	public MapResponse create(@RequestBody AlarmItemModel param){
+		return service.create(param);
+	}
+
+	@PostMapping("/update")
+	public MapResponse update(@RequestBody AlarmItemModel param){
+		return service.update(param);
+	}
+//
+//	@PostMapping("/delete")
+//	public MapResponse delete(@RequestBody AlarmItemModel param){
+//		return service.delete(param);
+//	}
+	
+}

+ 42 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/controller/AlarmLogController.java

@@ -0,0 +1,42 @@
+package com.persagy.dmp.alarm.controller;
+
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.web.MapResponse;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.alarm.model.AlarmLogModel;
+import com.persagy.dmp.alarm.service.AlarmLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+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 javax.validation.Valid;
+
+@RestController
+@RequestMapping("/alarm/log")
+public class AlarmLogController {
+	@Autowired
+	private AlarmLogService service;
+	
+	@PostMapping("/query")
+	public PagedResponse<AlarmLogModel> query(@RequestBody JacksonCriteria criteria) {
+		return service.query(criteria);
+	}
+	
+	@PostMapping("/create")
+	public MapResponse create(@RequestBody AlarmLogModel param){
+		return service.create(param);
+	}
+	
+//	@PostMapping("/update")
+//	public MapResponse update(@RequestBody AlarmLogModel param){
+//		return service.update(param);
+//	}
+//
+//	@PostMapping("/delete")
+//	public MapResponse delete(@RequestBody AlarmLogModel param){
+//		return service.delete(param);
+//	}
+	
+}

+ 39 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/controller/AlarmRecordController.java

@@ -0,0 +1,39 @@
+package com.persagy.dmp.alarm.controller;
+
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.web.MapResponse;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.alarm.model.AlarmRecordModel;
+import com.persagy.dmp.alarm.service.AlarmRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+@RestController
+@RequestMapping("/alarm/record")
+public class AlarmRecordController {
+	@Autowired
+	private AlarmRecordService service;
+	
+	@PostMapping("/query")
+	public PagedResponse<AlarmRecordModel> query(@RequestBody JacksonCriteria criteria) {
+		return service.query(criteria);
+	}
+	
+	@PostMapping("/create")
+	public MapResponse create(@RequestBody AlarmRecordModel param){
+		return service.create(param);
+	}
+	
+	@PostMapping("/update")
+	public MapResponse update(@RequestBody AlarmRecordModel param){
+		return service.update(param);
+	}
+	
+//	@PostMapping("/delete")
+//	public MapResponse delete(@RequestBody AlarmRecordModel param){
+//		return service.delete(param);
+//	}
+	
+}

+ 38 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/controller/AlarmTargetController.java

@@ -0,0 +1,38 @@
+package com.persagy.dmp.alarm.controller;
+
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.web.MapResponse;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.alarm.model.AlarmTargetModel;
+import com.persagy.dmp.alarm.service.AlarmTargetService;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+@RestController
+@RequestMapping("/alarm/target")
+public class AlarmTargetController {
+	@Autowired
+	private AlarmTargetService service;
+	
+	@PostMapping("/query")
+	public PagedResponse<AlarmTargetModel> query(@RequestBody JacksonCriteria criteria) {
+		return service.query(criteria);
+	}
+	
+	@PostMapping("/create")
+	public MapResponse create(@RequestBody AlarmTargetModel param){
+		return service.create(param);
+	}
+	
+	@PostMapping("/update")
+	public MapResponse update(@RequestBody AlarmTargetModel param){
+		return service.update(param);
+	}
+	
+	@PostMapping("/delete")
+	public MapResponse delete(@RequestBody AlarmTargetModel param){
+		return service.delete(param);
+	}
+}

+ 61 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/entity/AlarmComment.java

@@ -0,0 +1,61 @@
+package com.persagy.dmp.alarm.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+import com.persagy.dmp.alarm.model.AlarmCommentModel;
+import org.hibernate.annotations.GenericGenerator;
+import javax.persistence.GeneratedValue;
+import javax.persistence.*;
+import java.util.Date;
+
+@Setter
+@Getter
+@Entity
+@Table(name = "alarm_comment")
+public class AlarmComment {
+
+	@Id
+	@GeneratedValue(generator = "assignedId")
+	@GenericGenerator(name = "assignedId", strategy = "assigned")
+	private String id;
+	private String recordId;
+	private String content;
+	private String createUser;
+	private Date createTime;
+//	private Date updateTime;
+//	private String updateUser;
+//	private Integer valid;
+	private String projectId;
+	private String groupCode;
+
+	public static AlarmComment fromModel(AlarmCommentModel model) {
+		AlarmComment entity = new AlarmComment();
+		entity.setId(model.getId());
+		entity.setRecordId(model.getRecordId());
+		entity.setContent(model.getContent());
+		entity.setCreateUser(model.getCreateUser());
+		entity.setCreateTime(model.getCreateTime());
+//		entity.setUpdateTime(model.getUpdateTime());
+//		entity.setUpdateUser(model.getUpdateUser());
+//		entity.setValid(model.getValid());
+		entity.setProjectId(model.getProjectId());
+		entity.setGroupCode(model.getGroupCode());
+		return entity;
+	}
+
+	public AlarmCommentModel toModel() {
+		AlarmCommentModel model = new AlarmCommentModel();
+		model.setId(this.id);
+		model.setRecordId(this.getRecordId());
+		model.setContent(this.getContent());
+		model.setCreateUser(this.getCreateUser());
+		model.setCreateTime(this.getCreateTime());
+//		model.setUpdateTime(this.getUpdateTime());
+//		model.setUpdateUser(this.getUpdateUser());
+//		model.setValid(this.getValid());
+		model.setProjectId(this.getProjectId());
+		model.setGroupCode(this.getGroupCode());
+		return model;
+	}
+
+}

+ 123 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/entity/AlarmConfig.java

@@ -0,0 +1,123 @@
+package com.persagy.dmp.alarm.entity;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.vladmihalcea.hibernate.type.json.JsonStringType;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import com.persagy.dmp.alarm.model.AlarmConfigModel;
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.TypeDef;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.*;
+import java.util.Date;
+
+@Setter
+@Getter
+@Entity
+@TypeDef(name = "json", typeClass = JsonStringType.class)
+@Table(name = "alarm_config")
+public class AlarmConfig {
+
+	@Id
+	@GeneratedValue(generator = "assignedId")
+	@GenericGenerator(name = "assignedId", strategy = "assigned")
+	private String id;
+	private String objId;
+	private String classCode;
+	private String projectId;
+	private String itemCode;
+	private String targetId;
+	private String category;
+	@Column(name="`level`")
+	private String level;
+	private String remark;
+	private String groupCode;
+
+	@Type(type = "json")
+	@Column(name="`condition`")
+	private ObjectNode condition;
+	@Column(name="`open`")
+	private Integer open;
+	private Integer concern;
+	private Integer userDefined;
+	private String createUser;
+	private Date createTime;
+	private String updateUser;
+	private Date updateTime;
+	private Integer valid;
+
+	public static AlarmConfig fromModel(AlarmConfigModel model) {
+		AlarmConfig entity = new AlarmConfig();
+		entity.setId(model.getId());
+		entity.setObjId(model.getObjId());
+		entity.setClassCode(model.getClassCode());
+		entity.setProjectId(model.getProjectId());
+		entity.setItemCode(model.getItemCode());
+		entity.setTargetId(model.getTargetId());
+		entity.setCategory(model.getCategory());
+		entity.setLevel(model.getLevel());
+		entity.setRemark(model.getRemark());
+		entity.setCondition(model.getCondition());
+		entity.setOpen(model.getOpen());
+		entity.setConcern(model.getConcern());
+		entity.setUserDefined(model.getUserDefined());
+		entity.setCreateUser(model.getCreateUser());
+		entity.setCreateTime(model.getCreateTime());
+		entity.setUpdateUser(model.getUpdateUser());
+		entity.setUpdateTime(model.getUpdateTime());
+		entity.setValid(model.getValid());
+		entity.setGroupCode(model.getGroupCode());
+		return entity;
+	}
+
+	public AlarmConfigModel toModel() {
+		AlarmConfigModel model = new AlarmConfigModel();
+		model.setId(this.id);
+		model.setObjId(this.getObjId());
+		model.setClassCode(this.getClassCode());
+		model.setProjectId(this.getProjectId());
+		model.setItemCode(this.getItemCode());
+		model.setTargetId(this.getTargetId());
+		model.setCategory(this.getCategory());
+		model.setLevel(this.getLevel());
+		model.setRemark(this.getRemark());
+		model.setCondition(this.getCondition());
+		model.setOpen(this.getOpen());
+		model.setConcern(this.getConcern());
+		model.setUserDefined(this.getUserDefined());
+		model.setCreateUser(this.getCreateUser());
+		model.setCreateTime(this.getCreateTime());
+		model.setUpdateUser(this.getUpdateUser());
+		model.setUpdateTime(this.getUpdateTime());
+		model.setValid(this.getValid());
+		model.setGroupCode(this.getGroupCode());
+		return model;
+	}
+
+	/**
+	 * @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;
+
+		AlarmConfigUnique(String itemCode, String objId) {
+			this.itemCode = itemCode;
+			this.objId = objId;
+		}
+	}
+
+	public AlarmConfigUnique getAlarmConfigUnique() {
+		return new AlarmConfigUnique(this.itemCode, this.objId);
+	}
+
+}

+ 88 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/entity/AlarmItem.java

@@ -0,0 +1,88 @@
+package com.persagy.dmp.alarm.entity;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.vladmihalcea.hibernate.type.json.JsonStringType;
+import lombok.Getter;
+import lombok.Setter;
+import com.persagy.dmp.alarm.model.AlarmItemModel;
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.TypeDef;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.*;
+import java.util.Date;
+
+@Setter
+@Getter
+@Entity
+@TypeDef(name = "json", typeClass = JsonStringType.class)
+@Table(name = "alarm_item")
+public class AlarmItem {
+
+	@Id
+	@GeneratedValue(generator = "assignedId")
+	@GenericGenerator(name = "assignedId", strategy = "assigned")
+	private String id;
+	private String code;
+	private String name;
+	private String category;
+	private String level;
+	private String remark;
+
+	@Type(type = "json")
+	private ObjectNode condition;
+	private String dealFun;
+	private String createUser;
+	private Date createTime;
+	private String updateUser;
+	private Date updateTime;
+	private Integer valid;
+	private String projectId;
+	private String groupCode;
+	@Column(name="`app_id`")
+	private String appId;
+
+	public static AlarmItem fromModel(AlarmItemModel model) {
+		AlarmItem entity = new AlarmItem();
+		entity.setId(model.getId());
+		entity.setCode(model.getCode());
+		entity.setName(model.getName());
+		entity.setCategory(model.getCategory());
+		entity.setLevel(model.getLevel());
+		entity.setRemark(model.getRemark());
+		entity.setCondition(model.getCondition());
+		entity.setDealFun(model.getDealFun());
+		entity.setCreateUser(model.getCreateUser());
+		entity.setCreateTime(model.getCreateTime());
+		entity.setUpdateUser(model.getUpdateUser());
+		entity.setUpdateTime(model.getUpdateTime());
+		entity.setValid(model.getValid());
+		entity.setProjectId(model.getProjectId());
+		entity.setGroupCode(model.getGroupCode());
+		entity.setAppId(model.getAppId());
+		return entity;
+	}
+
+	public AlarmItemModel toModel() {
+		AlarmItemModel model = new AlarmItemModel();
+		model.setId(this.id);
+		model.setCode(this.getCode());
+		model.setName(this.getName());
+		model.setCategory(this.getCategory());
+		model.setLevel(this.getLevel());
+		model.setRemark(this.getRemark());
+		model.setCondition(this.getCondition());
+		model.setDealFun(this.getDealFun());
+		model.setCreateUser(this.getCreateUser());
+		model.setCreateTime(this.getCreateTime());
+		model.setUpdateUser(this.getUpdateUser());
+		model.setUpdateTime(this.getUpdateTime());
+		model.setValid(this.getValid());
+		model.setProjectId(this.getProjectId());
+		model.setGroupCode(this.getGroupCode());
+		model.setAppId(this.getAppId());
+		return model;
+	}
+
+}

+ 81 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/entity/AlarmLog.java

@@ -0,0 +1,81 @@
+package com.persagy.dmp.alarm.entity;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.alarm.enumeration.EnumAlarmLogType;
+import com.vladmihalcea.hibernate.type.json.JsonStringType;
+import lombok.Getter;
+import lombok.Setter;
+import com.persagy.dmp.alarm.model.AlarmLogModel;
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.TypeDef;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.*;
+import java.util.Date;
+
+@Setter
+@Getter
+@Entity
+@Table(name = "alarm_log")
+@TypeDef(name = "json", typeClass = JsonStringType.class)
+public class AlarmLog {
+
+	@Id
+	@GeneratedValue(generator = "assignedId")
+	@GenericGenerator(name = "assignedId", strategy = "assigned")
+	private String id;
+	private String recordId;
+	@Column(name = "`type`")
+	private EnumAlarmLogType type;
+	private Integer nature;
+	@Column(name = "`before`")
+	private Integer before;
+	@Column(name = "`after`")
+	private Integer after;
+	@Type(type = "json")
+	private ObjectNode remark;
+	private Date createTime;
+	private String createUser;
+	private Date updateTime;
+	private Integer valid;
+	private String projectId;
+	private String groupCode;
+
+	public static AlarmLog fromModel(AlarmLogModel model) {
+		AlarmLog entity = new AlarmLog();
+		entity.setId(model.getId());
+		entity.setRecordId(model.getRecordId());
+		entity.setType(model.getType());
+		entity.setNature(model.getNature());
+		entity.setBefore(model.getBefore());
+		entity.setAfter(model.getAfter());
+		entity.setRemark(model.getRemark());
+		entity.setCreateTime(model.getCreateTime());
+		entity.setProjectId(model.getProjectId());
+		entity.setGroupCode(model.getGroupCode());
+		entity.setCreateUser(model.getCreateUser());
+//		entity.setUpdateTime(model.getUpdateTime());
+//		entity.setValid(model.getValid());
+		return entity;
+	}
+
+	public AlarmLogModel toModel() {
+		AlarmLogModel model = new AlarmLogModel();
+		model.setId(this.id);
+		model.setRecordId(this.getRecordId());
+		model.setType(this.getType());
+		model.setNature(this.getNature());
+		model.setBefore(this.getBefore());
+		model.setAfter(this.getAfter());
+		model.setRemark(this.getRemark());
+		model.setCreateTime(this.getCreateTime());
+		model.setProjectId(this.getProjectId());
+		model.setGroupCode(this.getGroupCode());
+		model.setCreateUser(this.getCreateUser());
+//		model.setUpdateTime(this.getUpdateTime());
+//		model.setValid(this.getValid());
+		return model;
+	}
+
+}

+ 135 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/entity/AlarmRecord.java

@@ -0,0 +1,135 @@
+package com.persagy.dmp.alarm.entity;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.vladmihalcea.hibernate.type.json.JsonStringType;
+import lombok.Getter;
+import lombok.Setter;
+import com.persagy.dmp.alarm.model.AlarmRecordModel;
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.TypeDef;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.*;
+import java.util.Date;
+
+@Setter
+@Getter
+@Entity
+@Table(name = "alarm_record")
+@TypeDef(name = "json", typeClass = JsonStringType.class)
+public class AlarmRecord {
+
+	@Id
+	@GeneratedValue(generator = "assignedId")
+	@GenericGenerator(name = "assignedId", strategy = "assigned")
+	private String id;
+	private String itemCode;
+	private String projectId;
+	private String objId;
+	private String classCode;
+	private String level;
+	private String remark;
+	private String name;
+	private String category;
+	private Integer concern;
+	private Integer state;
+	private Date effectStartTime;
+	private Date effectEndTime;
+	/** 报警性质 */
+	private Integer nature;
+	/** 处理方式 */
+	private Integer treatMode;
+	/** 处理状态 */
+	private Integer treatState;
+	private String createUser;
+	@Type(type = "json")
+	@Column(name="`condition`")
+	private ObjectNode condition;
+	@Type(type = "json")
+	private ObjectNode triggerInfo;
+	private Date triggerTime;
+	@Type(type = "json")
+	private ObjectNode endInfo;
+	private Date endTime;
+	private Date createTime;
+	private String updateUser;
+	private Date updateTime;
+	private Integer valid;
+	private String groupCode;
+	private String orderId;
+	private String orderState;
+	@Type(type = "json")
+	private ObjectNode supplement;
+
+	public static AlarmRecord fromModel(AlarmRecordModel model) {
+		AlarmRecord entity = new AlarmRecord();
+		entity.setId(model.getId());
+		entity.setItemCode(model.getItemCode());
+		entity.setProjectId(model.getProjectId());
+		entity.setObjId(model.getObjId());
+		entity.setClassCode(model.getClassCode());
+		entity.setLevel(model.getLevel());
+		entity.setRemark(model.getRemark());
+		entity.setName(model.getName());
+		entity.setCategory(model.getCategory());
+		entity.setConcern(model.getConcern());
+		entity.setState(model.getState());
+		entity.setEffectStartTime(model.getEffectStartTime());
+		entity.setEffectEndTime(model.getEffectEndTime());
+		entity.setNature(model.getNature());
+		entity.setTreatMode(model.getTreatMode());
+		entity.setTreatState(model.getTreatState());
+		entity.setCreateUser(model.getCreateUser());
+		entity.setCondition(model.getCondition());
+		entity.setTriggerInfo(model.getTriggerInfo());
+		entity.setTriggerTime(model.getTriggerTime());
+		entity.setEndInfo(model.getEndInfo());
+		entity.setEndTime(model.getEndTime());
+		entity.setCreateTime(model.getCreateTime());
+		entity.setUpdateUser(model.getUpdateUser());
+		entity.setUpdateTime(model.getUpdateTime());
+		entity.setValid(model.getValid());
+		entity.setGroupCode(model.getGroupCode());
+		entity.setOrderId(model.getOrderId());
+		entity.setOrderState(model.getOrderState());
+		entity.setSupplement(model.getSupplement());
+		return entity;
+	}
+
+	public AlarmRecordModel toModel() {
+		AlarmRecordModel model = new AlarmRecordModel();
+		model.setId(this.id);
+		model.setItemCode(this.getItemCode());
+		model.setProjectId(this.getProjectId());
+		model.setObjId(this.getObjId());
+		model.setClassCode(this.getClassCode());
+		model.setLevel(this.getLevel());
+		model.setRemark(this.getRemark());
+		model.setName(this.getName());
+		model.setCategory(this.getCategory());
+		model.setConcern(this.getConcern());
+		model.setState(this.getState());
+		model.setEffectStartTime(this.getEffectStartTime());
+		model.setEffectEndTime(this.getEffectEndTime());
+		model.setNature(this.getNature());
+		model.setTreatMode(this.getTreatMode());
+		model.setTreatState(this.getTreatState());
+		model.setCreateUser(this.getCreateUser());
+		model.setCondition(this.getCondition());
+		model.setTriggerInfo(this.getTriggerInfo());
+		model.setTriggerTime(this.getTriggerTime());
+		model.setEndInfo(this.getEndInfo());
+		model.setEndTime(this.getEndTime());
+		model.setCreateTime(this.getCreateTime());
+		model.setUpdateUser(this.getUpdateUser());
+		model.setUpdateTime(this.getUpdateTime());
+		model.setValid(this.getValid());
+		model.setGroupCode(this.getGroupCode());
+		model.setOrderId(this.getOrderId());
+		model.setOrderState(this.getOrderState());
+		model.setSupplement(this.getSupplement());
+		return model;
+	}
+
+}

+ 82 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/entity/AlarmTarget.java

@@ -0,0 +1,82 @@
+package com.persagy.dmp.alarm.entity;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.vladmihalcea.hibernate.type.json.JsonStringType;
+import lombok.Getter;
+import lombok.Setter;
+import com.persagy.dmp.alarm.model.AlarmTargetModel;
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.TypeDef;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.*;
+import java.util.Date;
+
+@Setter
+@Getter
+@Entity
+@TypeDef(name = "json", typeClass = JsonStringType.class)
+@Table(name = "alarm_target")
+public class AlarmTarget {
+
+	@Id
+	@GeneratedValue(generator = "assignedId")
+	@GenericGenerator(name = "assignedId", strategy = "assigned")
+	private String id;
+	private String itemCode;
+	private String classCode;
+
+	@Type(type = "json")
+	@Column(name = "`condition`")
+	private ObjectNode condition;
+	private Integer concern;
+	private String level;
+	private Integer open;
+	private String createUser;
+	private Date createTime;
+	private String updateUser;
+	private Date updateTime;
+	private Integer valid = 1;
+	private String projectId;
+	private String groupCode;
+
+	public static AlarmTarget fromModel(AlarmTargetModel model) {
+		AlarmTarget entity = new AlarmTarget();
+		entity.setId(model.getId());
+		entity.setItemCode(model.getItemCode());
+		entity.setClassCode(model.getClassCode());
+		entity.setCondition(model.getCondition());
+		entity.setLevel(model.getLevel());
+		entity.setConcern(model.getConcern());
+		entity.setOpen(model.getOpen());
+//		entity.setCreateUser(model.getCreateUser());
+//		entity.setCreateTime(model.getCreateTime());
+//		entity.setUpdateUser(model.getUpdateUser());
+//		entity.setUpdateTime(model.getUpdateTime());
+//		entity.setValid(model.getValid());
+//		entity.setProjectId(model.getProjectId());
+//		entity.setGroupCode(model.getGroupCode());
+		return entity;
+	}
+
+	public AlarmTargetModel toModel() {
+		AlarmTargetModel model = new AlarmTargetModel();
+		model.setId(this.id);
+		model.setItemCode(this.getItemCode());
+		model.setClassCode(this.getClassCode());
+		model.setCondition(this.getCondition());
+		model.setLevel(this.getLevel());
+		model.setConcern(this.getConcern());
+		model.setOpen(this.getOpen());
+		model.setCreateUser(this.getCreateUser());
+		model.setCreateTime(this.getCreateTime());
+		model.setUpdateUser(this.getUpdateUser());
+		model.setUpdateTime(this.getUpdateTime());
+		model.setValid(this.getValid());
+		model.setProjectId(this.getProjectId());
+		model.setGroupCode(this.getGroupCode());
+		return model;
+	}
+
+}

+ 14 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/enumeration/EnumAlarmLogType.java

@@ -0,0 +1,14 @@
+package com.persagy.dmp.alarm.enumeration;
+
+/**
+ * @description:
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2020/10/19 2:07 下午
+ * @version: V1.0
+ **/
+public enum EnumAlarmLogType {
+    ALARMSTATE,
+    TREATMODE,
+    TREATSTATE
+}

+ 31 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/enumeration/EnumAlarmMessageType.java

@@ -0,0 +1,31 @@
+package com.persagy.dmp.alarm.enumeration;
+
+import lombok.Getter;
+
+/**
+ * @description: 报警消息类型
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2020/10/22 8:08 下午
+ * @version: V1.0
+ **/
+public enum EnumAlarmMessageType {
+    ALARM_CONFIGS_CHANGE("alarmConfigsChange", "报警定义变动"),
+    ALARM_TARGET_UPDATE("alarmTargetUpdate", "报警匹配条件更新"),
+    ALARM_TARGET_CREATE("alarmTargetCreate", "新增报警匹配条件"),
+    ALARM_ITEM_CREATE("alarmItemCreate", "新增报警条目"),
+    ALARM_ITEM_UPDATE("alarmItemUpdate", "报警条目更新"),
+    ALARM_ITEM_DELETE("alarmItemDelete", "删除报警条目"),
+    ALARM_RECORD_CREATE("alarmRecordCreate", "新增报警"),
+    ALARM_RECORD_UPDATE("alarmRecordUpdate", "报警更新");
+
+    @Getter
+    private String value;
+    @Getter
+    private String desc;
+
+    EnumAlarmMessageType(String value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+}

+ 13 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/enumeration/EnumAlarmRecordWithColumns.java

@@ -0,0 +1,13 @@
+package com.persagy.dmp.alarm.enumeration;
+
+/**
+ * @description:
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2020/12/8 4:44 下午
+ * @version: V1.0
+ */
+public enum EnumAlarmRecordWithColumns {
+    ignoreTime,
+    treatEndTime
+}

+ 68 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/JmsConfig.java

@@ -0,0 +1,68 @@
+package com.persagy.dmp.alarm.jms;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.core.TopicExchange;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-22
+ * @verison: 1.0
+ */
+@Slf4j
+@Configuration
+public class JmsConfig {
+
+
+	@Value("${persagy.dmp.exchange}")
+	private String exchange;
+
+	@Value("${persagy.dmp.alarm.routingKey}")
+	private String alarmRoutingKey;
+
+	@Value("${persagy.dmp.rwd.routingKey}")
+	private String rwdRoutingKey;
+
+	@Value("${persagy.dmp.alarm.queue}")
+	private String alarmQueue;
+
+	@Autowired
+	private MessageProcesser messageProcesser;
+
+	@Bean
+	public TopicExchange exchange() {
+		return new TopicExchange(exchange);
+	}
+
+	@Bean
+	public Queue alarmQueue() {
+		return new Queue(alarmQueue, true);
+	}
+
+	@Bean
+	public Binding alarmBinding() {
+		return BindingBuilder.bind(alarmQueue()).to(exchange()).with(alarmRoutingKey);
+	}
+
+	@Bean
+	public Binding rwdBinding() {
+		return BindingBuilder.bind(alarmQueue()).to(exchange()).with(rwdRoutingKey);
+	}
+
+
+	@RabbitListener(queues = "${persagy.dmp.alarm.queue}")    //监听器监听指定的Queue
+	public void processC(DmpMessage message) {
+		log.info("============================== Receive:" + JacksonMapper.toSimpleJson(message));
+		messageProcesser.listen(message);
+	}
+
+}

+ 14 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/MessageExecutor.java

@@ -0,0 +1,14 @@
+package com.persagy.dmp.alarm.jms;
+
+import com.persagy.dmp.rwd.model.DmpMessage;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-22
+ * @verison: 1.0
+ */
+public interface MessageExecutor {
+
+	void execute(DmpMessage message);
+
+}

+ 86 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/MessageProcesser.java

@@ -0,0 +1,86 @@
+package com.persagy.dmp.alarm.jms;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.alarm.enumeration.EnumAlarmMessageType;
+import com.persagy.dmp.alarm.jms.executor.AlarmTargetUpdateExecutor;
+import com.persagy.dmp.common.SpringUtils;
+import com.persagy.dmp.config.DmpParameterStorage;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-22
+ * @verison: 1.0
+ */
+@Slf4j
+@Component
+public class MessageProcesser {
+
+	@Value("${persagy.dmp.exchange}")
+	private String exchange;
+
+	@Value("${persagy.dmp.alarm.routingKey}")
+	private String rwdRoutingKey;
+
+	@Autowired
+	private RabbitTemplate rabbitTemplate;
+
+	public void convertAndSend(DmpMessage message) {
+		log.info("向rabbitMQ发送消息,message:" + JacksonMapper.toSimpleJson(message));
+		rabbitTemplate.convertAndSend(exchange, rwdRoutingKey, message);
+	}
+
+	private static final Set<String> beanNames = new HashSet<>();
+
+	static {
+		beanNames.add(EnumAlarmMessageType.ALARM_TARGET_CREATE.getValue());
+		beanNames.add(EnumAlarmMessageType.ALARM_TARGET_UPDATE.getValue());
+		beanNames.add(EnumAlarmMessageType.ALARM_ITEM_UPDATE.getValue());
+//		由其他服务消费
+//		beanNames.add(RabbitMQConstants.ALARM_CONFIG_CREATE);
+//		beanNames.add(RabbitMQConstants.ALARM_CONFIG_DELETE);
+	}
+
+	public void listen(DmpMessage message) {
+		String type = message.getType();
+		if (!beanNames.contains(type)) {
+			return;
+		}
+
+		String executorName = type + "Executor";
+
+		MessageExecutor executor = null;
+		try {
+			executor = SpringUtils.getBean(executorName, MessageExecutor.class);
+		} catch (Exception e) {
+			log.error(e.getMessage());
+		}
+		if (executor == null) {
+			log.error("bean for [" + executorName + "] not exists");
+		}
+
+		try {
+			DmpParameterStorage.ParameterData data = new DmpParameterStorage.ParameterData();
+			data.setGroupCode(message.getGroupCode());
+			data.setProjectId(message.getProjectId());
+			data.setAppId(message.getAppId());
+
+			DmpParameterStorage.set(data);
+
+			executor.execute(message);
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			DmpParameterStorage.clear();
+		}
+	}
+
+}

+ 38 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/executor/AlarmItemCreateExecutor.java

@@ -0,0 +1,38 @@
+package com.persagy.dmp.alarm.jms.executor;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.common.web.BaseResponse;
+import com.persagy.common.web.MapResponse;
+import com.persagy.dmp.alarm.jms.MessageExecutor;
+import com.persagy.dmp.alarm.service.AlarmConfigService;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+/**
+ * @author: lixing
+ * @date: 2020-10-23
+ * @verison: 1.0
+ */
+@Slf4j
+@Component
+public class AlarmItemCreateExecutor implements MessageExecutor {
+	@Autowired
+	private AlarmConfigService alarmConfigService;
+
+	@Override
+	public void execute(DmpMessage message) {
+		log.info("AlarmItemCreate : {}", JacksonMapper.toSimpleJson(message));
+
+		/* 验证消息是否符合要求 */
+		String itemCode = message.getStr1();
+
+		if (StringUtils.isEmpty(itemCode)) {
+			log.error("AlarmItemUpdate消息中缺少itemCode信息");
+		}
+
+		// 消费消息,当前没有消费消息的场景,预留此接口
+	}
+}

+ 41 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/executor/AlarmItemUpdateExecutor.java

@@ -0,0 +1,41 @@
+package com.persagy.dmp.alarm.jms.executor;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.common.web.BaseResponse;
+import com.persagy.common.web.MapResponse;
+import com.persagy.dmp.alarm.jms.MessageExecutor;
+import com.persagy.dmp.alarm.service.AlarmConfigService;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+/**
+ * @author: lixing
+ * @date: 2020-10-23
+ * @verison: 1.0
+ */
+@Slf4j
+@Component
+public class AlarmItemUpdateExecutor implements MessageExecutor {
+	@Autowired
+	private AlarmConfigService alarmConfigService;
+
+	@Override
+	public void execute(DmpMessage message) {
+		log.info("AlarmItemUpdate : {}", JacksonMapper.toSimpleJson(message));
+
+		/* 验证消息是否符合要求 */
+		String itemCode = message.getStr1();
+
+		if (StringUtils.isEmpty(itemCode)) {
+			log.error("AlarmItemUpdate消息中缺少itemCode信息");
+		}
+
+		MapResponse response = alarmConfigService.batchUpdateWhenItemUpdate(itemCode, message.getProjectId(), message.getGroupCode());
+		if (BaseResponse.FAIL.equals(response.getResult())) {
+			log.error("消费AlarmItemUpdate消息异常,{}", response.getMessage());
+		}
+	}
+}

+ 36 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/executor/AlarmTargetCreateExecutor.java

@@ -0,0 +1,36 @@
+package com.persagy.dmp.alarm.jms.executor;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.common.web.BaseResponse;
+import com.persagy.common.web.MapResponse;
+import com.persagy.dmp.alarm.jms.MessageExecutor;
+import com.persagy.dmp.alarm.service.AlarmConfigService;
+import com.persagy.dmp.alarm.util.CheckRequiredParam;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author: lixing
+ * @date: 2020-10-23
+ * @verison: 1.0
+ */
+@Slf4j
+@Component
+public class AlarmTargetCreateExecutor implements MessageExecutor {
+    @Autowired
+    AlarmConfigService alarmConfigService;
+
+    @Override
+    public void execute(DmpMessage message) {
+        log.info("AlarmTargetCreate : {}", JacksonMapper.toSimpleJson(message));
+
+        /* 验证消息是否符合要求 */
+        CheckRequiredParam.check(message, "targetId", "projectId", "groupCode");
+        MapResponse response = alarmConfigService.batchUpdateWhenTargetUpdate(message.getTargetId(), message.getProjectId(), message.getGroupCode());
+        if (BaseResponse.FAIL.equals(response.getResult())) {
+            log.error("消费AlarmTargetCreate消息异常,{}", response.getMessage());
+        }
+    }
+}

+ 37 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/executor/AlarmTargetDeleteExecutor.java

@@ -0,0 +1,37 @@
+package com.persagy.dmp.alarm.jms.executor;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.common.web.BaseResponse;
+import com.persagy.common.web.MapResponse;
+import com.persagy.dmp.alarm.jms.MessageExecutor;
+import com.persagy.dmp.alarm.service.AlarmConfigService;
+import com.persagy.dmp.alarm.util.CheckRequiredParam;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author: lixing
+ * @date: 2020-10-23
+ * @verison: 1.0
+ */
+@Slf4j
+@Component
+public class AlarmTargetDeleteExecutor implements MessageExecutor {
+	@Autowired
+	private AlarmConfigService alarmConfigService;
+
+	@Override
+	public void execute(DmpMessage message) {
+		log.info("AlarmTargetDelete : {}", JacksonMapper.toSimpleJson(message));
+
+		/* 验证消息是否符合要求 */
+		CheckRequiredParam.check(message, "targetId", "projectId", "groupCode");
+
+		MapResponse response = alarmConfigService.batchDeleteWhenTargetDelete(message.getTargetId(), message.getProjectId(), message.getGroupCode());
+		if (BaseResponse.FAIL.equals(response.getResult())) {
+			log.error("消费AlarmTargetDelete消息异常,{}", response.getMessage());
+		}
+	}
+}

+ 37 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/executor/AlarmTargetUpdateExecutor.java

@@ -0,0 +1,37 @@
+package com.persagy.dmp.alarm.jms.executor;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.common.web.BaseResponse;
+import com.persagy.common.web.MapResponse;
+import com.persagy.dmp.alarm.jms.MessageExecutor;
+import com.persagy.dmp.alarm.service.AlarmConfigService;
+import com.persagy.dmp.alarm.util.CheckRequiredParam;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author: lixing
+ * @date: 2020-10-23
+ * @verison: 1.0
+ */
+@Slf4j
+@Component
+public class AlarmTargetUpdateExecutor implements MessageExecutor {
+    @Autowired
+    private AlarmConfigService alarmConfigService;
+
+    @Override
+    public void execute(DmpMessage message) {
+        log.info("AlarmTargetUpdate : {}", JacksonMapper.toSimpleJson(message));
+
+        /* 验证消息是否符合要求 */
+        CheckRequiredParam.check(message, "targetId", "projectId", "groupCode");
+
+        MapResponse response = alarmConfigService.batchUpdateWhenTargetUpdate(message.getTargetId(), message.getProjectId(), message.getGroupCode());
+        if (BaseResponse.FAIL.equals(response.getResult())) {
+            log.error("消费AlarmTargetUpdate消息异常,{}", response.getMessage());
+        }
+    }
+}

+ 40 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/jms/executor/InstanceObjDeleteExecutor.java

@@ -0,0 +1,40 @@
+package com.persagy.dmp.alarm.jms.executor;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.common.web.BaseResponse;
+import com.persagy.common.web.MapResponse;
+import com.persagy.dmp.alarm.jms.MessageExecutor;
+import com.persagy.dmp.alarm.service.AlarmConfigService;
+import com.persagy.dmp.alarm.util.CheckRequiredParam;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+/**
+ * @description: 对象类删除
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2020/12/10 10:53 上午
+ * @version: V1.0
+ */
+@Slf4j
+@Component
+public class InstanceObjDeleteExecutor implements MessageExecutor {
+	@Autowired
+	private AlarmConfigService alarmConfigService;
+
+	@Override
+	public void execute(DmpMessage message) {
+		log.info("InstanceObjDelete : {}", JacksonMapper.toSimpleJson(message));
+
+		/* 验证消息是否符合要求 */
+		CheckRequiredParam.check(message, "targetId", "projectId");
+
+		MapResponse response = alarmConfigService.deleteOnRemoveObj(message.getTargetId(), message.getProjectId());
+		if (BaseResponse.FAIL.equals(response.getResult())) {
+			log.error("消费InstanceObjDelete消息异常,{}", response.getMessage());
+		}
+	}
+}

+ 21 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmCommentModel.java

@@ -0,0 +1,21 @@
+package com.persagy.dmp.alarm.model;
+
+import lombok.Getter;
+import lombok.Setter;
+import java.util.Date;
+
+@Setter
+@Getter
+public class AlarmCommentModel {
+
+	private String id;
+	private String recordId;
+	private String content;
+	private String createUser;
+	private Date createTime;
+//	private Date updateTime;
+//	private String updateUser;
+//	private Integer valid;
+	private String projectId;
+	private String groupCode;
+}

+ 31 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmConfigModel.java

@@ -0,0 +1,31 @@
+package com.persagy.dmp.alarm.model;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+@Setter
+@Getter
+public class AlarmConfigModel {
+    private String id;
+    private String objId;
+    private String classCode;
+    private String projectId;
+    private String itemCode;
+    private String targetId;
+    private String category;
+    private String level;
+    private String remark;
+    private ObjectNode condition;
+    private Integer open;
+    private Integer concern;
+    private Integer userDefined;
+    private String createUser;
+    private Date createTime;
+    private String updateUser;
+    private Date updateTime;
+    private Integer valid;
+    private String groupCode;
+}

+ 14 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmConfigModels.java

@@ -0,0 +1,14 @@
+package com.persagy.dmp.alarm.model;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+@Setter
+@Getter
+public class AlarmConfigModels {
+    private List<AlarmConfigModel> alarmConfigs;
+}

+ 28 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmItemModel.java

@@ -0,0 +1,28 @@
+package com.persagy.dmp.alarm.model;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import lombok.Getter;
+import lombok.Setter;
+import java.util.Date;
+
+@Setter
+@Getter
+public class AlarmItemModel {
+
+	private String id;
+	private String code;
+	private String name;
+	private String category;
+	private String level;
+	private String remark;
+	private ObjectNode condition;
+	private String dealFun;
+	private String createUser;
+	private Date createTime;
+	private String updateUser;
+	private Date updateTime;
+	private Integer valid;
+	private String projectId;
+	private String groupCode;
+	private String appId;
+}

+ 28 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmLogModel.java

@@ -0,0 +1,28 @@
+package com.persagy.dmp.alarm.model;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.alarm.enumeration.EnumAlarmLogType;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+@Setter
+@Getter
+public class AlarmLogModel {
+	private String id;
+	private String recordId;
+	private EnumAlarmLogType type;
+	private Integer nature;
+	private Integer before;
+	private Integer after;
+	private ObjectNode remark;
+	private Date createTime;
+	private String projectId;
+	private String groupCode;
+	private String createUser;
+//	private Date updateTime;
+//	private Integer valid = 1;
+
+}

+ 63 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmRecordModel.java

@@ -0,0 +1,63 @@
+package com.persagy.dmp.alarm.model;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.annotations.Type;
+
+import java.util.Date;
+
+@Setter
+@Getter
+public class AlarmRecordModel {
+
+	private String id;
+	private String itemCode;
+	private String projectId;
+	private String objId;
+	private String classCode;
+	private String level;
+	private String remark;
+	private String name;
+	private String category;
+	private Integer concern;
+	private Integer state;
+	private Date effectStartTime;
+	private Date effectEndTime;
+	/**
+	 * 报警性质
+	 */
+	private Integer nature;
+	/**
+	 * 处理方式
+	 */
+	private Integer treatMode;
+	/**
+	 * 处理状态
+	 */
+	private Integer treatState;
+	private String createUser;
+	private ObjectNode condition;
+	private ObjectNode triggerInfo;
+	private Date triggerTime;
+	private ObjectNode endInfo;
+	private Date endTime;
+	private Date createTime;
+	private String updateUser;
+	private Date updateTime;
+	private Integer valid;
+	private String groupCode;
+	private String orderId;
+	private String orderState;
+	private ObjectNode supplement;
+
+	/**
+	 * 忽略报警时间
+	 */
+	private Date ignoreTime;
+	/**
+	 * 报警处理完成时间
+	 */
+	private Date treatEndTime;
+
+}

+ 27 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/model/AlarmTargetModel.java

@@ -0,0 +1,27 @@
+package com.persagy.dmp.alarm.model;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import lombok.Getter;
+import lombok.Setter;
+import java.util.Date;
+
+@Setter
+@Getter
+public class AlarmTargetModel {
+
+	private String id;
+	private String itemCode;
+	private String classCode;
+	private ObjectNode condition;
+	private Integer concern;
+	private String level;
+	private Integer open;
+	private String createUser;
+	private Date createTime;
+	private String updateUser;
+	private Date updateTime;
+	private Integer valid;
+	private String projectId;
+	private String groupCode;
+
+}

+ 9 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/repository/AlarmCommentRepository.java

@@ -0,0 +1,9 @@
+package com.persagy.dmp.alarm.repository;
+
+import com.persagy.dmp.alarm.entity.AlarmComment;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
+
+public interface AlarmCommentRepository extends JpaRepository<AlarmComment, String>, QuerydslPredicateExecutor<AlarmComment>{
+}
+

+ 9 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/repository/AlarmConfigRepository.java

@@ -0,0 +1,9 @@
+package com.persagy.dmp.alarm.repository;
+
+import com.persagy.dmp.alarm.entity.AlarmConfig;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
+
+public interface AlarmConfigRepository extends JpaRepository<AlarmConfig, String>, QuerydslPredicateExecutor<AlarmConfig>{
+}
+

+ 9 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/repository/AlarmItemRepository.java

@@ -0,0 +1,9 @@
+package com.persagy.dmp.alarm.repository;
+
+import com.persagy.dmp.alarm.entity.AlarmItem;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
+
+public interface AlarmItemRepository extends JpaRepository<AlarmItem, String>, QuerydslPredicateExecutor<AlarmItem>{
+}
+

+ 9 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/repository/AlarmLogRepository.java

@@ -0,0 +1,9 @@
+package com.persagy.dmp.alarm.repository;
+
+import com.persagy.dmp.alarm.entity.AlarmLog;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
+
+public interface AlarmLogRepository extends JpaRepository<AlarmLog, String>, QuerydslPredicateExecutor<AlarmLog>{
+}
+

+ 9 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/repository/AlarmRecordRepository.java

@@ -0,0 +1,9 @@
+package com.persagy.dmp.alarm.repository;
+
+import com.persagy.dmp.alarm.entity.AlarmRecord;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
+
+public interface AlarmRecordRepository extends JpaRepository<AlarmRecord, String>, QuerydslPredicateExecutor<AlarmRecord>{
+}
+

+ 9 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/repository/AlarmTargetRepository.java

@@ -0,0 +1,9 @@
+package com.persagy.dmp.alarm.repository;
+
+import com.persagy.dmp.alarm.entity.AlarmTarget;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
+
+public interface AlarmTargetRepository extends JpaRepository<AlarmTarget, String>, QuerydslPredicateExecutor<AlarmTarget>{
+}
+

+ 48 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmBaseService.java

@@ -0,0 +1,48 @@
+package com.persagy.dmp.alarm.service;
+
+import com.persagy.common.web.BaseResponse;
+import com.persagy.dmp.config.DmpParameterStorage;
+
+/**
+ * @author king
+ */
+public class AlarmBaseService {
+
+	protected static class AlarmParam {
+		String groupCode;
+		String userId;
+		String projectId;
+		String appId;
+	}
+
+	protected <T> AlarmParam prepareParam(BaseResponse<T> resp) {
+		AlarmParam param = new AlarmParam();
+		param.groupCode = DmpParameterStorage.getGroupCode();
+		param.userId = DmpParameterStorage.getUserId();
+		param.projectId = DmpParameterStorage.getProjectId();
+		param.appId = DmpParameterStorage.getAppId();
+		if (param.userId == null || param.userId.isEmpty()) {
+			resp.setResult("fail");
+			resp.setMessage("userId 必须有值");
+			return null;
+		}
+		if (param.groupCode == null || param.groupCode.isEmpty()){
+			resp.setResult("fail");
+			resp.setMessage("groupCode 必须有值");
+			return null;
+		}
+		if (param.projectId == null || param.projectId.isEmpty()){
+			resp.setResult("fail");
+			resp.setMessage("projectId 必须有值");
+			return null;
+		}
+//		if (param.appId == null || param.appId.isEmpty()){
+//			resp.setResult("fail");
+//			resp.setMessage("appId 必须有值");
+//			return null;
+//		}
+
+		return param;
+	}
+
+}

+ 74 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmCommentService.java

@@ -0,0 +1,74 @@
+package com.persagy.dmp.alarm.service;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.alarm.util.CheckRequiredParam;
+import com.querydsl.core.types.dsl.BooleanExpression;
+import com.persagy.common.criteria.CriteriaUtils;
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.common.web.MapResponse;
+import javax.transaction.Transactional;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import com.persagy.dmp.alarm.model.AlarmCommentModel;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.persagy.dmp.alarm.entity.*;
+import com.persagy.dmp.alarm.repository.AlarmCommentRepository;
+import org.springframework.util.StringUtils;
+
+@Service
+public class AlarmCommentService extends AlarmBaseService{
+
+	@Autowired
+	private AlarmCommentRepository alarmCommentRepository;
+
+	@Autowired
+	private CriteriaUtils criteriaUtils;
+
+	private List<BooleanExpression> parse(ObjectNode criteria) {
+		// TODO
+		return null;
+	}
+
+	public PagedResponse<AlarmCommentModel> query(JacksonCriteria criteria) {
+		PagedResponse<AlarmComment> resp = criteriaUtils.query(QAlarmComment.alarmComment, this::parse, criteria);
+		PagedResponse<AlarmCommentModel> result = new PagedResponse<>();
+		result.setCount(resp.getCount());
+		List<AlarmComment> dataList = resp.getData();
+		if (dataList != null && dataList.size() > 0) {
+			List<AlarmCommentModel> collect = dataList.stream().map(entity -> {
+				AlarmCommentModel model = entity.toModel();
+				return model;
+			}).collect(Collectors.toList());
+			result.setData(collect);
+		}
+		return result;
+	}
+
+	@Transactional
+	public MapResponse create(AlarmCommentModel param) {
+		MapResponse response = new MapResponse();
+		AlarmParam alarmParam = prepareParam(response);
+		if (alarmParam == null) {
+			return response;
+		}
+		// 必填项校验
+		String checkResult = CheckRequiredParam.check(param, "recordId", "content");
+		if (!StringUtils.isEmpty(checkResult)) {
+			response.setFail(checkResult);
+			return response;
+		}
+		AlarmComment entity = AlarmComment.fromModel(param);
+		entity.setId(UUID.randomUUID().toString());
+		entity.setCreateUser(alarmParam.userId);
+		entity.setProjectId(alarmParam.projectId);
+		entity.setGroupCode(alarmParam.groupCode);
+		entity.setCreateTime(new Date());
+		alarmCommentRepository.save(entity);
+		response.add("id", entity.getId());
+		return response;
+	}
+}
+

+ 775 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmConfigService.java

@@ -0,0 +1,775 @@
+package com.persagy.dmp.alarm.service;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Lists;
+import com.persagy.common.criteria.CriteriaUtils;
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.date.DateUtils;
+import com.persagy.common.web.BaseResponse;
+import com.persagy.common.web.MapResponse;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.alarm.entity.AlarmConfig;
+import com.persagy.dmp.alarm.entity.AlarmTarget;
+import com.persagy.dmp.alarm.entity.QAlarmConfig;
+import com.persagy.dmp.alarm.enumeration.EnumAlarmMessageType;
+import com.persagy.dmp.alarm.jms.MessageProcesser;
+import com.persagy.dmp.alarm.model.AlarmConfigModel;
+import com.persagy.dmp.alarm.model.AlarmItemModel;
+import com.persagy.dmp.alarm.model.AlarmTargetModel;
+import com.persagy.dmp.alarm.repository.AlarmConfigRepository;
+import com.persagy.dmp.alarm.util.CheckRequiredParam;
+import com.persagy.dmp.config.DmpParameterStorage;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import com.querydsl.core.types.dsl.BooleanExpression;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.transaction.Transactional;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class AlarmConfigService extends AlarmBaseService {
+    @Autowired
+    private MessageProcesser messageProcesser;
+    @Autowired
+    private AlarmConfigRepository alarmConfigRepository;
+    @Autowired
+    private AlarmItemService alarmItemService;
+    @Autowired
+    private AlarmTargetService alarmTargetService;
+    @Autowired
+    private PhysicalWorldService physicalWorldService;
+    @Autowired
+    private CriteriaUtils criteriaUtils;
+
+    private List<BooleanExpression> parse(ObjectNode criteria) {
+        //        List<BooleanExpression> expressions = Lists.newLinkedList();
+        //        QAlarmConfig qt = QAlarmConfig.alarmConfig;
+        //        ArrayNode objIds = (ArrayNode) criteria.get("objIds");
+        //        if (objIds != null) {
+        //            expressions.addAll(CriteriaUtils.parse(qt.objId, objIds));
+        //        }
+        //        return expressions;
+        return null;
+    }
+
+    public PagedResponse<AlarmConfigModel> query(JacksonCriteria criteria) {
+        PagedResponse<AlarmConfig> resp = criteriaUtils.query(QAlarmConfig.alarmConfig, this::parse, criteria);
+        PagedResponse<AlarmConfigModel> result = new PagedResponse<>();
+        result.setCount(resp.getCount());
+        List<AlarmConfig> dataList = resp.getData();
+        if (dataList != null && dataList.size() > 0) {
+            List<AlarmConfigModel> collect = dataList.stream().map(entity -> {
+                AlarmConfigModel model = entity.toModel();
+                return model;
+            }).collect(Collectors.toList());
+            result.setData(collect);
+        }
+        return result;
+    }
+
+    /**
+     * @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();
+        /* 查询根据对象类型查询对应的报警匹配条件 */
+        JacksonCriteria criteria = JacksonCriteria.newInstance();
+        criteria.add("classCode", classCode);
+        criteria.add("projectId", projectId);
+        PagedResponse<AlarmTargetModel> pagedTargets = alarmTargetService.query(criteria);
+        List<AlarmTargetModel> targets = pagedTargets.getData();
+        /* 拼装报警定义对象 */
+        if (!CollectionUtils.isEmpty(targets)) {
+            Map<String, AlarmItemModel> itemCodeModelMap = alarmTargetService.getItemCodeModelMapByModelList(targets);
+            List<AlarmConfig> alarmConfigs = new ArrayList<>(targets.size());
+            for (AlarmTargetModel targetModel : targets) {
+                /* 拼装报警定义实体 */
+                AlarmItemModel 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, AlarmTargetModel targetModel, AlarmItemModel 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, AlarmTargetModel targetModel, AlarmItemModel itemModel, ObjectNode 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();
+        // 查询报警条目
+        AlarmItemModel itemModel = alarmItemService.getAlarmItemByItemCode(itemCode);
+        if (itemModel == null) {
+            response.setFail("自动生成报警定义失败,获取不到对应的报警条目!itemCode:" + itemCode);
+            return response;
+        }
+        /* 获取报警条目对应的所有匹配条件 */
+        List<AlarmTargetModel> alarmTargetModels = alarmTargetService.getAlarmTargetModelsByItemCode(itemCode, projectId);
+        if (CollectionUtils.isEmpty(alarmTargetModels)) {
+            return response;
+        }
+
+        List<String> classCodes = alarmTargetModels.stream().map(AlarmTargetModel::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 (AlarmTargetModel alarmTargetModel : alarmTargetModels) {
+                String classCode = alarmTargetModel.getClassCode();
+                Set<String> objIds = codeIdListMap.get(classCode);
+                Map<String, List<AlarmConfig>> statisticsMap = statisticConfigs2Update(objIds, projectId, alarmTargetModel, 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) {
+        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();
+
+        /* 获取到报警匹配条件和报警条目对象 */
+        AlarmItemModel itemModel = alarmItemService.getAlarmItemByItemCode(itemCode);
+        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.toModel(), 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(deletedAlarmConfigs, null);
+            alarmConfigRepository.deleteAll(deletedAlarmConfigs);
+            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);
+            alarmConfigRepository.saveAll(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)) {
+            alarmConfigRepository.deleteAll(deletedConfigs);
+        }
+        if (!CollectionUtils.isEmpty(createdConfigs)) {
+            alarmConfigRepository.saveAll(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(DateUtils.format(new Date()));
+            return msg;
+        }
+        return null;
+    }
+
+    /**
+     * @description: 按照报警匹配条件统计需要删除和重新创建的报警定义
+     * @param: objIds 设备id列表
+     * @param: projectId 项目id
+     * @param: alarmTargetModel 报警匹配条件
+     * @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, AlarmTargetModel alarmTargetModel, AlarmItemModel itemModel) {
+        log.info("设备id列表:" + objIds);
+        if (objIds == null) {
+            return null;
+        }
+        /* 查询这些设备的报警定义 */
+        JacksonCriteria criteria = JacksonCriteria.newInstance();
+        criteria.add("objId", Lists.newArrayList(objIds));
+        criteria.add("targetId", alarmTargetModel.getId());
+        criteria.add("itemCode", itemModel.getCode());
+        criteria.add("projectId", projectId);
+        List<AlarmConfigModel> configModels = queryList(criteria);
+        // configModels为空,是因为查询发生了错误,正常情况下没有数据configModels也不是null
+        if (configModels == null) {
+            return null;
+        }
+        /* 确认要更新的范围,自定义的报警定义不处理 */
+        // 用户自定义的报警定义
+        List<AlarmConfigModel> userDefinedAlarmConfigModels = configModels.stream().filter(
+                configModel -> configModel.getUserDefined() == 1
+        ).collect(Collectors.toList());
+        // 自动生成的报警定义
+        List<AlarmConfigModel> autoAlarmConfigModels = configModels.stream().filter(
+                configModel -> configModel.getUserDefined() != 1
+        ).collect(Collectors.toList());
+        List<AlarmConfig> autoAlarmConfigs = autoAlarmConfigModels.stream().map(
+                AlarmConfig::fromModel
+        ).collect(Collectors.toList());
+        /* 获取本次需要自动生成报警定义的对象id列表 */
+        Set<String> userDefinedObjIds = userDefinedAlarmConfigModels.stream().map(AlarmConfigModel::getObjId).collect(Collectors.toSet());
+        objIds.removeAll(userDefinedObjIds);
+        /* 删掉自动生成的报警定义,按照新的匹配条件生成新的报警定义 */
+        Map<String, List<AlarmConfig>> statisticMap = new HashMap<>();
+        statisticMap.put("deleted", autoAlarmConfigs);
+
+        if (!CollectionUtils.isEmpty(objIds)) {
+            ObjectNode condition = alarmTargetService.getCondition(alarmTargetModel, itemModel);
+            List<AlarmConfig> alarmConfigs = new ArrayList<>();
+            for (String objId : objIds) {
+                AlarmConfig alarmConfig = generateAlarmConfigEntity(objId, alarmTargetModel, itemModel, condition);
+                alarmConfigs.add(alarmConfig);
+            }
+            statisticMap.put("created", alarmConfigs);
+        }
+        return statisticMap;
+    }
+
+    public AlarmConfig get(String id) {
+        Optional<AlarmConfig> result = alarmConfigRepository.findById(id);
+        return result.orElse(null);
+    }
+
+    @Transactional
+    public MapResponse update(AlarmConfigModel 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());
+        alarmConfigRepository.save(alarmConfig);
+        response.add("id", alarmConfig.getId());
+        // 报警定义发生变化,向mq推送消息
+        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("updatedConfigUniques", Lists.newArrayList(alarmConfig.getAlarmConfigUnique()));
+        msg.setAppId(DmpParameterStorage.getAppId());
+        msg.setSendTime(DateUtils.format(new Date()));
+        response.add(msg);
+        return response;
+    }
+
+    /**
+     * @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(AlarmConfigModel 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) {
+        /* 查询设备相关的报警定义 */
+        JacksonCriteria criteria = JacksonCriteria.newInstance();
+        criteria.add("objId", objId);
+        criteria.add("projectId", projectId);
+        MapResponse response = new MapResponse();
+        deleteByCriteria(criteria);
+        return response;
+    }
+
+    /**
+     * @description: 条件查询
+     * @param: criteria
+     * @return: java.util.List<com.persagy.dmp.alarm.model.AlarmConfigModel>
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/21 2:22 下午
+     * @version: V1.0
+     */
+    private List<AlarmConfigModel> queryList(JacksonCriteria criteria) {
+        PagedResponse<AlarmConfigModel> 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(AlarmConfigModel param) {
+        MapResponse response = new MapResponse();
+        if (StringUtils.isEmpty(param.getProjectId())) {
+            response.setFail("项目id必填!");
+        }
+        JacksonCriteria criteria = JacksonCriteria.newInstance();
+        //        criteria.add("projectId", param.getProjectId());
+        List<AlarmItemModel> alarmItemModels = alarmItemService.queryList(criteria);
+        for (AlarmItemModel alarmItemModel : alarmItemModels) {
+            batchUpdateWhenItemUpdate(alarmItemModel.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<AlarmConfigModel> 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 (AlarmConfigModel param : params) {
+            String checkResult = CheckRequiredParam.check(param, "id");
+            if (!StringUtils.isEmpty(checkResult)) {
+                response.setFail(checkResult);
+                return response;
+            }
+
+            String configId = param.getId();
+            AlarmConfig alarmConfig = alarmConfigRepository.getOne(configId);
+            updateEntityByParam(param, alarmConfig);
+            configs.add(alarmConfig);
+        }
+        alarmConfigRepository.saveAll(configs);
+        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(AlarmConfigModel 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;
+        }
+        alarmConfigRepository.save(entity);
+        response.add("id", entity.getId());
+        return response;
+    }
+
+    private AlarmConfig initAlarmConfigEntity(AlarmConfigModel param, AlarmParam alarmParam, MapResponse response) {
+        // 必填项校验
+        String checkResult = CheckRequiredParam.check(param,
+                "objId", "classCode", "itemCode", "condition", "level");
+
+        if (!StringUtils.isEmpty(checkResult)) {
+            response.setFail(checkResult);
+            return null;
+        }
+        AlarmConfig entity = AlarmConfig.fromModel(param);
+        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;
+    }
+
+    /**
+     * @description: 批量创建报警定义
+     * @param: configModels
+     * @return: com.persagy.common.web.MapResponse
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/12/4 6:45 下午
+     * @version: V1.0
+     */
+    @Transactional
+    public MapResponse batchCreate(List<AlarmConfigModel> configModels) {
+        MapResponse response = new MapResponse();
+        if (configModels == null) {
+            response.setFail("请传入要创建的报警定义!");
+            return response;
+        }
+        // 一次最多更新200条数据
+        if (configModels.size() > 200) {
+            response.setFail("一次最多创建200条数据");
+            return response;
+        }
+
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        Date date = new Date();
+        List<String> ids = new ArrayList<>();
+        for (AlarmConfigModel configModel : configModels) {
+            AlarmConfig entity = initAlarmConfigEntity(configModel, alarmParam, response);
+            if (entity == null) {
+                return response;
+            }
+            alarmConfigRepository.save(entity);
+            ids.add(entity.getId());
+        }
+        Date 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();
+        JacksonCriteria criteria = JacksonCriteria.newInstance();
+        criteria.add("targetId", targetId);
+        criteria.add("projectId", projectId);
+        criteria.add("groupCode", groupCode);
+        // 非用户自定义的
+        criteria.add("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(JacksonCriteria criteria) {
+        List<AlarmConfigModel> configModels = queryList(criteria);
+        if (configModels == null) {
+            return;
+        }
+        List<AlarmConfig> configs = configModels.stream().map(AlarmConfig::fromModel).collect(Collectors.toList());
+        DmpMessage deletedMessage = deleteAll(configs);
+        if (deletedMessage != null) {
+            messageProcesser.convertAndSend(deletedMessage);
+        }
+    }
+}
+

+ 208 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmItemService.java

@@ -0,0 +1,208 @@
+package com.persagy.dmp.alarm.service;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.common.criteria.CriteriaUtils;
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.date.DateUtils;
+import com.persagy.common.web.MapResponse;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.alarm.entity.AlarmItem;
+import com.persagy.dmp.alarm.entity.QAlarmItem;
+import com.persagy.dmp.alarm.enumeration.EnumAlarmMessageType;
+import com.persagy.dmp.alarm.model.AlarmItemModel;
+import com.persagy.dmp.alarm.repository.AlarmItemRepository;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import com.querydsl.core.types.dsl.BooleanExpression;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.transaction.Transactional;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class AlarmItemService extends AlarmBaseService {
+
+    @Autowired
+    private AlarmItemRepository alarmItemRepository;
+
+    @Autowired
+    private CriteriaUtils criteriaUtils;
+
+    private List<BooleanExpression> parse(ObjectNode criteria) {
+        //        List<BooleanExpression> expressions = new LinkedList<>();
+        //        ArrayNode itemCodes = (ArrayNode) criteria.findValue("itemCodes");
+        //        if (itemCodes != null) {
+        //            QAlarmItem qAlarmItem = QAlarmItem.alarmItem;
+        //            expressions.addAll(CriteriaUtils.parse(qAlarmItem.code, itemCodes));
+        //        }
+        //        return expressions;
+        return null;
+    }
+
+    public PagedResponse<AlarmItemModel> query(JacksonCriteria criteria) {
+        // 报警条目查询中的0代表的是通用
+        addDefaultQueryCondition(criteria, "projectId", "0");
+        addDefaultQueryCondition(criteria, "groupCode", "0");
+        addDefaultQueryCondition(criteria, "appId", "0");
+
+        PagedResponse<AlarmItem> resp = criteriaUtils.query(QAlarmItem.alarmItem, this::parse, criteria);
+        PagedResponse<AlarmItemModel> result = new PagedResponse<>();
+        result.setCount(resp.getCount());
+        List<AlarmItem> dataList = resp.getData();
+        if (dataList != null && dataList.size() > 0) {
+            List<AlarmItemModel> collect = dataList.stream().map(entity -> {
+                AlarmItemModel model = entity.toModel();
+                return model;
+            }).collect(Collectors.toList());
+            result.setData(collect);
+        }
+        return result;
+    }
+
+    /**
+     * @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(JacksonCriteria criteria, String paramName, String defaultCondition) {
+        // 这里不校验已有查询条件和默认查询条件是否重复
+        ObjectNode queryBody = criteria.getCriteria();
+        JsonNode jsonNode = queryBody.get(paramName);
+        if (jsonNode == null) {
+            criteria.add(paramName, defaultCondition);
+        } else if (jsonNode.isArray()) {
+            ((ArrayNode) jsonNode).add(defaultCondition);
+        } else {
+            List<String> conditions = new ArrayList<>();
+            conditions.add(defaultCondition);
+            conditions.add(jsonNode.asText());
+            criteria.add(paramName, conditions);
+        }
+    }
+
+    @Transactional
+    public MapResponse create(AlarmItemModel param) {
+        MapResponse response = new MapResponse();
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        AlarmItem entity = AlarmItem.fromModel(param);
+        entity.setCreateUser(alarmParam.userId);
+        entity.setCreateTime(new Date());
+        alarmItemRepository.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(DateUtils.format(new Date()));
+        response.add(msg);
+        return response;
+    }
+
+    @Transactional
+    public MapResponse update(AlarmItemModel param) {
+        MapResponse response = new MapResponse();
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        AlarmItem entity = AlarmItem.fromModel(param);
+        entity.setUpdateUser(alarmParam.userId);
+        entity.setUpdateTime(new Date());
+        alarmItemRepository.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(DateUtils.format(new Date()));
+        response.add(msg);
+        return response;
+    }
+    //
+    //	@Transactional
+    //	public MapResponse delete(AlarmItemModel param) {
+    //		MapResponse response = new MapResponse();
+    //		// TODO
+    //		alarmItemRepository.deleteById(param.getId());
+    //		return response;
+    //	}
+
+    /**
+     * @description: 根据itemCodes获取itemCode, alarmItem的映射map
+     * @param: itemCodes 报警条目编码列表
+     * @return: java.util.HashMap<java.lang.String, com.persagy.dmp.alarm.model.AlarmItemModel>
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/20 2:25 下午
+     * @version: V1.0
+     */
+    public Map<String, AlarmItemModel> getItemCodeModelMap(List<String> itemCodes) {
+        HashMap<String, AlarmItemModel> itemCodeModelMap = new HashMap<>();
+        if (CollectionUtils.isEmpty(itemCodes)) {
+            return itemCodeModelMap;
+        }
+        JacksonCriteria criteria = JacksonCriteria.newInstance();
+        criteria.add("itemCode", itemCodes);
+        PagedResponse<AlarmItemModel> response = query(criteria);
+        if (response == null) {
+            return itemCodeModelMap;
+        }
+        List<AlarmItemModel> data = response.getData();
+        if (CollectionUtils.isEmpty(data)) {
+            return itemCodeModelMap;
+        }
+
+        return data.stream().collect(
+                Collectors.toMap(AlarmItemModel::getCode, itemModel -> itemModel, (k1, k2) -> k1)
+        );
+    }
+
+    public AlarmItemModel getAlarmItemByItemCode(String itemCode) {
+        JacksonCriteria criteria = JacksonCriteria.newInstance();
+        criteria.add("itemCode", itemCode);
+        List<AlarmItemModel> alarmItemModels = queryList(criteria);
+        if (CollectionUtils.isEmpty(alarmItemModels)) {
+            return null;
+        }
+        return alarmItemModels.get(0);
+    }
+
+    public List<AlarmItemModel> queryList(JacksonCriteria criteria) {
+        PagedResponse<AlarmItemModel> pagedResponse = query(criteria);
+        if (pagedResponse == null) {
+            return null;
+        }
+        List<AlarmItemModel> data = pagedResponse.getData();
+        if (CollectionUtils.isEmpty(data)) {
+            return null;
+        }
+        return data;
+    }
+}
+

+ 149 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmLogService.java

@@ -0,0 +1,149 @@
+package com.persagy.dmp.alarm.service;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.common.criteria.CriteriaUtils;
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.web.MapResponse;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.alarm.entity.AlarmLog;
+import com.persagy.dmp.alarm.entity.QAlarmLog;
+import com.persagy.dmp.alarm.enumeration.EnumAlarmLogType;
+import com.persagy.dmp.alarm.model.AlarmLogModel;
+import com.persagy.dmp.alarm.repository.AlarmLogRepository;
+import com.querydsl.core.types.dsl.BooleanExpression;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.transaction.Transactional;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+@Service
+public class AlarmLogService extends AlarmBaseService {
+
+    @Autowired
+    private AlarmLogRepository alarmLogRepository;
+
+    @Autowired
+    private CriteriaUtils criteriaUtils;
+
+    private List<BooleanExpression> parse(ObjectNode criteria) {
+        // TODO
+        return null;
+    }
+
+    public PagedResponse<AlarmLogModel> query(JacksonCriteria criteria) {
+        PagedResponse<AlarmLog> resp = criteriaUtils.query(QAlarmLog.alarmLog, this::parse, criteria);
+        PagedResponse<AlarmLogModel> result = new PagedResponse<>();
+        result.setCount(resp.getCount());
+        List<AlarmLog> dataList = resp.getData();
+        if (dataList != null && dataList.size() > 0) {
+            List<AlarmLogModel> collect = dataList.stream().map(entity -> {
+                AlarmLogModel model = entity.toModel();
+                return model;
+            }).collect(Collectors.toList());
+            result.setData(collect);
+        }
+        return result;
+    }
+
+    /**
+     * @description: 查询日志创建时间
+     * @param: recordId 报警记录id
+     * @param: type 日志类型
+     * @param: after
+     * @return: java.util.Date
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/12/8 4:40 下午
+     * @version: V1.0
+     */
+    private Date getCreateTime(String recordId, EnumAlarmLogType type, int after) {
+		JacksonCriteria criteria = JacksonCriteria.newInstance();
+		criteria.add("recordId", recordId);
+		criteria.add("type", type);
+		criteria.add("after", after);
+		PagedResponse<AlarmLog> resp = criteriaUtils.query(QAlarmLog.alarmLog, this::parse, criteria);
+		List<AlarmLog> logs = resp.getData();
+		if (CollectionUtils.isEmpty(logs)) {
+			return null;
+		} else {
+			return logs.get(0).getCreateTime();
+		}
+	}
+
+	/**
+	 * @description: 获取忽略报警的时间
+	 * @param: recordId
+	 * @return: java.util.Date
+	 * @exception:
+	 * @author: lixing
+	 * @company: Persagy Technology Co.,Ltd
+	 * @since: 2020/12/8 4:40 下午
+	 * @version: V1.0
+	 */
+    public Date getIgnoreAlarmTime(String recordId) {
+		// 已忽略
+    	int after = 1;
+        return getCreateTime(recordId, EnumAlarmLogType.TREATMODE, after);
+    }
+
+    /**
+     * @description: 获取报警记录处理完成时间
+     * @param: recordId
+     * @return: java.util.Date
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/12/8 4:41 下午
+     * @version: V1.0
+     */
+    public Date getTreatEndTime(String recordId) {
+    	// 处理完成
+    	int after = 3;
+		return getCreateTime(recordId, EnumAlarmLogType.TREATSTATE, after);
+    }
+
+    @Transactional
+    public MapResponse create(AlarmLogModel param) {
+        MapResponse response = new MapResponse();
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        AlarmLog entity = AlarmLog.fromModel(param);
+        entity.setId(UUID.randomUUID().toString());
+        entity.setCreateTime(new Date());
+        entity.setProjectId(alarmParam.projectId);
+        entity.setGroupCode(alarmParam.groupCode);
+        entity.setCreateUser(alarmParam.userId);
+        //		param.setUpdateTime(new Date());
+        alarmLogRepository.save(entity);
+        response.add("id", entity.getId());
+        return response;
+    }
+
+
+    //	@Transactional
+    //	public MapResponse update(AlarmLogModel param) {
+    //		MapResponse response = new MapResponse();
+    //		// TODO
+    //		AlarmLog entity = AlarmLog.fromModel(param);
+    //		alarmLogRepository.save(entity);
+    //		response.add("id", entity.getId());
+    //		return response;
+    //	}
+    //
+    //	@Transactional
+    //	public MapResponse delete(AlarmLogModel param) {
+    //		MapResponse response = new MapResponse();
+    //		// TODO
+    //		alarmLogRepository.deleteById(param.getId());
+    //		return response;
+    //	}
+}
+

+ 247 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmRecordService.java

@@ -0,0 +1,247 @@
+package com.persagy.dmp.alarm.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.common.criteria.CriteriaUtils;
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.date.DateUtils;
+import com.persagy.common.web.MapResponse;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.alarm.entity.AlarmRecord;
+import com.persagy.dmp.alarm.entity.QAlarmRecord;
+import com.persagy.dmp.alarm.enumeration.EnumAlarmLogType;
+import com.persagy.dmp.alarm.enumeration.EnumAlarmMessageType;
+import com.persagy.dmp.alarm.enumeration.EnumAlarmRecordWithColumns;
+import com.persagy.dmp.alarm.model.AlarmLogModel;
+import com.persagy.dmp.alarm.model.AlarmRecordModel;
+import com.persagy.dmp.alarm.repository.AlarmRecordRepository;
+import com.persagy.dmp.alarm.util.CheckRequiredParam;
+import com.persagy.dmp.config.DmpParameterStorage;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import com.querydsl.core.types.dsl.BooleanExpression;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.transaction.Transactional;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class AlarmRecordService extends AlarmBaseService {
+
+	@Autowired
+	private AlarmRecordRepository alarmRecordRepository;
+	@Autowired
+	private AlarmLogService alarmLogService;
+	@Autowired
+	private CriteriaUtils criteriaUtils;
+
+	private List<BooleanExpression> parse(ObjectNode criteria) {
+		// TODO
+		return null;
+	}
+
+	public PagedResponse<AlarmRecordModel> query(JacksonCriteria criteria) {
+		PagedResponse<AlarmRecord> resp = criteriaUtils.query(QAlarmRecord.alarmRecord, this::parse, criteria);
+		PagedResponse<AlarmRecordModel> result = new PagedResponse<>();
+		result.setCount(resp.getCount());
+		List<AlarmRecord> dataList = resp.getData();
+		// 如果需要查询日志相关的信息,需使用withColumns参数
+		Set<String> withColumns = criteria.getWithColumns();
+		if (dataList != null && dataList.size() > 0) {
+			List<AlarmRecordModel> collect = dataList.stream().map(entity -> {
+				AlarmRecordModel model = entity.toModel();
+				if (withColumns.contains(EnumAlarmRecordWithColumns.ignoreTime.name())) {
+					Date ignoreAlarmTime = alarmLogService.getIgnoreAlarmTime(model.getId());
+					model.setIgnoreTime(ignoreAlarmTime);
+				}
+				if (withColumns.contains(EnumAlarmRecordWithColumns.treatEndTime.name())) {
+					Date treatEndTime = alarmLogService.getTreatEndTime(model.getId());
+					model.setTreatEndTime(treatEndTime);
+				}
+				return model;
+			}).collect(Collectors.toList());
+			result.setData(collect);
+		}
+		return result;
+	}
+
+    @Transactional
+    public MapResponse create(AlarmRecordModel param) {
+        MapResponse response = new MapResponse();
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        // 必填项校验
+		String checkResult = CheckRequiredParam.check(param, "itemCode", "objId", "level");;
+        if (!StringUtils.isEmpty(checkResult)) {
+        	response.setFail(checkResult);
+        	return response;
+		}
+
+        String id = UUID.randomUUID().toString();
+        // 如果创建时,入参包含id,则使用入参中的id。但需要先校验id是否已存在
+        if (!StringUtils.isEmpty(param.getId())) {
+			Optional<AlarmRecord> byIdResult = alarmRecordRepository.findById(param.getId());
+			if (byIdResult.isPresent()) {
+				response.setFail("已存在相同id的报警记录!创建失败!");
+			} else {
+				id = param.getId();
+			}
+		}
+		AlarmRecord entity = AlarmRecord.fromModel(param);
+        entity.setId(id);
+        entity.setCreateUser(alarmParam.userId);
+        entity.setCreateTime(new Date());
+        entity.setValid(1);
+        entity.setProjectId(alarmParam.projectId);
+        entity.setGroupCode(alarmParam.groupCode);
+        alarmRecordRepository.save(entity);
+        response.add("id", entity.getId());
+		// 推送消息至mq
+		DmpMessage msg = new DmpMessage();
+		msg.setMid(UUID.randomUUID().toString());
+		msg.setType(EnumAlarmMessageType.ALARM_RECORD_CREATE.getValue());
+		msg.setGroupCode(DmpParameterStorage.getGroupCode());
+		msg.setProjectId(DmpParameterStorage.getProjectId());
+		msg.setTargetId(entity.getId());
+		msg.add("obj", JSONObject.toJSONString(entity));
+		msg.setAppId(DmpParameterStorage.getAppId());
+		msg.setSendTime(DateUtils.format(new Date()));
+		response.add(msg);
+        return response;
+    }
+
+	public AlarmRecord get(String id) {
+		Optional<AlarmRecord> result = alarmRecordRepository.findById(id);
+		return result.orElse(null);
+	}
+
+
+	/**
+	 * @description: 初始化日志对象
+	 * @param: param 报警记录参数
+	 * @return: com.persagy.dmp.alarm.model.AlarmLogModel
+	 * @exception:
+	 * @author: lixing
+	 * @company: Persagy Technology Co.,Ltd
+	 * @since: 2020/12/8 3:07 下午
+	 * @version: V1.0
+	 */
+	private AlarmLogModel initAlarmLogModel(AlarmRecordModel param) {
+		AlarmLogModel alarmLogModel = new AlarmLogModel();
+		alarmLogModel.setRecordId(param.getId());
+		alarmLogModel.setCreateTime(new Date());
+		alarmLogModel.setCreateUser(DmpParameterStorage.getUserId());
+		alarmLogModel.setProjectId(DmpParameterStorage.getProjectId());
+		alarmLogModel.setGroupCode(DmpParameterStorage.getGroupCode());
+		return alarmLogModel;
+	}
+
+	@Transactional
+	public MapResponse update(AlarmRecordModel param) {
+		MapResponse response = new MapResponse();
+		AlarmRecord alarmRecord = get(param.getId());
+		if (alarmRecord == null) {
+			response.setFail("无法获取到要更新的数据!");
+			return response;
+		}
+		AlarmParam alarmParam = prepareParam(response);
+		if (alarmParam == null) {
+			return response;
+		}
+		if (param.getName() != null && !param.getName().isEmpty()) {
+			alarmRecord.setName(param.getName());
+		}
+		if (param.getRemark() != null && !param.getRemark().isEmpty()) {
+			alarmRecord.setRemark(param.getRemark());
+		}
+		// 状态修改记录日志
+		if (param.getState() != null) {
+			if (!param.getState().equals(alarmRecord.getState())) {
+				AlarmLogModel alarmLogModel = initAlarmLogModel(param);
+				alarmLogModel.setType(EnumAlarmLogType.ALARMSTATE);
+				alarmLogModel.setNature(alarmRecord.getNature());
+				alarmLogModel.setBefore(alarmRecord.getState());
+				alarmLogModel.setAfter(param.getState());
+				alarmLogService.create(alarmLogModel);
+			}
+			alarmRecord.setState(param.getState());
+		}
+		if (param.getNature() != null) {
+			alarmRecord.setNature(param.getNature());
+		}
+		// 处理方式修改记录日志
+		if (param.getTreatMode() != null) {
+			if (!param.getTreatMode().equals(alarmRecord.getTreatMode())) {
+				AlarmLogModel alarmLogModel = initAlarmLogModel(param);
+				alarmLogModel.setType(EnumAlarmLogType.TREATMODE);
+				alarmLogModel.setNature(alarmRecord.getNature());
+				alarmLogModel.setBefore(alarmRecord.getTreatMode());
+				alarmLogModel.setAfter(param.getTreatMode());
+				alarmLogService.create(alarmLogModel);
+			}
+			alarmRecord.setTreatMode(param.getTreatMode());
+		}
+		// 处理状态更改记录日志
+		if (param.getTreatState() != null) {
+			if (!param.getTreatState().equals(alarmRecord.getTreatState())) {
+				AlarmLogModel alarmLogModel = initAlarmLogModel(param);
+				alarmLogModel.setType(EnumAlarmLogType.TREATSTATE);
+				alarmLogModel.setNature(alarmRecord.getNature());
+				alarmLogModel.setBefore(alarmRecord.getTreatState());
+				alarmLogModel.setAfter(param.getTreatState());
+				alarmLogService.create(alarmLogModel);
+			}
+			alarmRecord.setTreatState(param.getTreatState());
+		}
+
+		// 恢复值
+		if (param.getEndInfo() != null) {
+			alarmRecord.setEndInfo(param.getEndInfo());
+		}
+		// 恢复时间
+		if (param.getEndTime() != null) {
+			alarmRecord.setEndTime(param.getEndTime());
+		}
+		// 工单id
+		if (param.getOrderId() != null) {
+			alarmRecord.setOrderId(param.getOrderId());
+		}
+		// 工单状态
+		if (param.getOrderState() != null) {
+			alarmRecord.setOrderState(param.getOrderState());
+		}
+		// 补充说明
+		if (param.getSupplement() != null) {
+			alarmRecord.setSupplement(param.getSupplement());
+		}
+		alarmRecord.setUpdateUser(alarmParam.userId);
+		alarmRecord.setUpdateTime(new Date());
+		alarmRecordRepository.save(alarmRecord);
+		response.add("id", alarmRecord.getId());
+		// 推送消息至mq
+		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", JSONObject.toJSONString(alarmRecord));
+		msg.setAppId(DmpParameterStorage.getAppId());
+		msg.setSendTime(DateUtils.format(new Date()));
+		response.add(msg);
+		return response;
+	}
+
+	//	@Transactional
+	//	public MapResponse delete(AlarmRecordModel param) {
+	//		MapResponse response = new MapResponse();
+	//		// TODO
+	//		alarmRecordRepository.deleteById(param.getId());
+	//		return response;
+	//	}
+}
+

+ 329 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmTargetService.java

@@ -0,0 +1,329 @@
+package com.persagy.dmp.alarm.service;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.common.criteria.CriteriaUtils;
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.date.DateUtils;
+import com.persagy.common.web.MapResponse;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.alarm.entity.AlarmTarget;
+import com.persagy.dmp.alarm.entity.QAlarmTarget;
+import com.persagy.dmp.alarm.enumeration.EnumAlarmMessageType;
+import com.persagy.dmp.alarm.model.AlarmItemModel;
+import com.persagy.dmp.alarm.model.AlarmTargetModel;
+import com.persagy.dmp.alarm.repository.AlarmTargetRepository;
+import com.persagy.dmp.config.DmpParameterStorage;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import com.querydsl.core.types.dsl.BooleanExpression;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.transaction.Transactional;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class AlarmTargetService extends AlarmBaseService {
+
+    @Autowired
+    private AlarmTargetRepository alarmTargetRepository;
+    @Autowired
+    private AlarmItemService alarmItemService;
+
+    @Autowired
+    private CriteriaUtils criteriaUtils;
+
+    private List<BooleanExpression> parse(ObjectNode criteria) {
+        // TODO
+        return null;
+    }
+
+    public PagedResponse<AlarmTargetModel> query(JacksonCriteria criteria) {
+        // 默认查询未删除的数据
+        criteria.add("valid", 1);
+        PagedResponse<AlarmTarget> resp = criteriaUtils.query(QAlarmTarget.alarmTarget, this::parse, criteria);
+        PagedResponse<AlarmTargetModel> result = new PagedResponse<>();
+        result.setCount(resp.getCount());
+        List<AlarmTarget> dataList = resp.getData();
+        if (dataList != null && dataList.size() > 0) {
+            Map<String, AlarmItemModel> itemCodeModelMap = getItemCodeModelMap(dataList);
+            List<AlarmTargetModel> collect = dataList.stream().map(entity -> {
+                AlarmTargetModel model = entity.toModel();
+                // 获取报警条目的触发条件
+                String itemCode = model.getItemCode();
+                model.setCondition(getCondition(model, itemCodeModelMap.get(model.getItemCode())));
+                return model;
+            }).collect(Collectors.toList());
+            result.setData(collect);
+        }
+        return result;
+    }
+
+    @Transactional
+    public MapResponse create(AlarmTargetModel param) {
+        MapResponse response = new MapResponse();
+
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        if (StringUtils.isEmpty(param.getItemCode())) {
+            response.setFail("报警条目编码必填");
+        }
+        if (StringUtils.isEmpty(param.getClassCode())) {
+            response.setFail("对象类型编码必填");
+        }
+        // 判断是否是重复创建
+        JacksonCriteria criteria = JacksonCriteria.newInstance();
+        criteria.add("itemCode", param.getItemCode());
+        criteria.add("classCode", param.getClassCode());
+        PagedResponse<AlarmTargetModel> result = query(criteria);
+        if (result != null && result.getCount() > 0) {
+            response.setFail("已有同类的匹配条件,请勿重复添加!");
+            return response;
+        }
+
+        // 获取设备条目对象
+        AlarmItemModel alarmItem = alarmItemService.getAlarmItemByItemCode(param.getItemCode());
+        if (alarmItem == null) {
+            response.setFail("无法获取到对应的报警条目,创建失败!");
+            return response;
+        }
+
+        AlarmTarget entity = AlarmTarget.fromModel(param);
+        entity.setId(UUID.randomUUID().toString());
+        entity.setCreateUser(alarmParam.userId);
+        entity.setCreateTime(new Date());
+        entity.setProjectId(alarmParam.projectId);
+        entity.setGroupCode(alarmParam.groupCode);
+        // 继承alarmItem的一些属性
+        if (StringUtils.isEmpty(entity.getLevel())) {
+            entity.setLevel(alarmItem.getLevel());
+        }
+        alarmTargetRepository.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(DateUtils.format(new Date()));
+        response.add(msg);
+        return response;
+    }
+
+    public AlarmTarget get(String id) {
+        Optional<AlarmTarget> result = alarmTargetRepository.findById(id);
+        return result.orElse(null);
+    }
+
+    /**
+     * @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(AlarmTargetModel param, AlarmTarget alarmTarget) {
+        boolean itemCodeChange = !StringUtils.isEmpty(param.getItemCode()) &&
+                !param.getItemCode().equals(alarmTarget.getItemCode());
+        boolean classCodeChange = !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 itemCodeChange || classCodeChange || concernChange || openChange || conditionChange;
+    }
+
+    @Transactional
+    public MapResponse update(AlarmTargetModel param) {
+        MapResponse response = new MapResponse();
+        AlarmTarget alarmTarget = get(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.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());
+        alarmTargetRepository.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(DateUtils.format(new Date()));
+            response.add(msg);
+        }
+        return response;
+    }
+
+    @Transactional
+    public MapResponse delete(AlarmTargetModel param) {
+        MapResponse response = new MapResponse();
+        param.setValid(0);
+        update(param);
+
+        /* 拼装需要推送至消息队列的消息 */
+        DmpMessage msg = new DmpMessage();
+        msg.setMid(UUID.randomUUID().toString());
+        msg.setType(EnumAlarmMessageType.ALARM_ITEM_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(DateUtils.format(new Date()));
+        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.AlarmItemModel>
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/20 2:32 下午
+     * @version: V1.0
+     */
+    public Map<String, AlarmItemModel> getItemCodeModelMapByModelList(List<AlarmTargetModel> targetModelList) {
+        List<String> itemCodeList = targetModelList.stream().map(AlarmTargetModel::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.AlarmItemModel>
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/20 2:45 下午
+     * @version: V1.0
+     */
+    public Map<String, AlarmItemModel> getItemCodeModelMap(List<AlarmTarget> targetList) {
+        List<String> itemCodeList = targetList.stream().map(AlarmTarget::getItemCode).collect(Collectors.toList());
+        return alarmItemService.getItemCodeModelMap(itemCodeList);
+    }
+
+    /**
+     * @description: 获取匹配条件的触发条件:匹配条件自己的触发条件与所属报警条目的触发条件取并集
+     * @param: alarmTargetModel 匹配条件对象
+     * @param: alarmItemModel 报警条目对象
+     * @return: ObjectNode
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/20 2:07 下午
+     * @version: V1.0
+     */
+    public ObjectNode getCondition(AlarmTargetModel alarmTargetModel, AlarmItemModel alarmItemModel) {
+        ObjectNode targetCondition = alarmTargetModel.getCondition();
+        ObjectNode itemCondition = alarmItemModel.getCondition();
+        return targetCondition == null ? itemCondition : targetCondition;
+    }
+
+    /**
+     * @description: 根据报警条目编码和设备类型编码获取匹配条件对象
+     * @param: itemCode 报警条目编码
+     * @param: classCode 设备类型编码
+     * @param: projectId 项目id
+     * @return: com.persagy.dmp.alarm.model.AlarmTargetModel
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/21 11:53 上午
+     * @version: V1.0
+     */
+    public AlarmTargetModel getAlarmTargetModel(String itemCode, String classCode, String projectId) {
+        JacksonCriteria criteria = JacksonCriteria.newInstance();
+        criteria.add("itemCode", itemCode);
+        criteria.add("classCode", classCode);
+        criteria.add("projectId", projectId);
+        PagedResponse<AlarmTargetModel> pagedResponse = query(criteria);
+        if (pagedResponse == null) {
+            return null;
+        }
+        List<AlarmTargetModel> 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.AlarmTargetModel>
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/21 12:13 下午
+     * @version: V1.0
+     */
+    public List<AlarmTargetModel> getAlarmTargetModelsByItemCode(String itemCode, String projectId) {
+        JacksonCriteria criteria = JacksonCriteria.newInstance();
+        criteria.add("itemCode", itemCode);
+        criteria.add("projectId", projectId);
+        PagedResponse<AlarmTargetModel> pagedResponse = query(criteria);
+        if (pagedResponse == null) {
+            return null;
+        }
+        List<AlarmTargetModel> data = pagedResponse.getData();
+        if (CollectionUtils.isEmpty(data)) {
+            return null;
+        }
+        return data;
+    }
+}
+

+ 78 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/PhysicalWorldService.java

@@ -0,0 +1,78 @@
+package com.persagy.dmp.alarm.service;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Sets;
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.alarm.client.PhysicalWorldClient;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.validation.constraints.NotNull;
+import java.util.*;
+
+/**
+ * @description: 对接物理世界接口
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2020/10/20 5:04 下午
+ * @version: V1.0
+ **/
+@Service
+@Slf4j
+public class PhysicalWorldService {
+//    @Autowired
+//    private PhysicalWorldClient physicalWorldClient;
+    private PhysicalWorldClient physicalWorldClient = null;
+
+    public Set<String> queryObjectIdListByClassCode(
+            @NotNull String projectId,
+            @NotNull String groupCode,
+            @NotNull String classCode) throws Exception {
+        JacksonCriteria criteria = JacksonCriteria.newInstance();
+        criteria.add("classCode", classCode);
+        PagedResponse<ObjectNode> objectNodePagedResponse = physicalWorldClient.queryObj(projectId, groupCode, criteria);
+        log.info("物理世界查询对象返回值:", objectNodePagedResponse == null ? null : objectNodePagedResponse.toString());
+        List<ObjectNode> data = objectNodePagedResponse.getData();
+        Set<String> objIdList = new HashSet<>();
+        for (ObjectNode obj : data) {
+            String id = obj.get("id").asText();
+            objIdList.add(id);
+        }
+        return objIdList;
+    }
+
+    /**
+     * @description: 查询设备类型和设备id列表的映射关系
+     * @param: projectId
+     * @param: classCodes
+     * @return: java.util.Map
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/10/21 2:27 下午
+     * @version: V1.0
+     */
+    public Map<String, Set<String>> queryCodeIdListMapByClassCodes(
+            @NotNull String projectId,
+            @NotNull String groupCode,
+            @NotNull List<String> classCodes) throws Exception {
+        JacksonCriteria criteria = JacksonCriteria.newInstance();
+        criteria.add("classCode", classCodes);
+        PagedResponse<ObjectNode> objectNodePagedResponse = physicalWorldClient.queryObj(projectId, groupCode, criteria);
+        log.info("物理世界查询对象返回值:", objectNodePagedResponse == null ? null : objectNodePagedResponse.toString());
+        List<ObjectNode> data = objectNodePagedResponse.getData();
+        Map<String, Set<String>> resultMap = new HashMap<>();
+        for (ObjectNode obj : data) {
+            String id = obj.get("id").asText();
+            String classCode = obj.get("classCode").asText();
+            if (resultMap.get(classCode) == null) {
+                resultMap.put(classCode, Sets.newHashSet(id));
+            } else {
+                resultMap.get(classCode).add(id);
+            }
+        }
+        return resultMap;
+    }
+}

+ 101 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/util/CheckRequiredParam.java

@@ -0,0 +1,101 @@
+package com.persagy.dmp.alarm.util;
+
+import org.springframework.util.StringUtils;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+/**
+ * @description: 必填项校验
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2020/11/25 9:46 上午
+ * @version: V1.0
+ **/
+public class CheckRequiredParam {
+    /**
+     * @description: 反射校验必填项
+     * @param: t
+     * @param: params
+     * @return: java.lang.String
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/11/25 9:49 上午
+     * @version: V1.0
+     */
+    public static <T> String check(T t, String... params) {
+        // message用来存放校验结果
+        StringBuilder message = new StringBuilder();
+        Class<?> clazz = t.getClass();
+        // 校验参数
+        for (String param : params) {
+            if (StringUtils.isEmpty(param)) {
+                message.append("校验必填项参数错误,参数不能为空");
+                return message.toString();
+            }
+            try {
+                // 属性, 这里需要注意getField方法无法获取私有属性,应使用getDeclaredField方法
+                Field field = clazz.getDeclaredField(param);
+                // 属性类型
+                Class<?> fieldType = field.getType();
+
+                // get方法
+                Method method = clazz.getMethod("get" + firstUpperCase(param));
+
+                // 执行get方法,验证是否为空
+                try {
+                    if (fieldType == String.class) {
+                        String result = (String) method.invoke(t);
+                        if (StringUtils.isEmpty(result)) {
+                            message.append(param).append("必填!");
+                        }
+                    } else {
+                        Object result = method.invoke(t);
+                        if (result == null) {
+                            message.append(param).append("必填!");
+                        }
+                    }
+
+                } catch (Exception e) {
+                    message.append(e.getMessage());
+                    return message.toString();
+                }
+
+            } catch (NoSuchFieldException e) {
+                message.append("校验必填项参数错误,").
+                        append(clazz.getSimpleName()).
+                        append("不包含属性:").
+                        append(param);
+                return message.toString();
+            } catch (NoSuchMethodException e) {
+                message.append("校验必填项参数错误,").
+                        append(clazz.getSimpleName()).
+                        append("不包含方法:get").
+                        append(firstUpperCase(param)).
+                        append("()");
+                return message.toString();
+            }
+        }
+        return message.toString();
+    }
+
+    /**
+     * @description: 字符串首字母大写
+     * @param: s
+     * @return: java.lang.String
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/11/25 10:08 上午
+     * @version: V1.0
+     */
+    private static String firstUpperCase(String s) {
+        if (StringUtils.isEmpty(s)) {
+            return null;
+        }
+        char[] chars = s.toCharArray();
+        chars[0] -= 32;
+        return String.valueOf(chars);
+    }
+}

+ 5 - 0
dmp-alarm/src/main/resources/bootstrap-aliyun-test.yml

@@ -0,0 +1,5 @@
+spring:
+  cloud:
+    config:
+      profile: aliyun-test
+      uri: http://172.17.100.14:9932

+ 12 - 0
dmp-alarm/src/main/resources/bootstrap.yml

@@ -0,0 +1,12 @@
+spring:
+  application:
+    name: dmp-alarm
+  profiles:
+    active:
+      - dev
+#      - aliyun-test
+  cloud:
+    config:
+      profile: dev
+#      uri: http://integrated-config:9932
+      uri: http://localhost:9932

+ 47 - 0
dmp-alarm/src/main/resources/logback-spring.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <property name="log_pattern" value="%thread %d{yyyyMMdd HH:mm:ss.SSS} %-5level %logger{140} - %msg%n"/>
+    <property name="app_name" value="alarm"/>
+    <springProperty scope="context" name="log_path" source="persagy.log.path"/>
+    <property name="log_file" value="${log_path}/${app_name}"/>
+    <contextName>${app_name}</contextName>
+
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>${log_pattern}</pattern>
+        </layout>
+    </appender>
+
+    <!-- 日志文件 -->
+    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log_file}-%d{yyyyMMdd}.log</fileNamePattern>
+            <maxHistory>7</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log_pattern}</pattern>
+        </encoder>
+    </appender>
+
+    <logger name="org.hibernate" level="INFO"/>
+    <logger name="org.springframework" level="INFO"/>
+    <logger name="com.netflix" level="WARN"/>
+    <logger name="org.apache.http" level="INFO"/>
+
+    <springProfile name="dev">
+        <logger name="org.hibernate.SQL" level="DEBUG"/>
+        <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
+        <root level="debug">
+            <appender-ref ref="stdout"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="log-test">
+        <root level="info">
+            <appender-ref ref="stdout"/>
+        </root>
+    </springProfile>
+
+</configuration>