old mode 100644
new mode 100755
 |  |  | 
 |  |  | 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 com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; | 
 |  |  | import com.genersoft.iot.vmp.utils.DateUtil; | 
 |  |  | import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; | 
 |  |  | import com.genersoft.iot.vmp.web.gb28181.dto.DeviceChannelExtend; | 
 |  |  | import com.github.pagehelper.PageHelper; | 
 |  |  | import com.github.pagehelper.PageInfo; | 
 |  |  | import org.slf4j.Logger; | 
 |  |  | 
 |  |  | 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<>(); | 
 |  |  |  | 
 |  |  |       List<DeviceChannel> updateChannels = new ArrayList<>(); | 
 |  |  |       List<DeviceChannel> addChannels = new ArrayList<>(); | 
 |  |  |       StringBuilder stringBuilder = new StringBuilder(); | 
 |  |  |       Map<String, Integer> subContMap = new HashMap<>(); | 
 |  |  |       if (deviceChannelList.size() > 1) { | 
 |  |  |  | 
 |  |  |       // 数据去重 | 
 |  |  |       Set<String> gbIdSet = new HashSet<>(); | 
 |  |  |       for (DeviceChannel deviceChannel : deviceChannelList) { | 
 |  |  |          if (gbIdSet.contains(deviceChannel.getChannelId())) { | 
 |  |  |             stringBuilder.append(deviceChannel.getChannelId()).append(","); | 
 |  |  |             continue; | 
 |  |  |          } | 
 |  |  |          gbIdSet.add(deviceChannel.getChannelId()); | 
 |  |  |          if (allChannelMap.containsKey(deviceChannel.getChannelId())) { | 
 |  |  |             deviceChannel.setStreamId(allChannelMap.get(deviceChannel.getChannelId()).getStreamId()); | 
 |  |  |             deviceChannel.setHasAudio(allChannelMap.get(deviceChannel.getChannelId()).isHasAudio()); | 
 |  |  |             if (allChannelMap.get(deviceChannel.getChannelId()).isStatus() !=deviceChannel.isStatus()){ | 
 |  |  |                List<String> strings = platformChannelMapper.queryParentPlatformByChannelId(deviceChannel.getChannelId()); | 
 |  |  |                if (!CollectionUtils.isEmpty(strings)){ | 
 |  |  |                   strings.forEach(platformId->{ | 
 |  |  |                      eventPublisher.catalogEventPublish(platformId, deviceChannel, deviceChannel.isStatus()?CatalogEvent.ON:CatalogEvent.OFF); | 
 |  |  |                   }); | 
 |  |  |                } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |             deviceChannel.setUpdateTime(DateUtil.getNow()); | 
 |  |  |             updateChannels.add(deviceChannel); | 
 |  |  |          }else { | 
 |  |  |             deviceChannel.setCreateTime(DateUtil.getNow()); | 
 |  |  |             deviceChannel.setUpdateTime(DateUtil.getNow()); | 
 |  |  |             addChannels.add(deviceChannel); | 
 |  |  |          } | 
 |  |  |          channels.add(deviceChannel); | 
 |  |  |          if (!ObjectUtils.isEmpty(deviceChannel.getParentId())) { | 
 |  |  |             if (subContMap.get(deviceChannel.getParentId()) == null) { | 
 |  |  |                subContMap.put(deviceChannel.getParentId(), 1); | 
 |  |  |             }else { | 
 |  |  |                Integer count = subContMap.get(deviceChannel.getParentId()); | 
 |  |  |                subContMap.put(deviceChannel.getParentId(), count++); | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |       if (channels.size() > 0) { | 
 |  |  |          for (DeviceChannel channel : channels) { | 
 |  |  |             if (subContMap.get(channel.getChannelId()) != null){ | 
 |  |  |                Integer count = subContMap.get(channel.getChannelId()); | 
 |  |  |                if (count > 0) { | 
 |  |  |                   channel.setSubCount(count); | 
 |  |  |                   channel.setParental(1); | 
 |  |  |                } | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       if (stringBuilder.length() > 0) { | 
 |  |  |          logger.info("[目录查询]收到的数据存在重复: {}" , stringBuilder); | 
 |  |  |       } | 
 |  |  |       if(CollectionUtils.isEmpty(channels)){ | 
 |  |  |          logger.info("通道重设,数据为空={}" , deviceChannelList); | 
 |  |  |          return false; | 
 |  |  |       } | 
 |  |  |       try { | 
 |  |  |          int cleanChannelsResult = deviceChannelMapper.cleanChannelsNotInList(deviceId, channels); | 
 |  |  |  | 
 |  |  |          int limitCount = 300; | 
 |  |  |          boolean result = cleanChannelsResult < 0; | 
 |  |  |          if (!result && addChannels.size() > 0) { | 
 |  |  |             if (addChannels.size() > limitCount) { | 
 |  |  |                for (int i = 0; i < addChannels.size(); i += limitCount) { | 
 |  |  |                   int toIndex = i + limitCount; | 
 |  |  |                   if (i + limitCount > addChannels.size()) { | 
 |  |  |                      toIndex = addChannels.size(); | 
 |  |  |                   } | 
 |  |  |                   result = result || deviceChannelMapper.batchAdd(addChannels.subList(i, toIndex)) < 0; | 
 |  |  |                } | 
 |  |  |             }else { | 
 |  |  |                result = result || deviceChannelMapper.batchAdd(addChannels) < 0; | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |          if (!result && updateChannels.size() > 0) { | 
 |  |  |             if (updateChannels.size() > limitCount) { | 
 |  |  |                for (int i = 0; i < updateChannels.size(); i += limitCount) { | 
 |  |  |                   int toIndex = i + limitCount; | 
 |  |  |                   if (i + limitCount > updateChannels.size()) { | 
 |  |  |                      toIndex = updateChannels.size(); | 
 |  |  |                   } | 
 |  |  |                   result = result || deviceChannelMapper.batchUpdate(updateChannels.subList(i, toIndex)) < 0; | 
 |  |  |                } | 
 |  |  |             }else { | 
 |  |  |                result = result || deviceChannelMapper.batchUpdate(updateChannels) < 0; | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |  | 
 |  |  |          if (result) { | 
 |  |  |             //事务回滚 | 
 |  |  |             dataSourceTransactionManager.rollback(transactionStatus); | 
 |  |  |          } | 
 |  |  |          dataSourceTransactionManager.commit(transactionStatus);     //手动提交 | 
 |  |  |          return true; | 
 |  |  |       }catch (Exception e) { | 
 |  |  |          logger.error("未处理的异常 ", e); | 
 |  |  |          dataSourceTransactionManager.rollback(transactionStatus); | 
 |  |  |          return false; | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public boolean updateChannels(String deviceId, List<DeviceChannel> deviceChannelList) { | 
 |  |  |       if (CollectionUtils.isEmpty(deviceChannelList)) { | 
 |  |  |          return false; | 
 |  |  |       } | 
 |  |  |       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); | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |       List<DeviceChannel> addChannels = new ArrayList<>(); | 
 |  |  |       List<DeviceChannel> updateChannels = new ArrayList<>(); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |       TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); | 
 |  |  |       // 数据去重 | 
 |  |  |       StringBuilder stringBuilder = new StringBuilder(); | 
 |  |  |       Map<String, Integer> subContMap = new HashMap<>(); | 
 |  |  |       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()); | 
 |  |  |                   deviceChannel.setUpdateTime(DateUtil.getNow()); | 
 |  |  |                   updateChannels.add(deviceChannel); | 
 |  |  |                }else { | 
 |  |  |                   deviceChannel.setCreateTime(DateUtil.getNow()); | 
 |  |  |                   addChannels.add(deviceChannel); | 
 |  |  |                } | 
 |  |  |                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 { | 
 |  |  | 
 |  |  |                stringBuilder.append(deviceChannel.getChannelId()).append(","); | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |          if (channels.size() > 0) { | 
 |  |  |             for (DeviceChannel channel : channels) { | 
 |  |  |          if (addChannels.size() > 0) { | 
 |  |  |             for (DeviceChannel channel : addChannels) { | 
 |  |  |                if (subContMap.get(channel.getChannelId()) != null){ | 
 |  |  |                   channel.setSubCount(subContMap.get(channel.getChannelId())); | 
 |  |  |                } | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |          if (updateChannels.size() > 0) { | 
 |  |  |             for (DeviceChannel channel : updateChannels) { | 
 |  |  |                if (subContMap.get(channel.getChannelId()) != null){ | 
 |  |  |                   channel.setSubCount(subContMap.get(channel.getChannelId())); | 
 |  |  |                } | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |  | 
 |  |  |       }else { | 
 |  |  |          channels = deviceChannelList; | 
 |  |  |       } | 
 |  |  |       if (stringBuilder.length() > 0) { | 
 |  |  |          logger.info("[目录查询]收到的数据存在重复: {}" , stringBuilder); | 
 |  |  |       } | 
 |  |  |       if(CollectionUtils.isEmpty(channels)){ | 
 |  |  |          logger.info("通道重设,数据为空={}" , deviceChannelList); | 
 |  |  |       if(CollectionUtils.isEmpty(updateChannels) && CollectionUtils.isEmpty(addChannels) ){ | 
 |  |  |          logger.info("通道更新,数据为空={}" , deviceChannelList); | 
 |  |  |          return false; | 
 |  |  |       } | 
 |  |  |       try { | 
 |  |  |          int cleanChannelsResult = deviceChannelMapper.cleanChannelsNotInList(deviceId, channels); | 
 |  |  |          int limitCount = 300; | 
 |  |  |          boolean result = cleanChannelsResult < 0; | 
 |  |  |          if (!result && channels.size() > 0) { | 
 |  |  |             if (channels.size() > limitCount) { | 
 |  |  |                for (int i = 0; i < channels.size(); i += limitCount) { | 
 |  |  |          boolean result = false; | 
 |  |  |          if (addChannels.size() > 0) { | 
 |  |  |             if (addChannels.size() > limitCount) { | 
 |  |  |                for (int i = 0; i < addChannels.size(); i += limitCount) { | 
 |  |  |                   int toIndex = i + limitCount; | 
 |  |  |                   if (i + limitCount > channels.size()) { | 
 |  |  |                      toIndex = channels.size(); | 
 |  |  |                   if (i + limitCount > addChannels.size()) { | 
 |  |  |                      toIndex = addChannels.size(); | 
 |  |  |                   } | 
 |  |  |                   result = result || deviceChannelMapper.batchAdd(channels.subList(i, toIndex)) < 0; | 
 |  |  |                   result = result || deviceChannelMapper.batchAddOrUpdate(addChannels.subList(i, toIndex)) < 0; | 
 |  |  |                } | 
 |  |  |             }else { | 
 |  |  |                result = result || deviceChannelMapper.batchAdd(channels) < 0; | 
 |  |  |                result = result || deviceChannelMapper.batchAddOrUpdate(addChannels) < 0; | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |          if (updateChannels.size() > 0) { | 
 |  |  |             if (updateChannels.size() > limitCount) { | 
 |  |  |                for (int i = 0; i < updateChannels.size(); i += limitCount) { | 
 |  |  |                   int toIndex = i + limitCount; | 
 |  |  |                   if (i + limitCount > updateChannels.size()) { | 
 |  |  |                      toIndex = updateChannels.size(); | 
 |  |  |                   } | 
 |  |  |                   result = result || deviceChannelMapper.batchUpdate(updateChannels.subList(i, toIndex)) < 0; | 
 |  |  |                } | 
 |  |  |             }else { | 
 |  |  |                result = result || deviceChannelMapper.batchUpdate(updateChannels) < 0; | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |          if (result) { | 
 |  |  |             //事务回滚 | 
 |  |  |             dataSourceTransactionManager.rollback(transactionStatus); | 
 |  |  |          }else { | 
 |  |  |             //手动提交 | 
 |  |  |             dataSourceTransactionManager.commit(transactionStatus); | 
 |  |  |          } | 
 |  |  |          dataSourceTransactionManager.commit(transactionStatus);     //手动提交 | 
 |  |  |          return true; | 
 |  |  |       }catch (Exception e) { | 
 |  |  |          e.printStackTrace(); | 
 |  |  |          logger.error("未处理的异常 ", e); | 
 |  |  |          dataSourceTransactionManager.rollback(transactionStatus); | 
 |  |  |          return false; | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  | 
 |  |  |       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<DeviceChannelExtend> queryChannelsByDeviceIdWithStartAndLimit(String deviceId, List<String> channelIds, String query, Boolean hasSubChannel, Boolean online, int start, int limit) { | 
 |  |  |       return deviceChannelMapper.queryChannelsByDeviceIdWithStartAndLimit(deviceId, channelIds, null, query, hasSubChannel, online, start, limit); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |    @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 List<DeviceChannelExtend> queryChannelsByDeviceId(String deviceId, List<String> channelIds, Boolean online) { | 
 |  |  |       return deviceChannelMapper.queryChannelsWithDeviceInfo(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; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  | 
 |  |  |     */ | 
 |  |  |    @Override | 
 |  |  |    public synchronized boolean insertMobilePosition(MobilePosition mobilePosition) { | 
 |  |  |       if (mobilePosition.getDeviceId().equals(mobilePosition.getChannelId())) { | 
 |  |  |          mobilePosition.setChannelId(null); | 
 |  |  |       } | 
 |  |  |       return deviceMobilePositionMapper.insertNewPosition(mobilePosition) > 0; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public PageInfo<ParentPlatform> queryParentPlatformList(int page, int count) { | 
 |  |  |       PageHelper.startPage(page, count); | 
 |  |  |       List<ParentPlatform> all = platformMapper.getParentPlatformList(); | 
 |  |  |       return new PageInfo<>(all); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public ParentPlatform queryParentPlatByServerGBId(String platformGbId) { | 
 |  |  |       return platformMapper.getParentPlatByServerGBId(platformGbId); | 
 |  |  |    } | 
 |  |  | 
 |  |  |    @Override | 
 |  |  |    public List<ParentPlatform> queryEnableParentPlatformList(boolean enable) { | 
 |  |  |       return platformMapper.getEnableParentPlatformList(enable); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public List<ParentPlatform> queryEnablePlatformListWithAsMessageChannel() { | 
 |  |  |       return platformMapper.queryEnablePlatformListWithAsMessageChannel(); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public List<Device> queryDeviceWithAsMessageChannel() { | 
 |  |  |       return deviceMapper.queryDeviceWithAsMessageChannel(); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  | 
 |  |  |  | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public Device queryDeviceInfoByPlatformIdAndChannelId(String platformId, String channelId) { | 
 |  |  |       List<Device> devices = platformChannelMapper.queryDeviceInfoByPlatformIdAndChannelId(platformId, channelId); | 
 |  |  |       if (devices.size() > 1) { | 
 |  |  |          // 出现长度大于0的时候肯定是国标通道的ID重复了 | 
 |  |  |          logger.warn("国标ID存在重复:{}", channelId); | 
 |  |  |       } | 
 |  |  |       if (devices.size() == 0) { | 
 |  |  |          return null; | 
 |  |  |       }else { | 
 |  |  |          return devices.get(0); | 
 |  |  |       } | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  |     * 查询最新移动位置 | 
 |  |  |     * @param deviceId | 
 |  |  | 
 |  |  |     */ | 
 |  |  |    @Override | 
 |  |  |    public List<DeviceChannel> queryGbStreamListInPlatform(String platformId) { | 
 |  |  |       return gbStreamMapper.queryGbStreamListInPlatform(platformId); | 
 |  |  |       return gbStreamMapper.queryGbStreamListInPlatform(platformId, userSetting.isUsePushingAsStatus()); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  | 
 |  |  |       if (platform == null) { | 
 |  |  |          return 0; | 
 |  |  |       } | 
 |  |  |       if (platform.getTreeType().equals(TreeType.BUSINESS_GROUP)) { | 
 |  |  |          if (platformCatalog.getPlatformId().equals(platformCatalog.getParentId())) { | 
 |  |  |             // 第一层节点 | 
 |  |  |             platformCatalog.setBusinessGroupId(platformCatalog.getId()); | 
 |  |  |             platformCatalog.setParentId(platform.getDeviceGBId()); | 
 |  |  |          }else { | 
 |  |  |             // 获取顶层的 | 
 |  |  |             PlatformCatalog topCatalog = getTopCatalog(platformCatalog.getParentId(), platform.getDeviceGBId()); | 
 |  |  |             platformCatalog.setBusinessGroupId(topCatalog.getId()); | 
 |  |  |       if (platformCatalog.getId().length() <= 8) { | 
 |  |  |          platformCatalog.setCivilCode(platformCatalog.getParentId()); | 
 |  |  |       }else { | 
 |  |  |          if (platformCatalog.getId().length() != 20) { | 
 |  |  |             return 0; | 
 |  |  |          } | 
 |  |  |          if (platformCatalog.getParentId() != null) { | 
 |  |  |             switch (Integer.parseInt(platformCatalog.getId().substring(10, 13))){ | 
 |  |  |                case 200: | 
 |  |  |                case 215: | 
 |  |  |                   if (platformCatalog.getParentId().length() <= 8) { | 
 |  |  |                      platformCatalog.setCivilCode(platformCatalog.getParentId()); | 
 |  |  |                   }else { | 
 |  |  |                      PlatformCatalog catalog = catalogMapper.selectByPlatFormAndCatalogId(platformCatalog.getPlatformId(), platformCatalog.getParentId()); | 
 |  |  |                      if (catalog != null) { | 
 |  |  |                         platformCatalog.setCivilCode(catalog.getCivilCode()); | 
 |  |  |                      } | 
 |  |  |                   } | 
 |  |  |                   break; | 
 |  |  |                case 216: | 
 |  |  |                   if (platformCatalog.getParentId().length() <= 8) { | 
 |  |  |                      platformCatalog.setCivilCode(platformCatalog.getParentId()); | 
 |  |  |                   }else { | 
 |  |  |                      PlatformCatalog catalog = catalogMapper.selectByPlatFormAndCatalogId(platformCatalog.getPlatformId(),platformCatalog.getParentId()); | 
 |  |  |                      if (catalog == null) { | 
 |  |  |                         logger.warn("[添加目录] 无法获取目录{}的CivilCode和BusinessGroupId", platformCatalog.getPlatformId()); | 
 |  |  |                         break; | 
 |  |  |                      } | 
 |  |  |                      platformCatalog.setCivilCode(catalog.getCivilCode()); | 
 |  |  |                      if (Integer.parseInt(platformCatalog.getParentId().substring(10, 13)) == 215) { | 
 |  |  |                         platformCatalog.setBusinessGroupId(platformCatalog.getParentId()); | 
 |  |  |                      }else { | 
 |  |  |                         if (Integer.parseInt(platformCatalog.getParentId().substring(10, 13)) == 216) { | 
 |  |  |                            platformCatalog.setBusinessGroupId(catalog.getBusinessGroupId()); | 
 |  |  |                         } | 
 |  |  |                      } | 
 |  |  |                   } | 
 |  |  |                   break; | 
 |  |  |                default: | 
 |  |  |                   break; | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |       if (platform.getTreeType().equals(TreeType.CIVIL_CODE)) { | 
 |  |  |          platformCatalog.setCivilCode(platformCatalog.getId()); | 
 |  |  |          if (platformCatalog.getPlatformId().equals(platformCatalog.getParentId())) { | 
 |  |  |             // 第一层节点 | 
 |  |  |             platformCatalog.setParentId(platform.getDeviceGBId()); | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       int result = catalogMapper.add(platformCatalog); | 
 |  |  |       if (result > 0) { | 
 |  |  |          DeviceChannel deviceChannel = getDeviceChannelByCatalog(platformCatalog); | 
 |  |  | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    private PlatformCatalog getTopCatalog(String id, String platformId) { | 
 |  |  |       PlatformCatalog catalog = catalogMapper.selectParentCatalog(id); | 
 |  |  |       PlatformCatalog catalog = catalogMapper.selectByPlatFormAndCatalogId(platformId, id); | 
 |  |  |       if (catalog.getParentId().equals(platformId)) { | 
 |  |  |          return catalog; | 
 |  |  |       }else { | 
 |  |  | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public PlatformCatalog getCatalog(String id) { | 
 |  |  |       return catalogMapper.select(id); | 
 |  |  |    public PlatformCatalog getCatalog(String platformId, String id) { | 
 |  |  |       return catalogMapper.selectByPlatFormAndCatalogId(platformId, id); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @Override | 
 |  |  |    public int delCatalog(String id) { | 
 |  |  |       PlatformCatalog platformCatalog = catalogMapper.select(id); | 
 |  |  |       if (platformCatalog.getChildrenCount() > 0) { | 
 |  |  |          List<PlatformCatalog> platformCatalogList = catalogMapper.selectByParentId(platformCatalog.getPlatformId(), platformCatalog.getId()); | 
 |  |  |          for (PlatformCatalog catalog : platformCatalogList) { | 
 |  |  |             if (catalog.getChildrenCount() == 0) { | 
 |  |  |                delCatalogExecute(catalog.getId(), catalog.getPlatformId()); | 
 |  |  |             }else { | 
 |  |  |                delCatalog(catalog.getId()); | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |       return delCatalogExecute(id, platformCatalog.getPlatformId()); | 
 |  |  |    public int delCatalog(String platformId, String id) { | 
 |  |  |       return delCatalogExecute(id, platformId); | 
 |  |  |    } | 
 |  |  |    private int delCatalogExecute(String id, String platformId) { | 
 |  |  |       int delresult =  catalogMapper.del(id); | 
 |  |  |       int delresult =  catalogMapper.del(platformId, id); | 
 |  |  |       DeviceChannel deviceChannelForCatalog = new DeviceChannel(); | 
 |  |  |       if (delresult > 0){ | 
 |  |  |          deviceChannelForCatalog.setChannelId(id); | 
 |  |  | 
 |  |  |          } | 
 |  |  |          eventPublisher.catalogEventPublish(platformId, deviceChannelList, CatalogEvent.DEL); | 
 |  |  |       } | 
 |  |  |       int delStreamresult = platformGbStreamMapper.delByCatalogId(id); | 
 |  |  |       int delStreamresult = platformGbStreamMapper.delByPlatformAndCatalogId(platformId,id); | 
 |  |  |       List<PlatformCatalog> platformCatalogs = platformChannelMapper.queryChannelInParentPlatformAndCatalog(platformId, id); | 
 |  |  |       if (platformCatalogs.size() > 0){ | 
 |  |  |          List<DeviceChannel> deviceChannelList = new ArrayList<>(); | 
 |  |  | 
 |  |  |          } | 
 |  |  |          eventPublisher.catalogEventPublish(platformId, deviceChannelList, CatalogEvent.DEL); | 
 |  |  |       } | 
 |  |  |       int delChannelresult = platformChannelMapper.delByCatalogId(id); | 
 |  |  |       int delChannelresult = platformChannelMapper.delByCatalogId(platformId, id); | 
 |  |  |       return delresult + delChannelresult + delStreamresult; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  | 
 |  |  |       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()); | 
 |  |  |       DeviceChannel deviceChannel = new DeviceChannel(); | 
 |  |  |       deviceChannel.setChannelId(catalog.getId()); | 
 |  |  |       deviceChannel.setName(catalog.getName()); | 
 |  |  |       deviceChannel.setLongitude(0.0); | 
 |  |  |       deviceChannel.setLatitude(0.0); | 
 |  |  |       deviceChannel.setDeviceId(platform.getDeviceGBId()); | 
 |  |  |       deviceChannel.setManufacture("wvp-pro"); | 
 |  |  |       deviceChannel.setStatus(1); | 
 |  |  |       deviceChannel.setStatus(true); | 
 |  |  |       deviceChannel.setParental(1); | 
 |  |  |  | 
 |  |  |       deviceChannel.setRegisterWay(1); | 
 |  |  |       // 行政区划应该是Domain的前八位 | 
 |  |  |       if (platform.getTreeType().equals(TreeType.BUSINESS_GROUP)) { | 
 |  |  |          deviceChannel.setParentId(catalog.getParentId()); | 
 |  |  |          deviceChannel.setBusinessGroupId(catalog.getBusinessGroupId()); | 
 |  |  |       } | 
 |  |  |       deviceChannel.setParentId(catalog.getParentId()); | 
 |  |  |       deviceChannel.setBusinessGroupId(catalog.getBusinessGroupId()); | 
 |  |  |  | 
 |  |  |       deviceChannel.setModel("live"); | 
 |  |  |       deviceChannel.setOwner("wvp-pro"); |