package com.xiaopeng.operation.service.impl;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.xiaopeng.api.model.operation.XpPoint;
|
import com.xiaopeng.operation.dto.NearestDto;
|
import com.xiaopeng.operation.mapper.XpPointMapper;
|
import com.xiaopeng.operation.service.XpPointService;
|
import com.xiaopeng.operation.utils.map.FastDistanceCalculator;
|
import com.xiaopeng.operation.vo.NearestNextVo;
|
import com.xiaopeng.operation.vo.NearestVo;
|
import org.springframework.stereotype.Service;
|
|
import java.util.ArrayList;
|
import java.util.Comparator;
|
import java.util.List;
|
import java.util.stream.Collectors;
|
|
/**
|
* <p>
|
* 点位管理 服务实现类
|
* </p>
|
*
|
* @author liu
|
* @since 2026-02-03
|
*/
|
@Service
|
public class XpPointServiceImpl extends ServiceImpl<XpPointMapper, XpPoint> implements XpPointService {
|
|
|
|
@Override
|
public NearestVo nearest(NearestDto dto) {
|
// 获取所有的站点信息
|
List<XpPoint> list = list(new LambdaQueryWrapper<XpPoint>().eq(XpPoint::getOperationStatus,1));
|
NearestVo nearestVo = new NearestVo();
|
List<NearestNextVo> nearestNextVos = new ArrayList<>();
|
for (XpPoint xpPoint : list) {
|
// 计算距离 小于1000m的站点
|
double v = FastDistanceCalculator.distanceFast(dto.getLatitude(), dto.getLongitude(), xpPoint.getPointLat(), xpPoint.getPointLon());
|
if(v<1000){
|
NearestNextVo nearestNextVo = new NearestNextVo();
|
nearestNextVo.setId(xpPoint.getId());
|
nearestNextVo.setName(xpPoint.getPointName());
|
nearestNextVo.setLatitude(xpPoint.getPointLat());
|
nearestNextVo.setLongitude(xpPoint.getPointLon());
|
nearestNextVo.setDistance(v);
|
nearestNextVo.setAddress(xpPoint.getPointAddress());
|
nearestNextVo.setTime(xpPoint.getParkingTimeLimit());
|
nearestNextVos.add(nearestNextVo);
|
}
|
}
|
if(!nearestNextVos.isEmpty()){
|
nearestNextVos = nearestNextVos.stream().sorted(Comparator.comparing(NearestNextVo::getDistance)).collect(Collectors.toList());
|
}
|
nearestVo.setPoints(nearestNextVos);
|
nearestVo.setTotal(nearestNextVos.size());
|
return nearestVo;
|
}
|
}
|