‘liusuyi’
2023-06-17 d046fe01d52bc9ab423647db7af0591fd3a36259
增加获取附近相机接口
增加相机报警引导开关
增加日夜切换变换通道
已修改11个文件
192 ■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/controller/GlobalAlarmController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/GlobalAlarmServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/controller/ArdCamerasController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/domain/ArdCameras.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/service/IArdCamerasService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/management3d/tiles3d/controller/ArdTiles3dController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/management3d/tiles3d/service/impl/ArdTiles3dServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/tools/ArdTool.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/mapper/device/ArdCamerasMapper.xml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/controller/GlobalAlarmController.java
@@ -1,6 +1,7 @@
package com.ruoyi.alarm.globalAlarm.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.ruoyi.alarm.globalAlarm.domain.GlobalAlarmCondition;
import com.ruoyi.alarm.globalAlarm.domain.GlobalAlarmData;
import com.ruoyi.alarm.globalAlarm.service.IGlobalAlarmService;
@@ -23,6 +24,7 @@
@RestController
@RequestMapping("/ardAlarm")
@Api(tags = "报警数据汇总接口")
@ApiSupport(author = "刘苏义")
@Anonymous
public class GlobalAlarmController {
@@ -31,20 +33,21 @@
    @PostMapping("/List")
    @ApiOperation(value = "报警查询接口",notes = "这里包含了所有报警类型的数据")
    @ApiOperationSupport(includeParameters = {"condition.command"})
    @ApiOperationSupport(includeParameters = {"command"},order = 1)
    public AjaxResult selectAlarmLog(@RequestBody GlobalAlarmCondition condition) {
        List<GlobalAlarmData> result = globalAlarmService.selectAlarmLogs(condition);
        return AjaxResult.success(result);
    }
    @PostMapping("/view")
    @ApiOperation(value = "查看报警接口",notes = "指定查看某个报警数据")
    @ApiOperationSupport(includeParameters = {"condition.command","condition.id"})
    @ApiOperationSupport(includeParameters = {"command","id"},order = 3)
    public AjaxResult  viewAlarmLog(@RequestBody GlobalAlarmCondition condition) {
        Object result = globalAlarmService.updateAlarmViewTime(condition);
        return AjaxResult.success(result);
    }
    @GetMapping("/count")
    @ApiOperation(value = "查看报警点数量",notes = "查询刷新时间内报警的点位数量")
    @ApiOperationSupport(order = 2)
    public AjaxResult  countAlarmLog() {
        Map<String, Integer> stringIntegerMap = globalAlarmService.selectAlarmLogsCount();
        return AjaxResult.success(stringIntegerMap);
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/impl/GlobalAlarmServiceImpl.java
@@ -14,6 +14,7 @@
import com.ruoyi.alarmpoints.tube.mapper.ArdTubesMapper;
import com.ruoyi.alarmpoints.well.domain.ArdAlarmpointsWell;
import com.ruoyi.alarmpoints.well.mapper.ArdAlarmpointsWellMapper;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.utils.tools.ArdTool;
@@ -63,6 +64,8 @@
    private ArdCamerasMapper ardCamerasMapper;
    @Resource
    private IHikClientService hikClientService;
    @Resource
    private RedisCache redisCache;
    /**
     * @描述 按条件查询报警
     * @参数 [condition]
@@ -246,15 +249,18 @@
    private String guideCamera(CameraCmd cmd) {
        String url = "";
        try {
            String dayNightTime = redisCache.getCacheObject("sys_config:dayNightTime");
            //获取所有大光电
            List<ArdCameras> ardCamerasList = ardCamerasMapper.selectArdCamerasList(new ArdCameras("1"));
            //统计所有大光电可视范围内与报警点的距离
            Map<String, Double> distanceMap = new HashMap<>();
            Map<String, Integer> guideMap = 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);
                    guideMap.put(camera.getId(),camera.getCamAlarmGuideEnable());
                }
            }
            if (distanceMap.size() > 0) {
@@ -262,9 +268,14 @@
                //获取距离字典中最近的一个相机ID
                String minDistanceCameraId = ArdTool.getKeyByMinValue(distanceMap);
                log.debug("查找到最近光电:"+minDistanceCameraId+",尝试引导");
                if(guideMap.get(minDistanceCameraId).equals(0))
                {
                    log.debug("该光电未开启报警引导");
                    return "";
                }
                //引导光电
                cmd.setCameraId(minDistanceCameraId);
                cmd.setChannelNum(1);
                cmd.setChannelNum(ArdTool.getChannelBydayNightTime(dayNightTime));
                boolean guideRes = hikClientService.guideTargetPosition(cmd);
                if (guideRes) {
                    log.debug("引导成功,尝试录像");
ard-work/src/main/java/com/ruoyi/device/camera/controller/ArdCamerasController.java
@@ -3,7 +3,9 @@
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.hiksdk.service.impl.HikClientServiceImpl;
import com.ruoyi.common.utils.SecurityUtils;
@@ -28,10 +30,7 @@
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.core.page.TableDataInfo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
 * 相机设备Controller
@@ -155,4 +154,12 @@
        Map deptAndCamera = ardCamerasService.getChildDeptAndCamera();
        return AjaxResult.success(deptAndCamera);
    }
    @PostMapping("/getNearCamerasBycoordinate")
    @ApiOperation("获取附近的相机")
    @ApiOperationSupport(includeParameters = {"targetPosition"})
    public AjaxResult getNearCamerasBycoordinate(@RequestBody CameraCmd cmd)
    {
        TreeMap nearCamerasBycoordinate = ardCamerasService.getNearCamerasBycoordinate(cmd);
        return AjaxResult.success(nearCamerasBycoordinate);
    }
}
ard-work/src/main/java/com/ruoyi/device/camera/domain/ArdCameras.java
@@ -161,7 +161,9 @@
     */
    @Excel(name = "最大可视距离")
    private Double camMaxVisibleDistance;
    /** 相机报警引导开关 */
    @Excel(name = "相机报警引导开关")
    private Integer camAlarmGuideEnable;
    /**
     * 所属塔ID
     */
ard-work/src/main/java/com/ruoyi/device/camera/service/IArdCamerasService.java
@@ -3,8 +3,10 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
/**
 * 相机设备Service接口
@@ -78,4 +80,7 @@
     * @修改人和其它信息
     */
    public Map getChildDeptAndCamera();
    public TreeMap getNearCamerasBycoordinate(CameraCmd cmd);
}
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java
@@ -1,21 +1,26 @@
package com.ruoyi.device.camera.service.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.time.LocalTime;
import java.util.*;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.hiksdk.common.GlobalVariable;
import com.ruoyi.system.domain.SysConfig;
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;
import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.system.mapper.SysDeptMapper;
import com.ruoyi.utils.tools.GisTool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
/**
@@ -25,11 +30,15 @@
 * @date 2023-02-11
 */
@Service
@Slf4j
public class ArdCamerasServiceImpl implements IArdCamerasService {
    @Resource
    private ArdCamerasMapper ardCamerasMapper;
    @Resource
    private SysDeptMapper sysDeptMapper;
    @Resource
    private RedisCache redisCache;
    /**
     * 查询相机设备
@@ -168,6 +177,38 @@
        return map;
    }
    /**
     * @描述 通过坐标获取附近的相机
     * @参数 [cmd]
     * @返回值 java.util.Map
     * @创建人 刘苏义
     * @创建时间 2023/6/17 11:55
     * @修改人和其它信息
     */
    @Override
    public TreeMap getNearCamerasBycoordinate(CameraCmd cmd) {
        try {
            String dayNightTime = redisCache.getCacheObject("sys_config:dayNightTime");
            //获取所有大光电
            List<ArdCameras> ardCamerasList = ardCamerasMapper.selectArdCamerasList(new ArdCameras("1"));
            //统计所有大光电可视范围内与报警点的距离
            Map<String, Double> distanceMap = new HashMap<>();
            TreeMap<Double,ArdCameras> ardCameras = new TreeMap<>();
            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);
                    camera.setChannel(ArdTool.getChannelBydayNightTime(dayNightTime));
                    ardCameras.put(distance,camera);
                }
            }
            return ardCameras;
        } catch (Exception ex) {
            log.error("引导异常:" + ex.getMessage());
        }
        return null;
    }
}
ard-work/src/main/java/com/ruoyi/management3d/tiles3d/controller/ArdTiles3dController.java
@@ -29,15 +29,14 @@
/**
 * 三维实景Controller
 *
 *
 * @author ard
 * @date 2023-06-16
 */
@RestController
@RequestMapping("/management3d/tiles3d")
@Api(tags = "三维实景接口")
public class ArdTiles3dController extends BaseController
{
public class ArdTiles3dController extends BaseController {
    @Autowired
    private IArdTiles3dService ardTiles3dService;
@@ -47,8 +46,7 @@
    @PreAuthorize("@ss.hasPermi('management3d:tiles3d:list')")
    @GetMapping("/list")
    @ApiOperation("查询三维实景列表")
    public TableDataInfo list(ArdTiles3d ardTiles3d)
    {
    public TableDataInfo list(ArdTiles3d ardTiles3d) {
        startPage();
        List<ArdTiles3d> list = ardTiles3dService.selectArdTiles3dList(ardTiles3d);
        return getDataTable(list);
@@ -60,8 +58,7 @@
    @PreAuthorize("@ss.hasPermi('management3d:tiles3d:export')")
    @Log(title = "三维实景", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ArdTiles3d ardTiles3d)
    {
    public void export(HttpServletResponse response, ArdTiles3d ardTiles3d) {
        List<ArdTiles3d> list = ardTiles3dService.selectArdTiles3dList(ardTiles3d);
        ExcelUtil<ArdTiles3d> util = new ExcelUtil<ArdTiles3d>(ArdTiles3d.class);
        util.exportExcel(response, list, "三维实景数据");
@@ -72,8 +69,7 @@
     */
    @PreAuthorize("@ss.hasPermi('management3d:tiles3d:query')")
    @GetMapping(value = "/{tilesId}")
    public AjaxResult getInfo(@PathVariable("tilesId") String tilesId)
    {
    public AjaxResult getInfo(@PathVariable("tilesId") String tilesId) {
        return success(ardTiles3dService.selectArdTiles3dByTilesId(tilesId));
    }
@@ -83,8 +79,7 @@
    @PreAuthorize("@ss.hasPermi('management3d:tiles3d:add')")
    @Log(title = "三维实景", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody ArdTiles3d ardTiles3d)
    {
    public AjaxResult add(@RequestBody ArdTiles3d ardTiles3d) {
        return toAjax(ardTiles3dService.insertArdTiles3d(ardTiles3d));
    }
@@ -94,8 +89,7 @@
    @PreAuthorize("@ss.hasPermi('management3d:tiles3d:edit')")
    @Log(title = "三维实景", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody ArdTiles3d ardTiles3d)
    {
    public AjaxResult edit(@RequestBody ArdTiles3d ardTiles3d) {
        return toAjax(ardTiles3dService.updateArdTiles3d(ardTiles3d));
    }
@@ -104,22 +98,21 @@
     */
    @PreAuthorize("@ss.hasPermi('management3d:tiles3d:remove')")
    @Log(title = "三维实景", businessType = BusinessType.DELETE)
    @DeleteMapping("/{tilesIds}")
    public AjaxResult remove(@PathVariable String[] tilesIds)
    {
    @DeleteMapping("/{tilesIds}")
    public AjaxResult remove(@PathVariable String[] tilesIds) {
        return toAjax(ardTiles3dService.deleteArdTiles3dByTilesIds(tilesIds));
    }
    @GetMapping("/getDeptAndTiles3d")
    @ApiOperation("获取部门和三维实景")
    public AjaxResult getDeptAndTiles3d()
    {
    public AjaxResult getDeptAndTiles3d() {
        Map deptAndTiles3d = ardTiles3dService.getChildDeptAndTiles3d();
        return AjaxResult.success(deptAndTiles3d);
    }
    @GetMapping("/getChildTiles3d")
    @ApiOperation("获取三维实景")
    public AjaxResult getChildTiles3d()
    {
    public AjaxResult getChildTiles3d() {
        Map deptAndTiles3d = ardTiles3dService.getChildTiles3d();
        return AjaxResult.success(deptAndTiles3d);
    }
ard-work/src/main/java/com/ruoyi/management3d/tiles3d/service/impl/ArdTiles3dServiceImpl.java
@@ -106,7 +106,11 @@
    public int deleteArdTiles3dByTilesId(String tilesId) {
        return ardTiles3dMapper.deleteArdTiles3dByTilesId(tilesId);
    }
    /**
     * 获取部门和三维实景
     *
     * @return 结果
     */
    @Override
    public Map getChildDeptAndTiles3d() {
        Long deptId = SecurityUtils.getDeptId();
@@ -114,7 +118,11 @@
        Map<String, Object> map = fetchChildDepartments(sysDept);
        return map;
    }
    /**
     * 只获取三维实景
     *
     * @return 结果
     */
    @Override
    public Map getChildTiles3d() {
        Long deptId = SecurityUtils.getDeptId();
@@ -124,7 +132,7 @@
    }
    /**
     * @描述 递归查询
     * @描述 递归查询-获取部门和三维实景
     * @参数 [sysDept]
     * @返回值 java.util.Map<java.lang.String, java.lang.Object>
     * @创建人 刘苏义
ard-work/src/main/java/com/ruoyi/utils/tools/ArdTool.java
@@ -1,6 +1,11 @@
package com.ruoyi.utils.tools;
import com.ruoyi.common.core.redis.RedisCache;
import lombok.extern.slf4j.Slf4j;
import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.time.LocalTime;
import java.util.*;
/**
@@ -10,6 +15,7 @@
 * @Date: 2023年06月02日14:37
 * @Version: 1.0
 **/
@Slf4j
public class ArdTool {
    /**
@@ -48,4 +54,37 @@
//        String max = list.get(list.size() - 1).getKey();
        return min;
    }
    /**
     * @描述 通过日夜切换时间判断当前使用通道号
     * @参数 []
     * @返回值 java.lang.Integer
     * @创建人 刘苏义
     * @创建时间 2023/6/17 13:50
     * @修改人和其它信息
     */
    public static Integer getChannelBydayNightTime(String dayNightTime)
    {
        try {
            // 获取当前时间
            LocalTime currentTime = LocalTime.now();
            String[] dayNight = dayNightTime.split("-");
            // 解析时间字符串
            LocalTime startTime = LocalTime.parse(dayNight[0]);
            LocalTime endTime = LocalTime.parse(dayNight[1]);
            // 检查当前时间是否在给定的时间范围内
            boolean isWithinRange = !currentTime.isBefore(startTime) && !currentTime.isAfter(endTime);
            // 输出结果
            if (isWithinRange) {
                return 1;
            } else {
                return 2;
            }
        }
        catch (Exception ex)
        {
            log.error("光电切换获取通道异常:"+ex.getMessage());
            return 1;
        }
    }
}
ard-work/src/main/resources/mapper/device/ArdCamerasMapper.xml
@@ -30,7 +30,8 @@
        <result property="loginId" column="login_id"/>
        <result property="operatorId" column="operator_id"/>
        <result property="operatorExpired" column="operator_expired"/>
        <result property="camMaxVisibleDistance"    column="cam_max_visible_distance"    />
        <result property="camMaxVisibleDistance" column="cam_max_visible_distance"/>
        <result property="camAlarmGuideEnable" column="cam_alarm_guide_enable"/>
    </resultMap>
    <sql id="selectArdCamerasVo">
@@ -58,7 +59,8 @@
               c.cam_fov,
               c.operator_id,
               c.operator_expired,
               c.cam_max_visible_distance
               c.cam_max_visible_distance,
               c.cam_alarm_guide_enable
        from ard_cameras c
                 left join sys_dept d on d.dept_id = c.dept_id
                 left join sys_user u on u.user_id = c.user_id
@@ -92,6 +94,7 @@
            <if test="camDepth != null ">and c.cam_depth = #{camDepth}</if>
            <if test="camFov != null ">and c.cam_fov = #{camFov}</if>
            <if test="camMaxVisibleDistance != null ">and c.cam_max_visible_distance = #{camMaxVisibleDistance}</if>
            <if test="camAlarmGuideEnable != null ">and c.cam_alarm_guide_enable = #{camAlarmGuideEnable}</if>
            <if test="loginId != null ">and c.login_id = #{loginId}</if>
            <!-- 数据范围过滤 -->
            ${params.dataScope}
@@ -125,6 +128,7 @@
            <if test="camDepth != null ">and c.cam_depth = #{camDepth}</if>
            <if test="camFov != null ">and c.cam_fov = #{camFov}</if>
            <if test="camMaxVisibleDistance != null ">and c.cam_max_visible_distance = #{camMaxVisibleDistance}</if>
            <if test="camAlarmGuideEnable != null ">and c.cam_alarm_guide_enable = #{camAlarmGuideEnable}</if>
            <if test="loginId != null ">and c.login_id = #{loginId}</if>
        </where>
    </select>
@@ -157,6 +161,7 @@
            <if test="camDepth != null">cam_depth,</if>
            <if test="camFov != null">cam_fov,</if>
            <if test="camMaxVisibleDistance != null ">cam_max_visible_distance,</if>
            <if test="camAlarmGuideEnable != null">cam_alarm_guide_enable,</if>
            <if test="loginId != null">login_id,</if>
            <if test="deptId != null">dept_id,</if>
            <if test="userId != null">user_id,</if>
@@ -187,6 +192,7 @@
            <if test="camDepth != null">#{camDepth},</if>
            <if test="camFov != null">#{camFov},</if>
            <if test="camMaxVisibleDistance != null ">#{camMaxVisibleDistance},</if>
            <if test="camAlarmGuideEnable != null">#{camAlarmGuideEnable},</if>
            <if test="loginId != null">#{loginId},</if>
            <if test="deptId != null">#{deptId},</if>
            <if test="userId != null">#{userId},</if>
@@ -220,6 +226,7 @@
            <if test="camDepth != null">cam_depth = #{camDepth},</if>
            <if test="camFov != null">cam_fov = #{camFov},</if>
            <if test="camMaxVisibleDistance != null ">cam_max_visible_distance = #{camMaxVisibleDistance},</if>
            <if test="camAlarmGuideEnable != null">cam_alarm_guide_enable = #{camAlarmGuideEnable},</if>
            <if test="loginId != null">login_id = #{loginId},</if>
            <if test="deptId != null">dept_id = #{deptId},</if>
            <if test="userId != null">user_id = #{userId},</if>
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
@@ -48,7 +48,7 @@
    /** 请求参数 */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    @ApiModelProperty(value = "动态参数", name = "params", notes = "根据不同的查询字段自由配置参数", required = true)
    @ApiModelProperty(value = "动态参数", name = "params", notes = "根据不同的查询字段自由配置参数")
    private Map<String, Object> params;
    @ApiModelProperty(value = "页码", name = "pageNum", notes = "页码", required = true)
    private Integer pageNum;