diff --git a/pom.xml b/pom.xml index 987e76e9..9331de3b 100644 --- a/pom.xml +++ b/pom.xml @@ -155,7 +155,6 @@ 1.7.35 - org.dom4j @@ -212,6 +211,13 @@ 3.0.4 + + + com.github.oshi + oshi-core + 6.1.0 + + org.springframework.session spring-session-core @@ -271,5 +277,16 @@ + + + src/main/resources + + + src/main/java + + **/*.xml + + + diff --git a/src/main/java/com/genersoft/iot/vmp/common/SystemInfoDto.java b/src/main/java/com/genersoft/iot/vmp/common/SystemInfoDto.java new file mode 100644 index 00000000..81a93acf --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/common/SystemInfoDto.java @@ -0,0 +1,22 @@ +package com.genersoft.iot.vmp.common; + +public class SystemInfoDto { + private String time; + private T data; + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java index ffbed508..923e411e 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java +++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java @@ -60,7 +60,13 @@ public class VideoManagerConstants { public static final String SIP_SN_PREFIX = "VMP_SIP_SN_"; - public static final String SIP_SUBSCRIBE_PREFIX = "SIP_SUBSCRIBE_"; + public static final String SIP_SUBSCRIBE_PREFIX = "VMP_SIP_SUBSCRIBE_"; + + public static final String SYSTEM_INFO_CPU_PREFIX = "VMP_SYSTEM_INFO_CPU_"; + + public static final String SYSTEM_INFO_MEM_PREFIX = "VMP_SYSTEM_INFO_MEM_"; + + public static final String SYSTEM_INFO_NET_PREFIX = "VMP_SYSTEM_INFO_NET_"; //************************** redis 消息********************************* public static final String WVP_MSG_STREAM_CHANGE_PREFIX = "WVP_MSG_STREAM_CHANGE_"; diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SystemInfoTimerTask.java b/src/main/java/com/genersoft/iot/vmp/conf/SystemInfoTimerTask.java new file mode 100644 index 00000000..13ec6927 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/conf/SystemInfoTimerTask.java @@ -0,0 +1,34 @@ +package com.genersoft.iot.vmp.conf; + +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import com.genersoft.iot.vmp.utils.SystemInfoUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * 获取系统信息写入redis + */ +@Component +public class SystemInfoTimerTask { + + @Autowired + private IRedisCatchStorage redisCatchStorage; + + @Scheduled(fixedRate = 1000) //每1秒执行一次 + public void execute(){ + try { + double cpuInfo = SystemInfoUtils.getCpuInfo(); + redisCatchStorage.addCpuInfo(cpuInfo); + double memInfo = SystemInfoUtils.getMemInfo(); + redisCatchStorage.addMemInfo(memInfo); + Map networkInterfaces = SystemInfoUtils.getNetworkInterfaces(); + redisCatchStorage.addNetInfo(networkInterfaces); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java index 426e2e58..8c8565be 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java @@ -131,7 +131,7 @@ public class EventPublisher { } @Async - public void catalogEventPublishForStream(String platformId, List gbStreams, String type) { + public void catalogEventPublishForStream(String platformId, GbStream[] gbStreams, String type) { CatalogEvent outEvent = new CatalogEvent(this); outEvent.setGbStreams(gbStreams); outEvent.setType(type); @@ -141,8 +141,7 @@ public class EventPublisher { @Async public void catalogEventPublishForStream(String platformId, GbStream gbStream, String type) { - List gbStreamList = new ArrayList<>(); - gbStreamList.add(gbStream); - catalogEventPublishForStream(platformId, gbStreamList, type); + GbStream[] gbStreams = {gbStream}; + catalogEventPublishForStream(platformId, gbStreams, type); } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEvent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEvent.java index c035b808..e343fec7 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEvent.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEvent.java @@ -20,7 +20,7 @@ public class CatalogEvent extends ApplicationEvent { public static final String UPDATE = "UPDATE"; // 更新 private List deviceChannels; - private List gbStreams; + private GbStream[] gbStreams; private String type; private String platformId; @@ -48,11 +48,11 @@ public class CatalogEvent extends ApplicationEvent { this.platformId = platformId; } - public List getGbStreams() { + public GbStream[] getGbStreams() { return gbStreams; } - public void setGbStreams(List gbStreams) { + public void setGbStreams(GbStream[] gbStreams) { this.gbStreams = gbStreams; } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java index 52442cc7..997031b6 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java @@ -94,7 +94,7 @@ public class CatalogEventLister implements ApplicationListener { if (event.getDeviceChannels() != null) { deviceChannelList.addAll(event.getDeviceChannels()); } - if (event.getGbStreams() != null && event.getGbStreams().size() > 0){ + if (event.getGbStreams() != null && event.getGbStreams().length > 0){ for (GbStream gbStream : event.getGbStreams()) { DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), parentPlatform.getDeviceGBId()); deviceChannelList.add(deviceChannelByStream); @@ -134,7 +134,7 @@ public class CatalogEventLister implements ApplicationListener { if (event.getDeviceChannels() != null) { deviceChannelList.addAll(event.getDeviceChannels()); } - if (event.getGbStreams() != null && event.getGbStreams().size() > 0){ + if (event.getGbStreams() != null && event.getGbStreams().length > 0){ for (GbStream gbStream : event.getGbStreams()) { DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), parentPlatform.getDeviceGBId()); deviceChannelList.add(deviceChannelByStream); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java index 0b1a5722..de2a9086 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java @@ -96,7 +96,6 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple if (channelReduces.size() > 0) { for (ChannelReduce channelReduce : channelReduces) { DeviceChannel deviceChannel = storager.queryChannel(channelReduce.getDeviceId(), channelReduce.getChannelId()); - // TODO 目前暂时认为这里只用通道没有目录 deviceChannel.setParental(0); deviceChannel.setParentId(channelReduce.getCatalogId()); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index 6e6b7b50..34ee4a86 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -371,7 +371,7 @@ public class ZLMHttpHookListener { } } if (gbStreams.size() > 0) { - eventPublisher.catalogEventPublishForStream(null, gbStreams, CatalogEvent.ON); + eventPublisher.catalogEventPublishForStream(null, gbStreams.toArray(new GbStream[0]), CatalogEvent.ON); } }else { diff --git a/src/main/java/com/genersoft/iot/vmp/service/IGbStreamService.java b/src/main/java/com/genersoft/iot/vmp/service/IGbStreamService.java index a48bfb50..1a851d70 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IGbStreamService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IGbStreamService.java @@ -17,7 +17,7 @@ public interface IGbStreamService { * @param count * @return */ - PageInfo getAll(Integer page, Integer count, String platFormId); + PageInfo getAll(Integer page, Integer count, String platFormId, String catalogId,String query,Boolean pushing,String mediaServerId); /** @@ -43,4 +43,5 @@ public interface IGbStreamService { DeviceChannel getDeviceChannelListByStream(GbStream gbStream, String catalogId, String deviceGBId); void sendCatalogMsg(GbStream gbStream, String type); + void sendCatalogMsgs(List gbStreams, String type); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java b/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java index 8a09de7b..1d57d468 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java @@ -30,11 +30,9 @@ public interface IStreamPushService { /** * 获取 - * @param page - * @param count - * @return */ - PageInfo getPushList(Integer page, Integer count); + PageInfo getPushList(Integer page, Integer count, String query, Boolean pushing, String mediaServerId); + List getPushList(String mediaSererId); StreamPushItem transform(MediaItem item); @@ -68,4 +66,8 @@ public interface IStreamPushService { boolean saveToRandomGB(); void batchAdd(List streamPushExcelDtoList); + + boolean batchStop(List streamPushItems); + + void batchAddForUpload(String platformId, String catalogId, List streamPushItems); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java index ee7a80b1..58279850 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java @@ -20,6 +20,7 @@ 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.ArrayList; import java.util.List; @@ -51,9 +52,9 @@ public class GbStreamServiceImpl implements IGbStreamService { private EventPublisher eventPublisher; @Override - public PageInfo getAll(Integer page, Integer count, String platFormId) { + public PageInfo getAll(Integer page, Integer count, String platFormId, String catalogId, String query, Boolean pushing, String mediaServerId) { PageHelper.startPage(page, count); - List all = gbStreamMapper.selectAll(platFormId); + List all = gbStreamMapper.selectAll(platFormId, catalogId, query, pushing, mediaServerId); return new PageInfo<>(all); } @@ -69,6 +70,7 @@ public class GbStreamServiceImpl implements IGbStreamService { boolean result = false; TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); ParentPlatform parentPlatform = platformMapper.getParentPlatByServerGBId(platformId); + if (catalogId == null) catalogId = parentPlatform.getCatalogId(); try { List deviceChannelList = new ArrayList<>(); for (GbStream gbStream : gbStreams) { @@ -144,8 +146,16 @@ public class GbStreamServiceImpl implements IGbStreamService { gbStreams.add(streamProxyItem); } } + sendCatalogMsgs(gbStreams, type); + } + + @Override + public void sendCatalogMsgs(List gbStreams, String type) { if (gbStreams.size() > 0) { for (GbStream gs : gbStreams) { + if (StringUtils.isEmpty(gs.getGbId())){ + continue; + } List parentPlatforms = platformGbStreamMapper.selectByAppAndStream(gs.getApp(), gs.getStream()); if (parentPlatforms.size() > 0) { for (ParentPlatform parentPlatform : parentPlatforms) { diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java index 9e5221bc..fcb52070 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java @@ -86,8 +86,8 @@ public class MediaServiceImpl implements IMediaService { if (mediaInfo.getRtspSSLPort() != 0) { streamInfoResult.setRtsps(String.format("rtsps://%s:%s/%s/%s", addr, mediaInfo.getRtspSSLPort(), app, stream)); } - streamInfoResult.setFlv(String.format("http://%s:%s/%s/%s.flv", addr, mediaInfo.getHttpPort(), app, stream)); - streamInfoResult.setWs_flv(String.format("ws://%s:%s/%s/%s.flv", addr, mediaInfo.getHttpPort(), app, stream)); + streamInfoResult.setFlv(String.format("http://%s:%s/%s/%s.live.flv", addr, mediaInfo.getHttpPort(), app, stream)); + streamInfoResult.setWs_flv(String.format("ws://%s:%s/%s/%s.live.flv", addr, mediaInfo.getHttpPort(), app, stream)); streamInfoResult.setHls(String.format("http://%s:%s/%s/%s/hls.m3u8", addr, mediaInfo.getHttpPort(), app, stream)); streamInfoResult.setWs_hls(String.format("ws://%s:%s/%s/%s/hls.m3u8", addr, mediaInfo.getHttpPort(), app, stream)); streamInfoResult.setFmp4(String.format("http://%s:%s/%s/%s.live.mp4", addr, mediaInfo.getHttpPort(), app, stream)); @@ -95,8 +95,8 @@ public class MediaServiceImpl implements IMediaService { streamInfoResult.setTs(String.format("http://%s:%s/%s/%s.live.ts", addr, mediaInfo.getHttpPort(), app, stream)); streamInfoResult.setWs_ts(String.format("ws://%s:%s/%s/%s.live.ts", addr, mediaInfo.getHttpPort(), app, stream)); if (mediaInfo.getHttpSSlPort() != 0) { - streamInfoResult.setHttps_flv(String.format("https://%s:%s/%s/%s.flv", addr, mediaInfo.getHttpSSlPort(), app, stream)); - streamInfoResult.setWss_flv(String.format("wss://%s:%s/%s/%s.flv", addr, mediaInfo.getHttpSSlPort(), app, stream)); + streamInfoResult.setHttps_flv(String.format("https://%s:%s/%s/%s.live.flv", addr, mediaInfo.getHttpSSlPort(), app, stream)); + streamInfoResult.setWss_flv(String.format("wss://%s:%s/%s/%s.live.flv", addr, mediaInfo.getHttpSSlPort(), app, stream)); streamInfoResult.setHttps_hls(String.format("https://%s:%s/%s/%s/hls.m3u8", addr, mediaInfo.getHttpSSlPort(), app, stream)); streamInfoResult.setWss_hls(String.format("wss://%s:%s/%s/%s/hls.m3u8", addr, mediaInfo.getHttpSSlPort(), app, stream)); streamInfoResult.setHttps_fmp4(String.format("https://%s:%s/%s/%s.live.mp4", addr, mediaInfo.getHttpSSlPort(), app, stream)); diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java index 948c61ad..ff31d8a7 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java @@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.conf.UserSetup; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.bean.GbStream; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; +import com.genersoft.iot.vmp.gb28181.bean.PlatformCatalog; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; @@ -18,10 +19,7 @@ import com.genersoft.iot.vmp.service.IGbStreamService; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.IStreamPushService; 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.PlatformGbStreamMapper; -import com.genersoft.iot.vmp.storager.dao.StreamPushMapper; +import com.genersoft.iot.vmp.storager.dao.*; import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -43,6 +41,9 @@ public class StreamPushServiceImpl implements IStreamPushService { @Autowired private ParentPlatformMapper parentPlatformMapper; + @Autowired + private PlatformCatalogMapper platformCatalogMapper; + @Autowired private PlatformGbStreamMapper platformGbStreamMapper; @@ -95,13 +96,12 @@ public class StreamPushServiceImpl implements IStreamPushService { streamPushItem.setMediaServerId(item.getMediaServerId()); streamPushItem.setStream(item.getStream()); streamPushItem.setAliveSecond(item.getAliveSecond()); - streamPushItem.setCreateStamp(item.getCreateStamp()); streamPushItem.setOriginSock(item.getOriginSock()); streamPushItem.setTotalReaderCount(item.getTotalReaderCount()); streamPushItem.setOriginType(item.getOriginType()); streamPushItem.setOriginTypeStr(item.getOriginTypeStr()); streamPushItem.setOriginUrl(item.getOriginUrl()); - streamPushItem.setCreateStamp(item.getCreateStamp()); + streamPushItem.setCreateStamp(item.getCreateStamp() * 1000); streamPushItem.setAliveSecond(item.getAliveSecond()); streamPushItem.setStatus(true); streamPushItem.setStreamType("push"); @@ -110,9 +110,9 @@ public class StreamPushServiceImpl implements IStreamPushService { } @Override - public PageInfo getPushList(Integer page, Integer count) { + public PageInfo getPushList(Integer page, Integer count, String query, Boolean pushing, String mediaServerId) { PageHelper.startPage(page, count); - List all = streamPushMapper.selectAll(); + List all = streamPushMapper.selectAllForList(query, pushing, mediaServerId); return new PageInfo<>(all); } @@ -355,8 +355,47 @@ public class StreamPushServiceImpl implements IStreamPushService { } } } + } + } + + @Override + public void batchAddForUpload(String platformId, String catalogId, List streamPushItems) { + streamPushMapper.addAll(streamPushItems); + gbStreamMapper.batchAdd(streamPushItems); + if (platformId != null) { + ParentPlatform platform = parentPlatformMapper.getParentPlatByServerGBId(platformId); + if (platform != null) { + if (catalogId == null) { + catalogId = platform.getCatalogId(); + }else { + PlatformCatalog catalog = platformCatalogMapper.select(catalogId); + if (catalog == null) { + return; + } + } + platformGbStreamMapper.batchAdd(platformId, catalogId, streamPushItems); + eventPublisher.catalogEventPublishForStream(platformId, streamPushItems.toArray(new GbStream[0]), CatalogEvent.ADD); + } + } + } + + @Override + public boolean batchStop(List gbStreams) { + if (gbStreams == null || gbStreams.size() == 0) { + return false; + } + gbStreamService.sendCatalogMsgs(gbStreams, CatalogEvent.DEL); + int delStream = streamPushMapper.delAllForGbStream(gbStreams); + gbStreamMapper.batchDelForGbStream(gbStreams); + platformGbStreamMapper.delByGbStreams(gbStreams); + if (delStream > 0) { + for (GbStream gbStream : gbStreams) { + MediaServerItem mediaServerItem = mediaServerService.getOne(gbStream.getMediaServerId()); + zlmresTfulUtils.closeStreams(mediaServerItem, gbStream.getApp(), gbStream.getStream()); + } } + return true; } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java index 586b5b49..2f947097 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java @@ -7,10 +7,7 @@ import com.genersoft.iot.vmp.service.IStreamPushService; import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto; import org.springframework.util.StringUtils; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class StreamPushUploadFileHandler extends AnalysisEventListener { @@ -18,10 +15,13 @@ public class StreamPushUploadFileHandler extends AnalysisEventListener streamPushItems = new ArrayList<>(); + private Map streamPushItemsForPlatform = new HashMap<>(); private Set streamPushStreamSet = new HashSet<>(); private Set streamPushGBSet = new HashSet<>(); private List errorStreamList = new ArrayList<>(); private List errorGBList = new ArrayList<>(); + // 读取数量计数器 + private int loadedSize = 0; public StreamPushUploadFileHandler(IStreamPushService pushService, String defaultMediaServerId, ErrorDataHandler errorDataHandler) { this.pushService = pushService; @@ -33,6 +33,16 @@ public class StreamPushUploadFileHandler extends AnalysisEventListener streams, List gbId); } + private class UploadData{ + public String platformId; + public Map> catalogData = new HashMap<>(); + public List streamPushItems = new ArrayList<>(); + + public UploadData(String platformId) { + this.platformId = platformId; + } + } + @Override public void invoke(StreamPushExcelDto streamPushExcelDto, AnalysisContext analysisContext) { if (StringUtils.isEmpty(streamPushExcelDto.getApp()) @@ -43,10 +53,10 @@ public class StreamPushUploadFileHandler extends AnalysisEventListener streamPushItems = uploadData.catalogData.get(streamPushExcelDto.getCatalogId()); + if (streamPushItems == null) { + streamPushItems = new ArrayList<>(); + uploadData.catalogData.put(streamPushExcelDto.getCatalogId(), streamPushItems); + } + streamPushItems.add(streamPushItem); + }else { + uploadData.streamPushItems.add(streamPushItem); + } + + } + streamPushGBSet.add(streamPushExcelDto.getGbId()); streamPushStreamSet.add(streamPushExcelDto.getApp()+streamPushExcelDto.getStream()); - if (streamPushItems.size() > 300) { - pushService.batchAdd(streamPushItems); - // 存储完成清理 list + loadedSize ++; + if (loadedSize > 1000) { + saveData(); streamPushItems.clear(); + streamPushItemsForPlatform.clear(); + loadedSize = 0; } + } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { // 这里也要保存数据,确保最后遗留的数据也存储到数据库 - if (streamPushItems.size() > 0) { - pushService.batchAdd(streamPushItems); - } + saveData(); streamPushGBSet.clear(); streamPushStreamSet.clear(); errorDataHandler.handle(errorStreamList, errorGBList); } + + private void saveData(){ + if (streamPushItems.size() > 0) { + pushService.batchAddForUpload(null, null, streamPushItems); + } + // 处理已分配到平台的流 + if (streamPushItemsForPlatform.size() > 0){ + for (String platformId : streamPushItemsForPlatform.keySet()) { + UploadData uploadData = streamPushItemsForPlatform.get(platformId); + if (uploadData.streamPushItems.size() > 0) { + pushService.batchAddForUpload(platformId, null, uploadData.streamPushItems); + } + if (uploadData.catalogData.size() > 0) { + for (String catalogId : uploadData.catalogData.keySet()) { + if (uploadData.catalogData.get(catalogId).size() > 0) { + pushService.batchAddForUpload(platformId, catalogId, uploadData.catalogData.get(catalogId)); + } + } + } + } + } + } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java index bf2104c7..edd6cbc0 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java @@ -214,4 +214,10 @@ public interface IRedisCatchStorage { List getAllSubscribe(); List getAllSubscribePlatform(); + + void addCpuInfo(double cpuInfo); + + void addMemInfo(double memInfo); + + void addNetInfo(Map networkInterfaces); } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java index 5e2745a6..abcb1f4e 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java @@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; +import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import com.github.pagehelper.PageInfo; @@ -93,6 +94,13 @@ public interface IVideoManagerStorager { public List queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String query, Boolean hasSubChannel, Boolean online, int start, int limit); + /** + * 获取某个设备的通道树 + * @param deviceId 设备ID + * @return + */ + List tree(String deviceId); + /** * 获取某个设备的通道列表 * @@ -231,7 +239,7 @@ public interface IVideoManagerStorager { /** * 查询通道信息,不区分设备(已关联平台或全部) */ - PageInfo queryAllChannelList(int page, int count, String query, Boolean online, Boolean channelType, String platformId, Boolean inPlatform); + PageInfo queryAllChannelList(int page, int count, String query, Boolean online, Boolean channelType, String platformId, String catalogId); /** * 查询设备的通道信息 diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java index 7f52f797..32dd7df5 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.storager.dao; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; +import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; @@ -92,28 +93,31 @@ public interface DeviceChannelMapper { void startPlay(String deviceId, String channelId, String streamId); + @Select(value = {" "}) - - List queryChannelListInAll(String query, Boolean online, Boolean hasSubChannel, String platformId, Boolean inPlatform); + List queryChannelListInAll(String query, Boolean online, Boolean hasSubChannel, String platformId, String catalogId); @Select("SELECT * FROM device_channel WHERE channelId=#{channelId}") List queryChannelByChannelId( String channelId); @@ -201,4 +205,20 @@ public interface DeviceChannelMapper { @Select("SELECT * FROM device_channel WHERE deviceId=#{deviceId} AND status=1") List queryOnlineChannelsByDeviceId(String deviceId); + + @Select(" SELECT\n" + + " channelId,\n" + + " channelId as id,\n" + + " deviceId,\n" + + " parentId,\n" + + " status,\n" + + " name as title,\n" + + " channelId as \"value\",\n" + + " channelId as \"key\",\n" + + " channelId,\n" + + " longitude,\n" + + " latitude\n" + + " from device_channel\n" + + " where deviceId = #{deviceId}") + List tree(String deviceId); } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java index fade54bb..5d59e2ec 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java @@ -37,10 +37,20 @@ public interface GbStreamMapper { @Delete("DELETE FROM gb_stream WHERE app=#{app} AND stream=#{stream}") int del(String app, String stream); - @Select("SELECT gs.*, pgs.platformId AS platformId, pgs.catalogId AS catalogId FROM gb_stream gs " + - "LEFT JOIN platform_gb_stream pgs ON gs.app = pgs.app AND gs.stream = pgs.stream AND (pgs.platformId = #{platformId} OR pgs.platformId is null)" + - "order by gs.id asc ") - List selectAll(String platformId); + @Select("") + List selectAll(String platformId, String catalogId, String query, Boolean pushing, String mediaServerId); @Select("SELECT * FROM gb_stream WHERE app=#{app} AND stream=#{stream}") StreamProxyItem selectOne(String app, String stream); @@ -84,6 +94,14 @@ public interface GbStreamMapper { "") void batchDel(List streamProxyItemList); + @Delete("") + void batchDelForGbStream(List gbStreams); + @Insert("") + int batchAdd(String platformId, String catalogId, List streamPushItems); + @Delete("DELETE FROM platform_gb_stream WHERE app=#{app} AND stream=#{stream}") int delByAppAndStream(String app, String stream); @@ -32,8 +44,7 @@ public interface PlatformGbStreamMapper { "LEFT JOIN parent_platform pp ON pp.serverGBId = pgs.platformId " + "WHERE " + "pgs.app =#{app} " + - "AND pgs.stream =#{stream} " + - "GROUP BY pp.serverGBId") + "AND pgs.stream =#{stream} ") List selectByAppAndStream(String app, String stream); @Select("SELECT pgs.*, gs.gbId FROM platform_gb_stream pgs " + @@ -75,4 +86,15 @@ public interface PlatformGbStreamMapper { @Delete("DELETE FROM platform_gb_stream WHERE app=#{app} AND stream=#{stream} AND platformId=#{platformId}") int delByAppAndStreamAndPlatform(String app, String stream, String platformId); + + @Delete("") + void delByGbStreams(List gbStreams); + + + } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java index 08b7c827..3379c9fd 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.storager.dao; +import com.genersoft.iot.vmp.gb28181.bean.GbStream; import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; @@ -48,6 +49,33 @@ public interface StreamPushMapper { "") int delAll(List streamPushItems); + @Delete("") + int delAllForGbStream(List gbStreams); + + + @Select(value = {" "}) + List selectAllForList(String query, Boolean pushing, String mediaServerId); + @Select("SELECT st.*, pgs.gbId, pgs.status, pgs.name, pgs.longitude, pgs.latitude FROM stream_push st LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream order by st.createStamp desc") List selectAll(); diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java index 56789d92..92fdf6c5 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java @@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.storager.impl; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.common.SystemInfoDto; import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.conf.UserSetup; import com.genersoft.iot.vmp.gb28181.bean.*; @@ -534,4 +535,49 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { } return result; } + + @Override + public void addCpuInfo(double cpuInfo) { + String key = VideoManagerConstants.SYSTEM_INFO_CPU_PREFIX + userSetup.getServerId(); + SystemInfoDto systemInfoDto = new SystemInfoDto<>(); + systemInfoDto.setTime(format.format(System.currentTimeMillis())); + systemInfoDto.setData(cpuInfo); + redis.lSet(key, systemInfoDto); + // 每秒一个,最多只存30个 + if (redis.lGetListSize(key) > 30) { + for (int i = 0; i < redis.lGetListSize(key) - 30; i++) { + redis.lLeftPop(key); + } + } + } + + @Override + public void addMemInfo(double memInfo) { + String key = VideoManagerConstants.SYSTEM_INFO_MEM_PREFIX + userSetup.getServerId(); + SystemInfoDto systemInfoDto = new SystemInfoDto<>(); + systemInfoDto.setTime(format.format(System.currentTimeMillis())); + systemInfoDto.setData(memInfo); + redis.lSet(key, systemInfoDto); + // 每秒一个,最多只存30个 + if (redis.lGetListSize(key) > 30) { + for (int i = 0; i < redis.lGetListSize(key) - 30; i++) { + redis.lLeftPop(key); + } + } + } + + @Override + public void addNetInfo(Map networkInterfaces) { + String key = VideoManagerConstants.SYSTEM_INFO_NET_PREFIX + userSetup.getServerId(); + SystemInfoDto> systemInfoDto = new SystemInfoDto<>(); + systemInfoDto.setTime(format.format(System.currentTimeMillis())); + systemInfoDto.setData(networkInterfaces); + redis.lSet(key, systemInfoDto); + // 每秒一个,最多只存30个 + if (redis.lGetListSize(key) > 30) { + for (int i = 0; i < redis.lGetListSize(key) - 30; i++) { + redis.lLeftPop(key); + } + } + } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java index f43f92f6..54a3c571 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java @@ -13,6 +13,8 @@ import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; import com.genersoft.iot.vmp.storager.dao.*; +import com.genersoft.iot.vmp.utils.node.ForestNodeMerger; +import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -328,6 +330,11 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { return deviceChannelMapper.queryChannelsByDeviceIdWithStartAndLimit(deviceId, null, query, hasSubChannel, online, start, limit); } + @Override + public List tree(String deviceId) { + return ForestNodeMerger.merge(deviceChannelMapper.tree(deviceId)); + } + @Override public List queryChannelsByDeviceId(String deviceId) { return deviceChannelMapper.queryChannels(deviceId, null,null, null, null); @@ -568,16 +575,16 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @Override public PageInfo queryAllChannelList(int page, int count, String query, Boolean online, - Boolean channelType, String platformId, Boolean inPlatform) { + Boolean channelType, String platformId, String catalogId) { PageHelper.startPage(page, count); - List all = deviceChannelMapper.queryChannelListInAll(query, online, channelType, platformId, inPlatform); + List all = deviceChannelMapper.queryChannelListInAll(query, online, channelType, platformId, catalogId); return new PageInfo<>(all); } @Override public List queryChannelListInParentPlatform(String platformId) { - return deviceChannelMapper.queryChannelListInAll(null, null, null, platformId, true); + return deviceChannelMapper.queryChannelListInAll(null, null, null, platformId, platformId); } @Override diff --git a/src/main/java/com/genersoft/iot/vmp/utils/CollectionUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/CollectionUtil.java new file mode 100644 index 00000000..4f7ca1f3 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/utils/CollectionUtil.java @@ -0,0 +1,12 @@ +package com.genersoft.iot.vmp.utils; + +import java.util.Arrays; + +public class CollectionUtil { + + public static boolean contains(T[] array, final T element) { + return array != null && Arrays.stream(array).anyMatch((x) -> { + return ObjectUtils.nullSafeEquals(x, element); + }); + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/ObjectUtils.java b/src/main/java/com/genersoft/iot/vmp/utils/ObjectUtils.java new file mode 100644 index 00000000..1f429bc7 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/utils/ObjectUtils.java @@ -0,0 +1,41 @@ +package com.genersoft.iot.vmp.utils; + +import java.util.Arrays; + +public class ObjectUtils { + public static boolean nullSafeEquals(Object o1, Object o2) { + if (o1 == o2) { + return true; + } else if (o1 != null && o2 != null) { + if (o1.equals(o2)) { + return true; + } else { + return o1.getClass().isArray() && o2.getClass().isArray() && arrayEquals(o1, o2); + } + } else { + return false; + } + } + + private static boolean arrayEquals(Object o1, Object o2) { + if (o1 instanceof Object[] && o2 instanceof Object[]) { + return Arrays.equals((Object[])((Object[])o1), (Object[])((Object[])o2)); + } else if (o1 instanceof boolean[] && o2 instanceof boolean[]) { + return Arrays.equals((boolean[])((boolean[])o1), (boolean[])((boolean[])o2)); + } else if (o1 instanceof byte[] && o2 instanceof byte[]) { + return Arrays.equals((byte[])((byte[])o1), (byte[])((byte[])o2)); + } else if (o1 instanceof char[] && o2 instanceof char[]) { + return Arrays.equals((char[])((char[])o1), (char[])((char[])o2)); + } else if (o1 instanceof double[] && o2 instanceof double[]) { + return Arrays.equals((double[])((double[])o1), (double[])((double[])o2)); + } else if (o1 instanceof float[] && o2 instanceof float[]) { + return Arrays.equals((float[])((float[])o1), (float[])((float[])o2)); + } else if (o1 instanceof int[] && o2 instanceof int[]) { + return Arrays.equals((int[])((int[])o1), (int[])((int[])o2)); + } else if (o1 instanceof long[] && o2 instanceof long[]) { + return Arrays.equals((long[])((long[])o1), (long[])((long[])o2)); + } else { + return o1 instanceof short[] && o2 instanceof short[] && Arrays.equals((short[]) ((short[]) o1), (short[]) ((short[]) o2)); + } + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/SystemInfoUtils.java b/src/main/java/com/genersoft/iot/vmp/utils/SystemInfoUtils.java new file mode 100644 index 00000000..2d588fad --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/utils/SystemInfoUtils.java @@ -0,0 +1,92 @@ +package com.genersoft.iot.vmp.utils; + +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.hardware.NetworkIF; +import oshi.software.os.OperatingSystem; +import oshi.util.FormatUtil; + +import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * 实现参考自xiaozhangnomoney原创文章, + * 版权声明:本文为xiaozhangnomoney原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明 + * 原文出处链接:https://blog.csdn.net/xiaozhangnomoney/article/details/107769147 + */ +public class SystemInfoUtils { + + /** + * 获取cpu信息 + * @return + * @throws InterruptedException + */ + public static double getCpuInfo() throws InterruptedException { + SystemInfo systemInfo = new SystemInfo(); + CentralProcessor processor = systemInfo.getHardware().getProcessor(); + long[] prevTicks = processor.getSystemCpuLoadTicks(); + // 睡眠1s + TimeUnit.SECONDS.sleep(1); + long[] ticks = processor.getSystemCpuLoadTicks(); + long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; + long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()]; + long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()]; + long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()]; + long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; + long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; + long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()]; + long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; + long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal; + return 1.0-(idle * 1.0 / totalCpu); + } + + /** + * 获取内存使用率 + * @return + */ + public static double getMemInfo(){ + SystemInfo systemInfo = new SystemInfo(); + GlobalMemory memory = systemInfo.getHardware().getMemory(); + //总内存 + long totalByte = memory.getTotal(); + //剩余 + long acaliableByte = memory.getAvailable(); + return (totalByte-acaliableByte)*1.0/totalByte; + } + + /** + * 获取网络上传和下载 + * @return + */ + public static Map getNetworkInterfaces() { + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + List networkIFs = hal.getNetworkIFs(); + int i= networkIFs.size() -1; + NetworkIF net= networkIFs.get(i); + + String in = FormatUtil.formatBytes(net.getBytesRecv()); + String out = FormatUtil.formatBytes(net.getBytesSent()); + HashMap map = new HashMap<>(); + map.put("in",in); + map.put("out",out); + return map; + } + + /** + * 获取进程数 + * @return + */ + public static int getProcessesCount(){ + SystemInfo si = new SystemInfo(); + OperatingSystem os = si.getOperatingSystem(); + + int processCount = os.getProcessCount(); + return processCount; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java new file mode 100644 index 00000000..0de21608 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java @@ -0,0 +1,54 @@ +package com.genersoft.iot.vmp.utils.node; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * 节点基类 + * + */ +@Data +public class BaseNode implements INode { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + protected String id; + + /** + * 父节点ID + */ + protected String parentId; + + /** + * 子孙节点 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + protected List children = new ArrayList(); + + /** + * 是否有子孙节点 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private Boolean hasChildren; + + /** + * 是否有子孙节点 + * + * @return Boolean + */ + @Override + public Boolean getHasChildren() { + if (children.size() > 0) { + return true; + } else { + return this.hasChildren; + } + } + +} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java new file mode 100644 index 00000000..0ba72072 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java @@ -0,0 +1,28 @@ +package com.genersoft.iot.vmp.utils.node; + +import lombok.Data; +import lombok.EqualsAndHashCode; + + +/** + * 森林节点类 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ForestNode extends BaseNode { + + private static final long serialVersionUID = 1L; + + /** + * 节点内容 + */ + private Object content; + + public ForestNode(String id, String parentId, Object content) { + this.id = id; + this.parentId = parentId; + this.content = content; + } + +} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java new file mode 100644 index 00000000..de98fdc7 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java @@ -0,0 +1,68 @@ +package com.genersoft.iot.vmp.utils.node; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 森林管理类 + * + * @author smallchill + */ +public class ForestNodeManager> { + + /** + * 森林的所有节点 + */ + private final ImmutableMap nodeMap; + + /** + * 森林的父节点ID + */ + private final Map parentIdMap = Maps.newHashMap(); + + public ForestNodeManager(List nodes) { + nodeMap = Maps.uniqueIndex(nodes, INode::getId); + } + + /** + * 根据节点ID获取一个节点 + * + * @param id 节点ID + * @return 对应的节点对象 + */ + public INode getTreeNodeAt(String id) { + if (nodeMap.containsKey(id)) { + return nodeMap.get(id); + } + return null; + } + + /** + * 增加父节点ID + * + * @param parentId 父节点ID + */ + public void addParentId(String parentId) { + parentIdMap.put(parentId, ""); + } + + /** + * 获取树的根节点(一个森林对应多颗树) + * + * @return 树的根节点集合 + */ + public List getRoot() { + List roots = new ArrayList<>(); + nodeMap.forEach((key, node) -> { + if (node.getParentId() == null || parentIdMap.containsKey(node.getId())) { + roots.add(node); + } + }); + return roots; + } + +} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java new file mode 100644 index 00000000..062d4cd9 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java @@ -0,0 +1,51 @@ +package com.genersoft.iot.vmp.utils.node; + +import com.genersoft.iot.vmp.utils.CollectionUtil; + +import java.util.List; + +/** + * 森林节点归并类 + * + */ +public class ForestNodeMerger { + + /** + * 将节点数组归并为一个森林(多棵树)(填充节点的children域) + * 时间复杂度为O(n^2) + * + * @param items 节点域 + * @return 多棵树的根节点集合 + */ + public static > List merge(List items) { + ForestNodeManager forestNodeManager = new ForestNodeManager<>(items); + items.forEach(forestNode -> { + if (forestNode.getParentId() != null) { + INode node = forestNodeManager.getTreeNodeAt(forestNode.getParentId()); + if (node != null) { + node.getChildren().add(forestNode); + } else { + forestNodeManager.addParentId(forestNode.getId()); + } + } + }); + return forestNodeManager.getRoot(); + } + + public static > List merge(List items, String[] parentIds) { + ForestNodeManager forestNodeManager = new ForestNodeManager<>(items); + items.forEach(forestNode -> { + if (forestNode.getParentId() != null) { + INode node = forestNodeManager.getTreeNodeAt(forestNode.getParentId()); + if (CollectionUtil.contains(parentIds, forestNode.getId())){ + forestNodeManager.addParentId(forestNode.getId()); + } else { + if (node != null){ + node.getChildren().add(forestNode); + } + } + } + }); + return forestNodeManager.getRoot(); + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java new file mode 100644 index 00000000..4d6ebfcb --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java @@ -0,0 +1,42 @@ +package com.genersoft.iot.vmp.utils.node; + +import java.io.Serializable; +import java.util.List; + +/** + * + * 节点 + */ +public interface INode extends Serializable { + + /** + * 主键 + * + * @return String + */ + String getId(); + + /** + * 父主键 + * + * @return String + */ + String getParentId(); + + /** + * 子孙节点 + * + * @return List + */ + List getChildren(); + + /** + * 是否有子孙节点 + * + * @return Boolean + */ + default Boolean getHasChildren() { + return false; + } + +} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java new file mode 100644 index 00000000..9df6f11f --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java @@ -0,0 +1,21 @@ +package com.genersoft.iot.vmp.utils.node; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 树型节点类 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class TreeNode extends BaseNode { + + private static final long serialVersionUID = 1L; + + private String title; + + private String key; + + private String value; +} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java index da098513..8ab06724 100644 --- a/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java +++ b/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java @@ -660,6 +660,24 @@ public class RedisUtil { } } + /** + * 在键为 key 的 list中移除第一个元素 + * @param key 键 + * @return + */ + public Object lLeftPop(String key) { + return redisTemplate.opsForList().leftPop(key); + } + + /** + * 在键为 key 的 list中移除、最后一个元素 + * @param key 键 + * @return + */ + public Object lrightPop(String key) { + return redisTemplate.opsForList().rightPop(key); + } + /** * 模糊查询 * @param key 键 diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/BatchGBStreamParam.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/BatchGBStreamParam.java new file mode 100644 index 00000000..e03461e6 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/BatchGBStreamParam.java @@ -0,0 +1,17 @@ +package com.genersoft.iot.vmp.vmanager.bean; + +import com.genersoft.iot.vmp.gb28181.bean.GbStream; + +import java.util.List; + +public class BatchGBStreamParam { + private List gbStreams; + + public List getGbStreams() { + return gbStreams; + } + + public void setGbStreams(List gbStreams) { + this.gbStreams = gbStreams; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java new file mode 100644 index 00000000..773f2c13 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java @@ -0,0 +1,65 @@ +package com.genersoft.iot.vmp.vmanager.bean; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; +import com.genersoft.iot.vmp.utils.node.INode; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.ArrayList; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "DeviceChannelTree对象", description = "DeviceChannelTree对象") +public class DeviceChannelTree extends DeviceChannel implements INode { + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + private String id; + + /** + * 父节点ID + */ + private String parentId; + + private String parentName; + + private String title; + + private String key; + + private String value; + + /** + * 子孙节点 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List children; + + /** + * 是否有子孙节点 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private Boolean hasChildren; + + @Override + public List getChildren() { + if (this.children == null) { + this.children = new ArrayList<>(); + } + return this.children; + } + + @Override + public Boolean getHasChildren() { + if (children.size() > 0) { + return true; + } else { + return this.hasChildren; + } + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java new file mode 100644 index 00000000..29d82bed --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java @@ -0,0 +1,20 @@ +package com.genersoft.iot.vmp.vmanager.bean; + +import com.genersoft.iot.vmp.utils.node.TreeNode; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class DeviceChannelTreeNode extends TreeNode { + + private Integer status; + + private String deviceId; + + private String channelId; + + private Double lng; + + private Double lat; +} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/StreamPushExcelDto.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/StreamPushExcelDto.java index c0c7611f..956f6479 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/StreamPushExcelDto.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/StreamPushExcelDto.java @@ -16,6 +16,12 @@ public class StreamPushExcelDto { @ExcelProperty("国标ID") private String gbId; + @ExcelProperty("平台ID") + private String platformId; + + @ExcelProperty("目录ID") + private String catalogId; + public String getName() { return name; } @@ -47,4 +53,21 @@ public class StreamPushExcelDto { public void setGbId(String gbId) { this.gbId = gbId; } + + + public String getPlatformId() { + return platformId; + } + + public void setPlatformId(String platformId) { + this.platformId = platformId; + } + + public String getCatalogId() { + return catalogId; + } + + public void setCatalogId(String catalogId) { + this.catalogId = catalogId; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java index f8e2c1c0..b4e3eb41 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java @@ -1,32 +1,35 @@ package com.genersoft.iot.vmp.vmanager.bean; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor public class WVPResult { private int code; private String msg; private T data; - public int getCode() { - return code; - } + private static final Integer SUCCESS = 200; + private static final Integer FAILED = 400; - public void setCode(int code) { - this.code = code; + public static WVPResult Data(T t, String msg) { + return new WVPResult<>(SUCCESS, msg, t); } - public String getMsg() { - return msg; + public static WVPResult Data(T t) { + return Data(t, "成功"); } - public void setMsg(String msg) { - this.msg = msg; + public static WVPResult fail(int code, String msg) { + return new WVPResult<>(code, msg, null); } - public T getData() { - return data; + public static WVPResult fail(String msg) { + return fail(FAILED, msg); } - public void setData(T data) { - this.data = data; - } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java index d83094ed..d9357d20 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java @@ -10,8 +10,10 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -25,6 +27,7 @@ import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; +import java.util.List; import java.util.UUID; @Api(tags = "国标设备查询", value = "国标设备查询") @@ -431,5 +434,9 @@ public class DeviceQuery { return result; } - + @GetMapping("/{deviceId}/tree") + @ApiOperation(value = "通道树形结构", notes = "通道树形结构") + public WVPResult> tree(@PathVariable String deviceId) { + return WVPResult.Data(storager.tree(deviceId)); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/gbStream/GbStreamController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/gbStream/GbStreamController.java index 981c3ccb..edc940fa 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/gbStream/GbStreamController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/gbStream/GbStreamController.java @@ -12,6 +12,7 @@ import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; @Api(tags = "视频流关联到级联平台") @@ -40,15 +41,33 @@ public class GbStreamController { @ApiImplicitParams({ @ApiImplicitParam(name = "page", value = "当前页", required = true , dataTypeClass = Integer.class), @ApiImplicitParam(name = "count", value = "每页条数", required = true , dataTypeClass = Integer.class), - @ApiImplicitParam(name = "platformId", value = "平台ID", required = true , dataTypeClass = Integer.class), + @ApiImplicitParam(name = "platformId", value = "平台ID", required = true , dataTypeClass = String.class), + @ApiImplicitParam(name = "catalogId", value = "目录ID", required = false , dataTypeClass = String.class), + @ApiImplicitParam(name="query", value = "查询内容", required = false , dataTypeClass = String.class), + @ApiImplicitParam(name="pushing", value = "是否正在推流", required = false , dataTypeClass = Boolean.class), + @ApiImplicitParam(name="mediaServerId", value = "流媒体ID", required = false , dataTypeClass = String.class), + }) @GetMapping(value = "/list") @ResponseBody public PageInfo list(@RequestParam(required = true)Integer page, @RequestParam(required = true)Integer count, - @RequestParam(required = true)String platformId){ + @RequestParam(required = true)String platformId, + @RequestParam(required = false)String catalogId, + @RequestParam(required = false)String query, + @RequestParam(required = false)Boolean pushing, + @RequestParam(required = false)String mediaServerId){ + if (StringUtils.isEmpty(catalogId)) { + catalogId = null; + } + if (StringUtils.isEmpty(query)) { + query = null; + } + if (StringUtils.isEmpty(mediaServerId)) { + mediaServerId = null; + } - return gbStreamService.getAll(page, count, platformId); + return gbStreamService.getAll(page, count, platformId, catalogId, query, pushing, mediaServerId); } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java index 532d928d..b8507299 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java @@ -65,6 +65,25 @@ public class PlatformController { result.put("password", sipConfig.getPassword()); return new ResponseEntity<>(result, HttpStatus.OK); } + /** + * 获取级联服务器信息 + * @return + */ + @ApiOperation("获取国标服务的配置") + @GetMapping("/info/{id}") + public ResponseEntity> getPlatform(@PathVariable String id) { + ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(id); + WVPResult wvpResult = new WVPResult<>(); + if (parentPlatform != null) { + wvpResult.setCode(0); + wvpResult.setMsg("success"); + wvpResult.setData(parentPlatform); + }else { + wvpResult.setCode(-1); + wvpResult.setMsg("未查询到此平台"); + } + return new ResponseEntity<>(wvpResult, HttpStatus.OK); + } /** * 分页查询级联平台 @@ -282,29 +301,33 @@ public class PlatformController { @ApiImplicitParam(name = "page", value = "当前页", dataTypeClass = Integer.class), @ApiImplicitParam(name = "count", value = "每页条数", dataTypeClass = Integer.class), @ApiImplicitParam(name = "platformId", value = "上级平台ID", dataTypeClass = String.class), + @ApiImplicitParam(name = "catalogId", value = "目录ID", dataTypeClass = String.class), @ApiImplicitParam(name = "query", value = "查询内容", dataTypeClass = String.class), @ApiImplicitParam(name = "online", value = "是否在线", dataTypeClass = Boolean.class), - @ApiImplicitParam(name = "choosed", value = "是否已选中", dataTypeClass = Boolean.class), @ApiImplicitParam(name = "channelType", value = "通道类型", dataTypeClass = Boolean.class), }) @GetMapping("/channel_list") @ResponseBody public PageInfo channelList(int page, int count, @RequestParam(required = false) String platformId, + @RequestParam(required = false) String catalogId, @RequestParam(required = false) String query, @RequestParam(required = false) Boolean online, - @RequestParam(required = false) Boolean choosed, @RequestParam(required = false) Boolean channelType){ // if (logger.isDebugEnabled()) { // logger.debug("查询所有所有通道API调用"); // } - PageInfo channelReduces = null; - if (platformId != null ) { - channelReduces = storager.queryAllChannelList(page, count, query, online, channelType, platformId, choosed); - }else { - channelReduces = storager.queryAllChannelList(page, count, query, online, channelType, null, false); + if(StringUtils.isEmpty(platformId)) { + platformId = null; + } + if(StringUtils.isEmpty(query)) { + query = null; + } + if(StringUtils.isEmpty(platformId) || StringUtils.isEmpty(catalogId)) { + catalogId = null; } + PageInfo channelReduces = storager.queryAllChannelList(page, count, query, online, channelType, platformId, catalogId); return channelReduces; } @@ -371,11 +394,11 @@ public class PlatformController { } List platformCatalogList = storager.getChildrenCatalogByPlatform(platformId, parentId); // 查询下属的国标通道 - List catalogsForChannel = storager.queryChannelInParentPlatformAndCatalog(platformId, parentId); +// List catalogsForChannel = storager.queryChannelInParentPlatformAndCatalog(platformId, parentId); // 查询下属的直播流通道 - List catalogsForStream = storager.queryStreamInParentPlatformAndCatalog(platformId, parentId); - platformCatalogList.addAll(catalogsForChannel); - platformCatalogList.addAll(catalogsForStream); +// List catalogsForStream = storager.queryStreamInParentPlatformAndCatalog(platformId, parentId); +// platformCatalogList.addAll(catalogsForChannel); +// platformCatalogList.addAll(catalogsForStream); WVPResult> result = new WVPResult<>(); result.setCode(0); result.setMsg("success"); diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java index 3ea207a3..36545b32 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java @@ -10,6 +10,7 @@ import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.IStreamPushService; import com.genersoft.iot.vmp.service.impl.StreamPushUploadFileHandler; +import com.genersoft.iot.vmp.vmanager.bean.BatchGBStreamParam; import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; @@ -24,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; import org.springframework.web.multipart.MultipartFile; @@ -57,16 +59,24 @@ public class StreamPushController { @ApiImplicitParam(name="page", value = "当前页", required = true, dataTypeClass = Integer.class), @ApiImplicitParam(name="count", value = "每页查询数量", required = true, dataTypeClass = Integer.class), @ApiImplicitParam(name="query", value = "查询内容", dataTypeClass = String.class), - @ApiImplicitParam(name="online", value = "是否在线", dataTypeClass = Boolean.class), + @ApiImplicitParam(name="pushing", value = "是否正在推流", dataTypeClass = Boolean.class), + @ApiImplicitParam(name="mediaServerId", value = "流媒体ID", dataTypeClass = String.class), }) @GetMapping(value = "/list") @ResponseBody public PageInfo list(@RequestParam(required = false)Integer page, @RequestParam(required = false)Integer count, @RequestParam(required = false)String query, - @RequestParam(required = false)Boolean online ){ + @RequestParam(required = false)Boolean pushing, + @RequestParam(required = false)String mediaServerId ){ - PageInfo pushList = streamPushService.getPushList(page, count); + if (StringUtils.isEmpty(query)) { + query = null; + } + if (StringUtils.isEmpty(mediaServerId)) { + mediaServerId = null; + } + PageInfo pushList = streamPushService.getPushList(page, count, query, pushing, mediaServerId); return pushList; } @@ -107,13 +117,32 @@ public class StreamPushController { }) @PostMapping(value = "/stop") @ResponseBody - public Object removeFormGB(@RequestParam(required = true)String app, @RequestParam(required = true)String streamId){ + public Object stop(String app, String streamId){ if (streamPushService.stop(app, streamId)){ return "success"; }else { return "fail"; } } + + @ApiOperation("中止多个推流") + @ApiImplicitParams({ + @ApiImplicitParam(name = "app", value = "应用名", required = true, dataTypeClass = String.class), + @ApiImplicitParam(name = "streamId", value = "流ID", required = true, dataTypeClass = String.class), + }) + @DeleteMapping(value = "/batchStop") + @ResponseBody + public Object batchStop(@RequestBody BatchGBStreamParam batchGBStreamParam){ + if (batchGBStreamParam.getGbStreams().size() == 0) { + return "fail"; + } + if (streamPushService.batchStop(batchGBStreamParam.getGbStreams())){ + return "success"; + }else { + return "fail"; + } + } + @PostMapping(value = "upload") @ResponseBody public DeferredResult>> uploadChannelFile(@RequestParam(value = "file") MultipartFile file){ diff --git a/web_src/index.html b/web_src/index.html index 697e987f..af1cad22 100644 --- a/web_src/index.html +++ b/web_src/index.html @@ -4,6 +4,7 @@ 国标28181 + diff --git a/web_src/src/api/deviceApi.js b/web_src/src/api/deviceApi.js new file mode 100644 index 00000000..830164f4 --- /dev/null +++ b/web_src/src/api/deviceApi.js @@ -0,0 +1,19 @@ +import axios from 'axios'; + +export const tree = (deviceId) => { + return axios({ + url: `/api/device/query/${deviceId}/tree`, + method: 'get' + }) +} + +export const deviceList = (page, count) => { + return axios({ + method: 'get', + url:`/api/device/query/devices`, + params: { + page, + count + } + }) +} \ No newline at end of file diff --git a/web_src/src/components/PushVideoList.vue b/web_src/src/components/PushVideoList.vue index 44372dff..4c803da5 100644 --- a/web_src/src/components/PushVideoList.vue +++ b/web_src/src/components/PushVideoList.vue @@ -9,31 +9,52 @@ 推流列表
+ + 搜索: + + 流媒体: + + + + + 推流状态: + + + + 通道导入 下载模板 - + 批量移除
- - + + + + - + - + - + - + + + - + @@ -42,8 +63,8 @@