MobilePositionServiceImpl.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package com.genersoft.iot.vmp.service.impl;
  2. import com.genersoft.iot.vmp.conf.UserSetting;
  3. import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
  4. import com.genersoft.iot.vmp.gb28181.bean.MobilePosition;
  5. import com.genersoft.iot.vmp.gb28181.bean.Platform;
  6. import com.genersoft.iot.vmp.gb28181.dao.PlatformMapper;
  7. import com.genersoft.iot.vmp.service.IMobilePositionService;
  8. import com.genersoft.iot.vmp.gb28181.dao.DeviceChannelMapper;
  9. import com.genersoft.iot.vmp.gb28181.dao.DeviceMobilePositionMapper;
  10. import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.data.redis.core.RedisTemplate;
  14. import org.springframework.scheduling.annotation.Scheduled;
  15. import org.springframework.stereotype.Service;
  16. import org.springframework.transaction.annotation.Transactional;
  17. import java.util.ArrayList;
  18. import java.util.HashMap;
  19. import java.util.List;
  20. import java.util.Map;
  21. @Slf4j
  22. @Service
  23. public class MobilePositionServiceImpl implements IMobilePositionService {
  24. @Autowired
  25. private DeviceChannelMapper channelMapper;
  26. @Autowired
  27. private DeviceMobilePositionMapper mobilePositionMapper;
  28. @Autowired
  29. private UserSetting userSetting;
  30. @Autowired
  31. private PlatformMapper platformMapper;
  32. @Autowired
  33. private RedisTemplate<String, MobilePosition> redisTemplate;
  34. private final String REDIS_MOBILE_POSITION_LIST = "redis_mobile_position_list";
  35. @Override
  36. public void add(MobilePosition mobilePosition) {
  37. List<MobilePosition> list = new ArrayList<>();
  38. list.add(mobilePosition);
  39. add(list);
  40. }
  41. @Override
  42. public void add(List<MobilePosition> mobilePositionList) {
  43. redisTemplate.opsForList().leftPushAll(REDIS_MOBILE_POSITION_LIST, mobilePositionList);
  44. }
  45. private List<MobilePosition> get(int length) {
  46. Long size = redisTemplate.opsForList().size(REDIS_MOBILE_POSITION_LIST);
  47. if (size == null || size == 0) {
  48. return new ArrayList<>();
  49. }
  50. List<MobilePosition> mobilePositions;
  51. if (size > length) {
  52. mobilePositions = redisTemplate.opsForList().rightPop(REDIS_MOBILE_POSITION_LIST, length);
  53. }else {
  54. mobilePositions = redisTemplate.opsForList().rightPop(REDIS_MOBILE_POSITION_LIST, size);
  55. }
  56. return mobilePositions;
  57. }
  58. /**
  59. * 查询移动位置轨迹
  60. */
  61. @Override
  62. public synchronized List<MobilePosition> queryMobilePositions(String deviceId, String channelId, String startTime, String endTime) {
  63. return mobilePositionMapper.queryPositionByDeviceIdAndTime(deviceId, channelId, startTime, endTime);
  64. }
  65. @Override
  66. public List<Platform> queryEnablePlatformListWithAsMessageChannel() {
  67. return platformMapper.queryEnablePlatformListWithAsMessageChannel();
  68. }
  69. /**
  70. * 查询最新移动位置
  71. * @param deviceId
  72. */
  73. @Override
  74. public MobilePosition queryLatestPosition(String deviceId) {
  75. return mobilePositionMapper.queryLatestPositionByDevice(deviceId);
  76. }
  77. @Override
  78. public void updateStreamGPS(List<GPSMsgInfo> gpsMsgInfoList) {
  79. channelMapper.updateStreamGPS(gpsMsgInfoList);
  80. }
  81. @Scheduled(fixedRate = 1000)
  82. @Transactional
  83. public void executeTaskQueue() {
  84. int countLimit = 3000;
  85. List<MobilePosition> mobilePositions = get(countLimit);
  86. if (mobilePositions == null || mobilePositions.isEmpty()) {
  87. return;
  88. }
  89. if (userSetting.getSavePositionHistory()) {
  90. mobilePositionMapper.batchadd(mobilePositions);
  91. }
  92. log.info("[移动位置订阅]更新通道位置: {}", mobilePositions.size());
  93. Map<String, DeviceChannel> updateChannelMap = new HashMap<>();
  94. for (MobilePosition mobilePosition : mobilePositions) {
  95. DeviceChannel deviceChannel = new DeviceChannel();
  96. deviceChannel.setDeviceId(mobilePosition.getDeviceId());
  97. deviceChannel.setLongitude(mobilePosition.getLongitude());
  98. deviceChannel.setLatitude(mobilePosition.getLatitude());
  99. deviceChannel.setGpsTime(mobilePosition.getTime());
  100. updateChannelMap.put(mobilePosition.getDeviceId() + mobilePosition.getChannelId(), deviceChannel);
  101. }
  102. List<DeviceChannel> channels = new ArrayList<>(updateChannelMap.values());
  103. channelMapper.batchUpdatePosition(channels);
  104. }
  105. }