ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/GlobalAlarmServiceImpl.java
@@ -16,21 +16,21 @@ import com.ruoyi.alarmpoints.well.mapper.ArdAlarmpointsWellMapper; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.tools.ArdTool; import com.ruoyi.utils.tools.ArdTool; import com.ruoyi.utils.tools.GisTool; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.device.camera.mapper.ArdCamerasMapper; import com.ruoyi.device.hiksdk.common.GlobalVariable; import com.ruoyi.device.hiksdk.config.MinioClientSingleton; import com.ruoyi.device.hiksdk.service.IHikClientService; import com.ruoyi.device.hiksdk.util.hikSdkUtil.GisUtil; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.utils.tube.GeoPoint; import com.ruoyi.utils.tube.TubeTools; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; @@ -63,6 +63,14 @@ private ArdCamerasMapper ardCamerasMapper; @Resource private IHikClientService hikClientService; /** * @描述 按条件查询报警 * @参数 [condition] * @返回值 java.util.List<com.ruoyi.alarm.globalAlarm.domain.GlobalAlarmData> * @创建人 刘苏义 * @创建时间 2023/6/15 15:48 * @修改人和其它信息 */ @Override public List<GlobalAlarmData> selectAlarmLogs(GlobalAlarmCondition condition) { String refreshTime = configService.selectConfigByKey("refreshTime"); @@ -103,14 +111,21 @@ return null; } } /** * @描述 按条件更新查看时间 * @参数 [condition] * @返回值 java.lang.Object * @创建人 刘苏义 * @创建时间 2023/6/15 15:48 * @修改人和其它信息 */ @Override public Object updateAlarmViewTime(GlobalAlarmCondition condition) { SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); switch (condition.getCommand()) { case 1001: ArdAlarmStealelec ardAlarmStealelec = ardAlarmStealelecMapper.selectByPrimaryKey(condition.getId()); if(StringUtils.isNotNull(ardAlarmStealelec)) { if (StringUtils.isNotNull(ardAlarmStealelec)) { String describe = ardAlarmStealelec.getDescribe(); String startTime = fmt.format(ardAlarmStealelec.getStartTime()); int i = ardAlarmStealelecMapper.updateViewTimeByDescribe(describe, startTime, DateUtils.getTime()); @@ -118,16 +133,24 @@ } case 1014: ArdAlarmTube ardAlarmTube = ardAlarmTubeMapper.selectArdAlarmTubeById(condition.getId()); if(StringUtils.isNotNull(ardAlarmTube)) { if (StringUtils.isNotNull(ardAlarmTube)) { String tubeId = ardAlarmTube.getTubeId(); String alarmTime = fmt.format(ardAlarmTube.getAlarmTime()); int i = ardAlarmTubeMapper.updateViewTimeByTubeId(tubeId, alarmTime, DateUtils.getTime()); return ardAlarmTube; } default: return null; default: return null; } } /** * @描述 异步处理接收的报警 * @参数 [topic, message] * @返回值 void * @创建人 刘苏义 * @创建时间 2023/6/15 15:46 * @修改人和其它信息 */ @Override @Async("alarmExecutor") public void receiveAlarm(String topic, String message) { @@ -135,23 +158,39 @@ String simpleUUID = IdUtils.simpleUUID(); switch (topic) { case "stealelec": //region 处理盗电报警 ArdAlarmStealelec ardAlarmStealelec = JSONObject.parseObject(message, ArdAlarmStealelec.class); ArdAlarmpointsWell well = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(ardAlarmStealelec.getDescribe()); if (well != null) { ardAlarmStealelec.setLongitude(well.getLongitude()); ardAlarmStealelec.setLatitude(well.getLatitude()); ardAlarmStealelec.setDeptId(well.getDeptId()); ardAlarmStealelec.setAltitude(well.getAltitude()); } ArdAlarmStealelec existe = ardAlarmStealelecMapper.selectByPrimaryKey(ardAlarmStealelec.getId()); if (StringUtils.isNotNull(existe)) { return; } int aas = ardAlarmStealelecMapper.insert(ardAlarmStealelec); int aas = ardAlarmStealelecMapper.insertArdAlarmStealelec(ardAlarmStealelec); if (aas > 0) { log.info("stealelec入库成功:" + ardAlarmStealelec); //引导录像 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()}); String url = guideCamera(cmd); if (StringUtils.isNotEmpty(url)) { //更新录像 ardAlarmStealelec.setRecordUrl(url); ardAlarmStealelecMapper.updateArdAlarmStealelec(ardAlarmStealelec); } } //endregion break; case "tube": //region 处理管线泄露报警 ArdAlarmTube ardAlarmTube = JSONObject.parseObject(message, ArdAlarmTube.class); ardAlarmTube.setId(simpleUUID); ArdTubesDetails atd = new ArdTubesDetails(); @@ -173,81 +212,101 @@ } int aat = ardAlarmTubeMapper.insertArdAlarmTube(ardAlarmTube); if (aat > 0) { log.info("tube入库成功:" + ardAlarmTube); //查询所有大光电 ArdCameras ardCamera = new ArdCameras(); ardCamera.setGdtype("1"); List<ArdCameras> ardCamerasList = ardCamerasMapper.selectArdCamerasList(ardCamera); //统计所有大光电可视范围内与报警点的距离 Map<String, Double> distanceMap = new HashMap<>(); for (ArdCameras camera : ardCamerasList) { double distance = GisUtil.getDistance(ardAlarmTube.getLongitude(), ardAlarmTube.getLatitude(), camera.getLongitude(), camera.getLatitude()); if (distance <= camera.getCamMaxVisibleDistance()) { distanceMap.put(camera.getId(), distance); } } if(distanceMap.size()<0) { return; } //获取距离字典中最近的一个相机ID String minDistanceCameraId = ArdTool.getKeyByMinValue(distanceMap); //引导光电 log.debug("tube入库成功:" + ardAlarmTube); //引导录像 CameraCmd cmd = new CameraCmd(); cmd.setCameraId(minDistanceCameraId); cmd.setChannelNum(1); cmd.setTargetPosition(new double[]{ardAlarmTube.getLongitude(), ardAlarmTube.getLatitude()}); cmd.setRecordBucketName("record"); cmd.setRecordObjectName("tube"); cmd.setOperator("sys_tube_leak"); cmd.setExpired(30); boolean guideRes = hikClientService.setTargetPosition(cmd); if(guideRes) { hikClientService.controlLock(cmd); cmd.setEnable(true); cmd.setRecordBucketName("record"); String time = new SimpleDateFormat("yyyyMMdd").format(new Date()); String recordName = minDistanceCameraId + "/" + time + "/" + simpleUUID + ".mp4"; cmd.setRecordObjectName(recordName); hikClientService.recordToMinio(cmd); GlobalVariable.threadMap.put(minDistanceCameraId,Thread.currentThread().getName());//将相机id与当前处理线程名称绑定 Thread.sleep(30000); String thread = GlobalVariable.threadMap.get(minDistanceCameraId); String currentThread = Thread.currentThread().getName(); //判断相机绑定线程是否是当前线程,如果是,停止录像,如果不是,说明相机被其他线程抢占,不停止录像 if(thread.equals(currentThread)) { cmd.setEnable(false); cmd.setUploadMinio(true); hikClientService.recordToMinio(cmd); //更新录像 String url = MinioClientSingleton.domainUrl + "/" + cmd.getRecordBucketName() + "/" + recordName; ardAlarmTube.setRecordUrl(url); ardAlarmTubeMapper.updateArdAlarmTube(ardAlarmTube); } cmd.setTargetPosition(new double[]{ardAlarmTube.getLongitude(), ardAlarmTube.getLatitude(), ardAlarmTube.getAltitude()}); String url = guideCamera(cmd); //更新录像 if (StringUtils.isNotEmpty(url)) { ardAlarmTube.setRecordUrl(url); ardAlarmTubeMapper.updateArdAlarmTube(ardAlarmTube); } } //endregion break; } } catch (Exception ex) { log.error("接收报警异常:"+ex.getMessage()); } catch (Exception ex) { log.error("接收报警异常:" + ex.getMessage()); } } /** * @描述 引导最近的大光电指向目标 * @参数 [targetPosition] * @返回值 java.lang.String * @创建人 刘苏义 * @创建时间 2023/6/15 11:55 * @修改人和其它信息 */ private String guideCamera(CameraCmd cmd) { String url = ""; try { //获取所有大光电 List<ArdCameras> ardCamerasList = ardCamerasMapper.selectArdCamerasList(new ArdCameras("1")); //统计所有大光电可视范围内与报警点的距离 Map<String, Double> distanceMap = 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 (distanceMap.size() > 0) { log.debug("尝试查找最近光电"); //获取距离字典中最近的一个相机ID String minDistanceCameraId = ArdTool.getKeyByMinValue(distanceMap); log.debug("查找到最近光电:"+minDistanceCameraId+",尝试引导"); //引导光电 cmd.setCameraId(minDistanceCameraId); cmd.setChannelNum(1); boolean guideRes = hikClientService.guideTargetPosition(cmd); if (guideRes) { log.debug("引导成功,尝试录像"); hikClientService.controlLock(cmd);//上锁 cmd.setEnable(true);//开始录像 hikClientService.recordToMinio(cmd);//开始录像 GlobalVariable.threadMap.put(minDistanceCameraId, Thread.currentThread().getName());//将相机id与当前处理线程名称绑定 Thread.sleep(cmd.getExpired() * 1000);//录像时长 String thread = GlobalVariable.threadMap.get(minDistanceCameraId); String currentThread = Thread.currentThread().getName(); //判断相机绑定线程是否是当前线程,如果是,停止录像,如果不是,说明相机被其他线程抢占,不停止录像 if (thread.equals(currentThread)) { cmd.setEnable(false);//停止录像 cmd.setUploadMinio(true);//上传minio url = hikClientService.recordToMinio(cmd);//停止录像返回url } } } else { log.debug("未查找到最近光电"); } } catch (Exception ex) { log.error("引导异常:" + ex.getMessage()); } return url; } /** * @描述 查询所有报警的当前数量 * @参数 [] * @返回值 java.util.Map<java.lang.String,java.lang.Integer> * @返回值 java.util.Map<java.lang.String, java.lang.Integer> * @创建人 刘苏义 * @创建时间 2023/6/13 16:30 * @修改人和其它信息 */ @Override public Map<String, Integer> selectAlarmLogsCount() { Map<String, Integer> countMap=new HashMap<>(); Map<String, Integer> countMap = new HashMap<>(); String refreshTime = configService.selectConfigByKey("refreshTime"); int count1001 = ardAlarmStealelecMapper.selectCountByStartTime(refreshTime); countMap.put("1001",count1001); countMap.put("1001", count1001); int count1014 = ardAlarmTubeMapper.selectCountByStartTime(refreshTime); countMap.put("1014 ",count1014); countMap.put("1014 ", count1014); return countMap; } } ard-work/src/main/java/com/ruoyi/alarm/stealAlarm/domain/ArdAlarmStealelec.java
@@ -94,4 +94,9 @@ * 未读报警数量 */ private Integer count; /** * 引导录像url */ @Excel(name = "引导录像url") private String recordUrl; } ard-work/src/main/java/com/ruoyi/alarm/stealAlarm/mapper/ArdAlarmStealelecMapper.java
@@ -2,6 +2,7 @@ import com.ruoyi.alarm.globalAlarm.domain.GlobalAlarmCondition; import com.ruoyi.alarm.stealAlarm.domain.ArdAlarmStealelec; import com.ruoyi.alarm.tubeAlarm.domain.ArdAlarmTube; import org.apache.ibatis.annotations.Param; import java.util.Date; @@ -9,11 +10,18 @@ public interface ArdAlarmStealelecMapper{ int insert(ArdAlarmStealelec record); int insertArdAlarmStealelec(ArdAlarmStealelec record); ArdAlarmStealelec selectByPrimaryKey(String id); List<ArdAlarmStealelec> selectRealByCondition(@Param("refreshTime")String refreshTime,@Param("deptId")Long deptId); List<ArdAlarmStealelec> selectHistoryByCondition(GlobalAlarmCondition condition); List<ArdAlarmStealelec> selectListAllByCommand(@Param("refreshTime")String refreshTime); int selectCountByStartTime(@Param("refreshTime")String refreshTime); int updateViewTimeByDescribe(@Param("describe")String describe,@Param("alarmTime") String alarmTime,@Param("viewTime") String viewTime); /** * 修改防盗电报警 * * @param ardAlarmStealelec 防盗电报警 * @return 结果 */ public int updateArdAlarmStealelec(ArdAlarmStealelec ardAlarmStealelec); } ard-work/src/main/java/com/ruoyi/alarm/stealAlarm/service/impl/IStealElecAlarmServiceImpl.java
@@ -80,7 +80,7 @@ wd.setLatitude(well.getLatitude()); wd.setDeptId(well.getDeptId()); } int insert = ardAlarmStealelecMapper.insert(wd); int insert = ardAlarmStealelecMapper.insertArdAlarmStealelec(wd); if (insert > 0) { log.info("数据插入成功:" + wd.getId()); } else { ard-work/src/main/java/com/ruoyi/constant/CamPriority.java
对比新文件 @@ -0,0 +1,21 @@ package com.ruoyi.constant; import java.util.HashMap; import java.util.Map; /** * @Description: 相机控制优先级 * @ClassName: sdkPriority * @Author: 刘苏义 * @Date: 2023年05月23日11:25 * @Version: 1.0 **/ public class CamPriority { public static Map<String,Object> priorityMap=new HashMap<>(); static { priorityMap.put("sys_radar_fire",999);//雷达防火报警 priorityMap.put("sys_tube_leak",998);//管线泄露报警 priorityMap.put("sys_steal_elec",997);//盗电报警 priorityMap.put("sys_patrol_inspect",1);//巡检 } } ard-work/src/main/java/com/ruoyi/constant/sdkPriority.java
文件已删除 ard-work/src/main/java/com/ruoyi/device/camera/domain/ArdCameras.java
@@ -20,7 +20,10 @@ @NoArgsConstructor public class ArdCameras extends BaseEntity { private static final long serialVersionUID = 1L; public ArdCameras(String gdtype) { this.gdtype=gdtype; } /** * id */ ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java
@@ -26,8 +26,6 @@ /*PTZ值*/ Map<String,Double>ptzMap; /*相机经纬度*/ // double[] camPosition; /*目标经纬度*/ double[] targetPosition; ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java
@@ -1,7 +1,5 @@ package com.ruoyi.device.camera.service.impl; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -10,9 +8,7 @@ import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.tools.ArdTool; import com.ruoyi.utils.tools.ArdTool; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.mapper.ArdCamerasMapper; import com.ruoyi.device.camera.service.IArdCamerasService; ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java
@@ -170,7 +170,7 @@ @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.targetPosition"}) public @ResponseBody AjaxResult setTargetPosition(@RequestBody CameraCmd cmd) { return toAjax(sdk.setTargetPosition(cmd)); return toAjax(sdk.guideTargetPosition(cmd)); } ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java
@@ -88,8 +88,8 @@ String record(CameraCmd cmd); //手动录像 void recordToMinio(CameraCmd cmd); String recordToMinio(CameraCmd cmd); //引导目标位置 boolean setTargetPosition(CameraCmd cmd); boolean guideTargetPosition(CameraCmd cmd); } ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -6,13 +6,13 @@ import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.constant.sdkPriority; 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; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.hiksdk.config.MinioClientSingleton; import com.ruoyi.device.hiksdk.domain.recordInfo; import com.ruoyi.device.hiksdk.util.hikSdkUtil.GisUtil; import com.ruoyi.device.hiksdk.util.hikSdkUtil.HCNetSDK; import com.ruoyi.device.hiksdk.service.IHikClientService; @@ -24,7 +24,6 @@ import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import sun.misc.BASE64Encoder; @@ -36,7 +35,6 @@ import java.text.SimpleDateFormat; import java.util.*; import static com.ruoyi.device.hiksdk.common.GlobalVariable.threadMap; import static com.ruoyi.device.hiksdk.util.hikSdkUtil.HCNetSDK.*; /** @@ -655,7 +653,7 @@ @Override @SdkOperate public boolean setTargetPosition(CameraCmd cmd) { public boolean guideTargetPosition(CameraCmd cmd) { String cameraId = cmd.getCameraId(); Integer channelNum = cmd.getChannelNum(); if (!GlobalVariable.loginMap.containsKey(cameraId)) { @@ -728,18 +726,18 @@ } else { //如果非本人比较优先级 Integer currentLevel = 0;//当前操作者的优先级 if (sdkPriority.priorityMap.containsKey(currentOperator)) { if (CamPriority.priorityMap.containsKey(currentOperator)) { /*当前控制者为系统报警用户*/ currentLevel = (Integer) sdkPriority.priorityMap.get(currentOperator); currentLevel = (Integer) CamPriority.priorityMap.get(currentOperator); } else { /*当前控制者为普通用户*/ SysUser sysUser = sysUserMapper.selectUserById(currentOperator); currentLevel = sysUser.getCameraPriority(); } Integer operatorLevel = 0;//获取申请者的优先级 if (sdkPriority.priorityMap.containsKey(operator)) { if (CamPriority.priorityMap.containsKey(operator)) { /*包含说明当前申请控制者为系统报警用户*/ operatorLevel = (Integer) sdkPriority.priorityMap.get(operator); operatorLevel = (Integer) CamPriority.priorityMap.get(operator); } else { /*否则申请控制者为当前登录用户*/ LoginUser loginUser = SecurityUtils.getLoginUser(); @@ -1307,14 +1305,14 @@ } @Override public void recordToMinio(CameraCmd cmd) { public String recordToMinio(CameraCmd cmd) { try { String cameraId = cmd.getCameraId(); Integer channelNum = cmd.getChannelNum(); String path = FileUtils.createFile("D:/recordTemp/" + cameraId + ".mp4"); boolean enable = cmd.isEnable(); if (!GlobalVariable.loginMap.containsKey(cameraId)) { return; return ""; } Integer userId = GlobalVariable.loginMap.get(cameraId); //强制I帧结构体对象 @@ -1342,40 +1340,47 @@ Integer lRealHandle = GlobalVariable.previewMap.get(cameraId); hCNetSDK.NET_DVR_StopRealPlay(lRealHandle); GlobalVariable.previewMap.remove(cameraId); log.info("录像停止"); log.debug("停止当前录像"); } int lRealHandle = hCNetSDK.NET_DVR_RealPlay_V40(userId, previewinfo, null, null); if (lRealHandle == -1) { log.error("取流失败" + hCNetSDK.NET_DVR_GetLastError()); return; return ""; } log.info("取流成功"); GlobalVariable.threadMap.put(cameraId,Thread.currentThread().getName()); log.debug("取流成功"); GlobalVariable.threadMap.put(cameraId, Thread.currentThread().getName()); GlobalVariable.previewMap.put(cameraId, lRealHandle); if (!hCNetSDK.NET_DVR_SaveRealData_V30(GlobalVariable.previewMap.get(cameraId), 2, path)) { log.error("保存视频文件到临时文件夹失败 错误码为: " + hCNetSDK.NET_DVR_GetLastError()); return; return ""; } log.info("录像开始"); log.debug("录像开始"); } else { if (GlobalVariable.previewMap.containsKey(cameraId)) { Integer lRealHandle = GlobalVariable.previewMap.get(cameraId); hCNetSDK.NET_DVR_StopRealPlay(lRealHandle); GlobalVariable.previewMap.remove(cameraId); } log.info("录像停止"); log.debug("录像停止"); //存入minio String BucketName = cmd.getRecordBucketName(); String ObjectName = cmd.getRecordObjectName(); String ContentType = "video/MP4"; FileInputStream stream = new FileInputStream(path); boolean b = MinioUtils.uploadObject(BucketName, ObjectName, stream, stream.available(), ContentType); String simpleUUID = IdUtils.simpleUUID(); String time = new SimpleDateFormat("yyyyMMdd").format(new Date()); String recordName = cameraId + "/" + time + "/" + ObjectName +"_"+ simpleUUID + ".mp4"; boolean b = MinioUtils.uploadObject(BucketName, recordName, stream, stream.available(), ContentType); if (b) { log.info("上传文件成功!" + MinioClientSingleton.domainUrl + "/" + BucketName + "/" + ObjectName); String url = MinioClientSingleton.domainUrl + "/" + BucketName + "/" + recordName; log.debug("上传文件成功!" + url); return url; } } return ""; } catch (Exception ex) { log.error("录像异常" + ex.getMessage()); return ""; } } } ard-work/src/main/java/com/ruoyi/inspect/controller/ArdVideoInspectTaskController.java
@@ -3,6 +3,7 @@ import java.util.List; import javax.servlet.http.HttpServletResponse; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.common.utils.uuid.UUID; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -87,7 +88,7 @@ @Log(title = "视频巡检任务", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody ArdVideoInspectTask ardVideoInspectTask) { ardVideoInspectTask.setId(UUID.randomUUID().toString()); ardVideoInspectTask.setId(IdUtils.simpleUUID()); return toAjax(ardVideoInspectTaskService.insertArdVideoInspectTask(ardVideoInspectTask)); } ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java
@@ -450,7 +450,7 @@ cmd.setTargetPosition(targetPositon); cmd.setOperator("sys_patrol_inspect"); cmd.setExpired(step.getRecordingTime()*60); boolean setTargetPosition = hikClientService.setTargetPosition(cmd); boolean setTargetPosition = hikClientService.guideTargetPosition(cmd); if (setTargetPosition) { /*控制相机巡检成功,开始录像*/ cmd.setEnable(true);//启动录像 @@ -503,7 +503,7 @@ cmd.setTargetPosition(targetPositon); cmd.setOperator("sys_patrol_inspect"); cmd.setExpired(step.getRecordingTime()*60); boolean setTargetPosition = hikClientService.setTargetPosition(cmd); boolean setTargetPosition = hikClientService.guideTargetPosition(cmd); if (!setTargetPosition) { /*控制失败,当前步骤启动时间置null*/ ardVideoInspectTask.setCurrentStepStartTime(""); @@ -538,13 +538,10 @@ cmd.setChannelNum(channel); cmd.setOperator("sys_patrol_inspect"); cmd.setEnable(false);//停止录像 String uuid = UUID.randomUUID().toString().replace("-", ""); String time = new SimpleDateFormat("yyyyMMdd").format(new Date()); String recordName = cameraId + "/" + time + "/" + uuid + ".mp4"; cmd.setRecordBucketName("record"); cmd.setRecordObjectName(recordName); cmd.setRecordObjectName("inspect"); cmd.setUploadMinio(true); hikClientService.recordToMinio(cmd); String url= hikClientService.recordToMinio(cmd); /*插入巡检记录*/ ArdVideoInspectRecord ardVideoInspectRecord = new ArdVideoInspectRecord(); ardVideoInspectRecord.setStepId(step.getId()); @@ -556,7 +553,6 @@ Date currentStepStopDate = DateUtils.addMinutes(currentStepStartDate, step.getRecordingTime()); ardVideoInspectRecord.setStartTime(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, currentStepStartDate)); ardVideoInspectRecord.setEndTime(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, currentStepStopDate)); String url = MinioClientSingleton.domainUrl + "/" + cmd.getRecordBucketName() + "/" + recordName; ardVideoInspectRecord.setRecordFilePath(url); ardVideoInspectRecordMapper.insertArdVideoInspectRecord(ardVideoInspectRecord); } ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTask.java
@@ -37,7 +37,7 @@ public void run() { while (isRunning) { // 巡检任务的具体逻辑 log.debug("巡检任务执行中:" + taskId); log.debug("手动巡检任务执行中:" + taskId); ArdVideoInspectTaskServiceImpl ardVideoInspectTaskService = SpringUtils.getBean(ArdVideoInspectTaskServiceImpl.class); ardVideoInspectTaskService.manualTaskRun(taskId); try { ard-work/src/main/java/com/ruoyi/utils/tools/ArdTool.java
文件名从 ruoyi-common/src/main/java/com/ruoyi/common/utils/tools/ArdTool.java 修改 @@ -1,4 +1,4 @@ package com.ruoyi.common.utils.tools; package com.ruoyi.utils.tools; import java.lang.reflect.Field; import java.util.*; ard-work/src/main/java/com/ruoyi/utils/tools/GisTool.java
对比新文件 @@ -0,0 +1,32 @@ package com.ruoyi.utils.tools; import org.gavaghan.geodesy.Ellipsoid; import org.gavaghan.geodesy.GeodeticCalculator; import org.gavaghan.geodesy.GlobalCoordinates; /** * @Description: * @ClassName: GisTool * @Author: 刘苏义 * @Date: 2023年06月15日13:26 * @Version: 1.0 **/ public class GisTool { public static GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); /** * 根据经纬度,计算两点间的距离 * * @param From 第一个点的经纬度 * @param To 第二个点的经纬度 * @return 返回距离 单位米 */ public static double getDistance(double[] From, double[] To) { double longitudeFrom = From[0]; double latitudeFrom = From[1]; double longitudeTo = To[0]; double latitudeTo = To[1]; GlobalCoordinates source = new GlobalCoordinates(latitudeFrom, longitudeFrom); GlobalCoordinates target = new GlobalCoordinates(latitudeTo, longitudeTo); return geodeticCalculator.calculateGeodeticCurve(Ellipsoid.WGS84, source, target).getEllipsoidalDistance(); } } ard-work/src/main/java/com/ruoyi/utils/tube/TubeTools.java
@@ -1,6 +1,7 @@ package com.ruoyi.utils.tube; import com.ruoyi.alarmpoints.tube.domain.ArdTubesDetails; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.gavaghan.geodesy.Ellipsoid; import org.gavaghan.geodesy.GeodeticCalculator; @@ -61,6 +62,11 @@ */ public static GeoPoint CalculateCoordinates(List<ArdTubesDetails> ardTubesDetails, Integer alarmPointDistance) { try { if(StringUtils.isNull(alarmPointDistance)) { log.debug("报警点距离为空,无法计算坐标"); return null; } Comparator<ArdTubesDetails> comparator = Comparator.comparingInt(person -> Integer.parseInt(person.getInflectionPointNumber())); // 使用Collections.sort方法进行排序 Collections.sort(ardTubesDetails, comparator); GeoPoint point0 = new GeoPoint(ardTubesDetails.get(0).getLongitude(), ardTubesDetails.get(0).getLatitude(), ardTubesDetails.get(0).getAltitude() - ardTubesDetails.get(0).getDepth()); ard-work/src/main/resources/mapper/alarm/ArdAlarmStealelecMapper.xml
@@ -16,7 +16,7 @@ <result column="dept_id" property="deptId"/> </resultMap> <sql id="Base_Column_List"> id, name, describe, catalog_text, description, start_time, end_time,view_time,longitude,latitude,create_by,create_time,user_id,dept_id id, name, describe, catalog_text, description, start_time, end_time,view_time,longitude,latitude,altitude,create_by,create_time,user_id,dept_id </sql> <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap"> select @@ -88,9 +88,26 @@ and start_time<=#{alarmTime} and view_time is null </update> <insert id="insert" parameterType="ArdAlarmStealelec"> <update id="updateArdAlarmStealelec" parameterType="ArdAlarmStealelec"> update ard_alarm_stealelec <trim prefix="SET" suffixOverrides=","> <if test="name != null">name = #{name},</if> <if test="describe != null">describe = #{describe},</if> <if test="catalogText != null">catalog_text = #{catalogText},</if> <if test="description != null">description = #{description},</if> <if test="startTime != null">start_time = #{startTime},</if> <if test="endTime != null">end_time = #{endTime},</if> <if test="longitude != null">longitude = #{longitude},</if> <if test="latitude != null">latitude = #{latitude},</if> <if test="altitude != null">altitude = #{altitude},</if> <if test="recordUrl != null">record_url = #{recordUrl},</if> <if test="viewTime != null">view_time = #{viewTime},</if> </trim> where id = #{id} </update> <insert id="insertArdAlarmStealelec" parameterType="ArdAlarmStealelec"> insert into ard_alarm_stealelec(<include refid="Base_Column_List"/>) values (#{id}, #{name},#{describe},#{catalogText},#{description}, #{startTime}, #{endTime}, #{viewTime},#{longitude},#{latitude},#{createBy},#{createTime},#{userId},#{deptId}) #{viewTime},#{longitude},#{latitude},#{altitude},#{createBy},#{createTime},#{userId},#{deptId}) </insert> </mapper> ruoyi-admin/src/main/resources/logback.xml
@@ -188,7 +188,7 @@ <appender-ref ref="minio"/> </logger> <!--hiksdk日志打印等级--> <logger name="hikSdk" level="INFO"> <logger name="hikSdk" level="DEBUG"> <appender-ref ref="hikSdk"/> </logger> <!--盗电报警日志打印等级--> @@ -204,7 +204,7 @@ <appender-ref ref="PatrolInspectionTask"/> </logger> <!--mqtt日志打印等级--> <logger name="mqtt" level="INFO"> <logger name="mqtt" level="DEBUG"> <appender-ref ref="mqtt"/> </logger> </configuration> ruoyi-common/pom.xml
@@ -146,6 +146,12 @@ <version>1.6.2</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.gavaghan</groupId> <artifactId>geodesy</artifactId> <version>1.1.3</version> <scope>compile</scope> </dependency> </dependencies> </project> ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java
@@ -4,12 +4,11 @@ import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.constant.sdkPriority; import com.ruoyi.constant.CamPriority; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.device.camera.service.IArdCamerasService; import com.ruoyi.system.service.ISysUserService; import org.apache.ibatis.jdbc.Null; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -40,8 +39,8 @@ @Around("dsPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { Boolean resultMap = dataScopeFilter(point); if (resultMap) { Boolean result = controlScopeFilter(point); if (result) { return point.proceed(); } else { return false;//代替目标方法的返回值 @@ -53,7 +52,7 @@ * * @param joinPoint 切点 */ public Boolean dataScopeFilter(ProceedingJoinPoint joinPoint) { public Boolean controlScopeFilter(ProceedingJoinPoint joinPoint) { //获取请求控制相机的命令信息 CameraCmd cmd = (CameraCmd) joinPoint.getArgs()[0]; String operator = cmd.getOperator();//申请者 @@ -84,18 +83,18 @@ } else { /*当前相机有人控制并且配置了过期时间,先判断优先级,优先级高允许控制*/ Integer currentLevel = 0;//当前相机的操作者的优先级 if (sdkPriority.priorityMap.containsKey(currentOperator)) { if (CamPriority.priorityMap.containsKey(currentOperator)) { /*当前控制者为系统报警用户*/ currentLevel = (Integer) sdkPriority.priorityMap.get(currentOperator); currentLevel = (Integer) CamPriority.priorityMap.get(currentOperator); } else { /*当前控制者为普通用户*/ SysUser sysUser = sysUserService.selectUserById(currentOperator); currentLevel = sysUser.getCameraPriority(); } Integer operatorLevel = 0;//获取申请者的优先级 if (sdkPriority.priorityMap.containsKey(operator)) { if (CamPriority.priorityMap.containsKey(operator)) { /*包含说明当前申请控制者为系统报警用户*/ operatorLevel = (Integer) sdkPriority.priorityMap.get(operator); operatorLevel = (Integer) CamPriority.priorityMap.get(operator); } else { /*否则申请控制者为当前登录用户*/ LoginUser loginUser = SecurityUtils.getLoginUser(); @@ -111,7 +110,6 @@ return true; } else { /*如果申请者优先级低,则判断过期时间*/ Date now = new Date(); if (currentExpired == null) { /*当前相机未配置过期时间,可控*/ ardCameras.setOperatorId(operator); @@ -119,7 +117,7 @@ ardCamerasService.updateArdCameras(ardCameras);//更新相机当前控制者 return true; } else { if (now.before(currentExpired)) { if (new Date().before(currentExpired)) { /*时间未过期,不可控*/ return false; } else { ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/AlarmTask.java
@@ -28,98 +28,15 @@ public class AlarmTask { @Resource IStealElecAlarmService IStealElecAlarmService; @Resource ISysUserService sysUserService; @Resource IGlobalAlarmService globalAlarmService; /** * @描述 盗电报警实时推送任务 * @描述 定时推送所有报警的点位数量 * @参数 [] * @返回值 void * @创建人 刘苏义 * @创建时间 2023/3/6 15:10 * @创建时间 2023/6/15 15:43 * @修改人和其它信息 */ public void stealElecAlarmPush() { log.info("盗电报警推送开始"); // 开始时间 long stime = System.currentTimeMillis(); try { for (String userId : ONLINE_USER_SESSIONS.keySet()) { SysUser sysUser = sysUserService.selectUserById(userId); List<ArdAlarmStealelec> alarms = IStealElecAlarmService.getRealAlarm(sysUser.getDeptId()); Map<String, Object> map = new HashMap<>(); List<ArdAlarmStealelec> objs = new ArrayList<>(); for (ArdAlarmStealelec data : alarms) { //经纬度火星转84 if (data.getLongitude() != 0 && data.getLatitude() != 0) { double[] wgs84 = LonlatConver.gcj02_To_Wgs84(data.getLongitude(), data.getLatitude());//火星转84 data.setLongitude(wgs84[0]); data.setLatitude(wgs84[1]); } //判断当前数据是否10S内 Date startTime = data.getStartTime(); SimpleDateFormat formatTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//HH是24小时制,12小时用hh Calendar calendar = Calendar.getInstance(); //从当前时间减去10秒 calendar.add(Calendar.MINUTE, -30); String currentTime = formatTime.format(calendar.getTime()); int dateFlag = formatTime.format(startTime).compareTo(currentTime); if (dateFlag > 0) { objs.add(data); } data.setId(data.getDescribe() + "&" + data.getCommand()); } if (objs.size() > 0) { map.put("obj", objs); } else { map.put("obj", -1); } map.put("Command", 8000); map.put("count", objs.size()); map.put("total", alarms.size()); map.put("data", alarms); if (alarms.size() > 0) { WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(userId), map); } } } catch (Exception ex) { log.error("盗电报警推送异常:" + ex.getMessage()); } // 结束时间 long etime = System.currentTimeMillis(); // 计算执行时间 log.info("盗电报警推送结束:" + (etime - stime) + " 毫秒"); } /** * @描述 盗电报警api拉取任务 * @参数 [] * @返回值 void * @创建人 刘苏义 * @创建时间 2023/2/28 11:51 * @修改人和其它信息 */ public void stealElecAlarmPull() { log.info("盗电数据拉取开始"); // 开始时间 long stime = System.currentTimeMillis(); try { // String url = "http://iot.zhdk.net:8090/Warning/GetWarning?userName=cy4oil"; IStealElecAlarmService.getAlarmByApi(); } catch (Exception ex) { log.error("盗电数据拉取异常:" + ex.getMessage()); } // 结束时间 long etime = System.currentTimeMillis(); // 计算执行时间 log.info("盗电数据拉取结束:" + (etime - stime) + " 毫秒"); } public void globalAlarmCountPush() { Map<String, Integer> stringIntegerMap = globalAlarmService.selectAlarmLogsCount(); if (ONLINE_USER_SESSIONS.size() > 0) {