TopologicalBuildWdSereviceImpl.java 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  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.BuildWd;
  7. import com.ruoyi.demo.entity.TopologicalBuildingWd;
  8. import com.ruoyi.demo.entity.WdInfo;
  9. import com.ruoyi.demo.entity.bo.BuildWdCategoryCount;
  10. import com.ruoyi.demo.entity.bo.Histogram;
  11. import com.ruoyi.demo.entity.vo.TopologicalWdAceeptVo;
  12. import com.ruoyi.demo.mapper.BuildWdDao;
  13. import com.ruoyi.demo.mapper.WdInfoDao;
  14. import com.ruoyi.demo.service.TopologicalBuildWdSerevice;
  15. import com.ruoyi.demo.utils.InitMapUtil;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.data.geo.Circle;
  18. import org.springframework.data.geo.Distance;
  19. import org.springframework.data.geo.GeoResults;
  20. import org.springframework.data.geo.Point;
  21. import org.springframework.data.redis.connection.RedisGeoCommands;
  22. import org.springframework.data.redis.core.RedisTemplate;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.transaction.annotation.Transactional;
  25. import java.math.BigDecimal;
  26. import java.util.ArrayList;
  27. import java.util.HashMap;
  28. import java.util.List;
  29. @Service
  30. @Transactional
  31. public class TopologicalBuildWdSereviceImpl implements TopologicalBuildWdSerevice {
  32. @Autowired
  33. WdInfoDao wdInfoDao;
  34. @Autowired
  35. InitMapUtil initMapUtil;
  36. @Autowired
  37. RedisTemplate redisTemplate;
  38. @Autowired
  39. BuildWdDao buildWdDao;
  40. /**
  41. * 周边楼宇物业类别统计
  42. * @param topologicalWdAceeptVo
  43. * @return
  44. */
  45. @Override
  46. public List<BuildWdCategoryCount> buildingLevel(TopologicalWdAceeptVo topologicalWdAceeptVo) {
  47. List<String> aroundWdId = new ArrayList<>();
  48. //1.根据经纬度 找到 周边网点Id 及 距离
  49. getAroundWdIdList(topologicalWdAceeptVo,aroundWdId,null);
  50. if (aroundWdId.isEmpty())
  51. return new ArrayList<>();
  52. //2.分页查找网点信息
  53. QueryWrapper<BuildWd> queryWrapper = new QueryWrapper<>();
  54. queryWrapper.select("property_type","count(*) as people_count");
  55. queryWrapper.in("wd_id",aroundWdId);
  56. queryWrapper.groupBy("property_type");
  57. List<BuildWd> buildWds = buildWdDao.selectList(queryWrapper);
  58. //3.封装结果集
  59. List<BuildWdCategoryCount> list = new ArrayList<>();
  60. for (BuildWd buildWd : buildWds) {
  61. if (buildWd.getPropertyType().equals(""))
  62. continue;
  63. BuildWdCategoryCount buildWdCategoryCount = new BuildWdCategoryCount();
  64. buildWdCategoryCount.setName(buildWd.getPropertyType());
  65. buildWdCategoryCount.setCount(buildWd.getPeopleCount());
  66. list.add(buildWdCategoryCount);
  67. }
  68. return list;
  69. }
  70. /**
  71. * 获取周边楼宇列表
  72. * @param topologicalWdAceeptVo
  73. * @return
  74. */
  75. @Override
  76. public HashMap<String,Object> list(TopologicalWdAceeptVo topologicalWdAceeptVo) {
  77. List<String> aroundWdId = new ArrayList<>();
  78. HashMap<String,Double> wdDistMap = new HashMap<>();
  79. //1.根据经纬度 找到 周边网点Id 及 距离
  80. getAroundWdIdList(topologicalWdAceeptVo,aroundWdId,wdDistMap);
  81. if (aroundWdId.isEmpty()){
  82. //没有周边网点
  83. HashMap<String,Object> result = new HashMap();
  84. Page<WdInfo> page = new Page<>(topologicalWdAceeptVo.getPageNum(),topologicalWdAceeptVo.getPageSize());
  85. result.put("page",page);
  86. result.put("data",new ArrayList<>());
  87. return result;
  88. }
  89. //2.分页查找网点信息
  90. QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
  91. queryWrapper.eq("wd_type_code","3");
  92. queryWrapper.and(wdInfoQueryWrapper -> {
  93. wdInfoQueryWrapper.in("wd_id", aroundWdId);
  94. });
  95. Page<WdInfo> page = new Page<>(topologicalWdAceeptVo.getPageNum(),topologicalWdAceeptVo.getPageSize());
  96. Page<WdInfo> page1 = wdInfoDao.selectPage(page, queryWrapper);
  97. //3.组装结果集
  98. List<TopologicalBuildingWd> list = new ArrayList<>(); //返回结果集
  99. for (WdInfo wdInfo : page1.getRecords()) {
  100. TopologicalBuildingWd topologicalBuildingWd = new TopologicalBuildingWd(wdInfo);
  101. //topologicalBuildingWd.setAddrCodeInfo(initMapUtil.getInitAddrCodeMap(topologicalBuildingWd.getAddrCode()));
  102. BigDecimal bigDecimal = new BigDecimal(wdDistMap.get(wdInfo.getWdId()));
  103. topologicalBuildingWd.setDistance(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
  104. list.add(topologicalBuildingWd);
  105. }
  106. //5.返回结果
  107. HashMap<String,Object> result = new HashMap();
  108. page1.setRecords(null);
  109. result.put("page",page1);
  110. result.put("data",list);
  111. return result;
  112. }
  113. /**
  114. * 获取楼宇分类统计
  115. * @param topologicalWdAceeptVo
  116. * @return
  117. */
  118. @Override
  119. public List<Histogram> buildingHistogram(TopologicalWdAceeptVo topologicalWdAceeptVo) {
  120. List<String> aroundWdId = new ArrayList<>();
  121. //1.根据经纬度 找到 周边网点Id 及 距离
  122. getAroundWdIdList(topologicalWdAceeptVo,aroundWdId,null);
  123. if (aroundWdId.isEmpty())
  124. return new ArrayList<>();
  125. //2.获取符合条件的楼宇网点
  126. QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
  127. queryWrapper.select("type_code_by","count(*) as audit");
  128. queryWrapper.and(queryWrapper2 -> {
  129. queryWrapper2.eq("wd_type_code","3");
  130. });
  131. queryWrapper.and(queryWrapper2 -> {
  132. queryWrapper2.isNotNull("type_code_by");
  133. });
  134. queryWrapper.groupBy("type_code_by");
  135. List<WdInfo> wdInfos = wdInfoDao.selectList(queryWrapper);
  136. //3.统计楼宇分类
  137. int total = 0;
  138. HashMap<String,Integer> hashMap = new HashMap<>();
  139. for (WdInfo wdInfo : wdInfos) {
  140. if(wdInfo.getTypeCodeBy() == null)
  141. continue;
  142. String typeCodeBy = wdInfo.getTypeCodeBy().substring(0,2);
  143. Integer integer = hashMap.get(typeCodeBy);
  144. if (integer == null){
  145. hashMap.put(typeCodeBy,wdInfo.getAudit());
  146. }else {
  147. hashMap.put(typeCodeBy,hashMap.get(typeCodeBy)+wdInfo.getAudit());
  148. }
  149. total+=wdInfo.getAudit();
  150. }
  151. //4.封装结果集
  152. ArrayList<Histogram> list = new ArrayList<>();
  153. for (String s : hashMap.keySet()) {
  154. Integer integer = hashMap.get(s);
  155. String initTypeByMap = initMapUtil.getInitTypeByMap(s + "0000").replace(":","");
  156. Histogram histogram = new Histogram();
  157. histogram.setName(initTypeByMap);
  158. histogram.setCount(integer);
  159. list.add(histogram);
  160. }
  161. return list;
  162. }
  163. /**
  164. * 根据坐标获取周边网点Id
  165. * @param topologicalWdAceeptVo
  166. * @param aroundWdIdList
  167. * @param wdDistMap 存储 周边网点与中心网点直接的距离
  168. */
  169. public void getAroundWdIdList(TopologicalWdAceeptVo topologicalWdAceeptVo,List<String> aroundWdIdList,HashMap<String,Double> wdDistMap){
  170. //1.根据经纬度 找到 周边网点Id
  171. // 以经纬度为中心,获取半径不超过最大距离的所有元素
  172. Point point = new Point(topologicalWdAceeptVo.getLng(),topologicalWdAceeptVo.getLat());
  173. //半径范围
  174. Distance distance = new Distance(topologicalWdAceeptVo.getRadius(), RedisGeoCommands.DistanceUnit.METERS);
  175. //圆
  176. Circle circle = new Circle(point, distance);
  177. RedisGeoCommands.GeoRadiusCommandArgs geoRadiusCommandArgs = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs();
  178. geoRadiusCommandArgs.includeDistance(); //添加参数:返回距离
  179. GeoResults<RedisGeoCommands.GeoLocation<Object>> radius = redisTemplate.boundGeoOps(topologicalWdAceeptVo.getAddrCode().substring(0, 4)).radius(circle,geoRadiusCommandArgs);
  180. //解析周边网点Id
  181. radius.getContent().stream().forEach(item -> {
  182. //记录网点坐标及距离
  183. aroundWdIdList.add((String) item.getContent().getName());
  184. if (wdDistMap != null)
  185. wdDistMap.put((String) item.getContent().getName(), item.getDistance().getValue());
  186. });
  187. }
  188. }