‘liusuyi’
2023-06-14 43fc617eb7b94c7e1cc66884cbb9672da8b3bc32
优化海康sdk录像
已修改12个文件
已删除1个文件
533 ■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/GlobalAlarmServiceImpl.java 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/domain/ArdAlarmTube.java 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/constant/Global.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/domain/ArdCameras.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/common/GlobalVariable.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTaskManager.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/mapper/alarm/ArdAlarmTubeMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-ard.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/tools/ArdTool.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/websocket/service/ChatServerEndpoint.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/GlobalAlarmServiceImpl.java
@@ -17,7 +17,15 @@
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.common.utils.uuid.IdUtils;
import com.ruoyi.common.utils.uuid.UUID;
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.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;
@@ -55,7 +63,10 @@
    ArdTubesDetailsMapper ardTubesDetailsMapper;
    @Resource
    private ISysConfigService configService;
    @Resource
    private ArdCamerasMapper ardCamerasMapper;
    @Resource
    private IHikClientService hikClientService;
    @Override
    public List<GlobalAlarmData> selectAlarmLogs(GlobalAlarmCondition condition) {
        String refreshTime = configService.selectConfigByKey("refreshTime");
@@ -124,53 +135,97 @@
    @Override
    @Async("alarmExecutor")
    public void receiveAlarm(String topic, String message) {
        String uuid = UUID.randomUUID().toString().replace("-", "");
        switch (topic) {
            case "stealelec":
                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 existe = ardAlarmStealelecMapper.selectByPrimaryKey(ardAlarmStealelec.getId());
                if(StringUtils.isNotNull(existe))
                {
                    return;
                }
                int aas = ardAlarmStealelecMapper.insert(ardAlarmStealelec);
                if(aas>0)
                {
                    log.info("stealelec入库成功:" +ardAlarmStealelec);
                }
                break;
            case "tube":
                ArdAlarmTube ardAlarmTube = JSONObject.parseObject(message, ArdAlarmTube.class);
                ardAlarmTube.setId(uuid);
                ArdTubesDetails atd = new ArdTubesDetails();
                atd.setReelNumber(ardAlarmTube.getTubeId());
                List<ArdTubesDetails> ardTubesDetails = ardTubesDetailsMapper.selectArdTubesDetailsList(atd);
                if (ardTubesDetails.size() > 0) {
                    String tubeId = ardTubesDetails.get(0).getTubeId();
                    ArdTubes ardTubes = ardTubesMapper.selectArdTubesById(tubeId);
                    ardAlarmTube.setTubeName(ardTubes.getName());
                    ardAlarmTube.setColor(ardTubes.getColor());
                    ardAlarmTube.setPipeDiameter(ardTubes.getPipeDiameter());
                    ardAlarmTube.setTubeType(ardTubes.getType());
                    GeoPoint geoPoint = TubeTools.CalculateCoordinates(ardTubesDetails, ardAlarmTube.getPosition());
                    if (StringUtils.isNotNull(geoPoint)) {
                        ardAlarmTube.setLongitude(geoPoint.getLongitude());
                        ardAlarmTube.setLatitude(geoPoint.getLatitude());
                        ardAlarmTube.setAltitude(geoPoint.getAltitude());
        try {
            String simpleUUID = IdUtils.simpleUUID();
            switch (topic) {
                case "stealelec":
                    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());
                    }
                }
                int aat = ardAlarmTubeMapper.insertArdAlarmTube(ardAlarmTube);
                if (aat > 0) {
                    log.info("tube入库成功:" + ardAlarmTube);
                }
                break;
                    ArdAlarmStealelec existe = ardAlarmStealelecMapper.selectByPrimaryKey(ardAlarmStealelec.getId());
                    if (StringUtils.isNotNull(existe)) {
                        return;
                    }
                    int aas = ardAlarmStealelecMapper.insert(ardAlarmStealelec);
                    if (aas > 0) {
                        log.info("stealelec入库成功:" + ardAlarmStealelec);
                    }
                    break;
                case "tube":
                    ArdAlarmTube ardAlarmTube = JSONObject.parseObject(message, ArdAlarmTube.class);
                    ardAlarmTube.setId(simpleUUID);
                    ArdTubesDetails atd = new ArdTubesDetails();
                    atd.setReelNumber(ardAlarmTube.getTubeId());
                    List<ArdTubesDetails> ardTubesDetails = ardTubesDetailsMapper.selectArdTubesDetailsList(atd);
                    if (ardTubesDetails.size() > 0) {
                        String tubeId = ardTubesDetails.get(0).getTubeId();
                        ArdTubes ardTubes = ardTubesMapper.selectArdTubesById(tubeId);
                        ardAlarmTube.setTubeName(ardTubes.getName());
                        ardAlarmTube.setColor(ardTubes.getColor());
                        ardAlarmTube.setPipeDiameter(ardTubes.getPipeDiameter());
                        ardAlarmTube.setTubeType(ardTubes.getType());
                        GeoPoint geoPoint = TubeTools.CalculateCoordinates(ardTubesDetails, ardAlarmTube.getPosition());
                        if (StringUtils.isNotNull(geoPoint)) {
                            ardAlarmTube.setLongitude(geoPoint.getLongitude());
                            ardAlarmTube.setLatitude(geoPoint.getLatitude());
                            ardAlarmTube.setAltitude(geoPoint.getAltitude());
                        }
                    }
                    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);
                        //引导光电
                        CameraCmd cmd = new CameraCmd();
                        cmd.setOperator("sys_tube_leak");
                        cmd.setCameraId(minDistanceCameraId);
                        cmd.setChannelNum(1);
                        cmd.setTargetPosition(new double[]{ardAlarmTube.getLongitude(), ardAlarmTube.getLatitude()});
                        boolean guideRes = hikClientService.setTargetPosition(cmd);
                        if(guideRes) {
                            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);
                            Thread.sleep(30000);
                            cmd.setEnable(false);
                            cmd.setUploadMinio(true);
                            hikClientService.recordToMinio(cmd);
                            //更新录像
                            String url = MinioClientSingleton.domainUrl + "/" + cmd.getRecordBucketName() + "/" + recordName;
                            ardAlarmTube.setRecordUrl(url);
                            ardAlarmTubeMapper.updateArdAlarmTube(ardAlarmTube);
                        }
                    }
                    break;
            }
        }
        catch (Exception ex)
        {
            log.error("接收报警异常:"+ex.getMessage());
        }
    }
    /**
ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/domain/ArdAlarmTube.java
@@ -1,6 +1,7 @@
package com.ruoyi.alarm.tubeAlarm.domain;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.ToString;
@@ -11,77 +12,108 @@
/**
 * ç®¡çº¿æ³„露报警对象 ard_alarm_tube
 *
 *
 * @author åˆ˜è‹ä¹‰
 * @date 2023-06-06
 */
@Data
@ToString
public class ArdAlarmTube extends BaseEntity
{
public class ArdAlarmTube extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /** ä¸»é”® */
    /**
     * ä¸»é”®
     */
    private String id;
    /** æŠ¥è­¦ä¸»æœº */
    /**
     * æŠ¥è­¦ä¸»æœº
     */
    @Excel(name = "报警主机")
    private String host;
    /** ç®¡çº¿id */
    /**
     * ç®¡çº¿id
     */
    @Excel(name = "管线id")
    private String tubeId;
    /** ç®¡çº¿åç§° */
    /**
     * ç®¡çº¿åç§°
     */
    @Excel(name = "管线名称")
    private String tubeName;
    /** ç®¡çº¿ç±»åž‹-油管-水管 */
    /**
     * ç®¡çº¿ç±»åž‹-油管-水管
     */
    @Excel(name = "管线类型-油管-水管")
    private String tubeType;
    /** ç®¡å¾„ */
    /**
     * ç®¡å¾„
     */
    @Excel(name = "管径")
    private String pipeDiameter;
    /** é¢œè‰² */
    /**
     * é¢œè‰²
     */
    @Excel(name = "颜色")
    private String color;
    /** ä½ç½® */
    /**
     * ä½ç½®
     */
    @Excel(name = "位置")
    private Integer position;
    /** ç»åº¦ */
    /**
     * ç»åº¦
     */
    @Excel(name = "经度")
    private Double longitude;
    /** çº¬åº¦ */
    /**
     * çº¬åº¦
     */
    @Excel(name = "纬度")
    private Double latitude;
    /** é«˜å±‚ */
    /**
     * é«˜å±‚
     */
    @Excel(name = "高层")
    private Double altitude;
    /** ç±»åž‹GXALARM */
    /**
     * ç±»åž‹GXALARM
     */
    @Excel(name = "类型GXALARM")
    private String type;
    /** ç±»åž‹ä¸­æ–‡ */
    /**
     * ç±»åž‹ä¸­æ–‡
     */
    @Excel(name = "类型中文")
    private String alarmType;
    /** æŠ¥è­¦æ—¶é—´ */
    /**
     * æŠ¥è­¦æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "报警时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date alarmTime;
    /** ç”¨æˆ·å */
    /**
     * ç”¨æˆ·å
     */
    @Excel(name = "用户名")
    private String watcher;
    /** æŸ¥çœ‹æ—¶é—´ */
    /**
     * æŸ¥çœ‹æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "查看时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date viewTime;
@@ -94,4 +126,10 @@
     * æœªè¯»æŠ¥è­¦æ•°é‡
     */
    private Integer count;
    /**
     * å¼•导录像url
     */
    @Excel(name = "引导录像url")
    private String recordUrl;
}
ard-work/src/main/java/com/ruoyi/constant/Global.java
ÎļþÒÑɾ³ý
ard-work/src/main/java/com/ruoyi/device/camera/domain/ArdCameras.java
@@ -157,7 +157,7 @@
     * æœ€å¤§å¯è§†è·ç¦»
     */
    @Excel(name = "最大可视距离")
    private String camMaxVisibleDistance;
    private Double camMaxVisibleDistance;
    /**
     * æ‰€å±žå¡”ID
ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java
@@ -27,7 +27,7 @@
    Map<String,Double>ptzMap;
    /*相机经纬度*/
    double[] camPosition;
//    double[] camPosition;
    /*目标经纬度*/
    double[] targetPosition;
ard-work/src/main/java/com/ruoyi/device/hiksdk/common/GlobalVariable.java
@@ -17,6 +17,6 @@
public class GlobalVariable {
    //保存相机登录信息
    public static Map<String, Integer> loginMap = new HashMap<>();
    //保存录像信息
    public static Map<Integer, recordInfo> user_real_Map = new HashMap<>();
    //相机预览字典
    public static Map<String, Integer> previewMap = new HashMap<>();
}
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -35,7 +35,6 @@
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import static com.ruoyi.device.hiksdk.util.hikSdkUtil.HCNetSDK.*;
/**
@@ -184,7 +183,7 @@
        System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
        m_strLoginInfo.wPort = m_sPort;
        m_strLoginInfo.byVerifyMode = 0;
        m_strLoginInfo.byLoginMode=0;
        m_strLoginInfo.byLoginMode = 0;
        //是否异步登录:0- å¦ï¼Œ1- æ˜¯  windowsSDK里是true和false
        m_strLoginInfo.bUseAsynLogin = true;
        //异步登录回调
@@ -663,7 +662,8 @@
        NET_DVR_PTZPOS m_ptzPosCurrent = new NET_DVR_PTZPOS();
        m_ptzPosCurrent.wAction = 1;
        try {
            double[] cameraPositon = cmd.getCamPosition();
            ArdCameras cameras = ardCamerasMapper.selectArdCamerasById(cameraId);
            double[] cameraPositon = new double[]{cameras.getLongitude(), cameras.getLatitude(), cameras.getAltitude()};
            double[] targetPositions = cmd.getTargetPosition();
            double[] cameraPTZ = GisUtil.getCameraPTZ(cameraPositon, targetPositions, 20, 150);
            String p = String.valueOf((int) (cameraPTZ[0] * 10));
@@ -681,7 +681,7 @@
            }
            return bool;
        } catch (Exception ex) {
            log.error(ex.getMessage());
            log.error("引导异常:" + ex.getMessage());
            return false;
        }
    }
@@ -1232,98 +1232,74 @@
     * @修改人和其它信息
     */
    @Override
    @SdkOperate
    public String record(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChannelNum();
        boolean enable = cmd.isEnable();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return "";
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        String path = "";
        //预览参数
        NET_DVR_PREVIEWINFO previewinfo = new NET_DVR_PREVIEWINFO();
        previewinfo.read();
        previewinfo.lChannel = channelNum;
        previewinfo.dwStreamType = 0;//码流类型:0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推
        previewinfo.dwLinkMode = 0;//连接方式:0-TCP方式,1-UDP方式,2-多播方式,3-RTP方式,4-RTP/RTSP,5-RTP/HTTP,6-HRUDP(可靠传输),7-RTSP/HTTPS,8-NPQ
        previewinfo.hPlayWnd = null;//播放窗口的句柄,为NULL表示不解码显示。
        previewinfo.bBlocked = 0;//0- éžé˜»å¡žå–流,1-阻塞取流
        previewinfo.byNPQMode = 0;//NPQ模式:0-直连模式,1-过流媒体模式
        previewinfo.write();
        int lRealHandle;
        if (enable) {
            if (!GlobalVariable.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);
                    return "";
                }
                log.info("取流成功");
                File file = new File("D:/record/temp.mp4");
                if (!file.exists()) {
                    try {
                        File fileParent = file.getParentFile();
                        if (!fileParent.exists()) {
                            fileParent.mkdirs();
                        }
                        file.createNewFile();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                try {
                    path = file.getCanonicalPath();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                recordInfo info = new recordInfo();
                info.setLRealHandle(lRealHandle);
                info.setRecordPath(path);
                GlobalVariable.user_real_Map.put(userId, info);
            }
            recordInfo info = GlobalVariable.user_real_Map.get(userId);
            if (!hCNetSDK.NET_DVR_SaveRealData_V30(info.getLRealHandle(), 1, info.getRecordPath())) {
                log.error("保存视频文件到临时文件夹失败 é”™è¯¯ç ä¸º:  " + hCNetSDK.NET_DVR_GetLastError());
                return "保存视频文件到临时文件夹失败 é”™è¯¯ç ä¸º:" + hCNetSDK.NET_DVR_GetLastError();
            }
            log.info("录像开始");
            //return info.getRecordPath();
            return "";
        } else {
            recordInfo info = GlobalVariable.user_real_Map.get(userId);
            if (StringUtils.isNull(info)) {
        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 "";
            }
            hCNetSDK.NET_DVR_StopRealPlay(info.getLRealHandle());
            log.info("录像停止");
            //存入minio
            String BucketName = "record";
            String uuid = UUID.randomUUID().toString().replace("-", "");
            String time = new SimpleDateFormat("yyyyMMdd").format(new Date());
            String ObjectName = cameraId + "/" + time + "/" + uuid + ".mp4";
            String ContentType = "video/MP4";
            FileInputStream stream = null;
            try {
                stream = new FileInputStream(info.getRecordPath());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            Integer userId = GlobalVariable.loginMap.get(cameraId);
            //强制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();
            previewinfo.lChannel = channelNum;
            previewinfo.dwStreamType = 0;//码流类型:0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推
            previewinfo.dwLinkMode = 0;//连接方式:0-TCP方式,1-UDP方式,2-多播方式,3-RTP方式,4-RTP/RTSP,5-RTP/HTTP,6-HRUDP(可靠传输),7-RTSP/HTTPS,8-NPQ
            previewinfo.hPlayWnd = null;//播放窗口的句柄,为NULL表示不解码显示。
            previewinfo.bBlocked = 0;//0- éžé˜»å¡žå–流,1-阻塞取流
            previewinfo.byNPQMode = 0;//NPQ模式:0-直连模式,1-过流媒体模式
            previewinfo.write();
            String url = "";
            try {
            if (enable) {
                if (!GlobalVariable.previewMap.containsKey(cameraId)) {
                    int lRealHandle = hCNetSDK.NET_DVR_RealPlay_V40(userId, previewinfo, null, null);
                    if (lRealHandle == -1) {
                        log.error("取流失败" + hCNetSDK.NET_DVR_GetLastError());
                        return "";
                    }
                    log.info("取流成功");
                    GlobalVariable.previewMap.put(cameraId, lRealHandle);
                }
                if (!hCNetSDK.NET_DVR_SaveRealData_V30(GlobalVariable.previewMap.get(cameraId), 2, path)) {
                    log.error("保存视频文件到临时文件夹失败 é”™è¯¯ç ä¸º:  " + hCNetSDK.NET_DVR_GetLastError());
                    return "";
                }
                log.info("录像开始");
            } else {
                if (GlobalVariable.previewMap.containsKey(cameraId)) {
                    Integer lRealHandle = GlobalVariable.previewMap.get(cameraId);
                    hCNetSDK.NET_DVR_StopRealPlay(lRealHandle);
                    GlobalVariable.previewMap.remove(cameraId);
                }
                log.info("录像停止");
                //存入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);
                if (b) {
                    url = MinioUtils.getBucketObjectUrl(BucketName, ObjectName);
                    log.info("上传文件成功!" + url);
                    log.info("上传文件成功!" + MinioClientSingleton.domainUrl + "/" + BucketName + "/" + ObjectName);
                }
            } catch (IOException ex) {
                log.error("上传文件异常:" + ex.getMessage());
            }
            GlobalVariable.user_real_Map.remove(userId);
            return url;
        } catch (Exception ex) {
            log.error("录像异常" + ex.getMessage());
            return "";
        }
    }
@@ -1332,6 +1308,7 @@
        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;
@@ -1357,46 +1334,38 @@
            previewinfo.bBlocked = 0;//0- éžé˜»å¡žå–流,1-阻塞取流
            previewinfo.byNPQMode = 0;//NPQ模式:0-直连模式,1-过流媒体模式
            previewinfo.write();
            int lRealHandle;
            if (enable) {
                if (!GlobalVariable.user_real_Map.containsKey(userId)) {
                    lRealHandle = hCNetSDK.NET_DVR_RealPlay_V40(userId, previewinfo, null, null);
                if (!GlobalVariable.previewMap.containsKey(cameraId)) {
                    int lRealHandle = hCNetSDK.NET_DVR_RealPlay_V40(userId, previewinfo, null, null);
                    if (lRealHandle == -1) {
                        log.error("取流失败" + hCNetSDK.NET_DVR_GetLastError());
                        return;
                    }
                    log.info("取流成功");
                    String path = FileUtils.createFile("D:/recordTemp/" + cameraId + ".mp4");
                    recordInfo info = new recordInfo();
                    info.setLRealHandle(lRealHandle);
                    info.setRecordPath(path);
                    GlobalVariable.user_real_Map.put(userId, info);
                    GlobalVariable.previewMap.put(cameraId, lRealHandle);
                }
                recordInfo info = GlobalVariable.user_real_Map.get(userId);
                if (!hCNetSDK.NET_DVR_SaveRealData_V30(info.getLRealHandle(), 2, info.getRecordPath())) {
                if (!hCNetSDK.NET_DVR_SaveRealData_V30(GlobalVariable.previewMap.get(cameraId), 2, path)) {
                    log.error("保存视频文件到临时文件夹失败 é”™è¯¯ç ä¸º:  " + hCNetSDK.NET_DVR_GetLastError());
                    return;
                }
                log.info("录像开始");
            } else {
                recordInfo info = GlobalVariable.user_real_Map.get(userId);
                if (StringUtils.isNull(info)) {
                    return;
                if (GlobalVariable.previewMap.containsKey(cameraId)) {
                    Integer lRealHandle = GlobalVariable.previewMap.get(cameraId);
                    hCNetSDK.NET_DVR_StopRealPlay(lRealHandle);
                    GlobalVariable.previewMap.remove(cameraId);
                }
                hCNetSDK.NET_DVR_StopRealPlay(info.getLRealHandle());
                log.info("录像停止");
                if (cmd.isUploadMinio()) {
                    //存入minio
                    String BucketName = cmd.getRecordBucketName();
                    String ObjectName = cmd.getRecordObjectName();
                    String ContentType = "video/MP4";
                    FileInputStream stream = new FileInputStream(info.getRecordPath());
                    boolean b = MinioUtils.uploadObject(BucketName, ObjectName, stream, stream.available(), ContentType);
                    if (b) {
                        log.info("上传文件成功!" + MinioClientSingleton.domainUrl + "/" + BucketName + "/" + ObjectName);
                        GlobalVariable.user_real_Map.remove(userId);
                    }
                //存入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);
                if (b) {
                    log.info("上传文件成功!" + MinioClientSingleton.domainUrl + "/" + BucketName + "/" + ObjectName);
                }
            }
        } catch (Exception ex) {
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java
@@ -6,7 +6,6 @@
import com.ruoyi.alarmpoints.well.domain.ArdAlarmpointsWell;
import com.ruoyi.alarmpoints.well.mapper.ArdAlarmpointsWellMapper;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.constant.Global;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.mapper.ArdCamerasMapper;
@@ -15,7 +14,6 @@
import com.ruoyi.inspect.domain.ArdVideoInspectRecord;
import com.ruoyi.inspect.mapper.ArdVideoInspectRecordMapper;
import com.ruoyi.inspect.mapper.ArdVideoInspectTaskStepMapper;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.ruoyi.common.utils.StringUtils;
@@ -176,12 +174,12 @@
        List<ArdVideoInspectTaskStep> ardVideoInspectTaskStepList = ardVideoInspectTask.getArdVideoInspectTaskStepList();
        //获取相机
        ArdCameras camera = camerasMapper.selectArdCamerasById(ardVideoInspectTask.getCameraId());
        Collections.sort(ardVideoInspectTaskStepList,new ArdVideoInspectTaskStepComparator(this.ardAlarmpointsWellMapper,camera.getLongitude(),camera.getLatitude()));
        Collections.sort(ardVideoInspectTaskStepList, new ArdVideoInspectTaskStepComparator(this.ardAlarmpointsWellMapper, camera.getLongitude(), camera.getLatitude()));
        String taskId = ardVideoInspectTask.getId();
        for (int i = 0; i < ardVideoInspectTaskStepList.size(); i++) {
            ArdVideoInspectTaskStep step = ardVideoInspectTaskStepList.get(i);
            step.setTaskId(taskId);
            step.setOrderNumber(new Integer(i+1));
            step.setOrderNumber(new Integer(i + 1));
        }
        if (StringUtils.isNotNull(ardVideoInspectTaskStepList)) {
            for (ArdVideoInspectTaskStep ardVideoInspectTaskStep : ardVideoInspectTaskStepList) {
@@ -343,22 +341,6 @@
                        }
                    }
                } else {
//                    if(Global.task_record.contains(videoInspectTask.getId()))
//                    {
//                        /*停止录像*/
//                        CameraCmd cmd = new CameraCmd();
//                        cmd.setCameraId(videoInspectTask.getCameraId());
//                        cmd.setChannelNum(videoInspectTask.getChannel());
//                        cmd.setOperator("sys_patrol_inspect");
//                        cmd.setEnable(false);//停止录像
//                        String uuid = UUID.randomUUID().toString().replace("-", "");
//                        String time = new SimpleDateFormat("yyyyMMdd").format(new Date());
//                        String recordName = videoInspectTask.getCameraId() + "/" + time + "/" + uuid + ".mp4";
//                        cmd.setRecordBucketName("record");
//                        cmd.setRecordObjectName(recordName);
//                        cmd.setUploadMinio(true);
//                        hikClientService.recordToMinio(cmd);
//                    }
                    if (StringUtils.isNotEmpty(videoInspectTask.getCurrentStepId())) {
                        videoInspectTask.setCurrentStepId("");
                        ardVideoInspectTaskMapper.updateArdVideoInspectTaskWithCurrentSetpInfo(videoInspectTask);
@@ -462,18 +444,14 @@
                    CameraCmd 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) {
                        if (!Global.task_record.contains(ardVideoInspectTask.getId())) {
                            /*控制相机巡检成功,开始录像*/
                            cmd.setEnable(true);//启动录像
                            hikClientService.recordToMinio(cmd);
                            Global.task_record.add(ardVideoInspectTask.getId());
                        }
                        /*控制相机巡检成功,开始录像*/
                        cmd.setEnable(true);//启动录像
                        hikClientService.recordToMinio(cmd);
                    } else {
                        cmd.setEnable(false);//停止录像
                        cmd.setUploadMinio(true);
@@ -519,13 +497,11 @@
                cmd.setRecordObjectName(recordName);
                cmd.setUploadMinio(true);
                hikClientService.recordToMinio(cmd);
                Global.task_record.remove(ardVideoInspectTask.getId());
                /*插入巡检记录*/
                ArdVideoInspectRecord ardVideoInspectRecord = new ArdVideoInspectRecord();
                ardVideoInspectRecord.setStepId(step.getId());
                ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellMapper.selectArdAlarmpointsWellById(step.getWellId());
                if(StringUtils.isNotNull(ardAlarmpointsWell))
                {
                if (StringUtils.isNotNull(ardAlarmpointsWell)) {
                    ardVideoInspectRecord.setWellName(ardAlarmpointsWell.getWellId());
                }
                Date currentStepStartDate = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, currentStepStartTime);
ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTaskManager.java
@@ -1,14 +1,11 @@
package com.ruoyi.inspect.service.impl;
import com.ruoyi.constant.Global;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.hiksdk.common.GlobalVariable;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import com.ruoyi.device.hiksdk.service.impl.HikClientServiceImpl;
import com.ruoyi.inspect.domain.ArdVideoInspectTask;
import com.ruoyi.inspect.mapper.ArdVideoInspectTaskMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@@ -50,12 +47,8 @@
            log.info("手动巡检任务已启动:" + taskId);
            return;
        }
//        /*每次启动任务清空任务当前步骤信息*/
        /*每次启动任务清空任务当前步骤信息*/
        ArdVideoInspectTask ardVideoInspectTask = ardVideoInspectTaskMapper.selectArdVideoInspectTaskById(taskId);
//        ardVideoInspectTask.setCurrentStepId("");
//        ardVideoInspectTask.setCurrentStepStartTime("");
//        ardVideoInspectTaskMapper.updateArdVideoInspectTask(ardVideoInspectTask);
        String cameraId = ardVideoInspectTask.getCameraId();
        /*将当前相机的所有任务当前时间置空*/
        ardVideoInspectTask=new ArdVideoInspectTask();
@@ -65,11 +58,6 @@
            for (ArdVideoInspectTask VideoInspectTask : ardVideoInspectTasks) {
                VideoInspectTask.setCurrentStepStartTime("");
                ardVideoInspectTaskMapper.updateArdVideoInspectTaskWithCurrentSetpInfo(VideoInspectTask);
                /*清楚任务录像记录*/
                if(Global.task_record.contains(VideoInspectTask.getId()))
                {
                    Global.task_record.remove(VideoInspectTask.getId());
                }
            }
        }
        /*开启任务*/
@@ -84,8 +72,7 @@
        ArdVideoInspectTask ardVideoInspectTask = ardVideoInspectTaskMapper.selectArdVideoInspectTaskById(taskId);
        /*将关联的相机录像关闭*/
        String cameraId = ardVideoInspectTask.getCameraId();
        Integer userId = GlobalVariable.loginMap.get(cameraId);//获取当前相机的登录ID
        if( GlobalVariable.user_real_Map.containsKey(userId))
        if( GlobalVariable.previewMap.containsKey(cameraId))
        {   //当前相机正在录像,则停止录像
            CameraCmd cmd = new CameraCmd();
            cmd.setCameraId(ardVideoInspectTask.getCameraId());
@@ -93,15 +80,13 @@
            cmd.setEnable(false);//停止录像
            cmd.setUploadMinio(false);
            hikClientService.recordToMinio(cmd);
            GlobalVariable.user_real_Map.remove(userId);
            GlobalVariable.previewMap.remove(cameraId);
        }
        /*停止任务*/
        InspectionTask task = taskMap.get(taskId);
        if (task != null) {
            task.stop();
            taskMap.remove(taskId);
            Global.task_record.remove(taskId);
            log.info("手动巡检任务已停止:" + taskId);
            /*将任务步骤信息清空*/
            ardVideoInspectTask.setCurrentStepId("");
ard-work/src/main/resources/mapper/alarm/ArdAlarmTubeMapper.xml
@@ -21,11 +21,12 @@
        <result property="longitude"    column="longitude"    />
        <result property="latitude"    column="latitude"    />
        <result property="altitude"    column="altitude"    />
        <result property="recordUrl"    column="record_url"    />
        <result property="viewTime"    column="view_time"    />
    </resultMap>
    <sql id="selectArdAlarmTubeVo">
        select id, host, tube_id, tube_name, tube_type, pipe_diameter, color, position, type, alarm_type, alarm_time, watcher, create_time, longitude, latitude, altitude, view_time from ard_alarm_tube
        select id, host, tube_id, tube_name, tube_type, pipe_diameter, color, position, type, alarm_type, alarm_time, watcher, create_time, longitude, latitude, altitude,, record_url, view_time from ard_alarm_tube
    </sql>
    <select id="selectArdAlarmTubeList" parameterType="ArdAlarmTube" resultMap="ArdAlarmTubeResult">
@@ -45,6 +46,7 @@
            <if test="longitude != null  and longitude != ''"> and longitude = #{longitude}</if>
            <if test="latitude != null  and latitude != ''"> and latitude = #{latitude}</if>
            <if test="altitude != null  and altitude != ''"> and altitude = #{altitude}</if>
            <if test="recordUrl != null  and recordUrl != ''"> and record_url = #{recordUrl}</if>
            <if test="viewTime != null "> and view_time = #{viewTime}</if>
        </where>
    </select>
@@ -73,6 +75,7 @@
            <if test="longitude != null">longitude,</if>
            <if test="latitude != null">latitude,</if>
            <if test="altitude != null">altitude,</if>
            <if test="recordUrl != null">record_url,</if>
            <if test="viewTime != null">view_time,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -92,6 +95,7 @@
            <if test="longitude != null">#{longitude},</if>
            <if test="latitude != null">#{latitude},</if>
            <if test="altitude != null">#{altitude},</if>
            <if test="recordUrl != null">#{recordUrl},</if>
            <if test="viewTime != null">#{viewTime},</if>
        </trim>
    </insert>
@@ -114,6 +118,7 @@
            <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}
@@ -139,6 +144,7 @@
                        aat.longitude,
                        aat.latitude,
                        aat.altitude,
                        aat.record_url,
                        ROW_NUMBER() OVER ( PARTITION BY aat.tube_id ORDER BY aat.alarm_time DESC ) AS rn,
                         COUNT(CASE WHEN aat.view_time IS NULL THEN 1 END) OVER ( PARTITION BY aat.tube_id ) AS COUNT,
                    COUNT ( aat.alarm_time ) OVER ( PARTITION BY tube_id ) AS total
ruoyi-admin/src/main/resources/application-ard.yml
@@ -17,7 +17,7 @@
#mqtt
mqtt:
  host: tcp://192.168.1.15:1883
  clientId: m3c
  clientId: m4c
  username: admin
  password: xzx12345
  topic: tube,stealelec
ruoyi-common/src/main/java/com/ruoyi/common/utils/tools/ArdTool.java
@@ -1,8 +1,7 @@
package com.ruoyi.common.utils.tools;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
/**
 * @Description: å·¥å…·æ–¹æ³•
@@ -35,4 +34,18 @@
        }
        return map;
    }
    /**
     * æ±‚Map<K,V>中最小 Value å¯¹åº”çš„Key值
     *
     * @param map
     * @return
     */
    public static String getKeyByMinValue(Map<String, Double> map) {
        if (map == null) return null;
        List<Map.Entry<String, Double>> list = new ArrayList(map.entrySet());
        Collections.sort(list, (o1, o2) -> (o1.getValue().intValue() - o2.getValue().intValue()));
        String min = list.get(0).getKey();
//        String max = list.get(list.size() - 1).getKey();
        return min;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/websocket/service/ChatServerEndpoint.java
@@ -47,10 +47,10 @@
    public void onClose( @PathParam("userId")String userId,Session session) {
        //当前的Session ç§»é™¤
        ONLINE_USER_SESSIONS.remove(userId);
        //并且通知其他人当前用户已经离开聊天室了
        String message="用户[" + userId + "] æ–­å¼€è¿žæŽ¥ï¼";
        sendMessage(session,message);
        log.info("发送消息:"+message);
//        //并且通知其他人当前用户已经离开聊天室了
//        String message="用户[" + userId + "] æ–­å¼€è¿žæŽ¥ï¼";
//        sendMessage(session,message);
//        log.info("发送消息:"+message);
        try {
            session.close();
        } catch (IOException e) {