TopologicalEnterpriseWdServiceImpl.java 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package com.ruoyi.demo.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.github.pagehelper.PageHelper;
  4. import com.github.pagehelper.PageInfo;
  5. import com.ruoyi.demo.entity.TopologicalEnterpriseWd;
  6. import com.ruoyi.demo.entity.WdInfo;
  7. import com.ruoyi.demo.entity.vo.TopologicalWdAceeptVo;
  8. import com.ruoyi.demo.mapper.WdInfoDao;
  9. import com.ruoyi.demo.service.TopologicalEnterpriseWdService;
  10. import com.ruoyi.demo.utils.InitMapUtil;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.data.geo.Circle;
  13. import org.springframework.data.geo.Distance;
  14. import org.springframework.data.geo.GeoResults;
  15. import org.springframework.data.geo.Point;
  16. import org.springframework.data.redis.connection.RedisGeoCommands;
  17. import org.springframework.data.redis.core.RedisTemplate;
  18. import org.springframework.stereotype.Service;
  19. import java.math.BigDecimal;
  20. import java.util.ArrayList;
  21. import java.util.HashMap;
  22. import java.util.List;
  23. @Service
  24. public class TopologicalEnterpriseWdServiceImpl implements TopologicalEnterpriseWdService {
  25. @Autowired
  26. WdInfoDao wdInfoDao;
  27. @Autowired
  28. InitMapUtil initMapUtil;
  29. @Autowired
  30. RedisTemplate redisTemplate;
  31. @Override
  32. public List<TopologicalEnterpriseWd> list(TopologicalWdAceeptVo topologicalWdAceeptVo) {
  33. //1.根据中心网点Id找到网点详细信息
  34. QueryWrapper<WdInfo> queryWrapper1 = new QueryWrapper<>();
  35. queryWrapper1.eq("wd_id",topologicalWdAceeptVo.getCenterWdId());
  36. WdInfo wdInfo1 = wdInfoDao.selectOne(queryWrapper1);
  37. //2.根据中心网点找到周边网点Id
  38. // 以经纬度为中心,获取半径不超过最大距离的所有元素
  39. Point point = new Point(wdInfo1.getLng().doubleValue(),wdInfo1.getLat().doubleValue());
  40. //半径范围
  41. Distance distance = new Distance(topologicalWdAceeptVo.getRadius(), RedisGeoCommands.DistanceUnit.METERS);
  42. //圆
  43. Circle circle = new Circle(point, distance);
  44. RedisGeoCommands.GeoRadiusCommandArgs geoRadiusCommandArgs = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs();
  45. geoRadiusCommandArgs.includeDistance();
  46. GeoResults<RedisGeoCommands.GeoLocation<Object>> radius = redisTemplate.boundGeoOps(wdInfo1.getAddrCode().substring(0, 4)).radius(circle,geoRadiusCommandArgs);
  47. //周边网点Id
  48. List<String> aroundWdId = new ArrayList<>();
  49. HashMap<String,Double> hashMap = new HashMap<>();
  50. radius.getContent().stream().forEach(item -> {
  51. //记录网点坐标及距离
  52. aroundWdId.add((String) item.getContent().getName());
  53. hashMap.put((String) item.getContent().getName(), item.getDistance().getValue());
  54. });
  55. if (aroundWdId.isEmpty())
  56. return new ArrayList<>();
  57. //4.分页查找网点信息
  58. QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
  59. queryWrapper.eq("wd_type_code","5");
  60. queryWrapper.and(wdInfoQueryWrapper -> {
  61. wdInfoQueryWrapper.in("wd_id", aroundWdId);
  62. });
  63. //5.查询周边网点结果
  64. PageHelper.startPage(1, topologicalWdAceeptVo.getSize());
  65. List<WdInfo> wdInfos = wdInfoDao.selectList(queryWrapper);
  66. PageInfo<WdInfo> pageInfo = new PageInfo<>(wdInfos);
  67. //6.组装结果集
  68. List<TopologicalEnterpriseWd> list = new ArrayList<>(); //返回结果集
  69. for (WdInfo wdInfo : pageInfo.getList()) {
  70. TopologicalEnterpriseWd topologicalEnterpriseWd = new TopologicalEnterpriseWd(wdInfo);
  71. topologicalEnterpriseWd.setAddrCodeInfo(initMapUtil.getInitAddrCodeMap(topologicalEnterpriseWd.getAddrCode()));
  72. BigDecimal bigDecimal = new BigDecimal(hashMap.get(wdInfo.getWdId()));
  73. topologicalEnterpriseWd.setDistance(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
  74. list.add(topologicalEnterpriseWd);
  75. }
  76. return list;
  77. }
  78. }