From 26ca854db578b11d2dbcc475cf475c314cb08ba6 Mon Sep 17 00:00:00 2001
From: lishuyuan <lishuyuan@inspur.com>
Date: 星期五, 27 十月 2023 11:09:42 +0800
Subject: [PATCH] bugfix:去掉目录订阅通知处理重复逻辑代码

---
 src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java |  121 ++++++++++++++++++++++++++++++++--------
 1 files changed, 97 insertions(+), 24 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java
index 9998960..7b59f7f 100644
--- a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java
+++ b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java
@@ -2,21 +2,31 @@
 
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
+import com.genersoft.iot.vmp.conf.exception.ControllerException;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
+import com.genersoft.iot.vmp.gb28181.bean.PresetQuerySipReq;
+import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
+import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
 import com.genersoft.iot.vmp.service.IDeviceService;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
+import com.genersoft.iot.vmp.vmanager.bean.DeferredResultEx;
+import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
 import com.genersoft.iot.vmp.web.gb28181.dto.DeviceChannelExtend;
 import com.github.pagehelper.PageInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.StringUtils;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.async.DeferredResult;
 
-import java.util.Arrays;
-import java.util.List;
+import javax.sip.InvalidArgumentException;
+import javax.sip.SipException;
+import java.text.ParseException;
+import java.util.*;
 
 /**
  * API鍏煎锛氳澶囦俊鎭�
@@ -31,17 +41,15 @@
 
     @Autowired
     private IVideoManagerStorage storager;
+
+    @Autowired
+    private SIPCommander cmder;
     @Autowired
     private IDeviceService deviceService;
 
-    // @Autowired
-    // private SIPCommander cmder;
+    @Autowired
+    private DeferredResultHolder resultHolder;
 
-    // @Autowired
-    // private DeferredResultHolder resultHolder;
-
-    // @Autowired
-    // private DeviceOffLineDetector offLineDetector;
 
     /**
      * 鍒嗛〉鑾峰彇璁惧鍒楄〃 鐜板湪鐩存帴杩斿洖锛屽皻鏈疄鐜板垎椤�
@@ -81,7 +89,7 @@
             deviceJsonObject.put("RecvStreamIP", "");
             deviceJsonObject.put("CatalogInterval", 3600); // 閫氶亾鐩綍鎶撳彇鍛ㄦ湡
             deviceJsonObject.put("SubscribeInterval", device.getSubscribeCycleForCatalog()); // 璁㈤槄鍛ㄦ湡(绉�), 0 琛ㄧず鍚庡彴涓嶅懆鏈熻闃�
-            deviceJsonObject.put("Online", device.getOnline() == 1);
+            deviceJsonObject.put("Online", device.isOnLine());
             deviceJsonObject.put("Password", "");
             deviceJsonObject.put("MediaTransport", device.getTransport());
             deviceJsonObject.put("RemoteIP", device.getIp());
@@ -106,20 +114,11 @@
                                    @RequestParam(required = false)String q,
                                    @RequestParam(required = false)Boolean online ){
 
-//        if (logger.isDebugEnabled()) {
-//            logger.debug("鏌ヨ鎵�鏈夎棰戣澶嘇PI璋冪敤");
-//        }
+
         JSONObject result = new JSONObject();
-        // 鏌ヨ璁惧鏄惁瀛樺湪
-//        Device device = storager.queryVideoDevice(serial);
-//        if (device == null) {
-//            result.put("ChannelCount", 0);
-//            result.put("ChannelList", "[]");
-//            return result;
-//        }
         List<DeviceChannelExtend> deviceChannels;
         List<String> channelIds = null;
-        if (!StringUtils.isEmpty(code)) {
+        if (!ObjectUtils.isEmpty(code)) {
             String[] split = code.trim().split(",");
             channelIds = Arrays.asList(split);
         }
@@ -139,7 +138,7 @@
             deviceJOSNChannel.put("ID", deviceChannelExtend.getChannelId());
             deviceJOSNChannel.put("DeviceID", deviceChannelExtend.getDeviceId());
             deviceJOSNChannel.put("DeviceName", deviceChannelExtend.getDeviceName());
-            deviceJOSNChannel.put("DeviceOnline", deviceChannelExtend.getDeviceOnline() == 1);
+            deviceJOSNChannel.put("DeviceOnline", deviceChannelExtend.isDeviceOnline());
             deviceJOSNChannel.put("Channel", 0); // TODO 鑷畾涔夊簭鍙�
             deviceJOSNChannel.put("Name", deviceChannelExtend.getName());
             deviceJOSNChannel.put("Custom", false);
@@ -158,7 +157,7 @@
             // 1-IETF RFC3261,
             // 2-鍩轰簬鍙d护鐨勫弻鍚戣璇�,
             // 3-鍩轰簬鏁板瓧璇佷功鐨勫弻鍚戣璇�
-            deviceJOSNChannel.put("Status", deviceChannelExtend.getStatus() == 1 ? "ON":"OFF");
+            deviceJOSNChannel.put("Status", deviceChannelExtend.isStatus() ? "ON":"OFF");
             deviceJOSNChannel.put("Longitude", deviceChannelExtend.getLongitude());
             deviceJOSNChannel.put("Latitude", deviceChannelExtend.getLatitude());
             deviceJOSNChannel.put("PTZType ", deviceChannelExtend.getPTZType()); // 浜戝彴绫诲瀷, 0 - 鏈煡, 1 - 鐞冩満, 2 - 鍗婄悆,
@@ -171,4 +170,78 @@
         result.put("ChannelList", channleJSONList);
         return result;
     }
+
+    /**
+     * 璁惧淇℃伅 - 鑾峰彇涓嬬骇閫氶亾棰勭疆浣�
+     * @param serial 璁惧缂栧彿
+     * @param code 閫氶亾缂栧彿,閫氳繃 /api/v1/device/channellist 鑾峰彇鐨� ChannelList.ID, 璇ュ弬鏁板拰 channel 浜岄�変竴浼犻�掑嵆鍙�
+     * @param channel 閫氶亾搴忓彿, 榛樿鍊�: 1
+     * @param fill 鏄惁濉厖绌虹疆棰勭疆浣嶏紝褰撲笅绾ц繑鍥為缃綅锛屼絾涓嶅255涓椂锛岃嚜鍔ㄥ~鍏呯┖缃缃綅鍒�255涓紝 榛樿鍊�: true锛� 鍏佽鍊�: true, false
+     * @param timeout 瓒呮椂鏃堕棿(绉�) 榛樿鍊�: 15
+     * @return
+     */
+    @RequestMapping(value = "/fetchpreset")
+    private DeferredResult<Object>  list(String serial,
+                      @RequestParam(required = false)Integer channel,
+                      @RequestParam(required = false)String code,
+                      @RequestParam(required = false)Boolean fill,
+                      @RequestParam(required = false)Integer timeout){
+
+        if (logger.isDebugEnabled()) {
+            logger.debug("<妯℃嫙鎺ュ彛> 鑾峰彇涓嬬骇閫氶亾棰勭疆浣� API璋冪敤锛宒eviceId锛歿} 锛宑hannel锛歿} 锛宑ode锛歿} 锛宖ill锛歿} 锛宼imeout锛歿} ",
+                    serial, channel, code, fill, timeout);
+        }
+
+        Device device = storager.queryVideoDevice(serial);
+        String uuid =  UUID.randomUUID().toString();
+        String key =  DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + (ObjectUtils.isEmpty(code) ? serial : code);
+        DeferredResult<Object> result = new DeferredResult<> (timeout * 1000L);
+        DeferredResultEx<Object> deferredResultEx = new DeferredResultEx<>(result);
+        result.onTimeout(()->{
+            logger.warn("<妯℃嫙鎺ュ彛> 鑾峰彇璁惧棰勭疆浣嶈秴鏃�");
+            // 閲婃斁rtpserver
+            RequestMessage msg = new RequestMessage();
+            msg.setId(uuid);
+            msg.setKey(key);
+            msg.setData("wait for presetquery timeout["+timeout+"s]");
+            resultHolder.invokeResult(msg);
+        });
+        if (resultHolder.exist(key, null)) {
+            return result;
+        }
+
+        deferredResultEx.setFilter(filterResult->{
+            List<PresetQuerySipReq> presetQuerySipReqList = (List<PresetQuerySipReq>)filterResult;
+            HashMap<String, Object> resultMap = new HashMap<>();
+            resultMap.put("DeviceID", code);
+            resultMap.put("Result", "OK");
+            resultMap.put("SumNum", presetQuerySipReqList.size());
+            ArrayList<Map<String, Object>> presetItemList = new ArrayList<>(presetQuerySipReqList.size());
+            for (PresetQuerySipReq presetQuerySipReq : presetQuerySipReqList) {
+                Map<String, Object> item = new HashMap<>();
+                item.put("PresetID", presetQuerySipReq.getPresetId());
+                item.put("PresetName", presetQuerySipReq.getPresetName());
+                item.put("PresetEnable", true);
+                presetItemList.add(item);
+            }
+            resultMap.put("PresetItemList",presetItemList );
+            return resultMap;
+        });
+
+        resultHolder.put(key, uuid, deferredResultEx);
+
+        try {
+            cmder.presetQuery(device, code, event -> {
+                RequestMessage msg = new RequestMessage();
+                msg.setId(uuid);
+                msg.setKey(key);
+                msg.setData(String.format("鑾峰彇璁惧棰勭疆浣嶅け璐ワ紝閿欒鐮侊細 %s, %s", event.statusCode, event.msg));
+                resultHolder.invokeResult(msg);
+            });
+        } catch (InvalidArgumentException | SipException | ParseException e) {
+            logger.error("[鍛戒护鍙戦�佸け璐 鑾峰彇璁惧棰勭疆浣�: {}", e.getMessage());
+            throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage());
+        }
+        return result;
+    }
 }

--
Gitblit v1.8.0