648540858
2022-07-22 e29d94c83f62960bb1d6dacac4c978debc85c5ef
增加推流添加功能,修复级联目录推送
11个文件已修改
1 文件已重命名
171 ■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformCatalogMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/PushVideoList.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/channelList.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/dialog/catalogEdit.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/dialog/pushStreamEdit.vue 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -419,7 +419,7 @@
                        }
                    }
                } else if (gbStream != null) {
                    if (streamPushItem.isStatus()) {
                    if (streamPushItem != null && streamPushItem.isStatus()) {
                        // 在线状态
                        pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
                                mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
@@ -428,9 +428,7 @@
                        notifyStreamOnline(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
                                mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
                    }
                }
            }
        } catch (SipException | InvalidArgumentException | ParseException e) {
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
@@ -96,4 +96,8 @@
     */
    void online(List<StreamPushItemFromRedis> onlineStreams);
    /**
     * 增加推流
     */
    boolean add(StreamPushItem stream);
}
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
@@ -22,7 +22,10 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.util.StringUtils;
import java.util.*;
@@ -68,6 +71,12 @@
    @Autowired
    private IMediaServerService mediaServerService;
    @Autowired
    DataSourceTransactionManager dataSourceTransactionManager;
    @Autowired
    TransactionDefinition transactionDefinition;
    @Override
    public List<StreamPushItem> handleJSON(String jsonData, MediaServerItem mediaServerItem) {
@@ -463,4 +472,27 @@
        // 发送通知
        eventPublisher.catalogEventPublishForStream(null, onlinePushers, CatalogEvent.ON);
    }
    @Override
    public boolean add(StreamPushItem stream) {
        stream.setUpdateTime(DateUtil.getNow());
        stream.setCreateTime(DateUtil.getNow());
        stream.setServerId(userSetting.getServerId());
        // 放在事务内执行
        boolean result = false;
        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
        try {
            int addStreamResult = streamPushMapper.add(stream);
            if (!StringUtils.isEmpty(stream.getGbId())) {
                gbStreamMapper.add(stream);
            }
            dataSourceTransactionManager.commit(transactionStatus);
            result = true;
        }catch (Exception e) {
            logger.error("批量移除流与平台的关系时错误", e);
            dataSourceTransactionManager.rollback(transactionStatus);
        }
        return result;
    }
}
src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformCatalogMapper.java
@@ -50,7 +50,7 @@
    @Select("SELECT pc.* FROM  platform_catalog pc WHERE  pc.id = #{id}")
    PlatformCatalog selectParentCatalog(String id);
    @Select("SELECT pc.id as channelId, pc.name, pc.civilCode, pc.businessGroupId,'0' as parental, pc.parentId  " +
    @Select("SELECT pc.id as channelId, pc.name, pc.civilCode, pc.businessGroupId,'1' as parental, pc.parentId  " +
            " FROM platform_catalog pc WHERE pc.platformId=#{platformId}")
    List<DeviceChannel> queryCatalogInPlatform(String platformId);
}
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java
@@ -741,6 +741,7 @@
            if (platformCatalog.getPlatformId().equals(platformCatalog.getParentId())) {
                // 第一层节点
                platformCatalog.setBusinessGroupId(platformCatalog.getId());
                platformCatalog.setParentId(platform.getDeviceGBId());
            }else {
                // 获取顶层的
                PlatformCatalog topCatalog = getTopCatalog(platformCatalog.getParentId(), platformCatalog.getPlatformId());
@@ -749,6 +750,10 @@
        }
        if (platform.getTreeType().equals(TreeType.CIVIL_CODE)) {
            platformCatalog.setCivilCode(platformCatalog.getId());
            if (platformCatalog.getPlatformId().equals(platformCatalog.getParentId())) {
                // 第一层节点
                platformCatalog.setParentId(platform.getDeviceGBId());
            }
        }
        int result = catalogMapper.add(platformCatalog);
src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java
@@ -12,6 +12,7 @@
        this.data = data;
    }
    private int code;
    private String msg;
    private T data;
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java
@@ -8,6 +8,7 @@
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
import com.genersoft.iot.vmp.gb28181.bean.PlatformCatalog;
import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder;
import com.genersoft.iot.vmp.gb28181.bean.TreeType;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
import com.genersoft.iot.vmp.service.IPlatformChannelService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
@@ -463,13 +464,20 @@
        if (logger.isDebugEnabled()) {
            logger.debug("查询目录,platformId: {}, parentId: {}", platformId, parentId);
        }
        ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId);
        if (platform == null) {
            return new ResponseEntity<>(new WVPResult<>(400, "平台未找到", null), HttpStatus.OK);
        }
        if (platformId.equals(parentId)) {
            parentId = platform.getDeviceGBId();
        }
        List<PlatformCatalog> platformCatalogList = storager.getChildrenCatalogByPlatform(platformId, parentId);
        // 查询下属的国标通道
//        List<PlatformCatalog> catalogsForChannel = storager.queryChannelInParentPlatformAndCatalog(platformId, parentId);
        // 查询下属的直播流通道
//        List<PlatformCatalog> catalogsForStream = storager.queryStreamInParentPlatformAndCatalog(platformId, parentId);
//        platformCatalogList.addAll(catalogsForChannel);
//        platformCatalogList.addAll(catalogsForStream);
//        if (platform.getTreeType().equals(TreeType.BUSINESS_GROUP)) {
//            platformCatalogList = storager.getChildrenCatalogByPlatform(platformId, parentId);
//        }else {
//
//        }
        WVPResult<List<PlatformCatalog>> result = new WVPResult<>();
        result.setCode(0);
        result.setMsg("success");
src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java
@@ -284,5 +284,35 @@
        return result;
    }
    /**
     * 获取推流播放地址
     * @param stream 推流信息
     * @return
     */
    @ApiOperation("获取推流播放地址")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "stream", value = "推流信息", dataTypeClass = StreamPushItem.class),
    })
    @PostMapping(value = "/add")
    @ResponseBody
    public WVPResult<StreamInfo> add(@RequestBody StreamPushItem stream){
        if (StringUtils.isEmpty(stream.getGbId())) {
            return new WVPResult<>(400, "国标ID不可为空", null);
        }
        if (StringUtils.isEmpty(stream.getApp()) && StringUtils.isEmpty(stream.getStream())) {
            return new WVPResult<>(400, "app或stream不可为空", null);
        }
        stream.setStatus(false);
        stream.setPushIng(false);
        stream.setAliveSecond(0L);
        stream.setTotalReaderCount("0");
        boolean result = streamPushService.add(stream);
        if (result) {
            return new WVPResult<>(0, "success", null);
        }else {
            return new WVPResult<>(-1, "fail", null);
        }
    }
}
web_src/src/components/PushVideoList.vue
@@ -34,6 +34,8 @@
        <el-button icon="el-icon-delete" size="mini" style="margin-right: 1rem;"
                   :disabled="multipleSelection.length === 0" type="danger" @click="batchDel">批量移除
        </el-button>
        <el-button icon="el-icon-plus" size="mini" style="margin-right: 1rem;" type="primary" @click="addStream">添加通道
        </el-button>
        <el-button icon="el-icon-refresh-right" circle size="mini" @click="refresh()"></el-button>
      </div>
    </div>
@@ -108,7 +110,7 @@
<script>
import streamProxyEdit from './dialog/StreamProxyEdit.vue'
import devicePlayer from './dialog/devicePlayer.vue'
import addStreamTOGB from './dialog/addStreamTOGB.vue'
import addStreamTOGB from './dialog/pushStreamEdit.vue'
import uiHeader from '../layout/UiHeader.vue'
import importChannel from './dialog/importChannel.vue'
import MediaServer from './service/MediaServer'
@@ -252,6 +254,9 @@
      })
    },
    addStream: function (){
      this.$refs.addStreamTOGB.openDialog(null, this.initData);
    },
    batchDel: function () {
      this.$confirm(`确定删除选中的${this.multipleSelection.length}个通道?`, '提示', {
        confirmButtonText: '确定',
web_src/src/components/channelList.vue
@@ -124,7 +124,6 @@
import devicePlayer from './dialog/devicePlayer.vue'
import uiHeader from '../layout/UiHeader.vue'
import moment from "moment";
import DviceService from "./service/DeviceService";
import DeviceService from "./service/DeviceService";
import DeviceTree from "./common/DeviceTree";
@@ -318,7 +317,7 @@
    changeSubchannel(itemData) {
      this.beforeUrl = this.$router.currentRoute.path;
      var url = `/${this.$router.currentRoute.name}/${this.$router.currentRoute.params.deviceId}/${itemData.channelId}/${this.$router.currentRoute.params.count}/1`
      var url = `/${this.$router.currentRoute.name}/${this.$router.currentRoute.params.deviceId}/${itemData.channelId}`
      this.$router.push(url).then(() => {
        this.searchSrt = "";
        this.channelType = "";
web_src/src/components/dialog/catalogEdit.vue
@@ -94,7 +94,7 @@
      },
      rules: {
        name: [{ required: true, message: "请输入名称", trigger: "blur" }],
        id: [{ trigger: "blur",validator: checkId  }]
        id: [{ required: true, trigger: "blur",validator: checkId  }]
      },
    };
  },
web_src/src/components/dialog/pushStreamEdit.vue
File was renamed from web_src/src/components/dialog/addStreamTOGB.vue
@@ -15,10 +15,10 @@
                <el-input v-model="proxyParam.name" clearable></el-input>
              </el-form-item>
              <el-form-item label="流应用名" prop="app">
                <el-input v-model="proxyParam.app" clearable :disabled="true"></el-input>
                <el-input v-model="proxyParam.app" clearable :disabled="edit"></el-input>
              </el-form-item>
              <el-form-item label="流ID" prop="stream">
                <el-input v-model="proxyParam.stream" clearable :disabled="true"></el-input>
                <el-input v-model="proxyParam.stream" clearable :disabled="edit"></el-input>
              </el-form-item>
              <el-form-item label="国标编码" prop="gbId">
                <el-input v-model="proxyParam.gbId" placeholder="设置国标编码可推送到国标" clearable></el-input>
@@ -28,7 +28,6 @@
                  <el-button type="primary" @click="onSubmit">保存</el-button>
                  <el-button @click="close">取消</el-button>
                </div>
              </el-form-item>
            </el-form>
      </div>
@@ -38,7 +37,7 @@
<script>
export default {
  name: "streamProxyEdit",
  name: "pushStreamEdit",
  props: {},
  computed: {},
  created() {},
@@ -63,13 +62,13 @@
      listChangeCallback: null,
      showDialog: false,
      isLoging: false,
      edit: false,
      proxyParam: {
          name: null,
          app: null,
          stream: null,
          gbId: null,
      },
      rules: {
        name: [{ required: true, message: "请输入名称", trigger: "blur" }],
        app: [{ required: true, message: "请输入应用名", trigger: "blur" }],
@@ -84,30 +83,53 @@
      this.listChangeCallback = callback;
      if (proxyParam != null) {
        this.proxyParam = proxyParam;
      }
        this.edit = true
      }
    },
    onSubmit: function () {
      console.log("onSubmit");
      var that = this;
      that.$axios({
        method:"post",
        url:`/api/push/save_to_gb`,
        data: that.proxyParam
      }).then(function (res) {
      if (this.edit) {
        this.$axios({
          method:"post",
          url:`/api/push/save_to_gb`,
          data: this.proxyParam
        }).then( (res) => {
          if (res.data == "success") {
            that.$message({
            this.$message({
              showClose: true,
              message: "保存成功",
              type: "success",
            });
            that.showDialog = false;
            if (that.listChangeCallback != null) {
              that.listChangeCallback();
            this.showDialog = false;
            if (this.listChangeCallback != null) {
              this.listChangeCallback();
            }
          }
      }).catch(function (error) {
        }).catch((error)=> {
          console.log(error);
      });
        });
      }else {
        this.$axios({
          method:"post",
          url:`/api/push/add`,
          data: this.proxyParam
        }).then( (res) => {
          if (res.data.code === 0) {
            this.$message({
              showClose: true,
              message: "保存成功",
              type: "success",
            });
            this.showDialog = false;
            if (this.listChangeCallback != null) {
              this.listChangeCallback();
            }
          }
        }).catch((error)=> {
          console.log(error);
        });
      }
    },
    close: function () {
      console.log("关闭加入GB");
@@ -131,6 +153,9 @@
      if (this.platform.enable && this.platform.expires == "0") {
        this.platform.expires = "300";
      }
    },
    handleNodeClick: function (node){
    }
  },
};