From 3955e6ed53d450f8faf488d4b74ba0c0c83c5aaa Mon Sep 17 00:00:00 2001
From: 648540858 <456panlinlin>
Date: 星期二, 12 四月 2022 21:06:21 +0800
Subject: [PATCH] 异步通道刷新,优化ui效果

---
 src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java                                               |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java       |   34 +-
 web_src/src/components/DeviceList.vue                                                                                           |   45 ++-
 src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java                                                         |   24 ++
 src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java                                                       |   66 ++++-
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java                                                 |   48 ++--
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java                                                    |   75 +++---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java     |   24 -
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java |   20 +
 src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java                                                           |    4 
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java                                                               |   22 +
 src/main/java/com/genersoft/iot/vmp/service/IDeviceService.java                                                                 |   21 +
 src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java                                                  |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java                    |   13 +
 web_src/src/components/dialog/SyncChannelProgress.vue                                                                           |  102 ++++++++
 src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java                                                    |    1 
 src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java                                                            |    1 
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/SyncStatus.java                                                                |   34 ++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java                                      |  124 ++++++---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java                                          |    1 
 20 files changed, 492 insertions(+), 171 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
index c4d49a8..e1d7c49 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -22,6 +22,9 @@
 
 	public static final String DEVICE_PREFIX = "VMP_DEVICE_";
 
+	// 璁惧鍚屾瀹屾垚
+	public static final String DEVICE_SYNC_PREFIX = "VMP_DEVICE_SYNC_";
+
 	public static final String CACHEKEY_PREFIX = "VMP_CHANNEL_";
 
 	public static final String KEEPLIVEKEY_PREFIX = "VMP_KEEPALIVE_";
@@ -69,6 +72,7 @@
 
 	public static final String SYSTEM_INFO_NET_PREFIX = "VMP_SYSTEM_INFO_NET_";
 
+
 	//************************** redis 娑堟伅*********************************
 
 	// 娴佸彉鍖栫殑閫氱煡
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java
index c74fb87..40f676e 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java
@@ -8,6 +8,12 @@
     private List<DeviceChannel> channelList;
     private Date lastTime;
     private Device device;
+    private String errorMsg;
+
+    public enum CatalogDataStatus{
+        ready, runIng, end
+    }
+    private CatalogDataStatus status;
 
     public int getTotal() {
         return total;
@@ -40,4 +46,20 @@
     public void setDevice(Device device) {
         this.device = device;
     }
+
+    public String getErrorMsg() {
+        return errorMsg;
+    }
+
+    public void setErrorMsg(String errorMsg) {
+        this.errorMsg = errorMsg;
+    }
+
+    public CatalogDataStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(CatalogDataStatus status) {
+        this.status = status;
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SyncStatus.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SyncStatus.java
new file mode 100644
index 0000000..2ae50e6
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SyncStatus.java
@@ -0,0 +1,34 @@
+package com.genersoft.iot.vmp.gb28181.bean;
+
+/**
+ * 鎽勫儚鏈哄悓姝ョ姸鎬�
+ */
+public class SyncStatus {
+    private int total;
+    private int current;
+    private String errorMsg;
+
+    public int getTotal() {
+        return total;
+    }
+
+    public void setTotal(int total) {
+        this.total = total;
+    }
+
+    public int getCurrent() {
+        return current;
+    }
+
+    public void setCurrent(int current) {
+        this.current = current;
+    }
+
+    public String getErrorMsg() {
+        return errorMsg;
+    }
+
+    public void setErrorMsg(String errorMsg) {
+        this.errorMsg = errorMsg;
+    }
+}
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 755967b..fc9eb27 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
@@ -97,8 +97,6 @@
 		}
 		// 澶勭悊涓婄嚎鐩戝惉
 		storager.updateDevice(device);
-		List<DeviceChannel> deviceChannelList = storager.queryOnlineChannelsByDeviceId(device.getDeviceId());
-		eventPublisher.catalogEventPublish(null, deviceChannelList, CatalogEvent.ON);
 		// 涓婄嚎娣诲姞璁㈤槄
 		if (device.getSubscribeCycleForCatalog() > 0) {
 			deviceService.addCatalogSubscribe(device);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java
index 199f826..fbc2a32 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java
@@ -3,6 +3,7 @@
 import com.genersoft.iot.vmp.gb28181.bean.CatalogData;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
+import com.genersoft.iot.vmp.gb28181.bean.SyncStatus;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
@@ -25,6 +26,17 @@
     @Autowired
     private IVideoManagerStorage storager;
 
+    public void addReady(String key) {
+        CatalogData catalogData = data.get(key);
+        if (catalogData == null || catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end)) {
+            catalogData = new CatalogData();
+            catalogData.setChannelList(new ArrayList<>());
+            catalogData.setStatus(CatalogData.CatalogDataStatus.ready);
+            catalogData.setLastTime(new Date(System.currentTimeMillis()));
+            data.put(key, catalogData);
+        }
+    }
+
     public void put(String key, int total, Device device, List<DeviceChannel> deviceChannelList) {
         CatalogData catalogData = data.get(key);
         if (catalogData == null) {
@@ -32,10 +44,16 @@
             catalogData.setTotal(total);
             catalogData.setDevice(device);
             catalogData.setChannelList(new ArrayList<>());
+            catalogData.setStatus(CatalogData.CatalogDataStatus.runIng);
+            catalogData.setLastTime(new Date(System.currentTimeMillis()));
             data.put(key, catalogData);
+        }else {
+            catalogData.setTotal(total);
+            catalogData.setDevice(device);
+            catalogData.setStatus(CatalogData.CatalogDataStatus.runIng);
+            catalogData.getChannelList().addAll(deviceChannelList);
+            catalogData.setLastTime(new Date(System.currentTimeMillis()));
         }
-        catalogData.getChannelList().addAll(deviceChannelList);
-        catalogData.setLastTime(new Date(System.currentTimeMillis()));
     }
 
     public List<DeviceChannel> get(String key) {
@@ -50,6 +68,16 @@
         return catalogData.getTotal();
     }
 
+    public SyncStatus getSyncStatus(String key) {
+        CatalogData catalogData = data.get(key);
+        if (catalogData == null) return null;
+        SyncStatus syncStatus = new SyncStatus();
+        syncStatus.setCurrent(catalogData.getChannelList().size());
+        syncStatus.setTotal(catalogData.getTotal());
+        syncStatus.setErrorMsg(catalogData.getErrorMsg());
+        return syncStatus;
+    }
+
     public void del(String key) {
         data.remove(key);
     }
@@ -57,24 +85,32 @@
     @Scheduled(fixedRate = 5 * 1000)   //姣�5绉掓墽琛屼竴娆�, 鍙戠幇鏁版嵁5绉掓湭鏇存柊鍒欑Щ闄ゆ暟鎹苟璁や负鏁版嵁鎺ユ敹瓒呮椂
     private void timerTask(){
         Set<String> keys = data.keySet();
-        Calendar calendar = Calendar.getInstance();
-        calendar.setTime(new Date());
-        calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 5);
+        Calendar calendarBefore5S = Calendar.getInstance();
+        calendarBefore5S.setTime(new Date());
+        calendarBefore5S.set(Calendar.SECOND, calendarBefore5S.get(Calendar.SECOND) - 5);
+
+        Calendar calendarBefore30S = Calendar.getInstance();
+        calendarBefore30S.setTime(new Date());
+        calendarBefore30S.set(Calendar.SECOND, calendarBefore30S.get(Calendar.SECOND) - 30);
         for (String key : keys) {
             CatalogData catalogData = data.get(key);
-            if (catalogData.getLastTime().before(calendar.getTime())) {
-
+            if (catalogData.getLastTime().before(calendarBefore5S.getTime())) { // 瓒呰繃浜旂鏀朵笉鍒版秷鎭换鍔¤秴鏃讹紝 鍙洿鏂拌繖涓�閮ㄥ垎鏁版嵁
                 storager.resetChannels(catalogData.getDevice().getDeviceId(), catalogData.getChannelList());
-                RequestMessage msg = new RequestMessage();
-                msg.setKey(key);
-                WVPResult<Object> result = new WVPResult<>();
-                result.setCode(0);
-                result.setMsg("鏇存柊鎴愬姛锛屽叡" + catalogData.getTotal() + "鏉★紝宸叉洿鏂�" + catalogData.getChannelList().size() + "鏉�");
-                result.setData(catalogData.getDevice());
-                msg.setData(result);
-                deferredResultHolder.invokeAllResult(msg);
+                String errorMsg = "鏇存柊鎴愬姛锛屽叡" + catalogData.getTotal() + "鏉★紝宸叉洿鏂�" + catalogData.getChannelList().size() + "鏉�";
+                catalogData.setStatus(CatalogData.CatalogDataStatus.end);
+                catalogData.setErrorMsg(errorMsg);
+            }
+            if (catalogData.getLastTime().before(calendarBefore30S.getTime())) { // 瓒呰繃涓夊崄绉掞紝濡傛灉鏍囪涓篹nd鍒欏垹闄�
                 data.remove(key);
             }
         }
     }
+
+
+    public void setChannelSyncEnd(String key, String errorMsg) {
+        CatalogData catalogData = data.get(key);
+        if (catalogData == null)return;
+        catalogData.setStatus(CatalogData.CatalogDataStatus.end);
+        catalogData.setErrorMsg(errorMsg);
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java
index 1f58a15..a900819 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java
@@ -46,6 +46,7 @@
      * @return
      */
     boolean catalogQuery(DeviceChannel channel, ParentPlatform parentPlatform, String sn, String fromTag, int size);
+    boolean catalogQuery(List<DeviceChannel> channels, ParentPlatform parentPlatform, String sn, String fromTag);
 
     /**
      * 鍚戜笂绾у洖澶岲eviceInfo鏌ヨ淇℃伅
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
index 299799f..123d0e7 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -235,7 +235,7 @@
 			String cmdStr= cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed);
 			StringBuffer ptzXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			ptzXml.append("<Control>\r\n");
 			ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n");
 			ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -278,7 +278,7 @@
 			logger.debug("鎺у埗瀛楃涓诧細" + cmdStr);
 			StringBuffer ptzXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			ptzXml.append("<Control>\r\n");
 			ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n");
 			ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -314,7 +314,7 @@
 		try {
 			StringBuffer ptzXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			ptzXml.append("<Control>\r\n");
 			ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n");
 			ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -778,7 +778,7 @@
 		try {
 			StringBuffer broadcastXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			broadcastXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			broadcastXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			broadcastXml.append("<Notify>\r\n");
 			broadcastXml.append("<CmdType>Broadcast</CmdType>\r\n");
 			broadcastXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -804,7 +804,7 @@
 		try {
 			StringBuffer broadcastXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			broadcastXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			broadcastXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			broadcastXml.append("<Notify>\r\n");
 			broadcastXml.append("<CmdType>Broadcast</CmdType>\r\n");
 			broadcastXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -837,7 +837,7 @@
 		try {
 			StringBuffer cmdXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			cmdXml.append("<Control>\r\n");
 			cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
 			cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -873,7 +873,7 @@
 		try {
 			StringBuffer cmdXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			cmdXml.append("<Control>\r\n");
 			cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
 			cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -906,7 +906,7 @@
 		try {
 			StringBuffer cmdXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			cmdXml.append("<Control>\r\n");
 			cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
 			cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -938,7 +938,7 @@
 		try {
 			StringBuffer cmdXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			cmdXml.append("<Control>\r\n");
 			cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
 			cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -983,7 +983,7 @@
 		try {
 			StringBuffer cmdXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			cmdXml.append("<Control>\r\n");
 			cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
 			cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1022,7 +1022,7 @@
 		try {
 			StringBuffer cmdXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			cmdXml.append("<Control>\r\n");
 			cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
 			cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1091,7 +1091,7 @@
 		try {
 			StringBuffer cmdXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			cmdXml.append("<Control>\r\n");
 			cmdXml.append("<CmdType>DeviceConfig</CmdType>\r\n");
 			cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1146,7 +1146,7 @@
 		try {
 			String charset = device.getCharset();
 			StringBuffer catalogXml = new StringBuffer(200);
-			catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			catalogXml.append("<Query>\r\n");
 			catalogXml.append("<CmdType>DeviceStatus</CmdType>\r\n");
 			catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1179,7 +1179,7 @@
 		try {
 			StringBuffer catalogXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			catalogXml.append("<Query>\r\n");
 			catalogXml.append("<CmdType>DeviceInfo</CmdType>\r\n");
 			catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1212,7 +1212,7 @@
 		try {
 			StringBuffer catalogXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			catalogXml.append("<Query>\r\n");
 			catalogXml.append("<CmdType>Catalog</CmdType>\r\n");
 			catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1252,7 +1252,7 @@
 		try {
 			StringBuffer recordInfoXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			recordInfoXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			recordInfoXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			recordInfoXml.append("<Query>\r\n");
 			recordInfoXml.append("<CmdType>RecordInfo</CmdType>\r\n");
 			recordInfoXml.append("<SN>" + sn + "</SN>\r\n");
@@ -1306,7 +1306,7 @@
 		try {
 			StringBuffer cmdXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			cmdXml.append("<Query>\r\n");
 			cmdXml.append("<CmdType>Alarm</CmdType>\r\n");
 			cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1357,7 +1357,7 @@
 		try {
 			StringBuffer cmdXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			cmdXml.append("<Query>\r\n");
 			cmdXml.append("<CmdType>ConfigDownload</CmdType>\r\n");
 			cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1393,7 +1393,7 @@
 		try {
 			StringBuffer cmdXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			cmdXml.append("<Query>\r\n");
 			cmdXml.append("<CmdType>PresetQuery</CmdType>\r\n");
 			cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1428,7 +1428,7 @@
 		try {
 			StringBuffer mobilePostitionXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			mobilePostitionXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			mobilePostitionXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			mobilePostitionXml.append("<Query>\r\n");
 			mobilePostitionXml.append("<CmdType>MobilePosition</CmdType>\r\n");
 			mobilePostitionXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1462,7 +1462,7 @@
 		try {
 			StringBuffer subscribePostitionXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			subscribePostitionXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			subscribePostitionXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			subscribePostitionXml.append("<Query>\r\n");
 			subscribePostitionXml.append("<CmdType>MobilePosition</CmdType>\r\n");
 			subscribePostitionXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1513,7 +1513,7 @@
 		try {
 			StringBuffer cmdXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			cmdXml.append("<Query>\r\n");
 			cmdXml.append("<CmdType>Alarm</CmdType>\r\n");
 			cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1559,7 +1559,7 @@
 		try {
 			StringBuffer cmdXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			cmdXml.append("<Query>\r\n");
 			cmdXml.append("<CmdType>Catalog</CmdType>\r\n");
 			cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1590,7 +1590,7 @@
 		try {
 			StringBuffer dragXml = new StringBuffer(200);
 			String charset = device.getCharset();
-			dragXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n");
+			dragXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
 			dragXml.append("<Control>\r\n");
 			dragXml.append("<CmdType>DeviceControl</CmdType>\r\n");
 			dragXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n");
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
index 102aff8..0dc11e0 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
@@ -147,7 +147,7 @@
         try {
             String characterSet = parentPlatform.getCharacterSet();
             StringBuffer keepaliveXml = new StringBuffer(200);
-            keepaliveXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n");
+            keepaliveXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
             keepaliveXml.append("<Notify>\r\n");
             keepaliveXml.append("<CmdType>Keepalive</CmdType>\r\n");
             keepaliveXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -215,44 +215,7 @@
             return false;
         }
         try {
-            String characterSet = parentPlatform.getCharacterSet();
-            StringBuffer catalogXml = new StringBuffer(600);
-            catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet +"\" ?>\r\n");
-            catalogXml.append("<Response>\r\n");
-            catalogXml.append("<CmdType>Catalog</CmdType>\r\n");
-            catalogXml.append("<SN>" +sn + "</SN>\r\n");
-            catalogXml.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n");
-            catalogXml.append("<SumNum>" + size + "</SumNum>\r\n");
-            catalogXml.append("<DeviceList Num=\"1\">\r\n");
-            catalogXml.append("<Item>\r\n");
-            if (channel != null) {
-                catalogXml.append("<DeviceID>" + channel.getChannelId() + "</DeviceID>\r\n");
-                catalogXml.append("<Name>" + channel.getName() + "</Name>\r\n");
-                catalogXml.append("<Manufacturer>" + channel.getManufacture() + "</Manufacturer>\r\n");
-                catalogXml.append("<Model>" + channel.getModel() + "</Model>\r\n");
-                catalogXml.append("<Owner>" + channel.getOwner() + "</Owner>\r\n");
-                catalogXml.append("<CivilCode>" + channel.getCivilCode() + "</CivilCode>\r\n");
-                catalogXml.append("<Address>" + channel.getAddress() + "</Address>\r\n");
-                catalogXml.append("<Parental>" + channel.getParental() + "</Parental>\r\n");
-                if (channel.getParentId() != null) {
-                    catalogXml.append("<ParentID>" + channel.getParentId() + "</ParentID>\r\n");
-                }
-                catalogXml.append("<Secrecy>" + channel.getSecrecy() + "</Secrecy>\r\n");
-                catalogXml.append("<RegisterWay>" + channel.getRegisterWay() + "</RegisterWay>\r\n");
-                catalogXml.append("<Status>" + (channel.getStatus() == 0?"OFF":"ON") + "</Status>\r\n");
-                catalogXml.append("<Longitude>" + channel.getLongitude() + "</Longitude>\r\n");
-                catalogXml.append("<Latitude>" + channel.getLatitude() + "</Latitude>\r\n");
-                catalogXml.append("<IPAddress>" + channel.getIpAddress() + "</IPAddress>\r\n");
-                catalogXml.append("<Port>" + channel.getPort() + "</Port>\r\n");
-                catalogXml.append("<Info>\r\n");
-                catalogXml.append("<PTZType>" + channel.getPTZType() + "</PTZType>\r\n");
-                catalogXml.append("</Info>\r\n");
-            }
-
-
-            catalogXml.append("</Item>\r\n");
-            catalogXml.append("</DeviceList>\r\n");
-            catalogXml.append("</Response>\r\n");
+            String catalogXml = getCatalogXml(channel, sn, parentPlatform, size);
 
             // callid
             CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
@@ -266,6 +229,77 @@
             return false;
         }
         return true;
+    }
+
+    @Override
+    public boolean catalogQuery(List<DeviceChannel> channels, ParentPlatform parentPlatform, String sn, String fromTag) {
+        if ( parentPlatform ==null) {
+            return false;
+        }
+        sendCatalogResponse(channels, parentPlatform, sn, fromTag, 0);
+        return true;
+    }
+    private String getCatalogXml(DeviceChannel channel, String sn, ParentPlatform parentPlatform, int size) {
+        String characterSet = parentPlatform.getCharacterSet();
+        StringBuffer catalogXml = new StringBuffer(600);
+        catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet +"\"?>\r\n");
+        catalogXml.append("<Response>\r\n");
+        catalogXml.append("<CmdType>Catalog</CmdType>\r\n");
+        catalogXml.append("<SN>" +sn + "</SN>\r\n");
+        catalogXml.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n");
+        catalogXml.append("<SumNum>" + size + "</SumNum>\r\n");
+        catalogXml.append("<DeviceList Num=\"1\">\r\n");
+        catalogXml.append("<Item>\r\n");
+        if (channel != null) {
+            catalogXml.append("<DeviceID>" + channel.getChannelId() + "</DeviceID>\r\n");
+            catalogXml.append("<Name>" + channel.getName() + "</Name>\r\n");
+            catalogXml.append("<Manufacturer>" + channel.getManufacture() + "</Manufacturer>\r\n");
+            catalogXml.append("<Model>" + channel.getModel() + "</Model>\r\n");
+            catalogXml.append("<Owner>" + channel.getOwner() + "</Owner>\r\n");
+            catalogXml.append("<CivilCode>" + channel.getCivilCode() + "</CivilCode>\r\n");
+            catalogXml.append("<Address>" + channel.getAddress() + "</Address>\r\n");
+            catalogXml.append("<Parental>" + channel.getParental() + "</Parental>\r\n");
+            if (channel.getParentId() != null) {
+                catalogXml.append("<ParentID>" + channel.getParentId() + "</ParentID>\r\n");
+            }
+            catalogXml.append("<Secrecy>" + channel.getSecrecy() + "</Secrecy>\r\n");
+            catalogXml.append("<RegisterWay>" + channel.getRegisterWay() + "</RegisterWay>\r\n");
+            catalogXml.append("<Status>" + (channel.getStatus() == 0?"OFF":"ON") + "</Status>\r\n");
+            catalogXml.append("<Longitude>" + channel.getLongitude() + "</Longitude>\r\n");
+            catalogXml.append("<Latitude>" + channel.getLatitude() + "</Latitude>\r\n");
+            catalogXml.append("<IPAddress>" + channel.getIpAddress() + "</IPAddress>\r\n");
+            catalogXml.append("<Port>" + channel.getPort() + "</Port>\r\n");
+            catalogXml.append("<Info>\r\n");
+            catalogXml.append("<PTZType>" + channel.getPTZType() + "</PTZType>\r\n");
+            catalogXml.append("</Info>\r\n");
+        }
+
+
+        catalogXml.append("</Item>\r\n");
+        catalogXml.append("</DeviceList>\r\n");
+        catalogXml.append("</Response>\r\n");
+        return catalogXml.toString();
+    }
+
+    private void sendCatalogResponse(List<DeviceChannel> channels, ParentPlatform parentPlatform, String sn, String fromTag, int index) {
+        if (index >= channels.size()) {
+            return;
+        }
+        try {
+            DeviceChannel deviceChannel = channels.get(index);
+            String catalogXml = getCatalogXml(deviceChannel, sn, parentPlatform, channels.size());
+            // callid
+            CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
+                    : udpSipProvider.getNewCallId();
+
+            Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, catalogXml, fromTag, callIdHeader);
+            transmitRequest(parentPlatform, request, null, eventResult -> {
+                int indexNext = index + 1;
+                sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext);
+            });
+        } catch (SipException | ParseException | InvalidArgumentException e) {
+            e.printStackTrace();
+        }
     }
 
     /**
@@ -283,7 +317,7 @@
         try {
             String characterSet = parentPlatform.getCharacterSet();
             StringBuffer deviceInfoXml = new StringBuffer(600);
-            deviceInfoXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n");
+            deviceInfoXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
             deviceInfoXml.append("<Response>\r\n");
             deviceInfoXml.append("<CmdType>DeviceInfo</CmdType>\r\n");
             deviceInfoXml.append("<SN>" +sn + "</SN>\r\n");
@@ -323,7 +357,7 @@
         try {
             String characterSet = parentPlatform.getCharacterSet();
             StringBuffer deviceStatusXml = new StringBuffer(600);
-            deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n");
+            deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
             deviceStatusXml.append("<Response>\r\n");
             deviceStatusXml.append("<CmdType>DeviceStatus</CmdType>\r\n");
             deviceStatusXml.append("<SN>" +sn + "</SN>\r\n");
@@ -355,7 +389,7 @@
         try {
             String characterSet = parentPlatform.getCharacterSet();
             StringBuffer deviceStatusXml = new StringBuffer(600);
-            deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n");
+            deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
             deviceStatusXml.append("<Notify>\r\n");
             deviceStatusXml.append("<CmdType>MobilePosition</CmdType>\r\n");
             deviceStatusXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -472,7 +506,7 @@
             channel.setParentId(parentPlatform.getDeviceGBId());
         }
         String characterSet = parentPlatform.getCharacterSet();
-        catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n");
+        catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
         catalogXml.append("<Notify>\r\n");
         catalogXml.append("<CmdType>Catalog</CmdType>\r\n");
         catalogXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n");
@@ -546,7 +580,7 @@
         }
         String characterSet = parentPlatform.getCharacterSet();
         StringBuffer catalogXml = new StringBuffer(600);
-        catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n");
+        catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
         catalogXml.append("<Notify>\r\n");
         catalogXml.append("<CmdType>Catalog</CmdType>\r\n");
         catalogXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n");
@@ -569,7 +603,7 @@
         try {
             String characterSet = parentPlatform.getCharacterSet();
             StringBuffer recordXml = new StringBuffer(600);
-            recordXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n");
+            recordXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
             recordXml.append("<Response>\r\n");
             recordXml.append("<CmdType>RecordInfo</CmdType>\r\n");
             recordXml.append("<SN>" +recordInfo.getSn() + "</SN>\r\n");
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java
index 4f1249a..136b912 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java
@@ -12,6 +12,7 @@
 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
+import gov.nist.javax.sip.message.SIPRequest;
 import org.dom4j.DocumentException;
 import org.dom4j.Element;
 import org.slf4j.Logger;
@@ -23,6 +24,7 @@
 import javax.sip.InvalidArgumentException;
 import javax.sip.RequestEvent;
 import javax.sip.SipException;
+import javax.sip.address.SipURI;
 import javax.sip.header.CSeqHeader;
 import javax.sip.header.CallIdHeader;
 import javax.sip.message.Response;
@@ -81,6 +83,17 @@
         // 鏌ヨ涓婄骇骞冲彴鏄惁瀛樺湪
         ParentPlatform parentPlatform = storage.queryParentPlatByServerGBId(deviceId);
         try {
+            if (device != null && parentPlatform != null) {
+                logger.warn("[閲嶅]骞冲彴涓庤澶囩紪鍙烽噸澶嶏細{}", deviceId);
+                SIPRequest request = (SIPRequest) evt.getRequest();
+                String hostAddress = request.getRemoteAddress().getHostAddress();
+                int remotePort = request.getRemotePort();
+                if (device.getHostAddress().equals(hostAddress + ":" + remotePort)) {
+                    parentPlatform = null;
+                }else {
+                    device = null;
+                }
+            }
             if (device == null && parentPlatform == null) {
                 // 涓嶅瓨鍦ㄥ垯鍥炲404
                 responseAck(evt, Response.NOT_FOUND, "device "+ deviceId +" not found");
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java
index e548cfe..419a5c2 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java
@@ -18,6 +18,7 @@
 import javax.sip.header.FromHeader;
 import javax.sip.message.Response;
 import java.text.ParseException;
+import java.util.ArrayList;
 import java.util.List;
 
 @Component
@@ -58,7 +59,8 @@
             List<DeviceChannelInPlatform> deviceChannels = storage.queryChannelListInParentPlatform(parentPlatform.getServerGBId());
             // 鏌ヨ鍏宠仈鐨勭洿鎾�氶亾
             List<GbStream> gbStreams = storage.queryGbStreamListInPlatform(parentPlatform.getServerGBId());
-            int size = deviceChannels.size() + gbStreams.size();
+
+            List<DeviceChannel> allChannels = new ArrayList<>();
             // 鍥炲鐩綍淇℃伅
             List<PlatformCatalog> catalogs =  storage.queryCatalogInPlatform(parentPlatform.getServerGBId());
             if (catalogs.size() > 0) {
@@ -81,9 +83,7 @@
                     deviceChannel.setModel("live");
                     deviceChannel.setOwner("wvp-pro");
                     deviceChannel.setSecrecy("0");
-                    cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);
-                    // 闃叉鍙戦�佽繃蹇�
-                    Thread.sleep(100);
+                    allChannels.add(deviceChannel);
                 }
             }
             // 鍥炲绾ц仈鐨勯�氶亾
@@ -96,9 +96,7 @@
                     deviceChannel.setParental(0);
                     deviceChannel.setParentId(channel.getCatalogId());
                     deviceChannel.setCivilCode(parentPlatform.getDeviceGBId().substring(0, 6));
-                    cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);
-                    // 闃叉鍙戦�佽繃蹇�
-                    Thread.sleep(100);
+                    allChannels.add(deviceChannel);
                 }
             }
             // 鍥炲鐩存挱鐨勯�氶亾
@@ -123,16 +121,16 @@
                     deviceChannel.setOwner("wvp-pro");
                     deviceChannel.setParental(0);
                     deviceChannel.setSecrecy("0");
-                    cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);
-                    // 闃叉鍙戦�佽繃蹇�
-                    Thread.sleep(100);
+                    allChannels.add(deviceChannel);
                 }
             }
-            if (size == 0) {
+            if (allChannels.size() > 0) {
+                cmderFroPlatform.catalogQuery(allChannels, parentPlatform, sn, fromHeader.getTag());
+            }else {
                 // 鍥炲鏃犻�氶亾
-                cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), size);
+                cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), 0);
             }
-        } catch (SipException | InvalidArgumentException | ParseException | InterruptedException e) {
+        } catch (SipException | InvalidArgumentException | ParseException e) {
             e.printStackTrace();
         }
 
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java
index d16506d..6a33da4 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java
@@ -22,6 +22,7 @@
 import javax.sip.header.FromHeader;
 import javax.sip.message.Response;
 import java.text.ParseException;
+import java.util.ArrayList;
 import java.util.List;
 
 @Component
@@ -44,6 +45,9 @@
 
     @Autowired
     private EventPublisher publisher;
+
+    @Autowired
+    private IVideoManagerStorage storage;
 
     @Override
     public void afterPropertiesSet() throws Exception {
@@ -71,10 +75,11 @@
             List<GbStream> gbStreams = storager.queryGbStreamListInPlatform(parentPlatform.getServerGBId());
             // 鍥炲鐩綍淇℃伅
             List<PlatformCatalog> catalogs =  storager.queryCatalogInPlatform(parentPlatform.getServerGBId());
-            int size = catalogs.size() + deviceChannelInPlatforms.size() + gbStreams.size();
+
+            List<DeviceChannel> allChannels = new ArrayList<>();
             if (catalogs.size() > 0) {
                 for (PlatformCatalog catalog : catalogs) {
-                    if (catalog.getParentId().equals(parentPlatform.getServerGBId())) {
+                    if (catalog.getParentId().equals(catalog.getPlatformId())) {
                         catalog.setParentId(parentPlatform.getDeviceGBId());
                     }
                     DeviceChannel deviceChannel = new DeviceChannel();
@@ -92,9 +97,7 @@
                     deviceChannel.setModel("live");
                     deviceChannel.setOwner("wvp-pro");
                     deviceChannel.setSecrecy("0");
-                    cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);
-                    // 闃叉鍙戦�佽繃蹇�
-                    Thread.sleep(100);
+                    allChannels.add(deviceChannel);
                 }
             }
             // 鍥炲绾ц仈鐨勯�氶亾
@@ -103,20 +106,18 @@
                     if (channel.getCatalogId().equals(parentPlatform.getServerGBId())) {
                         channel.setCatalogId(parentPlatform.getDeviceGBId());
                     }
-                    DeviceChannel deviceChannel = storager.queryChannel(channel.getDeviceId(), channel.getChannelId());
+                    DeviceChannel deviceChannel = storage.queryChannel(channel.getDeviceId(), channel.getChannelId());
                     deviceChannel.setParental(0);
                     deviceChannel.setParentId(channel.getCatalogId());
                     deviceChannel.setCivilCode(parentPlatform.getDeviceGBId().substring(0, 6));
-                    cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);
-                    // 闃叉鍙戦�佽繃蹇�
-                    Thread.sleep(100);
+                    allChannels.add(deviceChannel);
                 }
             }
             // 鍥炲鐩存挱鐨勯�氶亾
             if (gbStreams.size() > 0) {
                 for (GbStream gbStream : gbStreams) {
                     if (gbStream.getCatalogId().equals(parentPlatform.getServerGBId())) {
-                        gbStream.setCatalogId(parentPlatform.getDeviceGBId());
+                        gbStream.setCatalogId(null);
                     }
                     DeviceChannel deviceChannel = new DeviceChannel();
                     deviceChannel.setChannelId(gbStream.getGbId());
@@ -134,23 +135,20 @@
                     deviceChannel.setOwner("wvp-pro");
                     deviceChannel.setParental(0);
                     deviceChannel.setSecrecy("0");
-
-                    cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);
-                    // 闃叉鍙戦�佽繃蹇�
-                    Thread.sleep(100);
+                    allChannels.add(deviceChannel);
                 }
             }
-            if (size == 0) {
+            if (allChannels.size() > 0) {
+                cmderFroPlatform.catalogQuery(allChannels, parentPlatform, sn, fromHeader.getTag());
+            }else {
                 // 鍥炲鏃犻�氶亾
-                cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), size);
+                cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), 0);
             }
         } catch (SipException e) {
             e.printStackTrace();
         } catch (InvalidArgumentException e) {
             e.printStackTrace();
         } catch (ParseException e) {
-            e.printStackTrace();
-        } catch (InterruptedException e) {
             e.printStackTrace();
         }
 
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java
index 32b645c..1bafb59 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java
@@ -123,7 +123,7 @@
 
                         channelList.add(deviceChannel);
                     }
-                    logger.debug("鏀跺埌鏉ヨ嚜璁惧銆恵}銆戠殑閫氶亾: {}涓紝{}/{}", device.getDeviceId(), channelList.size(), catalogDataCatch.get(key) == null ? 0 :catalogDataCatch.get(key).size(), sumNum);
+                    logger.info("鏀跺埌鏉ヨ嚜璁惧銆恵}銆戠殑閫氶亾: {}涓紝{}/{}", device.getDeviceId(), channelList.size(), catalogDataCatch.get(key) == null ? 0 :catalogDataCatch.get(key).size(), sumNum);
                     catalogDataCatch.put(key, sumNum, device, channelList);
                     if (catalogDataCatch.get(key).size() == sumNum) {
                         // 鏁版嵁宸茬粡瀹屾暣鎺ユ敹
@@ -230,8 +230,22 @@
         }
     }
 
-    public String getChannelSyncProgress(String deviceId) {
+    public SyncStatus getChannelSyncProgress(String deviceId) {
         String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
-        return catalogDataCatch.get(key) == null ? "0/0" : catalogDataCatch.get(key).size() + "/" + catalogDataCatch.getTotal(key);
+        if (catalogDataCatch.get(key) == null) {
+            return null;
+        }else {
+            return catalogDataCatch.getSyncStatus(key);
+        }
+    }
+
+    public void setChannelSyncReady(String deviceId) {
+        String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
+        catalogDataCatch.addReady(key);
+    }
+
+    public void setChannelSyncEnd(String deviceId, String errorMsg) {
+        String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
+        catalogDataCatch.setChannelSyncEnd(key, errorMsg);
     }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/service/IDeviceService.java b/src/main/java/com/genersoft/iot/vmp/service/IDeviceService.java
index 68a2af3..17cf7f4 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/IDeviceService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IDeviceService.java
@@ -1,6 +1,7 @@
 package com.genersoft.iot.vmp.service;
 
 import com.genersoft.iot.vmp.gb28181.bean.Device;
+import com.genersoft.iot.vmp.gb28181.bean.SyncStatus;
 
 /**
  * 璁惧鐩稿叧涓氬姟澶勭悊
@@ -34,4 +35,24 @@
      * @return
      */
     boolean removeMobilePositionSubscribe(Device device);
+
+    /**
+     * 绉婚櫎绉诲姩浣嶇疆璁㈤槄
+     * @param deviceId 璁惧ID
+     * @return
+     */
+    SyncStatus getChannelSyncStatus(String deviceId);
+
+    /**
+     * 璁剧疆閫氶亾鍚屾鐘舵��
+     * @param deviceId 璁惧ID
+     */
+    void setChannelSyncReady(String deviceId);
+
+    /**
+     * 璁剧疆鍚屾缁撴潫
+     * @param deviceId 璁惧ID
+     * @param errorMsg 閿欒淇℃伅
+     */
+    void setChannelSyncEnd(String deviceId, String errorMsg);
 }
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 e9f7968..8cd2c77 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
@@ -3,9 +3,12 @@
 import com.genersoft.iot.vmp.conf.DynamicTask;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
+import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd.CatalogResponseMessageHandler;
 import com.genersoft.iot.vmp.service.IDeviceService;
 import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask;
 import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask;
+import com.genersoft.iot.vmp.gb28181.bean.SyncStatus;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +27,12 @@
 
     @Autowired
     private ISIPCommander sipCommander;
+
+    @Autowired
+    private CatalogResponseMessageHandler catalogResponseMessageHandler;
+
+    @Autowired
+    private IRedisCatchStorage redisCatchStorage;
 
     @Override
     public boolean addCatalogSubscribe(Device device) {
@@ -86,4 +95,19 @@
         dynamicTask.stop(device.getDeviceId() + "mobile_position");
         return true;
     }
+
+    @Override
+    public SyncStatus getChannelSyncStatus(String deviceId) {
+        return catalogResponseMessageHandler.getChannelSyncProgress(deviceId);
+    }
+
+    @Override
+    public void setChannelSyncReady(String deviceId) {
+        catalogResponseMessageHandler.setChannelSyncReady(deviceId);
+    }
+
+    @Override
+    public void setChannelSyncEnd(String deviceId, String errorMsg) {
+        catalogResponseMessageHandler.setChannelSyncEnd(deviceId, errorMsg);
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
index e66dfa0..c6b7e64 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -216,4 +216,5 @@
     void sendMobilePositionMsg(JSONObject jsonObject);
 
     void sendStreamPushRequestedMsg(MessageForPushChannel messageForPushChannel);
+
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
index 1fb7fd0..fc78de4 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -638,4 +638,5 @@
         logger.info("[redis 鎺ㄦ祦琚姹傞�氱煡] {}: {}-{}", key, msg.getApp(), msg.getStream());
         redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg));
     }
+
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java
index 667a619..20e56d9 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java
@@ -445,8 +445,6 @@
 		device.setOnline(1);
 		logger.info("鏇存柊璁惧鍦ㄧ嚎: " + deviceId);
 		redisCatchStorage.updateDevice(device);
-		List<DeviceChannel> deviceChannelList = deviceChannelMapper.queryOnlineChannelsByDeviceId(deviceId);
-		eventPublisher.catalogEventPublish(null, deviceChannelList, CatalogEvent.ON);
 		return deviceMapper.update(device) > 0;
 	}
 
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
index 6413396..1b6d31e 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
@@ -4,6 +4,7 @@
 import com.genersoft.iot.vmp.conf.DynamicTask;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
+import com.genersoft.iot.vmp.gb28181.bean.SyncStatus;
 import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
@@ -18,6 +19,7 @@
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.kxml2.wap.wv.WV;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -149,49 +151,30 @@
 			@ApiImplicitParam(name="deviceId", value = "璁惧id", required = true, dataTypeClass = String.class),
 	})
 	@PostMapping("/devices/{deviceId}/sync")
-	public DeferredResult<ResponseEntity<Device>> devicesSync(@PathVariable String deviceId){
+	public WVPResult<SyncStatus> devicesSync(@PathVariable String deviceId){
 		
 		if (logger.isDebugEnabled()) {
 			logger.debug("璁惧閫氶亾淇℃伅鍚屾API璋冪敤锛宒eviceId锛�" + deviceId);
 		}
 		Device device = storager.queryVideoDevice(deviceId);
-		String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
-		String uuid = UUID.randomUUID().toString();
-		// 榛樿瓒呮椂鏃堕棿涓�30鍒嗛挓
-		DeferredResult<ResponseEntity<Device>> result = new DeferredResult<ResponseEntity<Device>>(30*60*1000L);
-		result.onTimeout(()->{
-			logger.warn("璁惧[{}]閫氶亾淇℃伅鍚屾瓒呮椂", deviceId);
-			// 閲婃斁rtpserver
-			RequestMessage msg = new RequestMessage();
-			msg.setKey(key);
-			msg.setId(uuid);
-			WVPResult<Object> wvpResult = new WVPResult<>();
-			wvpResult.setCode(-1);
-			wvpResult.setData(device);
-			wvpResult.setMsg("鏇存柊瓒呮椂");
-			msg.setData(wvpResult);
-			resultHolder.invokeAllResult(msg);
-
-		});
-		// 绛夊緟鍏朵粬鐩稿悓璇锋眰杩斿洖鏃朵竴璧疯繑鍥�
-		if (resultHolder.exist(key, null)) {
-			resultHolder.put(key, uuid, result);
-			return result;
-		}else {
-			cmder.catalogQuery(device, event -> {
-				RequestMessage msg = new RequestMessage();
-				msg.setKey(key);
-				msg.setId(uuid);
-				WVPResult<Object> wvpResult = new WVPResult<>();
-				wvpResult.setCode(-1);
-				wvpResult.setData(device);
-				wvpResult.setMsg(String.format("鍚屾閫氶亾澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg));
-				msg.setData(wvpResult);
-				resultHolder.invokeAllResult(msg);
-			});
-			resultHolder.put(key, uuid, result);
-			return result;
+		SyncStatus syncStatus = deviceService.getChannelSyncStatus(deviceId);
+		// 宸插瓨鍦ㄥ垯杩斿洖杩涘害
+		if (syncStatus != null && syncStatus.getErrorMsg() == null) {
+			WVPResult<SyncStatus> wvpResult = new WVPResult<>();
+			wvpResult.setCode(0);
+			wvpResult.setData(syncStatus);
+			return wvpResult;
 		}
+		SyncStatus syncStatusReady = new SyncStatus();
+		deviceService.setChannelSyncReady(deviceId);
+		cmder.catalogQuery(device, event -> {
+			String errorMsg = String.format("鍚屾閫氶亾澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg);
+			deviceService.setChannelSyncEnd(deviceId, errorMsg);
+		});
+		WVPResult<SyncStatus> wvpResult = new WVPResult<>();
+		wvpResult.setCode(0);
+		wvpResult.setMsg("寮�濮嬪悓姝�");
+		return wvpResult;
 	}
 
 	/**
@@ -468,4 +451,22 @@
 	public WVPResult<List<DeviceChannelTree>> tree(@PathVariable String deviceId) {
 		return WVPResult.Data(storager.tree(deviceId));
 	}
+
+	@GetMapping("/{deviceId}/sync_status")
+	@ApiOperation(value = "鑾峰彇閫氶亾鍚屾杩涘害", notes = "鑾峰彇閫氶亾鍚屾杩涘害")
+	public WVPResult<SyncStatus> getSyncStatus(@PathVariable String deviceId) {
+		SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId);
+		WVPResult<SyncStatus> wvpResult = new WVPResult<>();
+		if (channelSyncStatus == null) {
+			wvpResult.setCode(-1);
+			wvpResult.setMsg("鍚屾灏氭湭寮�濮�");
+		}else {
+			wvpResult.setCode(0);
+			wvpResult.setData(channelSyncStatus);
+			if (channelSyncStatus.getErrorMsg() != null) {
+				wvpResult.setMsg(channelSyncStatus.getErrorMsg());
+			}
+		}
+		return wvpResult;
+	}
 }
diff --git a/web_src/src/components/DeviceList.vue b/web_src/src/components/DeviceList.vue
index 8a156d5..4f8b460 100644
--- a/web_src/src/components/DeviceList.vue
+++ b/web_src/src/components/DeviceList.vue
@@ -57,7 +57,7 @@
 
 					<el-table-column label="鎿嶄綔" width="450" align="center" fixed="right">
 						<template slot-scope="scope">
-							<el-button size="mini" :loading="syncDevices.includes(scope.row.deviceId)"  v-if="scope.row.online!=0" icon="el-icon-refresh"  @click="refDevice(scope.row)">鍒锋柊</el-button>
+              <el-button size="mini" v-if="scope.row.online!=0" icon="el-icon-refresh" @click="refDevice(scope.row)" @mouseover="getTooltipContent(scope.row.deviceId)">鍒锋柊</el-button>
 							<el-button-group>
                 <el-button size="mini" icon="el-icon-video-camera-solid" v-bind:disabled="scope.row.online==0"  type="primary" @click="showChannelList(scope.row)">閫氶亾</el-button>
                 <el-button size="mini" icon="el-icon-location" v-bind:disabled="scope.row.online==0"  type="primary" @click="showDevicePosition(scope.row)">瀹氫綅</el-button>
@@ -78,6 +78,7 @@
 					:total="total">
 				</el-pagination>
         <deviceEdit ref="deviceEdit" ></deviceEdit>
+        <syncChannelProgress ref="syncChannelProgress" ></syncChannelProgress>
 			</el-main>
 		</el-container>
 	</div>
@@ -86,11 +87,13 @@
 <script>
 	import uiHeader from './UiHeader.vue'
 	import deviceEdit from './dialog/deviceEdit.vue'
+	import syncChannelProgress from './dialog/SyncChannelProgress.vue'
 	export default {
 		name: 'app',
 		components: {
 			uiHeader,
-      deviceEdit
+      deviceEdit,
+      syncChannelProgress,
 		},
 		data() {
 			return {
@@ -105,7 +108,6 @@
 				count:15,
 				total:0,
 				getDeviceListLoading: false,
-        syncDevices:[]
 			};
 		},
 		computed: {
@@ -198,8 +200,7 @@
 			//鍒锋柊璁惧淇℃伅
 			refDevice: function(itemData) {
 				console.log("鍒锋柊瀵瑰簲璁惧:" + itemData.deviceId);
-				var that = this;
-        this.syncDevices.push(itemData.deviceId)
+				let that = this;
 				this.$axios({
 					method: 'post',
 					url: '/api/device/query/devices/' + itemData.deviceId + '/sync'
@@ -212,14 +213,14 @@
 							type: 'error'
 						});
 					}else{
-						that.$message({
-							showClose: true,
-							message: res.data.msg,
-							type: 'success'
-						});
+						// that.$message({
+						// 	showClose: true,
+						// 	message: res.data.msg,
+						// 	type: 'success'
+						// });
+            this.$refs.syncChannelProgress.openDialog(itemData.deviceId)
 					}
 					that.initData()
-          this.syncDevices.splice(this.syncDevices.indexOf(itemData.deviceId, 1));
 				}).catch((e) => {
 					console.error(e)
           that.$message({
@@ -227,9 +228,29 @@
             message: e,
             type: 'error'
           });
-          this.syncDevices.splice(this.syncDevices.indexOf(itemData.deviceId, 1));
 				});
+
 			},
+
+      getTooltipContent: async function (deviceId){
+         let result = "";
+         await this.$axios({
+            method: 'get',
+            async: false,
+            url:`/api/device/query/${deviceId}/sync_status/`,
+          }).then((res) => {
+           if (res.data.code == 0) {
+             if (res.data.data.errorMsg !== null) {
+               result = res.data.data.errorMsg
+             } else if (res.data.msg !== null) {
+               result = res.data.msg
+             } else {
+               result = `鍚屾涓�...[${res.data.data.current}/${res.data.data.total}]`;
+             }
+           }
+         })
+         return result;
+      },
 			//閫氱煡璁惧涓婁紶濯掍綋娴�
 			sendDevicePush: function(itemData) {
 				// let deviceId = this.currentDevice.deviceId;
diff --git a/web_src/src/components/dialog/SyncChannelProgress.vue b/web_src/src/components/dialog/SyncChannelProgress.vue
new file mode 100644
index 0000000..1ec16f4
--- /dev/null
+++ b/web_src/src/components/dialog/SyncChannelProgress.vue
@@ -0,0 +1,102 @@
+<template>
+  <div id="SyncChannelProgress" v-loading="isLoging">
+    <el-dialog
+      width="240px"
+      top="13%"
+      :append-to-body="true"
+      :close-on-click-modal="false"
+      :visible.sync="showDialog"
+      :destroy-on-close="true"
+      :show-close="true"
+      @close="close()"
+     style="text-align: center">
+      <el-progress type="circle" :percentage="percentage" :status="syncStatus"></el-progress>
+      <div style="text-align: center">
+        {{msg}}
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: "SyncChannelProgress",
+  computed: {},
+  props: ['platformId'],
+  created() {},
+  data() {
+    return {
+      syncStatus: null,
+      percentage: 0,
+      total: 0,
+      current: 0,
+      showDialog: false,
+      isLoging: false,
+      syncFlag: false,
+      deviceId: null,
+      timmer: null,
+      msg: "姝e湪鍚屾",
+    };
+  },
+  methods: {
+    openDialog: function (deviceId) {
+      console.log("deviceId: " + deviceId)
+      this.deviceId = deviceId;
+      this.showDialog = true;
+      this.msg = "";
+      this.percentage= 0;
+      this.total= 0;
+      this.current= 0;
+      this.syncFlag= false;
+      this.syncStatus = null;
+      this.getProgress()
+    },
+    getProgress(){
+      this.$axios({
+        method: 'get',
+        url:`/api/device/query/${this.deviceId}/sync_status/`,
+      }).then((res) => {
+        if (res.data.code == 0) {
+          if (!this.syncFlag) {
+            this.syncFlag = true;
+          }
+          if (res.data.data == null) {
+            this.syncStatus = "success"
+            this.percentage = 100;
+            this.msg = '鍚屾鎴愬姛';
+          }else if (res.data.data.total == 0){
+            this.msg = `绛夊緟鍚屾涓璥;
+            this.timmer = setTimeout(this.getProgress, 300)
+          }else if (res.data.data.errorMsg !== null ){
+            this.msg = res.data.data.errorMsg;
+            this.syncStatus = "exception"
+          }else {
+            this.total = res.data.data.total;
+            this.current = res.data.data.current;
+            this.percentage = Math.floor(Number(res.data.data.current)/Number(res.data.data.total)* 10000)/100;
+            this.msg = `鍚屾涓�...[${res.data.data.current}/${res.data.data.total}]`;
+            this.timmer = setTimeout(this.getProgress, 300)
+          }
+        }else {
+          if (this.syncFlag) {
+            this.syncStatus = "success"
+            this.percentage = 100;
+            this.msg = '鍚屾鎴愬姛';
+          }else {
+            this.syncStatus = "error"
+            this.msg = res.data.msg;
+          }
+        }
+      }).catch((error) =>{
+        console.log(error);
+        this.syncStatus = "error"
+        this.msg = error.response.data.msg;
+      });
+    },
+    close: function (){
+      window.clearTimeout(this.timmer)
+    }
+  },
+};
+</script>

--
Gitblit v1.8.0