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.service.IGlobalAlarmService; import com.ruoyi.alarm.radarAlarm.domain.ArdAlarmRadar; 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.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.stream.Collectors; /** * @ClassName: globalAlarmServiceImpl * @Description: * @Author: Administrator * @Date: 2023年03月10日 11:03 * @Version: 1.0 **/ @Service @Slf4j(topic = "mqtt") public class GlobalAlarmServiceImpl implements IGlobalAlarmService { @Resource ArdAlarmRadarMapper ardAlarmRadarMapper; @Resource ArdAlarmStealelecMapper ardAlarmStealelecMapper; @Resource ArdAlarmTubeMapper ardAlarmTubeMapper; @Resource ArdAlarmCameraMapper ardAlarmCameraMapper; @Resource ArdTubesMapper ardTubesMapper; @Resource ArdAlarmpointsWellMapper ardAlarmpointsWellMapper; @Resource ArdTubesDetailsMapper ardTubesDetailsMapper; @Resource private ISysConfigService configService; @Resource private ArdCamerasMapper ardCamerasMapper; @Resource private IHikClientService hikClientService; @Resource private RedisCache redisCache; /** * @描述 按条件查询报警 * @参数 [condition] * @返回值 java.util.List * @创建人 刘苏义 * @创建时间 2023/6/15 15:48 * @修改人和其它信息 */ @Override public List selectAlarmLogs(GlobalAlarmCondition condition) { String refreshTime = configService.selectConfigByKey("refreshTime"); switch (condition.getCommand()) { case 1001: List 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 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 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 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; } } /** * @描述 按条件更新查看时间 * @参数 [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 { 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.setAltitude(well.getAltitude()); } ArdAlarmStealelec existe = ardAlarmStealelecMapper.selectByPrimaryKey(ardAlarmStealelec.getId()); if (StringUtils.isNotNull(existe)) { return; } 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(); atd.setReelNumber(ardAlarmTube.getTubeId()); List ardTubesDetails = ardTubesDetailsMapper.selectArdTubesDetailsList(atd); if (ardTubesDetails.size() > 0) { String tubeId = ardTubesDetails.get(0).getTubeId(); ArdTubes ardTubes = ardTubesMapper.selectArdTubesById(tubeId); ardAlarmTube.setTubeName(ardTubes.getName()); ardAlarmTube.setColor(ardTubes.getColor()); ardAlarmTube.setPipeDiameter(ardTubes.getPipeDiameter()); ardAlarmTube.setTubeType(ardTubes.getType()); GeoPoint geoPoint = TubeTools.CalculateCoordinates(ardTubesDetails, ardAlarmTube.getPosition()); if (StringUtils.isNotNull(geoPoint)) { ardAlarmTube.setLongitude(geoPoint.getLongitude()); ardAlarmTube.setLatitude(geoPoint.getLatitude()); ardAlarmTube.setAltitude(geoPoint.getAltitude()); } } int aat = ardAlarmTubeMapper.insertArdAlarmTube(ardAlarmTube); if (aat > 0) { log.debug("tube入库成功:" + ardAlarmTube); //引导录像 CameraCmd cmd = new CameraCmd(); cmd.setRecordBucketName("record"); cmd.setRecordObjectName("tube"); cmd.setOperator("sys_tube_leak"); cmd.setExpired(30); 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; case "camera": //region 处理通用光电报警 ArdAlarmCamera ardAlarmCamera = JSONObject.parseObject(message, ArdAlarmCamera.class); ardAlarmCamera.setId(simpleUUID); int aac = ardAlarmCameraMapper.insertArdAlarmCamera(ardAlarmCamera); if (aac > 0) { log.debug("camera入库成功:" + ardAlarmCamera); //引导录像 CameraCmd cmd = new CameraCmd(); cmd.setRecordBucketName("record"); cmd.setRecordObjectName("camera"); cmd.setOperator("sys_camera"); cmd.setExpired(30); cmd.setTargetPosition(new double[]{ardAlarmCamera.getLongitude(), ardAlarmCamera.getLatitude()}); String url = guideCamera(cmd); //更新录像 if (StringUtils.isNotEmpty(url)) { ardAlarmCamera.setRecordUrl(url); ardAlarmCameraMapper.updateArdAlarmCamera(ardAlarmCamera); } } //endregion break; case "radar": //region 处理雷达报警 ArdAlarmRadar ardAlarmRadar = JSONObject.parseObject(message, ArdAlarmRadar.class); ardAlarmRadar.setId(simpleUUID); int aar = ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar); if (aar > 0) { log.debug("radar入库成功:" + ardAlarmRadar); } //endregion break; } } catch (Exception ex) { log.error("接收报警异常:" + ex.getMessage()); } } /** * @描述 引导最近的大光电指向目标 * @参数 [targetPosition] * @返回值 java.lang.String * @创建人 刘苏义 * @创建时间 2023/6/15 11:55 * @修改人和其它信息 */ private String guideCamera(CameraCmd cmd) { String url = ""; try { String dayNightTime = redisCache.getCacheObject("sys_config:dayNightTime"); //获取所有大光电 List ardCamerasList = ardCamerasMapper.selectArdCamerasList(new ArdCameras("1")); //统计所有大光电可视范围内与报警点的距离 Map distanceMap = new HashMap<>(); Map 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); if (StringUtils.isNull(camera.getCamAlarmGuideEnable())) { camera.setCamAlarmGuideEnable(0); } guideMap.put(camera.getId(), camera.getCamAlarmGuideEnable()); } } if (distanceMap.size() > 0) { log.debug("尝试查找最近光电"); //获取距离字典中最近的一个相机ID String minDistanceCameraId = ArdTool.getKeyByMinValue(distanceMap); log.debug("查找到最近光电:" + minDistanceCameraId + ",尝试引导"); if (guideMap.get(minDistanceCameraId).equals(0)) { log.debug("该光电未开启报警引导"); return ""; } //引导光电 cmd.setCameraId(minDistanceCameraId); cmd.setChannelNum(ArdTool.getChannelBydayNightTime(dayNightTime)); 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 * @创建人 刘苏义 * @创建时间 2023/6/13 16:30 * @修改人和其它信息 */ @Override public Map selectAlarmLogsCount() { Map map = new HashMap<>(); Map 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; } @Override public Object selectAlarmList(Integer command, String beginTime, String endTime, Integer pageNum, Integer pageSize) { Map 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 ardAlarmStealelecs = ardAlarmStealelecMapper.selectArdAlarmStealelecList(aas); return ardAlarmStealelecs; case 1002: ArdAlarmCamera aac = new ArdAlarmCamera(); aac.setParams(params); aac.setPageNum(pageNum); aac.setPageSize(pageSize); List 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 = ardAlarmRadarMapper.selectArdAlarmRadarList(aar); return ardAlarmRadar; case 1004: ArdAlarmRadar aarr = new ArdAlarmRadar(); aarr.setParams(params); aarr.setPageNum(pageNum); aarr.setPageSize(pageSize); aarr.setAlarmType("热源检测"); List ardAlarmRadarr = ardAlarmRadarMapper.selectArdAlarmRadarList(aarr); return ardAlarmRadarr; case 1014: ArdAlarmTube aat = new ArdAlarmTube(); aat.setParams(params); aat.setPageNum(pageNum); aat.setPageSize(pageSize); List ardAlarmTubes = ardAlarmTubeMapper.selectArdAlarmTubeList(aat); return ardAlarmTubes; } return null; } public static void main(String[] args) { // 给定坐标 A double Ax = 0; double Ay = 0; // 给定角度(以度为单位) double angle = 45; // 给定距离 double distance = 1.414; // 将角度转换为弧度 double radians = Math.toRadians(angle); // 计算 B 坐标 double Bx = Ax + distance * Math.cos(radians); double By = Ay + distance * Math.sin(radians); // 输出结果 System.out.println("坐标 B: (" + Bx + ", " + By + ")"); } }