TopologicalEnterpriseWdServiceImpl.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package com.ruoyi.demo.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  4. import com.github.pagehelper.PageHelper;
  5. import com.github.pagehelper.PageInfo;
  6. import com.ruoyi.demo.entity.TopologicalEnterpriseWd;
  7. import com.ruoyi.demo.entity.WdInfo;
  8. import com.ruoyi.demo.entity.vo.TopologicalWdAceeptVo;
  9. import com.ruoyi.demo.mapper.WdInfoDao;
  10. import com.ruoyi.demo.service.TopologicalEnterpriseWdService;
  11. import com.ruoyi.demo.utils.InitMapUtil;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.data.geo.Circle;
  14. import org.springframework.data.geo.Distance;
  15. import org.springframework.data.geo.GeoResults;
  16. import org.springframework.data.geo.Point;
  17. import org.springframework.data.redis.connection.RedisGeoCommands;
  18. import org.springframework.data.redis.core.RedisTemplate;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.transaction.annotation.Transactional;
  21. import java.math.BigDecimal;
  22. import java.util.ArrayList;
  23. import java.util.HashMap;
  24. import java.util.List;
  25. @Service
  26. @Transactional
  27. public class TopologicalEnterpriseWdServiceImpl implements TopologicalEnterpriseWdService {
  28. @Autowired
  29. WdInfoDao wdInfoDao;
  30. @Autowired
  31. InitMapUtil initMapUtil;
  32. @Autowired
  33. RedisTemplate redisTemplate;
  34. /**
  35. * 获取周边企业网点列表
  36. * @param topologicalWdAceeptVo
  37. * @return
  38. */
  39. @Override
  40. public HashMap<String,Object> list(TopologicalWdAceeptVo topologicalWdAceeptVo) {
  41. List<String> aroundWdId = new ArrayList<>();
  42. HashMap<String,Double> wdDistMap = new HashMap<>();
  43. //1.根据经纬度 找到 周边网点Id 及 距离
  44. getAroundWdIdList(topologicalWdAceeptVo,aroundWdId,wdDistMap);
  45. if (aroundWdId.isEmpty()){
  46. //没有周边网点
  47. HashMap<String,Object> result = new HashMap();
  48. Page<WdInfo> page = new Page<>(topologicalWdAceeptVo.getPageNum(),topologicalWdAceeptVo.getPageSize());
  49. result.put("page",page);
  50. result.put("data",new ArrayList<>());
  51. return result;
  52. }
  53. //2.分页获取周边企业网点信息
  54. QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
  55. queryWrapper.eq("wd_type_code","5");
  56. queryWrapper.and(wdInfoQueryWrapper -> {
  57. wdInfoQueryWrapper.in("wd_id", aroundWdId);
  58. });
  59. Page<WdInfo> page = new Page<>(topologicalWdAceeptVo.getPageNum(),topologicalWdAceeptVo.getPageSize());
  60. Page<WdInfo> page1 = wdInfoDao.selectPage(page, queryWrapper);
  61. //3.组装结果集
  62. List<TopologicalEnterpriseWd> list = new ArrayList<>(); //返回结果集
  63. for (WdInfo wdInfo : page1.getRecords()) {
  64. TopologicalEnterpriseWd topologicalEnterpriseWd = new TopologicalEnterpriseWd(wdInfo);
  65. //topologicalEnterpriseWd.setAddrCodeInfo(initMapUtil.getInitAddrCodeMap(topologicalEnterpriseWd.getAddrCode()));
  66. BigDecimal bigDecimal = new BigDecimal(wdDistMap.get(wdInfo.getWdId()));
  67. topologicalEnterpriseWd.setDistance(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
  68. list.add(topologicalEnterpriseWd);
  69. }
  70. //4.返回结果
  71. HashMap<String,Object> result = new HashMap();
  72. page1.setRecords(null);
  73. result.put("page",page1);
  74. result.put("data",list);
  75. return result;
  76. }
  77. /**
  78. * 获取周边物流园
  79. * @param topologicalWdAceeptVo
  80. * @return
  81. */
  82. @Override
  83. public HashMap<String, Object> logisticsList(TopologicalWdAceeptVo topologicalWdAceeptVo) {
  84. List<String> aroundWdId = new ArrayList<>();
  85. HashMap<String,Double> wdDistMap = new HashMap<>();
  86. //1.根据经纬度 找到 周边网点Id 及 距离
  87. getAroundWdIdList(topologicalWdAceeptVo,aroundWdId,wdDistMap);
  88. if (aroundWdId.isEmpty()){
  89. //没有周边网点
  90. HashMap<String,Object> result = new HashMap();
  91. Page<WdInfo> page = new Page<>(topologicalWdAceeptVo.getPageNum(),topologicalWdAceeptVo.getPageSize());
  92. result.put("page",page);
  93. result.put("data",new ArrayList<>());
  94. return result;
  95. }
  96. //2.分页获取周边企业物流园网点信息
  97. QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
  98. queryWrapper.eq("wd_type_code","5");
  99. queryWrapper.and(wdInfoQueryWrapper -> {
  100. wdInfoQueryWrapper.in("wd_id", aroundWdId);
  101. });
  102. queryWrapper.and(wdInfoQueryWrapper -> {
  103. wdInfoQueryWrapper.like("wd_name","物流");
  104. });
  105. Page<WdInfo> page = new Page<>(topologicalWdAceeptVo.getPageNum(),topologicalWdAceeptVo.getPageSize());
  106. Page<WdInfo> page1 = wdInfoDao.selectPage(page, queryWrapper);
  107. //3.组装结果集
  108. List<TopologicalEnterpriseWd> list = new ArrayList<>(); //返回结果集
  109. for (WdInfo wdInfo : page1.getRecords()) {
  110. TopologicalEnterpriseWd topologicalEnterpriseWd = new TopologicalEnterpriseWd(wdInfo);
  111. //topologicalEnterpriseWd.setAddrCodeInfo(initMapUtil.getInitAddrCodeMap(topologicalEnterpriseWd.getAddrCode()));
  112. BigDecimal bigDecimal = new BigDecimal(wdDistMap.get(wdInfo.getWdId()));
  113. topologicalEnterpriseWd.setDistance(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
  114. list.add(topologicalEnterpriseWd);
  115. }
  116. //4.返回结果
  117. HashMap<String,Object> result = new HashMap();
  118. page1.setRecords(null);
  119. result.put("page",page1);
  120. result.put("data",list);
  121. return result;
  122. }
  123. /**
  124. * 根据坐标获取周边网点Id
  125. * @param topologicalWdAceeptVo
  126. * @param aroundWdIdList
  127. * @param wdDistMap 存储 周边网点与中心网点直接的距离
  128. */
  129. public void getAroundWdIdList(TopologicalWdAceeptVo topologicalWdAceeptVo,List<String> aroundWdIdList,HashMap<String,Double> wdDistMap){
  130. //1.根据经纬度 找到 周边网点Id
  131. // 以经纬度为中心,获取半径不超过最大距离的所有元素
  132. Point point = new Point(topologicalWdAceeptVo.getLng(),topologicalWdAceeptVo.getLat());
  133. //半径范围
  134. Distance distance = new Distance(topologicalWdAceeptVo.getRadius(), RedisGeoCommands.DistanceUnit.METERS);
  135. //圆
  136. Circle circle = new Circle(point, distance);
  137. RedisGeoCommands.GeoRadiusCommandArgs geoRadiusCommandArgs = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs();
  138. geoRadiusCommandArgs.includeDistance(); //添加参数:返回距离
  139. GeoResults<RedisGeoCommands.GeoLocation<Object>> radius = redisTemplate.boundGeoOps(topologicalWdAceeptVo.getAddrCode().substring(0, 4)).radius(circle,geoRadiusCommandArgs);
  140. //解析周边网点Id
  141. radius.getContent().stream().forEach(item -> {
  142. //记录网点坐标及距离
  143. aroundWdIdList.add((String) item.getContent().getName());
  144. if (wdDistMap != null)
  145. wdDistMap.put((String) item.getContent().getName(), item.getDistance().getValue());
  146. });
  147. }
  148. }