ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/domain/GuidePriorityQueue.java
@@ -16,7 +16,7 @@ * @Date: 2023年06月29日11:18 * @Version: 1.0 **/ @Slf4j @Slf4j(topic = "guideQueue") public class GuidePriorityQueue { /** * 相机队列,每个相机一个优先级队列 ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/GlobalAlarmServiceImpl.java
@@ -343,7 +343,13 @@ int aat = ardAlarmTubeMapper.insertArdAlarmTube(ardAlarmTube); if (aat > 0) { log.debug("tube入库成功:" + ardAlarmTube); double[] coordinate=new double[]{ardAlarmTube.getLongitude(),ardAlarmTube.getLatitude()}; Double longitude = ardAlarmTube.getLongitude(); Double latitude = ardAlarmTube.getLatitude(); if(StringUtils.isNull(longitude)||StringUtils.isNull(latitude)) { return; } double[] coordinate=new double[]{longitude,latitude}; String nearbyCameraId = getNearbyCamera(new double[]{ardAlarmTube.getLongitude(), ardAlarmTube.getLatitude()}); if (StringUtils.isNotEmpty(nearbyCameraId)) { messagesEnqueued(nearbyCameraId, ardAlarmTube.getId(), "sys_tube_leak",ardAlarmTube.getCreateTime(), 1,1,coordinate); @@ -400,8 +406,11 @@ ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(alarmpointName); if(StringUtils.isNotNull(ardAlarmpointsWell) && StringUtils.isNotEmpty(ardAlarmpointsWell.getCameraId())) { String cameraId = ardAlarmpointsWell.getCameraId(); if(cameraIdWithTower.equals(cameraId)) { return; } log.info("获取到报警点关联的光电:"+cameraId); //如果报警点关联了光电 messagesEnqueued(cameraId, uuid, alarmType,ardAlarmRadar.getCreateTime(), 1,2,coordinate); @@ -427,6 +436,10 @@ if(StringUtils.isNotNull(ardAlarmpointsWell) && StringUtils.isNotEmpty(ardAlarmpointsWell.getCameraId())) { String cameraId = ardAlarmpointsWell.getCameraId(); if(cameraIdWithTower.equals(cameraId)) { return; } log.info("获取到报警点关联的光电:"+cameraId); //如果报警点关联了光电 messagesEnqueued(cameraId, uuid, alarmType,ardAlarmRadar.getCreateTime(), count,2,coordinate); ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/QueueManager.java
@@ -24,7 +24,7 @@ */ @Component @Slf4j @Slf4j(topic = "guideQueue") public class QueueManager { @Autowired @@ -64,8 +64,9 @@ PriorityBlockingQueue<GuideTask> guideTaskQueue = GuidePriorityQueue.cameraQueueMap.get(cameraId); if(StringUtils.isNull(guideTaskQueue)) { log.info("相机未初始化成功,没有队列"); log.info("相机未登录,没有队列"); } log.debug("新任务入队:"+task.getAlarmId()); guideTaskQueue.add(task); /*获取该相机的当前执行线程*/ TaskThread currentTaskThread = threadMap.get(cameraId); @@ -92,14 +93,15 @@ while (!Thread.currentThread().isInterrupted()) { try { GuideTask task = queue.take(); log.debug("取出队列数据:"+task.getAlarmId()); taskExecutor.processTask(task); // GuidePriorityQueue.printPriorityQueue(); // 更新线程的当前任务 TaskThread currentTaskThread = threadMap.get(queueName); if (currentTaskThread != null) { currentTaskThread.setCurrentTask(task); } } catch (InterruptedException e) { log.info("中断当前线程"); //线程中断,退出循环 Thread.currentThread().interrupt(); } ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/QueueTaskExecutor.java
@@ -23,7 +23,7 @@ */ @Component @Slf4j @Slf4j(topic = "guideQueue") public class QueueTaskExecutor { @Resource IHikClientService hikClientService; @@ -42,12 +42,18 @@ cmd.setExpired(30); cmd.setRecordBucketName("record"); cmd.setRecordObjectName("alarm"); log.debug("开始引导"); boolean guideRes = hikClientService.guideTargetPosition(cmd); if (guideRes) { log.debug("引导成功"); hikClientService.controlLock(cmd);//上锁 cmd.setEnable(true);//开始录像 hikClientService.recordToMinio(cmd);//开始录像 try { Thread.sleep(30000); } catch (InterruptedException e) { log.info("当前任务ID"+guideTask.getAlarmId()+"线程被终止"); } cmd.setEnable(false);//停止录像 cmd.setUploadMinio(true);//上传minio String url = hikClientService.recordToMinio(cmd);//停止录像返回url @@ -83,7 +89,7 @@ } } } catch (Exception ex) { log.info("自动引导异常:" + ex.getMessage()); log.info("线程任务异常:" + ex.getMessage()); } } } ard-work/src/main/java/com/ruoyi/constant/CamPriority.java
@@ -1,12 +1,8 @@ package com.ruoyi.constant; import com.ruoyi.alarm.globalAlarm.domain.GuidePriorityQueue; import com.ruoyi.alarm.globalAlarm.domain.GuideTask; import lombok.extern.slf4j.Slf4j; import java.util.HashMap; import java.util.Map; import java.util.PriorityQueue; /** * @Description: 相机控制优先级 ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java
@@ -8,7 +8,8 @@ @Data @ApiModel(description = "sdk命令实体类") public class CameraCmd { /*命令标识*/ String cmdType; /*相机ID*/ String cameraId; /*相机通道号*/ ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java
@@ -54,8 +54,10 @@ //聚焦模式 boolean controlFocusMode(CameraCmd cmd); //获取聚焦模式 String getFocusMode(CameraCmd cmd); //云台加热 boolean controlPTHeateRpwron(CameraCmd cmd); @@ -64,8 +66,10 @@ //配置锁定 boolean controlLock(CameraCmd cmd); //配置解锁 boolean controlUnLock(CameraCmd cmd); //获取云台锁定信息 int getPTZLockInfo(CameraCmd cmd); ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -1,13 +1,8 @@ package com.ruoyi.device.hiksdk.service.impl; import com.ruoyi.common.annotation.SdkOperate; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.constant.CamPriority; import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.device.camera.mapper.ArdCamerasMapper; import com.ruoyi.device.hiksdk.common.GlobalVariable; @@ -18,7 +13,6 @@ import com.ruoyi.device.hiksdk.service.IHikClientService; import com.ruoyi.device.hiksdk.util.hikSdkUtil.LoginResultCallBack; import com.ruoyi.device.hiksdk.util.minio.MinioUtils; import com.ruoyi.system.mapper.SysUserMapper; import com.sun.jna.Native; import com.sun.jna.Platform; import com.sun.jna.Pointer; @@ -30,6 +24,7 @@ import javax.annotation.Resource; import java.io.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.ByteBuffer; import java.text.DecimalFormat; import java.text.SimpleDateFormat; @@ -50,9 +45,6 @@ @Resource ArdCamerasMapper ardCamerasMapper; @Resource SysUserMapper sysUserMapper; private static HCNetSDK hCNetSDK; @@ -132,11 +124,8 @@ hCNetSDK.NET_DVR_Cleanup(); camera.setLoginId(-1); } if (GlobalVariable.loginMap.containsKey(camera.getId())) { GlobalVariable.loginMap.remove(camera.getId()); } GlobalVariable.loginMap.put(camera.getId(), lUserID); camera.setLoginId(lUserID); camera.setChannel((int) m_strDeviceInfo.byStartChan); return camera; @@ -242,7 +231,7 @@ /** * 是否在线 * * @param cmd * @param cmd 相机命令 */ @Override public boolean isOnLine(CameraCmd cmd) { @@ -251,8 +240,7 @@ return false; } Integer userId = GlobalVariable.loginMap.get(cameraId); boolean isOnLine = hCNetSDK.NET_DVR_RemoteControl(userId, HCNetSDK.NET_DVR_CHECK_USER_STATUS, null, 0); return isOnLine; return hCNetSDK.NET_DVR_RemoteControl(userId, HCNetSDK.NET_DVR_CHECK_USER_STATUS, null, 0); } /** @@ -277,13 +265,13 @@ return false; } Integer userId = GlobalVariable.loginMap.get(cameraId); Integer dwStop; int dwStop; if (enable) { dwStop = 0;//开启 } else { dwStop = 1;//关闭 } Integer dwPTZCommand = -1; int dwPTZCommand = -1; switch (code) { /*方向*/ case 1: @@ -350,7 +338,7 @@ /** * 设置聚焦值 * * @param cmd * @param cmd 相机命令 */ @Override @SdkOperate @@ -378,7 +366,7 @@ /** * 获取聚焦值 * * @param cmd * @param cmd 相机命令 */ @Override public Map<String, Object> getFocusPos(CameraCmd cmd) { @@ -411,7 +399,7 @@ /** * 设置预置点 * * @param cmd * @param cmd 相机命令 */ @Override @SdkOperate @@ -434,7 +422,7 @@ /** * 转到预置点 * * @param cmd * @param cmd 相机命令 */ @Override @SdkOperate @@ -481,8 +469,8 @@ if (bool) { resolution.read(); //视频输出口分辨率:0- 1024x768,1- 1280x720,2-1280x1024,3- 1680x1050,4- 1920x1080,5- 3840*2160 byte byStreamType = resolution.struNormHighRecordPara.byStreamType; int dwVideoBitrate = resolution.struNormHighRecordPara.dwVideoBitrate; // byte byStreamType = resolution.struNormHighRecordPara.byStreamType; // int dwVideoBitrate = resolution.struNormHighRecordPara.dwVideoBitrate; int byResolution = resolution.struNormHighRecordPara.byResolution; switch (byResolution) { case 0: @@ -560,7 +548,6 @@ } /** * @return * @描述 获取ptz信息 * @参数 [userId, channelNum] * @返回值 boolean @@ -584,7 +571,7 @@ boolean bool = hCNetSDK.NET_DVR_GetDVRConfig(userId, HCNetSDK.NET_DVR_GET_PTZPOS, channelNum, pioint, m_ptzPosCurrent.size(), ibrBytesReturned); if (bool) { m_ptzPosCurrent.read(); DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 // DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 //16进制转Integer后除10,保留小数点1位 //实际显示的PTZ值是获取到的十六进制值的十分之一, //如获取的水平参数P的值是0x1750,实际显示的P值为175度; @@ -704,67 +691,9 @@ now.setTime(now.getTime() + cmd.getExpired() * 1000); ardCameras.setOperatorExpired(now);//设置当前过期时间 ardCamerasMapper.updateArdCameras(ardCameras); // String cameraId = cmd.getCameraId();//申请锁的相机 // ArdCameras ardCameras = ardCamerasMapper.selectArdCamerasById(cameraId); // if (StringUtils.isNull(ardCameras)) { // return false;//找不到相机拒绝操控 // } // Integer expired = cmd.getExpired();//申请控制时长 // String operator = cmd.getOperator();//申请者 // String currentOperator = ardCameras.getOperatorId();//相机当前控制者 // Date currentExpired = ardCameras.getOperatorExpired();//相机当前过期时间 // if (currentExpired == null) { // //设置当前操作用户ID // ardCameras.setOperatorId(operator); // //设置当前过期时间 // Date now = new Date(); // now.setTime(now.getTime() + expired * 1000); // ardCameras.setOperatorExpired(now); // ardCamerasMapper.updateArdCameras(ardCameras); // } else { // //如果过期时间有值 // //如果是本人直接修改 // if (currentOperator.equals(operator)) { // //设置当前过期时间 // Date now = new Date(); // now.setTime(now.getTime() + expired * 1000); // ardCameras.setOperatorExpired(now); // ardCamerasMapper.updateArdCameras(ardCameras); // } else { // //如果非本人比较优先级 // Integer currentLevel = 0;//当前操作者的优先级 // if (CamPriority.priorityMap.containsKey(currentOperator)) { // /*当前控制者为系统报警用户*/ // currentLevel = (Integer) CamPriority.priorityMap.get(currentOperator); // } else { // /*当前控制者为普通用户*/ // SysUser sysUser = sysUserMapper.selectUserById(currentOperator); // currentLevel = sysUser.getCameraPriority(); // } // Integer operatorLevel = 0;//获取申请者的优先级 // if (CamPriority.priorityMap.containsKey(operator)) { // /*包含说明当前申请控制者为系统报警用户*/ // operatorLevel = (Integer) CamPriority.priorityMap.get(operator); // } else { // /*否则申请控制者为当前登录用户*/ // LoginUser loginUser = SecurityUtils.getLoginUser(); // SysUser user = loginUser.getUser();//获取登录用户的信息 // operatorLevel = user.getCameraPriority(); // } // //判断优先级 // if (operatorLevel > currentLevel) { // Date now = new Date(); // now.setTime(now.getTime() + expired * 60); // ardCameras.setOperatorExpired(now);//设置当前过期时间 // ardCameras.setOperatorId(operator);//设置当前用户 // ardCamerasMapper.updateArdCameras(ardCameras); // } else { // return false;//优先级低无法上锁 // } // } // } return true; } /** * @描述 操控解锁 * @参数 [userId, channelNum] @@ -778,13 +707,11 @@ String cameraId = cmd.getCameraId();//申请解锁的相机 String operator = cmd.getOperator();//申请者 ArdCameras ardCameras = ardCamerasMapper.selectArdCamerasById(cameraId); if(ardCameras.getOperatorId().equals(operator)) { if (ardCameras.getOperatorId().equals(operator)) { //如果解锁相机的当前用户是申请者,则清空该相机的过期时间 ardCameras.setOperatorExpired(null); int i = ardCamerasMapper.updateArdCameras(ardCameras); if(i>0) { if (i > 0) { log.debug(cameraId+"--解锁成功"); } } @@ -1046,8 +973,7 @@ return bool; } public String getFocusMode(CameraCmd cmd) { public String getFocusMode(CameraCmd cmd) { String cameraId = cmd.getCameraId(); Integer channelNum = cmd.getChannelNum(); if (!GlobalVariable.loginMap.containsKey(cameraId)) { @@ -1065,6 +991,7 @@ log.info("当前聚焦模式:" + struFocusMode.byFocusMode); return String.valueOf(struFocusMode.byFocusMode); } /** * @描述 云台加热开关 * @参数 [userId, channelNum, enable] @@ -1434,4 +1361,5 @@ return ""; } } } ruoyi-admin/src/main/resources/logback.xml
@@ -147,6 +147,19 @@ <pattern>${log.pattern}</pattern> </encoder> </appender> <!--guideQueue日志输出--> <appender name="guideQueue" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/guideQueue.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--按天回滚daily--> <fileNamePattern>${log.path}/guideQueue.%d{yyyy-MM-dd}.log</fileNamePattern> <!--日志最大的历史60天--> <maxHistory>60</maxHistory> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!--PatrolInspectionTask日志输出--> <appender name="PatrolInspectionTask" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/PatrolInspectionTask.log</file> @@ -207,4 +220,8 @@ <logger name="mqtt" level="DEBUG"> <appender-ref ref="mqtt"/> </logger> <!--guideQueue日志打印等级--> <logger name="guideQueue" level="DEBUG"> <appender-ref ref="guideQueue"/> </logger> </configuration> ruoyi-common/src/main/java/com/ruoyi/common/annotation/SdkOperate.java
@@ -6,5 +6,4 @@ @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SdkOperate { } ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java
@@ -1,5 +1,6 @@ package com.ruoyi.framework.aspectj; import com.ruoyi.common.annotation.SdkOperate; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; @@ -10,13 +11,18 @@ import com.ruoyi.device.camera.service.IArdCamerasService; import com.ruoyi.system.service.ISysUserService; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import javax.annotation.Nullable; import javax.annotation.Resource; import java.lang.reflect.Method; import java.util.Date; import static jdk.nashorn.internal.runtime.regexp.joni.Config.log; @@ -43,12 +49,14 @@ @Around("dsPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); Boolean result = controlScopeFilter(point); if (result) { log.debug("已获取相机控制权"); log.debug("已获取相机控制权--" + method.getName()); return point.proceed(); } else { log.debug("未获取相机控制权"); log.debug("未获取相机控制权--" + method.getName()); return false;//代替目标方法的返回值 } } @@ -137,6 +145,5 @@ } } } } } ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/AlarmTask.java
@@ -1,5 +1,7 @@ package com.ruoyi.quartz.task; 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.stealAlarm.domain.ArdAlarmStealelec; import com.ruoyi.alarm.stealAlarm.service.IStealElecAlarmService; @@ -15,6 +17,7 @@ import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.PriorityBlockingQueue; import static com.ruoyi.common.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS; @@ -26,7 +29,7 @@ * @Version: 1.0 **/ @Component("AlarmTask") @Slf4j(topic = "AlarmTask") @Slf4j public class AlarmTask { /** @@ -44,4 +47,16 @@ WebSocketUtils.sendMessageAll(stringIntegerMap); } } /** * 定时清空引导队列 * 刘苏义 * 2023/7/1 10:41 */ public void clearGuideQueue() { log.info("定时清理引导队列"); for(PriorityBlockingQueue<GuideTask> guideQueue:GuidePriorityQueue.cameraQueueMap.values()) { guideQueue.clear(); } } }