增加获取附近相机接口
增加相机报警引导开关
增加日夜切换变换通道
| | |
| | | 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; |
| | |
| | | @RestController |
| | | @RequestMapping("/ardAlarm") |
| | | @Api(tags = "报警数据汇总接口") |
| | | @ApiSupport(author = "刘苏义") |
| | | @Anonymous |
| | | public class GlobalAlarmController { |
| | | |
| | |
| | | |
| | | @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); |
| | |
| | | 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; |
| | |
| | | private ArdCamerasMapper ardCamerasMapper; |
| | | @Resource |
| | | private IHikClientService hikClientService; |
| | | @Resource |
| | | private RedisCache redisCache; |
| | | /** |
| | | * @描述 按条件查询报警 |
| | | * @参数 [condition] |
| | |
| | | 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) { |
| | |
| | | //获取距离字典中最近的一个相机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("引导成功,尝试录像"); |
| | |
| | | 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; |
| | |
| | | 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 |
| | |
| | | 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); |
| | | } |
| | | } |
| | |
| | | */ |
| | | @Excel(name = "最大可视距离") |
| | | private Double camMaxVisibleDistance; |
| | | |
| | | /** 相机报警引导开关 */ |
| | | @Excel(name = "相机报警引导开关") |
| | | private Integer camAlarmGuideEnable; |
| | | /** |
| | | * 所属塔ID |
| | | */ |
| | |
| | | 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接口 |
| | |
| | | * @修改人和其它信息 |
| | | */ |
| | | public Map getChildDeptAndCamera(); |
| | | |
| | | |
| | | public TreeMap getNearCamerasBycoordinate(CameraCmd cmd); |
| | | } |
| | |
| | | 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; |
| | | |
| | | /** |
| | |
| | | * @date 2023-02-11 |
| | | */ |
| | | @Service |
| | | @Slf4j |
| | | public class ArdCamerasServiceImpl implements IArdCamerasService { |
| | | @Resource |
| | | private ArdCamerasMapper ardCamerasMapper; |
| | | @Resource |
| | | private SysDeptMapper sysDeptMapper; |
| | | @Resource |
| | | private RedisCache redisCache; |
| | | |
| | | |
| | | /** |
| | | * 查询相机设备 |
| | |
| | | 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; |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | |
| | | /** |
| | | * 三维实景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; |
| | | |
| | |
| | | @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); |
| | |
| | | @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, "三维实景数据"); |
| | |
| | | */ |
| | | @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)); |
| | | } |
| | | |
| | |
| | | @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)); |
| | | } |
| | | |
| | |
| | | @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)); |
| | | } |
| | | |
| | |
| | | */ |
| | | @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); |
| | | } |
| | |
| | | public int deleteArdTiles3dByTilesId(String tilesId) { |
| | | return ardTiles3dMapper.deleteArdTiles3dByTilesId(tilesId); |
| | | } |
| | | |
| | | /** |
| | | * 获取部门和三维实景 |
| | | * |
| | | * @return 结果 |
| | | */ |
| | | @Override |
| | | public Map getChildDeptAndTiles3d() { |
| | | Long deptId = SecurityUtils.getDeptId(); |
| | |
| | | Map<String, Object> map = fetchChildDepartments(sysDept); |
| | | return map; |
| | | } |
| | | |
| | | /** |
| | | * 只获取三维实景 |
| | | * |
| | | * @return 结果 |
| | | */ |
| | | @Override |
| | | public Map getChildTiles3d() { |
| | | Long deptId = SecurityUtils.getDeptId(); |
| | |
| | | } |
| | | |
| | | /** |
| | | * @描述 递归查询 |
| | | * @描述 递归查询-获取部门和三维实景 |
| | | * @参数 [sysDept] |
| | | * @返回值 java.util.Map<java.lang.String, java.lang.Object> |
| | | * @创建人 刘苏义 |
| | |
| | | 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.*; |
| | | |
| | | /** |
| | |
| | | * @Date: 2023年06月02日14:37 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Slf4j |
| | | public class ArdTool { |
| | | |
| | | /** |
| | |
| | | // 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; |
| | | } |
| | | } |
| | | } |
| | |
| | | <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"> |
| | |
| | | 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 |
| | |
| | | <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} |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | |
| | | /** 请求参数 */ |
| | | @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; |