|  |  | 
 |  |  | package com.genersoft.iot.vmp.storager.impl; | 
 |  |  |  | 
 |  |  | import com.genersoft.iot.vmp.common.StreamInfo; | 
 |  |  | import com.genersoft.iot.vmp.conf.SipConfig; | 
 |  |  | import com.genersoft.iot.vmp.conf.UserSetting; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.bean.*; | 
 |  |  | 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.dto.StreamProxyItem; | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; | 
 |  |  | import com.genersoft.iot.vmp.service.IGbStreamService; | 
 |  |  | import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; | 
 |  |  | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | 
 |  |  | 
 |  |  | import org.springframework.transaction.TransactionStatus; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.util.CollectionUtils; | 
 |  |  | import org.springframework.util.StringUtils; | 
 |  |  | import org.springframework.util.ObjectUtils; | 
 |  |  |  | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.concurrent.ConcurrentHashMap; | 
 |  |  | 
 |  |  |     private GbStreamMapper gbStreamMapper; | 
 |  |  |  | 
 |  |  |    @Autowired | 
 |  |  |     private UserSetting userSetting; | 
 |  |  |  | 
 |  |  |    @Autowired | 
 |  |  |     private PlatformCatalogMapper catalogMapper; | 
 |  |  |  | 
 |  |  |    @Autowired | 
 |  |  | 
 |  |  |       if (CollectionUtils.isEmpty(deviceChannelList)) { | 
 |  |  |          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); | 
 |  |  |       List<DeviceChannel> allChannels = deviceChannelMapper.queryAllChannels(deviceId); | 
 |  |  |       Map<String,DeviceChannel> allChannelMap = new ConcurrentHashMap<>(); | 
 |  |  |       if (allChannels.size() > 0) { | 
 |  |  |          for (DeviceChannel deviceChannel : allChannels) { | 
 |  |  |             allChannelMap.put(deviceChannel.getChannelId(), deviceChannel); | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |       TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); | 
 |  |  | 
 |  |  |       List<DeviceChannel> channels = new ArrayList<>(); | 
 |  |  |       StringBuilder stringBuilder = new StringBuilder(); | 
 |  |  |       Map<String, Integer> subContMap = new HashMap<>(); | 
 |  |  |       if (deviceChannelList.size() > 1) { | 
 |  |  |       if (deviceChannelList.size() > 0) { | 
 |  |  |          // 数据去重 | 
 |  |  |          Set<String> gbIdSet = new HashSet<>(); | 
 |  |  |          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()); | 
 |  |  |                if (allChannelMap.containsKey(deviceChannel.getChannelId())) { | 
 |  |  |                   deviceChannel.setStreamId(allChannelMap.get(deviceChannel.getChannelId()).getStreamId()); | 
 |  |  |                   deviceChannel.setHasAudio(allChannelMap.get(deviceChannel.getChannelId()).isHasAudio()); | 
 |  |  |                } | 
 |  |  |                channels.add(deviceChannel); | 
 |  |  |                if (!StringUtils.isEmpty(deviceChannel.getParentId())) { | 
 |  |  |                if (!ObjectUtils.isEmpty(deviceChannel.getParentId())) { | 
 |  |  |                   if (subContMap.get(deviceChannel.getParentId()) == null) { | 
 |  |  |                      subContMap.put(deviceChannel.getParentId(), 1); | 
 |  |  |                   }else { | 
 |  |  | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |  | 
 |  |  |       }else { | 
 |  |  |          channels = deviceChannelList; | 
 |  |  |       } | 
 |  |  |       if (stringBuilder.length() > 0) { | 
 |  |  |          logger.info("[目录查询]收到的数据存在重复: {}" , stringBuilder); | 
 |  |  | 
 |  |  |       PageHelper.startPage(page, count); | 
 |  |  |       List<DeviceChannel> all; | 
 |  |  |       if (catalogUnderDevice != null && catalogUnderDevice) { | 
 |  |  |          all = deviceChannelMapper.queryChannels(deviceId, deviceId, query, hasSubChannel, online); | 
 |  |  |          all = deviceChannelMapper.queryChannels(deviceId, deviceId, query, hasSubChannel, online,null); | 
 |  |  |          // 海康设备的parentId是SIP id | 
 |  |  |          List<DeviceChannel> deviceChannels = deviceChannelMapper.queryChannels(deviceId, sipConfig.getId(), query, hasSubChannel, online); | 
 |  |  |          List<DeviceChannel> deviceChannels = deviceChannelMapper.queryChannels(deviceId, sipConfig.getId(), query, hasSubChannel, online,null); | 
 |  |  |          all.addAll(deviceChannels); | 
 |  |  |       }else { | 
 |  |  |          all = deviceChannelMapper.queryChannels(deviceId, null, query, hasSubChannel, online); | 
 |  |  |          all = deviceChannelMapper.queryChannels(deviceId, null, query, hasSubChannel, online,null); | 
 |  |  |       } | 
 |  |  |       return new PageInfo<>(all); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public List<DeviceChannel> queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String query, Boolean hasSubChannel, Boolean online, int start, int limit) { | 
 |  |  |       return deviceChannelMapper.queryChannelsByDeviceIdWithStartAndLimit(deviceId, null, query, hasSubChannel, online, start, limit); | 
 |  |  |    public List<DeviceChannel> queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String query, Boolean hasSubChannel, Boolean online, int start, int limit,List<String> channelIds) { | 
 |  |  |       return deviceChannelMapper.queryChannelsByDeviceIdWithStartAndLimit(deviceId, null, query, hasSubChannel, online, start, limit,channelIds); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) { | 
 |  |  |       return deviceChannelMapper.queryChannels(deviceId, null,null, null, null); | 
 |  |  |    public List<DeviceChannel> queryChannelsByDeviceId(String deviceId,Boolean online,List<String> channelIds) { | 
 |  |  |       return deviceChannelMapper.queryChannels(deviceId, null,null, null, online,channelIds); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    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, query, hasSubChannel, online); | 
 |  |  |       List<DeviceChannel> all = deviceChannelMapper.queryChannels(deviceId, parentChannelId, query, hasSubChannel, online,null); | 
 |  |  |       return new PageInfo<>(all); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  | 
 |  |  |     * @return PageInfo<Device> 分页设备对象数组 | 
 |  |  |     */ | 
 |  |  |    @Override | 
 |  |  |    public PageInfo<Device> queryVideoDeviceList(int page, int count) { | 
 |  |  |    public PageInfo<Device> queryVideoDeviceList(int page, int count,Boolean online) { | 
 |  |  |       PageHelper.startPage(page, count); | 
 |  |  |       List<Device> all = deviceMapper.getDevices(); | 
 |  |  |       List<Device> all = deviceMapper.getDevices(online); | 
 |  |  |       return new PageInfo<>(all); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  | 
 |  |  |     * @return List<Device> 设备对象数组 | 
 |  |  |     */ | 
 |  |  |    @Override | 
 |  |  |    public List<Device> queryVideoDeviceList() { | 
 |  |  |    public List<Device> queryVideoDeviceList(Boolean online) { | 
 |  |  |  | 
 |  |  |       List<Device> deviceList =  deviceMapper.getDevices(); | 
 |  |  |       List<Device> deviceList =  deviceMapper.getDevices(online); | 
 |  |  |       return deviceList; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  |     * 删除设备 | 
 |  |  |     * | 
 |  |  |     * @param deviceId 设备ID | 
 |  |  |     * @return true:删除成功  false:删除失败 | 
 |  |  |     */ | 
 |  |  |    @Override | 
 |  |  |    public boolean delete(String deviceId) { | 
 |  |  |       TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); | 
 |  |  |       boolean result = false; | 
 |  |  |       try { | 
 |  |  |          platformChannelMapper.delChannelForDeviceId(deviceId); | 
 |  |  |          deviceChannelMapper.cleanChannelsByDeviceId(deviceId); | 
 |  |  |          if ( deviceMapper.del(deviceId) < 0 ) { | 
 |  |  |             //事务回滚 | 
 |  |  |             dataSourceTransactionManager.rollback(transactionStatus); | 
 |  |  |          } | 
 |  |  |          result = true; | 
 |  |  |          dataSourceTransactionManager.commit(transactionStatus);     //手动提交 | 
 |  |  |       }catch (Exception e) { | 
 |  |  |          dataSourceTransactionManager.rollback(transactionStatus); | 
 |  |  |       } | 
 |  |  |       return result; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  |     * 更新设备在线 | 
 |  |  |     * | 
 |  |  |     * @param deviceId 设备ID | 
 |  |  |     * @return true:更新成功  false:更新失败 | 
 |  |  |     */ | 
 |  |  |    @Override | 
 |  |  |    public synchronized boolean online(String deviceId) { | 
 |  |  |       Device device = deviceMapper.getDeviceByDeviceId(deviceId); | 
 |  |  |       if (device == null) { | 
 |  |  |          return false; | 
 |  |  |       } | 
 |  |  |       device.setOnline(1); | 
 |  |  |       logger.info("更新设备在线: " + deviceId); | 
 |  |  |       redisCatchStorage.updateDevice(device); | 
 |  |  |       return deviceMapper.update(device) > 0; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  |     * 更新设备离线 | 
 |  |  |     * | 
 |  |  |     * @param deviceId 设备ID | 
 |  |  |     * @return true:更新成功  false:更新失败 | 
 |  |  |     */ | 
 |  |  |    @Override | 
 |  |  |    public synchronized boolean outline(String deviceId) { | 
 |  |  |       logger.info("更新设备离线: " + deviceId); | 
 |  |  |       Device device = deviceMapper.getDeviceByDeviceId(deviceId); | 
 |  |  |       if (device == null) { | 
 |  |  |          return false; | 
 |  |  |       } | 
 |  |  |       device.setOnline(0); | 
 |  |  |       redisCatchStorage.updateDevice(device); | 
 |  |  |       return deviceMapper.update(device) > 0; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  |     * 更新所有设备离线 | 
 |  |  |     * | 
 |  |  |     * @return true:更新成功  false:更新失败 | 
 |  |  |     */ | 
 |  |  |    @Override | 
 |  |  |    public synchronized boolean outlineForAll() { | 
 |  |  |       logger.info("更新所有设备离线"); | 
 |  |  |       int result = deviceMapper.outlineForAll(); | 
 |  |  |       return result > 0; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  | 
 |  |  |       // 删除关联的通道 | 
 |  |  |       platformChannelMapper.cleanChannelForGB(parentPlatform.getServerGBId()); | 
 |  |  |       return result > 0; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public PageInfo<ParentPlatform> queryParentPlatformList(int page, int count) { | 
 |  |  |       PageHelper.startPage(page, count); | 
 |  |  |       List<ParentPlatform> all = platformMapper.getParentPlatformList(); | 
 |  |  |       return new PageInfo<>(all); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  | 
 |  |  |     */ | 
 |  |  |    @Override | 
 |  |  |    public List<DeviceChannel> queryGbStreamListInPlatform(String platformId) { | 
 |  |  |       return gbStreamMapper.queryGbStreamListInPlatform(platformId); | 
 |  |  |       return gbStreamMapper.queryGbStreamListInPlatform(platformId, userSetting.isUsePushingAsStatus()); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public void updateMediaList(List<StreamPushItem> streamPushItems) { | 
 |  |  |       if (streamPushItems == null || streamPushItems.size() == 0) { | 
 |  |  |          return; | 
 |  |  |       } | 
 |  |  |       logger.info("updateMediaList:  " + streamPushItems.size()); | 
 |  |  |       streamPushMapper.addAll(streamPushItems); | 
 |  |  |       // TODO 待优化 | 
 |  |  |       for (int i = 0; i < streamPushItems.size(); i++) { | 
 |  |  |          int onlineResult = mediaOnline(streamPushItems.get(i).getApp(), streamPushItems.get(i).getStream()); | 
 |  |  |          if (onlineResult > 0) { | 
 |  |  |             // 发送上线通知 | 
 |  |  |             eventPublisher.catalogEventPublishForStream(null, streamPushItems.get(i), CatalogEvent.ON); | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public void updateMedia(StreamPushItem streamPushItem) { | 
 |  |  |       streamPushMapper.del(streamPushItem.getApp(), streamPushItem.getStream()); | 
 |  |  |       streamPushMapper.add(streamPushItem); | 
 |  |  |       mediaOffline(streamPushItem.getApp(), streamPushItem.getStream()); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public int removeMedia(String app, String stream) { | 
 |  |  |       return streamPushMapper.del(app, stream); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public StreamPushItem getMedia(String app, String stream) { | 
 |  |  |       return streamPushMapper.selectOne(app, stream); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public void clearMediaList() { | 
 |  |  |       streamPushMapper.clear(); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  | 
 |  |  |       if ("proxy".equals(gbStream.getStreamType())) { | 
 |  |  |          result = streamProxyMapper.updateStatus(app, stream, false); | 
 |  |  |       }else { | 
 |  |  |          result = streamPushMapper.updateStatus(app, stream, false); | 
 |  |  |          result = streamPushMapper.updatePushStatus(app, stream, false); | 
 |  |  |       } | 
 |  |  |       return result; | 
 |  |  |    } | 
 |  |  | 
 |  |  |       if ("proxy".equals(gbStream.getStreamType())) { | 
 |  |  |          result = streamProxyMapper.updateStatus(app, stream, true); | 
 |  |  |       }else { | 
 |  |  |          result = streamPushMapper.updateStatus(app, stream, true); | 
 |  |  |          result = streamPushMapper.updatePushStatus(app, stream, true); | 
 |  |  |       } | 
 |  |  |       return result; | 
 |  |  |    } | 
 |  |  | 
 |  |  |          return 0; | 
 |  |  |       } | 
 |  |  |       if (platform.getTreeType().equals(TreeType.BUSINESS_GROUP)) { | 
 |  |  |          if (platformCatalog.getPlatformId().equals(platformCatalog.getParentId())) { | 
 |  |  |          if (platform.getDeviceGBId().equals(platformCatalog.getParentId())) { | 
 |  |  |             // 第一层节点 | 
 |  |  |             platformCatalog.setBusinessGroupId(platformCatalog.getId()); | 
 |  |  |             platformCatalog.setParentId(platform.getDeviceGBId()); | 
 |  |  |          }else { | 
 |  |  |             // 获取顶层的 | 
 |  |  |             PlatformCatalog topCatalog = getTopCatalog(platformCatalog.getParentId(), platformCatalog.getPlatformId()); | 
 |  |  |             PlatformCatalog topCatalog = getTopCatalog(platformCatalog.getParentId(), platform.getDeviceGBId()); | 
 |  |  |             platformCatalog.setBusinessGroupId(topCatalog.getId()); | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  | 
 |  |  |       return gbStreamMapper.updateStreamGPS(gpsMsgInfos); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    private List<DeviceChannel> getDeviceChannelListByChannelReduceList(List<ChannelReduce> channelReduces, String catalogId) { | 
 |  |  |       List<DeviceChannel> deviceChannelList = new ArrayList<>(); | 
 |  |  |       if (channelReduces.size() > 0){ | 
 |  |  |          for (ChannelReduce channelReduce : channelReduces) { | 
 |  |  |             DeviceChannel deviceChannel = queryChannel(channelReduce.getDeviceId(), channelReduce.getChannelId()); | 
 |  |  |             deviceChannel.setParental(1); | 
 |  |  |             deviceChannel.setParentId(catalogId); | 
 |  |  |             deviceChannelList.add(deviceChannel); | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |       return deviceChannelList; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    private DeviceChannel getDeviceChannelByCatalog(PlatformCatalog catalog) { | 
 |  |  |       ParentPlatform platform = platformMapper.getParentPlatByServerGBId(catalog.getPlatformId()); |