‘liusuyi’
2023-06-15 4aa86f1386d20c9ad811e2d18b7e56f00b06e25c
优化
已添加2个文件
已重命名1个文件
已修改19个文件
已删除1个文件
506 ■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/GlobalAlarmServiceImpl.java 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/stealAlarm/domain/ArdAlarmStealelec.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/stealAlarm/mapper/ArdAlarmStealelecMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/stealAlarm/service/impl/IStealElecAlarmServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/constant/CamPriority.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/constant/sdkPriority.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/domain/ArdCameras.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/inspect/controller/ArdVideoInspectTaskController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/tools/ArdTool.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/tools/GisTool.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/tube/TubeTools.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/mapper/alarm/ArdAlarmStealelecMapper.xml 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/logback.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/AlarmTask.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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&lt;=#{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) {