国标级联通道共享支持按照设备添加共享和移除共享
parent
1efb5fca0f
commit
e55cd08b08
|
@ -41,8 +41,6 @@ public class SubscribeHolder {
|
||||||
// 添加任务处理订阅过期
|
// 添加任务处理订阅过期
|
||||||
dynamicTask.startDelay(taskOverdueKey, () -> removeCatalogSubscribe(subscribeInfo.getId()),
|
dynamicTask.startDelay(taskOverdueKey, () -> removeCatalogSubscribe(subscribeInfo.getId()),
|
||||||
subscribeInfo.getExpires() * 1000);
|
subscribeInfo.getExpires() * 1000);
|
||||||
// 发送目录订阅添加通知
|
|
||||||
eventPublisher.catalogSubscribePutEventPublish(platformId, subscribeInfo);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -259,4 +259,24 @@ public class PlatformController {
|
||||||
Assert.notNull(id, "平台ID不可为空");
|
Assert.notNull(id, "平台ID不可为空");
|
||||||
platformChannelService.pushChannel(id);
|
platformChannelService.pushChannel(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Operation(summary = "添加通道-通过设备", security = @SecurityRequirement(name = JwtUtils.HEADER))
|
||||||
|
@PostMapping("/channel/device/add")
|
||||||
|
@ResponseBody
|
||||||
|
public void addChannelByDevice(@RequestBody UpdateChannelParam param) {
|
||||||
|
Assert.notNull(param.getPlatformId(), "平台ID不可为空");
|
||||||
|
Assert.notNull(param.getDeviceIds(), "设备ID不可为空");
|
||||||
|
Assert.notEmpty(param.getDeviceIds(), "设备ID不可为空");
|
||||||
|
platformChannelService.addChannelByDevice(param.getPlatformId(), param.getDeviceIds());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Operation(summary = "移除通道-通过设备", security = @SecurityRequirement(name = JwtUtils.HEADER))
|
||||||
|
@PostMapping("/channel/device/remove")
|
||||||
|
@ResponseBody
|
||||||
|
public void removeChannelByDevice(@RequestBody UpdateChannelParam param) {
|
||||||
|
Assert.notNull(param.getPlatformId(), "平台ID不可为空");
|
||||||
|
Assert.notNull(param.getDeviceIds(), "设备ID不可为空");
|
||||||
|
Assert.notEmpty(param.getDeviceIds(), "设备ID不可为空");
|
||||||
|
platformChannelService.removeChannelByDevice(param.getPlatformId(), param.getDeviceIds());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,4 +18,7 @@ public class UpdateChannelParam {
|
||||||
|
|
||||||
@Schema(description = "待关联的通道ID")
|
@Schema(description = "待关联的通道ID")
|
||||||
List<Integer> channelIds;
|
List<Integer> channelIds;
|
||||||
|
|
||||||
|
@Schema(description = "待关联的设备ID")
|
||||||
|
List<Integer> deviceIds;
|
||||||
}
|
}
|
||||||
|
|
|
@ -309,6 +309,13 @@ public interface CommonGBChannelMapper {
|
||||||
@SelectProvider(type = ChannelProvider.class, method = "queryByGbDeviceIds")
|
@SelectProvider(type = ChannelProvider.class, method = "queryByGbDeviceIds")
|
||||||
List<CommonGBChannel> queryByGbDeviceIds(List<Integer> deviceIds);
|
List<CommonGBChannel> queryByGbDeviceIds(List<Integer> deviceIds);
|
||||||
|
|
||||||
|
@Select(value = {" <script>" +
|
||||||
|
" select id from wvp_device_channel " +
|
||||||
|
" where channel_type = 0 and device_db_id in "+
|
||||||
|
" <foreach collection='deviceIds' item='item' open='(' separator=',' close=')' > #{item}</foreach>" +
|
||||||
|
" </script>"})
|
||||||
|
List<Integer> queryByGbDeviceIdsForIds(List<Integer> deviceIds);
|
||||||
|
|
||||||
@SelectProvider(type = ChannelProvider.class, method = "queryByGroupList")
|
@SelectProvider(type = ChannelProvider.class, method = "queryByGroupList")
|
||||||
List<CommonGBChannel> queryByGroupList(List<Group> groupList);
|
List<CommonGBChannel> queryByGroupList(List<Group> groupList);
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,11 @@ public interface PlatformMapper {
|
||||||
int delete(@Param("id") Integer id);
|
int delete(@Param("id") Integer id);
|
||||||
|
|
||||||
@Select(" SELECT pp.*, " +
|
@Select(" SELECT pp.*, " +
|
||||||
" (SELECT count(0) FROM wvp_platform_channel pc WHERE pc.platform_id = pp.id ) as channel_count" +
|
" ( (SELECT count(0) FROM wvp_platform_channel pc WHERE pc.platform_id = pp.id ) + " +
|
||||||
|
" (SELECT count(0) FROM wvp_platform_group pg WHERE pg.platform_id = pp.id ) * pp.catalog_with_group + " +
|
||||||
|
" (SELECT count(0) FROM wvp_platform_region pr WHERE pr.platform_id = pp.id ) * pp.catalog_with_region + " +
|
||||||
|
" pp.catalog_with_platform " +
|
||||||
|
" ) as channel_count" +
|
||||||
" FROM wvp_platform pp "
|
" FROM wvp_platform pp "
|
||||||
)
|
)
|
||||||
List<Platform> queryList();
|
List<Platform> queryList();
|
||||||
|
|
|
@ -5,7 +5,6 @@ import com.genersoft.iot.vmp.gb28181.event.alarm.AlarmEvent;
|
||||||
import com.genersoft.iot.vmp.gb28181.event.device.RequestTimeoutEvent;
|
import com.genersoft.iot.vmp.gb28181.event.device.RequestTimeoutEvent;
|
||||||
import com.genersoft.iot.vmp.gb28181.event.record.RecordEndEvent;
|
import com.genersoft.iot.vmp.gb28181.event.record.RecordEndEvent;
|
||||||
import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
|
import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
|
||||||
import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogSubscribePutEvent;
|
|
||||||
import com.genersoft.iot.vmp.gb28181.event.subscribe.mobilePosition.MobilePositionEvent;
|
import com.genersoft.iot.vmp.gb28181.event.subscribe.mobilePosition.MobilePositionEvent;
|
||||||
import com.genersoft.iot.vmp.media.event.mediaServer.MediaServerOfflineEvent;
|
import com.genersoft.iot.vmp.media.event.mediaServer.MediaServerOfflineEvent;
|
||||||
import com.genersoft.iot.vmp.media.event.mediaServer.MediaServerOnlineEvent;
|
import com.genersoft.iot.vmp.media.event.mediaServer.MediaServerOnlineEvent;
|
||||||
|
@ -106,11 +105,4 @@ public class EventPublisher {
|
||||||
outEvent.setRecordInfo(recordInfo);
|
outEvent.setRecordInfo(recordInfo);
|
||||||
applicationEventPublisher.publishEvent(outEvent);
|
applicationEventPublisher.publishEvent(outEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void catalogSubscribePutEventPublish(String platformId, SubscribeInfo subscribeInfo) {
|
|
||||||
CatalogSubscribePutEvent event = new CatalogSubscribePutEvent(this);
|
|
||||||
event.setPlatformId(platformId);
|
|
||||||
event.setSubscribeInfo(subscribeInfo);
|
|
||||||
applicationEventPublisher.publishEvent(event);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
package com.genersoft.iot.vmp.gb28181.event.subscribe.catalog;
|
|
||||||
|
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import org.springframework.context.ApplicationEvent;
|
|
||||||
|
|
||||||
public class CatalogSubscribePutEvent extends ApplicationEvent {
|
|
||||||
|
|
||||||
public CatalogSubscribePutEvent(Object source) {
|
|
||||||
super(source);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private SubscribeInfo subscribeInfo;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private String platformId;
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
package com.genersoft.iot.vmp.gb28181.event.subscribe.catalog;
|
|
||||||
|
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel;
|
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.Platform;
|
|
||||||
import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
|
|
||||||
import com.genersoft.iot.vmp.gb28181.service.IPlatformService;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.context.ApplicationListener;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@Component
|
|
||||||
public class CatalogSubscribePutEventLister implements ApplicationListener<CatalogSubscribePutEvent> {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private IPlatformService platformService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private EventPublisher eventPublisher;
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onApplicationEvent(CatalogSubscribePutEvent event) {
|
|
||||||
|
|
||||||
Platform platform = platformService.queryPlatformByServerGBId(event.getPlatformId());
|
|
||||||
if (platform == null){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CommonGBChannel channel = CommonGBChannel.build(platform);
|
|
||||||
|
|
||||||
// 发送消息
|
|
||||||
try {
|
|
||||||
// 发送catalog
|
|
||||||
eventPublisher.catalogEventPublish(platform.getId(), channel, CatalogEvent.ADD);
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.warn("[推送平台信息] 发送失败,平台{}({})", platform.getName(), platform.getServerGBId(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -30,4 +30,8 @@ public interface IPlatformChannelService {
|
||||||
List<CommonGBChannel> queryByPlatform(Platform platform);
|
List<CommonGBChannel> queryByPlatform(Platform platform);
|
||||||
|
|
||||||
void pushChannel(Integer platformId);
|
void pushChannel(Integer platformId);
|
||||||
|
|
||||||
|
void addChannelByDevice(Integer platformId, List<Integer> deviceIds);
|
||||||
|
|
||||||
|
void removeChannelByDevice(Integer platformId, List<Integer> deviceIds);
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,8 @@ public class PlatformChannelServiceImpl implements IPlatformChannelService {
|
||||||
private ISIPCommanderForPlatform sipCommanderFroPlatform;
|
private ISIPCommanderForPlatform sipCommanderFroPlatform;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageInfo<PlatformChannel> queryChannelList(int page, int count, String query, Boolean online, Integer platformId, Boolean hasShare) {
|
public PageInfo<PlatformChannel> queryChannelList(int page, int count, String query, Boolean online, Integer platformId, Boolean hasShare) {
|
||||||
PageHelper.startPage(page, count);
|
PageHelper.startPage(page, count);
|
||||||
|
@ -58,48 +60,6 @@ public class PlatformChannelServiceImpl implements IPlatformChannelService {
|
||||||
return new PageInfo<>(all);
|
return new PageInfo<>(all);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@Transactional
|
|
||||||
public int addAllChannel(Integer platformId) {
|
|
||||||
List<CommonGBChannel> channelListNotShare = platformChannelMapper.queryNotShare(platformId, null);
|
|
||||||
Assert.notEmpty(channelListNotShare, "所有通道已共享");
|
|
||||||
int result = platformChannelMapper.addChannels(platformId, channelListNotShare);
|
|
||||||
if (result > 0) {
|
|
||||||
// 查询通道相关的行政区划信息是否共享,如果没共享就添加
|
|
||||||
Set<Region> regionListNotShare = getRegionNotShareByChannelList(channelListNotShare, platformId);
|
|
||||||
if (!regionListNotShare.isEmpty()) {
|
|
||||||
int addGroupResult = platformChannelMapper.addPlatformRegion(new ArrayList<>(regionListNotShare), platformId);
|
|
||||||
if (addGroupResult > 0) {
|
|
||||||
for (Region region : regionListNotShare) {
|
|
||||||
// 分组信息排序时需要将顶层排在最后
|
|
||||||
channelListNotShare.add(0, CommonGBChannel.build(region));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 查询通道相关的分组信息是否共享,如果没共享就添加
|
|
||||||
Set<Group> groupListNotShare = getGroupNotShareByChannelList(channelListNotShare, platformId);
|
|
||||||
if (!groupListNotShare.isEmpty()) {
|
|
||||||
int addGroupResult = platformChannelMapper.addPlatformGroup(new ArrayList<>(groupListNotShare), platformId);
|
|
||||||
if (addGroupResult > 0) {
|
|
||||||
for (Group group : groupListNotShare) {
|
|
||||||
// 分组信息排序时需要将顶层排在最后
|
|
||||||
channelListNotShare.add(0, CommonGBChannel.build(group));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 发送消息
|
|
||||||
try {
|
|
||||||
// 发送catalog
|
|
||||||
eventPublisher.catalogEventPublish(platformId, channelListNotShare, CatalogEvent.ADD);
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.warn("[关联全部通道] 发送失败,数量:{}", channelListNotShare.size(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取通道使用的分组中未分享的
|
* 获取通道使用的分组中未分享的
|
||||||
*/
|
*/
|
||||||
|
@ -231,33 +191,46 @@ public class PlatformChannelServiceImpl implements IPlatformChannelService {
|
||||||
return channelList;
|
return channelList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public int addAllChannel(Integer platformId) {
|
||||||
|
List<CommonGBChannel> channelListNotShare = platformChannelMapper.queryNotShare(platformId, null);
|
||||||
|
Assert.notEmpty(channelListNotShare, "所有通道已共享");
|
||||||
|
return addChannelList(platformId, channelListNotShare);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public int addChannels(Integer platformId, List<Integer> channelIds) {
|
public int addChannels(Integer platformId, List<Integer> channelIds) {
|
||||||
List<CommonGBChannel> channelListNotShare = platformChannelMapper.queryNotShare(platformId, channelIds);
|
List<CommonGBChannel> channelListNotShare = platformChannelMapper.queryNotShare(platformId, channelIds);
|
||||||
Assert.notEmpty(channelListNotShare, "通道已共享");
|
Assert.notEmpty(channelListNotShare, "通道已共享");
|
||||||
int result = platformChannelMapper.addChannels(platformId, channelListNotShare);
|
return addChannelList(platformId, channelListNotShare);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public int addChannelList(Integer platformId, List<CommonGBChannel> channelList) {
|
||||||
|
int result = platformChannelMapper.addChannels(platformId, channelList);
|
||||||
if (result > 0) {
|
if (result > 0) {
|
||||||
// 查询通道相关的行政区划信息是否共享,如果没共享就添加
|
// 查询通道相关的行政区划信息是否共享,如果没共享就添加
|
||||||
Set<Region> regionListNotShare = getRegionNotShareByChannelList(channelListNotShare, platformId);
|
Set<Region> regionListNotShare = getRegionNotShareByChannelList(channelList, platformId);
|
||||||
if (!regionListNotShare.isEmpty()) {
|
if (!regionListNotShare.isEmpty()) {
|
||||||
int addGroupResult = platformChannelMapper.addPlatformRegion(new ArrayList<>(regionListNotShare), platformId);
|
int addGroupResult = platformChannelMapper.addPlatformRegion(new ArrayList<>(regionListNotShare), platformId);
|
||||||
if (addGroupResult > 0) {
|
if (addGroupResult > 0) {
|
||||||
for (Region region : regionListNotShare) {
|
for (Region region : regionListNotShare) {
|
||||||
// 分组信息排序时需要将顶层排在最后
|
// 分组信息排序时需要将顶层排在最后
|
||||||
channelListNotShare.add(0, CommonGBChannel.build(region));
|
channelList.add(0, CommonGBChannel.build(region));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询通道相关的分组信息是否共享,如果没共享就添加
|
// 查询通道相关的分组信息是否共享,如果没共享就添加
|
||||||
Set<Group> groupListNotShare = getGroupNotShareByChannelList(channelListNotShare, platformId);
|
Set<Group> groupListNotShare = getGroupNotShareByChannelList(channelList, platformId);
|
||||||
if (!groupListNotShare.isEmpty()) {
|
if (!groupListNotShare.isEmpty()) {
|
||||||
int addGroupResult = platformChannelMapper.addPlatformGroup(new ArrayList<>(groupListNotShare), platformId);
|
int addGroupResult = platformChannelMapper.addPlatformGroup(new ArrayList<>(groupListNotShare), platformId);
|
||||||
if (addGroupResult > 0) {
|
if (addGroupResult > 0) {
|
||||||
for (Group group : groupListNotShare) {
|
for (Group group : groupListNotShare) {
|
||||||
// 分组信息排序时需要将顶层排在最后
|
// 分组信息排序时需要将顶层排在最后
|
||||||
channelListNotShare.add(0, CommonGBChannel.build(group));
|
channelList.add(0, CommonGBChannel.build(group));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -265,9 +238,9 @@ public class PlatformChannelServiceImpl implements IPlatformChannelService {
|
||||||
// 发送消息
|
// 发送消息
|
||||||
try {
|
try {
|
||||||
// 发送catalog
|
// 发送catalog
|
||||||
eventPublisher.catalogEventPublish(platformId, channelListNotShare, CatalogEvent.ADD);
|
eventPublisher.catalogEventPublish(platformId, channelList, CatalogEvent.ADD);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.warn("[关联通道] 发送失败,数量:{}", channelListNotShare.size(), e);
|
log.warn("[关联通道] 发送失败,数量:{}", channelList.size(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -309,9 +282,20 @@ public class PlatformChannelServiceImpl implements IPlatformChannelService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public int removeChannels(Integer platformId, List<Integer> channelIds) {
|
public void addChannelByDevice(Integer platformId, List<Integer> deviceIds) {
|
||||||
List<CommonGBChannel> channelList = platformChannelMapper.queryShare(platformId, channelIds);
|
List<Integer> channelList = commonGBChannelMapper.queryByGbDeviceIdsForIds(deviceIds);
|
||||||
Assert.notEmpty(channelList, "所选通道未共享");
|
addChannels(platformId, channelList);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void removeChannelByDevice(Integer platformId, List<Integer> deviceIds) {
|
||||||
|
List<Integer> channelList = commonGBChannelMapper.queryByGbDeviceIdsForIds(deviceIds);
|
||||||
|
removeChannels(platformId, channelList);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public int removeChannelList(Integer platformId, List<CommonGBChannel> channelList) {
|
||||||
int result = platformChannelMapper.removeChannelsWithPlatform(platformId, channelList);
|
int result = platformChannelMapper.removeChannelsWithPlatform(platformId, channelList);
|
||||||
if (result > 0) {
|
if (result > 0) {
|
||||||
// 查询通道相关的分组信息
|
// 查询通道相关的分组信息
|
||||||
|
@ -342,6 +326,14 @@ public class PlatformChannelServiceImpl implements IPlatformChannelService {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public int removeChannels(Integer platformId, List<Integer> channelIds) {
|
||||||
|
List<CommonGBChannel> channelList = platformChannelMapper.queryShare(platformId, channelIds);
|
||||||
|
Assert.notEmpty(channelList, "所选通道未共享");
|
||||||
|
return removeChannelList(platformId, channelList);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public void removeChannels(List<Integer> ids) {
|
public void removeChannels(List<Integer> ids) {
|
||||||
|
@ -356,12 +348,12 @@ public class PlatformChannelServiceImpl implements IPlatformChannelService {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional
|
||||||
public void removeChannel(int channelId) {
|
public void removeChannel(int channelId) {
|
||||||
List<Platform> platformList = platformChannelMapper.queryPlatFormListByChannelId(channelId);
|
List<Platform> platformList = platformChannelMapper.queryPlatFormListByChannelId(channelId);
|
||||||
if (platformList.isEmpty()) {
|
if (platformList.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Platform platform : platformList) {
|
for (Platform platform : platformList) {
|
||||||
ArrayList<Integer> ids = new ArrayList<>();
|
ArrayList<Integer> ids = new ArrayList<>();
|
||||||
ids.add(channelId);
|
ids.add(channelId);
|
||||||
|
|
|
@ -1,14 +1,15 @@
|
||||||
package com.genersoft.iot.vmp.gb28181.service.impl;
|
package com.genersoft.iot.vmp.gb28181.service.impl;
|
||||||
|
|
||||||
import com.baomidou.dynamic.datasource.annotation.DS;
|
import com.baomidou.dynamic.datasource.annotation.DS;
|
||||||
import com.genersoft.iot.vmp.common.*;
|
|
||||||
import com.genersoft.iot.vmp.common.InviteInfo;
|
import com.genersoft.iot.vmp.common.InviteInfo;
|
||||||
|
import com.genersoft.iot.vmp.common.*;
|
||||||
import com.genersoft.iot.vmp.conf.DynamicTask;
|
import com.genersoft.iot.vmp.conf.DynamicTask;
|
||||||
import com.genersoft.iot.vmp.conf.UserSetting;
|
import com.genersoft.iot.vmp.conf.UserSetting;
|
||||||
import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
|
import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.*;
|
import com.genersoft.iot.vmp.gb28181.bean.*;
|
||||||
import com.genersoft.iot.vmp.gb28181.dao.PlatformChannelMapper;
|
import com.genersoft.iot.vmp.gb28181.dao.PlatformChannelMapper;
|
||||||
import com.genersoft.iot.vmp.gb28181.dao.PlatformMapper;
|
import com.genersoft.iot.vmp.gb28181.dao.PlatformMapper;
|
||||||
|
import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
|
||||||
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
|
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
|
||||||
import com.genersoft.iot.vmp.gb28181.service.IInviteStreamService;
|
import com.genersoft.iot.vmp.gb28181.service.IInviteStreamService;
|
||||||
import com.genersoft.iot.vmp.gb28181.service.IPlatformService;
|
import com.genersoft.iot.vmp.gb28181.service.IPlatformService;
|
||||||
|
@ -96,6 +97,8 @@ public class PlatformServiceImpl implements IPlatformService {
|
||||||
@Autowired
|
@Autowired
|
||||||
private PlatformChannelMapper platformChannelMapper;
|
private PlatformChannelMapper platformChannelMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private EventPublisher eventPublisher;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流离开的处理
|
* 流离开的处理
|
||||||
|
@ -147,7 +150,6 @@ public class PlatformServiceImpl implements IPlatformService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Platform queryPlatformByServerGBId(String platformGbId) {
|
public Platform queryPlatformByServerGBId(String platformGbId) {
|
||||||
return platformMapper.getParentPlatByServerGBId(platformGbId);
|
return platformMapper.getParentPlatByServerGBId(platformGbId);
|
||||||
|
|
|
@ -12,6 +12,7 @@ import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.ObjectUtils;
|
import org.springframework.util.ObjectUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,12 +49,15 @@ public class StreamProxyPlayServiceImpl implements IStreamProxyPlayService {
|
||||||
mediaServer = mediaServerService.getMediaServerForMinimumLoad(null);
|
mediaServer = mediaServerService.getMediaServerForMinimumLoad(null);
|
||||||
}else {
|
}else {
|
||||||
mediaServer = mediaServerService.getOne(mediaServerId);
|
mediaServer = mediaServerService.getOne(mediaServerId);
|
||||||
|
if (mediaServer == null) {
|
||||||
|
mediaServer = mediaServerService.getMediaServerForMinimumLoad(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (mediaServer == null) {
|
if (mediaServer == null) {
|
||||||
throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到可用的媒体节点");
|
throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到可用的媒体节点");
|
||||||
}
|
}
|
||||||
StreamInfo streamInfo = mediaServerService.startProxy(mediaServer, streamProxy);
|
StreamInfo streamInfo = mediaServerService.startProxy(mediaServer, streamProxy);
|
||||||
if (mediaServerId == null) {
|
if (mediaServerId == null || !mediaServerId.equals(mediaServer.getId())) {
|
||||||
streamProxy.setMediaServerId(mediaServer.getId());
|
streamProxy.setMediaServerId(mediaServer.getId());
|
||||||
streamProxyMapper.update(streamProxy);
|
streamProxyMapper.update(streamProxy);
|
||||||
}
|
}
|
||||||
|
@ -72,15 +76,12 @@ public class StreamProxyPlayServiceImpl implements IStreamProxyPlayService {
|
||||||
@Override
|
@Override
|
||||||
public void stopProxy(StreamProxy streamProxy){
|
public void stopProxy(StreamProxy streamProxy){
|
||||||
|
|
||||||
MediaServer mediaServer;
|
|
||||||
String mediaServerId = streamProxy.getMediaServerId();
|
String mediaServerId = streamProxy.getMediaServerId();
|
||||||
if (mediaServerId == null) {
|
Assert.notNull(mediaServerId, "代理节点不存在");
|
||||||
mediaServer = mediaServerService.getMediaServerForMinimumLoad(null);
|
|
||||||
}else {
|
MediaServer mediaServer = mediaServerService.getOne(mediaServerId);
|
||||||
mediaServer = mediaServerService.getOne(mediaServerId);
|
|
||||||
}
|
|
||||||
if (mediaServer == null) {
|
if (mediaServer == null) {
|
||||||
throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到可用的媒体节点");
|
throw new ControllerException(ErrorCode.ERROR100.getCode(), "媒体节点不存在");
|
||||||
}
|
}
|
||||||
if (ObjectUtils.isEmpty(streamProxy.getStreamKey())) {
|
if (ObjectUtils.isEmpty(streamProxy.getStreamKey())) {
|
||||||
mediaServerService.closeStreams(mediaServer, streamProxy.getApp(), streamProxy.getStream());
|
mediaServerService.closeStreams(mediaServer, streamProxy.getApp(), streamProxy.getStream());
|
||||||
|
|
|
@ -19,12 +19,12 @@
|
||||||
:value="item.id">
|
:value="item.id">
|
||||||
</el-option>
|
</el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
推流状态:
|
拉流状态:
|
||||||
<el-select size="mini" style="margin-right: 1rem;" @change="getStreamProxyList" v-model="pulling" placeholder="请选择"
|
<el-select size="mini" style="margin-right: 1rem;" @change="getStreamProxyList" v-model="pulling" placeholder="请选择"
|
||||||
default-first-option>
|
default-first-option>
|
||||||
<el-option label="全部" value=""></el-option>
|
<el-option label="全部" value=""></el-option>
|
||||||
<el-option label="正在拉流" value="true"></el-option>
|
<el-option label="正在拉流" value="true"></el-option>
|
||||||
<el-option label="拉流未进行" value="false"></el-option>
|
<el-option label="尚未拉流" value="false"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
<el-button icon="el-icon-plus" size="mini" style="margin-right: 1rem;" type="primary" @click="addStreamProxy">添加代理</el-button>
|
<el-button icon="el-icon-plus" size="mini" style="margin-right: 1rem;" type="primary" @click="addStreamProxy">添加代理</el-button>
|
||||||
<el-button v-if="false" icon="el-icon-search" size="mini" style="margin-right: 1rem;" type="primary" @click="addOnvif">搜索ONVIF</el-button>
|
<el-button v-if="false" icon="el-icon-search" size="mini" style="margin-right: 1rem;" type="primary" @click="addOnvif">搜索ONVIF</el-button>
|
||||||
|
@ -58,8 +58,8 @@
|
||||||
<el-table-column label="拉流状态" min-width="120" >
|
<el-table-column label="拉流状态" min-width="120" >
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<div slot="reference" class="name-wrapper">
|
<div slot="reference" class="name-wrapper">
|
||||||
<el-tag size="medium" v-if="scope.row.pulling">在线</el-tag>
|
<el-tag size="medium" v-if="scope.row.pulling">正在拉流</el-tag>
|
||||||
<el-tag size="medium" type="info" v-if="!scope.row.pulling">离线</el-tag>
|
<el-tag size="medium" type="info" v-if="!scope.row.pulling">尚未拉流</el-tag>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
@ -72,7 +72,7 @@
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="createTime" label="创建时间" min-width="150" show-overflow-tooltip/>
|
<el-table-column prop="createTime" label="创建时间" min-width="150" show-overflow-tooltip/>
|
||||||
<el-table-column label="操作" width="360" fixed="right">
|
<el-table-column label="操作" width="400" fixed="right">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button size="medium" icon="el-icon-video-play" type="text" @click="play(scope.row)">播放</el-button>
|
<el-button size="medium" icon="el-icon-video-play" type="text" @click="play(scope.row)">播放</el-button>
|
||||||
<el-divider direction="vertical"></el-divider>
|
<el-divider direction="vertical"></el-divider>
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
:close-on-click-modal="false"
|
:close-on-click-modal="false"
|
||||||
:visible.sync="showDialog"
|
:visible.sync="showDialog"
|
||||||
:destroy-on-close="true"
|
:destroy-on-close="true"
|
||||||
|
append-to-body
|
||||||
@close="close()"
|
@close="close()"
|
||||||
>
|
>
|
||||||
<div class="page-header" style="width: 100%">
|
<div class="page-header" style="width: 100%">
|
||||||
|
|
|
@ -35,6 +35,8 @@
|
||||||
<el-button v-if="hasShare ==='true'" size="mini" type="danger" @click="remove()">
|
<el-button v-if="hasShare ==='true'" size="mini" type="danger" @click="remove()">
|
||||||
移除
|
移除
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button size="mini" @click="addByDevice()">按设备添加</el-button>
|
||||||
|
<el-button size="mini" @click="removeByDevice()">按设备移除</el-button>
|
||||||
<el-button size="mini" @click="addAll()">全部添加</el-button>
|
<el-button size="mini" @click="addAll()">全部添加</el-button>
|
||||||
<el-button size="mini" @click="removeAll()">全部移除</el-button>
|
<el-button size="mini" @click="removeAll()">全部移除</el-button>
|
||||||
<el-button size="mini" @click="getChannelList()">刷新</el-button>
|
<el-button size="mini" @click="getChannelList()">刷新</el-button>
|
||||||
|
@ -87,15 +89,17 @@
|
||||||
layout="total, sizes, prev, pager, next"
|
layout="total, sizes, prev, pager, next"
|
||||||
:total="total">
|
:total="total">
|
||||||
</el-pagination>
|
</el-pagination>
|
||||||
|
<gbDeviceSelect ref="gbDeviceSelect"></gbDeviceSelect>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
|
import gbDeviceSelect from "./GbDeviceSelect.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'shareChannelAdd',
|
name: 'shareChannelAdd',
|
||||||
components: {},
|
components: {gbDeviceSelect},
|
||||||
props: [ 'platformId'],
|
props: [ 'platformId'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@ -254,11 +258,78 @@ export default {
|
||||||
});
|
});
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
addByDevice: function (row) {
|
||||||
|
this.$refs.gbDeviceSelect.openDialog((rows)=>{
|
||||||
|
let deviceIds = []
|
||||||
|
for (let i = 0; i < rows.length; i++) {
|
||||||
|
deviceIds.push(rows[i].id)
|
||||||
|
}
|
||||||
|
this.$axios({
|
||||||
|
method: 'post',
|
||||||
|
url: `/api/platform/channel/device/add`,
|
||||||
|
data: {
|
||||||
|
platformId: this.platformId,
|
||||||
|
deviceIds: deviceIds,
|
||||||
|
}
|
||||||
|
}).then((res)=> {
|
||||||
|
if (res.data.code === 0) {
|
||||||
|
this.$message.success({
|
||||||
|
showClose: true,
|
||||||
|
message: "保存成功"
|
||||||
|
})
|
||||||
|
this.initData()
|
||||||
|
}else {
|
||||||
|
this.$message.error({
|
||||||
|
showClose: true,
|
||||||
|
message: res.data.msg
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}).catch((error)=> {
|
||||||
|
this.$message.error({
|
||||||
|
showClose: true,
|
||||||
|
message: error
|
||||||
|
})
|
||||||
|
this.loading = false
|
||||||
|
});
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
removeByDevice: function (row) {
|
||||||
|
this.$refs.gbDeviceSelect.openDialog((rows)=>{
|
||||||
|
let deviceIds = []
|
||||||
|
for (let i = 0; i < rows.length; i++) {
|
||||||
|
deviceIds.push(rows[i].id)
|
||||||
|
}
|
||||||
|
this.$axios({
|
||||||
|
method: 'post',
|
||||||
|
url: `/api/platform/channel/device/remove`,
|
||||||
|
data: {
|
||||||
|
platformId: this.platformId,
|
||||||
|
deviceIds: deviceIds,
|
||||||
|
}
|
||||||
|
}).then((res)=> {
|
||||||
|
if (res.data.code === 0) {
|
||||||
|
this.$message.success({
|
||||||
|
showClose: true,
|
||||||
|
message: "保存成功"
|
||||||
|
})
|
||||||
|
this.initData()
|
||||||
|
}else {
|
||||||
|
this.$message.error({
|
||||||
|
showClose: true,
|
||||||
|
message: res.data.msg
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}).catch((error)=> {
|
||||||
|
this.$message.error({
|
||||||
|
showClose: true,
|
||||||
|
message: error
|
||||||
|
})
|
||||||
|
this.loading = false
|
||||||
|
});
|
||||||
|
})
|
||||||
},
|
},
|
||||||
remove: function (row) {
|
remove: function (row) {
|
||||||
let channels = []
|
let channels = []
|
||||||
|
|
Loading…
Reference in New Issue