package com.xiaopeng.itinerary.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.dto.account.GetUserCouponDto;
import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
import com.xiaopeng.api.dto.map.RouteAndFareDto;
import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
import com.xiaopeng.api.feignClient.account.XpAppUserClient;
import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
import com.xiaopeng.api.feignClient.map.XpMapClient;
import com.xiaopeng.api.feignClient.operation.XpPointClient;
import com.xiaopeng.api.feignClient.order.XpOrderClient;
import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
import com.xiaopeng.api.model.account.XpAppUser;
import com.xiaopeng.api.model.operation.*;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.order.XpOrderDetail;
import com.xiaopeng.api.vo.account.UserCouponVo;
import com.xiaopeng.api.vo.operation.FareVo;
import com.xiaopeng.api.vo.operation.RouteAndFareVo;
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.api.vo.order.XpPricingCardVo;
import com.xiaopeng.common.core.constant.CacheConstants;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.common.core.utils.DateUtils;
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.itinerary.constant.I18nKeyConstant;
import com.xiaopeng.itinerary.dto.XpOrderDto;
import com.xiaopeng.itinerary.mapper.*;
import com.xiaopeng.itinerary.service.*;
import com.xiaopeng.itinerary.utils.XpPricingUtil;
import com.xiaopeng.itinerary.utils.holiday.HolidayUtil;
import com.xiaopeng.itinerary.utils.map.FastDistanceCalculator;
import com.xiaopeng.itinerary.utils.map.GDMapGeocodingUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.stereotype.Service;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
*
* 定价管理 服务实现类
*
*
* @author liu
* @since 2026-02-03
*/
@Slf4j
@Service
public class XpPricingServiceImpl extends ServiceImpl implements XpPricingService {
@Resource
private XpPricingUtil xpPricingUtil;
@Resource
private XpMapClient xpMapClient;
@Resource
private XpOpenCityMapper xpOpenCityMapper;
@Resource
private XpRoutePlanMapper xpRoutePlanMapper;
@Resource
private RedisService redisService;
@Resource
private XpSystemSettingMapper systemSettingMapper;
@Resource
private XpAppUserCouponClient xpAppUserCouponClient;
@Resource
private XpOrderClient xpOrderClient;
@Resource
private XpTradingStrategyMapper xpTradingStrategyMapper;
@Resource
private XpElectronicFenceAreaMapper xpElectronicFenceAreaMapper;
@Resource
private XpWhitelistMapper xpWhitelistMapper;
@Resource
private XpAppUserClient xpAppUserClient;
@Resource
private HolidayUtil holidayUtil;
@Autowired
private IXpGeoQueryEntityService geoQueryEntityService;
@Autowired
private XpElectronicFenceMapper xpElectronicFenceMapper;
@Autowired
private XpPointService xpPointService;
@Resource
private XpPushMessageClient xpPushMessageClient;
@Resource
private GDMapGeocodingUtil gdMapGeocodingUtil;
@Resource
private XpPointClient xpPointClient;
// 自定义线程池用于并行执行任务
private final ExecutorService executorService;
// 初始化自定义线程池
public XpPricingServiceImpl() {
this.executorService = new ThreadPoolExecutor(
40, // 核心线程数
100, // 最大线程数
60, // 线程空闲时间(秒)
TimeUnit.SECONDS, // 时间单位
new LinkedBlockingQueue<>(400), // 工作队列
new ThreadFactory() {
private final AtomicInteger threadNumber = new AtomicInteger(1);
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName("pricing-service-thread-" + threadNumber.getAndIncrement());
thread.setDaemon(false);
return thread;
}
}, // 线程工厂
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
}
// 关闭线程池
@PreDestroy
public void destroy() {
if (executorService != null && !executorService.isShutdown()) {
executorService.shutdown();
try {
if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {
executorService.shutdownNow();
}
} catch (InterruptedException e) {
executorService.shutdownNow();
Thread.currentThread().interrupt();
}
}
}
/**
* 根据当前时间获取时段
* 例如:15:50 → 15-16
* @return 时段字符串,格式:HH-HH
*/
private String getCurrentTimeSlot() {
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
return hour + "-" + (hour + 1);
}
@Override
public RouteAndFareVo getRouteAndFare(RouteAndFareDto routeAndFareDto, String userId) {
// // 判断是否5分钟内进行了查询 相同站点的起始点 并且是同时段
// String key = "xp-map-query-" + routeAndFareDto.getOpenCityId()
// + "-" + routeAndFareDto.getOrigin().getLongitude() + "-" + routeAndFareDto.getOrigin().getLatitude()
// + "-" + routeAndFareDto.getDestination().getLongitude() + "-" + routeAndFareDto.getDestination().getLatitude() + "-" + getCurrentTimeSlot() + "-" + userId+routeAndFareDto.getUserCouponId();
//
// if (redisService.hasKey(key)) {
// String jsonStr = Objects.requireNonNull(redisService.getCacheObject(key)).toString();
// RouteAndFareVo RouteAndFareVo = JSONObject.parseObject(jsonStr, RouteAndFareVo.class);
// return (RouteAndFareVo);
// }
// 1. 基础数据查询
Map geocode = gdMapGeocodingUtil.geocode(routeAndFareDto.getOrigin().getLongitude().toString(), routeAndFareDto.getOrigin().getLatitude().toString());
if(null == geocode){
throw new ServiceException("城市暂未开通服务", I18nKeyConstant.CITY_NOT_FOUND);
}
Long cityCode = routeAndFareDto.getOpenCityId();
XpOpenCity openCities = xpOpenCityMapper.selectById(cityCode);
if (openCities == null ) {
throw new ServiceException("城市暂未开通服务", I18nKeyConstant.CITY_NOT_FOUND);
}
XpOpenCity xpOpenCity = openCities;
routeAndFareDto.setOpenCityId(xpOpenCity.getId());
XpRoutePlan xpRoutePlan = xpRoutePlanMapper.selectOne(new LambdaQueryWrapper().eq(XpRoutePlan::getAuditStatus, 2).eq(XpRoutePlan::getCityCode, cityCode));
if (xpRoutePlan != null) {
routeAndFareDto.setRoutePlanRule(xpRoutePlan.getRoutePlanRule());
}
XpPricing xpPricing = this.baseMapper.selectOne(new LambdaQueryWrapper().eq(XpPricing::getCityId, routeAndFareDto.getOpenCityId()));
if (xpPricing == null) {
throw new ServiceException("当前区域未开通服务", I18nKeyConstant.NO_CURRENT_REGION);
}
// 算距离
R distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto);
if (distanceAndDuration.getCode() != 200) {
throw new ServiceException("获取导肮信息失败", I18nKeyConstant.PATH_NOT_FOUND);
}
RouteVo routeVo = distanceAndDuration.getData();
// 2. 计算价格(需要在并行任务前完成,因为优惠券查询需要价格)
XpPricingCardVo xpPricingCardVo;
if (xpPricing.getPricingType() == 1) {
xpPricingCardVo = xpPricingUtil.calculationPrice(userId,
JSON.parseObject(xpPricing.getBasicPricingJson()),
JSON.parseArray(xpPricing.getStartingFareJson()),
routeVo.getDistance(), routeVo.getDuration(), 0, 0.0, xpPricing.getIsDynamicPrice(), routeAndFareDto.getOpenCityId(), xpPricing.getDynamicPricingJson()
);
} else {
xpPricingCardVo = xpPricingUtil.calculationFixedPrice(userId,
JSON.parseObject(xpPricing.getBasicPricingJson()),
JSON.parseArray(xpPricing.getStartingFareJson()),
routeVo.getDistance(), routeVo.getDuration(), 0, 0.0, xpPricing.getIsDynamicPrice(), routeAndFareDto.getOpenCityId(), xpPricing.getDynamicPricingJson()
);
}
// 优惠券
XpPricingCardVo finalXpPricingCardVo = xpPricingCardVo;
R coupon = null;
CompletableFuture> couponFuture=null;
// 判断是否指定优惠券
if(routeAndFareDto.getUserCouponId()!=null){
coupon = xpAppUserCouponClient.getUserCoupon(new GetUserCouponDto(Long.valueOf(userId), finalXpPricingCardVo.getTotalPrice(), routeAndFareDto.getOpenCityId(),routeAndFareDto.getUserCouponId()));
if(coupon.getCode()==200 && coupon.getData().getStatus()==2){
throw new ServiceException("优惠券不满足条件", I18nKeyConstant.COUPON_NOT_SATISFY);
}
}else {
couponFuture= CompletableFuture.supplyAsync(
() -> {
// 优惠券
return xpAppUserCouponClient.getUserCoupon(
new GetUserCouponDto(Long.valueOf(userId), finalXpPricingCardVo.getTotalPrice(), routeAndFareDto.getOpenCityId(),null)
// new GetUserCouponDto(Long.valueOf(userId), 1d, routeAndFareDto.getOpenCityId())
);
},
executorService
);
}
// 3. 并行执行远程服务调用 判断是否同一经营区域
CompletableFuture> diagnosisAreaFuture = CompletableFuture.supplyAsync(
() -> xpMapClient.diagnosisArea(routeAndFareDto),
executorService
);
// 4. 等待所有并行任务完成并获取结果
R diagnosisResult = diagnosisAreaFuture.join();
R couponResult =null;
if(routeAndFareDto.getUserCouponId()!=null){
couponResult =coupon;
}else {
couponResult =couponFuture.join();
}
// 5. 处理诊断结果
if (diagnosisResult.getCode() != R.SUCCESS) {
throw new RuntimeException(diagnosisResult.getMsg());
}
if (!diagnosisResult.getData()) {
throw new ServiceException("当前区域未开通服务", I18nKeyConstant.NO_CURRENT_REGION);
}
// // 6. 处理路线结果
// if (routeResult.getCode() != 200) {
// throw new RuntimeException(routeResult.getMsg());
// }
// RouteVo routeVo = routeResult.getData();
// 起终点最小距离 走缓存
Integer minOrderDistance;
Object minOrderDistanceObj = redisService.getCacheObject(CacheConstants.MIN_ORDER_DISTANCE);
if (minOrderDistanceObj != null) {
minOrderDistance = Integer.valueOf(minOrderDistanceObj.toString());
} else {
minOrderDistance = systemSettingMapper.selectOne(null).getMinOrderDistance();
}
if (routeVo.getDistance() < Integer.valueOf(minOrderDistance)) {
throw new ServiceException("当前上下车点距离过近,建议步行前往", I18nKeyConstant.TO_WORK);
}
// 7. 处理优惠券结果
if (couponResult.getCode() != R.SUCCESS) {
throw new RuntimeException(couponResult.getMsg());
}
UserCouponVo userCouponVo = couponResult.getData();
if (userCouponVo != null) {
Double money = userCouponVo.getMoney();
money = new BigDecimal(money).setScale(2, RoundingMode.HALF_UP).doubleValue();
xpPricingCardVo.setCoupon(String.valueOf(money));
if (xpPricingCardVo.getTotalPrice() > money) {
xpPricingCardVo.setSystemDiscount(xpPricingCardVo.getTotalPrice() - money);
}
}
// 8. 构建响应对象
RouteAndFareVo routeAndFareVo = new RouteAndFareVo();
routeAndFareVo.setRoute(routeVo);
// 转2位小数处理
xpPricingCardVo.setTotalPriceStr(new BigDecimal(xpPricingCardVo.getTotalPrice()).setScale(2, RoundingMode.HALF_UP).toString());
xpPricingCardVo.setStartPriceStr(new BigDecimal(xpPricingCardVo.getStartPrice()).setScale(2, RoundingMode.HALF_UP).toString());
xpPricingCardVo.setDistancePriceStr(new BigDecimal(xpPricingCardVo.getDistancePrice()).setScale(2, RoundingMode.HALF_UP).toString());
xpPricingCardVo.setDurationPriceStr(new BigDecimal(xpPricingCardVo.getDurationPrice()).setScale(2, RoundingMode.HALF_UP).toString());
xpPricingCardVo.setSystemDiscountStr(new BigDecimal(xpPricingCardVo.getSystemDiscount()).setScale(2, RoundingMode.HALF_UP).toString());
routeAndFareVo.setXpPricingCard(xpPricingCardVo);
FareVo fareVo = new FareVo();
fareVo.setEstimatedDistanceKm(routeVo.getDistance().doubleValue() / 1000);
fareVo.setEstimatedDurationMin(routeVo.getDuration() / 60);
// 9. 设置费用信息
fareVo.setOriginalFare(xpPricingCardVo.getTotalPrice());
fareVo.setOriginalFareStr(new BigDecimal(fareVo.getOriginalFare()).setScale(2, RoundingMode.HALF_UP).toString());
if (userCouponVo != null) {
if(userCouponVo.getMoney()>fareVo.getOriginalFare()){
fareVo.setDiscountAmount(fareVo.getOriginalFare());
fareVo.setFinalFare(0.00);
}else {
fareVo.setDiscountAmount(userCouponVo.getMoney());
fareVo.setFinalFare(fareVo.getOriginalFare() - fareVo.getDiscountAmount());
}
if(fareVo.getFinalFare()>0){
fareVo.setSystemDiscount(fareVo.getFinalFare());
fareVo.setFinalFare(0.00);
}
fareVo.setCouponId(userCouponVo.getId());
} else {
fareVo.setDiscountAmount(0.00);
fareVo.setFinalFare(fareVo.getOriginalFare());
fareVo.setSystemDiscount(fareVo.getFinalFare());
fareVo.setFinalFare(0.00);
}
// 10. 检查等待时间
Integer waitTime = getWaitTime(routeAndFareDto.getOrigin().getLongitude(), routeAndFareDto.getOrigin().getLatitude());
// if (waitTime > 3) {
// throw new ServiceException("当前区域正在等待中,请耐心等待", I18nKeyConstant.WAITING_TIME);
// }
fareVo.setWaitingTime(waitTime);
// 11. 生成订单ID并缓存
String id = CacheConstants.ORD + System.currentTimeMillis() + "_" + UUID.randomUUID().toString().substring(0, 8);
redisService.setCacheObject(CacheConstants.ORD + id + userId, xpPricingCardVo, 1l, TimeUnit.DAYS);
fareVo.setId(id);
// 12. 设置费用信息
fareVo.setFinalFareStr(new BigDecimal(fareVo.getFinalFare()).setScale(2, RoundingMode.HALF_UP).toString());
fareVo.setOriginalFare(new BigDecimal(fareVo.getOriginalFare()).setScale(2,RoundingMode.HALF_UP).doubleValue());
fareVo.setSystemDiscount(new BigDecimal(fareVo.getSystemDiscount() == null ? 0 : fareVo.getSystemDiscount()).setScale(2,RoundingMode.HALF_UP).doubleValue());
routeAndFareVo.setFareEstimate(fareVo);
routeAndFareVo.getXpPricingCard().setFinalFareStr(fareVo.getFinalFareStr());
// String voJsonStr = JSONObject.toJSONString(routeAndFareVo);
// 进行缓存
// redisService.setCacheObject(key, voJsonStr, 5l, TimeUnit.MINUTES);
//缓存导航数据,用于下单后推送导航给车端和乘客端
redisService.setCacheObject("ORDER_NAVIGATION_END_DATA:" + userId, JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
return routeAndFareVo;
}
/**
* 获取等待时间
* @param lon
* @param lat
* @return
*/
@Override
public Integer getWaitTime(double lon, double lat) {
List entities = geoQueryEntityService.findByLocationWithin500MetersAndLastWeekAndStatusGreater(
lon,
lat,
getCurrentTimeSlot()
);
if (entities.isEmpty()) {
return 1;
} else {
// 已完成接单的数据
List validEntities = entities.stream().filter(e -> e.getStatus() == 1).collect(Collectors.toList());
long waitNum = entities.stream().filter(e -> e.getStatus() == 0).count();
// 计算平均等待时间
OptionalDouble averageOptional = validEntities.stream().mapToDouble(XpGeoQueryEntity::getSeconds).average();
if (averageOptional.isPresent()) {
double average = averageOptional.getAsDouble();
// 未完成接单的数量
int count = (int) waitNum;
if (count == 0) {
return 1;
} else {
double waitMinutes = (average * count) / 60;
if (waitMinutes > 3) {
throw new ServiceException("当前区域正在等待中,请耐心等待", I18nKeyConstant.WAITING_TIME);
} else if (waitMinutes == 0) {
return 1;
}else if(waitMinutes>0 && waitMinutes<1){
return 1;
}
return (int) waitMinutes;
}
} else {
return 1;
}
}
}
@Override
public String saveOrder(XpOrderDto dto, String uid) {
// 是否在运营区域时间内
XpElectronicFenceArea xpElectronicFenceArea = xpElectronicFenceAreaMapper.selectById(dto.getXpElectronicFenceAreaId());
XpElectronicFence xpElectronicFence = xpElectronicFenceMapper.selectById(xpElectronicFenceArea.getElectronicId());
String operationStrategy = xpElectronicFence.getOperationStrategy();
Boolean inOperationTime = isInOperationTime(operationStrategy);
if (!inOperationTime && xpElectronicFence.getFailureType()!=1) {
log.info("当前区域暂未开通,下单失败 {}", uid);
throw new ServiceException("当前区域未开通服务", I18nKeyConstant.NO_CURRENT_REGION);
}
Integer cancelCount = xpTradingStrategyMapper.selectOne(null).getCancleCount();
// 判断是否有进行的订单
R r = xpOrderClient.hasUnPaodOrder(uid);
if (r.getData() > 0) {
throw new RuntimeException("有正在进行的订单");
}
// 获取起点经纬度
XpPoint xpPoint = xpPointService.getById(dto.getStartPointId());
if(xpPoint ==null || xpPoint.getOperationStatus()!=2){
return null;
}
// 终点
XpPoint endXpPoint = xpPointService.getById(dto.getEndPointId());
if(endXpPoint ==null || endXpPoint.getOperationStatus()!=2){
// throw new ServiceException("该站点已停止运营", 200,I18nKeyConstant.NO_CURRENT_POINT);
return null;
}
// 判断点位是否在运营区域内
boolean inTime = xpPointClient.nowInTimePoint(dto.getStartPointId()).getData();
if (!inTime) {
throw new ServiceException("当前点位未开通服务", I18nKeyConstant.NO_CURRENT_REGION);
}
inTime = xpPointClient.nowInTimePoint(dto.getEndPointId()).getData();
if (!inTime) {
throw new ServiceException("当前点位未开通服务", I18nKeyConstant.NO_CURRENT_REGION);
}
// 判断当天取消的次数 后台配置 redis 查询
// 静默处理
boolean isSilent = false;
Integer num = xpOrderClient.todayCancellationCount(Long.valueOf(uid)).getData();
if (num >= cancelCount) {
isSilent = true;
}
// 获取起步里程
// XpPricing xpPricing = this.baseMapper.selectOne(new LambdaQueryWrapper().eq(XpPricing::getCityId, dto.getOpenCityId()));
// Integer startMileage = XpPricingUtil.getStartMileage(xpPricing.getStartingFareJson());
// if (startMileage == null) {
// throw new ServiceException("当前区域未开通服务", I18nKeyConstant.NO_CURRENT_REGION);
// }
// 根据id获取手机号
Boolean isPriorityDispatch = true;
// R xpAppUserR = xpAppUserClient.queryOperationsUserById(Long.valueOf(uid));
// if (xpAppUserR.getCode() == R.SUCCESS) {
// Long count = xpWhitelistMapper.selectCount(new LambdaQueryWrapper().eq(XpWhitelist::getAccount, xpAppUserR.getData().getPhoneNumber()).eq(XpWhitelist::getIsPriorityDispatch, 1));
// if (count > 0) {
// isPriorityDispatch = true;
// }
// }
// 生成订单数据
XpOrder xpOrder = new XpOrder();
xpOrder.setMileageKilometers(0.0);
xpOrder.setAppUserId(Long.valueOf(uid));
xpOrder.setOrderNumber("XP" + System.currentTimeMillis());
xpOrder.setPlacementLon(dto.getPlacementLon());
xpOrder.setPlacementLat(dto.getPlacementLat());
xpOrder.setPlacementAddress(dto.getPlacementAddress());
xpOrder.setCityId(dto.getOpenCityId());
xpOrder.setStartLon(xpPoint.getPointLon());
xpOrder.setStartLat(xpPoint.getPointLat());
xpOrder.setBoardingLon(xpPoint.getPointLon());
xpOrder.setBoardingLat(xpPoint.getPointLat());
xpOrder.setBoardingAddress(xpPoint.getPointAddress());
xpOrder.setEndLon(endXpPoint.getPointLon());
xpOrder.setEndLat(endXpPoint.getPointLat());
xpOrder.setStartAddress(xpPoint.getPointAddress());
xpOrder.setEndAddress(endXpPoint.getPointAddress());
xpOrder.setXpElectronicFenceAreaId(dto.getXpElectronicFenceAreaId());
xpOrder.setStartPointId(dto.getStartPointId());
xpOrder.setEndPointId(dto.getEndPointId());
xpOrder.setStartPointName(xpPoint.getPointName());
xpOrder.setEndPointName(endXpPoint.getPointName());
// 当前时段
String currentTimeSlot = DateUtils.getCurrentTimeSlot();
xpOrder.setTimeSlot(currentTimeSlot);
xpOrder.setCreateTime(LocalDateTime.now());
XpOpenCity openCities = xpOpenCityMapper.selectById(dto.getOpenCityId());
if (openCities == null) {
throw new ServiceException("城市暂未开通服务", I18nKeyConstant.CITY_NOT_FOUND);
}
XpOpenCity xpOpenCity = openCities;
dto.setOpenCityId(xpOpenCity.getId());
xpOrder.setCityCode(xpOpenCity.getCityCode());
XpRoutePlan xpRoutePlan = xpRoutePlanMapper.selectOne(new LambdaQueryWrapper().eq(XpRoutePlan::getAuditStatus, 2).eq(XpRoutePlan::getCityCode, xpOpenCity.getCityCode()));
Integer distance = 0;
Integer duration = 0;
Object cacheObject = redisService.getCacheObject("ORDER_NAVIGATION_END_DATA:" + uid);
if (cacheObject != null) {
RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class);
distance = routeVo.getDistance();
duration = routeVo.getDuration();
}
xpOrder.setCouponId(dto.getUserCouponId());
// 产生订单
R addOrderR = xpOrderClient.addOrder(xpOrder);
if (addOrderR.getCode() != R.SUCCESS) {
throw new ServiceException("订单生成失败", I18nKeyConstant.ORDER_CREATE_FAIL);
}
Long orderId = addOrderR.getData();
xpOrder.setId(orderId);
// 静默处理 不推单
if (isSilent) {
log.info("订单取消次数达到上限,执行静默处理,不推单。");
return orderId.toString();
}
// 最大距离
Object maxPushDistanceObj = redisService.getCacheObject(CacheConstants.MAX_PUSH_DISTANCE);
Double maxPushDistance = 0.0;
if (maxPushDistanceObj != null) {
maxPushDistance = Double.valueOf(maxPushDistanceObj.toString());
} else {
maxPushDistance = xpTradingStrategyMapper.selectOne(null).getThreePushDistance();
}
// 找出现在所有的队列 通过计算距离 算出目前应该放在那个队列 如果没有符合的新增一个队列 符合后看是否白名单账号 是则直接放在队列前端
Set quoteMatchName = redisService.getQuoteMatchName(CacheConstants.QUEUE_POINT_ID);
log.info("当前队列:{}", quoteMatchName);
for (String s : quoteMatchName) {
// QUEUE_POINT_ID-1-30.233,120.233
String lonLat = s.split("-")[2];
// 和上车点进行判断是否