增加推流添加功能,修复级联目录推送
parent
eefe6f4c8d
commit
e29d94c83f
|
@ -419,7 +419,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
|
|||
}
|
||||
}
|
||||
} 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 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
|
|||
notifyStreamOnline(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
|
||||
mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} catch (SipException | InvalidArgumentException | ParseException e) {
|
||||
|
|
|
@ -96,4 +96,8 @@ public interface IStreamPushService {
|
|||
*/
|
||||
void online(List<StreamPushItemFromRedis> onlineStreams);
|
||||
|
||||
/**
|
||||
* 增加推流
|
||||
*/
|
||||
boolean add(StreamPushItem stream);
|
||||
}
|
||||
|
|
|
@ -22,7 +22,10 @@ import com.github.pagehelper.PageInfo;
|
|||
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.*;
|
||||
|
@ -69,6 +72,12 @@ public class StreamPushServiceImpl implements IStreamPushService {
|
|||
@Autowired
|
||||
private IMediaServerService mediaServerService;
|
||||
|
||||
@Autowired
|
||||
DataSourceTransactionManager dataSourceTransactionManager;
|
||||
|
||||
@Autowired
|
||||
TransactionDefinition transactionDefinition;
|
||||
|
||||
@Override
|
||||
public List<StreamPushItem> handleJSON(String jsonData, MediaServerItem mediaServerItem) {
|
||||
if (jsonData == null) {
|
||||
|
@ -463,4 +472,27 @@ public class StreamPushServiceImpl implements IStreamPushService {
|
|||
// 发送通知
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ public interface PlatformCatalogMapper {
|
|||
@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);
|
||||
}
|
||||
|
|
|
@ -741,6 +741,7 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage {
|
|||
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 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage {
|
|||
}
|
||||
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);
|
||||
|
|
|
@ -12,6 +12,7 @@ public class WVPResult<T> {
|
|||
this.data = data;
|
||||
}
|
||||
|
||||
|
||||
private int code;
|
||||
private String msg;
|
||||
private T data;
|
||||
|
|
|
@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.conf.UserSetting;
|
|||
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 @@ public class PlatformController {
|
|||
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");
|
||||
|
|
|
@ -284,5 +284,35 @@ public class StreamPushController {
|
|||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 @@ export default {
|
|||
|
||||
})
|
||||
},
|
||||
addStream: function (){
|
||||
this.$refs.addStreamTOGB.openDialog(null, this.initData);
|
||||
},
|
||||
batchDel: function () {
|
||||
this.$confirm(`确定删除选中的${this.multipleSelection.length}个通道?`, '提示', {
|
||||
confirmButtonText: '确定',
|
||||
|
|
|
@ -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 @@ export default {
|
|||
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 = "";
|
||||
|
|
|
@ -94,7 +94,7 @@ export default {
|
|||
},
|
||||
rules: {
|
||||
name: [{ required: true, message: "请输入名称", trigger: "blur" }],
|
||||
id: [{ trigger: "blur",validator: checkId }]
|
||||
id: [{ required: true, trigger: "blur",validator: checkId }]
|
||||
},
|
||||
};
|
||||
},
|
||||
|
|
|
@ -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 @@ export default {
|
|||
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 @@ export default {
|
|||
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 @@ export default {
|
|||
if (this.platform.enable && this.platform.expires == "0") {
|
||||
this.platform.expires = "300";
|
||||
}
|
||||
},
|
||||
handleNodeClick: function (node){
|
||||
|
||||
}
|
||||
},
|
||||
};
|
Loading…
Reference in New Issue