1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- package com.ruoyi.demo.service.impl;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.github.pagehelper.PageHelper;
- import com.github.pagehelper.PageInfo;
- import com.ruoyi.demo.entity.TopologicalEnterpriseWd;
- import com.ruoyi.demo.entity.WdInfo;
- import com.ruoyi.demo.entity.vo.TopologicalWdAceeptVo;
- import com.ruoyi.demo.mapper.WdInfoDao;
- import com.ruoyi.demo.service.TopologicalEnterpriseWdService;
- import com.ruoyi.demo.utils.InitMapUtil;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.geo.Circle;
- import org.springframework.data.geo.Distance;
- import org.springframework.data.geo.GeoResults;
- import org.springframework.data.geo.Point;
- import org.springframework.data.redis.connection.RedisGeoCommands;
- import org.springframework.data.redis.core.RedisTemplate;
- import org.springframework.stereotype.Service;
- import java.math.BigDecimal;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- @Service
- public class TopologicalEnterpriseWdServiceImpl implements TopologicalEnterpriseWdService {
- @Autowired
- WdInfoDao wdInfoDao;
- @Autowired
- InitMapUtil initMapUtil;
- @Autowired
- RedisTemplate redisTemplate;
- @Override
- public List<TopologicalEnterpriseWd> list(TopologicalWdAceeptVo topologicalWdAceeptVo) {
- //1.根据中心网点Id找到网点详细信息
- QueryWrapper<WdInfo> queryWrapper1 = new QueryWrapper<>();
- queryWrapper1.eq("wd_id",topologicalWdAceeptVo.getCenterWdId());
- WdInfo wdInfo1 = wdInfoDao.selectOne(queryWrapper1);
- //2.根据中心网点找到周边网点Id
- // 以经纬度为中心,获取半径不超过最大距离的所有元素
- Point point = new Point(wdInfo1.getLng().doubleValue(),wdInfo1.getLat().doubleValue());
- //半径范围
- Distance distance = new Distance(topologicalWdAceeptVo.getRadius(), RedisGeoCommands.DistanceUnit.METERS);
- //圆
- Circle circle = new Circle(point, distance);
- RedisGeoCommands.GeoRadiusCommandArgs geoRadiusCommandArgs = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs();
- geoRadiusCommandArgs.includeDistance();
- GeoResults<RedisGeoCommands.GeoLocation<Object>> radius = redisTemplate.boundGeoOps(wdInfo1.getAddrCode().substring(0, 4)).radius(circle,geoRadiusCommandArgs);
- //周边网点Id
- List<String> aroundWdId = new ArrayList<>();
- HashMap<String,Double> hashMap = new HashMap<>();
- radius.getContent().stream().forEach(item -> {
- //记录网点坐标及距离
- aroundWdId.add((String) item.getContent().getName());
- hashMap.put((String) item.getContent().getName(), item.getDistance().getValue());
- });
- if (aroundWdId.isEmpty())
- return new ArrayList<>();
- //4.分页查找网点信息
- QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
- queryWrapper.eq("wd_type_code","5");
- queryWrapper.and(wdInfoQueryWrapper -> {
- wdInfoQueryWrapper.in("wd_id", aroundWdId);
- });
- //5.查询周边网点结果
- PageHelper.startPage(1, topologicalWdAceeptVo.getSize());
- List<WdInfo> wdInfos = wdInfoDao.selectList(queryWrapper);
- PageInfo<WdInfo> pageInfo = new PageInfo<>(wdInfos);
- //6.组装结果集
- List<TopologicalEnterpriseWd> list = new ArrayList<>(); //返回结果集
- for (WdInfo wdInfo : pageInfo.getList()) {
- TopologicalEnterpriseWd topologicalEnterpriseWd = new TopologicalEnterpriseWd(wdInfo);
- topologicalEnterpriseWd.setAddrCodeInfo(initMapUtil.getInitAddrCodeMap(topologicalEnterpriseWd.getAddrCode()));
- BigDecimal bigDecimal = new BigDecimal(hashMap.get(wdInfo.getWdId()));
- topologicalEnterpriseWd.setDistance(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
- list.add(topologicalEnterpriseWd);
- }
- return list;
- }
- }
|