Bladeren bron

录像完整性代码提交

jingyuanchao 1 jaar geleden
bovenliggende
commit
ad2b690995

+ 44 - 1
project_data/sql/0.1.1/soc/soc.sql

@@ -25,8 +25,51 @@ BEGIN
             add origin_state int null comment '原始状态:0:正常,1:不存在,2:未格式化,3:休眠,4:正在维修 ,5:报警 ,6:错误 7:排除, 9:未知' after state;
     END IF;
 
+    -- 录像完整性检查表增加录像类型
+    IF NOT EXISTS(SELECT *
+                  FROM information_schema.columns
+                  WHERE table_schema = DATABASE()
+                    AND table_name = 'mediator_video_integrity_check'
+                    AND column_name = 'record_type') THEN
+        alter table mediator_video_integrity_check
+            add record_type int null comment '0: 定时 |  1:移动侦测' after plan_days;
+    END IF;
+
+    -- 录像完整性检查表增加原始录像索引
+    IF NOT EXISTS(SELECT *
+                  FROM information_schema.columns
+                  WHERE table_schema = DATABASE()
+                    AND table_name = 'mediator_video_integrity_check'
+                    AND column_name = 'record_span') THEN
+
+        alter table mediator_video_integrity_check
+            add record_span varchar(225) null comment '原始录像索引' after record_type;
+    END IF;
+
+    -- 录像完整性检查日志表增加录像类型
+    IF NOT EXISTS(SELECT *
+                  FROM information_schema.columns
+                  WHERE table_schema = DATABASE()
+                    AND table_name = 'mediator_video_integrity_check_log'
+                    AND column_name = 'record_type') THEN
+
+        alter table mediator_video_integrity_check_log
+            add record_type int null comment '0: 定时 |  1:移动侦测' after plan_days;
+    END IF;
+
+    -- 录像完整性检查日志表增加原始录像索引
+    IF NOT EXISTS(SELECT *
+                  FROM information_schema.columns
+                  WHERE table_schema = DATABASE()
+                    AND table_name = 'mediator_video_integrity_check_log'
+                    AND column_name = 'record_span') THEN
+
+        alter table mediator_video_integrity_check_log
+            add record_span varchar(225) null comment '原始录像索引' after record_type;
+    END IF;
+
 
-        -- 磁盘日志表增加磁盘原始状态值
+    -- 磁盘日志表增加磁盘原始状态值
     IF NOT EXISTS(SELECT *
                   FROM information_schema.columns
                   WHERE table_schema = DATABASE()

+ 10 - 11
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/video/MediatorVideoIntegrityCheck.java

@@ -1,23 +1,17 @@
 package com.xunmei.common.core.domain.video;
 
-import com.baomidou.mybatisplus.annotation.TableName;
-
-import java.time.LocalDate;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-
-import java.time.LocalDateTime;
-
 import com.baomidou.mybatisplus.annotation.TableField;
-
-import java.io.Serializable;
-
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.xunmei.common.core.web.domain.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.io.Serializable;
+import java.time.LocalDate;
+
 /**
  * <p>
  * 录像机完整性检查表
@@ -89,4 +83,9 @@ public class MediatorVideoIntegrityCheck extends BaseEntity implements Serializa
     @TableField("plan_days")
     private Integer planDays;
 
+    @ApiModelProperty(value = "0: 定时 |  1:移动侦测")
+    private String recordType;
+    @ApiModelProperty(value = "原始录像索引")
+    private String recordSpan;
+
 }

+ 7 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/video/MediatorVideoIntegrityCheckLog.java

@@ -86,6 +86,13 @@ public class MediatorVideoIntegrityCheckLog extends BaseEntity implements Serial
     @TableField("plan_days")
     private Integer planDays;
 
+    @TableField("record_type")
+    @ApiModelProperty(value = "0: 定时 |  1:移动侦测")
+    private String recordType;
+
+    @TableField("record_span")
+    @ApiModelProperty(value = "原始录像索引")
+    private String recordSpan;
 
 
 }

+ 42 - 20
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/video/service/impl/VideoIntegrityCheckServiceImpl.java

@@ -2,6 +2,7 @@ package com.xunmei.mediator.api.video.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
@@ -23,7 +24,6 @@ import com.xunmei.mediator.api.video.mapper.VideoIntegrityCheckMapper;
 import com.xunmei.mediator.api.video.service.IVideoDaysCheckService;
 import com.xunmei.mediator.api.video.service.IVideoIntegrityCheckService;
 import com.xunmei.mediator.api.video.service.MediatorVideoIntegrityCheckLogService;
-import com.xunmei.mediator.domain.dto.redis.RedisKey;
 import com.xunmei.mediator.domain.dto.videoIntegrityCheck.VideoIntegrityCheckDto;
 import com.xunmei.mediator.domain.dto.videoIntegrityCheck.VideoIntegrityCheckReq;
 import com.xunmei.mediator.util.RedisUtil;
@@ -96,10 +96,11 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
 
     @Override
     public Object execute(WebsocketExecuteReq req) {
-        VideoIntegrityCheckDto checkDto = transform(req.getData());
+        String jsonString = JSON.toJSONString(req.getData());
+        VideoIntegrityCheckDto checkDto = transform(JSON.parseObject(jsonString, VideoIntegrityCheckReq.class));
         SysOrg sysOrg = iotServerInfoService.selectOrgByToken(req.getToken());
         checkDto.setOrganizationGuid(sysOrg.getCode());
-        this.saveData(checkDto,"");
+        this.saveData(checkDto, "");
         return "";
     }
 
@@ -110,7 +111,7 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
         websocketResult.setTimestamp(new Date());
         HashMap<String, Object> hashMap = new HashMap<>();
         hashMap.put(WebSocketConstants.SERVICE, WebSocketConstants.GET_RECORD_INFOS_SERVICES);
-        hashMap.put(WebSocketConstants.ARGS,new  JSONObject());
+        hashMap.put(WebSocketConstants.ARGS, new JSONObject());
         websocketResult.setPayload(hashMap);
         WebSocketSessionHolder.sendAll(JacksonUtils.toJSONString(websocketResult));
 
@@ -118,12 +119,13 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
 
     @Override
     public VideoIntegrityCheckDto transform(Object data) {
-        VideoIntegrityCheckReq req = (VideoIntegrityCheckReq)data;
+        VideoIntegrityCheckReq req = (VideoIntegrityCheckReq) data;
         VideoIntegrityCheckDto dst = new VideoIntegrityCheckDto();
         dst.setEquipmentCode(req.getDvsCode());
         dst.setChannelCode(req.getIndex());
         dst.setRecordDate(req.getRecordDate());
         dst.setLoseSpan(req.getLoseSpan());
+        dst.setRecordSpan(req.getRecordSpan());
         dst.setCheckSpan(req.getCheckSpan());
 
         return dst;
@@ -137,9 +139,9 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
             return ReceiveErrorDto.error(msg);
         }
         //与上次接收到的数据进行比较,如果相同则不进行处理
-        if (redisUtil.compareWithCache(videoIntegrityCheckDto)) {
+        /*if (redisUtil.compareWithCache(videoIntegrityCheckDto)) {
             return ReceiveErrorDto.error(RedisKey.REPORT_DATA_REFUSE_MSG);
-        }
+        }*/
 
         String organizationGuid = videoIntegrityCheckDto.getOrganizationGuid();
         SysOrg org = orgService.findByCode(organizationGuid, SecurityConstants.INNER);
@@ -188,15 +190,17 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
         videoIntegrityCheck.setUpdateTime(new Date());
         videoIntegrityCheck.setChannelCode(videoIntegrityCheckDto.getChannelCode());
         videoIntegrityCheck.setChannelName(videoIntegrityCheckDto.getChannelName());
-        videoIntegrityCheck.setCheckSpan(JSON.toJSONString(videoIntegrityCheckDto.getCheckSpan()));
+        videoIntegrityCheck.setCheckSpan(dealSpan(videoIntegrityCheckDto.getCheckSpan()));
         videoIntegrityCheck.setEquipmentCode(videoIntegrityCheckDto.getEquipmentCode());
-        videoIntegrityCheck.setLoseSpan(JSON.toJSONString(videoIntegrityCheckDto.getLoseSpan()));
+        videoIntegrityCheck.setLoseSpan(dealSpan(videoIntegrityCheckDto.getLoseSpan()));
         videoIntegrityCheck.setRecordDate(LocalDate.parse(videoIntegrityCheckDto.getRecordDate(), DateTimeFormatter.ISO_LOCAL_DATE));
         videoIntegrityCheck.setOrgId(org.getId());
         videoIntegrityCheck.setOrgName(org.getShortName());
         videoIntegrityCheck.setOrgPath(org.getPath());
         videoIntegrityCheck.setStatus(getStatus(videoIntegrityCheckDto));
         videoIntegrityCheck.setLoseDuration(calculateLoseMinute(videoIntegrityCheck.getLoseSpan()));
+        videoIntegrityCheck.setRecordType(videoIntegrityCheckDto.getRecordType());
+        videoIntegrityCheck.setRecordSpan(dealSpan(videoIntegrityCheckDto.getRecordSpan()));
         if (!isCompensate) {
             //不是补录才进行保存数据
             this.saveOrUpdate(videoIntegrityCheck);
@@ -206,6 +210,21 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
         return ReceiveErrorDto.success();
     }
 
+    //重新转换一次,之前的转换出来有转义符
+    private String dealSpan(List<String> spanList) {
+        List<JSONObject> list = new ArrayList<>();
+        for (String string : spanList) {
+            Map parse = JSON.parseObject(string, Map.class);
+            if (parse.get("st") != null && parse.get("et") != null) {
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put("st", parse.get("st"));
+                jsonObject.put("et", parse.get("et"));
+                list.add(jsonObject);
+            }
+        }
+        return JSON.toJSONString(list);
+    }
+
     private void saveLog(MediatorVideoIntegrityCheck videoIntegrityCheck) {
         MediatorVideoIntegrityCheckLog newLog = new MediatorVideoIntegrityCheckLog();
         MediatorVideoIntegrityCheckLog logData = integrityCheckLogService.findByOrgIdAndEquipmentCodeAndChannelCode(videoIntegrityCheck.getOrgId(), videoIntegrityCheck.getEquipmentCode(), videoIntegrityCheck.getChannelCode(), videoIntegrityCheck.getRecordDate());
@@ -228,16 +247,19 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
         if (ObjectUtil.isEmpty(loseSpan)) {
             return 0;
         }
-        final List<Map> mapList = JSON.parseArray(loseSpan, Map.class);
-        int min = 0;
-        for (Map map : mapList) {
-            final String st = (String) map.get("st");
-            final String et = (String) map.get("et");
-            final LocalTime startTime = LocalTime.parse(st);
-            final LocalTime endTime = LocalTime.parse(et);
-            final long l = ChronoUnit.MINUTES.between(startTime, endTime);
-            min += l;
 
+        JSONArray array = JSON.parseArray(loseSpan);
+        int min = 0;
+        for (Object object : array) {
+            if (object instanceof String) {
+                Map map = JSON.parseObject(object.toString(), Map.class);
+                final String st = (String) map.get("st");
+                final String et = (String) map.get("et");
+                final LocalTime startTime = LocalTime.parse(st);
+                final LocalTime endTime = LocalTime.parse(et);
+                final long l = ChronoUnit.MINUTES.between(startTime, endTime);
+                min += (int) l;
+            }
         }
         return min;
     }
@@ -255,9 +277,9 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
             return "channelCode 为空";
         }
 
-        if (StringUtils.isEmpty(videoIntegrityCheckDto.getChannelName())) {
+        /*if (StringUtils.isEmpty(videoIntegrityCheckDto.getChannelName())) {
             return "channelName 为空";
-        }
+        }*/
 
         if (StringUtils.isEmpty(videoIntegrityCheckDto.getRecordDate())) {
             return "recordDate 为空";

+ 5 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/domain/dto/videoIntegrityCheck/VideoIntegrityCheckDto.java

@@ -3,6 +3,7 @@ package com.xunmei.mediator.domain.dto.videoIntegrityCheck;
 import com.alibaba.fastjson.JSON;
 import com.xunmei.system.api.function.IRedisCompare;
 import com.xunmei.mediator.domain.dto.redis.RedisKey;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -25,6 +26,10 @@ public class VideoIntegrityCheckDto implements IRedisCompare {
     private String recordDate;
     private List checkSpan;
     private List loseSpan;
+    @ApiModelProperty(value = "0: 定时 |  1:移动侦测")
+    private String recordType;
+    @ApiModelProperty(value = "原始录像索引")
+    private List recordSpan;
 
     @Override
     public String toKey() {

+ 4 - 2
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/domain/dto/videoIntegrityCheck/VideoIntegrityCheckReq.java

@@ -1,13 +1,15 @@
 package com.xunmei.mediator.domain.dto.videoIntegrityCheck;
 
 import io.swagger.annotations.ApiModelProperty;
-import lombok.Builder;
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.util.List;
 
 @Data
-@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class VideoIntegrityCheckReq {
 
     @ApiModelProperty(value = "产品名称")

+ 7 - 7
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/enums/TopicTypeEnums.java

@@ -17,19 +17,19 @@ public enum TopicTypeEnums {
     //系统通知
     SYS_NOTICE("/sys/notification","",""),
     //设备状态通知
-    DEVICE_STATUS("^/device/status/(\\w+)/(\\w+)$","",""),
+    DEVICE_STATUS("^/device/status/([^/]+)/([^/]+)$","",""),
     //产品事件通知消息
-    PRODUCT_EVENT_NOTICE("^/things/(\\w+)/(\\w+)/event/post$","",""),
+    PRODUCT_EVENT_NOTICE("^/things/([^/]+)/([^/]+)/event/post$","",""),
     //应用方调用IoT产品服务消息
-    PRODUCT_SERVICE_INVOKE("^/things/(\\w+)/(\\w+)/service/invoke$","",""),
+    PRODUCT_SERVICE_INVOKE("^/things/([^/]+)/([^/]+)/service/invoke$","",""),
     //IoT返回服务调用消息
-    PRODUCT_SERVICE_REPLY("^/things/(\\w+)/(\\w+)/service/invoke/reply$","",""),
+    PRODUCT_SERVICE_REPLY("^/things/([^/]+)/([^/]+)/service/invoke/reply$","",""),
     //应用方读取属性
-    PRODUCT_PROPERTY_GET("^/things/(\\w+)/(\\w+)/property/get$","",""),
+    PRODUCT_PROPERTY_GET("^/things/([^/]+)/([^/]+)/property/get$","",""),
     //IoT返回属性
-    PRODUCT_PROPERTY_REPLY("^/things/(\\w+)/(\\w+)/property/get/reply$","",""),
+    PRODUCT_PROPERTY_REPLY("^/things/([^/]+)/([^/]+)/property/get/reply$","",""),
     //应用方设置属性
-    PRODUCT_PROPERTY_SET("^/things/((\\w+)/(\\w+)/property/set$","",""),
+    PRODUCT_PROPERTY_SET("^/things/([^/]+)/([^/]+)/property/set$","",""),
 
     ;
 

+ 6 - 6
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/handler/SocWebSocketHandler.java

@@ -2,7 +2,6 @@ package com.xunmei.mediator.websocket.handler;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
 import com.xunmei.common.core.domain.iot.domain.IotServerInfo;
 import com.xunmei.common.core.enums.iot.IotServerConnectStatus;
 import com.xunmei.common.core.utils.JacksonUtils;
@@ -103,7 +102,7 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
      * @throws Exception 处理消息过程中可能抛出的异常
      */
     @Override
-    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
+    /*protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
         // 从WebSocket会话中获取登录用户信息
         WebSocketSessionHolder.updateToken(session);
         String payload = message.getPayload();
@@ -137,9 +136,9 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
         }
 
 
-    }
+    }*/
 
-    public void handleTextMessage1(WebSocketSession session, TextMessage message) throws Exception {
+    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
         // 从WebSocket会话中获取登录用户信息
         WebSocketSessionHolder.updateToken(session);
         String payload = message.getPayload();
@@ -157,6 +156,7 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
                     TopicTypeEnums typeEnums = TopicTypeEnums.matcherTopicTypeEnums(topic);
                     if (typeEnums == null){
                         log.error("消息topic错误:{}",topic);
+                        return;
                     }
                 Map map = JSON.parseObject(obj.toString(), Map.class);
                 //上报事件
@@ -166,8 +166,8 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
                 String token = WebSocketSessionHolder.getSessionKey(session);
                 String routingKey=ObjectUtil.isNotEmpty(event) ? event : service;
                 //上报消息内容
-                JSONObject args = (JSONObject) map.get(WebSocketConstants.ARGS);
-                if (ObjectUtil.isEmpty(event)||args.isEmpty()){
+                Object args = map.get(WebSocketConstants.ARGS);
+                if (ObjectUtil.isEmpty(event)||args==null){
                     log.error("消息内容为空:{}",message.getPayload());
                     return;
                 }