Browse Source

优化国标级联的更新

648540858 2 years ago
parent
commit
4f22994cdb

+ 6 - 0
src/main/java/com/genersoft/iot/vmp/service/IPlatformService.java

@@ -25,6 +25,12 @@ public interface IPlatformService {
      */
     boolean add(ParentPlatform parentPlatform);
 
+    /**
+     * 添加级联平台
+     * @param parentPlatform 级联平台
+     */
+    boolean update(ParentPlatform parentPlatform);
+
     /**
      * 平台上线
      * @param parentPlatform 平台信息

+ 76 - 4
src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java

@@ -11,8 +11,8 @@ import com.genersoft.iot.vmp.service.IMediaServerService;
 import com.genersoft.iot.vmp.service.IPlatformService;
 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
-import com.genersoft.iot.vmp.storager.dao.GbStreamMapper;
-import com.genersoft.iot.vmp.storager.dao.ParentPlatformMapper;
+import com.genersoft.iot.vmp.storager.dao.*;
+import com.genersoft.iot.vmp.utils.DateUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import org.slf4j.Logger;
@@ -41,6 +41,15 @@ public class PlatformServiceImpl implements IPlatformService {
     @Autowired
     private ParentPlatformMapper platformMapper;
 
+    @Autowired
+    private PlatformCatalogMapper catalogMapper;
+
+    @Autowired
+    private PlatformChannelMapper platformChannelMapper;
+
+    @Autowired
+    private PlatformGbStreamMapper platformGbStreamMapper;
+
     @Autowired
     private IRedisCatchStorage redisCatchStorage;
 
@@ -112,6 +121,69 @@ public class PlatformServiceImpl implements IPlatformService {
         return result > 0;
     }
 
+    @Override
+    public boolean update(ParentPlatform parentPlatform) {
+        parentPlatform.setCharacterSet(parentPlatform.getCharacterSet().toUpperCase());
+        ParentPlatform parentPlatformOld = platformMapper.getParentPlatById(parentPlatform.getId());
+        parentPlatform.setUpdateTime(DateUtil.getNow());
+        if (!parentPlatformOld.getTreeType().equals(parentPlatform.getTreeType())) {
+            // 目录结构发生变化,清空之前的关联关系
+            logger.info("保存平台{}时发现目录结构变化,清空关联关系", parentPlatform.getDeviceGBId());
+            catalogMapper.delByPlatformId(parentPlatformOld.getServerGBId());
+            platformChannelMapper.delByPlatformId(parentPlatformOld.getServerGBId());
+            platformGbStreamMapper.delByPlatformId(parentPlatformOld.getServerGBId());
+        }
+
+        // 停止心跳定时
+        final String keepaliveTaskKey = KEEPALIVE_KEY_PREFIX + parentPlatformOld.getServerGBId();
+        dynamicTask.stop(keepaliveTaskKey);
+        // 停止注册定时
+        final String registerTaskKey = REGISTER_KEY_PREFIX + parentPlatformOld.getServerGBId();
+        dynamicTask.stop(registerTaskKey);
+        // 注销旧的
+        try {
+            commanderForPlatform.unregister(parentPlatformOld, null, eventResult -> {
+                logger.info("[国标级联] 注销成功, 平台:{}", parentPlatformOld.getServerGBId());
+            });
+        } catch (InvalidArgumentException | ParseException | SipException e) {
+            logger.error("[命令发送失败] 国标级联 注销: {}", e.getMessage());
+        }
+
+        // 更新数据库
+        if (parentPlatform.getCatalogGroup() == 0) {
+            parentPlatform.setCatalogGroup(1);
+        }
+        if (parentPlatform.getAdministrativeDivision() == null) {
+            parentPlatform.setAdministrativeDivision(parentPlatform.getAdministrativeDivision());
+        }
+
+        platformMapper.updateParentPlatform(parentPlatform);
+        // 更新redis
+        redisCatchStorage.delPlatformCatchInfo(parentPlatformOld.getServerGBId());
+        ParentPlatformCatch parentPlatformCatch = new ParentPlatformCatch();
+        parentPlatformCatch.setParentPlatform(parentPlatform);
+        parentPlatformCatch.setId(parentPlatform.getServerGBId());
+        redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch);
+        // 注册
+        if (parentPlatform.isEnable()) {
+            // 保存时启用就发送注册
+            // 注册成功时由程序直接调用了online方法
+            try {
+                commanderForPlatform.register(parentPlatform, eventResult -> {
+                    logger.info("[国标级联] {},添加向上级注册失败,请确定上级平台可用时重新保存", parentPlatform.getServerGBId());
+                }, null);
+            } catch (InvalidArgumentException | ParseException | SipException e) {
+                logger.error("[命令发送失败] 国标级联: {}", e.getMessage());
+            }
+        }
+        // 重新开启定时注册, 使用续订消息
+        // 重新开始心跳保活
+
+
+        return false;
+    }
+
+
     @Override
     public void online(ParentPlatform parentPlatform) {
         logger.info("[国标级联]:{}, 平台上线/更新注册", parentPlatform.getServerGBId());
@@ -137,7 +209,7 @@ public class PlatformServiceImpl implements IPlatformService {
                 ()-> {
                     registerTask(parentPlatform);
                 },
-                (parentPlatform.getExpires() - 10) *1000);
+                (parentPlatform.getExpires()) *1000);
         }
 
 
@@ -183,7 +255,7 @@ public class PlatformServiceImpl implements IPlatformService {
                             logger.error("[命令发送失败] 国标级联 发送心跳: {}", e.getMessage());
                         }
                     },
-                    (parentPlatform.getKeepTimeout() - 10)*1000);
+                    (parentPlatform.getKeepTimeout())*1000);
         }
     }
 

+ 2 - 52
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java

@@ -205,58 +205,8 @@ public class PlatformController {
         ) {
             throw new ControllerException(ErrorCode.ERROR400);
         }
-        parentPlatform.setCharacterSet(parentPlatform.getCharacterSet().toUpperCase());
-        ParentPlatform parentPlatformOld = storager.queryParentPlatByServerGBId(parentPlatform.getServerGBId());
-        parentPlatform.setUpdateTime(DateUtil.getNow());
-        if (!parentPlatformOld.getTreeType().equals(parentPlatform.getTreeType())) {
-             // 目录结构发生变化,清空之前的关联关系
-             logger.info("保存平台{}时发现目录结构变化,清空关联关系", parentPlatform.getDeviceGBId());
-             storager.cleanContentForPlatform(parentPlatform.getServerGBId());
-
-        }
-        boolean updateResult = storager.updateParentPlatform(parentPlatform);
-
-        if (updateResult) {
-            // 保存时启用就发送注册
-            if (parentPlatform.isEnable()) {
-                if (parentPlatformOld != null && parentPlatformOld.isStatus()) {
-                    try {
-                        commanderForPlatform.unregister(parentPlatformOld, null, null);
-                    } catch (InvalidArgumentException | ParseException | SipException e) {
-                        logger.error("[命令发送失败] 国标级联 注销: {}", e.getMessage());
-                    }
-                    try {
-                        Thread.sleep(500);
-                    } catch (InterruptedException e) {
-                        logger.error("[线程休眠失败] : {}", e.getMessage());
-                    }
-                    //  只要保存就发送注册
-                    try {
-                        commanderForPlatform.register(parentPlatform, null, null);
-                    } catch (InvalidArgumentException | ParseException | SipException e) {
-                        logger.error("[命令发送失败] 国标级联 注册: {}", e.getMessage());
-                    }
-
-                } else {
-                    //  只要保存就发送注册
-                    try {
-                        commanderForPlatform.register(parentPlatform, null, null);
-                    } catch (InvalidArgumentException | ParseException | SipException e) {
-                        logger.error("[命令发送失败] 国标级联 注册: {}", e.getMessage());
-                    }
-                }
-            } else if (parentPlatformOld != null && parentPlatformOld.isEnable() && !parentPlatform.isEnable()) { // 关闭启用时注销
-                try {
-                    commanderForPlatform.unregister(parentPlatformOld, null, null);
-                } catch (InvalidArgumentException | ParseException | SipException e) {
-                    logger.error("[命令发送失败] 国标级联 注销: {}", e.getMessage());
-                }
-                // 停止订阅相关的定时任务
-                subscribeHolder.removeAllSubscribe(parentPlatform.getServerGBId());
-            }
-        } else {
-            throw new ControllerException(ErrorCode.ERROR100.getCode(),"写入数据库失败");
-        }
+
+        platformService.update(parentPlatform);
     }
 
     /**

+ 3 - 3
web_src/src/components/dialog/platformEdit.vue

@@ -157,7 +157,7 @@ export default {
         devicePort: null,
         username: null,
         password: null,
-        expires: 300,
+        expires: 3600,
         keepTimeout: 60,
         transport: "UDP",
         characterSet: "GB2312",
@@ -305,7 +305,7 @@ export default {
         devicePort: null,
         username: null,
         password: null,
-        expires: 300,
+        expires: 3600,
         keepTimeout: 60,
         transport: "UDP",
         characterSet: "GB2312",
@@ -332,7 +332,7 @@ export default {
     },
     checkExpires: function() {
       if (this.platform.enable && this.platform.expires === "0") {
-        this.platform.expires = "300";
+        this.platform.expires = "3600";
       }
     },
     rtcpCheckBoxChange: function (result){