From a6c3b8e6eb7a0d48649cfa93487532e62c353d37 Mon Sep 17 00:00:00 2001 From: ‘liusuyi’ <1951119284@qq.com> Date: 星期四, 24 八月 2023 15:03:55 +0800 Subject: [PATCH] 修改app从融云获取用户在线状态(有状态变化再更新数据库) --- ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java | 227 ++++++++++++++++++++++++++------------------------------ 1 files changed, 107 insertions(+), 120 deletions(-) diff --git a/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java b/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java index 6d761a0..385f1d5 100644 --- a/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java @@ -30,8 +30,8 @@ import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.DictUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.constant.CamPriority; import com.ruoyi.device.external.domain.ArdEquipExternal; import com.ruoyi.device.external.mapper.ArdEquipExternalMapper; import com.ruoyi.utils.tools.ArdTool; @@ -42,8 +42,6 @@ import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.utils.tube.GeoPoint; import com.ruoyi.utils.tube.TubeTools; -import lombok.AllArgsConstructor; -import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -51,8 +49,10 @@ import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; -import java.util.concurrent.PriorityBlockingQueue; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; + /** * @Description: 鍏ㄥ眬鎶ヨ涓氬姟 @@ -96,6 +96,8 @@ @Resource private QueueManager queueManager; //endregion + //姣忎釜鐐逛綅鏈紩瀵兼鏁� + private Map<String, Integer> unGuideCountMap = new HashMap<>(); /** * @鎻忚堪 鏌ヨ鎵�鏈夋姤璀︾殑褰撳墠鏁伴噺 @@ -500,6 +502,7 @@ //region 澶勭悊閫氱敤鍏夌數鎶ヨ ArdAlarmCamera ardAlarmCamera = JSONObject.parseObject(message, ArdAlarmCamera.class); ardAlarmCamera.setId(IdUtils.simpleUUID()); + ardAlarmCamera.setCreateTime(new Date()); int aac = ardAlarmCameraMapper.insertArdAlarmCamera(ardAlarmCamera); if (aac > 0) { log.debug("camera鍏ュ簱鎴愬姛锛�" + ardAlarmCamera); @@ -508,8 +511,6 @@ break; case "radar": //region 澶勭悊闆疯揪鎶ヨ - // 寮�濮嬫椂闂� - long stime = System.currentTimeMillis(); RadarAlarmData radarAlarmData = JSONObject.parseObject(message, RadarAlarmData.class); List<ArdAlarmRadar> ardAlarmRadars = radarAlarmData.getArdAlarmRadars(); for (ArdAlarmRadar ardAlarmRadar : ardAlarmRadars) { @@ -520,10 +521,9 @@ ardAlarmRadar.setName(ardAlarmRadar.getName() + "(" + radarAlarmData.getRadarName() + ")");//鎶ヨ鐐瑰悕绉� ardAlarmRadar.setCreateTime(new Date());//鎺ユ敹鏃堕棿 - String alarmType = ""; switch (ardAlarmRadar.getAlarmType()) { case "杩愬姩鐩爣妫�娴�": - alarmType = "sys_radar_move"; + String alarmType = "sys_radar_move"; break; case "鐑簮妫�娴�": alarmType = "sys_radar_fire"; @@ -537,75 +537,57 @@ } break; } + //鍏ュ簱 + ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar); + + } + //鎸夊叴瓒g偣鍘婚噸,鐒跺悗鎸夊紩瀵奸�昏緫杩涜寮曞鍏ラ槦 + ardAlarmRadars = ardAlarmRadars.stream() + .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new java.util.TreeSet<>(java.util.Comparator.comparing(ArdAlarmRadar::getName))), ArrayList::new)); + for(ArdAlarmRadar ardAlarmRadar : ardAlarmRadars) + { + //閬嶅巻鎶ヨ鏁版嵁杩涜寮曞 if (StringUtils.isNull(ardAlarmRadar.getLongitude()) || StringUtils.isNull(ardAlarmRadar.getLatitude())) { + //鍧愭爣涓虹┖涓嶅紩瀵� continue; } double[] coordinate = new double[]{ardAlarmRadar.getLongitude(), ardAlarmRadar.getLatitude()};//鎶ヨ鍧愭爣 + //浠巖edis涓彇鍑哄綋鍓嶆姤璀︾偣鐨�5鍒嗛挓鍐呮槸鍚︽湁寮曞 + ArdAlarmRadar AlarmRadar = redisCache.getCacheObject("global_alarm:" + ardAlarmRadar.getName());//浠巖edis涓彇鍑烘渶鏂板紩瀵肩殑鎶ヨ鏁版嵁 + if (AlarmRadar == null) { + //5鍒嗛挓鍐卹edis涓病鏈夋暟鎹紝璇存槑5鍒嗛挓鍐呮病鏈夊紩瀵兼暟鎹� + ardAlarmRadar.setGuideFlag(1); + //灏嗗紩瀵兼暟鎹啓鍏edis 璁剧疆5鍒嗛挓杩囨湡 + redisCache.setCacheObject("global_alarm:" + ardAlarmRadar.getName(), ardAlarmRadar, 5, TimeUnit.MINUTES);//寮曞鏁版嵁鍐欏叆redis + unGuideCountMap.put(ardAlarmRadar.getName(), 0); + //寮曞鍏ラ槦 + radarGuide(radarAlarmData.getRadarId(), ardAlarmRadar.getName(), ardAlarmRadar.getAlarmType(), ardAlarmRadar.getCreateTime(), coordinate); - //鍒ゆ柇褰撳墠鎶ヨ鐐�5鍒嗛挓鍐呮槸鍚﹀凡寮曞 - ardAlarmRadar.setGuideFlag(1); - // ArdAlarmRadar AlarmRadar = ardAlarmRadarMapper.getArdAlarmRadarWithGuide(ardAlarmRadar); - ArdAlarmRadar AlarmRadar = redisCache.getCacheObject("global_alarm:guideNew");//浠巖edis涓彇鍑烘渶鏂板紩瀵肩殑鎶ヨ鏁版嵁 - if (StringUtils.isNull(AlarmRadar)) { - //5鍒嗛挓鍐呮湭寮曞鐩存帴鍏ュ簱 - ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar); - redisCache.setCacheObject("global_alarm:guideNew",ardAlarmRadar);//寮曞鏁版嵁鍐欏叆redis - //鑾峰彇闆疯揪鎵�鍦ㄥ涓婄殑澶у厜鐢� - 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 (cameraId.equals(cameraIdWithTower)) { - 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); - redisCache.setCacheObject("global_alarm:guideNew",ardAlarmRadar);//寮曞鏁版嵁鍐欏叆redis - //鑾峰彇闆疯揪鎵�鍦ㄥ涓婄殑澶у厜鐢� - 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 (cameraId.equals(cameraIdWithTower)) { - return; - } - log.info("鑾峰彇鍒版姤璀︾偣鍏宠仈鐨勫厜鐢�:" + cameraId); - //濡傛灉鎶ヨ鐐瑰叧鑱斾簡鍏夌數 - messagesEnqueued(cameraId, uuid, alarmType, ardAlarmRadar.getCreateTime(), count, 2, coordinate); + //5鍒嗛挓鍐卹edis涓湁鏁版嵁锛岃鏄�5鍒嗛挓鍐呮湁寮曞鏁版嵁,鑾峰彇褰撳墠鎶ヨ鐐圭殑鏈紩瀵兼鏁� + Integer count = unGuideCountMap.get(ardAlarmRadar.getName()); + if (count != null) { + if (count > 2) { + //鏈紩瀵兼鏁�3娆″悗杩涜寮曞 + ardAlarmRadar.setGuideFlag(1); + //灏嗗紩瀵兼暟鎹啓鍏edis 璁剧疆5鍒嗛挓杩囨湡 + redisCache.setCacheObject("global_alarm:" + ardAlarmRadar.getName(), ardAlarmRadar, 5, TimeUnit.MINUTES); + count = 0; + //寮曞鍏ラ槦 + radarGuide(radarAlarmData.getRadarId(), ardAlarmRadar.getName(), ardAlarmRadar.getAlarmType(), ardAlarmRadar.getCreateTime(), coordinate); + } else { + ardAlarmRadar.setGuideFlag(0); + count++; } } else { - //鏈紩瀵兼湭瓒呰繃3娆★紝鐩存帴鍏ュ簱 - ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar); + ardAlarmRadar.setGuideFlag(0); + count = 0; } + unGuideCountMap.put(ardAlarmRadar.getName(), count); + //鏇存柊 + ardAlarmRadarMapper.updateArdAlarmRadar(ardAlarmRadar); } - // 缁撴潫鏃堕棿 - long etime = System.currentTimeMillis(); - // 璁$畻鎵ц鏃堕棿 - log.info("鏌ヨAPI鎵ц鏃堕暱锛�"+(etime-stime)+"姣"); } - //endregion break; case "external": @@ -698,7 +680,6 @@ log.info("鐩告満:" + cameraId + "鏈紑鍚姤璀﹀紩瀵煎姛鑳�"); return; } - SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); GuideTask guideTask = new GuideTask(); //鐩告満ID @@ -714,8 +695,12 @@ //鎺ユ敹鏃堕棿 guideTask.setReceiveTime(fmt.format(receiveTime)); //鎶ヨ浼樺厛绾�(閫氳繃浼樺厛绾у瓧鍏�) - Integer priority = CamPriority.priorityMap.get(alarmType); - guideTask.setPriority(priority); + String priority = DictUtils.getDictValue("cameras_priority", alarmType); + if (StringUtils.isEmpty(priority)) { + log.debug("鏈尮閰嶅埌浼樺厛绾�,璇锋鏌ヤ紭鍏堢骇瀛楀吀閰嶇疆"); + return; + } + guideTask.setPriority(Integer.valueOf(priority)); //鎶ヨ娆℃暟 guideTask.setNum(num); //褰曞儚瀛樺偍浣嶇疆 @@ -739,7 +724,7 @@ private Boolean IsEnableGuide(String cameraId) { boolean enabled = false; ArdCameras ardCameras = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId); - if(ardCameras!=null) { + if (ardCameras != null) { if (ardCameras.getCamAlarmGuideEnable().equals(1)) { enabled = true; } @@ -752,66 +737,68 @@ */ 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); + try { + //鑾峰彇鎵�鏈夊ぇ鍏夌數 + List<ArdCameras> ardCamerasList = ardCamerasMapper.selectArdCamerasList(new ArdCameras("1")); + //缁熻鎵�鏈夊ぇ鍏夌數鍙鑼冨洿鍐呬笌鎶ヨ鐐圭殑璺濈 + Map<String, Double> distanceMap = new HashMap<>(); + Map<String, Integer> guideMap = new HashMap<>(); + for (ArdCameras camera : ardCamerasList) { + if (camera.getCamMaxVisibleDistance() == null) { + continue; } - guideMap.put(camera.getId(), camera.getCamAlarmGuideEnable()); + 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("灏濊瘯鏌ユ壘鏈�杩戝厜鐢�"); + //鑾峰彇璺濈瀛楀吀涓渶杩戠殑涓�涓浉鏈篒D + minDistanceCameraId = ArdTool.getKeyByMinValue(distanceMap); + log.debug("鏌ユ壘鍒版渶杩戝厜鐢�:" + minDistanceCameraId); + if (guideMap.get(minDistanceCameraId).equals(0)) { + log.debug("璇ュ厜鐢垫湭寮�鍚姤璀﹀紩瀵�"); + return " "; + } } } - if (distanceMap.size() > 0) { - log.debug("灏濊瘯鏌ユ壘鏈�杩戝厜鐢�"); - //鑾峰彇璺濈瀛楀吀涓渶杩戠殑涓�涓浉鏈篒D - minDistanceCameraId = ArdTool.getKeyByMinValue(distanceMap); - log.debug("鏌ユ壘鍒版渶杩戝厜鐢�:" + minDistanceCameraId); - if (guideMap.get(minDistanceCameraId).equals(0)) { - log.debug("璇ュ厜鐢垫湭寮�鍚姤璀﹀紩瀵�"); - return " "; - } + catch (Exception ex) + { + log.error("鑾峰彇闄勮繎寮�鍚姤璀﹀紩瀵煎姛鑳藉厜鐢靛紓甯�:"+ex.getMessage()); } return minDistanceCameraId; } - public static void main(String[] args) { - Comparator<Obj> PriorityDescCom = Comparator.comparingInt(Obj::getPriority).reversed(); - Comparator<Obj> NumDescCom = Comparator.comparingInt(Obj::getNum).reversed(); - Comparator<Obj> receiveTimeAscCom = Comparator.comparing(Obj::getAlarmTime); - Comparator<Obj> comparator = PriorityDescCom.thenComparing(NumDescCom).thenComparing(receiveTimeAscCom); - PriorityBlockingQueue<Obj> priorityQueue = new PriorityBlockingQueue<>(1000, comparator); - - priorityQueue.add(new Obj(999, 1, "2023-07-01 16:00:01")); - priorityQueue.add(new Obj(999, 2, "2023-07-01 16:00:01")); - priorityQueue.add(new Obj(999, 3, "2023-07-01 16:00:01")); - - List<Obj> elements = new ArrayList<>(priorityQueue); - elements.sort(priorityQueue.comparator()); // 浣跨敤闃熷垪鐨勬瘮杈冨櫒杩涜鎺掑簭 - for (Obj task : elements) { - log.info("姝e湪鎺掗槦銆恜riority銆�" + task.getPriority() + "銆恘um銆�" + task.getNum() + "銆恆larmTime銆�" + task.getAlarmTime()); + /** + * 闆疯揪寮曞鍏ラ槦 + */ + private void radarGuide(String radarId, String alarmpointName, String alarmType, Date createTime, double[] coordinate) { + String uuid = IdUtils.simpleUUID(); + //鑾峰彇闆疯揪鎵�鍦ㄥ涓婄殑澶у厜鐢� + String cameraIdWithTower = ardAlarmRadarMapper.getCameraByRadar(radarId); + if (StringUtils.isNotNull(cameraIdWithTower) && StringUtils.isNotEmpty(cameraIdWithTower)) { + log.info("鑾峰彇鍒伴浄杈惧涓婄殑鍏夌數:" + cameraIdWithTower); + //濡傛灉闆疯揪濉斾笂鏈夊厜鐢� + messagesEnqueued(cameraIdWithTower, uuid, alarmType, createTime, 1, 1, coordinate); } - log.info("==================================================================="); - priorityQueue.add(new Obj(999, 5, "2023-07-01 16:00:01")); - PriorityBlockingQueue queue = new PriorityBlockingQueue<>(priorityQueue); - while (queue.size() > 0) { - Obj task = (Obj) queue.poll(); - log.info("姝e湪鎺掗槦銆恜riority銆�" + task.getPriority() + "銆恘um銆�" + task.getNum() + "銆恆larmTime銆�" + task.getAlarmTime()); + //鑾峰彇鎶ヨ鐐瑰叧鑱旂殑澶у厜鐢� + ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(alarmpointName); + if (StringUtils.isNotNull(ardAlarmpointsWell) && StringUtils.isNotEmpty(ardAlarmpointsWell.getCameraId())) { + String cameraId = ardAlarmpointsWell.getCameraId(); + if (cameraId.equals(cameraIdWithTower)) { + return; + } + log.info("鑾峰彇鍒版姤璀︾偣鍏宠仈鐨勫厜鐢�:" + cameraId); + //濡傛灉鎶ヨ鐐瑰叧鑱斾簡鍏夌數 + messagesEnqueued(cameraId, uuid, alarmType, createTime, 1, 2, coordinate); } } - @Data - @AllArgsConstructor - static class Obj { - Integer priority; - Integer num; - String alarmTime; - } } -- Gitblit v1.9.3