From 5b0b17d7410785aef2bedb22447bd458a3713300 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期六, 04 十二月 2021 17:27:23 +0800
Subject: [PATCH] 添加第三方服务参与的推流直接转发到国标功能

---
 src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java                         |   18 ++
 web_src/src/components/dialog/platformEdit.vue                                                      |   80 +++++++---
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java                                |   13 +
 web_src/src/components/StreamProxyList.vue                                                          |    1 
 src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java                   |   18 ++
 src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java                                             |   10 +
 web_src/src/components/PushVideoList.vue                                                            |   34 +++-
 src/main/resources/wvp.sqlite                                                                       |    0 
 src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java                          |   10 +
 src/main/resources/all-application.yml                                                              |    2 
 src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java                     |   39 +++++
 src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java                               |    5 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java |    4 
 src/main/java/com/genersoft/iot/vmp/service/bean/ThirdPartyGB.java                                  |   23 +++
 src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java                             |    2 
 src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java                        |    3 
 src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java                        |   11 +
 sql/mysql.sql                                                                                       |    1 
 src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java                                |    8 +
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java                              |   51 +++++++
 src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java                                |    5 
 src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java                        |   54 +++----
 src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java                                 |    9 +
 23 files changed, 324 insertions(+), 77 deletions(-)

diff --git a/sql/mysql.sql b/sql/mysql.sql
index 38cc881..64fed12 100644
--- a/sql/mysql.sql
+++ b/sql/mysql.sql
@@ -173,6 +173,7 @@
     ptz            int          null,
     rtcp           int          null,
     status         bit          null,
+    shareAllLiveStream         int          null,
     primary key (id, serverGBId)
 );
 
diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
index da58e10..3b47ff0 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -55,5 +55,8 @@
 	public static final String MEDIA_TRANSACTION_USED_PREFIX = "VMP_MEDIA_TRANSACTION_";
 
 	//************************** redis 娑堟伅*********************************
-	public static final String WVP_MSG_STREAM_CHANGE__PREFIX = "WVP_MSG_STREAM_CHANGE_";
+	public static final String WVP_MSG_STREAM_CHANGE_PREFIX = "WVP_MSG_STREAM_CHANGE_";
+
+	//**************************    绗笁鏂�  ****************************************
+	public static final String WVP_STREAM_GB_ID_PREFIX = "memberNo_";
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java b/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java
index 13831b4..140295e 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java
@@ -29,6 +29,8 @@
 
     private String serverId = "000000";
 
+    private String thirdPartyGBIdReg = "[\\s\\S]*";
+
     private List<String> interfaceAuthenticationExcludes = new ArrayList<>();
 
     public Boolean getSavePositionHistory() {
@@ -114,4 +116,12 @@
     public void setServerId(String serverId) {
         this.serverId = serverId;
     }
+
+    public String getThirdPartyGBIdReg() {
+        return thirdPartyGBIdReg;
+    }
+
+    public void setThirdPartyGBIdReg(String thirdPartyGBIdReg) {
+        this.thirdPartyGBIdReg = thirdPartyGBIdReg;
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java
index 96fcd36..fabae8a 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java
@@ -104,6 +104,11 @@
      */
     private int channelCount;
 
+    /**
+     * 鍏变韩鎵�鏈夌殑鐩存挱娴�
+     */
+    private boolean shareAllLiveStream;
+
     public Integer getId() {
         return id;
     }
@@ -264,4 +269,12 @@
         this.channelCount = channelCount;
     }
 
+
+    public boolean isShareAllLiveStream() {
+        return shareAllLiveStream;
+    }
+
+    public void setShareAllLiveStream(boolean shareAllLiveStream) {
+        this.shareAllLiveStream = shareAllLiveStream;
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
index 1cb4af5..2635a5f 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -31,6 +31,7 @@
 import javax.sip.message.Request;
 import javax.sip.message.Response;
 import java.text.ParseException;
+import java.util.List;
 import java.util.Vector;
 
 /**
@@ -105,7 +106,8 @@
 			if (platform != null) {
 				// 鏌ヨ骞冲彴涓嬫槸鍚︽湁璇ラ�氶亾
 				DeviceChannel channel = storager.queryChannelInParentPlatform(requesterId, channelId);
-				GbStream gbStream = storager.queryStreamInParentPlatform(requesterId, channelId);
+				List<GbStream> gbStreams = storager.queryStreamInParentPlatform(requesterId, channelId);
+				GbStream gbStream = gbStreams.size() > 0? gbStreams.get(0):null;
 				MediaServerItem mediaServerItem = null;
 				// 涓嶆槸閫氶亾鍙兘鏄洿鎾祦
 				if (channel != null && gbStream == null ) {
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
index 49fe098..baf0b3c 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
@@ -1,21 +1,28 @@
 package com.genersoft.iot.vmp.media.zlm;
 
 import com.alibaba.fastjson.JSONObject;
+import com.genersoft.iot.vmp.conf.UserSetup;
+import com.genersoft.iot.vmp.gb28181.bean.GbStream;
 import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
 import com.genersoft.iot.vmp.service.IStreamPushService;
+import com.genersoft.iot.vmp.service.bean.ThirdPartyGB;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import com.genersoft.iot.vmp.storager.dao.GbStreamMapper;
 import com.genersoft.iot.vmp.storager.dao.PlatformGbStreamMapper;
+import com.genersoft.iot.vmp.storager.dao.StreamPushMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
 
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 @Component
 public class ZLMMediaListManager {
@@ -41,7 +48,13 @@
     private IStreamPushService streamPushService;
 
     @Autowired
+    private StreamPushMapper streamPushMapper;
+
+    @Autowired
     private ZLMHttpHookSubscribe subscribe;
+
+    @Autowired
+    private UserSetup userSetup;
 
 
     public void updateMediaList(MediaServerItem mediaServerItem) {
@@ -89,7 +102,43 @@
     }
 
     public void addMedia(MediaItem mediaItem) {
-        storager.updateMedia(streamPushService.transform(mediaItem));
+        // 鏌ユ壘姝ょ洿鎾祦鏄惁瀛樺湪redis棰勮gbId
+        StreamPushItem transform = streamPushService.transform(mediaItem);
+        // 浠巗treamId鍙栧嚭鏌ヨ鍏抽敭鍊�
+        Pattern pattern = Pattern.compile(userSetup.getThirdPartyGBIdReg());
+        Matcher matcher = pattern.matcher(mediaItem.getStream());// 鎸囧畾瑕佸尮閰嶇殑瀛楃涓�
+        String queryKey = null;
+        if (matcher.find()) { //姝ゅfind锛堬級姣忔琚皟鐢ㄥ悗锛屼細鍋忕Щ鍒颁笅涓�涓尮閰�
+            queryKey = matcher.group();
+        }
+        if (queryKey != null) {
+            ThirdPartyGB thirdPartyGB = redisCatchStorage.queryMemberNoGBId(queryKey);
+            if (thirdPartyGB != null && !StringUtils.isEmpty(thirdPartyGB.getNationalStandardNo())) {
+                transform.setGbId(thirdPartyGB.getNationalStandardNo());
+                transform.setName(thirdPartyGB.getName());
+            }
+        }
+        storager.updateMedia(transform);
+        if (!StringUtils.isEmpty(transform.getGbId())) {
+            // 濡傛灉杩欎釜鍥芥爣ID宸茬粡缁欎簡鍏朵粬鎺ㄦ祦涓旀祦宸茬绾匡紝鍒欑Щ闄ゅ叾浠栨帹娴�
+            List<GbStream> gbStreams = gbStreamMapper.selectByGBId(transform.getGbId());
+            if (gbStreams.size() > 0) {
+                for (GbStream gbStream : gbStreams) {
+                    // 鍑虹幇浣跨敤鐩稿悓鍥芥爣Id鐨勮棰戞祦鏃讹紝浣跨敤鏂版祦鏇挎崲鏃ф祦锛�
+                    gbStreamMapper.del(gbStream.getApp(), gbStream.getStream());
+                    platformGbStreamMapper.delByAppAndStream(gbStream.getApp(), gbStream.getStream());
+                    if (!gbStream.isStatus()) {
+                        streamPushMapper.del(gbStream.getApp(), gbStream.getStream());
+                    }
+                }
+            }
+            if (gbStreamMapper.selectOne(transform.getApp(), transform.getStream()) != null) {
+                gbStreamMapper.update(transform);
+            }else {
+                gbStreamMapper.add(transform);
+            }
+
+        }
     }
 
 
diff --git a/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java b/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
index 2b45ce7..7733254 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
@@ -37,4 +37,13 @@
     StreamPushItem transform(MediaItem item);
 
     StreamPushItem getPush(String app, String streamId);
+
+    /**
+     * 鍋滄涓�璺帹娴�
+     * @param app 搴旂敤鍚�
+     * @param streamId 娴両D
+     * @return
+     */
+    boolean stop(String app, String streamId);
+
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/service/bean/ThirdPartyGB.java b/src/main/java/com/genersoft/iot/vmp/service/bean/ThirdPartyGB.java
new file mode 100644
index 0000000..9d6b06a
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/service/bean/ThirdPartyGB.java
@@ -0,0 +1,23 @@
+package com.genersoft.iot.vmp.service.bean;
+
+public class ThirdPartyGB {
+
+    private String name;
+    private String nationalStandardNo;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getNationalStandardNo() {
+        return nationalStandardNo;
+    }
+
+    public void setNationalStandardNo(String nationalStandardNo) {
+        this.nationalStandardNo = nationalStandardNo;
+    }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
index 3ffc68e..2961bc6 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
@@ -79,44 +79,38 @@
         StringBuffer result = new StringBuffer();
         boolean streamLive = false;
         param.setMediaServerId(mediaInfo.getId());
+        boolean saveResult;
         // 鏇存柊
         if (videoManagerStorager.queryStreamProxy(param.getApp(), param.getStream()) != null) {
-            if (videoManagerStorager.updateStreamProxy(param)) {
-                result.append("淇濆瓨鎴愬姛");
-                if (param.isEnable()){
-                    JSONObject jsonObject = addStreamProxyToZlm(param);
-                    if (jsonObject == null) {
-                        result.append(", 浣嗘槸鍚敤澶辫触锛岃妫�鏌ユ祦鍦板潃鏄惁鍙敤");
-                        param.setEnable(false);
-                        videoManagerStorager.updateStreamProxy(param);
-                    }else {
-                        StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream(
-                                mediaInfo, param.getApp(), param.getStream(), null);
-                        wvpResult.setData(streamInfo);
-                    }
-                }
-            }
+            saveResult = videoManagerStorager.updateStreamProxy(param);
         }else { // 鏂板
-            if (videoManagerStorager.addStreamProxy(param)){
-                result.append("淇濆瓨鎴愬姛");
-                streamLive = true;
-                if (param.isEnable()) {
-                    JSONObject jsonObject = addStreamProxyToZlm(param);
-                    if (jsonObject == null) {
-                        streamLive = false;
-                        result.append(", 浣嗘槸鍚敤澶辫触锛岃妫�鏌ユ祦鍦板潃鏄惁鍙敤");
-                        param.setEnable(false);
-                        videoManagerStorager.updateStreamProxy(param);
-                    }else {
+            saveResult = videoManagerStorager.addStreamProxy(param);
+        }
+        if (saveResult) {
+            result.append("淇濆瓨鎴愬姛");
+            if (param.isEnable()) {
+                JSONObject jsonObject = addStreamProxyToZlm(param);
+                if (jsonObject == null) {
+                    streamLive = false;
+                    result.append(", 浣嗘槸鍚敤澶辫触锛岃妫�鏌ユ祦鍦板潃鏄惁鍙敤");
+                    param.setEnable(false);
+                    videoManagerStorager.updateStreamProxy(param);
+                }else {
+                    Integer code = jsonObject.getInteger("code");
+                    if (code == 0) {
                         StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream(
                                 mediaInfo, param.getApp(), param.getStream(), null);
                         wvpResult.setData(streamInfo);
+                    }else {
+                        result.append(", 浣嗘槸鍚敤澶辫触锛岃妫�鏌ユ祦鍦板潃鏄惁鍙敤");
+                        param.setEnable(false);
+                        videoManagerStorager.updateStreamProxy(param);
                     }
-                }
-            }else {
-                result.append("淇濆瓨澶辫触");
-            }
 
+                }
+            }
+        }else {
+            result.append("淇濆瓨澶辫触");
         }
         if (param.getPlatformGbId() != null && streamLive) {
             List<GbStream> gbStreams = new ArrayList<>();
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
index 634f670..41db0fe 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
@@ -12,6 +12,7 @@
 import com.genersoft.iot.vmp.service.IStreamPushService;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.dao.GbStreamMapper;
+import com.genersoft.iot.vmp.storager.dao.PlatformGbStreamMapper;
 import com.genersoft.iot.vmp.storager.dao.StreamPushMapper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
@@ -31,6 +32,9 @@
 
     @Autowired
     private StreamPushMapper streamPushMapper;
+
+    @Autowired
+    private PlatformGbStreamMapper platformGbStreamMapper;
 
     @Autowired
     private ZLMRESTfulUtils zlmresTfulUtils;
@@ -116,4 +120,18 @@
 
         return streamPushMapper.selectOne(app, streamId);
     }
+
+    @Override
+    public boolean stop(String app, String streamId) {
+        StreamPushItem streamPushItem = streamPushMapper.selectOne(app, streamId);
+        int delStream = streamPushMapper.del(app, streamId);
+        gbStreamMapper.del(app, streamId);
+        platformGbStreamMapper.delByAppAndStream(app, streamId);
+        if (delStream > 0) {
+            MediaServerItem mediaServerItem = mediaServerService.getOne(streamPushItem.getMediaServerId());
+            zlmresTfulUtils.closeStreams(mediaServerItem,app, streamId);
+        }
+        return true;
+    }
+
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
index 3314fb2..0458941 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -6,6 +6,7 @@
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
+import com.genersoft.iot.vmp.service.bean.ThirdPartyGB;
 
 import java.util.List;
 import java.util.Map;
@@ -152,4 +153,11 @@
     boolean startDownload(StreamInfo streamInfo);
 
     StreamInfo queryDownloadByStreamId(String streamId);
+
+    /**
+     * 鏌ユ壘绗笁鏂圭郴缁熺暀涓嬬殑鍥芥爣棰勮鍊�
+     * @param queryKey
+     * @return
+     */
+    ThirdPartyGB queryMemberNoGBId(String queryKey);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
index 570718b..39dc5ad 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
@@ -327,7 +327,7 @@
 	 * @param channelId
 	 * @return
 	 */
-	GbStream queryStreamInParentPlatform(String platformId, String channelId);
+	List<GbStream> queryStreamInParentPlatform(String platformId, String channelId);
 
 	/**
 	 * 鑾峰彇骞冲彴鍏宠仈鐨勭洿鎾祦
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
index ebf4239..84c04a1 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
@@ -40,10 +40,13 @@
     @Select("SELECT * FROM gb_stream WHERE app=#{app} AND stream=#{stream}")
     StreamProxyItem selectOne(String app, String stream);
 
+    @Select("SELECT * FROM gb_stream WHERE gbId=#{gbId}")
+    List<GbStream> selectByGBId(String gbId);
+
     @Select("SELECT gs.*, pgs.platformId FROM gb_stream gs " +
             "LEFT JOIN platform_gb_stream pgs ON gs.app = pgs.app AND gs.stream = pgs.stream " +
             "WHERE gs.gbId = '${gbId}' AND pgs.platformId = '${platformId}'")
-    GbStream queryStreamInPlatform(String platformId, String gbId);
+    List<GbStream> queryStreamInPlatform(String platformId, String gbId);
 
     @Select("SELECT gs.*, pgs.platformId FROM gb_stream gs " +
             "LEFT JOIN platform_gb_stream pgs ON gs.app = pgs.app AND gs.stream = pgs.stream " +
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java
index bb81171..c92711a 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java
@@ -15,10 +15,10 @@
 
     @Insert("INSERT INTO parent_platform (enable, name, serverGBId, serverGBDomain, serverIP, serverPort, deviceGBId, deviceIp,  " +
             "            devicePort, username, password, expires, keepTimeout, transport, characterSet, ptz, rtcp, " +
-            "            status) " +
+            "            status, shareAllLiveStream) " +
             "            VALUES (${enable}, '${name}', '${serverGBId}', '${serverGBDomain}', '${serverIP}', ${serverPort}, '${deviceGBId}', '${deviceIp}', " +
             "            '${devicePort}', '${username}', '${password}', '${expires}', '${keepTimeout}', '${transport}', '${characterSet}', ${ptz}, ${rtcp}, " +
-            "            ${status})")
+            "            ${status}, ${shareAllLiveStream})")
     int addParentPlatform(ParentPlatform parentPlatform);
 
     @Update("UPDATE parent_platform " +
@@ -39,7 +39,8 @@
             "characterSet=#{characterSet}, " +
             "ptz=#{ptz}, " +
             "rtcp=#{rtcp}, " +
-            "status=#{status} " +
+            "status=#{status}, " +
+            "shareAllLiveStream=#{shareAllLiveStream} " +
             "WHERE id=#{id}")
     int updateParentPlatform(ParentPlatform parentPlatform);
 
@@ -70,4 +71,7 @@
 
     @Update("UPDATE parent_platform SET status=#{online} WHERE serverGBId=#{platformGbID}" )
     int updateParentPlatformStatus(String platformGbID, boolean online);
+
+    @Select("SELECT * FROM parent_platform WHERE shareAllLiveStream=true")
+    List<ParentPlatform> selectAllAhareAllLiveStream();
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java
index 6243f32..a51eda2 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java
@@ -24,4 +24,7 @@
 
     @Select("SELECT * FROM platform_gb_stream WHERE app=#{app} AND stream=#{stream}")
     List<StreamProxyItem> selectByAppAndStream(String app, String stream);
+
+    @Select("SELECT * FROM platform_gb_stream WHERE app=#{app} AND stream=#{stream} AND platformId=#{serverGBId}")
+    StreamProxyItem selectOne(String app, String stream, String serverGBId);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
index c008d1e..984b994 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -6,6 +6,7 @@
 import com.genersoft.iot.vmp.conf.UserSetup;
 import com.genersoft.iot.vmp.gb28181.bean.*;
 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
+import com.genersoft.iot.vmp.service.bean.ThirdPartyGB;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper;
 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
@@ -13,6 +14,7 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
 
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -324,7 +326,7 @@
 
     @Override
     public void sendStreamChangeMsg(String type, JSONObject jsonObject) {
-        String key = VideoManagerConstants.WVP_MSG_STREAM_CHANGE__PREFIX + type;
+        String key = VideoManagerConstants.WVP_MSG_STREAM_CHANGE_PREFIX + type;
         logger.debug("[redis 娴佸彉鍖栦簨浠禲 {}: {}", key, jsonObject.toString());
         redis.convertAndSend(key, jsonObject);
     }
@@ -350,4 +352,11 @@
         if (playLeys == null || playLeys.size() == 0) return null;
         return (StreamInfo)redis.get(playLeys.get(0).toString());
     }
+
+    @Override
+    public ThirdPartyGB queryMemberNoGBId(String queryKey) {
+        String key = VideoManagerConstants.WVP_STREAM_GB_ID_PREFIX + queryKey;
+        JSONObject jsonObject = (JSONObject)redis.get(key);
+        return  JSONObject.toJavaObject(jsonObject, ThirdPartyGB.class);
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
index 9ad44d4..916f8a5 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
@@ -5,6 +5,7 @@
 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
+import com.genersoft.iot.vmp.service.IGbStreamService;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import com.genersoft.iot.vmp.storager.dao.*;
@@ -19,6 +20,7 @@
 import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -69,6 +71,16 @@
 
 	@Autowired
     private GbStreamMapper gbStreamMapper;
+;
+
+	@Autowired
+    private PlatformGbStreamMapper platformGbStreamMapper;
+
+	@Autowired
+    private IGbStreamService gbStreamService;
+
+	@Autowired
+    private ParentPlatformMapper parentPlatformMapper;
 
 	@Autowired
     private VideoStreamSessionManager streamSession;
@@ -356,6 +368,15 @@
 		// 鏇存柊缂撳瓨
 		parentPlatformCatch.setParentPlatform(parentPlatform);
 		redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch);
+		// 鍏变韩鎵�鏈夎棰戞祦锛岄渶瑕佸皢鐜版湁瑙嗛娴佹坊鍔犲埌姝ゅ钩鍙�
+		List<GbStream> gbStreams = gbStreamMapper.selectAll();
+		if (gbStreams.size() > 0) {
+			if (parentPlatform.isShareAllLiveStream()) {
+				gbStreamService.addPlatformInfo(gbStreams, parentPlatform.getServerGBId());
+			}else {
+				gbStreamService.delPlatformInfo(gbStreams);
+			}
+		}
 		return result > 0;
 	}
 
@@ -561,7 +582,7 @@
 	 * @return
 	 */
 	@Override
-	public GbStream queryStreamInParentPlatform(String platformId, String gbId) {
+	public List<GbStream> queryStreamInParentPlatform(String platformId, String gbId) {
 		return gbStreamMapper.queryStreamInPlatform(platformId, gbId);
 	}
 
@@ -602,6 +623,22 @@
 		streamPushMapper.del(streamPushItem.getApp(), streamPushItem.getStream());
 		streamPushMapper.add(streamPushItem);
 		gbStreamMapper.setStatus(streamPushItem.getApp(), streamPushItem.getStream(), true);
+		if(!StringUtils.isEmpty(streamPushItem.getGbId() )){
+			// 鏌ユ壘寮�鍚簡鍏ㄩ儴鐩存挱娴佸叡浜殑涓婄骇骞冲彴
+			List<ParentPlatform> parentPlatforms = parentPlatformMapper.selectAllAhareAllLiveStream();
+			if (parentPlatforms.size() > 0) {
+				for (ParentPlatform parentPlatform : parentPlatforms) {
+					streamPushItem.setPlatformId(parentPlatform.getServerGBId());
+					String stream = streamPushItem.getStream();
+					StreamProxyItem streamProxyItems = platformGbStreamMapper.selectOne(streamPushItem.getApp(), stream, parentPlatform.getServerGBId());
+					if (streamProxyItems == null) {
+						platformGbStreamMapper.add(streamPushItem);
+					}
+
+				}
+			}
+		}
+
 	}
 
 	@Override
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java
index c266ff6..5fcb6bd 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java
@@ -3,6 +3,7 @@
 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
 import com.genersoft.iot.vmp.service.IStreamPushService;
+import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -71,4 +72,21 @@
             return "fail";
         }
     }
+
+
+    @ApiOperation("涓涓�涓帹娴�")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "app", value = "搴旂敤鍚�", required = true, dataTypeClass = String.class),
+            @ApiImplicitParam(name = "streamId", value = "娴両D", required = true, dataTypeClass = String.class),
+    })
+    @PostMapping(value = "/stop")
+    @ResponseBody
+    public Object removeFormGB(@RequestParam(required = true)String app, @RequestParam(required = true)String streamId){
+        if (streamPushService.stop(app, streamId)){
+            return "success";
+        }else {
+            return "fail";
+        }
+    }
+
 }
diff --git a/src/main/resources/all-application.yml b/src/main/resources/all-application.yml
index 752008b..c00ee2a 100644
--- a/src/main/resources/all-application.yml
+++ b/src/main/resources/all-application.yml
@@ -160,6 +160,8 @@
     record-push-live: true
     # 鏄惁灏嗘棩蹇楀瓨鍌ㄨ繘鏁版嵁搴�
     logInDatebase: true
+    # 绗笁鏂瑰尮閰嶏紝鐢ㄤ簬浠巗tream閽熻幏鍙栨湁鏁堜俊鎭�
+    thirdPartyGBIdReg: [\s\S]*
 
 # 鍦ㄧ嚎鏂囨。锛� swagger-ui锛堢敓浜х幆澧冨缓璁叧闂級
 swagger-ui:
diff --git a/src/main/resources/wvp.sqlite b/src/main/resources/wvp.sqlite
index f969514..a1df173 100644
--- a/src/main/resources/wvp.sqlite
+++ b/src/main/resources/wvp.sqlite
Binary files differ
diff --git a/web_src/src/components/PushVideoList.vue b/web_src/src/components/PushVideoList.vue
index 9f1a7db..2f3ab2b 100644
--- a/web_src/src/components/PushVideoList.vue
+++ b/web_src/src/components/PushVideoList.vue
@@ -36,7 +36,7 @@
 						<template slot-scope="scope">
 							<el-button-group>
 								<el-button size="mini" icon="el-icon-video-play" @click="playPuhsh(scope.row)">鎾斁</el-button>
-								<el-button size="mini" icon="el-icon-switch-button" type="danger" v-if="!!scope.row.streamId" @click="stopPuhsh(scope.row)">鍋滄</el-button>
+								<el-button size="mini" icon="el-icon-switch-button" type="danger" @click="stopPuhsh(scope.row)">绉婚櫎</el-button>
 								<el-button size="mini" icon="el-icon-position" type="primary" v-if="!!!scope.row.gbId" @click="addToGB(scope.row)">鍔犲叆鍥芥爣</el-button>
 								<el-button size="mini" icon="el-icon-position" type="primary" v-if="!!scope.row.gbId" @click="removeFromGB(scope.row)">绉诲嚭鍥芥爣</el-button>
 							</el-button-group>
@@ -151,7 +151,21 @@
 				});
 			},
 			stopPuhsh: function(row){
-				console.log(row)
+        var that = this;
+        that.$axios({
+          method:"post",
+          url:"/api/push/stop",
+          params: {
+            app: row.app,
+            streamId: row.stream
+          }
+        }).then((res)=>{
+          if (res.data == "success") {
+            that.initData()
+          }
+        }).catch(function (error) {
+          console.log(error);
+        });
 			},
 			addToGB: function(row){
 				this.$refs.addStreamTOGB.openDialog({app: row.app, stream: row.stream, mediaServerId: row.mediaServerId}, this.initData);
@@ -159,16 +173,16 @@
 			removeFromGB: function(row){
 				var that = this;
 				that.$axios({
-                    method:"delete",
-                    url:"/api/push/remove_form_gb",
-                    data:row
-                }).then((res)=>{
-                    if (res.data == "success") {
+            method:"delete",
+            url:"/api/push/remove_form_gb",
+            data:row
+        }).then((res)=>{
+            if (res.data == "success") {
 							that.initData()
 						}
-                }).catch(function (error) {
-                    console.log(error);
-                });
+        }).catch(function (error) {
+            console.log(error);
+        });
 			},
 			dateFormat: function(/** timestamp=0 **/) {
 				var ts = arguments[0] || 0;
diff --git a/web_src/src/components/StreamProxyList.vue b/web_src/src/components/StreamProxyList.vue
index 27dab67..64e994a 100644
--- a/web_src/src/components/StreamProxyList.vue
+++ b/web_src/src/components/StreamProxyList.vue
@@ -50,6 +50,7 @@
               </div>
             </template>
           </el-table-column>
+          <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" align="center" width="150" show-overflow-tooltip/>
 					<el-table-column label="杞琀LS" width="120" align="center">
 						<template slot-scope="scope">
 						<div slot="reference" class="name-wrapper">
diff --git a/web_src/src/components/dialog/platformEdit.vue b/web_src/src/components/dialog/platformEdit.vue
index cc51652..fad0444 100644
--- a/web_src/src/components/dialog/platformEdit.vue
+++ b/web_src/src/components/dialog/platformEdit.vue
@@ -17,7 +17,7 @@
                 <el-input v-model="platform.name"></el-input>
               </el-form-item>
               <el-form-item label="SIP鏈嶅姟鍥芥爣缂栫爜" prop="serverGBId">
-                <el-input v-model="platform.serverGBId" clearable></el-input>
+                <el-input v-model="platform.serverGBId" clearable @input="serverGBIdChange"></el-input>
               </el-form-item>
               <el-form-item label="SIP鏈嶅姟鍥芥爣鍩�" prop="serverGBDomain">
                 <el-input v-model="platform.serverGBDomain" clearable></el-input>
@@ -29,7 +29,7 @@
                 <el-input v-model="platform.serverPort" clearable type="number"></el-input>
               </el-form-item>
               <el-form-item label="璁惧鍥芥爣缂栧彿" prop="deviceGBId">
-                <el-input v-model="platform.deviceGBId" clearable></el-input>
+                <el-input v-model="platform.deviceGBId" clearable @input="deviceGBIdChange"></el-input>
               </el-form-item>
               <el-form-item label="鏈湴IP" prop="deviceIp">
                 <el-input v-model="platform.deviceIp" :disabled="true"></el-input>
@@ -76,7 +76,7 @@
               <el-form-item label="鍏朵粬閫夐」">
                 <el-checkbox label="鍚敤" v-model="platform.enable" @change="checkExpires"></el-checkbox>
                 <el-checkbox label="浜戝彴鎺у埗" v-model="platform.ptz"></el-checkbox>
-                <el-checkbox label="RTCP淇濇椿" v-model="platform.rtcp"></el-checkbox>
+                <el-checkbox label="鍏变韩鎵�鏈夌洿鎾祦" v-model="platform.shareAllLiveStream"></el-checkbox>
               </el-form-item>
               <el-form-item>
                 <el-button type="primary" @click="onSubmit">{{
@@ -97,28 +97,6 @@
   name: "platformEdit",
   props: {},
   computed: {},
-  created() {
-    this.platform = {
-      id: null,
-      enable: true,
-      ptz: true,
-      rtcp: false,
-      name: null,
-      serverGBId: null,
-      serverGBDomain: null,
-      serverIP: null,
-      serverPort: null,
-      deviceGBId: null,
-      deviceIp: null,
-      devicePort: null,
-      username: null,
-      password: null,
-      expires: 300,
-      keepTimeout: 60,
-      transport: "UDP",
-      characterSet: "GB2312",
-    }
-  },
   data() {
     var deviceGBIdRules = async (rule, value, callback) => {
       console.log(value);
@@ -158,6 +136,7 @@
         keepTimeout: 60,
         transport: "UDP",
         characterSet: "GB2312",
+        shareAllLiveStream: false,
       },
       rules: {
         name: [{ required: true, message: "璇疯緭鍏ュ钩鍙板悕绉�", trigger: "blur" }],
@@ -198,11 +177,38 @@
           console.log(error);
         });
       }else {
-        this.platform = platform;
+        this.platform.id = platform.id;
+        this.platform.enable = platform.enable;
+        this.platform.ptz = platform.ptz;
+        this.platform.rtcp = platform.rtcp;
+        this.platform.name = platform.name;
+        this.platform.serverGBId = platform.serverGBId;
+        this.platform.serverGBDomain = platform.serverGBDomain;
+        this.platform.serverIP = platform.serverIP;
+        this.platform.serverPort = platform.serverPort;
+        this.platform.deviceGBId = platform.deviceGBId;
+        this.platform.deviceIp = platform.deviceIp;
+        this.platform.devicePort = platform.devicePort;
+        this.platform.username = platform.username;
+        this.platform.password = platform.password;
+        this.platform.expires = platform.expires;
+        this.platform.keepTimeout = platform.keepTimeout;
+        this.platform.transport = platform.transport;
+        this.platform.characterSet = platform.characterSet;
+        this.platform.shareAllLiveStream = platform.shareAllLiveStream;
         this.onSubmit_text = "淇濆瓨";
       }
       this.showDialog = true;
       this.listChangeCallback = callback;
+    },
+    serverGBIdChange: function () {
+      if (this.platform.serverGBId.length > 10) {
+        this.platform.serverGBDomain = this.platform.serverGBId.substr(0, 10);
+      }
+    },
+    deviceGBIdChange: function () {
+
+      this.platform.username = this.platform.deviceGBId ;
     },
     onSubmit: function () {
       console.log("onSubmit");
@@ -228,10 +234,30 @@
         });
     },
     close: function () {
-      console.log("鍏抽棴娣诲姞瑙嗛骞冲彴");
       this.showDialog = false;
       this.$refs.platform1.resetFields();
       this.$refs.platform2.resetFields();
+      this.platform = {
+        id: null,
+        enable: true,
+        ptz: true,
+        rtcp: false,
+        name: null,
+        serverGBId: null,
+        serverGBDomain: null,
+        serverIP: null,
+        serverPort: null,
+        deviceGBId: null,
+        deviceIp: null,
+        devicePort: null,
+        username: null,
+        password: null,
+        expires: 300,
+        keepTimeout: 60,
+        transport: "UDP",
+        characterSet: "GB2312",
+        shareAllLiveStream: false,
+      }
     },
     deviceGBIdExit: async function (deviceGbId) {
       var result = false;

--
Gitblit v1.8.0