Administrator
2023-08-07 c1dafc830993fcedb99a4f2b62178691e1e92e64
Merge remote-tracking branch 'origin/master'
已修改3个文件
201 ■■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/storage/minio/service/impl/StorageMinioEventServiceImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java
@@ -52,6 +52,7 @@
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -96,6 +97,8 @@
    @Resource
    private QueueManager queueManager;
    //endregion
    //每个点位未引导次数
    private Map<String, Integer> unGuideCountMap = new HashMap<>();
    /**
     * @描述 查询所有报警的当前数量
@@ -542,68 +545,45 @@
                        }
                        double[] coordinate = new double[]{ardAlarmRadar.getLongitude(), ardAlarmRadar.getLatitude()};//报警坐标
                        //判断当前报警点5分钟内是否已引导
                        ardAlarmRadar.setGuideFlag(1);
                       // ArdAlarmRadar AlarmRadar = ardAlarmRadarMapper.getArdAlarmRadarWithGuide(ardAlarmRadar);
                        ArdAlarmRadar AlarmRadar = redisCache.getCacheObject("global_alarm:guideNew");//从redis中取出最新引导的报警数据
                        if (StringUtils.isNull(AlarmRadar)) {
                            //5分钟内未引导直接入库
                            ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
                            redisCache.setCacheObject("global_alarm:guideNew",ardAlarmRadar);//引导数据写入redis
                            //获取雷达所在塔上的大光电
                            String cameraIdWithTower = ardAlarmRadarMapper.getCameraByRadar(radarAlarmData.getRadarId());
                            if (StringUtils.isNotNull(cameraIdWithTower) && StringUtils.isNotEmpty(cameraIdWithTower)) {
                                log.info("获取到雷达塔上的光电:" + cameraIdWithTower);
                                //如果雷达塔上有光电
                                messagesEnqueued(cameraIdWithTower, uuid, alarmType, ardAlarmRadar.getCreateTime(), 1, 1, coordinate);
                            }
                            //获取报警点关联的大光电
                            ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(alarmpointName);
                            if (StringUtils.isNotNull(ardAlarmpointsWell) && StringUtils.isNotEmpty(ardAlarmpointsWell.getCameraId())) {
                                String cameraId = ardAlarmpointsWell.getCameraId();
                                if (cameraId.equals(cameraIdWithTower)) {
                                    return;
                                }
                                log.info("获取到报警点关联的光电:" + cameraId);
                                //如果报警点关联了光电
                                messagesEnqueued(cameraId, uuid, alarmType, ardAlarmRadar.getCreateTime(), 1, 2, coordinate);
                            }
                        //从redis中取出当前报警点的5分钟内是否有引导
                        ArdAlarmRadar AlarmRadar = redisCache.getCacheObject("global_alarm:" + ardAlarmRadar.getName());//从redis中取出最新引导的报警数据
                        if (AlarmRadar == null) {
                            //5分钟内redis中没有数据,说明5分钟内没有引导数据
                            ardAlarmRadar.setGuideFlag(1);
                            //将引导数据写入redis 设置5分钟过期
                            redisCache.setCacheObject("global_alarm:" + ardAlarmRadar.getName(), ardAlarmRadar, 5, TimeUnit.MINUTES);//引导数据写入redis
                            unGuideCountMap.put(ardAlarmRadar.getName(), 0);
                            //引导入队
                            radarGuide(radarAlarmData.getRadarId(), alarmpointName, alarmType, ardAlarmRadar.getCreateTime(), coordinate);
                        } else {
                            //5分钟内有引导
                            ardAlarmRadar.setGuideFlag(0);
                            int count = ardAlarmRadarMapper.getArdAlarmRadarWithNotGuide(ardAlarmRadar, AlarmRadar.getCreateTime());
                            //未引导超过3次,直接入库入队
                            if (count >= 3) {
                                ardAlarmRadar.setGuideFlag(1);
                                ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
                                redisCache.setCacheObject("global_alarm:guideNew",ardAlarmRadar);//引导数据写入redis
                                //获取雷达所在塔上的大光电
                                String cameraIdWithTower = ardAlarmRadarMapper.getCameraByRadar(radarAlarmData.getRadarId());
                                if (StringUtils.isNotNull(cameraIdWithTower) && StringUtils.isNotEmpty(cameraIdWithTower)) {
                                    log.info("获取到雷达塔上的光电:" + cameraIdWithTower);
                                    //如果雷达塔上有光电
                                    messagesEnqueued(cameraIdWithTower, uuid, alarmType, ardAlarmRadar.getCreateTime(), count, 1, coordinate);
                                }
                                //获取报警点关联的大光电
                                ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(alarmpointName);
                                if (StringUtils.isNotNull(ardAlarmpointsWell) && StringUtils.isNotEmpty(ardAlarmpointsWell.getCameraId())) {
                                    String cameraId = ardAlarmpointsWell.getCameraId();
                                    if (cameraId.equals(cameraIdWithTower)) {
                                        return;
                                    }
                                    log.info("获取到报警点关联的光电:" + cameraId);
                                    //如果报警点关联了光电
                                    messagesEnqueued(cameraId, uuid, alarmType, ardAlarmRadar.getCreateTime(), count, 2, coordinate);
                            //5分钟内redis中有数据,说明5分钟内有引导数据,获取当前报警点的未引导次数
                            Integer count = unGuideCountMap.get(ardAlarmRadar.getName());
                            if (count != null) {
                                if (count > 2) {
                                    //未引导次数3次后进行引导
                                    ardAlarmRadar.setGuideFlag(1);
                                    //将引导数据写入redis 设置5分钟过期
                                    redisCache.setCacheObject("global_alarm:" + ardAlarmRadar.getName(), ardAlarmRadar, 5, TimeUnit.MINUTES);
                                    count = 0;
                                    //引导入队
                                    radarGuide(radarAlarmData.getRadarId(), alarmpointName, alarmType, ardAlarmRadar.getCreateTime(), coordinate);
                                } else {
                                    ardAlarmRadar.setGuideFlag(0);
                                    count++;
                                }
                            } else {
                                //未引导未超过3次,直接入库
                                ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
                                ardAlarmRadar.setGuideFlag(0);
                                count = 0;
                            }
                            unGuideCountMap.put(ardAlarmRadar.getName(), count);
                        }
                        //入库
                        ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
                        // 结束时间
                        long etime = System.currentTimeMillis();
                        // 计算执行时间
                        log.info("查询API执行时长:"+(etime-stime)+"毫秒");
                        log.info("雷达报警处理时长:" + (etime - stime) + "毫秒");
                    }
                    //endregion
@@ -739,7 +719,7 @@
    private Boolean IsEnableGuide(String cameraId) {
        boolean enabled = false;
        ArdCameras ardCameras = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
        if(ardCameras!=null) {
        if (ardCameras != null) {
            if (ardCameras.getCamAlarmGuideEnable().equals(1)) {
                enabled = true;
            }
@@ -781,37 +761,29 @@
        return minDistanceCameraId;
    }
    public static void main(String[] args) {
        Comparator<Obj> PriorityDescCom = Comparator.comparingInt(Obj::getPriority).reversed();
        Comparator<Obj> NumDescCom = Comparator.comparingInt(Obj::getNum).reversed();
        Comparator<Obj> receiveTimeAscCom = Comparator.comparing(Obj::getAlarmTime);
        Comparator<Obj> comparator = PriorityDescCom.thenComparing(NumDescCom).thenComparing(receiveTimeAscCom);
        PriorityBlockingQueue<Obj> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
        priorityQueue.add(new Obj(999, 1, "2023-07-01 16:00:01"));
        priorityQueue.add(new Obj(999, 2, "2023-07-01 16:00:01"));
        priorityQueue.add(new Obj(999, 3, "2023-07-01 16:00:01"));
        List<Obj> elements = new ArrayList<>(priorityQueue);
        elements.sort(priorityQueue.comparator());  // 使用队列的比较器进行排序
        for (Obj task : elements) {
            log.info("正在排队【priority】" + task.getPriority() + "【num】" + task.getNum() + "【alarmTime】" + task.getAlarmTime());
    /**
     * 雷达引导入队
     */
    private void radarGuide(String radarId, String alarmpointName, String alarmType, Date createTime, double[] coordinate) {
        String uuid = IdUtils.simpleUUID();
        //获取雷达所在塔上的大光电
        String cameraIdWithTower = ardAlarmRadarMapper.getCameraByRadar(radarId);
        if (StringUtils.isNotNull(cameraIdWithTower) && StringUtils.isNotEmpty(cameraIdWithTower)) {
            log.info("获取到雷达塔上的光电:" + cameraIdWithTower);
            //如果雷达塔上有光电
            messagesEnqueued(cameraIdWithTower, uuid, alarmType, createTime, 1, 1, coordinate);
        }
        log.info("===================================================================");
        priorityQueue.add(new Obj(999, 5, "2023-07-01 16:00:01"));
        PriorityBlockingQueue queue = new PriorityBlockingQueue<>(priorityQueue);
        while (queue.size() > 0) {
            Obj task = (Obj) queue.poll();
            log.info("正在排队【priority】" + task.getPriority() + "【num】" + task.getNum() + "【alarmTime】" + task.getAlarmTime());
        //获取报警点关联的大光电
        ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(alarmpointName);
        if (StringUtils.isNotNull(ardAlarmpointsWell) && StringUtils.isNotEmpty(ardAlarmpointsWell.getCameraId())) {
            String cameraId = ardAlarmpointsWell.getCameraId();
            if (cameraId.equals(cameraIdWithTower)) {
                return;
            }
            log.info("获取到报警点关联的光电:" + cameraId);
            //如果报警点关联了光电
            messagesEnqueued(cameraId, uuid, alarmType, createTime, 1, 2, coordinate);
        }
    }
    @Data
    @AllArgsConstructor
    static class Obj {
        Integer priority;
        Integer num;
        String alarmTime;
    }
}
ard-work/src/main/java/com/ruoyi/storage/minio/service/impl/StorageMinioEventServiceImpl.java
@@ -106,31 +106,37 @@
    @Async
    @Override
    public void parseStorageMinioEvent(String message) {
        JsonsRootBean jsonsRootBean = JSONObject.parseObject(message, JsonsRootBean.class);
        if (jsonsRootBean != null) {
            Records records = jsonsRootBean.getRecords().get(0);
            StorageMinioEvent storageMinioEvent = new StorageMinioEvent();
            storageMinioEvent.setEventTime(records.getEventTime());
            storageMinioEvent.setEventType(records.getEventName());
            storageMinioEvent.setBucketName(records.getS3().getBucket().getName());
            String encode = null;
            try {
                encode = URLDecoder.decode(records.getS3().getMObject().getKey(), "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            storageMinioEvent.setObjectName(encode);
            storageMinioEvent.setObjectSize(records.getS3().getMObject().getSize());
            storageMinioEvent.setObjectType(records.getS3().getMObject().getContentType());
            storageMinioEvent.setHost(records.getSource().getHost());
            storageMinioEvent.setEndpoint(records.getResponseElements().getXMinioOriginEndpoint());
            storageMinioEvent.setUserName(records.getRequestParameters().getPrincipalid());
        try {
            JsonsRootBean jsonsRootBean = JSONObject.parseObject(message, JsonsRootBean.class);
            if (jsonsRootBean != null) {
                Records records = jsonsRootBean.getRecords().get(0);
                StorageMinioEvent storageMinioEvent = new StorageMinioEvent();
                storageMinioEvent.setEventTime(records.getEventTime());
                String eventType = records.getEventName().substring(0, records.getEventName().indexOf(":", records.getEventName().indexOf(":") + 1));//不包含本身位置
                storageMinioEvent.setEventType(eventType);
                storageMinioEvent.setBucketName(records.getS3().getBucket().getName());
                String encode = null;
                try {
                    encode = URLDecoder.decode(records.getS3().getMObject().getKey(), "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                storageMinioEvent.setObjectName(encode);
                storageMinioEvent.setObjectSize(records.getS3().getMObject().getSize());
                storageMinioEvent.setObjectType(records.getS3().getMObject().getContentType());
                storageMinioEvent.setHost(records.getSource().getHost());
                storageMinioEvent.setEndpoint(records.getResponseElements().getXMinioOriginEndpoint());
                storageMinioEvent.setUserName(records.getRequestParameters().getPrincipalid());
            int i = insertStorageMinioEvent(storageMinioEvent);
            if(i>0)
            {
                log.debug("minio操作日志入库成功!【"+storageMinioEvent.getEventType()+"】");
                int i = insertStorageMinioEvent(storageMinioEvent);
                if (i > 0) {
                    log.debug("minio操作日志入库成功!【" + storageMinioEvent.getEventType() + "】");
                }
            }
        }
        catch (Exception ex)
        {
            log.error("minio事件格式化异常:"+ex.getMessage());
        }
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
@@ -1,9 +1,7 @@
package com.ruoyi.web.controller.monitor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
@@ -75,6 +73,9 @@
        }
        Collections.reverse(userOnlineList);
        userOnlineList.removeAll(Collections.singleton(null));
        //在线用户按登录时间逆序排序
        Comparator<SysUserOnline> comparator = Comparator.comparingLong(sysUserOnline -> sysUserOnline.getLoginTime()); // 使用Collections.sort方法进行排序 Collections.sort(personList, comparator);
        Collections.sort(userOnlineList, comparator.reversed());
        return getDataTable(userOnlineList);
    }