From 9442c37ce73497a66d540f035e58201b54656e49 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期二, 15 二月 2022 17:41:09 +0800
Subject: [PATCH] 优化级联添加通道流程

---
 src/main/java/com/genersoft/iot/vmp/service/IGbStreamService.java                     |    2 
 web_src/src/components/dialog/catalogEdit.vue                                         |    3 
 web_src/src/components/PushVideoList.vue                                              |    6 
 web_src/static/css/iconfont.css                                                       |   14 
 web_src/src/components/dialog/chooseChannelForCatalog.vue                             |   41 +
 web_src/src/components/dialog/getCatalog.vue                                          |  161 ++++++++++
 src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java       |    6 
 web_src/index.html                                                                    |    1 
 web_src/src/components/dialog/chooseChannelForGb.vue                                  |  303 ++++++++++--------
 web_src/src/components/dialog/chooseChannelForStream.vue                              |  265 ++++++++--------
 src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java               |    2 
 web_src/src/components/dialog/chooseChannel.vue                                       |   16 
 web_src/static/css/iconfont.woff2                                                     |    0 
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java |   45 ++
 web_src/static/favicon.ico                                                            |    0 
 src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java                  |   18 
 src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java             |    5 
 web_src/src/components/UiHeader.vue                                                   |    2 
 src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java             |   45 +-
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/gbStream/GbStreamController.java |   25 +
 20 files changed, 608 insertions(+), 352 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/service/IGbStreamService.java b/src/main/java/com/genersoft/iot/vmp/service/IGbStreamService.java
index 0effa43..1a851d7 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/IGbStreamService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IGbStreamService.java
@@ -17,7 +17,7 @@
      * @param count
      * @return
      */
-    PageInfo<GbStream> getAll(Integer page, Integer count, String platFormId);
+    PageInfo<GbStream> getAll(Integer page, Integer count, String platFormId, String catalogId,String query,Boolean pushing,String mediaServerId);
 
 
     /**
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java
index 64f49ac..5827985 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java
@@ -52,9 +52,9 @@
     private EventPublisher eventPublisher;
 
     @Override
-    public PageInfo<GbStream> getAll(Integer page, Integer count, String platFormId) {
+    public PageInfo<GbStream> getAll(Integer page, Integer count, String platFormId, String catalogId, String query, Boolean pushing, String mediaServerId) {
         PageHelper.startPage(page, count);
-        List<GbStream> all = gbStreamMapper.selectAll(platFormId);
+        List<GbStream> all = gbStreamMapper.selectAll(platFormId, catalogId, query, pushing, mediaServerId);
         return new PageInfo<>(all);
     }
 
@@ -70,6 +70,7 @@
         boolean result = false;
         TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
         ParentPlatform parentPlatform = platformMapper.getParentPlatByServerGBId(platformId);
+        if (catalogId == null) catalogId = parentPlatform.getCatalogId();
         try {
             List<DeviceChannel> deviceChannelList = new ArrayList<>();
             for (GbStream gbStream : gbStreams) {
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 a188571..abcb1f4 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
@@ -239,7 +239,7 @@
 	/**
 	 * 鏌ヨ閫氶亾淇℃伅锛屼笉鍖哄垎璁惧(宸插叧鑱斿钩鍙版垨鍏ㄩ儴)
 	 */
-	PageInfo<ChannelReduce> queryAllChannelList(int page, int count, String query, Boolean online, Boolean channelType, String platformId, Boolean inPlatform);
+	PageInfo<ChannelReduce> queryAllChannelList(int page, int count, String query, Boolean online, Boolean channelType, String platformId, String catalogId);
 
 	/**
 	 * 鏌ヨ璁惧鐨勯�氶亾淇℃伅
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
index f882766..32dd7df 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
@@ -93,28 +93,31 @@
     void startPlay(String deviceId, String channelId, String streamId);
 
 
-    @Select(value = {" <script>" +
-            "SELECT * FROM ( "+
-                " SELECT dc.channelId, dc.deviceId, dc.name, de.manufacturer, de.hostAddress, " +
-                "(SELECT count(0) FROM device_channel WHERE parentId=dc.channelId) as subCount, " +
-                "(SELECT pc.platformId FROM platform_gb_channel pc WHERE pc.deviceId=dc.deviceId AND pc.channelId = dc.channelId AND pc.platformId = #{platformId}) as platformId, " +
-                "(SELECT pc.catalogId FROM platform_gb_channel pc WHERE pc.deviceId=dc.deviceId AND pc.channelId = dc.channelId AND pc.platformId = #{platformId} ) as catalogId " +
-                "FROM device_channel dc " +
-                "LEFT JOIN device de ON dc.deviceId = de.deviceId " +
-                " WHERE 1=1 " +
-                " <if test='query != null'> AND (dc.channelId LIKE '%${query}%' OR dc.name LIKE '%${query}%' OR dc.name LIKE '%${query}%')</if> " +
-                " <if test='online == true' > AND dc.status=1</if> " +
-                " <if test='online == false' > AND dc.status=0</if> " +
-            ") dcr" +
-            " WHERE 1=1 " +
-            " <if test='hasSubChannel!= null and hasSubChannel == true' >  AND subCount >0</if> " +
-            " <if test='hasSubChannel!= null and hasSubChannel == false' >  AND subCount=0</if> " +
-            " <if test='platformId != null and inPlatform == true ' >  AND platformId='${platformId}'</if> " +
-            " <if test='platformId != null and inPlatform == false ' >  AND (platformId != '${platformId}' OR platformId is NULL )  </if> " +
-            " ORDER BY deviceId, channelId ASC" +
-            " </script>"})
 
-    List<ChannelReduce> queryChannelListInAll(String query, Boolean online, Boolean hasSubChannel, String platformId, Boolean inPlatform);
+    @Select(value = {" <script>" +
+            "SELECT dc.channelId, "+
+            "dc.deviceId, " +
+            "dc.name, " +
+            "de.manufacturer, " +
+            "de.hostAddress, " +
+            "(SELECT count(0) FROM device_channel WHERE parentId = dc.channelId) as subCount, " +
+            "pgc.platformId as platformId, " +
+            "pgc.catalogId as catalogId " +
+            "FROM device_channel dc " +
+            "LEFT JOIN device de ON dc.deviceId = de.deviceId " +
+            "LEFT JOIN platform_gb_channel pgc on de.deviceId = pgc.deviceId and pgc.channelId = dc.channelId " +
+            "LEFT JOIN device_channel dc2 ON dc2.deviceId = de.deviceId AND dc2.parentId = dc.channelId " +
+            " WHERE 1=1 " +
+            " <if test='query != null'> AND (dc.channelId LIKE '%${query}%' OR dc.name LIKE '%${query}%' OR dc.name LIKE '%${query}%')</if> " +
+            " <if test='online == true' > AND dc.status=1</if> " +
+            " <if test='online == false' > AND dc.status=0</if> " +
+            " <if test='hasSubChannel!= null and hasSubChannel == true' >  AND dc2.channelId is not null</if> " +
+            " <if test='hasSubChannel!= null and hasSubChannel == false' >  AND dc2.channelId is null</if> " +
+            " <if test='catalogId == null ' >  AND pgc.platformId is null AND pgc.catalogId is null</if> " +
+            " <if test='catalogId != null ' >  AND pgc.platformId =#{platformId} AND pgc.catalogId = #{catalogId}</if> " +
+            " ORDER BY dc.deviceId, dc.channelId ASC" +
+            " </script>"})
+    List<ChannelReduce> queryChannelListInAll(String query, Boolean online, Boolean hasSubChannel, String platformId, String catalogId);
 
     @Select("SELECT * FROM device_channel WHERE channelId=#{channelId}")
     List<DeviceChannel> queryChannelByChannelId( 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 1bcecec..5d59e2e 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
@@ -37,10 +37,20 @@
     @Delete("DELETE FROM gb_stream WHERE app=#{app} AND stream=#{stream}")
     int del(String app, String stream);
 
-    @Select("SELECT gs.*, pgs.platformId AS platformId, pgs.catalogId AS catalogId FROM gb_stream gs " +
-            "LEFT JOIN  platform_gb_stream pgs ON gs.app = pgs.app AND gs.stream = pgs.stream AND (pgs.platformId = #{platformId} OR pgs.platformId is null)" +
-            "order by gs.id asc ")
-    List<GbStream> selectAll(String platformId);
+    @Select("<script> "+
+            "SELECT gs.*, pgs.platformId AS platformId, pgs.catalogId AS catalogId FROM gb_stream gs " +
+            "LEFT JOIN  platform_gb_stream pgs ON gs.app = pgs.app AND gs.stream = pgs.stream " +
+            "WHERE " +
+            "1=1 " +
+            " <if test='catalogId != null'> AND pgs.platformId = #{platformId} AND pgs.catalogId = #{catalogId}</if> " +
+            " <if test='catalogId == null'> AND pgs.platformId is null AND pgs.catalogId is null</if> " +
+            " <if test='query != null'> AND (gs.app LIKE '%${query}%' OR gs.stream LIKE '%${query}%' OR gs.gbId LIKE '%${query}%' OR gs.name LIKE '%${query}%')</if> " +
+            " <if test='pushing == true' > AND gs.status=1</if>" +
+            " <if test='pushing == false' > AND gs.status=0</if>" +
+            " <if test='mediaServerId != null' > AND gs.mediaServerId=#{mediaServerId} </if>" +
+            " order by gs.id asc " +
+            "</script>")
+    List<GbStream> selectAll(String platformId, String catalogId, String query, Boolean pushing, String mediaServerId);
 
     @Select("SELECT * FROM gb_stream WHERE app=#{app} AND stream=#{stream}")
     StreamProxyItem selectOne(String app, String stream);
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 57b30f1..2220ede 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
@@ -575,16 +575,16 @@
 
 	@Override
 	public PageInfo<ChannelReduce> queryAllChannelList(int page, int count, String query, Boolean online,
-													   Boolean channelType, String platformId, Boolean inPlatform) {
+													   Boolean channelType, String platformId, String catalogId) {
 		PageHelper.startPage(page, count);
-		List<ChannelReduce> all = deviceChannelMapper.queryChannelListInAll(query, online, channelType, platformId, inPlatform);
+		List<ChannelReduce> all = deviceChannelMapper.queryChannelListInAll(query, online, channelType, platformId, catalogId);
 		return new PageInfo<>(all);
 	}
 
 	@Override
 	public List<ChannelReduce> queryChannelListInParentPlatform(String platformId) {
 
-		return deviceChannelMapper.queryChannelListInAll(null, null, null, platformId, true);
+		return deviceChannelMapper.queryChannelListInAll(null, null, null, platformId, null);
 	}
 
 	@Override
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/gbStream/GbStreamController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/gbStream/GbStreamController.java
index 981c3cc..edc940f 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/gbStream/GbStreamController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/gbStream/GbStreamController.java
@@ -12,6 +12,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
 @Api(tags = "瑙嗛娴佸叧鑱斿埌绾ц仈骞冲彴")
@@ -40,15 +41,33 @@
     @ApiImplicitParams({
             @ApiImplicitParam(name = "page", value = "褰撳墠椤�", required = true , dataTypeClass = Integer.class),
             @ApiImplicitParam(name = "count", value = "姣忛〉鏉℃暟", required = true , dataTypeClass = Integer.class),
-            @ApiImplicitParam(name = "platformId", value = "骞冲彴ID", required = true , dataTypeClass = Integer.class),
+            @ApiImplicitParam(name = "platformId", value = "骞冲彴ID", required = true , dataTypeClass = String.class),
+            @ApiImplicitParam(name = "catalogId", value = "鐩綍ID", required = false , dataTypeClass = String.class),
+            @ApiImplicitParam(name="query", value = "鏌ヨ鍐呭", required = false , dataTypeClass = String.class),
+            @ApiImplicitParam(name="pushing", value = "鏄惁姝e湪鎺ㄦ祦", required = false , dataTypeClass = Boolean.class),
+            @ApiImplicitParam(name="mediaServerId", value = "娴佸獟浣揑D", required = false , dataTypeClass = String.class),
+
     })
     @GetMapping(value = "/list")
     @ResponseBody
     public PageInfo<GbStream> list(@RequestParam(required = true)Integer page,
                                    @RequestParam(required = true)Integer count,
-                                   @RequestParam(required = true)String platformId){
+                                   @RequestParam(required = true)String platformId,
+                                   @RequestParam(required = false)String catalogId,
+                                   @RequestParam(required = false)String query,
+                                   @RequestParam(required = false)Boolean pushing,
+                                   @RequestParam(required = false)String mediaServerId){
+        if (StringUtils.isEmpty(catalogId)) {
+            catalogId = null;
+        }
+        if (StringUtils.isEmpty(query)) {
+            query = null;
+        }
+        if (StringUtils.isEmpty(mediaServerId)) {
+            mediaServerId = null;
+        }
 
-        return gbStreamService.getAll(page, count, platformId);
+        return gbStreamService.getAll(page, count, platformId, catalogId, query, pushing, mediaServerId);
     }
 
 
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java
index 532d928..b850729 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java
@@ -65,6 +65,25 @@
         result.put("password", sipConfig.getPassword());
         return new ResponseEntity<>(result, HttpStatus.OK);
     }
+    /**
+     * 鑾峰彇绾ц仈鏈嶅姟鍣ㄤ俊鎭�
+     * @return
+     */
+    @ApiOperation("鑾峰彇鍥芥爣鏈嶅姟鐨勯厤缃�")
+    @GetMapping("/info/{id}")
+    public ResponseEntity<WVPResult<ParentPlatform>> getPlatform(@PathVariable String id) {
+        ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(id);
+        WVPResult<ParentPlatform> wvpResult = new WVPResult<>();
+        if (parentPlatform != null) {
+            wvpResult.setCode(0);
+            wvpResult.setMsg("success");
+            wvpResult.setData(parentPlatform);
+        }else {
+            wvpResult.setCode(-1);
+            wvpResult.setMsg("鏈煡璇㈠埌姝ゅ钩鍙�");
+        }
+        return new ResponseEntity<>(wvpResult, HttpStatus.OK);
+    }
 
     /**
      * 鍒嗛〉鏌ヨ绾ц仈骞冲彴
@@ -282,29 +301,33 @@
             @ApiImplicitParam(name = "page", value = "褰撳墠椤�", dataTypeClass = Integer.class),
             @ApiImplicitParam(name = "count", value = "姣忛〉鏉℃暟", dataTypeClass = Integer.class),
             @ApiImplicitParam(name = "platformId", value = "涓婄骇骞冲彴ID", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "catalogId", value = "鐩綍ID", dataTypeClass = String.class),
             @ApiImplicitParam(name = "query", value = "鏌ヨ鍐呭", dataTypeClass = String.class),
             @ApiImplicitParam(name = "online", value = "鏄惁鍦ㄧ嚎", dataTypeClass = Boolean.class),
-            @ApiImplicitParam(name = "choosed", value = "鏄惁宸查�変腑", dataTypeClass = Boolean.class),
             @ApiImplicitParam(name = "channelType", value = "閫氶亾绫诲瀷", dataTypeClass = Boolean.class),
     })
     @GetMapping("/channel_list")
     @ResponseBody
     public PageInfo<ChannelReduce> channelList(int page, int count,
                                               @RequestParam(required = false) String platformId,
+                                              @RequestParam(required = false) String catalogId,
                                               @RequestParam(required = false) String query,
                                               @RequestParam(required = false) Boolean online,
-                                              @RequestParam(required = false) Boolean choosed,
                                               @RequestParam(required = false) Boolean channelType){
 
 //        if (logger.isDebugEnabled()) {
 //            logger.debug("鏌ヨ鎵�鏈夋墍鏈夐�氶亾API璋冪敤");
 //        }
-        PageInfo<ChannelReduce> channelReduces = null;
-        if (platformId != null ) {
-            channelReduces = storager.queryAllChannelList(page, count, query, online, channelType, platformId, choosed);
-        }else {
-            channelReduces = storager.queryAllChannelList(page, count, query, online, channelType, null, false);
+        if(StringUtils.isEmpty(platformId)) {
+            platformId = null;
         }
+        if(StringUtils.isEmpty(query)) {
+            query = null;
+        }
+        if(StringUtils.isEmpty(platformId) || StringUtils.isEmpty(catalogId)) {
+            catalogId = null;
+        }
+        PageInfo<ChannelReduce> channelReduces = storager.queryAllChannelList(page, count, query, online, channelType, platformId, catalogId);
 
         return channelReduces;
     }
@@ -371,11 +394,11 @@
         }
         List<PlatformCatalog> platformCatalogList = storager.getChildrenCatalogByPlatform(platformId, parentId);
         // 鏌ヨ涓嬪睘鐨勫浗鏍囬�氶亾
-        List<PlatformCatalog> catalogsForChannel = storager.queryChannelInParentPlatformAndCatalog(platformId, parentId);
+//        List<PlatformCatalog> catalogsForChannel = storager.queryChannelInParentPlatformAndCatalog(platformId, parentId);
         // 鏌ヨ涓嬪睘鐨勭洿鎾祦閫氶亾
-        List<PlatformCatalog> catalogsForStream = storager.queryStreamInParentPlatformAndCatalog(platformId, parentId);
-        platformCatalogList.addAll(catalogsForChannel);
-        platformCatalogList.addAll(catalogsForStream);
+//        List<PlatformCatalog> catalogsForStream = storager.queryStreamInParentPlatformAndCatalog(platformId, parentId);
+//        platformCatalogList.addAll(catalogsForChannel);
+//        platformCatalogList.addAll(catalogsForStream);
         WVPResult<List<PlatformCatalog>> result = new WVPResult<>();
         result.setCode(0);
         result.setMsg("success");
diff --git a/web_src/index.html b/web_src/index.html
index 697e987..af1cad2 100644
--- a/web_src/index.html
+++ b/web_src/index.html
@@ -4,6 +4,7 @@
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <title>鍥芥爣28181</title>
+    <link rel="shortcut icon" href="static/favicon.ico" type="image/x-icon">
     <link rel="stylesheet" type="text/css" href="./static/css/iconfont.css">
     <link rel="stylesheet" type="text/css" href="./static/css/login.css">
   </head>
diff --git a/web_src/src/components/PushVideoList.vue b/web_src/src/components/PushVideoList.vue
index 12228f0..4c803da 100644
--- a/web_src/src/components/PushVideoList.vue
+++ b/web_src/src/components/PushVideoList.vue
@@ -35,11 +35,7 @@
 				<devicePlayer ref="devicePlayer"></devicePlayer>
 				<addStreamTOGB ref="addStreamTOGB"></addStreamTOGB>
 				<el-table ref="pushListTable" :data="pushList" border style="width: 100%" :height="winHeight" @selection-change="handleSelectionChange" :row-key="(row)=> row.app + row.stream">
-          <el-table-column
-            align="center"
-            type="selection"
-            :reserve-selection="true"
-            width="55">
+          <el-table-column align="center" type="selection" :reserve-selection="true" width="55">
           </el-table-column>
 					<el-table-column prop="name" label="鍚嶇О" align="center">
 					</el-table-column>
diff --git a/web_src/src/components/UiHeader.vue b/web_src/src/components/UiHeader.vue
index 4bbf639..828dda9 100644
--- a/web_src/src/components/UiHeader.vue
+++ b/web_src/src/components/UiHeader.vue
@@ -3,7 +3,7 @@
 		<el-menu router :default-active="activeIndex" menu-trigger="click" background-color="#545c64" text-color="#fff" active-text-color="#ffd04b" mode="horizontal">
             <el-menu-item index="/">鎺у埗鍙�</el-menu-item>
             <el-menu-item index="/live">瀹炴椂鐩戞帶</el-menu-item>
-            <el-menu-item index="/deviceList">璁惧鍒楄〃</el-menu-item>
+            <el-menu-item index="/deviceList">鍥芥爣璁惧</el-menu-item>
             <el-menu-item index="/pushVideoList">鎺ㄦ祦鍒楄〃</el-menu-item>
             <el-menu-item index="/streamProxyList">鎷夋祦浠g悊</el-menu-item>
             <el-menu-item index="/cloudRecord">浜戠褰曞儚</el-menu-item>
diff --git a/web_src/src/components/dialog/catalogEdit.vue b/web_src/src/components/dialog/catalogEdit.vue
index 5b59494..20b2168 100644
--- a/web_src/src/components/dialog/catalogEdit.vue
+++ b/web_src/src/components/dialog/catalogEdit.vue
@@ -77,8 +77,7 @@
       })
         .then((res)=> {
           if (res.data.code === 0) {
-            console.log("娣诲姞/淇敼鎴愬姛")
-            if (this.submitCallback)this.submitCallback()
+            if (this.submitCallback)this.submitCallback(this.form)
           }else {
             this.$message({
               showClose: true,
diff --git a/web_src/src/components/dialog/chooseChannel.vue b/web_src/src/components/dialog/chooseChannel.vue
index d173955..599921e 100644
--- a/web_src/src/components/dialog/chooseChannel.vue
+++ b/web_src/src/components/dialog/chooseChannel.vue
@@ -8,7 +8,7 @@
             <el-tab-pane label="鐩綍缁撴瀯" name="catalog">
               <el-container>
                 <el-main v-bind:style="{backgroundColor: '#FFF', maxHeight:  winHeight + 'px'}">
-                  <chooseChannelForCatalog ref="chooseChannelForCatalog" :platformId=platformId :platformName=platformName :defaultCatalogId=defaultCatalogId :catalogIdChange="catalogIdChange"></chooseChannelForCatalog>
+                  <chooseChannelForCatalog ref="chooseChannelForCatalog" :platformId=platformId :platformName=platformName :defaultCatalogId=defaultCatalogId :catalogIdChange="catalogIdChange" ></chooseChannelForCatalog>
                 </el-main>
               </el-container>
             </el-tab-pane>
@@ -20,14 +20,14 @@
             <el-tab-pane label="鍥芥爣閫氶亾" name="gbChannel">
               <el-container>
                 <el-main style="background-color: #FFF;">
-                  <chooseChannelForGb ref="chooseChannelForGb" :catalogId="catalogId" :platformId=platformId :updateChoosedCallback="updateChooseChannelCallback"></chooseChannelForGb>
+                  <chooseChannelForGb ref="chooseChannelForGb" :catalogId="catalogId" :catalogName="catalogName" :platformId=platformId ></chooseChannelForGb>
                 </el-main>
               </el-container>
             </el-tab-pane>
             <el-tab-pane label="鐩存挱娴侀�氶亾" name="streamchannel">
               <el-container>
                 <el-main style="background-color: #FFF;">
-                  <chooseChannelFoStream ref="chooseChannelFoStream" :catalogId="catalogId" :platformId=platformId :updateChoosedCallback="updateChooseChannelCallback"></chooseChannelFoStream>
+                  <chooseChannelFoStream ref="chooseChannelFoStream" :catalogId="catalogId" :catalogName="catalogName" :currentCatalogId="currentCatalogId" :platformId=platformId ></chooseChannelFoStream>
                 </el-main>
               </el-container>
             </el-tab-pane>
@@ -61,6 +61,8 @@
             catalogTabActiveName: "catalog",
             platformId: "",
             catalogId: "",
+            catalogName: "",
+            currentCatalogId: "",
             platformName: "",
             defaultCatalogId: "",
             showDialog: false,
@@ -108,14 +110,10 @@
                 console.log(error);
             });
         },
-        catalogIdChange: function (id) {
-            console.log("涓棿妯″潡鏀跺埌锛� " + id)
+        catalogIdChange: function (id, name) {
             this.catalogId = id;
+            this.catalogName = name;
         },
-        updateChooseChannelCallback (id){
-          console.log("涓棿妯″潡鏀跺埌閫夋嫨閫氶亾鍙樺寲锛� " + id)
-          this.$refs.chooseChannelForCatalog.refreshCatalogById(id)
-        }
     }
 };
 </script>
diff --git a/web_src/src/components/dialog/chooseChannelForCatalog.vue b/web_src/src/components/dialog/chooseChannelForCatalog.vue
index 6c7fdab..a0cb98c 100644
--- a/web_src/src/components/dialog/chooseChannelForCatalog.vue
+++ b/web_src/src/components/dialog/chooseChannelForCatalog.vue
@@ -7,19 +7,21 @@
        empty-text="鏈煡鑺傜偣"
        node-key="id"
        default-expand-all
-       :highlight-current="true"
+       :highlight-current="false"
        :expand-on-click-node="false"
        :props="props"
        :load="loadNode"
        @node-contextmenu="contextmenuEventHandler"
+       @node-click="nodeClickHandler"
        lazy>
        <span class="custom-tree-node" slot-scope="{ node, data }" style="width: 100%">
-         <el-radio v-if="node.data.type === 0" style="margin-right: 0" v-model="chooseId" :label="node.data.id">{{''}}</el-radio>
+         <el-radio v-if="node.data.type === 0 || node.data.type === -1" style="margin-right: 0" v-model="chooseId" :label="node.data.id">{{''}}</el-radio>
+         <span v-if="node.data.type === -1 && node.level === 1" style="font-size: 12px" class="iconfont icon-ziyuan"></span>
          <span v-if="node.data.type === 0 && node.level === 1" class="el-icon-s-home"></span>
          <span v-if="node.data.type === 0 && node.level > 1"  class="el-icon-folder-opened"></span>
          <span v-if="node.data.type === 1" class="iconfont icon-shexiangtou"></span>
          <span v-if="node.data.type === 2" class="iconfont icon-zhibo"></span>
-        <span style="padding-left: 1px">{{ node.label }}</span>
+        <span style=" padding-left: 1px">{{ node.label }}</span>
         <span>
           <i style="margin-left: 5rem; color: #9d9d9d; padding-right: 20px" v-if="node.data.id === defaultCatalogIdSign">榛樿</i>
         </span>
@@ -42,7 +44,7 @@
         this.defaultCatalogIdSign = this.defaultCatalogId;
         this.initData();
         setTimeout(()=>{
-          if (this.catalogIdChange)this.catalogIdChange(this.defaultCatalogId);
+          if (this.catalogIdChange)this.catalogIdChange(this.defaultCatalogId, this.platformName);
         }, 100)
 
     },
@@ -59,6 +61,7 @@
           defaultCatalogIdSign: null,
           chooseNode: null,
           chooseId: "",
+          chooseName: "",
           catalogTree: null,
           contextmenuShow: false
 
@@ -68,10 +71,6 @@
         platformId(newData, oldData){
             console.log(newData)
             this.initData()
-        },
-        chooseId(newData, oldData){
-          console.log("鍙戦�侊細 " + newData)
-          if (this.catalogIdChange)this.catalogIdChange(newData);
         },
     },
     methods: {
@@ -123,9 +122,12 @@
         editCatalog: function (data, node){
           let that = this;
           // 鎵撳紑娣诲姞寮圭獥
-          that.$refs.catalogEdit.openDialog(true, data.id, data.name, data.parentId, (data)=>{
+          that.$refs.catalogEdit.openDialog(true, data.id, data.name, data.parentId, (newData)=>{
             node.parent.loaded = false
             node.parent.expand();
+            if (data.id === this.chooseId && newData.name !== data.name) {
+              if (this.catalogIdChange)this.catalogIdChange(this.chooseId, newData.name);
+            }
           });
 
         },
@@ -172,11 +174,17 @@
         },
         loadNode: function(node, resolve){
           if (node.level === 0) {
-            resolve([{
-              name: this.platformName,
-              id:  this.platformId,
-              type:  0
-            }]);
+            resolve([
+              {
+              name: "鏈垎閰�",
+              id:  null,
+              type:  -1
+              },{
+                name: this.platformName,
+                id:  this.platformId,
+                type:  0
+              }
+            ]);
           }
           if (node.level >= 1){
             this.getCatalog(node.data.id, resolve)
@@ -291,6 +299,11 @@
 
         return false;
       },
+      nodeClickHandler: function (data, node, tree){
+       this.chooseId = data.id;
+       this.chooseName = data.name;
+       if (this.catalogIdChange)this.catalogIdChange(this.chooseId, this.chooseName);
+      }
     }
 };
 </script>
diff --git a/web_src/src/components/dialog/chooseChannelForGb.vue b/web_src/src/components/dialog/chooseChannelForGb.vue
index e46d3e5..95c78f7 100644
--- a/web_src/src/components/dialog/chooseChannelForGb.vue
+++ b/web_src/src/components/dialog/chooseChannelForGb.vue
@@ -1,6 +1,10 @@
 <template>
 <div id="chooseChannelForGb" >
-   <div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;font-size: 14px;">
+  <div style="font-size: 17px; color: #606060; white-space: nowrap; line-height: 30px; font-family: monospace;">
+    <span v-if="catalogId == null">{{catalogName}}鐨勭洿鎾祦</span>
+    <span v-if="catalogId != null">{{catalogName}}({{catalogId}})鐨勭洿鎾祦</span>
+  </div>
+   <div style="background-color: #FFFFFF; position: relative; padding: 0.5rem; text-align: left;font-size: 14px;">
         鎼滅储: <el-input @input="search" style="margin-right: 1rem; width: auto;" size="mini" placeholder="鍏抽敭瀛�" prefix-icon="el-icon-search" v-model="searchSrt" clearable> </el-input>
 
         閫氶亾绫诲瀷: <el-select size="mini" @change="search" style="margin-right: 1rem; width:6rem" v-model="channelType" placeholder="璇烽�夋嫨" default-first-option>
@@ -9,21 +13,18 @@
             <el-option label="瀛愮洰褰�" value="true"></el-option>
         </el-select>
 
-        閫夋嫨鐘舵��: <el-select size="mini"  style="margin-right: 1rem; width:6rem" v-model="choosed"  @change="search" placeholder="璇烽�夋嫨" default-first-option>
-        <el-option label="鍏ㄩ儴" value=""></el-option>
-        <el-option label="宸查�夋嫨" value="true"></el-option>
-        <el-option label="鏈�夋嫨" value="false"></el-option>
-        </el-select>
-
         鍦ㄧ嚎鐘舵��: <el-select size="mini" style="margin-right: 1rem; width:6rem" @change="search" v-model="online" placeholder="璇烽�夋嫨" default-first-option>
             <el-option label="鍏ㄩ儴" value=""></el-option>
             <el-option label="鍦ㄧ嚎" value="true"></el-option>
             <el-option label="绂荤嚎" value="false"></el-option>
         </el-select>
-
-<!--        <el-checkbox @change="shareAllCheckedChange">鍏ㄩ儴鍏变韩</el-checkbox>-->
+     <el-button v-if="catalogId !== null" icon="el-icon-delete" size="mini" style="margin-right: 1rem;" :disabled="gbChannels.length === 0 || multipleSelection.length === 0" type="danger" @click="batchDel">鎵归噺绉婚櫎</el-button>
+     <el-button v-if="catalogId === null" icon="el-icon-plus" size="mini" style="margin-right: 1rem;" :disabled="gbChannels.length === 0 || multipleSelection.length === 0" @click="batchAdd">鎵归噺娣诲姞</el-button>
     </div>
-    <el-table ref="gbChannelsTable" :data="gbChannels" border style="width: 100%" :height="winHeight">
+
+    <el-table ref="gbChannelsTable" :data="gbChannels" border style="width: 100%" :height="winHeight" :row-key="(row)=> row.deviceId + row.channelId" @selection-change="handleSelectionChange">
+        <el-table-column align="center" type="selection" :reserve-selection="true" width="55">
+        </el-table-column>
         <el-table-column prop="channelId" label="閫氶亾缂栧彿" width="180" align="center">
         </el-table-column>
         <el-table-column prop="name" label="閫氶亾鍚嶇О" show-overflow-tooltip align="center">
@@ -50,10 +51,12 @@
     </el-table>
     <el-pagination style="float: right;margin-top: 1rem;" @size-change="handleSizeChange" @current-change="currentChange" :current-page="currentPage" :page-size="count" :page-sizes="[10, 20, 30, 50]" layout="total, sizes, prev, pager, next" :total="total">
     </el-pagination>
+    <getCatalog ref="getCatalog" :platformId="platformId" ></getCatalog>
 </div>
 </template>
 
 <script>
+import getCatalog from './getCatalog'
 export default {
     name: 'chooseChannelForGb',
     computed: {
@@ -65,9 +68,12 @@
         //     };
         // }
     },
-    props: ['platformId','catalogId', 'updateChoosedCallback'],
+    props: ['platformId','catalogId',  'catalogName'],
     created() {
         this.initData();
+    },
+    components: {
+      getCatalog,
     },
     data() {
         return {
@@ -80,7 +86,8 @@
             currentPage: 1,
             count: 10,
             total: 0,
-            eventEnanle: false,
+            eventEnable: false,
+            multipleSelection: [],
             winHeight: window.innerHeight - 400,
 
         };
@@ -88,8 +95,10 @@
     watch:{
         platformId(newData, oldData){
             console.log(newData)
-            this.initData()
-
+            this.getChannelList()
+        },
+        catalogId(newData, oldData){
+          this.getChannelList()
         },
     },
     methods: {
@@ -105,28 +114,24 @@
             console.log(val)
             this.initData();
         },
-        rowcheckedChange: function (val, row) {
-            console.log(val)
-            console.log(row)
-        },
         add: function (row) {
-          console.log(row)
-          row.catalogId = this.catalogId
-          row.platformId = this.platformId
-          this.$axios({
-            method:"post",
-            url:"/api/platform/update_channel_for_gb",
-            data:{
-              platformId:  this.platformId,
-              channelReduces: [row],
-              catalogId: this.catalogId
-            }
-          }).then((res)=>{
-            console.log("淇濆瓨鎴愬姛")
-            if(this.updateChoosedCallback)this.updateChoosedCallback(this.catalogId)
-          }).catch(function (error) {
-            console.log(error);
-          });
+          this.getCatalogFromUser((catalogId)=> {
+            this.$axios({
+              method:"post",
+              url:"/api/platform/update_channel_for_gb",
+              data:{
+                platformId:  this.platformId,
+                channelReduces: [row],
+                catalogId: catalogId
+              }
+            }).then((res)=>{
+              console.log("淇濆瓨鎴愬姛")
+              this.getChannelList();
+            }).catch(function (error) {
+              console.log(error);
+            });
+          })
+
         },
         remove: function (row) {
           console.log(row)
@@ -140,91 +145,87 @@
             }
           }).then((res)=>{
             console.log("绉婚櫎鎴愬姛")
-            if(this.updateChoosedCallback)this.updateChoosedCallback(row.catalogId)
-            row.platformId = null;
-            row.catalogId = null
+            this.getChannelList();
           }).catch(function (error) {
             console.log(error);
           });
         },
-        checkedChange: function (val) {
-            let that = this;
-            if (!that.eventEnanle) {
-                return;
-            }
-            let newData = {};
-            let addData = [];
-            let delData = [];
-            if (val.length > 0) {
-                for (let i = 0; i < val.length; i++) {
-                    const element = val[i];
-                    let key = element.deviceId + "_" + element.channelId;
-                    newData[key] = element;
-                    if (!!!that.gbChoosechannel[key]){
-                        addData.push(element)
-                    }else{
-                        delete that.gbChoosechannel[key]
-                    }
-                }
-
-                let oldKeys = Object.keys(that.gbChoosechannel);
-                if (oldKeys.length > 0) {
-                    for (let i = 0; i < oldKeys.length; i++) {
-                        const key = oldKeys[i];
-                        delData.push(that.gbChoosechannel[key])
-                    }
-                }
-
-            }else{
-                let oldKeys = Object.keys(that.gbChoosechannel);
-                if (oldKeys.length > 0) {
-                    for (let i = 0; i < oldKeys.length; i++) {
-                        const key = oldKeys[i];
-                        delData.push(that.gbChoosechannel[key])
-                    }
-                }
-            }
-
-            that.gbChoosechannel = newData;
-            if (Object.keys(addData).length >0) {
-                that.$axios({
-                    method:"post",
-                    url:"/api/platform/update_channel_for_gb",
-                    data:{
-                        platformId:  that.platformId,
-                        channelReduces: addData,
-                        catalogId: that.catalogId
-                    }
-                }).then((res)=>{
-                    console.log("淇濆瓨鎴愬姛")
-                    if(that.updateChoosedCallback)that.updateChoosedCallback(that.catalogId)
-                }).catch(function (error) {
-                    console.log(error);
-                });
-            }
-            if (delData.length >0) {
-                 that.$axios({
-                    method:"delete",
-                    url:"/api/platform/del_channel_for_gb",
-                    data:{
-                        platformId:  that.platformId,
-                        channelReduces: delData
-                    }
-                }).then((res)=>{
-                    console.log("绉婚櫎鎴愬姛")
-                   let nodeIds = new Array();
-                   for (let i = 0; i < delData.length; i++) {
-                     nodeIds.push(delData[i].channelId)
-                   }
-                   if(that.updateChoosedCallback)that.updateChoosedCallback(null, nodeIds)
-                }).catch(function (error) {
-                    console.log(error);
-                });
-            }
-        },
-        shareAllCheckedChange: function (val) {
-
-        },
+        // checkedChange: function (val) {
+        //     let that = this;
+        //     if (!that.eventEnable) {
+        //         return;
+        //     }
+        //     let newData = {};
+        //     let addData = [];
+        //     let delData = [];
+        //     if (val.length > 0) {
+        //         for (let i = 0; i < val.length; i++) {
+        //             const element = val[i];
+        //             let key = element.deviceId + "_" + element.channelId;
+        //             newData[key] = element;
+        //             if (!!!that.gbChoosechannel[key]){
+        //                 addData.push(element)
+        //             }else{
+        //                 delete that.gbChoosechannel[key]
+        //             }
+        //         }
+        //
+        //         let oldKeys = Object.keys(that.gbChoosechannel);
+        //         if (oldKeys.length > 0) {
+        //             for (let i = 0; i < oldKeys.length; i++) {
+        //                 const key = oldKeys[i];
+        //                 delData.push(that.gbChoosechannel[key])
+        //             }
+        //         }
+        //
+        //     }else{
+        //         let oldKeys = Object.keys(that.gbChoosechannel);
+        //         if (oldKeys.length > 0) {
+        //             for (let i = 0; i < oldKeys.length; i++) {
+        //                 const key = oldKeys[i];
+        //                 delData.push(that.gbChoosechannel[key])
+        //             }
+        //         }
+        //     }
+        //
+        //     that.gbChoosechannel = newData;
+        //     if (Object.keys(addData).length >0) {
+        //         that.$axios({
+        //             method:"post",
+        //             url:"/api/platform/update_channel_for_gb",
+        //             data:{
+        //                 platformId:  that.platformId,
+        //                 channelReduces: addData,
+        //                 catalogId: that.catalogId
+        //             }
+        //         }).then((res)=>{
+        //             console.log("淇濆瓨鎴愬姛")
+        //         }).catch(function (error) {
+        //             console.log(error);
+        //         });
+        //     }
+        //     if (delData.length >0) {
+        //          that.$axios({
+        //             method:"delete",
+        //             url:"/api/platform/del_channel_for_gb",
+        //             data:{
+        //                 platformId:  that.platformId,
+        //                 channelReduces: delData
+        //             }
+        //         }).then((res)=>{
+        //             console.log("绉婚櫎鎴愬姛")
+        //            let nodeIds = new Array();
+        //            for (let i = 0; i < delData.length; i++) {
+        //              nodeIds.push(delData[i].channelId)
+        //            }
+        //         }).catch(function (error) {
+        //             console.log(error);
+        //         });
+        //     }
+        // },
+        // shareAllCheckedChange: function (val) {
+        //
+        // },
         getChannelList: function () {
             let that = this;
 
@@ -236,7 +237,7 @@
                         count: that.count,
                         query: that.searchSrt,
                         online: that.online,
-                        choosed: that.choosed,
+                        catalogId: that.catalogId,
                         platformId: that.platformId,
                         channelType: that.channelType
                     }
@@ -248,20 +249,7 @@
                     // 闃叉鍑虹幇琛ㄦ牸閿欎綅
                     that.$nextTick(() => {
                         that.$refs.gbChannelsTable.doLayout();
-                        // 榛樿閫変腑
-                        var chooseGBS = [];
-                        for (let i = 0; i < res.data.list.length; i++) {
-                            const row = res.data.list[i];
-                            console.log(row.platformId)
-                            if (row.platformId == that.platformId) {
-                                that.$refs.gbChannelsTable.toggleRowSelection(row, true);
-                                chooseGBS.push(row)
-                                that.gbChoosechannel[row.deviceId+ "_" + row.channelId] = row;
-
-                            }
-                        }
-                         that.eventEnanle = true;
-                        // that.checkedChange(chooseGBS)
+                        that.eventEnable = true;
                     })
                     console.log(that.gbChoosechannel)
                 })
@@ -276,10 +264,55 @@
         handleGBSelectionChange: function() {
             this.initData();
         },
-        // catalogIdChange: function(id) {
-        //     this.catalogId = id;
-        //     console.log("閫氶亾閫夋嫨妯″潡鏀跺埌锛� " + id)
-        // },
+      batchDel: function() {
+        this.$confirm(`纭杩�${this.multipleSelection.length}涓�氶亾鍚楋紵`, '鎻愮ず', {
+          confirmButtonText: '纭畾',
+          cancelButtonText: '鍙栨秷',
+          type: 'warning'
+        }).then(() => {
+          this.$axios({
+            method:"delete",
+            url:"/api/platform/del_channel_for_gb",
+            data:{
+              platformId:  this.platformId,
+              channelReduces: this.multipleSelection
+            }
+          }).then((res)=>{
+            console.log("绉婚櫎鎴愬姛")
+            this.$refs.gbChannelsTable.clearSelection()
+            this.getChannelList();
+          }).catch(function (error) {
+            console.log(error);
+          });
+        }).catch(() => {
+        });
+      },
+      batchAdd: function() {
+        this.getCatalogFromUser((catalogId)=> {
+
+          this.$axios({
+            method: "post",
+            url: "/api/platform/update_channel_for_gb",
+            data: {
+              platformId: this.platformId,
+              channelReduces: this.multipleSelection,
+              catalogId: catalogId,
+            }
+          }).then((res) => {
+            console.log("淇濆瓨鎴愬姛")
+            this.$refs.gbChannelsTable.clearSelection()
+            this.getChannelList();
+          }).catch(function (error) {
+            console.log(error);
+          });
+        });
+      },
+      handleSelectionChange: function (val) {
+        this.multipleSelection = val;
+      },
+      getCatalogFromUser(callback){
+        this.$refs.getCatalog.openDialog(callback)
+      },
     }
 };
 </script>
diff --git a/web_src/src/components/dialog/chooseChannelForStream.vue b/web_src/src/components/dialog/chooseChannelForStream.vue
index 931a58e..0bc8f04 100644
--- a/web_src/src/components/dialog/chooseChannelForStream.vue
+++ b/web_src/src/components/dialog/chooseChannelForStream.vue
@@ -1,6 +1,33 @@
 <template>
 <div id="chooseChannelFoStream" >
-    <el-table ref="gbStreamsTable" :data="gbStreams" border style="width: 100%" :height="winHeight">
+    <div style="font-size: 17px; color: #606060; white-space: nowrap; line-height: 30px; font-family: monospace;">
+      <span v-if="catalogId == null">{{catalogName}}鐨勭洿鎾祦</span>
+      <span v-if="catalogId != null">{{catalogName}}({{catalogId}})鐨勭洿鎾祦</span>
+    </div>
+    <div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;font-size: 14px;">
+
+      鎼滅储: <el-input @input="getChannelList" style="margin-right: 1rem; width: auto;" size="mini" placeholder="鍏抽敭瀛�" prefix-icon="el-icon-search" v-model="searchSrt" clearable> </el-input>
+
+<!--      娴佸獟浣�: <el-select size="mini" @change="getChannelList" style="margin-right: 1rem;" v-model="mediaServerId" placeholder="璇烽�夋嫨" default-first-option>-->
+<!--      <el-option label="鍏ㄩ儴" value=""></el-option>-->
+<!--      <el-option-->
+<!--        v-for="item in mediaServerList"-->
+<!--        :key="item.id"-->
+<!--        :label="item.id"-->
+<!--        :value="item.id">-->
+<!--      </el-option>-->
+<!--      </el-select>-->
+        鎺ㄦ祦鐘舵��: <el-select size="mini" style="margin-right: 1rem;" @change="getChannelList" v-model="pushing" placeholder="璇烽�夋嫨" default-first-option>
+        <el-option label="鍏ㄩ儴" value=""></el-option>
+        <el-option label="鎺ㄦ祦杩涜涓�" value="true"></el-option>
+        <el-option label="鎺ㄦ祦鏈繘琛�" value="false"></el-option>
+      </el-select>
+      <el-button v-if="catalogId !== null" icon="el-icon-delete" size="mini" style="margin-right: 1rem;" :disabled="gbStreams.length === 0 || multipleSelection.length === 0" type="danger" @click="batchDel">鎵归噺绉婚櫎</el-button>
+      <el-button v-if="catalogId === null" icon="el-icon-plus" size="mini" style="margin-right: 1rem;" :disabled="gbStreams.length === 0 || multipleSelection.length === 0" @click="batchAdd">鎵归噺娣诲姞</el-button>
+    </div>
+    <el-table ref="gbStreamsTable" :data="gbStreams" border style="width: 100%" :height="winHeight" :row-key="(row)=> row.app + row.stream" @selection-change="handleSelectionChange">
+        <el-table-column align="center" type="selection" :reserve-selection="true" width="55">
+        </el-table-column>
         <el-table-column prop="name" label="鍚嶇О" show-overflow-tooltip align="center">
         </el-table-column>
         <el-table-column prop="app" label="搴旂敤鍚�" show-overflow-tooltip align="center">
@@ -20,18 +47,21 @@
       <el-table-column label="鎿嶄綔" width="100" align="center" fixed="right" >
         <template slot-scope="scope">
           <el-button-group>
-            <el-button size="mini" icon="el-icon-plus" v-if="!scope.row.platformId" @click="add(scope.row)">娣诲姞</el-button>
-            <el-button size="mini" icon="el-icon-delete" v-if="scope.row.platformId" type="danger" @click="remove(scope.row)">绉婚櫎</el-button>
+            <el-button size="mini" icon="el-icon-plus" v-if="!scope.row.platformId" @click="add(scope.row, scope)">娣诲姞</el-button>
+            <el-button size="mini" icon="el-icon-delete" v-if="scope.row.platformId" type="danger" @click="remove(scope.row, scope)">绉婚櫎</el-button>
           </el-button-group>
         </template>
       </el-table-column>
     </el-table>
     <el-pagination style="float: right;margin-top: 1rem;" @size-change="handleSizeChange" @current-change="currentChange" :current-page="currentPage" :page-size="count" :page-sizes="[10, 20, 30, 50]" layout="total, sizes, prev, pager, next" :total="total">
     </el-pagination>
+    <getCatalog ref="getCatalog" :platformId="platformId" ></getCatalog>
 </div>
 </template>
 
 <script>
+import MediaServer from './../service/MediaServer'
+import getCatalog from './getCatalog'
 export default {
     name: 'chooseChannelFoStream',
     computed: {
@@ -43,73 +73,81 @@
         //     };
         // }
     },
-    props: ['platformId', 'catalogId',  'updateChoosedCallback'],
+    props: ['platformId', 'catalogId',  'catalogName'],
     created() {
         this.initData();
+    },
+    components: {
+      getCatalog,
     },
     data() {
         return {
             gbStreams: [],
             gbChoosechannel:{},
-            searchSrt: "",
             channelType: "",
             online: "",
             choosed: "",
             currentPage: 1,
             count: 10,
             total: 0,
-            eventEnanle: false,
+            searchSrt: "",
+            pushing: "",
+            mediaServerId: "",
+            mediaServerList: [],
+            mediaServerObj : new MediaServer(),
+            eventEnable: false,
+            multipleSelection: [],
             winHeight: window.innerHeight - 350,
 
         };
     },
     watch:{
         platformId(newData, oldData){
-            console.log(newData)
-            this.initData()
-
+            this.getChannelList()
+        },
+        catalogId(newData, oldData){
+            this.getChannelList()
         },
     },
     methods: {
         initData: function() {
+            this.mediaServerObj.getOnlineMediaServerList((data)=>{
+              this.mediaServerList = data.data;
+            })
             this.getChannelList();
         },
         currentChange: function (val) {
             this.currentPage = val;
-            this.initData();
+            this.getChannelList();
         },
         handleSizeChange: function (val) {
             this.count = val;
             console.log(val)
-            this.initData();
+            this.getChannelList();
 
         },
-        rowcheckedChanage: function (val, row) {
-            console.log(val)
-            console.log(row)
-        },
-        add: function (row) {
-          console.log(row)
-          row.catalogId = this.catalogId
-          row.platformId = this.platformId
-          this.$axios({
-            method:"post",
-            url:"/api/gbStream/add",
-            data:{
-              platformId: this.platformId,
-              catalogId: this.catalogId,
-              gbStreams:  [row],
-            }
-          }).then((res)=>{
-            console.log("淇濆瓨鎴愬姛")
-            if(this.updateChoosedCallback)this.updateChoosedCallback(this.catalogId)
-          }).catch(function (error) {
-            console.log(error);
-          });
-        },
-        remove: function (row) {
-          console.log(row)
+        add: function (row, scope) {
+          this.getCatalogFromUser((catalogId)=>{
+            this.$axios({
+              method:"post",
+              url:"/api/gbStream/add",
+              data:{
+                platformId: this.platformId,
+                catalogId: catalogId,
+                gbStreams:  [row],
+              }
+            }).then((res)=>{
+              console.log("淇濆瓨鎴愬姛")
+              // this.gbStreams.splice(scope.$index,1)
+              this.getChannelList();
+            }).catch(function (error) {
+              console.log(error);
+            });
+          })
 
+
+        },
+        remove: function (row, scope) {
           this.$axios({
             method:"delete",
             url:"/api/gbStream/del",
@@ -119,91 +157,11 @@
             }
           }).then((res)=>{
             console.log("绉婚櫎鎴愬姛")
-            if(this.updateChoosedCallback)this.updateChoosedCallback(row.catalogId)
-            row.platformId = null;
-            row.catalogId = null
+            // this.gbStreams.splice(scope.$index,1)
+            this.getChannelList();
           }).catch(function (error) {
             console.log(error);
           });
-        },
-        checkedChanage: function (val) {
-            var that = this;
-            if (!that.eventEnanle) {
-                return;
-            }
-
-            var newData = {};
-            var addData = [];
-            var delData = [];
-            if (val.length > 0) {
-                for (let i = 0; i < val.length; i++) {
-                    const element = val[i];
-                    var key = element.app + "_" + element.stream;
-                    newData[key] = element;
-                    if (!!!that.gbChoosechannel[key]){
-                        addData.push(element)
-                    }else{
-                        delete that.gbChoosechannel[key]
-                    }
-                }
-
-                 var oldKeys = Object.keys(that.gbChoosechannel);
-                if (oldKeys.length > 0) {
-                    for (let i = 0; i < oldKeys.length; i++) {
-                        const key = oldKeys[i];
-                        delData.push(that.gbChoosechannel[key])
-                    }
-                }
-
-            }else{
-                var oldKeys = Object.keys(that.gbChoosechannel);
-                if (oldKeys.length > 0) {
-                    for (let i = 0; i < oldKeys.length; i++) {
-                        const key = oldKeys[i];
-                        delData.push(that.gbChoosechannel[key])
-                    }
-                }
-            }
-
-            that.gbChoosechannel = newData;
-            if (Object.keys(addData).length >0) {
-                console.log(addData)
-                that.$axios({
-                    method:"post",
-                     url:"/api/gbStream/add",
-                    data:{
-                        platformId: that.platformId,
-                        catalogId: that.catalogId,
-                        gbStreams:  addData,
-                    }
-                }).then((res)=>{
-                    console.log("淇濆瓨鎴愬姛")
-                    if(this.updateChoosedCallback)this.updateChoosedCallback(this.catalogId)
-                }).catch(function (error) {
-                    console.log(error);
-                });
-            }
-            if (Object.keys(delData).length >0) {
-                console.log(delData)
-                 that.$axios({
-                    method:"delete",
-                    url:"/api/gbStream/del",
-                    data:{
-                        platformId: that.platformId,
-                        gbStreams:  delData,
-                    }
-                }).then((res)=>{
-                    console.log("绉婚櫎鎴愬姛")
-                   if(this.updateChoosedCallback)this.updateChoosedCallback(this.catalogId)
-                }).catch(function (error) {
-                    console.log(error);
-                });
-
-            }
-
-        },
-        shareAllCheckedChanage: function (val) {
-            this.chooseChanage(null, val)
         },
         getChannelList: function () {
             let that = this;
@@ -215,10 +173,10 @@
                     page: that.currentPage,
                     count: that.count,
                     query: that.searchSrt,
-                    online: that.online,
-                    choosed: that.choosed,
+                    pushing: that.online,
                     platformId: that.platformId,
-                    channelType: that.channelType
+                    catalogId: that.catalogId,
+                    mediaServerId: that.mediaServerId
                 }
                 })
                 .then(function (res) {
@@ -229,29 +187,62 @@
                     that.$nextTick(() => {
                         that.$refs.gbStreamsTable.doLayout();
                         // 榛樿閫変腑
-                        var chooseGBS = [];
-                        for (let i = 0; i < res.data.list.length; i++) {
-                            const row = res.data.list[i];
-                            console.log(row.platformId)
-                            if (row.platformId == that.platformId) {
-                                that.$refs.gbStreamsTable.toggleRowSelection(row, true);
-                                chooseGBS.push(row)
-                                that.gbChoosechannel[row.app+ "_" + row.stream] = row;
-
-                            }
-                        }
-                         that.eventEnanle = true;
-                        // that.checkedChanage(chooseGBS)
+                         that.eventEnable = true;
                     })
-                    console.log(that.gbChoosechannel)
                 })
                 .catch(function (error) {
                     console.log(error);
                 });
 
         },
-        handleGBSelectionChange: function() {
-            this.initData();
+        batchDel: function() {
+          this.$confirm(`纭杩�${this.multipleSelection.length}涓�氶亾鍚楋紵`, '鎻愮ず', {
+            confirmButtonText: '纭畾',
+            cancelButtonText: '鍙栨秷',
+            type: 'warning'
+          }).then(() => {
+            this.$axios({
+              method:"delete",
+              url:"/api/gbStream/del",
+              data:{
+                platformId: this.platformId,
+                gbStreams:  this.multipleSelection,
+              }
+            }).then((res)=>{
+              console.log("绉婚櫎鎴愬姛")
+              this.$refs.gbStreamsTable.clearSelection()
+              this.getChannelList();
+            }).catch(function (error) {
+              console.log(error);
+            });
+          }).catch(() => {
+          });
+
+        },
+        batchAdd: function() {
+          this.getCatalogFromUser((catalogId)=>{
+            this.$axios({
+              method:"post",
+              url:"/api/gbStream/add",
+              data:{
+                platformId: this.platformId,
+                catalogId: catalogId,
+                gbStreams:  this.multipleSelection,
+              }
+            }).then((res)=>{
+              console.log("淇濆瓨鎴愬姛")
+              this.$refs.gbStreamsTable.clearSelection()
+              this.getChannelList();
+            }).catch(function (error) {
+              console.log(error);
+            });
+          })
+        },
+        getCatalogFromUser(callback){
+            this.$refs.getCatalog.openDialog(callback)
+        },
+        handleSelectionChange: function (val) {
+          this.multipleSelection = val;
         },
     }
 };
diff --git a/web_src/src/components/dialog/getCatalog.vue b/web_src/src/components/dialog/getCatalog.vue
new file mode 100644
index 0000000..a146889
--- /dev/null
+++ b/web_src/src/components/dialog/getCatalog.vue
@@ -0,0 +1,161 @@
+<template>
+<div id="getCatalog" >
+
+  <el-dialog title="閫夋嫨瑕佹坊鍔犲埌鐨勮妭鐐�" v-if="showDialog"  width="50%" :append-to-body="true" :close-on-click-modal="false" :visible.sync="showDialog" :destroy-on-close="true" @close="close()" center>
+    <div>
+      <el-tree class="el-scrollbar"
+               ref="tree"
+               id="catalogTree"
+               empty-text="鏈煡鑺傜偣"
+               node-key="id"
+               default-expand-all
+               :highlight-current="false"
+               :expand-on-click-node="false"
+               :props="props"
+               :load="loadNode"
+               @node-click="nodeClickHandler"
+               lazy>
+       <span class="custom-tree-node" slot-scope="{ node, data }" style="width: 100%">
+         <el-radio v-if="node.data.type === 0 || node.data.type === -1" style="margin-right: 0" v-model="chooseId" :label="node.data.id">{{''}}</el-radio>
+         <span v-if="node.data.type === -1 && node.level === 1" style="font-size: 12px" class="iconfont icon-ziyuan"></span>
+         <span v-if="node.data.type === 0 && node.level === 1" class="el-icon-s-home"></span>
+         <span v-if="node.data.type === 0 && node.level > 1"  class="el-icon-folder-opened"></span>
+         <span v-if="node.data.type === 1" class="iconfont icon-shexiangtou"></span>
+         <span v-if="node.data.type === 2" class="iconfont icon-zhibo"></span>
+        <span style=" padding-left: 1px">{{ node.label }}</span>
+        <span>
+          <i style="margin-left: 5rem; color: #9d9d9d; padding-right: 20px" v-if="node.data.id === defaultCatalogIdSign">榛樿</i>
+        </span>
+      </span>
+      </el-tree>
+    </div>
+    <div style="float: right; height: 13rem">
+      <el-button type="primary" size="mini" @click="submit()" >纭</el-button>
+      <el-button @click="close()" size="mini">鍙栨秷</el-button>
+    </div>
+  </el-dialog>
+
+</div>
+</template>
+
+
+<script>
+
+export default {
+    name: 'getCatalog',
+    beforeCreate(){
+
+    },
+    created() {
+        this.chooseId = this.defaultCatalogId;
+        this.defaultCatalogIdSign = this.defaultCatalogId;
+        this.initData();
+        setTimeout(()=>{
+          if (this.catalogIdChange)this.catalogIdChange(this.defaultCatalogId);
+        }, 100)
+
+    },
+    props: ['platformId'],
+    data() {
+        return {
+          props: {
+            label: 'name',
+            children: 'children',
+            isLeaf: 'leaf'
+          },
+          platformName: null,
+          defaultCatalogId: null,
+          catalogIdResult: null,
+          showDialog: false,
+          defaultCatalogIdSign: null,
+          chooseNode: null,
+          chooseId: "",
+          catalogTree: null,
+          contextmenuShow: false,
+
+        };
+    },
+    methods: {
+        openDialog(catalogIdResult) {
+          this.showDialog = true
+          this.catalogIdResult = catalogIdResult
+        },
+        initData: function () {
+            this.getCatalog();
+        },
+
+        getCatalog: function(parentId, callback) {
+            let that = this;
+            this.$axios({
+                    method:"get",
+                    url:`/api/platform/catalog`,
+                    params: {
+                        platformId: that.platformId,
+                        parentId: parentId
+                    }
+                })
+                .then((res)=> {
+                  if (res.data.code === 0) {
+                    if (typeof(callback) === 'function') {
+                      callback(res.data.data)
+                    }
+                  }
+                })
+                .catch(function (error) {
+                    console.log(error);
+                });
+
+        },
+        loadNode: function(node, resolve){
+
+
+
+          if (node.level === 0) {
+            this.$axios({
+              method:"get",
+              url:`/api/platform/info/` + this.platformId,
+            })
+              .then((res)=> {
+                if (res.data.code === 0) {
+                  this.platformName = res.data.data.name;
+                  this.defaultCatalogId = res.data.data.catalogId;
+                  resolve([
+                    {
+                      name: "鏈垎閰�",
+                      id:  null,
+                      type:  -1
+                    },{
+                      name: this.platformName,
+                      id:  this.platformId,
+                      type:  0
+                    }
+                  ]);
+                }
+              })
+              .catch(function (error) {
+                console.log(error);
+              });
+          }
+          if (node.level >= 1){
+            this.getCatalog(node.data.id, resolve)
+          }
+        },
+        nodeClickHandler: function (data, node, tree){
+         this.chooseId = data.id;
+        },
+        close: function() {
+          this.showDialog = false;
+        },
+        submit: function() {
+          if (this.catalogIdResult)this.catalogIdResult(this.chooseId)
+          this.showDialog = false;
+        },
+    }
+};
+</script>
+
+<style>
+#catalogTree{
+  display: inline-block;
+}
+</style>
diff --git a/web_src/static/css/iconfont.css b/web_src/static/css/iconfont.css
index b13982d..93259b0 100644
--- a/web_src/static/css/iconfont.css
+++ b/web_src/static/css/iconfont.css
@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 1291092 */
-  src: url('iconfont.woff2?t=1640922722742') format('woff2'),
-       url('iconfont.woff?t=1640922722742') format('woff'),
-       url('iconfont.ttf?t=1640922722742') format('truetype');
+  src: url('iconfont.woff2?t=1644809302709') format('woff2'),
+       url('iconfont.woff?t=1644809302709') format('woff'),
+       url('iconfont.ttf?t=1644809302709') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,14 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-ziyuan:before {
+  content: "\e7d5";
+}
+
+.icon-shexiangtou1:before {
+  content: "\e7d4";
+}
+
 .icon-wxbzhuye:before {
   content: "\e7d1";
 }
diff --git a/web_src/static/css/iconfont.woff2 b/web_src/static/css/iconfont.woff2
index 8b2d400..4db77e2 100644
--- a/web_src/static/css/iconfont.woff2
+++ b/web_src/static/css/iconfont.woff2
Binary files differ
diff --git a/web_src/static/favicon.ico b/web_src/static/favicon.ico
new file mode 100644
index 0000000..2d67268
--- /dev/null
+++ b/web_src/static/favicon.ico
Binary files differ

--
Gitblit v1.8.0