mk1990
2022-05-16 e6790d88fc5b1ac33d239c0d90ce6cdea666b821
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java
@@ -13,8 +13,7 @@
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.storager.dao.*;
import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo;
import com.genersoft.iot.vmp.utils.node.ForestNodeMerger;
import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree;
import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
@@ -28,8 +27,8 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**    
 * 视频设备数据存储-jdbc实现
@@ -93,9 +92,6 @@
   @Autowired
    private ParentPlatformMapper parentPlatformMapper;
   private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   /**
    * 根据设备ID判断设备是否存在
    *
@@ -107,45 +103,6 @@
      return deviceMapper.getDeviceByDeviceId(deviceId) != null;
   }
   /**
    * 视频设备创建
    *
    * @param device 设备对象
    * @return true:创建成功  false:创建失败
    */
   @Override
   public synchronized boolean create(Device device) {
      redisCatchStorage.updateDevice(device);
      return deviceMapper.add(device) > 0;
   }
   /**
    * 视频设备更新
    *
    * @param device 设备对象
    * @return true:更新成功  false:更新失败
    */
   @Override
   public synchronized boolean updateDevice(Device device) {
      String now = this.format.format(System.currentTimeMillis());
      device.setUpdateTime(now);
      Device deviceByDeviceId = deviceMapper.getDeviceByDeviceId(device.getDeviceId());
      device.setCharset(device.getCharset().toUpperCase());
      if (deviceByDeviceId == null) {
         device.setCreateTime(now);
         redisCatchStorage.updateDevice(device);
         return deviceMapper.add(device) > 0;
      }else {
         redisCatchStorage.updateDevice(device);
         return deviceMapper.update(device) > 0;
      }
   }
   @Override
   public synchronized void updateChannel(String deviceId, DeviceChannel channel) {
      String channelId = channel.getChannelId();
@@ -154,7 +111,7 @@
      if (streamInfo != null) {
         channel.setStreamId(streamInfo.getStream());
      }
      String now = this.format.format(System.currentTimeMillis());
      String now = DateUtil.getNow();
      channel.setUpdateTime(now);
      DeviceChannel deviceChannel = deviceChannelMapper.queryChannel(deviceId, channelId);
      if (deviceChannel == null) {
@@ -180,7 +137,7 @@
               if (streamInfo != null) {
                  channel.setStreamId(streamInfo.getStream());
               }
               String now = this.format.format(System.currentTimeMillis());
               String now = DateUtil.getNow();
               channel.setUpdateTime(now);
               channel.setCreateTime(now);
               addChannels.add(channel);
@@ -195,7 +152,7 @@
               if (streamInfo != null) {
                  channel.setStreamId(streamInfo.getStream());
               }
               String now = this.format.format(System.currentTimeMillis());
               String now = DateUtil.getNow();
               channel.setUpdateTime(now);
               if (channelsInStore.get(channel.getChannelId()) != null) {
                  updateChannels.add(channel);
@@ -238,6 +195,16 @@
   @Override
   public boolean resetChannels(String deviceId, List<DeviceChannel> deviceChannelList) {
      if (deviceChannelList == null) {
         return false;
      }
      List<DeviceChannel> allChannelInPlay = deviceChannelMapper.getAllChannelInPlay();
      Map<String,DeviceChannel> allChannelMapInPlay = new ConcurrentHashMap<>();
      if (allChannelInPlay.size() > 0) {
         for (DeviceChannel deviceChannel : allChannelInPlay) {
            allChannelMapInPlay.put(deviceChannel.getChannelId(), deviceChannel);
         }
      }
      TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
      // 数据去重
      List<DeviceChannel> channels = new ArrayList<>();
@@ -249,6 +216,9 @@
         for (DeviceChannel deviceChannel : deviceChannelList) {
            if (!gbIdSet.contains(deviceChannel.getChannelId())) {
               gbIdSet.add(deviceChannel.getChannelId());
               if (allChannelMapInPlay.containsKey(deviceChannel.getChannelId())) {
                  deviceChannel.setStreamId(allChannelMapInPlay.get(deviceChannel.getChannelId()).getStreamId());
               }
               channels.add(deviceChannel);
               if (!StringUtils.isEmpty(deviceChannel.getParentId())) {
                  if (subContMap.get(deviceChannel.getParentId()) == null) {
@@ -274,7 +244,7 @@
         channels = deviceChannelList;
      }
      if (stringBuilder.length() > 0) {
         logger.debug("[目录查询]收到的数据存在重复: {}" , stringBuilder);
         logger.info("[目录查询]收到的数据存在重复: {}" , stringBuilder);
      }
      try {
         int cleanChannelsResult = deviceChannelMapper.cleanChannelsNotInList(deviceId, channels);
@@ -300,6 +270,7 @@
         dataSourceTransactionManager.commit(transactionStatus);     //手动提交
         return true;
      }catch (Exception e) {
         e.printStackTrace();
         dataSourceTransactionManager.rollback(transactionStatus);
         return false;
      }
@@ -338,10 +309,15 @@
   }
   @Override
   public PageInfo queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, Boolean online, int page, int count) {
   public PageInfo queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, Boolean online, Boolean catalogUnderDevice, int page, int count) {
      // 获取到所有正在播放的流
      PageHelper.startPage(page, count);
      List<DeviceChannel> all = deviceChannelMapper.queryChannels(deviceId, null, query, hasSubChannel, online);
      List<DeviceChannel> all;
      if (catalogUnderDevice != null && catalogUnderDevice) {
         all = deviceChannelMapper.queryChannels(deviceId, deviceId, query, hasSubChannel, online);
      }else {
         all = deviceChannelMapper.queryChannels(deviceId, null, query, hasSubChannel, online);
      }
      return new PageInfo<>(all);
   }
@@ -350,10 +326,6 @@
      return deviceChannelMapper.queryChannelsByDeviceIdWithStartAndLimit(deviceId, null, query, hasSubChannel, online, start, limit);
   }
   @Override
   public List<DeviceChannelTree> tree(String deviceId) {
      return ForestNodeMerger.merge(deviceChannelMapper.tree(deviceId));
   }
   @Override
   public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) {
@@ -361,9 +333,9 @@
   }
   @Override
   public PageInfo<DeviceChannel> querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, String online, int page, int count) {
   public PageInfo<DeviceChannel> querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, Boolean online, int page, int count) {
      PageHelper.startPage(page, count);
      List<DeviceChannel> all = deviceChannelMapper.queryChannels(deviceId, parentChannelId, null, null, null);
      List<DeviceChannel> all = deviceChannelMapper.queryChannels(deviceId, parentChannelId, query, hasSubChannel, online);
      return new PageInfo<>(all);
   }
@@ -415,10 +387,9 @@
      TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
      boolean result = false;
      try {
         if (platformChannelMapper.delChannelForDeviceId(deviceId) <0  // 删除与国标平台的关联
               || deviceChannelMapper.cleanChannelsByDeviceId(deviceId) < 0 // 删除他的通道
               || deviceMapper.del(deviceId) < 0 // 移除设备信息
         ) {
         platformChannelMapper.delChannelForDeviceId(deviceId);
         deviceChannelMapper.cleanChannelsByDeviceId(deviceId);
         if ( deviceMapper.del(deviceId) < 0 ) {
            //事务回滚
            dataSourceTransactionManager.rollback(transactionStatus);
         }
@@ -445,8 +416,6 @@
      device.setOnline(1);
      logger.info("更新设备在线: " + deviceId);
      redisCatchStorage.updateDevice(device);
      List<DeviceChannel> deviceChannelList = deviceChannelMapper.queryOnlineChannelsByDeviceId(deviceId);
      eventPublisher.catalogEventPublish(null, deviceChannelList, CatalogEvent.ON);
      return deviceMapper.update(device) > 0;
   }
@@ -460,7 +429,9 @@
   public synchronized boolean outline(String deviceId) {
      logger.info("更新设备离线: " + deviceId);
      Device device = deviceMapper.getDeviceByDeviceId(deviceId);
      if (device == null) return false;
      if (device == null) {
         return false;
      }
      device.setOnline(0);
      redisCatchStorage.updateDevice(device);
      return deviceMapper.update(device) > 0;
@@ -503,8 +474,8 @@
    * @param endTime
    */
   @Override
   public synchronized List<MobilePosition> queryMobilePositions(String deviceId, String startTime, String endTime) {
      return deviceMobilePositionMapper.queryPositionByDeviceIdAndTime(deviceId, startTime, endTime);
   public synchronized List<MobilePosition> queryMobilePositions(String deviceId, String channelId, String startTime, String endTime) {
      return deviceMobilePositionMapper.queryPositionByDeviceIdAndTime(deviceId, channelId, startTime, endTime);
   }
   @Override
@@ -519,6 +490,12 @@
   @Override
   public boolean updateParentPlatform(ParentPlatform parentPlatform) {
      int result = 0;
      if (parentPlatform.getCatalogGroup() == 0) {
         parentPlatform.setCatalogGroup(1);
      }
      if (parentPlatform.getAdministrativeDivision() == null) {
         parentPlatform.setAdministrativeDivision(parentPlatform.getAdministrativeDivision());
      }
      ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getServerGBId()); // .getDeviceGBId());
      if (parentPlatform.getId() == null ) {
         if (parentPlatform.getCatalogId() == null) {
@@ -538,6 +515,7 @@
            parentPlatformCatch.setId(parentPlatform.getServerGBId());
            redisCatchStorage.delPlatformCatchInfo(parentPlatById.getServerGBId());
         }
         result = platformMapper.updateParentPlatform(parentPlatform);
      }
      // 更新缓存
@@ -707,6 +685,7 @@
    * 删除指定设备的所有移动位置
    * @param deviceId
    */
   @Override
   public int clearMobilePositionsByDeviceId(String deviceId) {
      return deviceMobilePositionMapper.clearMobilePositionsByDeviceId(deviceId);
   }
@@ -722,7 +701,7 @@
      boolean result = false;
      streamProxyItem.setStreamType("proxy");
      streamProxyItem.setStatus(true);
      String now = this.format.format(System.currentTimeMillis());
      String now = DateUtil.getNow();
      streamProxyItem.setCreateTime(now);
      streamProxyItem.setCreateStamp(System.currentTimeMillis());
      try {
@@ -852,7 +831,9 @@
   @Override
   public void updateMediaList(List<StreamPushItem> streamPushItems) {
      if (streamPushItems == null || streamPushItems.size() == 0) return;
      if (streamPushItems == null || streamPushItems.size() == 0) {
         return;
      }
      logger.info("updateMediaList:  " + streamPushItems.size());
      streamPushMapper.addAll(streamPushItems);
      // TODO 待优化
@@ -1073,7 +1054,7 @@
      deviceChannel.setParentId(catalog.getParentId());
      deviceChannel.setRegisterWay(1);
      // 行政区划应该是Domain的前八位
      deviceChannel.setCivilCode(parentPlatByServerGBId.getDeviceGBId().substring(0,6));
      deviceChannel.setCivilCode(parentPlatByServerGBId.getAdministrativeDivision());
      deviceChannel.setModel("live");
      deviceChannel.setOwner("wvp-pro");
      deviceChannel.setSecrecy("0");