Browse Source

重写query相关方法

gaoyu 3 years ago
parent
commit
2910bdaad7
41 changed files with 2311 additions and 735 deletions
  1. 108 93
      pom.xml
  2. 16 0
      src/main/java/com/persagy/apm/dmpalarm/EnergyDmpAlarmApplication.java
  3. 44 0
      src/main/java/com/persagy/apm/dmpalarm/config/DmpMessageAspect.java
  4. 84 0
      src/main/java/com/persagy/apm/dmpalarm/config/DmpParameterStorage.java
  5. 34 0
      src/main/java/com/persagy/apm/dmpalarm/config/GlobalExceptionHandler.java
  6. 76 0
      src/main/java/com/persagy/apm/dmpalarm/config/MybatisJsonHandler.java
  7. 68 0
      src/main/java/com/persagy/apm/dmpalarm/config/QueryAspect.java
  8. 123 0
      src/main/java/com/persagy/apm/dmpalarm/config/RequestLogAspect.java
  9. 60 0
      src/main/java/com/persagy/apm/dmpalarm/config/RequestParamCheckAspect.java
  10. 81 0
      src/main/java/com/persagy/apm/dmpalarm/config/WebConfig.java
  11. 25 12
      src/main/java/com/persagy/apm/dmpalarm/controller/AlarmCommentController.java
  12. 27 35
      src/main/java/com/persagy/apm/dmpalarm/controller/AlarmRecordController.java
  13. 124 0
      src/main/java/com/persagy/apm/dmpalarm/criteria/CriteriaUtils.java
  14. 97 0
      src/main/java/com/persagy/apm/dmpalarm/criteria/JsonCriteria.java
  15. 6 2
      src/main/java/com/persagy/apm/dmpalarm/dao/AlarmRecordMapper.java
  16. 12 0
      src/main/java/com/persagy/apm/dmpalarm/enumeration/EnumAlarmListType.java
  17. 35 0
      src/main/java/com/persagy/apm/dmpalarm/enumeration/EnumAlarmMessageType.java
  18. 26 0
      src/main/java/com/persagy/apm/dmpalarm/enumeration/EnumAlarmState.java
  19. 28 0
      src/main/java/com/persagy/apm/dmpalarm/enumeration/EnumAlarmTreatState.java
  20. 14 0
      src/main/java/com/persagy/apm/dmpalarm/jms/MessageExecutor.java
  21. 99 0
      src/main/java/com/persagy/apm/dmpalarm/jms/MessageProcesser.java
  22. 227 0
      src/main/java/com/persagy/apm/dmpalarm/json/JacksonMapper.java
  23. 91 130
      src/main/java/com/persagy/apm/dmpalarm/model/AlarmRecord.java
  24. 9 4
      src/main/java/com/persagy/apm/dmpalarm/model/ConvertAlarmRecordTool.java
  25. 49 0
      src/main/java/com/persagy/apm/dmpalarm/model/DmpMessage.java
  26. 10 6
      src/main/java/com/persagy/apm/dmpalarm/model/dto/AddAlarmRecordDTO.java
  27. 8 5
      src/main/java/com/persagy/apm/dmpalarm/model/dto/PageQueryAlarmRecordDTO.java
  28. 8 5
      src/main/java/com/persagy/apm/dmpalarm/model/dto/QueryAlarmRecordDTO.java
  29. 7 4
      src/main/java/com/persagy/apm/dmpalarm/model/dto/UpdateAlarmRecordDTO.java
  30. 6 4
      src/main/java/com/persagy/apm/dmpalarm/model/vo/AlarmRecordItemVO.java
  31. 9 6
      src/main/java/com/persagy/apm/dmpalarm/model/vo/AlarmRecordListItemVO.java
  32. 10 4
      src/main/java/com/persagy/apm/dmpalarm/service/IAlarmRecordService.java
  33. 459 414
      src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmRecordServiceImpl.java
  34. 17 0
      src/main/java/com/persagy/apm/dmpalarm/utils/DatePatternStyle.java
  35. 32 0
      src/main/java/com/persagy/apm/dmpalarm/utils/SpringUtils.java
  36. 72 0
      src/main/java/com/persagy/apm/dmpalarm/web/BaseResponse.java
  37. 28 0
      src/main/java/com/persagy/apm/dmpalarm/web/ListResponse.java
  38. 42 0
      src/main/java/com/persagy/apm/dmpalarm/web/MapResponse.java
  39. 28 0
      src/main/java/com/persagy/apm/dmpalarm/web/PagedResponse.java
  40. 7 6
      src/main/resources/bootstrap.yml
  41. 5 5
      src/main/resources/mapper/AlarmRecordMapper.xml

+ 108 - 93
pom.xml

@@ -1,109 +1,124 @@
 <?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">
-    <modelVersion>4.0.0</modelVersion>
+	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">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.persagy</groupId>
+		<artifactId>apm-package</artifactId>
+		<version>v1.0.0-SNAPSHOT</version>
+	</parent>
 
-    <parent>
-        <groupId>com.persagy</groupId>
-        <artifactId>apm-package</artifactId>
-        <version>v1.0.0-SNAPSHOT</version>
-    </parent>
+	<artifactId>energy-dmp-alarm</artifactId>
+	<version>1.0-SNAPSHOT</version>
 
-    <artifactId>energy-dmp-alarm</artifactId>
-    <version>1.0-SNAPSHOT</version>
+	<properties>
+		<maven.compiler.source>8</maven.compiler.source>
+		<maven.compiler.target>8</maven.compiler.target>
+	</properties>
 
-    <properties>
-        <maven.compiler.source>8</maven.compiler.source>
-        <maven.compiler.target>8</maven.compiler.target>
-    </properties>
+	<repositories>
+		<repository>
+			<id>snapshot</id>
+			<name>snapshot Repository</name>
+			<url>http://47.93.132.139:8081/nexus/content/repositories/snapshots/</url>
+			<snapshots>
+				<enabled>true</enabled>
+				<updatePolicy>always</updatePolicy>
+			</snapshots>
+		</repository>
+		<repository>
+			<id>persagy</id>
+			<name>persagy Repository</name>
+			<url>http://47.93.132.139:8081/nexus/content/repositories/persagy/</url>
+		</repository>
+		<repository>
+			<id>integrated</id>
+			<name>releases Repository</name>
+			<url>http://47.93.132.139:8081/nexus/content/repositories/integrated/</url>
+		</repository>
 
-    <repositories>
-        <repository>
-            <id>snapshot</id>
-            <name>snapshot Repository</name>
-            <url>http://47.93.132.139:8081/nexus/content/repositories/snapshots/</url>
-            <snapshots>
-                <enabled>true</enabled>
-                <updatePolicy>always</updatePolicy>
-            </snapshots>
-        </repository>
-        <repository>
-            <id>persagy</id>
-            <name>persagy Repository</name>
-            <url>http://47.93.132.139:8081/nexus/content/repositories/persagy/</url>
-        </repository>
-        <repository>
-            <id>integrated</id>
-            <name>releases Repository</name>
-            <url>http://47.93.132.139:8081/nexus/content/repositories/integrated/</url>
-        </repository>
+	</repositories>
 
-    </repositories>
 
+	<dependencies>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<optional>true</optional>
+		</dependency>
+		<!-- 项目启动 -->
+		<dependency>
+			<groupId>com.persagy</groupId>
+			<artifactId>apm-server</artifactId>
+		</dependency>
+		<!-- apm 工具包 -->
+		<dependency>
+			<groupId>com.persagy</groupId>
+			<artifactId>apm-common</artifactId>
+			<exclusions>
+				<exclusion>
+					<groupId>com.persagy</groupId>
+					<artifactId>integrated-redis-spring-boot-starter</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<!-- lang -->
+		<dependency>
+			<groupId>commons-lang</groupId>
+			<artifactId>commons-lang</artifactId>
+		</dependency>
 
-    <dependencies>
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <optional>true</optional>
-        </dependency>
-        <!-- 项目启动 -->
-        <dependency>
-            <groupId>com.persagy</groupId>
-            <artifactId>apm-server</artifactId>
-        </dependency>
-        <!-- apm 工具包 -->
-        <dependency>
-            <groupId>com.persagy</groupId>
-            <artifactId>apm-common</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.persagy</groupId>
-                    <artifactId>integrated-redis-spring-boot-starter</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <!-- lang -->
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-        </dependency>
+		<!-- gson json,java对象互转 -->
+		<dependency>
+			<groupId>com.google.code.gson</groupId>
+			<artifactId>gson</artifactId>
+		</dependency>
+		<!-- 配置中心(包含注册中心) -->
+		<dependency>
+			<groupId>com.persagy</groupId>
+			<artifactId>integrated-config-client</artifactId>
+		</dependency>
 
-        <!-- gson json,java对象互转 -->
-        <dependency>
-            <groupId>com.google.code.gson</groupId>
-            <artifactId>gson</artifactId>
-        </dependency>
-        <!-- 配置中心(包含注册中心) -->
-        <dependency>
-            <groupId>com.persagy</groupId>
-            <artifactId>integrated-config-client</artifactId>
-        </dependency>
+		<!-- 日志 -->
+		<dependency>
+			<groupId>com.persagy</groupId>
+			<artifactId>integrated-log-spring-boot-starter</artifactId>
+		</dependency>
 
-        <!-- 日志 -->
-        <dependency>
-            <groupId>com.persagy</groupId>
-            <artifactId>integrated-log-spring-boot-starter</artifactId>
-        </dependency>
+		<!-- feign -->
+		<dependency>
+			<groupId>com.persagy</groupId>
+			<artifactId>integrated-ribbon-spring-boot-starter</artifactId>
+		</dependency>
 
-        <!-- feign -->
-        <dependency>
-            <groupId>com.persagy</groupId>
-            <artifactId>integrated-ribbon-spring-boot-starter</artifactId>
-        </dependency>
+		<!-- swagger -->
+		<dependency>
+			<groupId>com.persagy</groupId>
+			<artifactId>integrated-swagger2-spring-boot-starter</artifactId>
+		</dependency>
 
-        <!-- swagger -->
-        <dependency>
-            <groupId>com.persagy</groupId>
-            <artifactId>integrated-swagger2-spring-boot-starter</artifactId>
-        </dependency>
+		<dependency>
+			<groupId>com.persagy</groupId>
+			<artifactId>apm-mybatis</artifactId>
+		</dependency>
 
-        <dependency>
-            <groupId>com.persagy</groupId>
-            <artifactId>apm-mybatis</artifactId>
-        </dependency>
-
-    </dependencies>
+		<!--HUTOOL工具类 -->
+		<dependency>
+			<groupId>cn.hutool</groupId>
+			<artifactId>hutool-all</artifactId>
+			<version>5.7.2</version>
+		</dependency>
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>fastjson</artifactId>
+			<version>1.2.47</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
+			<version>2.1.4.RELEASE</version>
+		</dependency>
+	</dependencies>
 
 </project>

+ 16 - 0
src/main/java/com/persagy/apm/dmpalarm/EnergyDmpAlarmApplication.java

@@ -0,0 +1,16 @@
+package com.persagy.apm.dmpalarm;
+
+import org.springframework.amqp.rabbit.annotation.EnableRabbit;
+import org.springframework.boot.SpringApplication;
+import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+
+@EnableRabbit
+@SpringCloudApplication
+@EnableFeignClients
+public class EnergyDmpAlarmApplication {
+	public static void main(String[] args) {
+		SpringApplication.run(EnergyDmpAlarmApplication.class, args);
+	}
+}

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

@@ -0,0 +1,44 @@
+package com.persagy.apm.dmpalarm.config;
+
+import java.util.List;
+
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.persagy.apm.dmpalarm.jms.MessageProcesser;
+import com.persagy.apm.dmpalarm.model.DmpMessage;
+import com.persagy.apm.dmpalarm.web.BaseResponse;
+
+/**
+ * @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);
+					}
+				}
+			}
+		}
+	}
+}

+ 84 - 0
src/main/java/com/persagy/apm/dmpalarm/config/DmpParameterStorage.java

@@ -0,0 +1,84 @@
+package com.persagy.apm.dmpalarm.config;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author: yaoll
+ * @date: 2020-09-22
+ * @verison: 1.0
+ */
+public class DmpParameterStorage extends HandlerInterceptorAdapter {
+
+	private static final ThreadLocal<ParameterData> storage = new ThreadLocal<>();
+
+	@Override
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+		ParameterData data = new ParameterData();
+		data.groupCode = request.getParameter("groupCode");
+		data.schemaId = request.getParameter("schemaId");
+		data.projectId = request.getParameter("projectId");
+		data.appId = request.getParameter("appId");
+		data.userId = request.getParameter("userId");
+
+		storage.set(data);
+		return true;
+	}
+
+	@Override
+	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+		storage.remove();
+	}
+
+	@Override
+	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+		storage.remove();
+	}
+
+	@Setter
+	@Getter
+	public static class ParameterData {
+		private String groupCode;
+		private String schemaId;
+		private String projectId;
+		private String appId;
+		private String userId;
+	}
+
+	public static void set(ParameterData data) {
+		storage.set(data);
+	}
+
+	public static void clear(){
+		storage.remove();
+	}
+
+	public static String getGroupCode() {
+		return storage.get().groupCode;
+	}
+	public static String setGroupCode(String groupCode) {
+		return storage.get().groupCode=groupCode;
+	}
+
+	public static String getSchemaId() {
+		return storage.get().schemaId;
+	}
+
+	public static String getProjectId() {
+		return storage.get().projectId;
+	}
+
+	public static String getAppId() {
+		return storage.get().appId;
+	}
+
+	public static String getUserId() {
+		return storage.get().userId;
+	}
+
+}

+ 34 - 0
src/main/java/com/persagy/apm/dmpalarm/config/GlobalExceptionHandler.java

@@ -0,0 +1,34 @@
+package com.persagy.apm.dmpalarm.config;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+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 com.persagy.apm.dmpalarm.web.MapResponse;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @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(),e);
+        MapResponse resp = new MapResponse();
+        resp.setResult("fail");
+        resp.setMessage(e.getMessage());
+        return resp;
+    }
+}

+ 76 - 0
src/main/java/com/persagy/apm/dmpalarm/config/MybatisJsonHandler.java

@@ -0,0 +1,76 @@
+package com.persagy.apm.dmpalarm.config;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+
+import com.alibaba.fastjson.JSONObject;
+
+@MappedTypes(JSONObject.class)
+@MappedJdbcTypes(JdbcType.VARCHAR)
+public class MybatisJsonHandler extends BaseTypeHandler<JSONObject> {
+
+	/**
+	 * 设置非空参数
+	 *
+	 * @param ps
+	 * @param i
+	 * @param parameter
+	 * @param jdbcType
+	 * @throws SQLException
+	 */
+	@Override
+	public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType)
+			throws SQLException {
+		ps.setString(i, String.valueOf(parameter.toJSONString()));
+	}
+
+	/**
+	 * 根据列名,获取可以为空的结果
+	 *
+	 * @param rs
+	 * @param columnName
+	 * @return
+	 * @throws SQLException
+	 */
+	@Override
+	public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
+		String sqlJson = rs.getString(columnName);
+		if (null != sqlJson) {
+			return JSONObject.parseObject(sqlJson);
+		}
+		return null;
+	}
+
+	/**
+	 * 根据列索引,获取可以为空的结果
+	 *
+	 * @param rs
+	 * @param columnIndex
+	 * @return
+	 * @throws SQLException
+	 */
+	@Override
+	public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+		String sqlJson = rs.getString(columnIndex);
+		if (null != sqlJson) {
+			return JSONObject.parseObject(sqlJson);
+		}
+		return null;
+	}
+
+	@Override
+	public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+		String sqlJson = cs.getString(columnIndex);
+		if (null != sqlJson) {
+			return JSONObject.parseObject(sqlJson);
+		}
+		return null;
+	}
+}

+ 68 - 0
src/main/java/com/persagy/apm/dmpalarm/config/QueryAspect.java

@@ -0,0 +1,68 @@
+package com.persagy.apm.dmpalarm.config;
+
+import javax.servlet.http.HttpServletRequest;
+
+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 com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+
+/**
+ * @description: 查询切面
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2020/12/3 9:42 上午
+ * @version: V1.0
+ */
+@Aspect
+@Component
+public class QueryAspect {
+	@Pointcut("execution(public * com.persagy.apm.dmpalarm.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 JsonCriteria) {
+				JsonCriteria criteria = (JsonCriteria) arg;
+				/* 查询接口中,参数为0代表查询所有;报警条目查询例外,0代表查询通用*/
+				// 查询参数中不包含groupCode,且param中groupCode不等于0,将groupCode放入查询条件
+				if (StringUtils.isEmpty(criteria.getCriteria().getString("groupCode")) &&
+						!"0".equals(request.getParameter("groupCode"))) {
+					criteria.getCriteria().put("groupCode", request.getParameter("groupCode"));
+				}
+				// 查询参数中不包含projectId,且param中projectId不等于0,将projectId放入查询条件
+				if (StringUtils.isEmpty(criteria.getCriteria().getString("projectId")) &&
+						!"0".equals(request.getParameter("projectId"))) {
+					criteria.getCriteria().put("projectId", request.getParameter("projectId"));
+				}
+				// 查询参数中不包含appId,且param中appId不等于0,将appId放入查询条件
+				if (StringUtils.isEmpty(criteria.getCriteria().getString("appId")) &&
+						!"0".equals(request.getParameter("appId"))) {
+					criteria.getCriteria().put("appId", request.getParameter("appId"));
+				}
+			}
+		}
+	}
+}

+ 123 - 0
src/main/java/com/persagy/apm/dmpalarm/config/RequestLogAspect.java

@@ -0,0 +1,123 @@
+package com.persagy.apm.dmpalarm.config;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.AfterThrowing;
+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 org.springframework.web.multipart.MultipartFile;
+
+import com.persagy.apm.dmpalarm.json.JacksonMapper;
+import com.persagy.apm.dmpalarm.web.BaseResponse;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @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.apm.dmpalarm.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;
+	}
+}

+ 60 - 0
src/main/java/com/persagy/apm/dmpalarm/config/RequestParamCheckAspect.java

@@ -0,0 +1,60 @@
+package com.persagy.apm.dmpalarm.config;
+
+import javax.servlet.http.HttpServletRequest;
+
+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;
+
+
+/**
+ * @description: 查询切面
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2020/12/3 9:42 上午
+ * @version: V1.0
+ */
+@Aspect
+@Component
+public class RequestParamCheckAspect {
+
+	private static final String errorInfo = "request url中参数[%s]不能为空";
+	@Pointcut("execution(public * com.persagy.apm.dmpalarm.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 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"));
+		}
+	}
+
+}

+ 81 - 0
src/main/java/com/persagy/apm/dmpalarm/config/WebConfig.java

@@ -0,0 +1,81 @@
+package com.persagy.apm.dmpalarm.config;
+
+import java.util.List;
+
+import org.springframework.amqp.core.AcknowledgeMode;
+import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
+import org.springframework.amqp.rabbit.connection.ConnectionFactory;
+import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
+import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
+import org.springframework.amqp.support.converter.MessageConverter;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.alibaba.fastjson.support.config.FastJsonConfig;
+import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+
+/**
+ * @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);
+//	}
+
+	@Override
+	public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
+		WebMvcConfigurer.super.extendMessageConverters(converters);
+		/*
+		 * 1、需要先定义一个convert转换消息的对象 2、添加fastJson的配置信息,比如:是否要格式化返回json数据 3、在convert中添加配置信息
+		 * 4、将convert添加到converters当中
+		 * 
+		 */
+		// 1、需要先定义一个·convert转换消息的对象;
+		FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
+		// 2、添加fastjson的配置信息,比如 是否要格式化返回json数据
+		FastJsonConfig fastJsonConfig = new FastJsonConfig();
+		fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
+		// 3、在convert中添加配置信息.
+		fastConverter.setFastJsonConfig(fastJsonConfig);
+		// 4、将convert添加到converters当中.
+		converters.add(fastConverter);
+	}
+
+	// JMS 使用
+	@Bean
+	public MessageConverter customMessageConvert() {
+		return new Jackson2JsonMessageConverter();
+	}
+
+	@Bean
+	public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
+		SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
+		factory.setConnectionFactory(connectionFactory);
+		factory.setMessageConverter(new Jackson2JsonMessageConverter());
+		factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
+		return factory;
+	}
+
+}

+ 25 - 12
src/main/java/com/persagy/apm/dmpalarm/controller/AlarmCommentController.java

@@ -1,20 +1,33 @@
 package com.persagy.apm.dmpalarm.controller;
 
-import com.persagy.apm.dmpalarm.service.IAlarmCommentService;
+import java.util.List;
+
+import javax.validation.Valid;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.persagy.apm.common.response.ApmResponseUpsertVO;
+import com.persagy.apm.common.response.CommonResult;
+import com.persagy.apm.common.response.PageList;
+import com.persagy.apm.common.utils.ResultHelper;
+import com.persagy.apm.dmpalarm.model.AlarmComment;
+import com.persagy.apm.dmpalarm.model.ConvertAlarmCommentTool;
+import com.persagy.apm.dmpalarm.model.dto.AddAlarmCommentDTO;
+import com.persagy.apm.dmpalarm.model.dto.DeleteAlarmCommentDTO;
+import com.persagy.apm.dmpalarm.model.dto.QueryAlarmCommentDTO;
+import com.persagy.apm.dmpalarm.model.dto.QueryAlarmCommentDetailDTO;
+import com.persagy.apm.dmpalarm.model.dto.UpdateAlarmCommentDTO;
+import com.persagy.apm.dmpalarm.model.vo.AlarmCommentItemVO;
+import com.persagy.apm.dmpalarm.model.vo.AlarmCommentListItemVO;
+import com.persagy.apm.dmpalarm.service.IAlarmCommentService;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import com.persagy.apm.dmpalarm.model.*;
-import com.persagy.apm.dmpalarm.model.vo.*;
-import com.persagy.apm.dmpalarm.model.dto.*;
-import com.persagy.apm.common.response.*;
-import com.persagy.apm.common.utils.ResultHelper;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-import javax.validation.Valid;
-import java.util.List;
 
 /**
  * 报警批注控制层
@@ -58,7 +71,7 @@ public class AlarmCommentController {
 
     @ApiOperation(value = "删除报警批注")
     @PostMapping("/delete")
-    public CommonResult deleteAlarmComment(
+    public CommonResult<?> deleteAlarmComment(
             @RequestBody @Valid DeleteAlarmCommentDTO deleteAlarmCommentDTO) {
         alarmCommentService.deleteAlarmComment(deleteAlarmCommentDTO.getId());
         return ResultHelper.success();

+ 27 - 35
src/main/java/com/persagy/apm/dmpalarm/controller/AlarmRecordController.java

@@ -1,20 +1,30 @@
 package com.persagy.apm.dmpalarm.controller;
 
-import com.persagy.apm.dmpalarm.service.IAlarmRecordService;
+import javax.validation.Valid;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.persagy.apm.common.response.ApmResponseUpsertVO;
+import com.persagy.apm.common.response.CommonResult;
+import com.persagy.apm.common.utils.ResultHelper;
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.model.AlarmRecord;
+import com.persagy.apm.dmpalarm.model.ConvertAlarmRecordTool;
+import com.persagy.apm.dmpalarm.model.dto.AddAlarmRecordDTO;
+import com.persagy.apm.dmpalarm.model.dto.DeleteAlarmRecordDTO;
+import com.persagy.apm.dmpalarm.model.dto.QueryAlarmRecordDetailDTO;
+import com.persagy.apm.dmpalarm.model.dto.UpdateAlarmRecordDTO;
+import com.persagy.apm.dmpalarm.model.vo.AlarmRecordItemVO;
+import com.persagy.apm.dmpalarm.service.IAlarmRecordService;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import com.persagy.apm.dmpalarm.model.*;
-import com.persagy.apm.dmpalarm.model.vo.*;
-import com.persagy.apm.dmpalarm.model.dto.*;
-import com.persagy.apm.common.response.*;
-import com.persagy.apm.common.utils.ResultHelper;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-import javax.validation.Valid;
-import java.util.List;
 
 /**
  * 报警记录控制层
@@ -41,7 +51,7 @@ public class AlarmRecordController {
     @PostMapping("/get")
     public CommonResult<AlarmRecordItemVO> queryAlarmRecordDetail(
             @Valid @RequestBody QueryAlarmRecordDetailDTO queryAlarmRecordDetailDTO) {
-        AlarmRecord alarmRecord = alarmRecordService.queryAlarmRecordDetail(queryAlarmRecordDetailDTO.getId());
+		AlarmRecord alarmRecord = alarmRecordService.queryAlarmRecordDetail(queryAlarmRecordDetailDTO.getId());
         AlarmRecordItemVO alarmRecordItemVO = ConvertAlarmRecordTool.INSTANCE.convert2ResponseItemDTO(alarmRecord);
         return ResultHelper.single(alarmRecordItemVO);
     }
@@ -63,30 +73,12 @@ public class AlarmRecordController {
         alarmRecordService.deleteAlarmRecord(deleteAlarmRecordDTO.getId());
         return ResultHelper.success();
     }
-
-
-    @ApiOperation(value = "报警记录列表")
+    
     @PostMapping("/query")
-    public CommonResult<PageList<AlarmRecordListItemVO>> queryAlarmRecord(
-            @Valid @RequestBody QueryAlarmRecordDTO queryAlarmRecordDTO) {
-        List<AlarmRecord> alarmRecordList = alarmRecordService.queryAlarmRecordList(queryAlarmRecordDTO);
-        List<AlarmRecordListItemVO> resultList = ConvertAlarmRecordTool.INSTANCE.convert2List(alarmRecordList);
-        return ResultHelper.multi(resultList);
-    }
+	public PagedResponse<AlarmRecord> query(@RequestBody JsonCriteria criteria) {
+		return alarmRecordService.query(criteria);
+	}
     
-    //@ApiOperation(value = "报警记录列表, 分页查询")
-    //@PostMapping("/query")
-    //public CommonResult<PageList<AlarmRecordListItemVO>> queryAlarmRecord(
-    //        @Valid @RequestBody PageQueryAlarmRecordDTO pageQueryAlarmRecordDTO) {
-    //    IPage<AlarmRecord> pagedList = alarmRecordService.pageQueryAlarmRecord(pageQueryAlarmRecordDTO);
-    //    IPage<AlarmRecordListItemVO> pagedResultList = pagedList.convert(item -> {
-    //        try {
-    //           return ConvertAlarmRecordTool.INSTANCE.convert2ResponseListItemDTO(item);
-    //        } catch (Exception e) {
-    //            throw new IllegalArgumentException("分页查询,AlarmRecord实体类转换为列表对象发生异常", e);
-    //        }
-    //    });
-    //    return ResultHelper.multi(pagedResultList);
-    //}
+  
 }
 

+ 124 - 0
src/main/java/com/persagy/apm/dmpalarm/criteria/CriteriaUtils.java

@@ -0,0 +1,124 @@
+package com.persagy.apm.dmpalarm.criteria;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.springframework.stereotype.Component;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria.Order;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Component
+public class CriteriaUtils {
+
+	/**
+	 * 批量拼接报警条件
+	 * 
+	 * @param <T>
+	 * 
+	 */
+	@SuppressWarnings("unchecked")
+	public <T> QueryWrapper<T> handleAlarmConditions(JsonCriteria jsonCriteria, Class<T> classes) {
+		try {
+			T obj = classes.newInstance();
+			QueryWrapper<T> queryWrapper = (QueryWrapper<T>) Wrappers.query(classes);
+			JSONObject criteriaJson = jsonCriteria.getCriteria();
+			Field[] fields = classes.getDeclaredFields();
+			for (Field field : fields) {
+				String fieldName = field.getName();
+				Object columnValue = criteriaJson.get(fieldName);
+				if (columnValue == null) {
+					continue;
+				}
+				if (columnValue instanceof List) {
+					List<Object> valueList = (List<Object>) columnValue;
+					queryWrapper.lambda().in(wrapper -> getMethodName(classes, fieldName), valueList);
+				} else if (columnValue instanceof Map) {
+					Map<String, Object> columMap = (Map<String, Object>) columnValue;
+					for (Entry<String, Object> columEntry : columMap.entrySet()) {
+						Object value = columEntry.getValue();
+						switch (columEntry.getKey()) {
+						case "$ne":
+							if (value instanceof List) {
+								List<Object> valueList = (List<Object>) columnValue;
+								queryWrapper.lambda().notIn(wrapper -> getMethodName(obj, fieldName), valueList);
+							} else {
+								queryWrapper.lambda().ne(wrapper -> getMethodName(obj, fieldName), value);
+							}
+							break;
+						case "$gt":
+							queryWrapper.lambda().gt(wrapper -> getMethodName(obj, fieldName), value);
+							break;
+						case "$gte":
+							queryWrapper.lambda().ge(wrapper -> getMethodName(obj, fieldName), value);
+							break;
+						case "$lt":
+							queryWrapper.lambda().lt(wrapper -> getMethodName(obj, fieldName), value);
+							break;
+						case "$lte":
+							queryWrapper.lambda().le(wrapper -> getMethodName(obj, fieldName), value);
+							break;
+						case "$in":
+							if (value instanceof List) {
+								List<Object> valueList = (List<Object>) columnValue;
+								queryWrapper.lambda().in(wrapper -> getMethodName(obj, fieldName), valueList);
+							} else {
+								queryWrapper.lambda().eq(wrapper -> getMethodName(obj, fieldName), value);
+							}
+							break;
+						case "$like":
+							queryWrapper.lambda().like(wrapper -> getMethodName(obj, fieldName), value);
+							break;
+						case "$notlike":
+							queryWrapper.lambda().notLike(wrapper -> getMethodName(obj, fieldName), value);
+							break;
+						case "$null":
+							Boolean b = (Boolean) value;
+							if (b) {
+								queryWrapper.lambda().isNull(wrapper -> getMethodName(obj, fieldName));
+							} else {
+								queryWrapper.lambda().isNotNull(wrapper -> getMethodName(obj, fieldName));
+							}
+							break;
+						}
+					}
+				} else {
+					queryWrapper.lambda().eq(wrapper -> getMethodName(obj, fieldName), columnValue);
+				}
+
+			}
+			for (Order order : jsonCriteria.getOrders()) {
+				if (order.isAsc()) {
+					queryWrapper.lambda().orderByAsc(wrapper -> getMethodName(obj, order.getColumn()));
+				} else {
+					queryWrapper.lambda().orderByDesc(wrapper -> getMethodName(obj, order.getColumn()));
+				}
+			}
+			return queryWrapper;
+		} catch (Exception e) {
+			log.error("CriteriaUtils handleAlarmConditions error ", e);
+		}
+		return (QueryWrapper<T>) Wrappers.query(classes);
+	}
+
+	private <T> Object getMethodName(T obj, String fieldName) {
+		StringBuilder sb = new StringBuilder();
+		try {
+			sb.append("get").append(fieldName.substring(0, 1).toUpperCase()).append(fieldName.substring(1));
+			Method method = obj.getClass().getMethod(sb.toString());
+			return method.invoke(obj);
+		} catch (Exception e) {
+			log.error("getMethodName NoSuchMethod", e);
+		}
+		return null;
+	}
+
+}

+ 97 - 0
src/main/java/com/persagy/apm/dmpalarm/criteria/JsonCriteria.java

@@ -0,0 +1,97 @@
+package com.persagy.apm.dmpalarm.criteria;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import com.alibaba.fastjson.JSONObject;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author: yaoll
+ * @date: 2020-09-04
+ * @verison: 1.0
+ *
+ *           <pre>
+ * {
+ *     "page": 1,
+ *     "size": 10,
+ *     "onlyCount": false,
+ *     "criteria": {
+ *         "name": "zhangsan",
+ *         "name": [ "zhangsan", "lisi" ],
+ *         "age": {
+ *             "$gt": 18,
+ *             "$lt": 35
+ *         },
+ *         "gender": {
+ *             "$null": false
+ *         }
+ *     },
+ *     "orders": [
+ *            {
+ *     		 	"column": "name",
+ *     		 	"asc": false
+ *            }
+ *     ],
+ *     "withColumns": [
+ *     		"name", "age"
+ *     ]
+ * }
+ *           </pre>
+ */
+public class JsonCriteria {
+
+	@Getter
+	@Setter
+	private Integer page =1;
+
+	@Getter
+	@Setter
+	private Integer size=10;
+
+	/**
+	 * 是否只统计数量
+	 */
+	@Getter
+	@Setter
+	private boolean onlyCount = false;
+
+	@Getter
+	@Setter
+	private boolean withoutCount = false;
+
+	@Getter
+	@Setter
+	private JSONObject criteria = new JSONObject();
+
+	@Getter
+	@Setter
+	private List<Order> orders = new ArrayList<>();
+
+	@Getter
+	@Setter
+	private Set<String> withColumns = new HashSet<>();
+
+	@Data
+	public static class Order {
+		private String column;
+		private boolean asc = true;
+
+		public Order() {
+		}
+
+		public Order(String column) {
+			this.column = column;
+		}
+
+		public Order(String column, boolean asc) {
+			this.column = column;
+			this.asc = asc;
+		}
+	}
+}

+ 6 - 2
src/main/java/com/persagy/apm/dmpalarm/dao/AlarmRecordMapper.java

@@ -1,9 +1,12 @@
 package com.persagy.apm.dmpalarm.dao;
 
-import com.persagy.apm.dmpalarm.model.AlarmRecord;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.persagy.apm.dmpalarm.model.AlarmRecord;
+
 /**
  * 报警记录(AlarmRecord)dao层
  * @author lixing
@@ -12,4 +15,5 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface AlarmRecordMapper extends BaseMapper<AlarmRecord>{
 
+
 }

+ 12 - 0
src/main/java/com/persagy/apm/dmpalarm/enumeration/EnumAlarmListType.java

@@ -0,0 +1,12 @@
+package com.persagy.apm.dmpalarm.enumeration;
+
+/**
+ * 报警记录列表类型
+ *
+ * @author lixing
+ * @version V1.0 2021/11/17 9:08 下午
+ */
+public enum EnumAlarmListType {
+    CURRENT,
+    HISTORY;
+}

+ 35 - 0
src/main/java/com/persagy/apm/dmpalarm/enumeration/EnumAlarmMessageType.java

@@ -0,0 +1,35 @@
+package com.persagy.apm.dmpalarm.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("alarm_configs_change", "报警定义变动"),
+    ALARM_TARGET_UPDATE("alarmTargetUpdate", "报警匹配条件更新"),
+    ALARM_TARGET_CREATE("alarmTargetCreate", "新增报警匹配条件"),
+    ALARM_TARGET_DELETE("alarmTargetDelete", "删除报警匹配条件"),
+    ALARM_ITEM_CREATE("alarmItemCreate", "新增报警条目"),
+    ALARM_ITEM_UPDATE("alarmItemUpdate", "报警条目更新"),
+    ALARM_ITEM_DELETE("alarmItemDelete", "删除报警条目"),
+    ALARM_RECORD_CREATE("alarmRecordCreate", "新增报警"),
+    ALARM_RECORD_UPDATE("alarmRecordUpdate", "报警更新"),
+    ALARM_CONFIG_BATCH_CREATE("alarmConfigBatchCreate", "报警定义批量创建"),
+    ALARM_CONFIG_BATCH_DELETE("alarmConfigBatchDelete", "报警定义批量删除"),
+    INSTANCE_OBJ_DELETE("instanceObjectDelete", "设备删除");
+
+    @Getter
+    private String value;
+    @Getter
+    private String desc;
+
+    EnumAlarmMessageType(String value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+}

+ 26 - 0
src/main/java/com/persagy/apm/dmpalarm/enumeration/EnumAlarmState.java

@@ -0,0 +1,26 @@
+package com.persagy.apm.dmpalarm.enumeration;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 报警状态
+ *
+ * @author lixing
+ * @version V1.0 2021/11/17 9:08 下午
+ */
+@AllArgsConstructor
+public enum EnumAlarmState {
+    UN_HANDLE(1, "未恢复"),
+    END(2, "已恢复"),
+    EXPIRE(3, "已过期");
+
+    @Setter
+    @Getter
+    private Integer type;
+
+    @Setter
+    @Getter
+    private String desc;
+}

+ 28 - 0
src/main/java/com/persagy/apm/dmpalarm/enumeration/EnumAlarmTreatState.java

@@ -0,0 +1,28 @@
+package com.persagy.apm.dmpalarm.enumeration;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 报警处理状态
+ *
+ * @author lixing
+ * @version V1.0 2021/11/17 9:08 下午
+ */
+@AllArgsConstructor
+public enum EnumAlarmTreatState {
+    UN_HANDLE(1, "未处理"),
+    HANDLING(2, "处理中"),
+    DONE(3, "处理完成"),
+    // 用于兼容子系统业务,后期会移除该状态
+    IGNORE(4, "已忽略");
+
+    @Setter
+    @Getter
+    private Integer type;
+
+    @Setter
+    @Getter
+    private String desc;
+}

+ 14 - 0
src/main/java/com/persagy/apm/dmpalarm/jms/MessageExecutor.java

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

+ 99 - 0
src/main/java/com/persagy/apm/dmpalarm/jms/MessageProcesser.java

@@ -0,0 +1,99 @@
+package com.persagy.apm.dmpalarm.jms;
+
+import java.util.HashSet;
+import java.util.Set;
+
+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 com.persagy.apm.dmpalarm.config.DmpParameterStorage;
+import com.persagy.apm.dmpalarm.enumeration.EnumAlarmMessageType;
+import com.persagy.apm.dmpalarm.json.JacksonMapper;
+import com.persagy.apm.dmpalarm.model.DmpMessage;
+import com.persagy.apm.dmpalarm.utils.SpringUtils;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @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 dmpAlarmRoutingKey;
+
+	/**
+	 * 报警定义的routingKey
+	 */
+	private static final String alarmConfigRoutingKey = "alarm-config-routing-key";
+
+	@Autowired
+	private RabbitTemplate rabbitTemplate;
+
+	public void convertAndSend(DmpMessage message) {
+		log.info("向rabbitMQ发送消息,message:" + JacksonMapper.toSimpleJson(message));
+		// 如果是报警定义的变化,通过报警定义的routingKey发送,否则用报警公用的routingKey发送
+		if (EnumAlarmMessageType.ALARM_CONFIGS_CHANGE.getValue().equals(message.getType())) {
+			rabbitTemplate.convertAndSend(exchange, alarmConfigRoutingKey, message);
+		} else {
+			rabbitTemplate.convertAndSend(exchange, dmpAlarmRoutingKey, 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(EnumAlarmMessageType.INSTANCE_OBJ_DELETE.getValue());
+//		beanNames.add(EnumAlarmMessageType.ALARM_TARGET_DELETE.getValue());
+		beanNames.add(EnumAlarmMessageType.ALARM_CONFIG_BATCH_CREATE.getValue());
+//		beanNames.add(EnumAlarmMessageType.ALARM_CONFIG_BATCH_DELETE.getValue());
+	}
+
+	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();
+		}
+	}
+
+}

+ 227 - 0
src/main/java/com/persagy/apm/dmpalarm/json/JacksonMapper.java

@@ -0,0 +1,227 @@
+package com.persagy.apm.dmpalarm.json;
+
+import java.io.IOException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeType;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/**
+ * @author: yaoll
+ * @date: 2020-09-04
+ * @verison: 1.0
+ */
+public class JacksonMapper {
+
+	private static Logger logger = LoggerFactory.getLogger(JacksonMapper.class);
+
+	public static final ObjectMapper nonEmptyMapper;
+	public static final ObjectMapper nonDefaultMapper;
+	public static final ObjectMapper nonEmptyFormatMapper;
+
+	static {
+		nonEmptyMapper = new ObjectMapper();
+		nonEmptyMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+		nonEmptyMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+		nonEmptyMapper.disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES);
+
+		nonDefaultMapper = new ObjectMapper();
+		nonDefaultMapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT);
+		nonDefaultMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+		nonDefaultMapper.disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES);
+
+		nonEmptyFormatMapper = new ObjectMapper();
+		nonEmptyFormatMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+		nonEmptyFormatMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+		nonEmptyFormatMapper.disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES);
+		nonEmptyFormatMapper.enable(SerializationFeature.INDENT_OUTPUT);
+	}
+
+	private static boolean isEmpty(final CharSequence cs) {
+		return cs == null || cs.length() == 0;
+	}
+
+	public static <T> T toObject(String jsonString, Class<T> clazz) {
+		if (!isEmpty(jsonString)) {
+			try {
+				return nonEmptyMapper.readValue(jsonString, clazz);
+			} catch (IOException e) {
+				logger.warn("parse json string to {} error: {}", clazz.getName(), jsonString, e);
+			}
+		}
+		return null;
+	}
+
+	public static <T> T toObject(String jsonString, TypeReference<T> typeRef) {
+		if (!isEmpty(jsonString)) {
+			try {
+				return nonEmptyMapper.readValue(jsonString, typeRef);
+			} catch (IOException e) {
+				logger.warn("parse json string to {} error: {}", typeRef.toString(), jsonString, e);
+			}
+		}
+		return null;
+	}
+
+	public static <T> T toObject(String jsonString, JavaType javaType) {
+		if (!isEmpty(jsonString)) {
+			try {
+				return (T) nonEmptyMapper.readValue(jsonString, javaType);
+			} catch (IOException e) {
+				logger.warn("parse json string to {} error: {}", javaType.toString(), jsonString, e);
+			}
+		}
+		return null;
+	}
+
+	public static <T> T toObject(String jsonString, Class cla, Class... clb) {
+		if (!isEmpty(jsonString)) {
+			try {
+				JavaType javaType = nonEmptyMapper.getTypeFactory().constructParametricType(cla, clb);
+				return (T) nonEmptyMapper.readValue(jsonString, javaType);
+			} catch (IOException e) {
+				logger.warn("parse json string to {} error: {}", cla.getName(), jsonString, e);
+			}
+		}
+		return null;
+	}
+
+	public static JavaType constructParametricType(Class<?> parametrized, Class<?>... parameterClasses) {
+		return nonEmptyMapper.getTypeFactory().constructParametricType(parametrized, parameterClasses);
+	}
+
+	public static JavaType constructParametricType(Class<?> rawType, JavaType... parameterTypes) {
+		return nonEmptyMapper.getTypeFactory().constructParametricType(rawType, parameterTypes);
+	}
+
+	public static String toSimpleJson(Object object) {
+		try {
+			return nonEmptyMapper.writeValueAsString(object);
+		} catch (JsonProcessingException e) {
+			logger.error("write to json string error:" + object, e);
+		}
+		return null;
+	}
+
+	public static String toFormatJson(Object object) {
+		try {
+			return nonEmptyFormatMapper.writeValueAsString(object);
+		} catch (JsonProcessingException e) {
+			logger.error("write to json string error:" + object, e);
+		}
+		return null;
+	}
+
+	public static final String getString(ObjectNode obj, String key) {
+		return getString(obj, key, null);
+	}
+
+	public static final String getString(ObjectNode obj, String key, String defaultValue) {
+		if (obj == null) {
+			return defaultValue;
+		}
+		if (!obj.has(key)) {
+			return defaultValue;
+		}
+		return obj.get(key).asText();
+	}
+
+	public static final Integer getInteger(ObjectNode obj, String key) {
+		return getInteger(obj, key, null);
+	}
+
+	public static final Integer getInteger(ObjectNode obj, String key, Integer defaultValue) {
+		if (obj == null) {
+			return defaultValue;
+		}
+		if (!obj.has(key)) {
+			return defaultValue;
+		}
+		JsonNode jsonNode = obj.get(key);
+
+		return Integer.valueOf(jsonNode.asText());
+	}
+
+	public static final Double getDouble(ObjectNode obj, String key) {
+		return getDouble(obj, key, null);
+	}
+
+	public static final Double getDouble(ObjectNode obj, String key, Double defaultValue) {
+		if (obj == null) {
+			return defaultValue;
+		}
+		if (!obj.has(key)) {
+			return defaultValue;
+		}
+		return Double.valueOf(obj.get(key).asText());
+	}
+
+	public static final Boolean getBoolean(ObjectNode obj, String key) {
+		return getBoolean(obj, key, null);
+	}
+
+	public static final Boolean getBoolean(ObjectNode obj, String key, Boolean defaultValue) {
+		if (obj == null) {
+			return defaultValue;
+		}
+		if (!obj.has(key)) {
+			return defaultValue;
+		}
+		return Boolean.valueOf(obj.get(key).toString());
+	}
+
+	public static final ObjectNode getObject(ObjectNode obj, String key) {
+		return getObject(obj, key, null);
+	}
+
+	public static final ObjectNode getObject(ObjectNode obj, String key, ObjectNode defaultValue) {
+		if (obj == null) {
+			return defaultValue;
+		}
+		if (!obj.has(key)) {
+			return defaultValue;
+		}
+		JsonNode jsonNode = obj.get(key);
+		JsonNodeType nodeType = jsonNode.getNodeType();
+		if (nodeType == JsonNodeType.STRING) {
+			return toObject(jsonNode.asText(), ObjectNode.class);
+		} else if (nodeType == JsonNodeType.OBJECT) {
+			return (ObjectNode) jsonNode;
+		}
+		return defaultValue;
+	}
+
+
+	public static final ArrayNode getArray(ObjectNode obj, String key) {
+		return getArray(obj, key, null);
+	}
+
+	public static final ArrayNode getArray(ObjectNode obj, String key, ArrayNode defaultValue) {
+		if (obj == null) {
+			return defaultValue;
+		}
+		if (!obj.has(key)) {
+			return defaultValue;
+		}
+		JsonNode jsonNode = obj.get(key);
+		JsonNodeType nodeType = jsonNode.getNodeType();
+		if (nodeType == JsonNodeType.STRING) {
+			return toObject(jsonNode.asText(), ArrayNode.class);
+		} else if (nodeType == JsonNodeType.ARRAY) {
+			return (ArrayNode) jsonNode;
+		}
+		return defaultValue;
+	}
+
+}

+ 91 - 130
src/main/java/com/persagy/apm/dmpalarm/model/AlarmRecord.java

@@ -1,140 +1,101 @@
 package com.persagy.apm.dmpalarm.model;
 
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import com.persagy.apm.common.model.entity.AuditableEntity;
 import java.io.Serializable;
 import java.util.Date;
 
-/**
- * 报警记录(AlarmRecord)实体类
- * @author lixing
- * @version V1.0 2021-12-09 10:44:53
- */
-@EqualsAndHashCode(callSuper = true)
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import lombok.Data;
+
 @Data
-@ApiModel(description = "报警记录")
-public class AlarmRecord extends AuditableEntity<AlarmRecord> implements Serializable {
-    private static final long serialVersionUID = -68361447505702871L;
+public class AlarmRecord implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	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;
+	@TableField("`condition`")
+	private JSONObject condition;
+	private JSONObject triggerInfo;
+	private Date triggerTime;
+	private JSONObject 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 JSONObject supplement;
 
-    @ApiModelProperty("报警条目编码")
-    private String itemCode;
-    
-    @ApiModelProperty("项目id")
-    private String projectId;
-    
-    @ApiModelProperty("对象id")
-    private String objId;
-    
-    @ApiModelProperty("对象类型编码")
-    private String classCode;
-    
-    @ApiModelProperty("严重程度")
-    private String level;
-    
-    @ApiModelProperty("报警描述")
-    private String remark;
-    
-    @ApiModelProperty("创建用户")
-    private String createUser;
-    
-    @ApiModelProperty("创建时间")
-    private Date createTime;
-    
-    @ApiModelProperty("更新用户")
-    private String updateUser;
-    
-    @ApiModelProperty("更新时间")
-    private Date updateTime;
-    
-    @ApiModelProperty("报警名称")
-    private String name;
-    
-    @ApiModelProperty("报警分类")
-    private String category;
-    
-    @ApiModelProperty("是否重点关注")
-    private Integer concern;
-    
-    @ApiModelProperty("报警状态")
-    private Integer state;
-    
-    @ApiModelProperty("有效期开始时间")
-    private Date effectStartTime;
-    
-    @ApiModelProperty("有效期结束时间")
-    private Date effectEndTime;
-    
-    @ApiModelProperty("报警性质")
-    private Integer nature;
-    
-    @ApiModelProperty("处理方式")
-    private Integer treatMode;
-    
-    @ApiModelProperty("处理状态")
-    private Integer treatState;
-    
-    @ApiModelProperty("集团编码")
-    private String groupCode;
-    
-    @ApiModelProperty("触发和恢复条件")
-    private Object condition;
-    
-    @ApiModelProperty("触发值信息")
-    private Object triggerInfo;
-    
-    @ApiModelProperty("恢复值信息")
-    private Object endInfo;
-    
-    @ApiModelProperty("报警触发时间")
-    private Date triggerTime;
-    
-    @ApiModelProperty("恢复时间")
-    private Date endTime;
-    
-    @ApiModelProperty("工单id")
-    private String orderId;
-    
-    @ApiModelProperty("工单状态")
-    private String orderState;
-    
-    @ApiModelProperty("补充说明")
-    private Object supplement;
-    
-    @ApiModelProperty("匹配规则id")
-    private String targetId;
-    
+	/**
+	 * 忽略报警时间
+	 */
+    @TableField(exist = false)
+	private Date ignoreTime;
+	/**
+	 * 报警处理完成时间
+	 */
 
-    public static String PROP_ITEM_CODE = "item_code";
-    public static String PROP_PROJECT_ID = "project_id";
-    public static String PROP_OBJ_ID = "obj_id";
-    public static String PROP_CLASS_CODE = "class_code";
-    public static String PROP_LEVEL = "level";
-    public static String PROP_REMARK = "remark";
-    public static String PROP_CREATE_USER = "create_user";
-    public static String PROP_CREATE_TIME = "create_time";
-    public static String PROP_UPDATE_USER = "update_user";
-    public static String PROP_UPDATE_TIME = "update_time";
-    public static String PROP_NAME = "name";
-    public static String PROP_CATEGORY = "category";
-    public static String PROP_CONCERN = "concern";
-    public static String PROP_STATE = "state";
-    public static String PROP_EFFECT_START_TIME = "effect_start_time";
-    public static String PROP_EFFECT_END_TIME = "effect_end_time";
-    public static String PROP_NATURE = "nature";
-    public static String PROP_TREAT_MODE = "treat_mode";
-    public static String PROP_TREAT_STATE = "treat_state";
-    public static String PROP_GROUP_CODE = "group_code";
-    public static String PROP_CONDITION = "condition";
-    public static String PROP_TRIGGER_INFO = "trigger_info";
-    public static String PROP_END_INFO = "end_info";
-    public static String PROP_TRIGGER_TIME = "trigger_time";
-    public static String PROP_END_TIME = "end_time";
-    public static String PROP_ORDER_ID = "order_id";
-    public static String PROP_ORDER_STATE = "order_state";
-    public static String PROP_SUPPLEMENT = "supplement";
-    public static String PROP_TARGET_ID = "target_id";
+    @TableField(exist = false)
+	private Date treatEndTime;
+	private String targetId;
+	public static String PROP_ITEM_CODE = "item_code";
+	public static String PROP_PROJECT_ID = "project_id";
+	public static String PROP_OBJ_ID = "obj_id";
+	public static String PROP_CLASS_CODE = "class_code";
+	public static String PROP_LEVEL = "level";
+	public static String PROP_REMARK = "remark";
+	public static String PROP_CREATE_USER = "create_user";
+	public static String PROP_CREATE_TIME = "create_time";
+	public static String PROP_UPDATE_USER = "update_user";
+	public static String PROP_UPDATE_TIME = "update_time";
+	public static String PROP_NAME = "name";
+	public static String PROP_CATEGORY = "category";
+	public static String PROP_CONCERN = "concern";
+	public static String PROP_STATE = "state";
+	public static String PROP_EFFECT_START_TIME = "effect_start_time";
+	public static String PROP_EFFECT_END_TIME = "effect_end_time";
+	public static String PROP_NATURE = "nature";
+	public static String PROP_TREAT_MODE = "treat_mode";
+	public static String PROP_TREAT_STATE = "treat_state";
+	public static String PROP_GROUP_CODE = "group_code";
+	public static String PROP_CONDITION = "condition";
+	public static String PROP_TRIGGER_INFO = "trigger_info";
+	public static String PROP_END_INFO = "end_info";
+	public static String PROP_TRIGGER_TIME = "trigger_time";
+	public static String PROP_END_TIME = "end_time";
+	public static String PROP_ORDER_ID = "order_id";
+	public static String PROP_ORDER_STATE = "order_state";
+	public static String PROP_SUPPLEMENT = "supplement";
+	public static String PROP_TARGET_ID = "target_id";
 
 }

+ 9 - 4
src/main/java/com/persagy/apm/dmpalarm/model/ConvertAlarmRecordTool.java

@@ -1,12 +1,17 @@
 package com.persagy.apm.dmpalarm.model;
 
-import org.mapstruct.*;
+import java.util.List;
+
+import org.mapstruct.Mapper;
 import org.mapstruct.MappingTarget;
+import org.mapstruct.NullValueCheckStrategy;
+import org.mapstruct.NullValueMappingStrategy;
 import org.mapstruct.factory.Mappers;
-import com.persagy.apm.dmpalarm.model.vo.*;
-import com.persagy.apm.dmpalarm.model.dto.*;
 
-import java.util.List;
+import com.persagy.apm.dmpalarm.model.dto.AddAlarmRecordDTO;
+import com.persagy.apm.dmpalarm.model.dto.UpdateAlarmRecordDTO;
+import com.persagy.apm.dmpalarm.model.vo.AlarmRecordItemVO;
+import com.persagy.apm.dmpalarm.model.vo.AlarmRecordListItemVO;
 
 /**
  * 报警记录(AlarmRecord) dto、vo、do转换工具类

+ 49 - 0
src/main/java/com/persagy/apm/dmpalarm/model/DmpMessage.java

@@ -0,0 +1,49 @@
+package com.persagy.apm.dmpalarm.model;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-22
+ * @verison: 1.0
+ */
+
+@Getter
+@Setter
+public class DmpMessage {
+
+	private String mid;
+	private String type;
+	private String groupCode;
+	private String projectId;
+	private String targetId;
+	private Integer int1;
+	private Integer int2;
+	private String str1;
+	private String str2;
+	private String sendTime;
+	private String expireTime;
+	private String appId;
+	private String userId;
+	private Map<String, Object> exts;
+
+	public DmpMessage() {
+	}
+
+	public DmpMessage(String type, String targetId) {
+		this.type = type;
+		this.targetId = targetId;
+	}
+
+	public DmpMessage add(String key, Object value) {
+		if (exts == null) {
+			this.exts = new HashMap<>();
+		}
+		this.exts.put(key, value);
+		return this;
+	}
+}

+ 10 - 6
src/main/java/com/persagy/apm/dmpalarm/model/dto/AddAlarmRecordDTO.java

@@ -1,10 +1,14 @@
 package com.persagy.apm.dmpalarm.model.dto;
 
+import java.util.Date;
+
+import javax.validation.constraints.NotNull;
+
+import com.alibaba.fastjson.JSONObject;
+
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import javax.validation.constraints.NotNull;
 import lombok.Data;
-import java.util.Date;
 
 /**
  * @author lixing
@@ -95,15 +99,15 @@ public class AddAlarmRecordDTO {
     
     @ApiModelProperty(value = "触发和恢复条件", required = true)
     @NotNull(message = "触发和恢复条件不能为空") // todo 更新校验规则
-    private Object condition;
+    private JSONObject condition;
     
     @ApiModelProperty(value = "触发值信息", required = true)
     @NotNull(message = "触发值信息不能为空") // todo 更新校验规则
-    private Object triggerInfo;
+    private JSONObject triggerInfo;
     
     @ApiModelProperty(value = "恢复值信息", required = true)
     @NotNull(message = "恢复值信息不能为空") // todo 更新校验规则
-    private Object endInfo;
+    private JSONObject endInfo;
     
     @ApiModelProperty(value = "报警触发时间", required = true)
     @NotNull(message = "报警触发时间不能为空") // todo 更新校验规则
@@ -123,7 +127,7 @@ public class AddAlarmRecordDTO {
     
     @ApiModelProperty(value = "补充说明", required = true)
     @NotNull(message = "补充说明不能为空") // todo 更新校验规则
-    private Object supplement;
+    private JSONObject supplement;
     
     @ApiModelProperty(value = "匹配规则id", required = true)
     @NotNull(message = "匹配规则id不能为空") // todo 更新校验规则

+ 8 - 5
src/main/java/com/persagy/apm/dmpalarm/model/dto/PageQueryAlarmRecordDTO.java

@@ -1,9 +1,12 @@
 package com.persagy.apm.dmpalarm.model.dto;
 
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import java.util.Date;
+
+import com.alibaba.fastjson.JSONObject;
 import com.persagy.apm.common.model.dto.PageDTO;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -79,13 +82,13 @@ public class PageQueryAlarmRecordDTO extends PageDTO {
     private String groupCode;
     
     @ApiModelProperty(value = "触发和恢复条件", required = true)
-    private Object condition;
+    private JSONObject condition;
     
     @ApiModelProperty(value = "触发值信息", required = true)
-    private Object triggerInfo;
+    private JSONObject triggerInfo;
     
     @ApiModelProperty(value = "恢复值信息", required = true)
-    private Object endInfo;
+    private JSONObject endInfo;
     
     @ApiModelProperty(value = "报警触发时间", required = true)
     private Date triggerTime;

+ 8 - 5
src/main/java/com/persagy/apm/dmpalarm/model/dto/QueryAlarmRecordDTO.java

@@ -1,9 +1,12 @@
 package com.persagy.apm.dmpalarm.model.dto;
 
+import java.util.Date;
+
+import com.alibaba.fastjson.JSONObject;
+
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import java.util.Date;
 
 /**
  * @author lixing
@@ -73,13 +76,13 @@ public class QueryAlarmRecordDTO {
     private String groupCode;
     
     @ApiModelProperty(value = "触发和恢复条件", required = true)
-    private Object condition;
+    private JSONObject condition;
     
     @ApiModelProperty(value = "触发值信息", required = true)
-    private Object triggerInfo;
+    private JSONObject triggerInfo;
     
     @ApiModelProperty(value = "恢复值信息", required = true)
-    private Object endInfo;
+    private JSONObject endInfo;
     
     @ApiModelProperty(value = "报警触发时间", required = true)
     private Date triggerTime;
@@ -94,7 +97,7 @@ public class QueryAlarmRecordDTO {
     private String orderState;
     
     @ApiModelProperty(value = "补充说明", required = true)
-    private Object supplement;
+    private JSONObject supplement;
     
     @ApiModelProperty(value = "匹配规则id", required = true)
     private String targetId;

+ 7 - 4
src/main/java/com/persagy/apm/dmpalarm/model/dto/UpdateAlarmRecordDTO.java

@@ -3,6 +3,9 @@ package com.persagy.apm.dmpalarm.model.dto;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import javax.validation.constraints.NotNull;
+
+import com.alibaba.fastjson.JSONObject;
+
 import lombok.Data;
 import java.util.Date;
 
@@ -99,15 +102,15 @@ public class UpdateAlarmRecordDTO {
     
     @ApiModelProperty(value = "触发和恢复条件", required = true)
     @NotNull(message = "触发和恢复条件不能为空") // todo 更新校验规则
-    private Object condition;
+    private JSONObject condition;
     
     @ApiModelProperty(value = "触发值信息", required = true)
     @NotNull(message = "触发值信息不能为空") // todo 更新校验规则
-    private Object triggerInfo;
+    private JSONObject triggerInfo;
     
     @ApiModelProperty(value = "恢复值信息", required = true)
     @NotNull(message = "恢复值信息不能为空") // todo 更新校验规则
-    private Object endInfo;
+    private JSONObject endInfo;
     
     @ApiModelProperty(value = "报警触发时间", required = true)
     @NotNull(message = "报警触发时间不能为空") // todo 更新校验规则
@@ -127,7 +130,7 @@ public class UpdateAlarmRecordDTO {
     
     @ApiModelProperty(value = "补充说明", required = true)
     @NotNull(message = "补充说明不能为空") // todo 更新校验规则
-    private Object supplement;
+    private JSONObject supplement;
     
     @ApiModelProperty(value = "匹配规则id", required = true)
     @NotNull(message = "匹配规则id不能为空") // todo 更新校验规则

+ 6 - 4
src/main/java/com/persagy/apm/dmpalarm/model/vo/AlarmRecordItemVO.java

@@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import java.util.Date;
+
+import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.annotation.JsonInclude;
 
 /**
@@ -78,13 +80,13 @@ public class AlarmRecordItemVO {
     private String groupCode;
     
     @ApiModelProperty("触发和恢复条件")
-    private Object condition;
+    private JSONObject condition;
     
     @ApiModelProperty("触发值信息")
-    private Object triggerInfo;
+    private JSONObject triggerInfo;
     
     @ApiModelProperty("恢复值信息")
-    private Object endInfo;
+    private JSONObject endInfo;
     
     @ApiModelProperty("报警触发时间")
     private Date triggerTime;
@@ -99,7 +101,7 @@ public class AlarmRecordItemVO {
     private String orderState;
     
     @ApiModelProperty("补充说明")
-    private Object supplement;
+    private JSONObject supplement;
     
     @ApiModelProperty("匹配规则id")
     private String targetId;

+ 9 - 6
src/main/java/com/persagy/apm/dmpalarm/model/vo/AlarmRecordListItemVO.java

@@ -1,10 +1,13 @@
 package com.persagy.apm.dmpalarm.model.vo;
 
+import java.util.Date;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonInclude;
 
 /**
  * @author lixing
@@ -78,13 +81,13 @@ public class AlarmRecordListItemVO {
     private String groupCode;
     
     @ApiModelProperty("触发和恢复条件")
-    private Object condition;
+    private JSONObject condition;
     
     @ApiModelProperty("触发值信息")
-    private Object triggerInfo;
+    private JSONObject triggerInfo;
     
     @ApiModelProperty("恢复值信息")
-    private Object endInfo;
+    private JSONObject endInfo;
     
     @ApiModelProperty("报警触发时间")
     private Date triggerTime;
@@ -99,7 +102,7 @@ public class AlarmRecordListItemVO {
     private String orderState;
     
     @ApiModelProperty("补充说明")
-    private Object supplement;
+    private JSONObject supplement;
     
     @ApiModelProperty("匹配规则id")
     private String targetId;

+ 10 - 4
src/main/java/com/persagy/apm/dmpalarm/service/IAlarmRecordService.java

@@ -1,11 +1,15 @@
 package com.persagy.apm.dmpalarm.service;
 
-import com.persagy.apm.dmpalarm.model.*;
-import com.persagy.apm.dmpalarm.model.dto.*;
 import java.util.List;
+
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.model.AlarmRecord;
+import com.persagy.apm.dmpalarm.model.dto.AddAlarmRecordDTO;
+import com.persagy.apm.dmpalarm.model.dto.PageQueryAlarmRecordDTO;
+import com.persagy.apm.dmpalarm.model.dto.QueryAlarmRecordDTO;
+import com.persagy.apm.dmpalarm.model.dto.UpdateAlarmRecordDTO;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
 
 /**
  * 报警记录(AlarmRecord) service接口
@@ -72,4 +76,6 @@ public interface IAlarmRecordService  {
     * @version V1.0 2021-12-09 10:44:19
     */
     public IPage<AlarmRecord> pageQueryAlarmRecord(PageQueryAlarmRecordDTO pageQueryAlarmRecordDTO);
+
+	public PagedResponse<AlarmRecord> query(JsonCriteria criteria);
 }

+ 459 - 414
src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmRecordServiceImpl.java

@@ -1,21 +1,36 @@
 package com.persagy.apm.dmpalarm.service.impl;
 
-import com.persagy.apm.common.context.poems.PoemsContext;
-import com.persagy.apm.dmpalarm.dao.AlarmRecordMapper;
-import com.persagy.apm.dmpalarm.service.IAlarmRecordService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
+import java.util.List;
+
 import org.apache.commons.lang.StringUtils;
-import com.persagy.apm.common.constant.enums.ValidEnum;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.persagy.apm.dmpalarm.model.*;
-import com.persagy.apm.dmpalarm.model.dto.*;
-import java.util.List;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.base.CaseFormat;
+import com.persagy.apm.common.constant.enums.ValidEnum;
 import com.persagy.apm.common.model.dto.Sort;
-import org.springframework.util.CollectionUtils;
+import com.persagy.apm.dmpalarm.criteria.CriteriaUtils;
+import com.persagy.apm.dmpalarm.criteria.JsonCriteria;
+import com.persagy.apm.dmpalarm.dao.AlarmRecordMapper;
+import com.persagy.apm.dmpalarm.enumeration.EnumAlarmListType;
+import com.persagy.apm.dmpalarm.enumeration.EnumAlarmState;
+import com.persagy.apm.dmpalarm.enumeration.EnumAlarmTreatState;
+import com.persagy.apm.dmpalarm.model.AlarmRecord;
+import com.persagy.apm.dmpalarm.model.ConvertAlarmRecordTool;
+import com.persagy.apm.dmpalarm.model.dto.AddAlarmRecordDTO;
+import com.persagy.apm.dmpalarm.model.dto.PageQueryAlarmRecordDTO;
+import com.persagy.apm.dmpalarm.model.dto.QueryAlarmRecordDTO;
+import com.persagy.apm.dmpalarm.model.dto.UpdateAlarmRecordDTO;
+import com.persagy.apm.dmpalarm.service.IAlarmRecordService;
+import com.persagy.apm.dmpalarm.web.PagedResponse;
+
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * 报警记录(AlarmRecord) service层
@@ -23,409 +38,439 @@ import org.springframework.util.CollectionUtils;
  * @author lixing
  * @version V1.0 2021-12-09 10:44:19
  */
+@Slf4j
 @Service
-public class AlarmRecordServiceImpl extends ServiceImpl<AlarmRecordMapper, AlarmRecord> 
-    implements IAlarmRecordService {
-    
-    /**
-    * 创建报警记录
-    * @return 报警记录主键
-    * @author lixing
-    * @version V1.0 2021-12-09 10:44:19
-    */
-    @Override
-    public String createAlarmRecord(AddAlarmRecordDTO addAlarmRecordDTO) {
-        AlarmRecord alarmRecord = ConvertAlarmRecordTool.INSTANCE.convertAddDto2Entity(addAlarmRecordDTO);
-        // 设置默认值
-        setDefaultValue(alarmRecord);
-        save(alarmRecord);
-        return alarmRecord.getId();
-    }
-    
-    /**
-     * 如果某些字段没有赋值,使用默认的值
-     *
-     * @param alarmRecord 报警记录实体
-     * @author lixing
-     * @version V1.0 2021/3/12 12:29 下午
-     */
-    private void setDefaultValue(AlarmRecord alarmRecord) {
-        alarmRecord.setCreator(PoemsContext.getContext().getUserId());
-        // todo 其他默认的属性
-        
-    }
-    
-    /**
-    * 报警记录详情
-    * @param id 主键
-    * @return 部门do类
-    * @author lixing
-    * @version V1.0 2021-12-09 10:44:19
-    */
-    @Override
-    public AlarmRecord queryAlarmRecordDetail(String id) {
-        AlarmRecord alarmRecord = getById(id);
-        if (alarmRecord == null) {
-            throw new IllegalArgumentException("查看AlarmRecord详情时发生异常,找不到要查看的记录,id=" + id);
-        }
-        return alarmRecord;
-    }
-    
-    /**
-    * 更新报警记录
-    * @author lixing
-    * @version V1.0 2021-12-09 10:44:19
-    */
-    @Override
-    public void updateAlarmRecord(UpdateAlarmRecordDTO updateAlarmRecordDTO) {
-        AlarmRecord alarmRecord = getById(updateAlarmRecordDTO.getId());
-        alarmRecord = ConvertAlarmRecordTool.INSTANCE.convertUpdateDto2Entity(alarmRecord, updateAlarmRecordDTO);
-        alarmRecord.setModifier(PoemsContext.getContext().getUserId());
-        updateById(alarmRecord);
-    }
-    
-    /**
-     * 校验报警记录是否可删除
-     *
-     * @param id 报警记录主键
-     * @return 报警记录do类
-     * @author lixing
-     * @version V1.0 2021-12-09 10:44:19
-     */
-    public AlarmRecord checkDeletable(String id) {
-        if (id == null) {
-            throw new IllegalArgumentException("删除AlarmRecord时发生异常,主键为空");
-        }
-
-        AlarmRecord alarmRecord = getById(id);
-
-        if (alarmRecord == null) {
-            throw new IllegalArgumentException("删除AlarmRecord时发生异常,找不到要删除的数据,id:" + id);
-        }
-
-        return alarmRecord;
-    }
-    
-    /**
-    * 删除报警记录
-    * @param id 主键
-    * @author lixing
-    * @version V1.0 2021-12-09 10:44:19
-    */
-    @Override
-    public void deleteAlarmRecord(String id) {
-        // 校验是否可删除
-        AlarmRecord alarmRecord = checkDeletable(id);
-
-        alarmRecord.setValid(ValidEnum.FALSE.getType());
-        updateById(alarmRecord);
-    }
-    
-    /**
-    * 查询报警记录
-    * @return List<AlarmRecord>
-    * @author lixing
-    * @version V1.0 2021-12-09 10:44:19
-    */
-    @Override
-    public List<AlarmRecord> queryAlarmRecordList(QueryAlarmRecordDTO queryAlarmRecordDTO) {
-        QueryWrapper<AlarmRecord> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq(AlarmRecord.PROP_VALID, ValidEnum.TRUE.getType());
-        // 默认按创建时间倒序排序
-        queryWrapper.orderBy(true, false, AlarmRecord.PROP_CREATIONTIME);
-        
-        if (queryAlarmRecordDTO != null) {
-                                
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getItemCode())) {
-                queryWrapper.like(AlarmRecord.PROP_ITEM_CODE, queryAlarmRecordDTO.getItemCode());
-            }
-                                        
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getProjectId())) {
-                queryWrapper.like(AlarmRecord.PROP_PROJECT_ID, queryAlarmRecordDTO.getProjectId());
-            }
-                                        
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getObjId())) {
-                queryWrapper.like(AlarmRecord.PROP_OBJ_ID, queryAlarmRecordDTO.getObjId());
-            }
-                                        
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getClassCode())) {
-                queryWrapper.like(AlarmRecord.PROP_CLASS_CODE, queryAlarmRecordDTO.getClassCode());
-            }
-                                        
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getLevel())) {
-                queryWrapper.like(AlarmRecord.PROP_LEVEL, queryAlarmRecordDTO.getLevel());
-            }
-                                        
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getRemark())) {
-                queryWrapper.like(AlarmRecord.PROP_REMARK, queryAlarmRecordDTO.getRemark());
-            }
-                                        
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getCreateUser())) {
-                queryWrapper.like(AlarmRecord.PROP_CREATE_USER, queryAlarmRecordDTO.getCreateUser());
-            }
-                                            
-            if (queryAlarmRecordDTO.getCreateTime() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_CREATE_TIME, queryAlarmRecordDTO.getCreateTime());
-            }
-                                        
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getUpdateUser())) {
-                queryWrapper.like(AlarmRecord.PROP_UPDATE_USER, queryAlarmRecordDTO.getUpdateUser());
-            }
-                                            
-            if (queryAlarmRecordDTO.getUpdateTime() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_UPDATE_TIME, queryAlarmRecordDTO.getUpdateTime());
-            }
-                                            
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getName())) {
-                queryWrapper.like(AlarmRecord.PROP_NAME, queryAlarmRecordDTO.getName());
-            }
-                                        
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getCategory())) {
-                queryWrapper.like(AlarmRecord.PROP_CATEGORY, queryAlarmRecordDTO.getCategory());
-            }
-                                            
-            if (queryAlarmRecordDTO.getConcern() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_CONCERN, queryAlarmRecordDTO.getConcern());
-            }
-                                            
-            if (queryAlarmRecordDTO.getState() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_STATE, queryAlarmRecordDTO.getState());
-            }
-                                            
-            if (queryAlarmRecordDTO.getEffectStartTime() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_EFFECT_START_TIME, queryAlarmRecordDTO.getEffectStartTime());
-            }
-                                            
-            if (queryAlarmRecordDTO.getEffectEndTime() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_EFFECT_END_TIME, queryAlarmRecordDTO.getEffectEndTime());
-            }
-                                            
-            if (queryAlarmRecordDTO.getNature() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_NATURE, queryAlarmRecordDTO.getNature());
-            }
-                                            
-            if (queryAlarmRecordDTO.getTreatMode() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_TREAT_MODE, queryAlarmRecordDTO.getTreatMode());
-            }
-                                            
-            if (queryAlarmRecordDTO.getTreatState() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_TREAT_STATE, queryAlarmRecordDTO.getTreatState());
-            }
-                                        
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getGroupCode())) {
-                queryWrapper.like(AlarmRecord.PROP_GROUP_CODE, queryAlarmRecordDTO.getGroupCode());
-            }
-                                            
-            if (queryAlarmRecordDTO.getCondition() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_CONDITION, queryAlarmRecordDTO.getCondition());
-            }
-                                            
-            if (queryAlarmRecordDTO.getTriggerInfo() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_TRIGGER_INFO, queryAlarmRecordDTO.getTriggerInfo());
-            }
-                                            
-            if (queryAlarmRecordDTO.getEndInfo() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_END_INFO, queryAlarmRecordDTO.getEndInfo());
-            }
-                                            
-            if (queryAlarmRecordDTO.getTriggerTime() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_TRIGGER_TIME, queryAlarmRecordDTO.getTriggerTime());
-            }
-                                            
-            if (queryAlarmRecordDTO.getEndTime() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_END_TIME, queryAlarmRecordDTO.getEndTime());
-            }
-                                        
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getOrderId())) {
-                queryWrapper.like(AlarmRecord.PROP_ORDER_ID, queryAlarmRecordDTO.getOrderId());
-            }
-                                        
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getOrderState())) {
-                queryWrapper.like(AlarmRecord.PROP_ORDER_STATE, queryAlarmRecordDTO.getOrderState());
-            }
-                                            
-            if (queryAlarmRecordDTO.getSupplement() != null) {
-                queryWrapper.eq(AlarmRecord.PROP_SUPPLEMENT, queryAlarmRecordDTO.getSupplement());
-            }
-                                        
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getTargetId())) {
-                queryWrapper.like(AlarmRecord.PROP_TARGET_ID, queryAlarmRecordDTO.getTargetId());
-            }
-                    
-        }
-        
-        return list(queryWrapper);
-    }
-    
-    /**
-    * 分页查询报警记录
-    * @return IPage<AlarmRecord>
-    * @author lixing
-    * @version V1.0 2021-12-09 10:44:19
-    */
-    @Override
-    public IPage<AlarmRecord> pageQueryAlarmRecord(PageQueryAlarmRecordDTO pageQueryAlarmRecordDTO) {
-        QueryWrapper<AlarmRecord> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq(AlarmRecord.PROP_VALID, ValidEnum.TRUE.getType());
-        // 这里认为pageQueryDTO是经过校验的,肯定包含分页信息
-        IPage<AlarmRecord> pageParam = new Page<>(pageQueryAlarmRecordDTO.getPage(), pageQueryAlarmRecordDTO.getSize(),true);
-        // 排序信息
-        if(CollectionUtils.isEmpty(pageQueryAlarmRecordDTO.getOrders())){
-            // 默认按创建时间倒序排序
-            queryWrapper.orderBy(true, false, AlarmRecord.PROP_CREATIONTIME);
-        }else {
-            List<Sort> orders = pageQueryAlarmRecordDTO.getOrders();
-            for(Sort sort: orders) {
-                // 将驼峰转换为下划线格式
-                sort.setColumn(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE,sort.getColumn()));
-                queryWrapper.orderBy(true, sort.isAsc(), sort.getColumn());
-            }
-        }
-                
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getItemCode())) {
-            queryWrapper.like(AlarmRecord.PROP_ITEM_CODE, pageQueryAlarmRecordDTO.getItemCode());
-        }
-                            
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getProjectId())) {
-            queryWrapper.like(AlarmRecord.PROP_PROJECT_ID, pageQueryAlarmRecordDTO.getProjectId());
-        }
-                            
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getObjId())) {
-            queryWrapper.like(AlarmRecord.PROP_OBJ_ID, pageQueryAlarmRecordDTO.getObjId());
-        }
-                            
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getClassCode())) {
-            queryWrapper.like(AlarmRecord.PROP_CLASS_CODE, pageQueryAlarmRecordDTO.getClassCode());
-        }
-                            
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getLevel())) {
-            queryWrapper.like(AlarmRecord.PROP_LEVEL, pageQueryAlarmRecordDTO.getLevel());
-        }
-                            
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getRemark())) {
-            queryWrapper.like(AlarmRecord.PROP_REMARK, pageQueryAlarmRecordDTO.getRemark());
-        }
-                            
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getCreateUser())) {
-            queryWrapper.like(AlarmRecord.PROP_CREATE_USER, pageQueryAlarmRecordDTO.getCreateUser());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getCreateTime() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_CREATE_TIME, pageQueryAlarmRecordDTO.getCreateTime());
-        }
-                            
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getUpdateUser())) {
-            queryWrapper.like(AlarmRecord.PROP_UPDATE_USER, pageQueryAlarmRecordDTO.getUpdateUser());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getUpdateTime() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_UPDATE_TIME, pageQueryAlarmRecordDTO.getUpdateTime());
-        }
-                                
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getName())) {
-            queryWrapper.like(AlarmRecord.PROP_NAME, pageQueryAlarmRecordDTO.getName());
-        }
-                            
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getCategory())) {
-            queryWrapper.like(AlarmRecord.PROP_CATEGORY, pageQueryAlarmRecordDTO.getCategory());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getConcern() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_CONCERN, pageQueryAlarmRecordDTO.getConcern());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getState() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_STATE, pageQueryAlarmRecordDTO.getState());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getEffectStartTime() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_EFFECT_START_TIME, pageQueryAlarmRecordDTO.getEffectStartTime());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getEffectEndTime() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_EFFECT_END_TIME, pageQueryAlarmRecordDTO.getEffectEndTime());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getNature() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_NATURE, pageQueryAlarmRecordDTO.getNature());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getTreatMode() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_TREAT_MODE, pageQueryAlarmRecordDTO.getTreatMode());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getTreatState() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_TREAT_STATE, pageQueryAlarmRecordDTO.getTreatState());
-        }
-                            
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getGroupCode())) {
-            queryWrapper.like(AlarmRecord.PROP_GROUP_CODE, pageQueryAlarmRecordDTO.getGroupCode());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getCondition() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_CONDITION, pageQueryAlarmRecordDTO.getCondition());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getTriggerInfo() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_TRIGGER_INFO, pageQueryAlarmRecordDTO.getTriggerInfo());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getEndInfo() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_END_INFO, pageQueryAlarmRecordDTO.getEndInfo());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getTriggerTime() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_TRIGGER_TIME, pageQueryAlarmRecordDTO.getTriggerTime());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getEndTime() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_END_TIME, pageQueryAlarmRecordDTO.getEndTime());
-        }
-                            
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getOrderId())) {
-            queryWrapper.like(AlarmRecord.PROP_ORDER_ID, pageQueryAlarmRecordDTO.getOrderId());
-        }
-                            
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getOrderState())) {
-            queryWrapper.like(AlarmRecord.PROP_ORDER_STATE, pageQueryAlarmRecordDTO.getOrderState());
-        }
-                            
-        if (pageQueryAlarmRecordDTO.getSupplement() != null) {
-            queryWrapper.eq(AlarmRecord.PROP_SUPPLEMENT, pageQueryAlarmRecordDTO.getSupplement());
-        }
-                            
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getTargetId())) {
-            queryWrapper.like(AlarmRecord.PROP_TARGET_ID, pageQueryAlarmRecordDTO.getTargetId());
-        }
-            
-        return getBaseMapper().selectPage(pageParam, queryWrapper);
-    }
+public class AlarmRecordServiceImpl extends ServiceImpl<AlarmRecordMapper, AlarmRecord> implements IAlarmRecordService {
+
+	@Autowired
+	private CriteriaUtils criteriaUtils;
+
+	/**
+	 * 创建报警记录
+	 * 
+	 * @return 报警记录主键
+	 * @author lixing
+	 * @version V1.0 2021-12-09 10:44:19
+	 */
+	@Override
+	public String createAlarmRecord(AddAlarmRecordDTO addAlarmRecordDTO) {
+		AlarmRecord alarmRecord = ConvertAlarmRecordTool.INSTANCE.convertAddDto2Entity(addAlarmRecordDTO);
+		// 设置默认值
+		save(alarmRecord);
+		return alarmRecord.getId();
+	}
+
+	/**
+	 * 报警记录详情
+	 * 
+	 * @param id 主键
+	 * @return 部门do类
+	 * @author lixing
+	 * @version V1.0 2021-12-09 10:44:19
+	 */
+	@Override
+	public AlarmRecord queryAlarmRecordDetail(String id) {
+		AlarmRecord alarmRecord = getById(id);
+		if (alarmRecord == null) {
+			throw new IllegalArgumentException("查看AlarmRecord详情时发生异常,找不到要查看的记录,id=" + id);
+		}
+		return alarmRecord;
+	}
+
+	/**
+	 * 更新报警记录
+	 * 
+	 * @author lixing
+	 * @version V1.0 2021-12-09 10:44:19
+	 */
+	@Override
+	public void updateAlarmRecord(UpdateAlarmRecordDTO updateAlarmRecordDTO) {
+		AlarmRecord alarmRecord = getById(updateAlarmRecordDTO.getId());
+		alarmRecord = ConvertAlarmRecordTool.INSTANCE.convertUpdateDto2Entity(alarmRecord, updateAlarmRecordDTO);
+		updateById(alarmRecord);
+	}
+
+	/**
+	 * 校验报警记录是否可删除
+	 *
+	 * @param id 报警记录主键
+	 * @return 报警记录do类
+	 * @author lixing
+	 * @version V1.0 2021-12-09 10:44:19
+	 */
+	public AlarmRecord checkDeletable(String id) {
+		if (id == null) {
+			throw new IllegalArgumentException("删除AlarmRecord时发生异常,主键为空");
+		}
+
+		AlarmRecord alarmRecord = getById(id);
+
+		if (alarmRecord == null) {
+			throw new IllegalArgumentException("删除AlarmRecord时发生异常,找不到要删除的数据,id:" + id);
+		}
+
+		return alarmRecord;
+	}
+
+	/**
+	 * 删除报警记录
+	 * 
+	 * @param id 主键
+	 * @author lixing
+	 * @version V1.0 2021-12-09 10:44:19
+	 */
+	@Override
+	public void deleteAlarmRecord(String id) {
+		// 校验是否可删除
+		AlarmRecord alarmRecord = checkDeletable(id);
+
+		alarmRecord.setValid(ValidEnum.FALSE.getType());
+		updateById(alarmRecord);
+	}
+
+	/**
+	 * 查询报警记录
+	 * 
+	 * @return List<AlarmRecord>
+	 * @author lixing
+	 * @version V1.0 2021-12-09 10:44:19
+	 */
+	@Override
+	public List<AlarmRecord> queryAlarmRecordList(QueryAlarmRecordDTO queryAlarmRecordDTO) {
+		QueryWrapper<AlarmRecord> queryWrapper = new QueryWrapper<>();
+		// 默认按创建时间倒序排序
+		if (queryAlarmRecordDTO != null) {
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getItemCode())) {
+				queryWrapper.like(AlarmRecord.PROP_ITEM_CODE, queryAlarmRecordDTO.getItemCode());
+			}
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getProjectId())) {
+				queryWrapper.like(AlarmRecord.PROP_PROJECT_ID, queryAlarmRecordDTO.getProjectId());
+			}
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getObjId())) {
+				queryWrapper.like(AlarmRecord.PROP_OBJ_ID, queryAlarmRecordDTO.getObjId());
+			}
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getClassCode())) {
+				queryWrapper.like(AlarmRecord.PROP_CLASS_CODE, queryAlarmRecordDTO.getClassCode());
+			}
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getLevel())) {
+				queryWrapper.like(AlarmRecord.PROP_LEVEL, queryAlarmRecordDTO.getLevel());
+			}
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getRemark())) {
+				queryWrapper.like(AlarmRecord.PROP_REMARK, queryAlarmRecordDTO.getRemark());
+			}
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getCreateUser())) {
+				queryWrapper.like(AlarmRecord.PROP_CREATE_USER, queryAlarmRecordDTO.getCreateUser());
+			}
+
+			if (queryAlarmRecordDTO.getCreateTime() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_CREATE_TIME, queryAlarmRecordDTO.getCreateTime());
+			}
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getUpdateUser())) {
+				queryWrapper.like(AlarmRecord.PROP_UPDATE_USER, queryAlarmRecordDTO.getUpdateUser());
+			}
+
+			if (queryAlarmRecordDTO.getUpdateTime() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_UPDATE_TIME, queryAlarmRecordDTO.getUpdateTime());
+			}
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getName())) {
+				queryWrapper.like(AlarmRecord.PROP_NAME, queryAlarmRecordDTO.getName());
+			}
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getCategory())) {
+				queryWrapper.like(AlarmRecord.PROP_CATEGORY, queryAlarmRecordDTO.getCategory());
+			}
+
+			if (queryAlarmRecordDTO.getConcern() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_CONCERN, queryAlarmRecordDTO.getConcern());
+			}
+
+			if (queryAlarmRecordDTO.getState() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_STATE, queryAlarmRecordDTO.getState());
+			}
+
+			if (queryAlarmRecordDTO.getEffectStartTime() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_EFFECT_START_TIME, queryAlarmRecordDTO.getEffectStartTime());
+			}
+
+			if (queryAlarmRecordDTO.getEffectEndTime() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_EFFECT_END_TIME, queryAlarmRecordDTO.getEffectEndTime());
+			}
+
+			if (queryAlarmRecordDTO.getNature() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_NATURE, queryAlarmRecordDTO.getNature());
+			}
+
+			if (queryAlarmRecordDTO.getTreatMode() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_TREAT_MODE, queryAlarmRecordDTO.getTreatMode());
+			}
+
+			if (queryAlarmRecordDTO.getTreatState() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_TREAT_STATE, queryAlarmRecordDTO.getTreatState());
+			}
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getGroupCode())) {
+				queryWrapper.like(AlarmRecord.PROP_GROUP_CODE, queryAlarmRecordDTO.getGroupCode());
+			}
+
+			if (queryAlarmRecordDTO.getCondition() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_CONDITION, queryAlarmRecordDTO.getCondition());
+			}
+
+			if (queryAlarmRecordDTO.getTriggerInfo() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_TRIGGER_INFO, queryAlarmRecordDTO.getTriggerInfo());
+			}
+
+			if (queryAlarmRecordDTO.getEndInfo() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_END_INFO, queryAlarmRecordDTO.getEndInfo());
+			}
+
+			if (queryAlarmRecordDTO.getTriggerTime() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_TRIGGER_TIME, queryAlarmRecordDTO.getTriggerTime());
+			}
+
+			if (queryAlarmRecordDTO.getEndTime() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_END_TIME, queryAlarmRecordDTO.getEndTime());
+			}
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getOrderId())) {
+				queryWrapper.like(AlarmRecord.PROP_ORDER_ID, queryAlarmRecordDTO.getOrderId());
+			}
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getOrderState())) {
+				queryWrapper.like(AlarmRecord.PROP_ORDER_STATE, queryAlarmRecordDTO.getOrderState());
+			}
+
+			if (queryAlarmRecordDTO.getSupplement() != null) {
+				queryWrapper.eq(AlarmRecord.PROP_SUPPLEMENT, queryAlarmRecordDTO.getSupplement());
+			}
+
+			// todo 需判断使用like还是eq
+			if (StringUtils.isNotEmpty(queryAlarmRecordDTO.getTargetId())) {
+				queryWrapper.like(AlarmRecord.PROP_TARGET_ID, queryAlarmRecordDTO.getTargetId());
+			}
+
+		}
+
+		return list(queryWrapper);
+	}
+
+	/**
+	 * 分页查询报警记录
+	 * 
+	 * @return IPage<AlarmRecord>
+	 * @author lixing
+	 * @version V1.0 2021-12-09 10:44:19
+	 */
+	@Override
+	public IPage<AlarmRecord> pageQueryAlarmRecord(PageQueryAlarmRecordDTO pageQueryAlarmRecordDTO) {
+		QueryWrapper<AlarmRecord> queryWrapper = new QueryWrapper<>();
+		// 这里认为pageQueryDTO是经过校验的,肯定包含分页信息
+		IPage<AlarmRecord> pageParam = new Page<>(pageQueryAlarmRecordDTO.getPage(), pageQueryAlarmRecordDTO.getSize(),
+				true);
+		// 排序信息
+		if (CollectionUtils.isEmpty(pageQueryAlarmRecordDTO.getOrders())) {
+			// 默认按创建时间倒序排序
+		} else {
+			List<Sort> orders = pageQueryAlarmRecordDTO.getOrders();
+			for (Sort sort : orders) {
+				// 将驼峰转换为下划线格式
+				sort.setColumn(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, sort.getColumn()));
+				queryWrapper.orderBy(true, sort.isAsc(), sort.getColumn());
+			}
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getItemCode())) {
+			queryWrapper.like(AlarmRecord.PROP_ITEM_CODE, pageQueryAlarmRecordDTO.getItemCode());
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getProjectId())) {
+			queryWrapper.like(AlarmRecord.PROP_PROJECT_ID, pageQueryAlarmRecordDTO.getProjectId());
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getObjId())) {
+			queryWrapper.like(AlarmRecord.PROP_OBJ_ID, pageQueryAlarmRecordDTO.getObjId());
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getClassCode())) {
+			queryWrapper.like(AlarmRecord.PROP_CLASS_CODE, pageQueryAlarmRecordDTO.getClassCode());
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getLevel())) {
+			queryWrapper.like(AlarmRecord.PROP_LEVEL, pageQueryAlarmRecordDTO.getLevel());
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getRemark())) {
+			queryWrapper.like(AlarmRecord.PROP_REMARK, pageQueryAlarmRecordDTO.getRemark());
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getCreateUser())) {
+			queryWrapper.like(AlarmRecord.PROP_CREATE_USER, pageQueryAlarmRecordDTO.getCreateUser());
+		}
+
+		if (pageQueryAlarmRecordDTO.getCreateTime() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_CREATE_TIME, pageQueryAlarmRecordDTO.getCreateTime());
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getUpdateUser())) {
+			queryWrapper.like(AlarmRecord.PROP_UPDATE_USER, pageQueryAlarmRecordDTO.getUpdateUser());
+		}
+
+		if (pageQueryAlarmRecordDTO.getUpdateTime() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_UPDATE_TIME, pageQueryAlarmRecordDTO.getUpdateTime());
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getName())) {
+			queryWrapper.like(AlarmRecord.PROP_NAME, pageQueryAlarmRecordDTO.getName());
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getCategory())) {
+			queryWrapper.like(AlarmRecord.PROP_CATEGORY, pageQueryAlarmRecordDTO.getCategory());
+		}
+
+		if (pageQueryAlarmRecordDTO.getConcern() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_CONCERN, pageQueryAlarmRecordDTO.getConcern());
+		}
+
+		if (pageQueryAlarmRecordDTO.getState() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_STATE, pageQueryAlarmRecordDTO.getState());
+		}
+
+		if (pageQueryAlarmRecordDTO.getEffectStartTime() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_EFFECT_START_TIME, pageQueryAlarmRecordDTO.getEffectStartTime());
+		}
+
+		if (pageQueryAlarmRecordDTO.getEffectEndTime() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_EFFECT_END_TIME, pageQueryAlarmRecordDTO.getEffectEndTime());
+		}
+
+		if (pageQueryAlarmRecordDTO.getNature() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_NATURE, pageQueryAlarmRecordDTO.getNature());
+		}
+
+		if (pageQueryAlarmRecordDTO.getTreatMode() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_TREAT_MODE, pageQueryAlarmRecordDTO.getTreatMode());
+		}
+
+		if (pageQueryAlarmRecordDTO.getTreatState() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_TREAT_STATE, pageQueryAlarmRecordDTO.getTreatState());
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getGroupCode())) {
+			queryWrapper.like(AlarmRecord.PROP_GROUP_CODE, pageQueryAlarmRecordDTO.getGroupCode());
+		}
+
+		if (pageQueryAlarmRecordDTO.getCondition() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_CONDITION, pageQueryAlarmRecordDTO.getCondition());
+		}
+
+		if (pageQueryAlarmRecordDTO.getTriggerInfo() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_TRIGGER_INFO, pageQueryAlarmRecordDTO.getTriggerInfo());
+		}
+
+		if (pageQueryAlarmRecordDTO.getEndInfo() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_END_INFO, pageQueryAlarmRecordDTO.getEndInfo());
+		}
+
+		if (pageQueryAlarmRecordDTO.getTriggerTime() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_TRIGGER_TIME, pageQueryAlarmRecordDTO.getTriggerTime());
+		}
+
+		if (pageQueryAlarmRecordDTO.getEndTime() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_END_TIME, pageQueryAlarmRecordDTO.getEndTime());
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getOrderId())) {
+			queryWrapper.like(AlarmRecord.PROP_ORDER_ID, pageQueryAlarmRecordDTO.getOrderId());
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getOrderState())) {
+			queryWrapper.like(AlarmRecord.PROP_ORDER_STATE, pageQueryAlarmRecordDTO.getOrderState());
+		}
+
+		if (pageQueryAlarmRecordDTO.getSupplement() != null) {
+			queryWrapper.eq(AlarmRecord.PROP_SUPPLEMENT, pageQueryAlarmRecordDTO.getSupplement());
+		}
+
+		// todo 需判断使用like还是eq
+		if (StringUtils.isNotEmpty(pageQueryAlarmRecordDTO.getTargetId())) {
+			queryWrapper.like(AlarmRecord.PROP_TARGET_ID, pageQueryAlarmRecordDTO.getTargetId());
+		}
+
+		return getBaseMapper().selectPage(pageParam, queryWrapper);
+	}
+
+	@Override
+	public PagedResponse<AlarmRecord> query(JsonCriteria jsonCriteria) {
+		QueryWrapper<AlarmRecord> queryWrapper = criteriaUtils.handleAlarmConditions(jsonCriteria, AlarmRecord.class);
+		this.addAlarmQueryCondition(jsonCriteria.getCriteria(), queryWrapper);
+		PagedResponse<AlarmRecord> pagedResponse = new PagedResponse<>();
+		if (jsonCriteria.isOnlyCount()) {
+			Integer count = baseMapper.selectCount(queryWrapper);
+			pagedResponse.setCount(count.longValue());
+		} else {
+			Page<AlarmRecord> page = baseMapper.selectPage(new Page<>(jsonCriteria.getPage(), jsonCriteria.getSize()),
+					queryWrapper);
+			pagedResponse.setCount(page.getTotal());
+			pagedResponse.setData(page.getRecords());
+		}
+		return pagedResponse;
+	}
+
+	/**
+	 * 添加查询报警条件 CURRENT 当前报警 HISTORY 历史报警
+	 * 
+	 * @param jsonObject
+	 * @param alarmRecordWrappers
+	 */
+	private void addAlarmQueryCondition(JSONObject criteria, QueryWrapper<?> queryWrappers) {
+		String listType = criteria.getString("listType");
+		if (EnumAlarmListType.CURRENT.name().equals(listType)) {
+			queryWrappers.eq(AlarmRecord.PROP_STATE, EnumAlarmState.UN_HANDLE.getType());
+			queryWrappers.and(andWrapper -> andWrapper
+					.eq(AlarmRecord.PROP_TREAT_STATE, EnumAlarmTreatState.UN_HANDLE.getType()).or(orWrapper -> orWrapper
+							.eq(AlarmRecord.PROP_TREAT_STATE, EnumAlarmTreatState.HANDLING.getType())));
+		}
+		if (EnumAlarmListType.HISTORY.name().equals(listType)) {
+			queryWrappers.eq(AlarmRecord.PROP_STATE, EnumAlarmState.END.getType()).or(orWrapper -> orWrapper
+					.eq(AlarmRecord.PROP_STATE, EnumAlarmState.EXPIRE.getType())
+					.or(or2Wrapper -> or2Wrapper.eq(AlarmRecord.PROP_TREAT_STATE, EnumAlarmTreatState.DONE.getType())));
+
+		}
+	}
+
 }

+ 17 - 0
src/main/java/com/persagy/apm/dmpalarm/utils/DatePatternStyle.java

@@ -0,0 +1,17 @@
+package com.persagy.apm.dmpalarm.utils;
+/**
+ * 日期各式样式
+ * @author gaoyu
+ *
+ */
+public class DatePatternStyle {
+
+	public static final String PATTERN_YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
+	public static final String PATTERN_YYYYMMDDHHMMSS2 = "yyyy-MM-dd HH:mm:ss";
+	public static final String PATTERN_YYYYMMDD = "yyyyMMdd";
+	public static final String PATTERN_HHMMSS = "HHmmss";
+	public static final String PATTERN_HHMM = "HHmm";
+	public static final String PATTERN_MM = "MM";
+	public static final String PATTERN_YYYY = "yyyy";
+	public static final String PATTERN_YYYYMM = "yyyyMM";
+}

+ 32 - 0
src/main/java/com/persagy/apm/dmpalarm/utils/SpringUtils.java

@@ -0,0 +1,32 @@
+package com.persagy.apm.dmpalarm.utils;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-22
+ * @verison: 1.0
+ */
+public class SpringUtils implements BeanFactoryPostProcessor {
+
+	private static ConfigurableListableBeanFactory beanFactory;
+
+	@Override
+	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
+		SpringUtils.beanFactory = beanFactory;
+	}
+
+	public static <T> T getBean(Class<T> aClass) {
+		return beanFactory.getBean(aClass);
+	}
+
+	public static <T> T getBean(String beanName, Class<T> aClass) {
+		if (beanFactory.containsBean(beanName)) {
+			return beanFactory.getBean(beanName, aClass);
+		} else {
+			return null;
+		}
+	}
+}

+ 72 - 0
src/main/java/com/persagy/apm/dmpalarm/web/BaseResponse.java

@@ -0,0 +1,72 @@
+package com.persagy.apm.dmpalarm.web;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.persagy.apm.dmpalarm.model.DmpMessage;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author: yaoll
+ * @date: 2020-09-04
+ * @verison: 1.0
+ */
+public class BaseResponse<T> {
+
+	public static final String SUCCESS = "success";
+	public static final String FAIL = "fail";
+	public static final String EXCEPTION = "exception";
+
+	@Getter
+	@Setter
+	private String result;
+
+	@Getter
+	@Setter
+	private String message;
+
+	@Getter
+	@Setter
+	protected T data;
+
+	@JsonIgnore
+	@Getter
+	private List<DmpMessage> messageList;
+
+	public void setFail(String message) {
+		setResult(FAIL);
+		setMessage(message);
+	}
+
+	public BaseResponse() {
+		super();
+		this.result = SUCCESS;
+	}
+
+	public BaseResponse(String result, String message) {
+		super();
+		this.result = result;
+		this.message = message;
+	}
+
+	public boolean success() {
+		return SUCCESS.equals(this.result);
+	}
+
+	public void add(DmpMessage msg){
+		if (messageList == null) {
+			messageList = new LinkedList<>();
+		}
+		messageList.add(msg);
+	}
+
+	public void add(List<DmpMessage> msgs){
+		if (messageList == null) {
+			messageList = new LinkedList<>();
+		}
+		messageList.addAll(msgs);
+	}
+}

+ 28 - 0
src/main/java/com/persagy/apm/dmpalarm/web/ListResponse.java

@@ -0,0 +1,28 @@
+package com.persagy.apm.dmpalarm.web;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author: yaoll
+ * @date: 2020-09-04
+ * @verison: 1.0
+ */
+public class ListResponse<T> extends BaseResponse<List<T>> {
+
+	public void add(T t) {
+		if (data == null) {
+			data = new LinkedList<>();
+		}
+		data.add(t);
+	}
+
+	@Override
+	public List<T> getData() {
+		List<T> data = super.getData();
+		if (data == null) {
+			data = new LinkedList<>();
+		}
+		return data;
+	}
+}

+ 42 - 0
src/main/java/com/persagy/apm/dmpalarm/web/MapResponse.java

@@ -0,0 +1,42 @@
+package com.persagy.apm.dmpalarm.web;
+
+import org.apache.commons.collections4.MapUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author: yaoll
+ * @date: 2020-09-04
+ * @verison: 1.0
+ */
+public class MapResponse extends BaseResponse<Map<String, Object>> {
+
+	public MapResponse() {
+		super();
+		super.setResult(SUCCESS);
+	}
+
+	//	@JsonAnySetter
+	public void add(String name, Object value) {
+		if (data == null) {
+			data = new HashMap<String, Object>();
+		}
+		data.put(name, value);
+	}
+
+	//	@JsonAnyGetter
+	@Override
+	public Map<String, Object> getData() {
+		return data;
+	}
+
+	public String getString(String key) {
+		return MapUtils.getString(data, key);
+	}
+
+	public Integer getInteger(String key) {
+		return MapUtils.getInteger(data, key);
+	}
+
+}

+ 28 - 0
src/main/java/com/persagy/apm/dmpalarm/web/PagedResponse.java

@@ -0,0 +1,28 @@
+package com.persagy.apm.dmpalarm.web;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author: yaoll
+ * @date: 2020-09-04
+ * @verison: 1.0
+ */
+public class PagedResponse<T> extends ListResponse<T> {
+
+	@Getter
+	@Setter
+	private Long count;
+
+	@SuppressWarnings("unchecked")
+	public List<T> getData() {
+		if (data == null) {
+			return Collections.EMPTY_LIST;
+		} else {
+			return data;
+		}
+	}
+}

+ 7 - 6
src/main/resources/bootstrap.yml

@@ -1,10 +1,12 @@
 server:
   port:
     9979
-
 spring:
   application:
     name: energy-dmp-alarm
+  profiles:
    active: dev
  cloud:
+    config:
        profile: prod
+        uri: http://192.168.100.102:32435
   jackson:
     serialization:
       # 统一将时间都转为时间戳
@@ -12,6 +14,7 @@ spring:
     # 设置时间戳的时区
     time-zone: Asia/Shanghai
   datasource:
+    url: jdbc:mysql://${mysql.ip}:${mysql.port}/${mysql.database}?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
     dynamic:
       primary: master
       strict: false
@@ -21,12 +24,10 @@ spring:
           data: classpath*:db/init/data.sql
           continue-on-error: true
           # MYSQL_SCHEMA建议使用默认值。如果有特殊需求,建议在环境变量中配置该值
-          url: jdbc:mysql://${mysql.ip}:${mysql.port}/${MYSQL_SCHEMA:dmp_alarm}?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
+          url: jdbc:mysql://${mysql.ip}:${mysql.port}/${mysql.database}?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
           username: ${MYSQL_USERNAME:${spring.datasource.username}}
           password: ${MYSQL_PASSWORD:${spring.datasource.password}}
           driver-class-name: com.mysql.cj.jdbc.Driver
-
-
 feign:
   compression:
     response:
@@ -55,8 +56,8 @@ integrated:
 # 不打印sql
 mybatis-plus:
   configuration:
-    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
-#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+   # log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
+     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 
 eureka:
   client:

+ 5 - 5
src/main/resources/mapper/AlarmRecordMapper.xml

@@ -24,14 +24,14 @@
 		<result column="treat_mode" property="treatMode" />
 		<result column="treat_state" property="treatState" />
 		<result column="group_code" property="groupCode" />
-		<result column="condition" property="condition" />
-		<result column="trigger_info" property="triggerInfo" />
-		<result column="end_info" property="endInfo" />
+		<result column="condition" property="condition" typeHandler="com.persagy.apm.dmpalarm.config.MybatisJsonHandler" />
+		<result column="trigger_info" property="triggerInfo" typeHandler="com.persagy.apm.dmpalarm.config.MybatisJsonHandler" />
+		<result column="end_info" property="endInfo"  typeHandler="com.persagy.apm.dmpalarm.config.MybatisJsonHandler" />
 		<result column="trigger_time" property="triggerTime" />
-		<result column="end_time" property="endTime" />
+		<result column="end_time" property="endTime"/>
 		<result column="order_id" property="orderId" />
 		<result column="order_state" property="orderState" />
-		<result column="supplement" property="supplement" />
+		<result column="supplement" property="supplement" typeHandler="com.persagy.apm.dmpalarm.config.MybatisJsonHandler" />
 		<result column="target_id" property="targetId" />
 	</resultMap>
 </mapper>