Browse Source

合并代码

gaoyu 3 years ago
parent
commit
90c8d0f65a

+ 13 - 0
src/main/java/com/persagy/apm/dmpalarm/enumeration/EnumAlarmRecordWithColumns.java

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

+ 41 - 0
src/main/java/com/persagy/apm/dmpalarm/jms/ConsumeMessageThreadPool.java

@@ -0,0 +1,41 @@
+package com.persagy.apm.dmpalarm.jms;
+
+import cn.hutool.core.thread.ExecutorBuilder;
+import com.persagy.apm.dmpalarm.model.DmpMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * 消费消息线程池
+ *
+ * @author lixing
+ * @version V1.0 2021/5/12 2:53 下午
+ **/
+@Component
+@Slf4j
+public class ConsumeMessageThreadPool {
+    private final ExecutorService es;
+
+    @Autowired
+    private MessageProcesser messageProcesser;
+
+    public ConsumeMessageThreadPool() {
+        es = ExecutorBuilder.create()
+                .setCorePoolSize(5)
+                .setMaxPoolSize(10)
+                .setWorkQueue(new LinkedBlockingQueue<>(10))
+                .setHandler(new ThreadPoolExecutor.CallerRunsPolicy())
+                .build();
+    }
+
+    public void consumeMessage(DmpMessage message) throws Exception {
+        es.execute(() -> {
+            messageProcesser.listen(message);
+        });
+    }
+}

+ 127 - 0
src/main/java/com/persagy/apm/dmpalarm/jms/JmsConfig.java

@@ -0,0 +1,127 @@
+package com.persagy.apm.dmpalarm.jms;
+
+import com.persagy.apm.dmpalarm.json.JacksonMapper;
+import com.persagy.apm.dmpalarm.model.DmpMessage;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.*;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-22
+ * @verison: 1.0
+ */
+@Slf4j
+@Deprecated
+//@Configuration
+public class JmsConfig {
+    @Autowired
+    ConsumeMessageThreadPool consumeMessageThreadPool;
+
+    @Value("${persagy.dmp.exchange}")
+    private String exchange;
+
+    @Value("${persagy.dmp.alarm.routingKey}")
+    private String dmpAlarmRoutingKey;
+
+    /**
+     * 报警定义路由键
+     */
+    @Value("${persagy.dmp.alarm.config.routingKey}")
+    private String dmpAlarmConfigRoutingKey;
+
+    @Value("${alarm.obj.routingKey}")
+    private String alarmObjRoutingKey;
+
+    @Value("${persagy.dmp.rwd.routingKey}")
+    private String rwdRoutingKey;
+
+    @Value("${persagy.dmp.alarm.queue}")
+    private String alarmQueue;
+
+//    @Value("${persagy.dmp.alarm.rwd.queue}")
+//    private String alarmRwdQueue;
+//
+//    @Bean
+//    public Queue alarmRwdQueue() {
+//        return new Queue(alarmRwdQueue, true);
+//    }
+//
+//    @Bean
+//    public Binding alarmRwdBinding() {
+//        return BindingBuilder.bind(alarmRwdQueue()).to(exchange()).with(rwdRoutingKey);
+//    }
+
+    /**
+     * 报警对象队列
+     */
+    private final String alarmObjQueue = "alarm-obj-queue";
+
+    @Autowired
+    private MessageProcesser messageProcesser;
+
+//    @Bean
+    public TopicExchange exchange() {
+        return new TopicExchange(exchange);
+    }
+
+  //  @Bean
+    public Queue alarmQueue() {
+        return new Queue(alarmQueue, true);
+    }
+
+    @Bean
+    public Binding alarmBinding() {
+        return BindingBuilder.bind(alarmQueue()).to(exchange()).with(dmpAlarmRoutingKey);
+    }
+
+  //  @Bean
+    public Queue alarmObjQueue() {
+        return new Queue(alarmObjQueue, true);
+    }
+
+    @Bean
+    public Binding alarmObjBinding() {
+        return BindingBuilder.bind(alarmObjQueue()).to(exchange()).with(alarmObjRoutingKey);
+    }
+
+    @RabbitListener(queues = {alarmObjQueue})    //监听器监听指定的Queue
+    public void process(String message, Channel channel, Message msg) throws Exception{
+        // 手动确认消息已消费
+        try {
+            log.info("============================== Receive:" + message);
+            DmpMessage dmpMessage = JacksonMapper.toObject(message, DmpMessage.class);
+            if (dmpMessage != null) {
+                messageProcesser.listen(dmpMessage);
+            }
+
+            channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
+        } catch (Exception e) {
+            Boolean isRedeliveredFail = msg.getMessageProperties().getRedelivered();
+            // true表示消息已经重复处理失败
+            if (isRedeliveredFail) {
+                // 拒绝消息,requeue=false 表示不再重新入队,如果配置了死信队列则进入死信队列
+                log.error("重复消费消息失败,message: {}", message);
+                channel.basicReject(msg.getMessageProperties().getDeliveryTag(), false);
+            } else {
+                // 如果是第一次失败则再次放入队列
+                // requeue为是否重新回到队列,true重新入队
+                channel.basicNack(msg.getMessageProperties().getDeliveryTag(), false, true);
+            }
+        }
+    }
+
+//    @RabbitListener(queues ="${persagy.dmp.alarm.rwd.queue}")    //监听器监听指定的Queue
+//    public void processRwdMsg(DmpMessage message, Channel channel, Message msg) {
+//        consumeMessageThreadPool.consumeMessage(message, channel, msg);
+//    }
+
+//    @RabbitListener(queues = "${persagy.dmp.alarm.queue}")    //监听器监听指定的Queue
+//    public void processAlarmMsg(DmpMessage message, Channel channel, Message msg) {
+//        consumeMessageThreadPool.consumeMessage(message, channel, msg);
+//    }
+}

+ 87 - 0
src/main/java/com/persagy/apm/dmpalarm/jms/RabbitmqConfig.java

@@ -0,0 +1,87 @@
+package com.persagy.apm.dmpalarm.jms;
+
+import com.persagy.apm.dmpalarm.model.DmpMessage;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.*;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * rabbitmq配置
+ *
+ * @author lixing
+ * @version V1.0 2021/10/11 7:32 下午
+ */
+@Slf4j
+@Configuration
+public class RabbitmqConfig {
+    @Autowired
+    ConsumeMessageThreadPool consumeMessageThreadPool;
+
+    /**
+     * 报警交换机
+     */
+    private final String exchange = "exchange-dmp";
+
+    /**
+     * 报警定义路由键
+     */
+    private final String dmpAlarmConfigRoutingKey = "alarm-config-routing-key";
+
+    /**
+     * 报警对象队列
+     */
+    private final String alarmConfigQueue = "alarm-config-queue1";
+
+    @Bean
+    public TopicExchange exchange() {
+        return new TopicExchange(exchange);
+    }
+
+    @Bean
+    public Queue alarmConfigQueue() {
+        return new Queue(alarmConfigQueue, true);
+    }
+
+    @Bean
+    public Binding alarmObjBinding() {
+        return BindingBuilder.bind(alarmConfigQueue()).to(exchange()).with(dmpAlarmConfigRoutingKey);
+    }
+
+    /**
+     * 监听消息
+     *
+     * @param message DmpMessage(中台报警消息对象)
+     * @param channel channel对象,用于反馈消息消费结果
+     * @param msg rabbitmq消息对象
+     * @author lixing
+     * @version V1.0 2021/10/11 7:40 下午
+     */
+    @RabbitListener(queues = {alarmConfigQueue})
+    public void process(DmpMessage message, Channel channel, Message msg) throws Exception{
+        // 手动确认消息已消费
+        try {
+            log.info("============================== Receive:" + message);
+            if (message != null) {
+                consumeMessageThreadPool.consumeMessage(message);
+            }
+
+            channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
+        } catch (Exception e) {
+            Boolean isRedeliveredFail = msg.getMessageProperties().getRedelivered();
+            // true表示消息已经重复处理失败
+            if (isRedeliveredFail) {
+                // 拒绝消息,requeue=false 表示不再重新入队,如果配置了死信队列则进入死信队列
+                log.error("重复消费消息失败,message: {}", message);
+                channel.basicReject(msg.getMessageProperties().getDeliveryTag(), false);
+            } else {
+                // 如果是第一次失败则再次放入队列
+                // requeue为是否重新回到队列,true重新入队
+                channel.basicNack(msg.getMessageProperties().getDeliveryTag(), false, true);
+            }
+        }
+    }
+}

+ 66 - 0
src/main/java/com/persagy/apm/dmpalarm/jms/executor/AlarmConfigBatchCreateExecutor.java

@@ -0,0 +1,66 @@
+package com.persagy.apm.dmpalarm.jms.executor;
+
+import com.alibaba.fastjson.JSON;
+import com.persagy.apm.dmpalarm.config.DmpParameterStorage;
+import com.persagy.apm.dmpalarm.jms.MessageExecutor;
+import com.persagy.apm.dmpalarm.json.JacksonMapper;
+import com.persagy.apm.dmpalarm.model.AlarmConfig;
+import com.persagy.apm.dmpalarm.model.DmpMessage;
+import com.persagy.apm.dmpalarm.service.IAlarmConfigService;
+import com.persagy.apm.dmpalarm.utils.CheckRequiredParam;
+import com.persagy.apm.dmpalarm.web.BaseResponse;
+import com.persagy.apm.dmpalarm.web.MapResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 批量创建报警定义
+ *
+ * @author lixing
+ * @version V1.0 2021/10/11 8:00 下午
+ */
+@Slf4j
+@Component
+public class AlarmConfigBatchCreateExecutor implements MessageExecutor {
+    @Autowired
+    private IAlarmConfigService alarmConfigService;
+
+    @Override
+    public void execute(DmpMessage message) throws Exception {
+        /* 验证消息是否符合要求 */
+        CheckRequiredParam.check(message, "exts");
+
+        Map<String, Object> exts = message.getExts();
+        String key = "alarmConfigs";
+        Object obj = exts.get(key);
+        List<AlarmConfig> configModels = new ArrayList<>();
+        if (obj instanceof ArrayList<?>) {
+            for (Object o : (List<?>) obj) {
+                AlarmConfig alarmConfigModel = JacksonMapper.toObject(
+                        JSON.toJSONString(o), AlarmConfig.class);
+                configModels.add(alarmConfigModel);
+            }
+        }
+        if (CollectionUtils.isEmpty(configModels)) {
+            return;
+        }
+        /* 设置通用请求参数 */
+        DmpParameterStorage.ParameterData data = new DmpParameterStorage.ParameterData();
+        data.setAppId(message.getAppId());
+        data.setGroupCode(message.getGroupCode());
+        data.setProjectId(message.getProjectId());
+        data.setUserId(message.getUserId());
+        DmpParameterStorage.set(data);
+
+        MapResponse response = alarmConfigService.batchCreate(configModels);
+        if (BaseResponse.FAIL.equals(response.getResult())) {
+            log.error("消费AlarmConfigBatchCreate消息异常,{}", response.getMessage());
+        }
+    }
+}

+ 37 - 0
src/main/java/com/persagy/apm/dmpalarm/jms/executor/AlarmItemCreateExecutor.java

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

+ 41 - 0
src/main/java/com/persagy/apm/dmpalarm/jms/executor/AlarmItemUpdateExecutor.java

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

+ 36 - 0
src/main/java/com/persagy/apm/dmpalarm/jms/executor/AlarmTargetCreateExecutor.java

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

+ 37 - 0
src/main/java/com/persagy/apm/dmpalarm/jms/executor/AlarmTargetDeleteExecutor.java

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

+ 37 - 0
src/main/java/com/persagy/apm/dmpalarm/jms/executor/AlarmTargetUpdateExecutor.java

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

+ 39 - 0
src/main/java/com/persagy/apm/dmpalarm/jms/executor/InstanceObjectDeleteExecutor.java

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

+ 8 - 0
src/main/java/com/persagy/apm/dmpalarm/service/IAlarmConfigService.java

@@ -31,4 +31,12 @@ public interface IAlarmConfigService {
     public  MapResponse delete(AlarmConfig alarmConfig);
 
     public  MapResponse init(AlarmConfig alarmConfig);
+
+    MapResponse batchDeleteWhenTargetDelete(String targetId, String projectId, String groupCode);
+
+    MapResponse batchUpdateWhenTargetUpdate(String targetId, String projectId, String groupCode, String appId);
+
+    MapResponse batchUpdateWhenItemUpdate(String itemCode, String projectId, String groupCode);
+
+    MapResponse deleteOnRemoveObj(String targetId, String projectId);
 }

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

@@ -170,6 +170,7 @@ public class AlarmConfigServiceImpl extends BaseServiceImpl<AlarmConfig> impleme
      * @version: V1.0
      */
     @Transactional
+    @Override
     public MapResponse batchUpdateWhenItemUpdate(String itemCode, String projectId, String groupCode) {
         MapResponse response = new MapResponse();
         // 查询报警条目
@@ -233,6 +234,7 @@ public class AlarmConfigServiceImpl extends BaseServiceImpl<AlarmConfig> impleme
      * @version: V1.0
      */
     @Transactional
+    @Override
     public MapResponse batchUpdateWhenTargetUpdate(String targetId, String projectId, String groupCode, String appId) {
         MapResponse response = new MapResponse();
         AlarmTarget alarmTarget = alarmTargetService.get(targetId);
@@ -539,6 +541,7 @@ public class AlarmConfigServiceImpl extends BaseServiceImpl<AlarmConfig> impleme
      * @version: V1.0
      */
     @Transactional
+    @Override
     public MapResponse deleteOnRemoveObj(String objId, String projectId) {
         /* 查询设备相关的报警定义 */
         JsonCriteria criteria = new JsonCriteria();
@@ -748,6 +751,7 @@ public class AlarmConfigServiceImpl extends BaseServiceImpl<AlarmConfig> impleme
      * @version: V1.0
      */
     @Transactional
+    @Override
     public MapResponse batchDeleteWhenTargetDelete(String targetId, String projectId, String groupCode) {
         MapResponse mapResponse = new MapResponse();
         JsonCriteria criteria = new JsonCriteria();

+ 269 - 213
src/main/java/com/persagy/apm/dmpalarm/service/impl/AlarmRecordServiceImpl.java

@@ -35,236 +35,292 @@ import java.util.*;
 @Slf4j
 public class AlarmRecordServiceImpl extends BaseServiceImpl<AlarmRecord> implements IAlarmRecordService {
 
-	@Resource
-	private IAlarmLogService alarmLogService;
+    @Resource
+    private IAlarmLogService alarmLogService;
 
 
-	@Override
-	public PagedResponse<AlarmRecord> query(JsonCriteria jsonCriteria) {
-		try {
-			QueryWrapper<AlarmRecord> queryWrapper = criteriaUtils.handleAlarmConditions(jsonCriteria, AlarmRecord.class);
-			this.addAlarmQueryCondition(jsonCriteria.getCriteria(), queryWrapper);
-			return criteriaUtils.getPagedResponse(jsonCriteria, AlarmRecord.class, queryWrapper, baseMapper);
-		} catch (Exception e) {
-			log.error("alarmRecord query page error JsonCriteria is {}",jsonCriteria.toString(),e);
-		}
-		return new PagedResponse<>();
-	}
+    @Override
+    public PagedResponse<AlarmRecord> query(JsonCriteria jsonCriteria) {
+        try {
+            QueryWrapper<AlarmRecord> queryWrapper = criteriaUtils.handleAlarmConditions(jsonCriteria, AlarmRecord.class);
+            this.addAlarmQueryCondition(jsonCriteria.getCriteria(), queryWrapper);
+            PagedResponse<AlarmRecord> resp = criteriaUtils.getPagedResponse(jsonCriteria, AlarmRecord.class, queryWrapper, baseMapper);
 
-	/**
-	 * 添加查询报警条件 CURRENT 当前报警 HISTORY 历史报警
-	 * 
-	 * @param <T> entity object
-	 * @param criteria JSONObject
-	 * @param queryWrappers query alarm criteria
-	 */
-	private <T> void addAlarmQueryCondition(JSONObject criteria, QueryWrapper<T> queryWrappers) {
-		String listType = criteria.getString("listType");
-		if (EnumAlarmListType.CURRENT.name().equals(listType)) {
-			queryWrappers.and(andWrapper -> andWrapper.eq(AlarmRecord.PROP_STATE, EnumAlarmState.UN_HANDLE.getType())
-					.or(orw -> orw.eq(AlarmRecord.PROP_TREAT_STATE, EnumAlarmState.UN_HANDLE.getType())
-							.eq(AlarmRecord.PROP_TREAT_STATE, EnumAlarmTreatState.HANDLING.getType())));
-		}
+            PagedResponse<AlarmRecord> resultAlarmRecordList = new PagedResponse<>();
+            resultAlarmRecordList.setCount(resp.getCount());
+            List<AlarmRecord> dataList = resp.getData();
+            if (CollectionUtils.isEmpty(dataList)) {
+                return resultAlarmRecordList;
+            }
 
-		if (EnumAlarmListType.HISTORY.name().equals(listType)) {
-			queryWrappers.and(andWrapper -> andWrapper.eq(AlarmRecord.PROP_STATE, EnumAlarmState.END.getType())
-					.or(orw -> orw.eq(AlarmRecord.PROP_STATE, EnumAlarmState.EXPIRE.getType())
-							.eq(AlarmRecord.PROP_TREAT_STATE, EnumAlarmTreatState.DONE.getType())));
+            // 如果需要查询日志相关的信息,需使用withColumns参数
+            Set<String> withColumns = jsonCriteria.getWithColumns();
+            boolean withLogInfo = !CollectionUtils.isEmpty(withColumns);
 
-		}
-	}
+            Map<String, List<AlarmLog>> alarmLogListMap = new HashMap<>();
+            // 获取报警日志
+            if (withLogInfo && (withColumns.contains(EnumAlarmRecordWithColumns.ignoreTime.name())
+                    || withColumns.contains(EnumAlarmRecordWithColumns.treatEndTime.name()))) {
+                List<String> recordIdList = new ArrayList<>();
+                dataList.forEach(alarmRecord -> recordIdList.add(alarmRecord.getId()));
+                alarmLogListMap = alarmLogService.getAlarmLogMap(recordIdList);
+            }
 
-	@Override
-	@Transactional
-	public MapResponse create(AlarmRecord entity) {
+            List<AlarmRecord> alarmRecordModels = new ArrayList<>(dataList.size());
+            for (AlarmRecord entity : dataList) {
+                alarmRecordModels.add(entity);
 
-		MapResponse response = new MapResponse();
-		AlarmParam alarmParam = prepareParam(response);
-		if (alarmParam == null) {
-			return response;
-		}
-		// 必填项校验
-		String checkResult = CheckRequiredParam.check(entity, "itemCode", "objId", "level");
-		if (!StringUtils.isEmpty(checkResult)) {
-			response.setFail(checkResult);
-			return response;
-		}
+                if (!withLogInfo) {
+                    continue;
+                }
+                // 如果需要日志信息
+                List<AlarmLog> alarmLogList = new ArrayList<>();
+                if (alarmLogListMap.containsKey(entity.getId())) {
+                    alarmLogList = alarmLogListMap.get(entity.getId());
+                }
+                if (withColumns.contains(EnumAlarmRecordWithColumns.ignoreTime.name())) {
+                    Date ignoreAlarmTime = getCreateTime(alarmLogList, EnumAlarmLogType.TREATMODE, 1);
+                    entity.setIgnoreTime(ignoreAlarmTime);
+                }
+                if (withColumns.contains(EnumAlarmRecordWithColumns.treatEndTime.name())) {
+                    Date treatEndTime = getCreateTime(alarmLogList, EnumAlarmLogType.TREATSTATE, 3);
+                    entity.setTreatEndTime(treatEndTime);
+                }
+            }
+            resultAlarmRecordList.setData(alarmRecordModels);
+            return resultAlarmRecordList;
+        } catch (Exception e) {
+            log.error("alarmRecord query page error JsonCriteria is {}", jsonCriteria.toString(), e);
+        }
+        return new PagedResponse<>();
+    }
 
-		String id = UUID.randomUUID().toString();
-		// 如果创建时,入参包含id,则使用入参中的id。但需要先校验id是否已存在
-		if (!StringUtils.isEmpty(entity.getId())) {
+    public Date getCreateTime(List<AlarmLog> alarmLogList, EnumAlarmLogType type, int after) {
+        Date createTime = null;
+        if (!CollectionUtils.isEmpty(alarmLogList)) {
+            for (AlarmLog alarmLog : alarmLogList) {
+                if (type.equals(alarmLog.getType()) && alarmLog.getAfter() == after) {
+                    createTime = alarmLog.getCreateTime();
+                }
+            }
+        }
+        return createTime;
+    }
 
-			AlarmRecord alarmRecord = getById(entity.getId());
-			if (null != alarmRecord) {
-				response.setFail("已存在相同id的报警记录!创建失败!");
-				return response;
-			} else {
-				id = entity.getId();
-			}
-		}
-		entity.setId(id);
-		entity.setCreateUser(alarmParam.userId);
-		if (entity.getCreateTime() != null) {
-			entity.setCreateTime(entity.getCreateTime());
-		} else {
-			entity.setCreateTime(new Date());
-		}
-		// 默认处理状态为未处理
-		if (entity.getTreatState() == null) {
-			entity.setTreatState(1);
-		}
-		entity.setValid(1);
-		entity.setProjectId(alarmParam.projectId);
-		entity.setGroupCode(alarmParam.groupCode);
-		save(entity);
-		response.add("id", entity.getId());
-		// 推送消息至mq
-		DmpMessage msg = new DmpMessage();
-		msg.setMid(UUID.randomUUID().toString());
-		msg.setType(EnumAlarmMessageType.ALARM_RECORD_CREATE.getValue());
-		return getMapResponse(entity, response, msg);
-	}
+    /**
+     * 添加查询报警条件 CURRENT 当前报警 HISTORY 历史报警
+     *
+     * @param <T>           entity object
+     * @param criteria      JSONObject
+     * @param queryWrappers query alarm criteria
+     */
+    private <T> void addAlarmQueryCondition(JSONObject criteria, QueryWrapper<T> queryWrappers) {
+        String listType = criteria.getString("listType");
+        if (EnumAlarmListType.CURRENT.name().equals(listType)) {
+            queryWrappers.and(andWrapper -> andWrapper.eq(AlarmRecord.PROP_STATE, EnumAlarmState.UN_HANDLE.getType())
+                    .or(orw -> orw.eq(AlarmRecord.PROP_TREAT_STATE, EnumAlarmState.UN_HANDLE.getType())
+                            .eq(AlarmRecord.PROP_TREAT_STATE, EnumAlarmTreatState.HANDLING.getType())));
+        }
 
-	private MapResponse getMapResponse(AlarmRecord entity, MapResponse response, DmpMessage msg) {
-		msg.setGroupCode(DmpParameterStorage.getGroupCode());
-		msg.setProjectId(DmpParameterStorage.getProjectId());
-		msg.setTargetId(entity.getId());
-		msg.add("obj", JacksonMapper.toSimpleJson(entity));
-		msg.setAppId(DmpParameterStorage.getAppId());
-		msg.setSendTime(DateUtil.format(new Date(), DatePatternStyle.PATTERN_YYYYMMDDHHMMSS));
-		response.add(msg);
-		return response;
-	}
+        if (EnumAlarmListType.HISTORY.name().equals(listType)) {
+            queryWrappers.and(andWrapper -> andWrapper.eq(AlarmRecord.PROP_STATE, EnumAlarmState.END.getType())
+                    .or(orw -> orw.eq(AlarmRecord.PROP_STATE, EnumAlarmState.EXPIRE.getType())
+                            .eq(AlarmRecord.PROP_TREAT_STATE, EnumAlarmTreatState.DONE.getType())));
 
-	private AlarmLog initAlarmLogModel(AlarmRecord param) {
-		AlarmLog alarmLog = new AlarmLog();
-		alarmLog.setRecordId(param.getId());
-		alarmLog.setCreateTime(new Date());
-		alarmLog.setCreateUser(DmpParameterStorage.getUserId());
-		alarmLog.setProjectId(DmpParameterStorage.getProjectId());
-		alarmLog.setGroupCode(DmpParameterStorage.getGroupCode());
-		return alarmLog;
-	}
+        }
+    }
 
-	@Override
-	@Transactional
-	public MapResponse update(AlarmRecord param) {
-		MapResponse response = new MapResponse();
-		AlarmRecord alarmRecord = getById(param.getId());
-		if (alarmRecord == null) {
-			response.setFail("无法获取到要更新的数据!");
-			return response;
-		}
-		AlarmParam alarmParam = prepareParam(response);
-		if (alarmParam == null) {
-			return response;
-		}
-		if (param.getName() != null && !param.getName().isEmpty()) {
-			alarmRecord.setName(param.getName());
-		}
-		if (param.getRemark() != null && !param.getRemark().isEmpty()) {
-			alarmRecord.setRemark(param.getRemark());
-		}
-		// 状态修改记录日志
-		if (param.getState() != null) {
-			if (!param.getState().equals(alarmRecord.getState())) {
-				AlarmLog alarmLog = initAlarmLogModel(param);
-				alarmLog.setType(EnumAlarmLogType.ALARMSTATE);
-				alarmLog.setNature(alarmRecord.getNature());
-				alarmLog.setBefore(alarmRecord.getState());
-				alarmLog.setAfter(param.getState());
-				alarmLogService.create(alarmLog);
-			}
-			alarmRecord.setState(param.getState());
-		}
-		if (param.getNature() != null) {
-			alarmRecord.setNature(param.getNature());
-		}
-		// 处理方式修改记录日志
-		if (param.getTreatMode() != null) {
-			if (!param.getTreatMode().equals(alarmRecord.getTreatMode())) {
-				AlarmLog alarmLogModel = initAlarmLogModel(param);
-				alarmLogModel.setType(EnumAlarmLogType.TREATMODE);
-				alarmLogModel.setNature(alarmRecord.getNature());
-				alarmLogModel.setBefore(alarmRecord.getTreatMode());
-				alarmLogModel.setAfter(param.getTreatMode());
-				alarmLogService.create(alarmLogModel);
-			}
-			alarmRecord.setTreatMode(param.getTreatMode());
-		}
-		// 处理状态更改记录日志
-		if (param.getTreatState() != null) {
-			if (!param.getTreatState().equals(alarmRecord.getTreatState())) {
-				AlarmLog alarmLogModel = initAlarmLogModel(param);
-				alarmLogModel.setType(EnumAlarmLogType.TREATSTATE);
-				alarmLogModel.setNature(alarmRecord.getNature());
-				alarmLogModel.setBefore(alarmRecord.getTreatState());
-				alarmLogModel.setAfter(param.getTreatState());
-				alarmLogService.create(alarmLogModel);
-			}
-			alarmRecord.setTreatState(param.getTreatState());
-		}
+    @Override
+    @Transactional
+    public MapResponse create(AlarmRecord entity) {
 
-		// 恢复值
-		if (param.getEndInfo() != null) {
-			alarmRecord.setEndInfo(param.getEndInfo());
-		}
-		// 恢复时间
-		if (param.getEndTime() != null) {
-			alarmRecord.setEndTime(param.getEndTime());
-		}
-		// 工单id
-		if (param.getOrderId() != null) {
-			alarmRecord.setOrderId(param.getOrderId());
-		}
-		// 工单状态
-		if (param.getOrderState() != null) {
-			alarmRecord.setOrderState(param.getOrderState());
-		}
-		// 补充说明
-		if (param.getSupplement() != null) {
-			alarmRecord.setSupplement(param.getSupplement());
-		}
-		// 报警等级
-		if (!StringUtils.isEmpty(param.getLevel())) {
-			alarmRecord.setLevel(param.getLevel());
-		}
-		alarmRecord.setUpdateUser(alarmParam.userId);
-		alarmRecord.setUpdateTime(new Date());
-		save(alarmRecord);
+        MapResponse response = new MapResponse();
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        // 必填项校验
+        String checkResult = CheckRequiredParam.check(entity, "itemCode", "objId", "level");
+        if (!StringUtils.isEmpty(checkResult)) {
+            response.setFail(checkResult);
+            return response;
+        }
 
-		response.add("id", alarmRecord.getId());
-		// 推送消息至mq
-		DmpMessage msg = new DmpMessage();
-		msg.setMid(UUID.randomUUID().toString());
-		msg.setType(EnumAlarmMessageType.ALARM_RECORD_UPDATE.getValue());
-		return getMapResponse(alarmRecord, response, msg);
+        String id = UUID.randomUUID().toString();
+        // 如果创建时,入参包含id,则使用入参中的id。但需要先校验id是否已存在
+        if (!StringUtils.isEmpty(entity.getId())) {
 
-	}
+            AlarmRecord alarmRecord = getById(entity.getId());
+            if (null != alarmRecord) {
+                response.setFail("已存在相同id的报警记录!创建失败!");
+                return response;
+            } else {
+                id = entity.getId();
+            }
+        }
+        entity.setId(id);
+        entity.setCreateUser(alarmParam.userId);
+        if (entity.getCreateTime() != null) {
+            entity.setCreateTime(entity.getCreateTime());
+        } else {
+            entity.setCreateTime(new Date());
+        }
+        // 默认处理状态为未处理
+        if (entity.getTreatState() == null) {
+            entity.setTreatState(1);
+        }
+        entity.setValid(1);
+        entity.setProjectId(alarmParam.projectId);
+        entity.setGroupCode(alarmParam.groupCode);
+        save(entity);
+        response.add("id", entity.getId());
+        // 推送消息至mq
+        DmpMessage msg = new DmpMessage();
+        msg.setMid(UUID.randomUUID().toString());
+        msg.setType(EnumAlarmMessageType.ALARM_RECORD_CREATE.getValue());
+        return getMapResponse(entity, response, msg);
+    }
 
-	@Override
-	@Transactional
-	public MapResponse batchUpdate(AlarmRecord param) {
-		MapResponse response = new MapResponse();
+    private MapResponse getMapResponse(AlarmRecord entity, MapResponse response, DmpMessage msg) {
+        msg.setGroupCode(DmpParameterStorage.getGroupCode());
+        msg.setProjectId(DmpParameterStorage.getProjectId());
+        msg.setTargetId(entity.getId());
+        msg.add("obj", JacksonMapper.toSimpleJson(entity));
+        msg.setAppId(DmpParameterStorage.getAppId());
+        msg.setSendTime(DateUtil.format(new Date(), DatePatternStyle.PATTERN_YYYYMMDDHHMMSS));
+        response.add(msg);
+        return response;
+    }
 
-		List<AlarmRecord> alarmRecordModelList = param.getAlarmRecordModels();
-		if (CollectionUtils.isEmpty(alarmRecordModelList)) {
-			response.setFail("批量更新报警记录,没有传入需要更新的对象");
-			return response;
-		}
+    private AlarmLog initAlarmLogModel(AlarmRecord param) {
+        AlarmLog alarmLog = new AlarmLog();
+        alarmLog.setRecordId(param.getId());
+        alarmLog.setCreateTime(new Date());
+        alarmLog.setCreateUser(DmpParameterStorage.getUserId());
+        alarmLog.setProjectId(DmpParameterStorage.getProjectId());
+        alarmLog.setGroupCode(DmpParameterStorage.getGroupCode());
+        return alarmLog;
+    }
 
-		// 一次最多更新200条数据
-		if (alarmRecordModelList.size() > 200) {
-			response.setFail("一次最多更新200条数据");
-			return response;
-		}
+    @Override
+    @Transactional
+    public MapResponse update(AlarmRecord param) {
+        MapResponse response = new MapResponse();
+        AlarmRecord alarmRecord = getById(param.getId());
+        if (alarmRecord == null) {
+            response.setFail("无法获取到要更新的数据!");
+            return response;
+        }
+        AlarmParam alarmParam = prepareParam(response);
+        if (alarmParam == null) {
+            return response;
+        }
+        if (param.getName() != null && !param.getName().isEmpty()) {
+            alarmRecord.setName(param.getName());
+        }
+        if (param.getRemark() != null && !param.getRemark().isEmpty()) {
+            alarmRecord.setRemark(param.getRemark());
+        }
+        // 状态修改记录日志
+        if (param.getState() != null) {
+            if (!param.getState().equals(alarmRecord.getState())) {
+                AlarmLog alarmLog = initAlarmLogModel(param);
+                alarmLog.setType(EnumAlarmLogType.ALARMSTATE);
+                alarmLog.setNature(alarmRecord.getNature());
+                alarmLog.setBefore(alarmRecord.getState());
+                alarmLog.setAfter(param.getState());
+                alarmLogService.create(alarmLog);
+            }
+            alarmRecord.setState(param.getState());
+        }
+        if (param.getNature() != null) {
+            alarmRecord.setNature(param.getNature());
+        }
+        // 处理方式修改记录日志
+        if (param.getTreatMode() != null) {
+            if (!param.getTreatMode().equals(alarmRecord.getTreatMode())) {
+                AlarmLog alarmLogModel = initAlarmLogModel(param);
+                alarmLogModel.setType(EnumAlarmLogType.TREATMODE);
+                alarmLogModel.setNature(alarmRecord.getNature());
+                alarmLogModel.setBefore(alarmRecord.getTreatMode());
+                alarmLogModel.setAfter(param.getTreatMode());
+                alarmLogService.create(alarmLogModel);
+            }
+            alarmRecord.setTreatMode(param.getTreatMode());
+        }
+        // 处理状态更改记录日志
+        if (param.getTreatState() != null) {
+            if (!param.getTreatState().equals(alarmRecord.getTreatState())) {
+                AlarmLog alarmLogModel = initAlarmLogModel(param);
+                alarmLogModel.setType(EnumAlarmLogType.TREATSTATE);
+                alarmLogModel.setNature(alarmRecord.getNature());
+                alarmLogModel.setBefore(alarmRecord.getTreatState());
+                alarmLogModel.setAfter(param.getTreatState());
+                alarmLogService.create(alarmLogModel);
+            }
+            alarmRecord.setTreatState(param.getTreatState());
+        }
 
-		List<DmpMessage> msgList = new ArrayList<>();
-		alarmRecordModelList.forEach(alarmRecordModel -> {
-			MapResponse updateResponse = update(alarmRecordModel);
-			msgList.addAll(updateResponse.getMessageList());
-		});
-		response.add(msgList);
-		return response;
-	}
+        // 恢复值
+        if (param.getEndInfo() != null) {
+            alarmRecord.setEndInfo(param.getEndInfo());
+        }
+        // 恢复时间
+        if (param.getEndTime() != null) {
+            alarmRecord.setEndTime(param.getEndTime());
+        }
+        // 工单id
+        if (param.getOrderId() != null) {
+            alarmRecord.setOrderId(param.getOrderId());
+        }
+        // 工单状态
+        if (param.getOrderState() != null) {
+            alarmRecord.setOrderState(param.getOrderState());
+        }
+        // 补充说明
+        if (param.getSupplement() != null) {
+            alarmRecord.setSupplement(param.getSupplement());
+        }
+        // 报警等级
+        if (!StringUtils.isEmpty(param.getLevel())) {
+            alarmRecord.setLevel(param.getLevel());
+        }
+        alarmRecord.setUpdateUser(alarmParam.userId);
+        alarmRecord.setUpdateTime(new Date());
+        save(alarmRecord);
+
+        response.add("id", alarmRecord.getId());
+        // 推送消息至mq
+        DmpMessage msg = new DmpMessage();
+        msg.setMid(UUID.randomUUID().toString());
+        msg.setType(EnumAlarmMessageType.ALARM_RECORD_UPDATE.getValue());
+        return getMapResponse(alarmRecord, response, msg);
+
+    }
+
+    @Override
+    @Transactional
+    public MapResponse batchUpdate(AlarmRecord param) {
+        MapResponse response = new MapResponse();
+
+        List<AlarmRecord> alarmRecordModelList = param.getAlarmRecordModels();
+        if (CollectionUtils.isEmpty(alarmRecordModelList)) {
+            response.setFail("批量更新报警记录,没有传入需要更新的对象");
+            return response;
+        }
+
+        // 一次最多更新200条数据
+        if (alarmRecordModelList.size() > 200) {
+            response.setFail("一次最多更新200条数据");
+            return response;
+        }
+
+        List<DmpMessage> msgList = new ArrayList<>();
+        alarmRecordModelList.forEach(alarmRecordModel -> {
+            MapResponse updateResponse = update(alarmRecordModel);
+            msgList.addAll(updateResponse.getMessageList());
+        });
+        response.add(msgList);
+        return response;
+    }
 }