648540858
2023-03-25 4f22994cdbf1254005def8bb7639cbfd3fd2b450
优化国标级联的更新
4个文件已修改
144 ■■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/service/IPlatformService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/dialog/platformEdit.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/IPlatformService.java
@@ -26,6 +26,12 @@
    boolean add(ParentPlatform parentPlatform);
    /**
     * 添加级联平台
     * @param parentPlatform 级联平台
     */
    boolean update(ParentPlatform parentPlatform);
    /**
     * 平台上线
     * @param parentPlatform 平台信息
     */
src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java
@@ -11,8 +11,8 @@
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;
@@ -40,6 +40,15 @@
    @Autowired
    private ParentPlatformMapper platformMapper;
    @Autowired
    private PlatformCatalogMapper catalogMapper;
    @Autowired
    private PlatformChannelMapper platformChannelMapper;
    @Autowired
    private PlatformGbStreamMapper platformGbStreamMapper;
    @Autowired
    private IRedisCatchStorage redisCatchStorage;
@@ -113,6 +122,69 @@
    }
    @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());
        platformMapper.updateParentPlatformStatus(parentPlatform.getServerGBId(), true);
@@ -137,7 +209,7 @@
                ()-> {
                    registerTask(parentPlatform);
                },
                (parentPlatform.getExpires() - 10) *1000);
                (parentPlatform.getExpires()) *1000);
        }
@@ -183,7 +255,7 @@
                            logger.error("[命令发送失败] 国标级联 发送心跳: {}", e.getMessage());
                        }
                    },
                    (parentPlatform.getKeepTimeout() - 10)*1000);
                    (parentPlatform.getKeepTimeout())*1000);
        }
    }
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java
@@ -205,58 +205,8 @@
        ) {
            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);
    }
    /**
web_src/src/components/dialog/platformEdit.vue
@@ -157,7 +157,7 @@
        devicePort: null,
        username: null,
        password: null,
        expires: 300,
        expires: 3600,
        keepTimeout: 60,
        transport: "UDP",
        characterSet: "GB2312",
@@ -305,7 +305,7 @@
        devicePort: null,
        username: null,
        password: null,
        expires: 300,
        expires: 3600,
        keepTimeout: 60,
        transport: "UDP",
        characterSet: "GB2312",
@@ -332,7 +332,7 @@
    },
    checkExpires: function() {
      if (this.platform.enable && this.platform.expires === "0") {
        this.platform.expires = "300";
        this.platform.expires = "3600";
      }
    },
    rtcpCheckBoxChange: function (result){