‘liusuyi’
2023-06-29 0362c0c8502a81fc974afb8d2aff85d9efd7bbb1
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/GlobalAlarmServiceImpl.java
@@ -5,6 +5,8 @@
import com.ruoyi.alarm.cameraAlarm.mapper.ArdAlarmCameraMapper;
import com.ruoyi.alarm.globalAlarm.domain.GlobalAlarmCondition;
import com.ruoyi.alarm.globalAlarm.domain.GlobalAlarmData;
import com.ruoyi.alarm.globalAlarm.domain.GuidePriorityQueue;
import com.ruoyi.alarm.globalAlarm.domain.GuideTask;
import com.ruoyi.alarm.globalAlarm.service.IGlobalAlarmService;
import com.ruoyi.alarm.radarAlarm.domain.ArdAlarmRadar;
import com.ruoyi.alarm.radarAlarm.domain.RadarAlarmData;
@@ -22,6 +24,7 @@
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.constant.CamPriority;
import com.ruoyi.utils.tools.ArdTool;
import com.ruoyi.utils.tools.GisTool;
import com.ruoyi.common.utils.uuid.IdUtils;
@@ -54,19 +57,19 @@
@Slf4j(topic = "mqtt")
public class GlobalAlarmServiceImpl implements IGlobalAlarmService {
    @Resource
    ArdAlarmRadarMapper ardAlarmRadarMapper;
    private ArdAlarmRadarMapper ardAlarmRadarMapper;
    @Resource
    ArdAlarmStealelecMapper ardAlarmStealelecMapper;
    private ArdAlarmStealelecMapper ardAlarmStealelecMapper;
    @Resource
    ArdAlarmTubeMapper ardAlarmTubeMapper;
    private ArdAlarmTubeMapper ardAlarmTubeMapper;
    @Resource
    ArdAlarmCameraMapper ardAlarmCameraMapper;
    private ArdAlarmCameraMapper ardAlarmCameraMapper;
    @Resource
    ArdTubesMapper ardTubesMapper;
    private ArdTubesMapper ardTubesMapper;
    @Resource
    ArdAlarmpointsWellMapper ardAlarmpointsWellMapper;
    private ArdAlarmpointsWellMapper ardAlarmpointsWellMapper;
    @Resource
    ArdTubesDetailsMapper ardTubesDetailsMapper;
    private ArdTubesDetailsMapper ardTubesDetailsMapper;
    @Resource
    private ISysConfigService configService;
    @Resource
@@ -212,7 +215,7 @@
     * @修改人和其它信息
     */
    @Override
    @Async("alarmExecutor")
//    @Async("alarmExecutor")
    public void receiveAlarm(String topic, String message) {
        try {
            switch (topic) {
@@ -227,28 +230,6 @@
                    int aas = ardAlarmStealelecMapper.insertArdAlarmStealelec(ardAlarmStealelec);
                    if (aas > 0) {
                        log.info("stealelec入库成功:" + ardAlarmStealelec);
                        ArdAlarmpointsWell well = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(ardAlarmStealelec.getDescribe());
                        if (well != null) {
                            ardAlarmStealelec.setLongitude(well.getLongitude());
                            ardAlarmStealelec.setLatitude(well.getLatitude());
                            ardAlarmStealelec.setAltitude(well.getAltitude());
                            //引导录像
                            CameraCmd cmd = new CameraCmd();
                            cmd.setRecordBucketName("record");
                            cmd.setRecordObjectName("stealelec");
                            cmd.setOperator("sys_steal_elec");
                            cmd.setExpired(30);
                            cmd.setTargetPosition(new double[]{well.getLongitude(), well.getLatitude(), well.getAltitude()});
                            boolean res = guideCamera(cmd);
                            if (res) {
                                String url = alarmToRecord(cmd);
                                if (StringUtils.isNotEmpty(url)) {
                                    //更新录像
                                    ardAlarmStealelec.setRecordUrl(url);
                                    ardAlarmStealelecMapper.updateArdAlarmStealelec(ardAlarmStealelec);
                                }
                            }
                        }
                    }
                    //endregion
                    break;
@@ -276,21 +257,9 @@
                    int aat = ardAlarmTubeMapper.insertArdAlarmTube(ardAlarmTube);
                    if (aat > 0) {
                        log.debug("tube入库成功:" + ardAlarmTube);
                        //引导录像
                        CameraCmd cmd = new CameraCmd();
                        cmd.setRecordBucketName("record");
                        cmd.setRecordObjectName("tube");
                        cmd.setOperator("sys_tube_leak");
                        cmd.setExpired(30);
                        cmd.setTargetPosition(new double[]{ardAlarmTube.getLongitude(), ardAlarmTube.getLatitude(), ardAlarmTube.getAltitude()});
                        boolean res = guideCamera(cmd);
                        if (res) {
                            String url = alarmToRecord(cmd);
                            if (StringUtils.isNotEmpty(url)) {
                                //更新录像
                                ardAlarmTube.setRecordUrl(url);
                                ardAlarmTubeMapper.updateArdAlarmTube(ardAlarmTube);
                            }
                        String nearbyCamera = getNearbyCamera(new double[]{ardAlarmTube.getLongitude(), ardAlarmTube.getLatitude()});
                        if(StringUtils.isNotEmpty(nearbyCamera)) {
                            addTaskQueue(nearbyCamera, ardAlarmTube.getId(), "sys_tube_leak", ardAlarmTube.getAlarmTime(), 1);
                        }
                    }
                    //endregion
@@ -299,25 +268,30 @@
                    //region 处理通用光电报警
                    ArdAlarmCamera ardAlarmCamera = JSONObject.parseObject(message, ArdAlarmCamera.class);
                    ardAlarmCamera.setId(IdUtils.simpleUUID());
                    int aac = ardAlarmCameraMapper.insertArdAlarmCamera(ardAlarmCamera);
                    if (aac > 0) {
                        log.debug("camera入库成功:" + ardAlarmCamera);
                        String nearbyCamera = getNearbyCamera(new double[]{ardAlarmCamera.getLongitude(), ardAlarmCamera.getLatitude()});
                        if(StringUtils.isNotEmpty(nearbyCamera)) {
                            addTaskQueue(nearbyCamera, ardAlarmCamera.getId(), "sys_camera", ardAlarmCamera.getAlarmTime(), 1);
                        }
                        //引导录像
                        CameraCmd cmd = new CameraCmd();
                        cmd.setRecordBucketName("record");
                        cmd.setRecordObjectName("camera");
                        cmd.setOperator("sys_camera");
                        cmd.setExpired(30);
                        cmd.setTargetPosition(new double[]{ardAlarmCamera.getLongitude(), ardAlarmCamera.getLatitude()});
                        boolean res = guideCamera(cmd);
                        if (res) {
                            String url = alarmToRecord(cmd);
                            if (StringUtils.isNotEmpty(url)) {
                                //更新录像
                                ardAlarmCamera.setRecordUrl(url);
                                ardAlarmCameraMapper.updateArdAlarmCamera(ardAlarmCamera);
                            }
                        }
//                        CameraCmd cmd = new CameraCmd();
//                        cmd.setRecordBucketName("record");
//                        cmd.setRecordObjectName("camera");
//                        cmd.setOperator("sys_camera");
//                        cmd.setExpired(30);
//                        cmd.setTargetPosition(new double[]{ardAlarmCamera.getLongitude(), ardAlarmCamera.getLatitude()});
//                        boolean res = guideCamera(cmd);
//                        if (res) {
//                            String url = alarmToRecord(cmd);
//                            if (StringUtils.isNotEmpty(url)) {
//                                //更新录像
//                                ardAlarmCamera.setRecordUrl(url);
//                                ardAlarmCameraMapper.updateArdAlarmCamera(ardAlarmCamera);
//                            }
//                        }
                    }
                    //endregion
                    break;
@@ -325,35 +299,142 @@
                    //region 处理雷达报警
                    RadarAlarmData radarAlarmData = JSONObject.parseObject(message, RadarAlarmData.class);
                    List<ArdAlarmRadar> ardAlarmRadars = radarAlarmData.getArdAlarmRadars();
                    Map<String, Object> readyGuide = new HashMap<>();
                    for (ArdAlarmRadar ardAlarmRadar : ardAlarmRadars) {
                        ardAlarmRadar.setId(IdUtils.simpleUUID());
                        String uuid = IdUtils.simpleUUID();
                        ardAlarmRadar.setId(uuid);
                        ardAlarmRadar.setAlarmTime(radarAlarmData.getAlarmTime());
                        int aar = ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
                        if (aar > 0) {
                            log.debug("radar入库成功:" + ardAlarmRadar);
                        String name = ardAlarmRadar.getName() + "(" + radarAlarmData.getRadarName() + ")";
                        ardAlarmRadar.setName(name);
                        ardAlarmRadar.setCreateTime(new Date());
                        String alarmType = "";
                        switch (ardAlarmRadar.getAlarmType()) {
                            case "运动目标检测":
                                alarmType = "sys_radar_move";
                                break;
                            case "热源检测":
                                alarmType = "sys_radar_fire";
                                break;
                        }
                        readyGuide.put(ardAlarmRadar.getName(), ardAlarmRadar);//每个报警点取出一条报警
                        //判断当前报警点5分钟内是否已引导
                        ardAlarmRadar.setGuideFlag(1);
                        ArdAlarmRadar AlarmRadar = ardAlarmRadarMapper.getArdAlarmRadarWithGuide(ardAlarmRadar);
                        if (StringUtils.isNull(AlarmRadar)) {
                            //5分钟内未引导直接入库
                            ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
                            //获取雷达所在塔上的大光电
                            String cameraIdWithTower = ardAlarmRadarMapper.getCameraByRadar(radarAlarmData.getRadarId());
                            if (StringUtils.isNotNull(cameraIdWithTower) && StringUtils.isNotEmpty(cameraIdWithTower)) {
                                //入队列待引导
                                addTaskQueue(cameraIdWithTower, uuid, alarmType, ardAlarmRadar.getAlarmTime(), 1);
                    }
                    //获取每个报警点关联的相机
                        } else {
                            //5分钟内有引导
                            ardAlarmRadar.setGuideFlag(0);
                            int count = ardAlarmRadarMapper.getArdAlarmRadarWithNotGuide(ardAlarmRadar, AlarmRadar.getCreateTime());
                            if (count >= 3) {
                                //未引导超过3次,直接入库入队
                                //5分钟内未引导直接入库
                                ardAlarmRadar.setGuideFlag(1);
                                ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
                                //入队列待引导
                                //获取雷达所在塔上的大光电
                                String cameraIdWithTower = ardAlarmRadarMapper.getCameraByRadar(radarAlarmData.getRadarId());
                                if (StringUtils.isNotNull(cameraIdWithTower) && StringUtils.isNotEmpty(cameraIdWithTower)) {
                                    //如果雷达塔上有光电
                                    addTaskQueue(cameraIdWithTower, uuid, alarmType, ardAlarmRadar.getAlarmTime(), count);
                                }
                            } else {
                                //未引导未超过3次,直接入库
                                ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
                            }
                    //先找报警雷达塔上的相机
                    CameraCmd cmd = new CameraCmd();
                    cmd.setCameraId("1");
                    cmd.setChannelNum(1);
                    boolean b = guideCamera(cmd);
                        }
                    //再找报警点关联的相机
                    cmd.setCameraId("2");
                    cmd.setChannelNum(1);
                    boolean b1 = guideCamera(cmd);
                        //获取兴趣点关联的大光电
//                            ArdAlarmpointsWell well=new ArdAlarmpointsWell();
//                            well.setWellId(ardAlarmRadar.getName());
//                            List<ArdAlarmpointsWell> ardAlarmpointsWells = ardAlarmpointsWellMapper.selectArdAlarmpointsWellList(well);
//                            if(ardAlarmpointsWells!=null&&ardAlarmpointsWells.size()>0)
//                            {
//                                String cameraIdWithWell = ardAlarmpointsWells.get(0).getCameraId();
//                            }
                    }
                    printPriorityQueue();
                    //endregion
                    break;
            }
            printPriorityQueue();
        } catch (Exception ex) {
            log.error("接收报警异常:" + ex.getMessage());
        }
    }
    /**
     * 引导任务入队方法
     */
    private void addTaskQueue(String cameraId, String alarmId, String alarmType, Date alarmTime, Integer num) {
        GuideTask guideTask = new GuideTask();
        guideTask.setCameraId(cameraId);
        guideTask.setAlarmId(alarmId);
        SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        guideTask.setAlarmTime(fmt.format(alarmTime));
        Integer priority = CamPriority.priorityMap.get(alarmType);
        guideTask.setPriority(priority);
        guideTask.setNum(num);
        PriorityQueue<GuideTask> priorityQueue = GuidePriorityQueue.cameraQueueMap.get(guideTask.getCameraId());
        priorityQueue.add(guideTask);
    }
    /**
     * 打印队列
     */
    private void printPriorityQueue() {
        for (String cameraId : GuidePriorityQueue.cameraQueueMap.keySet()) {
            log.info("cameraId" + cameraId);
            PriorityQueue<GuideTask> priorityQueue = GuidePriorityQueue.cameraQueueMap.get(cameraId);
            for (GuideTask task : priorityQueue) {
                log.info("alarmId:" + task.getAlarmId() + "  alarmTime:" + task.getAlarmTime() + "  priority:" + task.getPriority() + "  num:" + task.getNum() + "  cameraId:" + task.getCameraId());
            }
        }
    }
    /**
     * 查找附近开启报警引导功能光电
     */
    private String getNearbyCamera(double[] targetPosition) {
        String minDistanceCameraId = "";
        //获取所有大光电
        List<ArdCameras> ardCamerasList = ardCamerasMapper.selectArdCamerasList(new ArdCameras("1"));
        //统计所有大光电可视范围内与报警点的距离
        Map<String, Double> distanceMap = new HashMap<>();
        Map<String, Integer> guideMap = new HashMap<>();
        for (ArdCameras camera : ardCamerasList) {
            double[] camPosition = new double[]{camera.getLongitude(), camera.getLatitude()};
            double distance = GisTool.getDistance(targetPosition, camPosition);
            if (distance != 0.0 && distance <= camera.getCamMaxVisibleDistance()) {
                distanceMap.put(camera.getId(), distance);
                if (StringUtils.isNull(camera.getCamAlarmGuideEnable())) {
                    camera.setCamAlarmGuideEnable(0);
                }
                guideMap.put(camera.getId(), camera.getCamAlarmGuideEnable());
            }
        }
        if (distanceMap.size() > 0) {
            log.debug("尝试查找最近光电");
            //获取距离字典中最近的一个相机ID
            minDistanceCameraId = ArdTool.getKeyByMinValue(distanceMap);
            log.debug("查找到最近光电:" + minDistanceCameraId);
            if (guideMap.get(minDistanceCameraId).equals(0)) {
                log.debug("该光电未开启报警引导");
                return " ";
            }
        }
        return minDistanceCameraId;
    }
    /**
@@ -367,45 +448,23 @@
    private boolean guideCamera(CameraCmd cmd) {
        try {
            String dayNightTime = redisCache.getCacheObject("sys_config:dayNightTime");
            //获取所有大光电
            List<ArdCameras> ardCamerasList = ardCamerasMapper.selectArdCamerasList(new ArdCameras("1"));
            //统计所有大光电可视范围内与报警点的距离
            Map<String, Double> distanceMap = new HashMap<>();
            Map<String, Integer> guideMap = new HashMap<>();
            for (ArdCameras camera : ardCamerasList) {
                double[] camPosition = new double[]{camera.getLongitude(), camera.getLatitude()};
                double distance = GisTool.getDistance(cmd.getTargetPosition(), camPosition);
                if (distance != 0.0 && distance <= camera.getCamMaxVisibleDistance()) {
                    distanceMap.put(camera.getId(), distance);
                    if (StringUtils.isNull(camera.getCamAlarmGuideEnable())) {
                        camera.setCamAlarmGuideEnable(0);
                    }
                    guideMap.put(camera.getId(), camera.getCamAlarmGuideEnable());
                }
            }
            if (distanceMap.size() > 0) {
                log.debug("尝试查找最近光电");
                //获取距离字典中最近的一个相机ID
                String minDistanceCameraId = ArdTool.getKeyByMinValue(distanceMap);
                log.debug("查找到最近光电:" + minDistanceCameraId + ",尝试引导");
                if (guideMap.get(minDistanceCameraId).equals(0)) {
                    log.debug("该光电未开启报警引导");
                    return false;
                }
            String nearbyCamera = getNearbyCamera(cmd.getTargetPosition());
            if (StringUtils.isNotEmpty(nearbyCamera)) {
                //引导光电
                cmd.setCameraId(minDistanceCameraId);
                cmd.setCameraId(nearbyCamera);
                cmd.setChannelNum(ArdTool.getChannelBydayNightTime(dayNightTime));
                boolean guideRes = hikClientService.guideTargetPosition(cmd);
                return guideRes;
            } else {
                log.debug("未查找到最近光电");
                return false;
            }
        } catch (Exception ex) {
        } catch (
                Exception ex) {
            log.error("引导异常:" + ex.getMessage());
            return false;
        }
    }
    /**