From 1d753b48c023090430c2931fd8e3a45a382eddf8 Mon Sep 17 00:00:00 2001
From: hotcoffie <35990065+hotcoffie@users.noreply.github.com>
Date: 星期二, 17 五月 2022 11:53:42 +0800
Subject: [PATCH] Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0

---
 src/main/java/com/genersoft/iot/vmp/gb28181/session/RecordDataCatch.java |   91 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 91 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/RecordDataCatch.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/RecordDataCatch.java
new file mode 100644
index 0000000..dd5b8df
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/RecordDataCatch.java
@@ -0,0 +1,91 @@
+package com.genersoft.iot.vmp.gb28181.session;
+
+import com.genersoft.iot.vmp.gb28181.bean.*;
+import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
+import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
+import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.Instant;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author lin
+ */
+@Component
+public class RecordDataCatch {
+
+    public static Map<String, RecordInfo> data = new ConcurrentHashMap<>();
+
+    @Autowired
+    private DeferredResultHolder deferredResultHolder;
+
+
+    public int put(String deviceId, String sn, int sumNum, List<RecordItem> recordItems) {
+        String key = deviceId + sn;
+        RecordInfo recordInfo = data.get(key);
+        if (recordInfo == null) {
+            recordInfo = new RecordInfo();
+            recordInfo.setDeviceId(deviceId);
+            recordInfo.setSn(sn.trim());
+            recordInfo.setSumNum(sumNum);
+            recordInfo.setRecordList(Collections.synchronizedList(new ArrayList<>()));
+            recordInfo.setLastTime(Instant.now());
+            recordInfo.getRecordList().addAll(recordItems);
+            data.put(key, recordInfo);
+        }else {
+            // 鍚屼竴涓澶囩殑閫氶亾鍚屾璇锋眰鍙�冭檻涓�涓紝鍏朵粬鐨勭洿鎺ュ拷鐣�
+            if (!Objects.equals(sn.trim(), recordInfo.getSn())) {
+                return 0;
+            }
+            recordInfo.getRecordList().addAll(recordItems);
+            recordInfo.setLastTime(Instant.now());
+        }
+        return recordInfo.getRecordList().size();
+    }
+
+    @Scheduled(fixedRate = 5 * 1000)   //姣�5绉掓墽琛屼竴娆�, 鍙戠幇鏁版嵁5绉掓湭鏇存柊鍒欑Щ闄ゆ暟鎹苟璁や负鏁版嵁鎺ユ敹瓒呮椂
+    private void timerTask(){
+        Set<String> keys = data.keySet();
+        // 鑾峰彇浜旂鍓嶇殑鏃跺埢
+        Instant instantBefore5S = Instant.now().minusMillis(TimeUnit.SECONDS.toMillis(5));
+        for (String key : keys) {
+            RecordInfo recordInfo = data.get(key);
+            // 瓒呰繃浜旂鏀朵笉鍒版秷鎭换鍔¤秴鏃讹紝 鍙洿鏂拌繖涓�閮ㄥ垎鏁版嵁
+            if ( recordInfo.getLastTime().isBefore(instantBefore5S)) {
+                // 澶勭悊褰曞儚鏁版嵁锛� 杩斿洖缁欏墠绔�
+                String msgKey = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + recordInfo.getDeviceId() + recordInfo.getSn();
+
+                WVPResult<RecordInfo> wvpResult = new WVPResult<>();
+                wvpResult.setCode(0);
+                wvpResult.setMsg("success");
+                // 瀵规暟鎹繘琛屾帓搴�
+                Collections.sort(recordInfo.getRecordList());
+                wvpResult.setData(recordInfo);
+
+                RequestMessage msg = new RequestMessage();
+                msg.setKey(msgKey);
+                msg.setData(wvpResult);
+                deferredResultHolder.invokeAllResult(msg);
+                data.remove(key);
+            }
+        }
+    }
+
+    public boolean isComplete(String deviceId, String sn) {
+        RecordInfo recordInfo = data.get(deviceId + sn);
+        return recordInfo != null && recordInfo.getRecordList().size() == recordInfo.getSumNum();
+    }
+
+    public RecordInfo getRecordInfo(String deviceId, String sn) {
+        return data.get(deviceId + sn);
+    }
+
+    public void remove(String deviceId, String sn) {
+        data.remove(deviceId + sn);
+    }
+}

--
Gitblit v1.8.0