‘liusuyi’
2023-06-30 a38cb5bb3898f8996321df8f8d537ea18f4af71f
优化
已修改6个文件
225 ■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/domain/GuideTask.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/GlobalAlarmServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/QueueManager.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/QueueTaskExecutor.java 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/radarAlarm/domain/ArdAlarmRadar.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SdkTask.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/domain/GuideTask.java
@@ -16,9 +16,37 @@
@AllArgsConstructor
public class GuideTask {
    /**
     * 相机ID
     */
    String cameraId;
    /**
     * 相机通道
     */
    Integer chanNum;
    /**
     * 报警ID
     */
    String alarmId;
    /**
     * 报警类型
     */
    String alarmType;
    /**
     * 报警优先级
     */
    Integer priority;
    /**
     * 报警时间
     */
    String alarmTime;
    /**
     * 报警次数
     */
    Integer num;
    /**
     * 录像存储位置
     */
    Integer recordSn;
}
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/GlobalAlarmServiceImpl.java
@@ -344,7 +344,7 @@
                        log.debug("tube入库成功:" + ardAlarmTube);
                        String nearbyCamera = getNearbyCamera(new double[]{ardAlarmTube.getLongitude(), ardAlarmTube.getLatitude()});
                        if (StringUtils.isNotEmpty(nearbyCamera)) {
                            messagesEnqueued(nearbyCamera, ardAlarmTube.getId(), "sys_tube_leak", ardAlarmTube.getAlarmTime(), 1);
                            messagesEnqueued(nearbyCamera, ardAlarmTube.getId(), "sys_tube_leak", ardAlarmTube.getAlarmTime(), 1,1);
                        }
                    }
                    //endregion
@@ -357,26 +357,6 @@
                    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)) {
                            messagesEnqueued(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);
//                            }
//                        }
                    }
                    //endregion
                    break;
@@ -410,41 +390,36 @@
                            String cameraIdWithTower = ardAlarmRadarMapper.getCameraByRadar(radarAlarmData.getRadarId());
                            if (StringUtils.isNotNull(cameraIdWithTower) && StringUtils.isNotEmpty(cameraIdWithTower)) {
                                //入队列待引导
                                messagesEnqueued(cameraIdWithTower, uuid, alarmType, ardAlarmRadar.getAlarmTime(), 1);
                                messagesEnqueued(cameraIdWithTower, uuid, alarmType, ardAlarmRadar.getAlarmTime(), 1,1);
                            }
                        } else {
                            //5分钟内有引导
                            ardAlarmRadar.setGuideFlag(0);
                            int count = ardAlarmRadarMapper.getArdAlarmRadarWithNotGuide(ardAlarmRadar, AlarmRadar.getCreateTime());
                            //未引导超过3次,直接入库入队
                            if (count >= 3) {
                                //未引导超过3次,直接入库入队
                                //5分钟内未引导直接入库
                                ardAlarmRadar.setGuideFlag(1);
                                ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
                                //入队列待引导
                                //获取雷达所在塔上的大光电
                                String cameraIdWithTower = ardAlarmRadarMapper.getCameraByRadar(radarAlarmData.getRadarId());
                                if (StringUtils.isNotNull(cameraIdWithTower) && StringUtils.isNotEmpty(cameraIdWithTower)) {
                                    //如果雷达塔上有光电
                                    messagesEnqueued(cameraIdWithTower, uuid, alarmType, ardAlarmRadar.getAlarmTime(), count);
                                    messagesEnqueued(cameraIdWithTower, uuid, alarmType, ardAlarmRadar.getAlarmTime(), count,1);
                                }
                                //获取报警点关联的大光电
                                ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(ardAlarmRadar.getName());
                                if(StringUtils.isNotNull(ardAlarmpointsWell) && StringUtils.isNotEmpty(ardAlarmpointsWell.getCameraId()))
                                {
                                    String cameraId = ardAlarmpointsWell.getCameraId();
                                    //如果报警点关联了光电
                                    messagesEnqueued(cameraId, uuid, alarmType, ardAlarmRadar.getAlarmTime(), count,1);
                                }
                            } else {
                                //未引导未超过3次,直接入库
                                ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
                            }
                        }
                        //获取兴趣点关联的大光电
//                            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();
//                            }
                    }
                    //endregion
                    break;
@@ -459,16 +434,29 @@
    /**
     * 消息入队
     */
    private void messagesEnqueued (String cameraId, String alarmId, String alarmType, Date alarmTime, Integer num) {
    private void messagesEnqueued(String cameraId, String alarmId, String alarmType, Date alarmTime, Integer num, Integer recordSn) {
        GuideTask guideTask = new GuideTask();
        /*配置相机ID*/
        guideTask.setCameraId(cameraId);
        /*根据配置时间配置通道*/
        String dayNightTime = redisCache.getCacheObject("sys_config:dayNightTime");
        Integer channel = ArdTool.getChannelBydayNightTime(dayNightTime);
        guideTask.setChanNum(channel);
        /*配置报警ID*/
        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);
        queueManager.addTaskToQueue(cameraId,guideTask);
        /*配置录像存储位置*/
        guideTask.setRecordSn(recordSn);
        /*消息入队*/
        queueManager.addTaskToQueue(cameraId, guideTask);
//        PriorityBlockingQueue<GuideTask> priorityBlockingQueue = GuidePriorityQueue.cameraQueueMap.get(guideTask.getCameraId());
//        priorityBlockingQueue.add(guideTask);
    }
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/QueueManager.java
@@ -13,7 +13,7 @@
/**
 * @ClassName QueueManager
 * @Description:
 * @Description: 队列管理
 * @Author 刘苏义
 * @Date 2023/6/29 21:09
 * @Version 1.0
@@ -26,6 +26,7 @@
    private QueueTaskExecutor taskExecutor;
    private Map<String, TaskThread> threadMap = new ConcurrentHashMap<>();
    /*内部静态类*/
    private static class TaskThread {
        private Thread thread;
        private GuideTask currentTask;
@@ -48,36 +49,49 @@
        }
    }
    public void addTaskToQueue(String queueName, GuideTask task) {
        PriorityBlockingQueue<GuideTask> guideTaskQueue = GuidePriorityQueue.cameraQueueMap.get(queueName);
    /**
     * 引导任务入队
     * 刘苏义
     * 2023/6/30 8:57
     */
    public void addTaskToQueue(String cameraId, GuideTask task) {
        /*通过相机ID获取引导队列,并将引导任务加入队列*/
        PriorityBlockingQueue<GuideTask> guideTaskQueue = GuidePriorityQueue.cameraQueueMap.get(cameraId);
        guideTaskQueue.add(task);
        TaskThread currentTaskThread = threadMap.get(queueName);
        /*获取该相机的当前执行线程*/
        TaskThread currentTaskThread = threadMap.get(cameraId);
        //如果队列当前线程正在运行,若入队任务优先级大于当前任务优先级,则终止当前线程
        if (currentTaskThread != null && task.getPriority() > currentTaskThread.getCurrentTask().getPriority()) {
            currentTaskThread.getThread().interrupt();
        }
        // Start a new thread if no thread is currently running for the queue
        //如果队列当前没有线程正在运行,则启动新线程
        if (currentTaskThread == null || !currentTaskThread.getThread().isAlive()) {
            Thread newThread = createThread(queueName, guideTaskQueue);
            threadMap.put(queueName, new TaskThread(newThread, task));
            Thread newThread = createThread(cameraId, guideTaskQueue);
            threadMap.put(cameraId, new TaskThread(newThread, task));
            newThread.start();
        }
    }
    /**
     * 创建线程
     * 刘苏义
     * 2023/6/30 9:04
     */
    private Thread createThread(String queueName, PriorityBlockingQueue<GuideTask> queue) {
        return new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    GuideTask task = queue.take();
                    taskExecutor.processTask(task);
                    GuidePriorityQueue.printPriorityQueue();
                    // Update the current task for the thread
                    // 更新线程的当前任务
                    TaskThread currentTaskThread = threadMap.get(queueName);
                    if (currentTaskThread != null) {
                        currentTaskThread.setCurrentTask(task);
                    }
                } catch (InterruptedException e) {
                    // Thread interrupted, exit the loop
                    //线程中断,退出循环
                    Thread.currentThread().interrupt();
                }
            }
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/QueueTaskExecutor.java
@@ -1,25 +1,83 @@
package com.ruoyi.alarm.globalAlarm.service.impl;
import com.ruoyi.alarm.globalAlarm.domain.GuideTask;
import com.ruoyi.alarm.radarAlarm.domain.ArdAlarmRadar;
import com.ruoyi.alarm.radarAlarm.service.IArdAlarmRadarService;
import com.ruoyi.alarm.tubeAlarm.domain.ArdAlarmTube;
import com.ruoyi.alarm.tubeAlarm.service.IArdAlarmTubeService;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
 * @ClassName QueueTaskExecutor
 * @Description:
 * @Description: 队列任务执行器
 * @Author 刘苏义
 * @Date 2023/6/29 21:10
 * @Version 1.0
 */
import com.ruoyi.alarm.globalAlarm.domain.GuideTask;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class QueueTaskExecutor {
    @Resource
    IHikClientService hikClientService;
    @Resource
    IArdAlarmTubeService ardAlarmTubeService;
    @Resource
    IArdAlarmRadarService ardAlarmRadarService;
    public void processTask(GuideTask guideTask) {
        System.out.println("Executing task: " + guideTask.getAlarmId());
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
            CameraCmd cmd = new CameraCmd();
            cmd.setCameraId(guideTask.getCameraId());
            cmd.setChannelNum(guideTask.getNum());
            boolean guideRes = hikClientService.guideTargetPosition(cmd);
            if (guideRes) {
                hikClientService.controlLock(cmd);//上锁
                cmd.setEnable(true);//开始录像
                hikClientService.recordToMinio(cmd);//开始录像
                Thread.sleep(30000);
                cmd.setEnable(false);//停止录像
                cmd.setUploadMinio(true);//上传minio
                String url = hikClientService.recordToMinio(cmd);//停止录像返回url
                if (StringUtils.isNotEmpty(url)) {
                    switch (guideTask.getAlarmType()) {
                        case "sys_tube_leak":
                            ArdAlarmTube ardAlarmTube = new ArdAlarmTube();
                            ardAlarmTube.setId(guideTask.getAlarmId());
                            ardAlarmTube.setRecordUrl(url);
                            ardAlarmTubeService.updateArdAlarmTube(ardAlarmTube);
                            break;
                        case "sys_radar_move":
                            ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar();
                            ardAlarmRadar.setId(guideTask.getAlarmId());
                            if (guideTask.getRecordSn().equals(1)) {
                                ardAlarmRadar.setRecordUrl1(url);
                            } else {
                                ardAlarmRadar.setRecordUrl2(url);
                            }
                            ardAlarmRadarService.updateArdAlarmRadar(ardAlarmRadar);
                            break;
                        case "sys_radar_fire":
                            ardAlarmRadar = new ArdAlarmRadar();
                            ardAlarmRadar.setId(guideTask.getAlarmId());
                            if (guideTask.getRecordSn().equals(1)) {
                                ardAlarmRadar.setRecordUrl1(url);
                            } else {
                                ardAlarmRadar.setRecordUrl2(url);
                            }
                            ardAlarmRadarService.updateArdAlarmRadar(ardAlarmRadar);
                            break;
                    }
                }
            }
        } catch (Exception ex) {
            log.info("自动引导异常:" + ex.getMessage());
        }
        System.out.println("finished task: " + guideTask.getAlarmId());
    }
}
ard-work/src/main/java/com/ruoyi/alarm/radarAlarm/domain/ArdAlarmRadar.java
@@ -73,4 +73,13 @@
     * 引导标记
     */
    private  Integer guideFlag;
    /**
     * 录像url1
     */
    private  String recordUrl1;
    /**
     * 录像url2
     */
    private  String recordUrl2;
}
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SdkTask.java
@@ -6,6 +6,7 @@
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.hiksdk.common.GlobalVariable;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import org.springframework.stereotype.Component;
@@ -46,14 +47,17 @@
            CameraCmd cmd = new CameraCmd();
            cmd.setCameraId(camera.getId());
            cmd.setChannelNum(1);
            Map<String, Object> ptz = hikClientService.getPtz(cmd);
            if(StringUtils.isNull(ptz))
            if (!GlobalVariable.loginMap.containsKey(camera.getId()))//只推送登录成功的相机
            {
                continue;
            }
            Map<String, Object> ptz = hikClientService.getPtz(cmd);
            if (StringUtils.isNull(ptz)) {
                continue;
            }
            if (ptz.size() > 0) {
                ptz.put("cameraId", camera.getId());
                ptz.put("operatorExpired",camera.getOperatorExpired());
                ptz.put("operatorExpired", camera.getOperatorExpired());
                list.add(ptz);
            }
        }