package com.ruoyi.alarm.globalAlarm.service.impl;
|
|
import com.alibaba.fastjson2.JSONObject;
|
import com.ruoyi.alarm.cameraAlarm.domain.ArdAlarmCamera;
|
import com.ruoyi.alarm.cameraAlarm.mapper.ArdAlarmCameraMapper;
|
import com.ruoyi.alarm.globalAlarm.domain.GlobalAlarmCondition;
|
import com.ruoyi.alarm.globalAlarm.domain.GlobalAlarmData;
|
import com.ruoyi.alarm.globalAlarm.domain.GuidePriorityQueue;
|
import com.ruoyi.alarm.globalAlarm.domain.GuideTask;
|
import com.ruoyi.alarm.globalAlarm.service.IGlobalAlarmService;
|
import com.ruoyi.alarm.radarAlarm.domain.ArdAlarmRadar;
|
import com.ruoyi.alarm.radarAlarm.domain.RadarAlarmData;
|
import com.ruoyi.alarm.radarAlarm.mapper.ArdAlarmRadarMapper;
|
import com.ruoyi.alarm.stealAlarm.domain.ArdAlarmStealelec;
|
import com.ruoyi.alarm.stealAlarm.mapper.ArdAlarmStealelecMapper;
|
import com.ruoyi.alarm.tubeAlarm.domain.ArdAlarmTube;
|
import com.ruoyi.alarm.tubeAlarm.mapper.ArdAlarmTubeMapper;
|
import com.ruoyi.alarmpoints.tube.domain.ArdTubes;
|
import com.ruoyi.alarmpoints.tube.domain.ArdTubesDetails;
|
import com.ruoyi.alarmpoints.tube.mapper.ArdTubesDetailsMapper;
|
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.constant.CamPriority;
|
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.service.IHikClientService;
|
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.*;
|
import java.util.concurrent.PriorityBlockingQueue;
|
import java.util.stream.Collectors;
|
|
|
/**
|
* @Description: 全局报警业务
|
* @ClassName: globalAlarmServiceImpl
|
* @Author: Administrator
|
* @Date: 2023年03月10日 11:03
|
* @Version: 1.0
|
**/
|
@Service
|
@Slf4j(topic = "mqtt")
|
public class GlobalAlarmServiceImpl implements IGlobalAlarmService {
|
//region 依赖注入
|
@Resource
|
private ArdAlarmRadarMapper ardAlarmRadarMapper;
|
@Resource
|
private ArdAlarmStealelecMapper ardAlarmStealelecMapper;
|
@Resource
|
private ArdAlarmTubeMapper ardAlarmTubeMapper;
|
@Resource
|
private ArdAlarmCameraMapper ardAlarmCameraMapper;
|
@Resource
|
private ArdTubesMapper ardTubesMapper;
|
@Resource
|
private ArdAlarmpointsWellMapper ardAlarmpointsWellMapper;
|
@Resource
|
private ArdTubesDetailsMapper ardTubesDetailsMapper;
|
@Resource
|
private ISysConfigService configService;
|
@Resource
|
private ArdCamerasMapper ardCamerasMapper;
|
@Resource
|
private IHikClientService hikClientService;
|
@Resource
|
private RedisCache redisCache;
|
@Resource
|
private QueueManager queueManager;
|
//endregion
|
|
/**
|
* @描述 查询所有报警的当前数量
|
* @参数 []
|
* @返回值 java.util.Map<java.lang.String, java.lang.Integer>
|
* @创建人 刘苏义
|
* @创建时间 2023/6/13 16:30
|
* @修改人和其它信息
|
*/
|
@Override
|
public Map<String, Object> selectAlarmLogsCount() {
|
Map<String, Object> map = new HashMap<>();
|
Map<String, Integer> countMap = new HashMap<>();
|
String refreshTime = configService.selectConfigByKey("refreshTime");
|
int count1001 = ardAlarmStealelecMapper.selectCountByStartTime(refreshTime);
|
countMap.put("1001", count1001);
|
int count1002 = ardAlarmCameraMapper.selectCountByAlarmTime(refreshTime);
|
countMap.put("1002", count1002);
|
int count1003 = ardAlarmRadarMapper.selectCountByAlarmTime(refreshTime, "运动目标检测");
|
countMap.put("1003", count1003);
|
int count1004 = ardAlarmRadarMapper.selectCountByAlarmTime(refreshTime, "热源检测");
|
countMap.put("1004", count1004);
|
int count1014 = ardAlarmTubeMapper.selectCountByAlarmTime(refreshTime);
|
countMap.put("1014", count1014);
|
map.put("20000", countMap);
|
return map;
|
}
|
|
/**
|
* @描述 按条件查询报警
|
* @参数 [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");
|
switch (condition.getCommand()) {
|
case 1001:
|
List<ArdAlarmStealelec> ardAlarmStealelecs = ardAlarmStealelecMapper.selectListAllByCommand(refreshTime);
|
return ardAlarmStealelecs.stream()
|
.map(ardAlarmStealelec -> {
|
GlobalAlarmData globalAlarmData = new GlobalAlarmData()
|
.setId(ardAlarmStealelec.getId())
|
.setName(ardAlarmStealelec.getDescribe())
|
.setAlarmTime(ardAlarmStealelec.getStartTime())
|
.setLongitude(ardAlarmStealelec.getLongitude())
|
.setLatitude(ardAlarmStealelec.getLatitude())
|
.setAltitude(ardAlarmStealelec.getAltitude())
|
.setCount(ardAlarmStealelec.getCount())
|
.setTotal(ardAlarmStealelec.getTotal());
|
return globalAlarmData;
|
})
|
.collect(Collectors.toList());
|
case 1002:
|
List<ArdAlarmCamera> ardAlarmCameras = ardAlarmCameraMapper.selectListAllByCommand(refreshTime);
|
return ardAlarmCameras.stream()
|
.map(ardAlarmCamera -> {
|
GlobalAlarmData globalAlarmData = new GlobalAlarmData()
|
.setId(ardAlarmCamera.getId())
|
.setName(ardAlarmCamera.getCameraName())
|
.setAlarmTime(ardAlarmCamera.getAlarmTime())
|
.setLongitude(ardAlarmCamera.getLongitude())
|
.setLatitude(ardAlarmCamera.getLatitude())
|
.setCount(ardAlarmCamera.getCount())
|
.setTotal(ardAlarmCamera.getTotal());
|
return globalAlarmData;
|
})
|
.collect(Collectors.toList());
|
case 1003:
|
List<ArdAlarmRadar> ardAlarmRadars = ardAlarmRadarMapper.selectListAllByCommand(refreshTime, "运动目标检测");
|
return ardAlarmRadars.stream()
|
.map(ardAlarmRadar -> {
|
GlobalAlarmData globalAlarmData = new GlobalAlarmData()
|
.setId(ardAlarmRadar.getId())
|
.setName(ardAlarmRadar.getName())
|
.setAlarmTime(ardAlarmRadar.getAlarmTime())
|
.setLongitude(ardAlarmRadar.getLongitude())
|
.setLatitude(ardAlarmRadar.getLatitude())
|
.setCount(ardAlarmRadar.getCount())
|
.setTotal(ardAlarmRadar.getTotal());
|
return globalAlarmData;
|
})
|
.collect(Collectors.toList());
|
case 1004:
|
ardAlarmRadars = ardAlarmRadarMapper.selectListAllByCommand(refreshTime, "热源检测");
|
return ardAlarmRadars.stream()
|
.map(ardAlarmRadar -> {
|
GlobalAlarmData globalAlarmData = new GlobalAlarmData()
|
.setId(ardAlarmRadar.getId())
|
.setName(ardAlarmRadar.getName())
|
.setAlarmTime(ardAlarmRadar.getAlarmTime())
|
.setLongitude(ardAlarmRadar.getLongitude())
|
.setLatitude(ardAlarmRadar.getLatitude())
|
.setCount(ardAlarmRadar.getCount())
|
.setTotal(ardAlarmRadar.getTotal());
|
return globalAlarmData;
|
})
|
.collect(Collectors.toList());
|
case 1014:
|
List<ArdAlarmTube> ardAlarmTubes = ardAlarmTubeMapper.selectListAllByCommand(refreshTime);
|
return ardAlarmTubes.stream()
|
.map(ardAlarmTube -> {
|
GlobalAlarmData globalAlarmData = new GlobalAlarmData()
|
.setId(ardAlarmTube.getId())
|
.setName(ardAlarmTube.getTubeName())
|
.setAlarmTime(ardAlarmTube.getAlarmTime())
|
.setLongitude(ardAlarmTube.getLongitude())
|
.setLatitude(ardAlarmTube.getLatitude())
|
.setAltitude(ardAlarmTube.getAltitude())
|
.setCount(ardAlarmTube.getCount())
|
.setTotal(ardAlarmTube.getTotal());
|
return globalAlarmData;
|
})
|
.collect(Collectors.toList());
|
default:
|
return null;
|
}
|
}
|
|
/**
|
* @描述 历史报警查询
|
* @参数 [command, beginTime, endTime, pageNum, pageSize]
|
* @返回值 java.lang.Object
|
* @创建人 刘苏义
|
* @创建时间 2023/6/28 13:30
|
* @修改人和其它信息
|
*/
|
@Override
|
public Object selectAlarmList(Integer command, String beginTime, String endTime, Integer pageNum, Integer pageSize) {
|
Map<String, Object> params = new HashMap<>();
|
params.put("beginTime", beginTime);
|
params.put("endTime", endTime);
|
switch (command) {
|
case 1001:
|
ArdAlarmStealelec aas = new ArdAlarmStealelec();
|
aas.setParams(params);
|
aas.setPageNum(pageNum);
|
aas.setPageSize(pageSize);
|
List<ArdAlarmStealelec> ardAlarmStealelecs = ardAlarmStealelecMapper.selectArdAlarmStealelecList(aas);
|
return ardAlarmStealelecs;
|
case 1002:
|
ArdAlarmCamera aac = new ArdAlarmCamera();
|
aac.setParams(params);
|
aac.setPageNum(pageNum);
|
aac.setPageSize(pageSize);
|
List<ArdAlarmCamera> ardAlarmCameras = ardAlarmCameraMapper.selectArdAlarmCameraList(aac);
|
return ardAlarmCameras;
|
case 1003:
|
ArdAlarmRadar aar = new ArdAlarmRadar();
|
aar.setParams(params);
|
aar.setPageNum(pageNum);
|
aar.setPageSize(pageSize);
|
aar.setAlarmType("运动目标检测");
|
List<ArdAlarmRadar> ardAlarmRadar = ardAlarmRadarMapper.selectArdAlarmRadarList(aar);
|
return ardAlarmRadar;
|
case 1004:
|
ArdAlarmRadar aarr = new ArdAlarmRadar();
|
aarr.setParams(params);
|
aarr.setPageNum(pageNum);
|
aarr.setPageSize(pageSize);
|
aarr.setAlarmType("热源检测");
|
List<ArdAlarmRadar> ardAlarmRadarr = ardAlarmRadarMapper.selectArdAlarmRadarList(aarr);
|
return ardAlarmRadarr;
|
case 1014:
|
ArdAlarmTube aat = new ArdAlarmTube();
|
aat.setParams(params);
|
aat.setPageNum(pageNum);
|
aat.setPageSize(pageSize);
|
List<ArdAlarmTube> ardAlarmTubes = ardAlarmTubeMapper.selectArdAlarmTubeList(aat);
|
return ardAlarmTubes;
|
}
|
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)) {
|
String describe = ardAlarmStealelec.getDescribe();
|
String startTime = fmt.format(ardAlarmStealelec.getStartTime());
|
int i = ardAlarmStealelecMapper.updateViewTimeByDescribe(describe, startTime, DateUtils.getTime());
|
return ardAlarmStealelec;
|
}
|
case 1014:
|
ArdAlarmTube ardAlarmTube = ardAlarmTubeMapper.selectArdAlarmTubeById(condition.getId());
|
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;
|
}
|
}
|
|
/**
|
* @描述 异步处理接收的报警
|
* @参数 [topic, message]
|
* @返回值 void
|
* @创建人 刘苏义
|
* @创建时间 2023/6/15 15:46
|
* @修改人和其它信息
|
*/
|
@Override
|
@Async("alarmExecutor")
|
public void receiveAlarm(String topic, String message) {
|
try {
|
switch (topic) {
|
case "stealelec":
|
//region 处理盗电报警
|
ArdAlarmStealelec ardAlarmStealelec = JSONObject.parseObject(message, ArdAlarmStealelec.class);
|
ArdAlarmStealelec isExiste = ardAlarmStealelecMapper.selectByPrimaryKey(ardAlarmStealelec.getId());
|
if (StringUtils.isNull(isExiste)) {
|
int aas = ardAlarmStealelecMapper.insertArdAlarmStealelec(ardAlarmStealelec);
|
if (aas > 0) {
|
log.info("stealelec入库成功:" + ardAlarmStealelec);
|
}
|
}
|
//endregion
|
break;
|
case "tube":
|
//region 处理管线泄露报警
|
ArdAlarmTube ardAlarmTube = JSONObject.parseObject(message, ArdAlarmTube.class);
|
ardAlarmTube.setId(IdUtils.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());
|
ardAlarmTube.setCreateTime(new Date());
|
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.debug("tube入库成功:" + ardAlarmTube);
|
Double longitude = ardAlarmTube.getLongitude();
|
Double latitude = ardAlarmTube.getLatitude();
|
if(StringUtils.isNull(longitude)||StringUtils.isNull(latitude))
|
{
|
return;
|
}
|
double[] coordinate=new double[]{longitude,latitude};
|
String nearbyCameraId = getNearbyCamera(new double[]{ardAlarmTube.getLongitude(), ardAlarmTube.getLatitude()});
|
if (StringUtils.isNotEmpty(nearbyCameraId)) {
|
messagesEnqueued(nearbyCameraId, ardAlarmTube.getId(), "sys_tube_leak",ardAlarmTube.getCreateTime(), 1,1,coordinate);
|
}
|
}
|
//endregion
|
break;
|
case "camera":
|
//region 处理通用光电报警
|
ArdAlarmCamera ardAlarmCamera = JSONObject.parseObject(message, ArdAlarmCamera.class);
|
ardAlarmCamera.setId(IdUtils.simpleUUID());
|
|
int aac = ardAlarmCameraMapper.insertArdAlarmCamera(ardAlarmCamera);
|
if (aac > 0) {
|
log.debug("camera入库成功:" + ardAlarmCamera);
|
}
|
//endregion
|
break;
|
case "radar":
|
//region 处理雷达报警
|
RadarAlarmData radarAlarmData = JSONObject.parseObject(message, RadarAlarmData.class);
|
List<ArdAlarmRadar> ardAlarmRadars = radarAlarmData.getArdAlarmRadars();
|
for (ArdAlarmRadar ardAlarmRadar : ardAlarmRadars) {
|
String uuid = IdUtils.simpleUUID();
|
ardAlarmRadar.setId(uuid);//报警ID
|
ardAlarmRadar.setAlarmTime(radarAlarmData.getAlarmTime());//报警时间
|
String alarmpointName = ardAlarmRadar.getName();//兴趣点名称
|
ardAlarmRadar.setName(ardAlarmRadar.getName() + "(" + radarAlarmData.getRadarName() + ")");//报警点名称
|
ardAlarmRadar.setCreateTime(new Date());//接收时间
|
double[] coordinate=new double[]{ardAlarmRadar.getLongitude(),ardAlarmRadar.getLatitude()};//报警坐标
|
String alarmType = "";
|
switch (ardAlarmRadar.getAlarmType()) {
|
case "运动目标检测":
|
alarmType = "sys_radar_move";
|
break;
|
case "热源检测":
|
alarmType = "sys_radar_fire";
|
break;
|
}
|
//判断当前报警点5分钟内是否已引导
|
ardAlarmRadar.setGuideFlag(1);
|
ArdAlarmRadar AlarmRadar = ardAlarmRadarMapper.getArdAlarmRadarWithGuide(ardAlarmRadar);
|
if (StringUtils.isNull(AlarmRadar)) {
|
//5分钟内未引导直接入库
|
ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
|
//获取雷达所在塔上的大光电
|
String cameraIdWithTower = ardAlarmRadarMapper.getCameraByRadar(radarAlarmData.getRadarId());
|
if (StringUtils.isNotNull(cameraIdWithTower) && StringUtils.isNotEmpty(cameraIdWithTower)) {
|
log.info("获取到雷达塔上的光电:"+cameraIdWithTower);
|
//如果雷达塔上有光电
|
messagesEnqueued(cameraIdWithTower, uuid, alarmType, ardAlarmRadar.getCreateTime(),1,1,coordinate);
|
}
|
//获取报警点关联的大光电
|
ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(alarmpointName);
|
if(StringUtils.isNotNull(ardAlarmpointsWell) && StringUtils.isNotEmpty(ardAlarmpointsWell.getCameraId()))
|
{
|
String cameraId = ardAlarmpointsWell.getCameraId();
|
if(cameraIdWithTower.equals(cameraId))
|
{
|
return;
|
}
|
log.info("获取到报警点关联的光电:"+cameraId);
|
//如果报警点关联了光电
|
messagesEnqueued(cameraId, uuid, alarmType,ardAlarmRadar.getCreateTime(), 1,2,coordinate);
|
}
|
} else {
|
//5分钟内有引导
|
ardAlarmRadar.setGuideFlag(0);
|
int count = ardAlarmRadarMapper.getArdAlarmRadarWithNotGuide(ardAlarmRadar, AlarmRadar.getCreateTime());
|
//未引导超过3次,直接入库入队
|
if (count >= 3) {
|
ardAlarmRadar.setGuideFlag(1);
|
ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
|
|
//获取雷达所在塔上的大光电
|
String cameraIdWithTower = ardAlarmRadarMapper.getCameraByRadar(radarAlarmData.getRadarId());
|
if (StringUtils.isNotNull(cameraIdWithTower) && StringUtils.isNotEmpty(cameraIdWithTower)) {
|
log.info("获取到雷达塔上的光电:"+cameraIdWithTower);
|
//如果雷达塔上有光电
|
messagesEnqueued(cameraIdWithTower, uuid, alarmType,ardAlarmRadar.getCreateTime(), count,1,coordinate);
|
}
|
//获取报警点关联的大光电
|
ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(alarmpointName);
|
if(StringUtils.isNotNull(ardAlarmpointsWell) && StringUtils.isNotEmpty(ardAlarmpointsWell.getCameraId()))
|
{
|
String cameraId = ardAlarmpointsWell.getCameraId();
|
if(cameraIdWithTower.equals(cameraId))
|
{
|
return;
|
}
|
log.info("获取到报警点关联的光电:"+cameraId);
|
//如果报警点关联了光电
|
messagesEnqueued(cameraId, uuid, alarmType,ardAlarmRadar.getCreateTime(), count,2,coordinate);
|
}
|
} else {
|
//未引导未超过3次,直接入库
|
ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
|
}
|
}
|
}
|
//endregion
|
break;
|
}
|
} catch (Exception ex) {
|
log.error("接收报警异常:" + ex.getMessage());
|
}
|
}
|
|
/**
|
* 消息入队
|
*
|
* cameraId 相机ID
|
* alarmId 报警ID
|
* alarmType 报警类型
|
* num 报警次数
|
* recordSn 录像存储位置 1-recordUrl1 2-recordUrl2
|
* targetPosition 报警点位置坐标
|
*/
|
private void messagesEnqueued(String cameraId, String alarmId, String alarmType,Date receiveTime, Integer num, Integer recordSn,double[] targetPosition) {
|
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
GuideTask guideTask = new GuideTask();
|
//相机ID
|
guideTask.setCameraId(cameraId);
|
//报警类型
|
guideTask.setAlarmType(alarmType);
|
//通道(通过日夜时间研判)
|
String dayNightTime = redisCache.getCacheObject("sys_config:dayNightTime");
|
Integer channel = ArdTool.getChannelBydayNightTime(dayNightTime);
|
guideTask.setChanNum(channel);
|
//报警ID
|
guideTask.setAlarmId(alarmId);
|
//接收时间
|
guideTask.setReceiveTime(fmt.format(receiveTime));
|
//报警优先级(通过优先级字典)
|
Integer priority = CamPriority.priorityMap.get(alarmType);
|
guideTask.setPriority(priority);
|
//报警次数
|
guideTask.setNum(num);
|
//录像存储位置
|
guideTask.setRecordSn(recordSn);
|
//目标经纬度
|
guideTask.setTargetPosition(targetPosition);
|
//消息入队
|
queueManager.addTaskToQueue(cameraId, guideTask);
|
//打印队列
|
GuidePriorityQueue.printPriorityQueue();
|
}
|
|
/**
|
* 获取附近开启报警引导功能光电
|
*/
|
private String getNearbyCamera(double[] targetPosition) {
|
String minDistanceCameraId = "";
|
//获取所有大光电
|
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(targetPosition, camPosition);
|
if (distance != 0.0 && distance <= camera.getCamMaxVisibleDistance()) {
|
distanceMap.put(camera.getId(), distance);
|
if (StringUtils.isNull(camera.getCamAlarmGuideEnable())) {
|
camera.setCamAlarmGuideEnable(0);
|
}
|
guideMap.put(camera.getId(), camera.getCamAlarmGuideEnable());
|
}
|
}
|
if (distanceMap.size() > 0) {
|
log.debug("尝试查找最近光电");
|
//获取距离字典中最近的一个相机ID
|
minDistanceCameraId = ArdTool.getKeyByMinValue(distanceMap);
|
log.debug("查找到最近光电:" + minDistanceCameraId);
|
if (guideMap.get(minDistanceCameraId).equals(0)) {
|
log.debug("该光电未开启报警引导");
|
return " ";
|
}
|
}
|
return minDistanceCameraId;
|
}
|
|
}
|