Просмотр исходного кода

Merge branch 'master' of http://124.70.58.209:3000/ytrd-project-management/GeoHazardMonitor

gao.qiang 1 год назад
Родитель
Сommit
f6fe0bc3e4

+ 12 - 0
business-service/src/main/java/com/ozs/service/entity/vo/BaseCameraVO.java

@@ -1,5 +1,7 @@
 package com.ozs.service.entity.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ozs.common.annotation.Excel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -30,6 +32,16 @@ public class BaseCameraVO implements Serializable{
      */
     private String channel;
 
+    /**
+     *线路名称
+     */
+    private String railwayName;
+
+    /**
+     * 监控相机安装里程位置
+     */
+    private String installMiles;
+
     /**
      * 下次执行时间
      */

+ 11 - 4
hazard-admin/src/main/java/com/ozs/web/controller/shotschedule/CaptureStreamListener.java

@@ -19,6 +19,8 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.io.File;
+import java.time.LocalDate;
 
 @Component
 @Slf4j
@@ -66,7 +68,8 @@ public class CaptureStreamListener implements StreamListener<String, ObjectRecor
             Dict dataDict = JSONUtil.toBean(value, Dict.class);
 
             String cameraCode = dataDict.getStr("cameraCode");
-
+            String railwayName = dataDict.getStr("railwayName");
+            String installMiles = dataDict.getStr("installMiles");
             Boolean isAlarm = dataDict.getBool("isAlarm");
             String camera_type_hash = isAlarm ? ShotPictureTaskExecutors.CAMERA_ALARM_HASH : ShotPictureTaskExecutors.CAMERA_NORMAL_HASH;
 
@@ -82,11 +85,15 @@ public class CaptureStreamListener implements StreamListener<String, ObjectRecor
             if (StringUtils.isNotBlank(dataDict.getStr("nextExecuteTime"))) {
                 nextExecuteTime = DateTime.of(dataDict.getStr("nextExecuteTime"), "yyyy-MM-dd HH:mm:ss");
             }
-            String ymd = DateTime.now().toString("yyyy-MM-dd");
             DateTime now = DateTime.now();
+            StringBuilder fileName = new StringBuilder(cameraCode);
+            fileName.append("-");
+            fileName.append(DateTime.now().toString("yyyyMMddHHmmss"));
+            String isNormalPath = isAlarm ? "alarm" : "normal";
+            String filePath = dataDict.getStr("address")+"/"+isNormalPath+"/"+railwayName+"/"+installMiles+"/"+ LocalDate.now().getYear() +"/"+ LocalDate.now().getMonthValue() + "/" +fileName + ".jpeg";
             // 超过时间则进行抓拍
             if (now.isAfterOrEquals(nextExecuteTime) && nextExecuteTime.between(now, DateUnit.MINUTE) < 2) {
-                genPictureTaskService.getNormalPicture(cameraCode, dataDict.getStr("channel"), dataDict.getStr("address"), ymd);
+                genPictureTaskService.makePicture(cameraCode, dataDict.getStr("channel"), filePath, vo.getIsAlarm());
             }
             // 通过RedisTemplate手动确认消息
             stringRedisTemplate.opsForStream().acknowledge(RedisPushService.STREAM_KEY, RedisPushService.STREAM_CONSUMER_GROUP_KEY, recordId.getValue());
@@ -96,7 +103,7 @@ public class CaptureStreamListener implements StreamListener<String, ObjectRecor
         } finally {
             Boolean isAlarm = vo.getIsAlarm();
             if (isAlarm) {
-                vo.setNextExecuteTime(DateTime.now().offset(DateField.SECOND, 30).toString("yyyy-MM-dd HH:mm:ss"));
+                vo.setNextExecuteTime(DateTime.now().offset(DateField.SECOND, 1).toString("yyyy-MM-dd HH:mm:ss"));
             } else {
                 vo.setNextExecuteTime(DateTime.now().offset(DateField.MINUTE, 1).toString("yyyy-MM-dd HH:mm:ss"));
             }

+ 8 - 7
hazard-admin/src/main/java/com/ozs/web/controller/shotschedule/GenPictureTaskService.java

@@ -1,7 +1,6 @@
 package com.ozs.web.controller.shotschedule;
 
-import com.ozs.common.utils.uuid.IdUtils;
-import com.ozs.service.entity.vo.BaseCameraVO;
+import cn.hutool.core.thread.ThreadUtil;
 import com.ozs.service.service.impl.CameraCaptureService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
@@ -10,7 +9,6 @@ import org.springframework.util.ObjectUtils;
 
 import javax.annotation.Resource;
 import java.net.URL;
-import java.util.concurrent.CountDownLatch;
 
 /**
  * @author lyao
@@ -30,8 +28,7 @@ public class GenPictureTaskService {
     @Value("${shot.urlAddress}")
     private String urlAddress;
 
-    public boolean getNormalPicture(String cameraCode, String channel, String address, String ymd) {
-        String uuid = IdUtils.fastSimpleUUID();
+    public boolean makePicture(String cameraCode, String channel, String filePath, boolean isAlarm) {
         long start = System.currentTimeMillis();
         if (!ObjectUtils.isEmpty(cameraCode)) {
             try {
@@ -39,11 +36,15 @@ public class GenPictureTaskService {
 //                    log.debug("请求url======" + urlAddress + cameraCode + "/" + channel);
 //                }
                 URL url = new URL(urlAddress + cameraCode + "/" + channel);
-                String fileName = address + "/" + "normal" + "/" + ymd + "/" + uuid + ".jpeg";
+                System.out.println("fileName:" + filePath);
 //                if (log.isDebugEnabled()) {
 //                    log.debug("正常摄像头截图开始, url: " + url + ", fileName: " + fileName);
 //                }
-                boolean capture = cameraCaptureService.getCapture(url, cameraCode, fileName);
+                boolean capture = cameraCaptureService.getCapture(url, cameraCode, filePath);
+                if (capture && isAlarm) {
+                    ThreadUtil.sleep(500);
+                    cameraCaptureService.getCapture(url, cameraCode, filePath);
+                }
 //                if (log.isDebugEnabled()) {
 //                    log.debug("正常摄像头截图结束, url: " + url + (capture ? "" : ", 出现错误") + ", 共计耗时: " + ((System.currentTimeMillis() - start) / 1000) + "s");
 //                }

+ 60 - 3
hazard-admin/src/main/java/com/ozs/web/controller/shotschedule/ShotPictureTaskExecutors.java

@@ -7,11 +7,14 @@ import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ozs.common.core.domain.entity.SysDictData;
 import com.ozs.common.core.redis.RedisCache;
+import com.ozs.common.utils.AppendUtils;
 import com.ozs.common.utils.DictUtils;
 import com.ozs.service.entity.BaseCameraManagement;
+import com.ozs.service.entity.BaseRailwayManagement;
 import com.ozs.service.entity.MsgAlarm;
 import com.ozs.service.entity.vo.BaseCameraVO;
 import com.ozs.service.mapper.BaseCameraManagementMapper;
+import com.ozs.service.mapper.BaseRailwayManagementMapper;
 import com.ozs.service.mapper.MsgAlarmMapper;
 import com.ozs.service.service.RedisService;
 import com.ozs.system.service.ISysDictTypeService;
@@ -29,7 +32,10 @@ import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.time.Duration;
-import java.util.*;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
@@ -70,6 +76,9 @@ public class ShotPictureTaskExecutors {
 
     @Resource
     private BaseCameraManagementMapper baseCameraManagementMapper;
+
+    @Resource
+    private BaseRailwayManagementMapper baseRailwayManagementMapper;
     @Autowired
     RedisCache redisCache;
 
@@ -99,10 +108,14 @@ public class ShotPictureTaskExecutors {
                     .stream().map(f -> f.getCameraCode()).distinct().collect(Collectors.toList());
             try {
                 QueryWrapper<BaseCameraManagement> queryWrapper = new QueryWrapper<>();
-                queryWrapper.select("distinct camera_code, channel");
+                queryWrapper.select("distinct camera_code, channel,railway_code,install_mile");
                 // 获取数据库中最新摄像头相关内容
                 List<BaseCameraManagement> dbAlarms = baseCameraManagementMapper.selectList(queryWrapper).stream().collect(Collectors.toList());
+                List<BaseRailwayManagement> dbRailways = baseRailwayManagementMapper.selectList(null);
                 if (!CollectionUtils.isEmpty(dbAlarms)) {
+                    for(BaseRailwayManagement dbRailway:dbRailways){
+                        redisCache.setCacheObject(dbRailway.getRailwayCode(),dbRailway.getRailwayName());
+                    }
                     Set<Object> hashAlarmKeys = redisService.redisTemplate.opsForHash().keys(CAMERA_ALARM_HASH);
                     Set<Object> hashNormalKeys = redisService.redisTemplate.opsForHash().keys(CAMERA_NORMAL_HASH);
                     // 数据库中存在的数据, 但是缓存中不存在, 则进行补全
@@ -110,6 +123,8 @@ public class ShotPictureTaskExecutors {
                         BaseCameraVO  vo = new BaseCameraVO();
                         vo.setCameraCode(dbAlarm.getCameraCode());
                         vo.setChannel(dbAlarm.getChannel());
+                        vo.setInstallMiles(AppendUtils.stringAppend(dbAlarm.getInstallMile()));
+                        vo.setRailwayName(redisCache.getCacheObject(dbAlarm.getRailwayCode()));
                         vo.setNextExecuteTime(DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
                         if (lockedMsgAlarmCameraCodes.contains(vo.getCameraCode()) && !hashAlarmKeys.contains(vo.getCameraCode())) {
                             vo.setIsAlarm(true);
@@ -121,6 +136,10 @@ public class ShotPictureTaskExecutors {
                     }
                     // 排除缓存中未删除, 但是系统中删除的情况
                     for (Object hashAlarmKey : hashAlarmKeys) {
+                        //如果报警信息数据库不存在但报警缓存中存在, 则进行删除
+                        if(!lockedMsgAlarmCameraCodes.contains(hashAlarmKey)){
+                            redisService.redisTemplate.opsForHash().delete(CAMERA_ALARM_HASH, hashAlarmKey);
+                        }
                         // 如果在数据库中都不存在, 则进行删除删除
                         if (!hashAlarmKeys.contains(hashAlarmKey) && !hashNormalKeys.contains(hashAlarmKey)) {
                             redisService.redisTemplate.opsForHash().delete(CAMERA_ALARM_HASH, hashAlarmKey);
@@ -143,7 +162,7 @@ public class ShotPictureTaskExecutors {
     }
 
     /**
-     * 处理预警摄像头截图, 间隔: 5s
+     * 处理预警摄像头截图, 间隔: 5s
      */
     @Scheduled(fixedDelay = 5 * 1000, initialDelay = 10 * 1000)
     public void batchProcess() {
@@ -192,12 +211,48 @@ public class ShotPictureTaskExecutors {
                     dict.put("cameraCode", item.getCameraCode());
                     dict.put("channel", item.getChannel());
                     dict.put("address", finalAddress);
+                    dict.put("railwayName", item.getRailwayName());
+                    dict.put("installMiles", item.getInstallMiles());
                     dict.put("isAlarm", false);
                     dict.put("nextExecuteTime", item.getNextExecuteTime());
                     redisPushService.pushMsg(JSONUtil.toJsonStr(dict));
                 }
             }
         }
+    }
+
+    /**
+     * 处理预警摄像头截图, 间隔: 1s
+     */
+    @Scheduled(fixedDelay = 1 * 1000, initialDelay = 10 * 1000)
+    public void batchAlarmProcess() {
+        if (!isMaster) return;
+        // 填充默认路径
+        String address = storeAddress;
+        //获取截图开关
+        Integer status = redisCache.getCacheObject("shot_switch");
+        if(status == null){
+            List<SysDictData> dataList = iSysDictTypeService.selectDictDataByType("shot_switch");
+            if(CollectionUtils.isEmpty(dataList)){
+                redisCache.setCacheObject("shot_switch",2);
+                status = redisCache.getCacheObject("shot_switch");
+            }else{
+                redisCache.setCacheObject("shot_switch",dataList.get(0).getStatus());
+                status = redisCache.getCacheObject("shot_switch");
+            }
+        }
+        // 判断开关是否执行
+        if (status != 1) {
+            return;
+        }
+        // 获取字典值: 截图存放路径
+        List<SysDictData> addressDataList = DictUtils.getDictCache("shot_address");
+        if(CollectionUtils.isEmpty(addressDataList) || Objects.isNull(addressDataList.get(0))){
+            DictUtils.setDictCache("shot_address", addressDataList = iSysDictTypeService.selectDictDataByType("shot_address"));
+        }
+        if(!CollectionUtils.isEmpty(addressDataList) && Objects.nonNull(addressDataList.get(0))){
+            address = addressDataList.get(0).getDictLabel();
+        }
         Map<Object, Object> alarmEntries = redisService.redisTemplate.opsForHash().entries(CAMERA_ALARM_HASH);
         if (!CollectionUtils.isEmpty(alarmEntries)) {
             final String finalAddress = address;
@@ -215,6 +270,8 @@ public class ShotPictureTaskExecutors {
                     dict.put("cameraCode", item.getCameraCode());
                     dict.put("channel", item.getChannel());
                     dict.put("address", finalAddress);
+                    dict.put("railwayName", item.getRailwayName());
+                    dict.put("installMiles", item.getInstallMiles());
                     dict.put("isAlarm", true);
                     dict.put("nextExecuteTime", item.getNextExecuteTime());
                     redisPushService.pushMsg(JSONUtil.toJsonStr(dict));