From aa9a4285d46385275c684a47456d0a920261ee02 Mon Sep 17 00:00:00 2001 From: sunxs Date: Thu, 3 Apr 2025 20:26:30 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../large/utli/AutomaticAlertGeneration.java | 252 ++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 Dkl-Vue-master/dkl-large/src/main/java/com/dkl/large/utli/AutomaticAlertGeneration.java diff --git a/Dkl-Vue-master/dkl-large/src/main/java/com/dkl/large/utli/AutomaticAlertGeneration.java b/Dkl-Vue-master/dkl-large/src/main/java/com/dkl/large/utli/AutomaticAlertGeneration.java new file mode 100644 index 0000000..bbeb9e4 --- /dev/null +++ b/Dkl-Vue-master/dkl-large/src/main/java/com/dkl/large/utli/AutomaticAlertGeneration.java @@ -0,0 +1,252 @@ +package com.dkl.large.utli; + + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.dkl.common.core.controller.BaseController; + +import com.dkl.large.domain.DklCameraAnalysis; +import com.dkl.large.domain.DklMonitoringCamera; +import com.dkl.large.domain.DklMonitoringPoints; +import com.dkl.large.domain.DklWarningInformation; +import com.dkl.large.mapper.DklCameraAnalysisMapper; +import com.dkl.large.mapper.DklMonitoringCameraMapper; +import com.dkl.large.mapper.DklMonitoringPointsMapper; +import com.dkl.large.mapper.DklWarningInformationMapper; +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.producer.SendCallback; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.common.message.MessageConst; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Component; + +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.concurrent.CompletableFuture; + + +@Component("automaticAlertGeneration") +public class AutomaticAlertGeneration extends BaseController { + private static final String PATTERN = "yyyy-MM-dd HH:mm:ss"; + @Autowired + DklCameraAnalysisMapper dklCameraAnalysisMapper; + @Autowired + RocketMQTemplate rocketMQTemplate; + @Autowired + DklWarningInformationMapper dklWarningInformationMapper; + @Autowired + DklMonitoringCameraMapper dklMonitoringCameraMapper; + private static final Logger log = LoggerFactory.getLogger(AutomaticAlertGeneration.class); + //mqtopic + @Value("${mqTopic}") + String mqTopic; + @Autowired + private DefaultMQProducer producer; + //生成预警 + public void generateAlerts() { + //创建两个小时区间去查询数据 + DklCameraAnalysis dklCameraAnalysis = new DklCameraAnalysis(); + dklCameraAnalysis.setStartTime(getHoursBefore(2)); + dklCameraAnalysis.setEndTime(new Date()); + List dklCameraAnalysisList = dklCameraAnalysisMapper.getDklCameraAnalysisGroup(dklCameraAnalysis); + //循环判断 + for (DklCameraAnalysis dklCameraAnalysisInfo: dklCameraAnalysisList) { + //当区域预测人流超过最高流量的60%时,系统显示蓝色预警;超过80%则为黄色预警;90%橙色,达到100%时则为红色预警 目前为预警等级 0 1 2 + if (isEightyPercentGreaterOrEqual( Double.parseDouble( dklCameraAnalysisInfo.getCaneraMax()),Double.parseDouble( (dklCameraAnalysisInfo.getLoadmax())),1)){ + //预警 + DklMonitoringCamera dklMonitoringCamera =dklMonitoringCameraMapper.selectDklMonitoringCameraByPath(dklCameraAnalysisInfo.getDmcpoid()); + //创建预警信息 + DklWarningInformation dklWarningInformation = new DklWarningInformation(); + //预警唯一标识符 + dklWarningInformation.setWarningSigns(getDateString()+dklMonitoringCamera.getName()+"预警"); + //发布单位 + dklWarningInformation.setUnitName("系统识别"); + //发布时间 + dklWarningInformation.setReleaseTime(new Date()); + //预警级别 + dklWarningInformation.setWarningLevel("2"); + //预警状态 + dklWarningInformation.setWarningStatus("1"); + //经度 + dklWarningInformation.setLng(dklMonitoringCamera.getLng()); + //经度 + dklWarningInformation.setLat(dklMonitoringCamera.getLat()); + //预计持续时间 + dklWarningInformation.setExpectedDuration("持续关注"); + //可能波及范围 + dklWarningInformation.setScopeImpact(dklMonitoringCamera.getName()+"周边区域"); + //异常数据值 + dklWarningInformation.setAbnormalData("监测到"+dklMonitoringCamera.getName()+"客流异常,人流量骤增已达容量100%!"); + //发生点位 +// dklWarningInformation.setUnitCode(dklCameraAnalysisInfo.getDmpid()); + //预警点位id + dklWarningInformation.setPointsId(dklCameraAnalysisInfo.getDmpid()); + dklWarningInformation.setPointName(dklCameraAnalysisInfo.getDmpName()); + //预警摄像id + dklWarningInformation.setCameraId((long) dklMonitoringCamera.getId()); + dklWarningInformation.setCameraName( dklMonitoringCamera.getName()); + //添加系统信息 + dklWarningInformation.setDelFlag("0"); + dklWarningInformation.setCreateTime(new Date()); + dklWarningInformation.setCreateBy("系统监测"); + dklWarningInformation.setDeptId(dklCameraAnalysisInfo.getDeptid()); + dklWarningInformation.setUpdateTime(new Date()); + dklWarningInformation.setUpdateBy("系统监测"); + //向中台发送 + sendAlertMessage(dklWarningInformation); + continue; + } else if (isEightyPercentGreaterOrEqual( Double.parseDouble( dklCameraAnalysisInfo.getCaneraMax()),Double.parseDouble( (dklCameraAnalysisInfo.getLoadmax())),0.8)){ + //预警 + DklMonitoringCamera dklMonitoringCamera =dklMonitoringCameraMapper.selectDklMonitoringCameraByPath(dklCameraAnalysisInfo.getDmcpoid()); + //创建预警信息 + DklWarningInformation dklWarningInformation = new DklWarningInformation(); + //预警名称 + dklWarningInformation.setWarningSigns(getDateString()+dklMonitoringCamera.getName()+"预警"); + //发布单位 + dklWarningInformation.setUnitName("系统识别"); + //发布时间 + dklWarningInformation.setReleaseTime(new Date()); + //预警级别 + dklWarningInformation.setWarningLevel("1"); + //预警状态 + dklWarningInformation.setWarningStatus("1"); + //经度 + dklWarningInformation.setLng(dklMonitoringCamera.getLng()); + //经度 + dklWarningInformation.setLat(dklMonitoringCamera.getLat()); + //预计持续时间 + dklWarningInformation.setExpectedDuration("持续关注"); + //可能波及范围 + dklWarningInformation.setScopeImpact(dklMonitoringCamera.getName()+"周边区域"); + //异常数据值 + dklWarningInformation.setAbnormalData("监测到"+dklMonitoringCamera.getName()+"客流异常,人流量骤增已达容量80%!"); + //发生点位 +// dklWarningInformation.setUnitCode(dklCameraAnalysisInfo.getDmpid()); + //预警点位id + dklWarningInformation.setPointsId(dklCameraAnalysisInfo.getDmpid()); + dklWarningInformation.setPointName(dklCameraAnalysisInfo.getDmpName()); + //预警摄像id + dklWarningInformation.setCameraId((long) dklMonitoringCamera.getId()); + dklWarningInformation.setCameraName( dklMonitoringCamera.getName()); + //添加系统信息 + dklWarningInformation.setDelFlag("0"); + dklWarningInformation.setCreateTime(new Date()); + dklWarningInformation.setCreateBy("系统监测"); + dklWarningInformation.setDeptId(dklCameraAnalysisInfo.getDeptid()); + dklWarningInformation.setUpdateTime(new Date()); + dklWarningInformation.setUpdateBy("系统监测"); + //向中台发送 + sendAlertMessage(dklWarningInformation); + continue; + } + else if (isEightyPercentGreaterOrEqual( Double.parseDouble( dklCameraAnalysisInfo.getCaneraMax()),Double.parseDouble( (dklCameraAnalysisInfo.getLoadmax())),0.6)){ + //预警 + DklMonitoringCamera dklMonitoringCamera =dklMonitoringCameraMapper.selectDklMonitoringCameraByPath(dklCameraAnalysisInfo.getDmcpoid()); + //创建预警信息 + DklWarningInformation dklWarningInformation = new DklWarningInformation(); + //预警唯一标识符 + dklWarningInformation.setWarningSigns(getDateString()+dklMonitoringCamera.getName()+"预警"); + //发布单位 + dklWarningInformation.setUnitName("系统识别"); + //发布时间 + dklWarningInformation.setReleaseTime(new Date()); + //预警级别 + dklWarningInformation.setWarningLevel("0"); + //预警状态 + dklWarningInformation.setWarningStatus("1"); + //经度 + dklWarningInformation.setLng(dklMonitoringCamera.getLng()); + //经度 + dklWarningInformation.setLat(dklMonitoringCamera.getLat()); + //预计持续时间 + dklWarningInformation.setExpectedDuration("持续关注"); + //可能波及范围 + dklWarningInformation.setScopeImpact(dklMonitoringCamera.getName()+"周边区域"); + //异常数据值 + dklWarningInformation.setAbnormalData("监测到"+dklMonitoringCamera.getName()+"客流异常,人流量骤增60%!"); + //发生点位 +// dklWarningInformation.setUnitCode(dklCameraAnalysisInfo.getDmpid()); + //预警点位id + dklWarningInformation.setPointsId(dklCameraAnalysisInfo.getDmpid()); + dklWarningInformation.setPointName(dklCameraAnalysisInfo.getDmpName()); + //预警摄像id + dklWarningInformation.setCameraId((long) dklMonitoringCamera.getId()); + dklWarningInformation.setCameraName( dklMonitoringCamera.getName()); + //添加系统信息 + dklWarningInformation.setDelFlag("0"); + dklWarningInformation.setCreateTime(new Date()); + dklWarningInformation.setCreateBy("系统监测"); + dklWarningInformation.setDeptId(dklCameraAnalysisInfo.getDeptid()); + dklWarningInformation.setUpdateTime(new Date()); + dklWarningInformation.setUpdateBy("系统监测"); + //向中台发送 + sendAlertMessage(dklWarningInformation); + continue; + } + + + + } + } + + /** + * 发送预警消息 + * @param dklWarningInformation 消息内容 + */ + public void sendAlertMessage(DklWarningInformation dklWarningInformation) { + //生成预警信息数据 + dklWarningInformationMapper.insertDklWarningInformation(dklWarningInformation); + // 构建消息对象 + Message message = MessageBuilder.withPayload(dklWarningInformation) + .setHeader(MessageConst.PROPERTY_TAGS, "userTag") + .build(); + + // 异步发送(带回调) + rocketMQTemplate.asyncSend(mqTopic, message, new SendCallback() { + @Override + public void onSuccess(SendResult sendResult) { + log.info("消息发送成功, ID: {}, 队列: {}", + sendResult.getMsgId(), + sendResult.getMessageQueue().getQueueId()); + } + + @Override + public void onException(Throwable e) { + log.error("消息发送失败", e); + // 可添加补偿逻辑 + } + }); + } + + + + + public static Date getHoursBefore(int hours) { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.HOUR_OF_DAY, -hours); + return calendar.getTime(); + } + public static String getDateString() { + // 定义中文时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒"); + // 获取并格式化当前时间 + return LocalDateTime.now().format(formatter); + } + + public static boolean isEightyPercentGreaterOrEqual(double a, double b,double ratio) { + return (a * ratio) >= b; + } +} + +