‘liusuyi’
2023-05-31 f36efaba44f2108f551336336e437be58c270313
提交光电自动定时巡检
已修改3个文件
225 ■■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/util/hikSdkUtil/HCNetSDK.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PatrolInspectionTask.java 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -10,6 +10,7 @@
import com.ruoyi.device.camera.mapper.ArdCamerasMapper;
import com.ruoyi.device.hiksdk.common.global.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;
@@ -1293,7 +1294,6 @@
    }
    @Override
    @SdkOperate
    public void recordToMinio(CameraCmd cmd) {
        try {
            String cameraId = cmd.getCameraId();
@@ -1304,6 +1304,17 @@
            }
            Integer userId = globalVariable.loginMap.get(cameraId);
            String path = "";
            //强制I帧结构体对象
            HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //新建结构体对象
            netDvrIFrame.read();
            netDvrIFrame.dwChannel = channelNum;          //因为上文代码中设置了通道号,按照上文中的设置
            netDvrIFrame.byStreamType = 0;
            netDvrIFrame.dwSize = netDvrIFrame.size();
            netDvrIFrame.write();
            if(!hCNetSDK.NET_DVR_RemoteControl(userId,3402,netDvrIFrame.getPointer(),netDvrIFrame.dwSize)){
                log.error("强制I帧 错误码为:  " + hCNetSDK.NET_DVR_GetLastError());
            }
            //预览参数
            NET_DVR_PREVIEWINFO previewinfo = new NET_DVR_PREVIEWINFO();
            previewinfo.read();
@@ -1319,8 +1330,7 @@
                if (!user_real_Map.containsKey(userId)) {
                    lRealHandle = hCNetSDK.NET_DVR_RealPlay_V40(userId, previewinfo, null, null);
                    if (lRealHandle == -1) {
                        int iErr = hCNetSDK.NET_DVR_GetLastError();
                        log.error("取流失败" + iErr);
                        log.error("取流失败" + hCNetSDK.NET_DVR_GetLastError());
                        return;
                    }
                    log.info("取流成功");
@@ -1339,7 +1349,7 @@
                    user_real_Map.put(userId, info);
                }
                recordInfo info = user_real_Map.get(userId);
                if (!hCNetSDK.NET_DVR_SaveRealData_V30(info.getLRealHandle(), 1, info.getRecordPath())) {
                if (!hCNetSDK.NET_DVR_SaveRealData_V30(info.getLRealHandle(), 2, info.getRecordPath())) {
                    log.error("保存视频文件到临时文件夹失败 错误码为:  " + hCNetSDK.NET_DVR_GetLastError());
                    return;
                }
@@ -1356,10 +1366,9 @@
                String ObjectName = cmd.getRecordObjectName();
                String ContentType = "video/MP4";
                FileInputStream stream = new FileInputStream(info.getRecordPath());
                String url = "";
                boolean b = MinioUtils.uploadObject(BucketName, ObjectName, stream, stream.available(), ContentType);
                if (b) {
                    log.info("上传文件成功!" + BucketName + "/" + ObjectName);
                    log.info("上传文件成功!" + MinioClientSingleton.domainUrl + "/"+ BucketName + "/" + ObjectName);
                    user_real_Map.remove(userId);
                }
            }
ard-work/src/main/java/com/ruoyi/device/hiksdk/util/hikSdkUtil/HCNetSDK.java
@@ -10242,7 +10242,14 @@
    boolean NET_DVR_InquiryRecordTimeSpan(int lUserID, int dwChannel, NET_DVR_RECORD_TIME_SPAN_INQUIRY lpInquiry, NET_DVR_RECORD_TIME_SPAN lpResult);
    boolean NET_DVR_StartGetDevState(NET_DVR_CHECK_DEV_STATE pParams);
    //强制I帧参数结构体。
    public static class NET_DVR_I_FRAME extends HIKSDKStructure{
        public int dwSize;
        public byte[] sStreamID = new byte[32];  //流IDs    SDK 中对  STREAM_ID_LEN进行了定义,赋值32
        public int dwChannel;//通道号
        public byte byStreamType; //码流类型:0-主码流,1-子码流,2-码流3,3-虚拟码流,以此类推
        public byte[] byRes = new byte[63];  //保留,置为0    按照SDK要求进行对应赋值
    }
    //gps相关结构定义
    public static class TimeSegParam extends HIKSDKStructure {
        //GPS数据查找起始时间
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PatrolInspectionTask.java
@@ -46,7 +46,6 @@
    public void scanRun(){
        /*扫描所有可执行任务1-时间满足2-自动*/
        log.info("开始扫描所有可执行任务");
        ArdVideoInspectTask ardVideoInspectTask = new ArdVideoInspectTask();
        ardVideoInspectTask.setInspectMode("自动");
        List<ArdVideoInspectTask> ardVideoInspectTasks = ardVideoInspectTaskService.selectArdVideoInspectTaskList(ardVideoInspectTask);
@@ -54,24 +53,50 @@
            /*遍历所有时间满足的自动任务*/
            boolean timeCompare = DateUtils.TimeCompare(videoInspectTask.getStartTime(), videoInspectTask.getEndTime());
            if (timeCompare) {
                log.info("满足时间");
                /*当前任务的巡检步骤*/
                /*获取当前任务的所有巡检步骤*/
                List<ArdVideoInspectTaskStep> ardVideoInspectTaskStepList = ardVideoInspectTaskService.selectArdVideoInspectTaskById(videoInspectTask.getId()).getArdVideoInspectTaskStepList();
                Map<Integer, Object> sortMap = new HashMap<>();//排序map
                Map<String, Object> stepMap = new HashMap<>();//IDmap
                for (ArdVideoInspectTaskStep step : ardVideoInspectTaskStepList) {
                    sortMap.put(step.getOrderNumber(), step);
                    stepMap.put(step.getId(), step);
                if (ardVideoInspectTaskStepList.size() == 0) {
                    continue;
                }
                /*获取当前任务正在执行的步骤和当前步骤开始的时间*/
                videoInspectTask.setArdVideoInspectTaskStepList(ardVideoInspectTaskStepList);
                String currentStepId = videoInspectTask.getCurrentStepId();
                String cameraId = videoInspectTask.getCameraId();
                Integer channel = videoInspectTask.getChannel();
                String currentStepStartTime = videoInspectTask.getCurrentStepStartTime();
                /*如果当前步骤未找到,则从1开始*/
                if (StringUtils.isNull(currentStepId)) {
                    ArdVideoInspectTaskStep step = (ArdVideoInspectTaskStep) sortMap.get(1);
                    String wellId = step.getWellId();//获取第一个步骤的井号
                    videoInspectTask.setCurrentStepId(ardVideoInspectTaskStepList.get(0).getId());
                    startRunStep(videoInspectTask);//开始当前任务的第一个步骤
                } else /*当前任务已经执行,判断是否到期*/ {
                    boolean expird = isExpirdStep(videoInspectTask); /*判断当前步骤时间是否过期*/
                    if (expird) {
                        /*已过期,停止录像*/
                        stopRunStep(videoInspectTask);
                        /*切换下一步*/
                        String nextStepId = changeNextStep(videoInspectTask);
                        /*开始*/
                        videoInspectTask.setCurrentStepId(nextStepId);
                        startRunStep(videoInspectTask);
                    }
                }
            }
        }
    }
    //步骤开始
    private void startRunStep(ArdVideoInspectTask ardVideoInspectTask) {
        String currentStepId = ardVideoInspectTask.getCurrentStepId();
        if(StringUtils.isNull(currentStepId))
        {
            log.info("当前开始巡检步骤id为空");
            return;
        }
        log.info("步骤:" + currentStepId + "开始");
        String cameraId = ardVideoInspectTask.getCameraId();
        Integer channel = ardVideoInspectTask.getChannel();
        Optional<ArdVideoInspectTaskStep> objectOptional = ardVideoInspectTask.getArdVideoInspectTaskStepList().stream()
                .filter(obj -> obj.getId().equals(currentStepId))
                .findFirst();
        if (objectOptional.isPresent()) {
            ArdVideoInspectTaskStep step = objectOptional.get();
            String wellId = step.getWellId();
                    if (!StringUtils.isNull(wellId)) {
                        /*获取井坐标*/
                        ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellService.selectArdAlarmpointsWellById(wellId);
@@ -100,22 +125,33 @@
                            hikClientService.recordToMinio(cmd);
                            /*更新任务当前步骤id和步骤启动时间*/
                            ArdVideoInspectTask avit = new ArdVideoInspectTask();
                            avit.setId(videoInspectTask.getId());
                            avit.setCurrentStepId(ardVideoInspectTaskStepList.get(0).getId());
                    avit.setId(ardVideoInspectTask.getId());
                    avit.setCurrentStepId(step.getId());
                            avit.setCurrentStepStartTime(DateUtils.getTime());
                            ardVideoInspectTaskService.updateArdVideoInspectTaskNoUpdater(avit);
                        }
                    }
                } else /*当前任务已经执行,判断是否到期*/ {
                    if (stepMap.containsKey(currentStepId)) {
                        /*获取当前步骤信息*/
                        ArdVideoInspectTaskStep currentStep = (ArdVideoInspectTaskStep) stepMap.get(currentStepId);
                        /*获取到当前步骤的开始和结束时间*/
                        Date currentStepStartDate = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, currentStepStartTime);
                        Date currentStepStopDate = DateUtils.addMinutes(currentStepStartDate, currentStep.getRecordingTime());
                        /*判断当前步骤时间是否过期*/
                        if (!DateUtils.TimeCompare(currentStepStartDate, currentStepStopDate)) {
                            /*已过期,停止录像*/
        }
    }
    //步骤停止
    private void stopRunStep(ArdVideoInspectTask ardVideoInspectTask) {
        String currentStepId = ardVideoInspectTask.getCurrentStepId();
        log.info("步骤:" + currentStepId + "停止");
        if(StringUtils.isNull(currentStepId))
        {
            log.info("当前停止巡检步骤id为空");
            return;
        }
        String currentStepStartTime = ardVideoInspectTask.getCurrentStepStartTime();
        String cameraId = ardVideoInspectTask.getCameraId();
        Integer channel = ardVideoInspectTask.getChannel();
        Optional<ArdVideoInspectTaskStep> objectOptional = ardVideoInspectTask.getArdVideoInspectTaskStepList().stream()
                .filter(obj -> obj.getId().equals(currentStepId))
                .findFirst();
        if (objectOptional.isPresent()) {
            ArdVideoInspectTaskStep step = objectOptional.get();
            /*停止录像*/
                            CameraCmd cmd = new CameraCmd();
                            cmd.setCameraId(cameraId);
                            cmd.setChannelNum(channel);
@@ -126,67 +162,78 @@
                            String recordName = cameraId + "/" + time + "/" + uuid + ".mp4";
                            cmd.setRecordBucketName("record");
                            cmd.setRecordObjectName(recordName);
                            String url= MinioClientSingleton.domainUrl+ "/" +cmd.getRecordBucketName()+ "/"+recordName;
                            hikClientService.recordToMinio(cmd);
                            /*更新巡检记录*/
            /*插入巡检记录*/
                            ArdVideoInspectRecord ardVideoInspectRecord = new ArdVideoInspectRecord();
                            ardVideoInspectRecord.setStepId(currentStepId);
            ardVideoInspectRecord.setStepId(step.getId());
            Date currentStepStartDate = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, currentStepStartTime);
            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);
                            ardVideoInspectRecordService.insertArdVideoInspectRecord(ardVideoInspectRecord);
        }
    }
                            /*切换下一步骤*/
                            Integer orderNumber = currentStep.getOrderNumber();
    //步骤判断是否过期
    private boolean isExpirdStep(ArdVideoInspectTask ardVideoInspectTask) {
        List<ArdVideoInspectTaskStep> ardVideoInspectTaskStepList = ardVideoInspectTask.getArdVideoInspectTaskStepList();
        /*获取当前任务正在执行的步骤和当前步骤开始的时间*/
        String currentStepId = ardVideoInspectTask.getCurrentStepId();
        String currentStepStartTime = ardVideoInspectTask.getCurrentStepStartTime();
        Optional<ArdVideoInspectTaskStep> objectOptional = ardVideoInspectTaskStepList.stream()
                .filter(ardVideoInspectTaskStep -> ardVideoInspectTaskStep.getId().equals(currentStepId))
                .findFirst();
        if (objectOptional.isPresent()) {
            /*获取当前步骤信息*/
            ArdVideoInspectTaskStep currentStep = objectOptional.get();
            /*获取到当前步骤的开始和结束时间*/
            Date currentStepStartDate = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, currentStepStartTime);
            Date currentStepStopDate = DateUtils.addMinutes(currentStepStartDate, currentStep.getRecordingTime());
            /*判断当前步骤时间是否过期*/
            if (!DateUtils.TimeCompare(currentStepStartDate, currentStepStopDate)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    //步骤切换
    private String changeNextStep(ArdVideoInspectTask ardVideoInspectTask) {
        String currentStepId = ardVideoInspectTask.getCurrentStepId();
        Optional<ArdVideoInspectTaskStep> objectOptional = ardVideoInspectTask.getArdVideoInspectTaskStepList().stream()
                .filter(obj -> obj.getId().equals(currentStepId))
                .findFirst();
        if (objectOptional.isPresent()) {
            ArdVideoInspectTaskStep step = objectOptional.get();
            Integer currentStepOrderNumber = step.getOrderNumber();
                            /*判断当前步骤序号是否小于步骤总数*/
                            if (orderNumber < stepMap.size()) {
            if (currentStepOrderNumber < ardVideoInspectTask.getArdVideoInspectTaskStepList().size()) {
                                /*小于则执行下一步骤*/
                                orderNumber++;
                currentStepOrderNumber++;
                            } else {
                                /*否则从1开始执行*/
                                orderNumber = 1;
                currentStepOrderNumber = 1;
                            }
                            ArdVideoInspectTaskStep step = (ArdVideoInspectTaskStep) sortMap.get(orderNumber);
                            String wellId = step.getWellId();//获取第一个步骤的井号
                            if (!StringUtils.isNull(wellId)) {
                                /*获取井坐标*/
                                ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellService.selectArdAlarmpointsWellById(wellId);
                                double[] targetPositon = new double[3];
                                targetPositon[0] = ardAlarmpointsWell.getLongitude();
                                targetPositon[1] = ardAlarmpointsWell.getLatitude();
                                targetPositon[2] = ardAlarmpointsWell.getAltitude();
                                /*获取相机坐标*/
                                ArdCameras cameras = ardCamerasService.selectArdCamerasById(cameraId);
                                double[] cameraPositon = new double[3];
                                cameraPositon[0] = cameras.getLongitude();
                                cameraPositon[1] = cameras.getLatitude();
                                cameraPositon[2] = cameras.getAltitude();
                                /*控制相机巡检*/
                                log.info("指向" + ardAlarmpointsWell.getWellId() + "坐标:" + targetPositon);
                                cmd = new CameraCmd();
                                cmd.setCameraId(cameraId);
                                cmd.setChannelNum(channel);
                                cmd.setCamPosition(cameraPositon);
                                cmd.setTargetPosition(targetPositon);
                                cmd.setOperator("sys_patrol_inspect");
                                cmd.setExpired(step.getRecordingTime());
                                boolean setTargetPosition = hikClientService.setTargetPosition(cmd);
                                if (setTargetPosition) {
                                    /*控制相机巡检成功,开始录像*/
                                    cmd.setEnable(true);//启动录像
                                    hikClientService.recordToMinio(cmd);
                                    /*更新任务当前步骤id和步骤启动时间*/
            Integer nextStepOrderNumber = currentStepOrderNumber;
            /*更新当前任务切换新步骤*/
                                    ArdVideoInspectTask avit = new ArdVideoInspectTask();
                                    avit.setId(videoInspectTask.getId());
                                    avit.setCurrentStepId(step.getId());
                                    avit.setCurrentStepStartTime(DateUtils.getTime());
            avit.setId(ardVideoInspectTask.getId());
            String nextStepId = ardVideoInspectTask.getArdVideoInspectTaskStepList().stream()
                    .filter(obj -> obj.getOrderNumber() == nextStepOrderNumber)
                    .map(ArdVideoInspectTaskStep::getId)
                    .findFirst()
                    .orElse(null);
            avit.setCurrentStepId(nextStepId);
                                    ardVideoInspectTaskService.updateArdVideoInspectTaskNoUpdater(avit);
            log.info("步骤:" + currentStepId + "切换为"+nextStepId);
            return nextStepId;
                                }
                            }
                        }
                    }
                }
            }
        }
        return "";
    }
}