From 7d888274150e9415ae0fc16e67fefd1cdb4a69cc Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期四, 20 一月 2022 16:48:30 +0800
Subject: [PATCH] 处理服务重启或设备重新上线时的订阅,优化通道导入重复的处理

---
 src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java                      |   13 ++
 src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java                                |    6 +
 src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java                                 |    2 
 src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java                      |   73 +++++++++++++
 src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java                                   |   14 ++
 web_src/src/components/PushVideoList.vue                                                               |    2 
 web_src/src/components/dialog/jessibuca.vue                                                            |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java |    7 -
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java                |    2 
 web_src/src/components/dialog/importChannelShowErrorData.vue                                           |   64 ++++++++++++
 src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java                      |   22 ++++
 src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java                                              |    5 
 src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java            |    3 
 web_src/src/components/dialog/importChannel.vue                                                        |   44 ++++++++
 14 files changed, 234 insertions(+), 25 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java b/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
index 10dfc08..c9572ae 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
@@ -3,7 +3,6 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
-import org.springframework.scheduling.support.CronTrigger;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
@@ -40,4 +39,8 @@
         }
     }
 
+    public boolean contains(String key) {
+        return futureMap.get(key) != null;
+    }
+
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java b/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java
index 26b0a5c..da4e2ed 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java
@@ -1,7 +1,8 @@
 package com.genersoft.iot.vmp.conf.runner;
 
-import com.genersoft.iot.vmp.common.VideoManagerConstants;
 import com.genersoft.iot.vmp.conf.UserSetup;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
+import com.genersoft.iot.vmp.service.IDeviceService;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,6 +29,9 @@
     @Autowired
     private UserSetup userSetup;
 
+    @Autowired
+    private IDeviceService deviceService;
+
     @Override
     public void run(String... args) throws Exception {
         // 璇诲彇redis娌℃湁蹇冭烦淇℃伅鐨勫垯璁剧疆涓虹绾匡紝绛夋敹鍒颁笅娆″績璺宠缃负鍦ㄧ嚎
@@ -36,9 +40,15 @@
         List<String> onlineForAll = redisCatchStorage.getOnlineForAll();
         for (String deviceId : onlineForAll) {
             storager.online(deviceId);
+            Device device = redisCatchStorage.getDevice(deviceId);
+            if (device != null && device.getSubscribeCycleForCatalog() > 0) {
+                // 鏌ヨ鍦ㄧ嚎璁惧閭d簺寮�鍚簡璁㈤槄锛屼负璁惧寮�鍚畾鏃剁殑鐩綍璁㈤槄
+                deviceService.addCatalogSubscribe(device);
+            }
         }
         // 閲嶇疆cseq璁℃暟
         redisCatchStorage.resetAllCSEQ();
-        // TODO 鏌ヨ鍦ㄧ嚎璁惧閭d簺寮�鍚簡璁㈤槄锛屼负璁惧寮�鍚畾鏃剁殑鐩綍璁㈤槄
+
+
     }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java
index 5f0d14d..c0de8de 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java
@@ -35,6 +35,9 @@
 
 	@Autowired
 	private IVideoManagerStorager storager;
+
+	@Autowired
+	private IDeviceService deviceService;
 	
 	@Autowired
     private RedisUtil redis;
@@ -57,6 +60,7 @@
 			logger.debug("璁惧涓婄嚎浜嬩欢瑙﹀彂锛宒eviceId锛�" + event.getDevice().getDeviceId() + ",from:" + event.getFrom());
 		}
 		Device device = event.getDevice();
+		if (device == null) return;
 		String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetup.getServerId() + "_" + event.getDevice().getDeviceId();
 
 		switch (event.getFrom()) {
@@ -84,15 +88,18 @@
 		}
 
 		device.setOnline(1);
-		Device deviceInstore = storager.queryVideoDevice(device.getDeviceId());
-		if (deviceInstore != null && deviceInstore.getOnline() == 0) {
+		Device deviceInStore = storager.queryVideoDevice(device.getDeviceId());
+		if (deviceInStore != null && deviceInStore.getOnline() == 0) {
 			List<DeviceChannel> deviceChannelList = storager.queryOnlineChannelsByDeviceId(device.getDeviceId());
 			eventPublisher.catalogEventPublish(null, deviceChannelList, CatalogEvent.ON);
 		}
 		// 澶勭悊涓婄嚎鐩戝惉
 		storager.updateDevice(device);
 
-		// TODO 涓婄嚎娣诲姞璁㈤槄
+		// 涓婄嚎娣诲姞璁㈤槄
+		if (device.getSubscribeCycleForCatalog() > 0) {
+			deviceService.addCatalogSubscribe(device);
+		}
 
 	}
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java
index a3523fd..52442cc 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java
@@ -18,6 +18,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationListener;
 import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
 
 import java.util.*;
 
@@ -76,12 +77,12 @@
             }else if (event.getGbStreams() != null) {
                 if (platforms.size() > 0) {
                     for (GbStream gbStream : event.getGbStreams()) {
+                        if (gbStream == null || StringUtils.isEmpty(gbStream.getGbId())) continue;
                         List<ParentPlatform> parentPlatformsForGB = storager.queryPlatFormListForStreamWithGBId(gbStream.getApp(),gbStream.getStream(), platforms);
                         parentPlatformMap.put(gbStream.getGbId(), parentPlatformsForGB);
                     }
                 }
             }
-
         }
         switch (event.getType()) {
             case CatalogEvent.ON:
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
index 48c4939..ac77f7b 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
@@ -41,6 +41,8 @@
 
 	public static final String CALLBACK_CMD_STOP = "CALLBACK_STOP";
 
+	public static final String UPLOAD_FILE_CHANNEL = "UPLOAD_FILE_CHANNEL";
+
 	public static final String CALLBACK_CMD_MOBILEPOSITION = "CALLBACK_MOBILEPOSITION";
 
 	public static final String CALLBACK_CMD_PRESETQUERY = "CALLBACK_PRESETQUERY";
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java
index 13335d6..8d0bdd2 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java
@@ -80,17 +80,14 @@
 			Element rootElement = getRootElement(evt);
 			String cmd = XmlUtil.getText(rootElement, "CmdType");
 			if (CmdType.MOBILE_POSITION.equals(cmd)) {
-				logger.info("鎺ユ敹鍒癕obilePosition璁㈤槄");
 				processNotifyMobilePosition(evt, rootElement);
 //			} else if (CmdType.ALARM.equals(cmd)) {
 //				logger.info("鎺ユ敹鍒癆larm璁㈤槄");
 //				processNotifyAlarm(evt, rootElement);
 			} else if (CmdType.CATALOG.equals(cmd)) {
-				logger.info("鎺ユ敹鍒癈atalog璁㈤槄");
 				processNotifyCatalogList(evt, rootElement);
 			} else {
 				logger.info("鎺ユ敹鍒版秷鎭細" + cmd);
-//				responseAck(evt, Response.OK);
 
 				Response response = null;
 				response = getMessageFactory().createResponse(200, request);
@@ -132,7 +129,7 @@
 		SubscribeInfo subscribeInfo = new SubscribeInfo(evt, platformId);
 		String sn = XmlUtil.getText(rootElement, "SN");
 		String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetup.getServerId() +  "_MobilePosition_" + platformId;
-
+		logger.info("鎺ユ敹鍒皗}鐨凪obilePosition璁㈤槄", platformId);
 		StringBuilder resultXml = new StringBuilder(200);
 		resultXml.append("<?xml version=\"1.0\" ?>\r\n")
 				.append("<Response>\r\n")
@@ -182,7 +179,7 @@
 		SubscribeInfo subscribeInfo = new SubscribeInfo(evt, platformId);
 		String sn = XmlUtil.getText(rootElement, "SN");
 		String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetup.getServerId() +  "_Catalog_" + platformId;
-
+		logger.info("鎺ユ敹鍒皗}鐨凜atalog璁㈤槄", platformId);
 		StringBuilder resultXml = new StringBuilder(200);
 		resultXml.append("<?xml version=\"1.0\" ?>\r\n")
 				.append("<Response>\r\n")
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
index 1159484..66407a1 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
@@ -30,11 +30,15 @@
         if (device == null || device.getSubscribeCycleForCatalog() < 0) {
             return false;
         }
+        if (dynamicTask.contains(device.getDeviceId())) {
+            logger.info("[娣诲姞鐩綍璁㈤槄] 璁惧{}鐨勭洰褰曡闃呬互瀛樺湪", device.getDeviceId());
+            return false;
+        }
+        logger.info("[娣诲姞鐩綍璁㈤槄] 璁惧{}", device.getDeviceId());
         // 娣诲姞鐩綍璁㈤槄
         CatalogSubscribeTask catalogSubscribeTask = new CatalogSubscribeTask(device, sipCommander);
         catalogSubscribeTask.run();
         // 鎻愬墠寮�濮嬪埛鏂拌闃�
-        // TODO 浣跨敤jain sip鐨勫綋鏃跺埛鏂拌闃�
         int subscribeCycleForCatalog = device.getSubscribeCycleForCatalog();
         // 璁剧疆鏈�灏忓�间负30
         subscribeCycleForCatalog = Math.max(subscribeCycleForCatalog, 30);
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java
index a68f5e9..16924df 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java
@@ -14,15 +14,23 @@
 
 public class StreamPushUploadFileHandler extends AnalysisEventListener<StreamPushExcelDto> {
 
+    private ErrorDataHandler errorDataHandler;
     private IStreamPushService pushService;
     private String defaultMediaServerId;
     private List<StreamPushItem> streamPushItems = new ArrayList<>();
     private Set<String> streamPushStreamSet = new HashSet<>();
     private Set<String> streamPushGBSet = new HashSet<>();
+    private List<String> errorStreamList = new ArrayList<>();
+    private List<String> errorGBList = new ArrayList<>();
 
-    public StreamPushUploadFileHandler(IStreamPushService pushService, String defaultMediaServerId) {
+    public StreamPushUploadFileHandler(IStreamPushService pushService, String defaultMediaServerId, ErrorDataHandler errorDataHandler) {
         this.pushService = pushService;
         this.defaultMediaServerId = defaultMediaServerId;
+        this.errorDataHandler = errorDataHandler;
+    }
+
+    public interface ErrorDataHandler{
+        void handle(List<String> streams, List<String> gbId);
     }
 
     @Override
@@ -32,9 +40,16 @@
                 || StringUtils.isEmpty(streamPushExcelDto.getGbId())) {
             return;
         }
+        if (streamPushGBSet.contains(streamPushExcelDto.getGbId())) {
+            errorGBList.add(streamPushExcelDto.getGbId());
+        }
+        if (streamPushStreamSet.contains(streamPushExcelDto.getApp() + streamPushExcelDto.getStream())) {
+            errorStreamList.add(streamPushExcelDto.getApp() + "/" + streamPushExcelDto.getStream());
+        }
         if (streamPushGBSet.contains(streamPushExcelDto.getGbId()) || streamPushStreamSet.contains(streamPushExcelDto.getApp() + streamPushExcelDto.getStream())) {
             return;
         }
+
         StreamPushItem streamPushItem = new StreamPushItem();
         streamPushItem.setApp(streamPushExcelDto.getApp());
         streamPushItem.setStream(streamPushExcelDto.getStream());
@@ -60,8 +75,11 @@
     @Override
     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
         // 杩欓噷涔熻淇濆瓨鏁版嵁锛岀‘淇濇渶鍚庨仐鐣欑殑鏁版嵁涔熷瓨鍌ㄥ埌鏁版嵁搴�
-        pushService.batchAdd(streamPushItems);
+        if (streamPushItems.size() > 0) {
+            pushService.batchAdd(streamPushItems);
+        }
         streamPushGBSet.clear();
         streamPushStreamSet.clear();
+        errorDataHandler.handle(errorStreamList, errorGBList);
     }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java
index 8a99d62..9a5d3be 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java
@@ -50,7 +50,7 @@
     StreamPushItem selectOne(String app, String stream);
 
     @Insert("<script>"  +
-            "INSERT INTO stream_push (app, stream, totalReaderCount, originType, originTypeStr, " +
+            "REPLACE INTO stream_push (app, stream, totalReaderCount, originType, originTypeStr, " +
             "createStamp, aliveSecond, mediaServerId) " +
             "VALUES <foreach collection='streamPushItems' item='item' index='index' separator=','>" +
             "( '${item.app}', '${item.stream}', '${item.totalReaderCount}', '${item.originType}', " +
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 0c80d11..c0fafd3 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
@@ -4,11 +4,14 @@
 import com.alibaba.excel.ExcelReader;
 import com.alibaba.excel.read.metadata.ReadSheet;
 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
+import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
+import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
 import com.genersoft.iot.vmp.service.IMediaServerService;
 import com.genersoft.iot.vmp.service.IStreamPushService;
 import com.genersoft.iot.vmp.service.impl.StreamPushUploadFileHandler;
 import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto;
+import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -18,12 +21,19 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.context.request.async.DeferredResult;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
 
 @Api(tags = "鎺ㄦ祦淇℃伅绠$悊")
 @Controller
@@ -38,6 +48,9 @@
 
     @Autowired
     private IMediaServerService mediaServerService;
+
+    @Autowired
+    private DeferredResultHolder resultHolder;
 
     @ApiOperation("鎺ㄦ祦鍒楄〃鏌ヨ")
     @ApiImplicitParams({
@@ -103,10 +116,44 @@
     }
     @PostMapping(value = "upload")
     @ResponseBody
-    public String uploadChannelFile(@RequestParam(value = "file") MultipartFile file){
+    public DeferredResult<ResponseEntity<WVPResult<Object>>> uploadChannelFile(@RequestParam(value = "file") MultipartFile file){
+
+
+        // 鏈�澶氬鐞嗘枃浠朵竴涓皬鏃�
+        DeferredResult<ResponseEntity<WVPResult<Object>>> result = new DeferredResult<>(60*60*1000L);
+        // 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ
+        String key = DeferredResultHolder.UPLOAD_FILE_CHANNEL;
+        String uuid = UUID.randomUUID().toString();
+
         if (file.isEmpty()) {
-            return "fail";
+            logger.warn("閫氶亾瀵煎叆鏂囦欢涓虹┖");
+            WVPResult<Object> wvpResult = new WVPResult<>();
+            wvpResult.setCode(-1);
+            wvpResult.setMsg("鏂囦欢涓虹┖");
+            result.setResult(ResponseEntity.status(HttpStatus.BAD_REQUEST).body(wvpResult));
+            return result;
         }
+        // 鍚屾椂鍙鐞嗕竴涓枃浠�
+        if (resultHolder.exist(key, null)) {
+            logger.warn("宸叉湁瀵煎叆浠诲姟姝e湪鎵ц");
+            WVPResult<Object> wvpResult = new WVPResult<>();
+            wvpResult.setCode(-1);
+            wvpResult.setMsg("宸叉湁瀵煎叆浠诲姟姝e湪鎵ц");
+            result.setResult(ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body(wvpResult));
+            return result;
+        }
+
+        resultHolder.put(key, uuid, result);
+        result.onTimeout(()->{
+            logger.warn("閫氶亾瀵煎叆瓒呮椂锛屽彲鑳芥枃浠惰繃澶�");
+            RequestMessage msg = new RequestMessage();
+            msg.setKey(key);
+            WVPResult<Object> wvpResult = new WVPResult<>();
+            wvpResult.setCode(-1);
+            wvpResult.setMsg("瀵煎叆瓒呮椂锛屽彲鑳芥枃浠惰繃澶�");
+            msg.setData(wvpResult);
+            resultHolder.invokeAllResult(msg);
+        });
         //鑾峰彇鏂囦欢娴�
         InputStream inputStream = null;
         try {
@@ -117,11 +164,29 @@
         }
         //浼犲叆鍙傛暟
         ExcelReader excelReader = EasyExcel.read(inputStream, StreamPushExcelDto.class,
-                new StreamPushUploadFileHandler(streamPushService, mediaServerService.getDefaultMediaServer().getId())).build();
+                new StreamPushUploadFileHandler(streamPushService, mediaServerService.getDefaultMediaServer().getId(), (errorStreams, errorGBs)->{
+                    logger.info("閫氶亾瀵煎叆鎴愬姛锛屽瓨鍦ㄩ噸澶岮pp+Stream涓簕}涓紝瀛樺湪鍥芥爣ID涓簕}涓�", errorStreams.size(), errorGBs.size());
+                    RequestMessage msg = new RequestMessage();
+                    msg.setKey(key);
+                    WVPResult<Map<String, List<String>>> wvpResult = new WVPResult<>();
+                    if (errorStreams.size() == 0 && errorGBs.size() == 0) {
+                        wvpResult.setCode(0);
+                        wvpResult.setMsg("鎴愬姛");
+                    }else {
+                        wvpResult.setCode(1);
+                        wvpResult.setMsg("瀵煎叆鎴愬姛銆備絾鏄瓨鍦ㄩ噸澶嶆暟鎹�");
+                        Map<String, List<String>> errorData = new HashMap<>();
+                        errorData.put("gbId", errorGBs);
+                        errorData.put("stream", errorStreams);
+                        wvpResult.setData(errorData);
+                    }
+                    msg.setData(wvpResult);
+                    resultHolder.invokeAllResult(msg);
+        })).build();
         ReadSheet readSheet = EasyExcel.readSheet(0).build();
         excelReader.read(readSheet);
         excelReader.finish();
-        return "success";
+        return result;
     }
 
 
diff --git a/web_src/src/components/PushVideoList.vue b/web_src/src/components/PushVideoList.vue
index b519fb4..44372df 100644
--- a/web_src/src/components/PushVideoList.vue
+++ b/web_src/src/components/PushVideoList.vue
@@ -127,8 +127,6 @@
 						count: that.count
 					}
 				}).then(function (res) {
-					console.log(res);
-					console.log(res.data.list);
 					that.total = res.data.total;
 					that.pushList = res.data.list;
 					that.getDeviceListLoading = false;
diff --git a/web_src/src/components/dialog/importChannel.vue b/web_src/src/components/dialog/importChannel.vue
index ac5ce05..922809e 100644
--- a/web_src/src/components/dialog/importChannel.vue
+++ b/web_src/src/components/dialog/importChannel.vue
@@ -16,6 +16,8 @@
           drag
           :action="uploadUrl"
           name="file"
+          :on-success="successHook"
+          :on-error="errorHook"
           >
           <i class="el-icon-upload"></i>
           <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
@@ -23,14 +25,19 @@
         </el-upload>
       </div>
     </el-dialog>
+    <ShowErrorData ref="showErrorData" :gbIds="errorGBIds" :streams="errorStreams" ></ShowErrorData>
   </div>
 </template>
 
 <script>
 
+import ShowErrorData from './importChannelShowErrorData.vue'
+
 export default {
   name: "importChannel",
-  computed: {},
+  components: {
+    ShowErrorData,
+  },
   created() {},
   data() {
     return {
@@ -38,6 +45,8 @@
       showDialog: false,
       isLoging: false,
       isEdit: false,
+      errorStreams: null,
+      errorGBIds: null,
       uploadUrl: process.env.NODE_ENV === 'development'?`debug/api/push/upload`:`api/push/upload`,
     };
   },
@@ -73,8 +82,35 @@
     },
     close: function () {
       this.showDialog = false;
-      this.$refs.form.resetFields();
     },
+    successHook: function(response, file, fileList){
+      if (response.code === 0) {
+        this.$message({
+          showClose: true,
+          message: response.msg,
+          type: "success",
+        });
+      }else if (response.code === 1) {
+        this.errorGBIds = response.data.gbId
+        this.errorStreams = response.data.stream
+        console.log(this.$refs)
+        console.log(this.$refs.showErrorData)
+        this.$refs.showErrorData.openDialog()
+      }else {
+        this.$message({
+          showClose: true,
+          message: response.msg,
+          type: "error",
+        });
+      }
+    },
+    errorHook: function (err, file, fileList) {
+      this.$message({
+        showClose: true,
+        message: err,
+        type: "error",
+      });
+    }
   },
 };
 </script>
@@ -82,4 +118,8 @@
 .upload-box{
   text-align: center;
 }
+.errDataBox{
+  max-height: 15rem;
+  overflow: auto;
+}
 </style>
diff --git a/web_src/src/components/dialog/importChannelShowErrorData.vue b/web_src/src/components/dialog/importChannelShowErrorData.vue
new file mode 100644
index 0000000..5194b7e
--- /dev/null
+++ b/web_src/src/components/dialog/importChannelShowErrorData.vue
@@ -0,0 +1,64 @@
+<template>
+  <div id="importChannelShowErrorData" v-loading="isLoging">
+    <el-dialog
+      title="瀵煎叆閫氶亾鏁版嵁鎴愬姛锛屼絾鏁版嵁瀛樺湪閲嶅"
+      width="30rem"
+      top="2rem"
+      :append-to-body="true"
+      :close-on-click-modal="false"
+      :visible.sync="showDialog"
+      :destroy-on-close="true"
+      @close="close()"
+    >
+      <div >
+        閲嶅鍥芥爣ID:
+        <el-button style="float: right;" type="primary" size="mini" icon="el-icon-document-copy"  title="鐐瑰嚮鎷疯礉" v-clipboard="gbIds.join(',')" @success="$message({type:'success', message:'鎴愬姛鎷疯礉鍒扮矘璐存澘'})">澶嶅埗</el-button>
+        <ul class="errDataBox">
+          <li v-for="id in gbIds" >
+            {{ id }}
+          </li>
+        </ul>
+      </div>
+
+      <div >
+        閲嶅App/stream:
+        <el-button style="float: right;" type="primary" size="mini" icon="el-icon-document-copy"  title="鐐瑰嚮鎷疯礉" v-clipboard="streams.join(',')" @success="$message({type:'success', message:'鎴愬姛鎷疯礉鍒扮矘璐存澘'})">澶嶅埗</el-button>
+        <ul class="errDataBox">
+          <li v-for="id in streams" >
+            {{ id }}
+          </li>
+        </ul>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: "importChannelShowErrorData",
+  computed: {},
+  created() {},
+  props: ['gbIds', 'streams'],
+  data() {
+    return {
+      isLoging: false,
+      showDialog: false,
+    };
+  },
+  methods: {
+    openDialog: function () {
+      this.showDialog = true;
+    },
+    close: function () {
+      this.showDialog = false;
+    },
+  },
+};
+</script>
+<style>
+.errDataBox{
+  max-height: 15rem;
+  overflow: auto;
+}
+</style>
diff --git a/web_src/src/components/dialog/jessibuca.vue b/web_src/src/components/dialog/jessibuca.vue
index 7e9e009..c073719 100644
--- a/web_src/src/components/dialog/jessibuca.vue
+++ b/web_src/src/components/dialog/jessibuca.vue
@@ -78,7 +78,7 @@
           this.jessibuca = new window.Jessibuca(Object.assign(
             {
               container: this.$refs.container,
-              videoBuffer: 0.5, // 鏈�澶х紦鍐叉椂闀匡紝鍗曚綅绉�
+              videoBuffer: 0.2, // 鏈�澶х紦鍐叉椂闀匡紝鍗曚綅绉�
               isResize: true,
               isFlv: true,
               decoder: "./static/js/jessibuca/index.js",

--
Gitblit v1.8.0