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); } }