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.api.model.operation.XpSystemSetting;
import com.xiaopeng.operation.dto.NearestDto;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.operation.mapper.XpPointMapper;
import com.xiaopeng.operation.mapper.XpSystemSettingMapper;
import com.xiaopeng.operation.query.PointMapQuery;
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 javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 点位管理 服务实现类
*
*
* @author liu
* @author WuGuanFengYue
* @since 2026-02-03
*/
@Service
public class XpPointServiceImpl extends ServiceImpl implements XpPointService {
@Resource
private XpSystemSettingMapper xpSystemSettingMapper;
@Override
public NearestVo nearest(NearestDto dto) {
// 获取所有的站点信息
List list = list(new LambdaQueryWrapper().eq(XpPoint::getOperationStatus, 1));
NearestVo nearestVo = new NearestVo();
List nearestNextVos = new ArrayList<>();
XpSystemSetting xpSystemSetting = xpSystemSettingMapper.selectOne(null);
Integer orderDistance = xpSystemSetting.getOrderDistance();
for (XpPoint xpPoint : list) {
// 计算距离 小于的站点
double v = FastDistanceCalculator.distanceFast(dto.getLatitude(), dto.getLongitude(), xpPoint.getPointLat(), xpPoint.getPointLon());
if (v < orderDistance) {
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;
}
@Override
public PageInfo pointMap(PointMapQuery query) {
PageInfo pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
List list = this.baseMapper.pointMap(pageInfo,query);
pageInfo.setRecords( list);
return pageInfo;
}
}