From 547a4a0b1d130c6d2fb854b31a15e2bf7e75c811 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 17 四月 2026 21:03:39 +0800
Subject: [PATCH] Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java |   69 +++++++++++++++++++++++++++-------
 1 files changed, 55 insertions(+), 14 deletions(-)

diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
index ec76fa1..b922108 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -10,6 +10,7 @@
 import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
 import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient;
 import com.xiaopeng.api.feignClient.map.XpMapClient;
+import com.xiaopeng.api.feignClient.operation.XpTradingStrategyClient;
 import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient;
 import com.xiaopeng.api.feignClient.order.XpOrderClient;
 import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
@@ -23,6 +24,7 @@
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
 import com.xiaopeng.api.vo.operation.RouteVo;
 import com.xiaopeng.api.vo.operation.VehiclePositionVo;
+import com.xiaopeng.api.vo.operation.XpTradingStrategyDetailVO;
 import com.xiaopeng.common.core.constant.CacheConstants;
 import com.xiaopeng.common.core.constant.Constants;
 import com.xiaopeng.common.core.domain.R;
@@ -48,6 +50,7 @@
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -79,6 +82,9 @@
 
     @Resource
     private XpCruiseOrderClient xpCruiseOrderClient;
+
+    @Resource
+    private XpTradingStrategyClient tradingStrategyClient;
 
     @Resource
     private XpVehicleClient xpVehicleClient;
@@ -1087,9 +1093,19 @@
                 continue;
             }
 
-            LonLatDto lonLatDto = new LonLatDto(Double.parseDouble(split[0]), Double.parseDouble(split[1]));
+            LonLatDto current = new LonLatDto(Double.parseDouble(split[0]), Double.parseDouble(split[1]));//当前点位
 
-            Optional<XpOrder> lucyOrderOpt = servingVehicles.getData().stream()
+            XpTradingStrategyDetailVO strategyDetailVO = tradingStrategyClient.queryById().getData();
+
+            Integer distanceRegardAsEnding = strategyDetailVO.getDistanceRegardAsEnding();
+            Integer timeRegardAsEnding = strategyDetailVO.getTimeRegardAsEnding();
+
+            Integer backupPower = strategyDetailVO.getBackupPower();
+            Integer destToPassenger = strategyDetailVO.getDestToPassenger();
+            Integer endingTimeToUseTime = strategyDetailVO.getEndingTimeToUseTime();
+            LocalDateTime rideTime = xpOrder.getRideTime();
+            LocalDateTime now = LocalDateTime.now();
+            Optional<XpOrder> luckyOrderOpt = servingVehicles.getData().stream()
                     //获取位置
                     .map(vin -> mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class))
                     .map(VehiclePosition::getOrderId)
@@ -1097,23 +1113,48 @@
                     .filter(R::isSuccess)
                     .map(R::getData)
                     .filter(o -> {
-                        RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
-                        routeAndFareDto.setDestination(lonLatDto);
-                        return isClose(o, routeAndFareDto);
+                        XpVehicle xpVehicle = xpVehicleClient.queryById(o.getVehicleId()).getData();
+
+                        Object cacheObject = redisService.getCacheObject(CacheConstants.navigationEnd(o.getAppUserId().toString()));
+                        RouteVo routeRemain = JSON.parseObject(cacheObject.toString(), RouteVo.class);
+                        if (routeRemain.getDuration() / 60 > timeRegardAsEnding) {
+                            return false;
+                        }
+                        RouteAndFareDto remain = new RouteAndFareDto();
+                        remain.setOrigin(current);
+                        LonLatDto ll = new LonLatDto(o.getStartLon(), o.getStartLat());
+                        remain.setDestination(ll);
+                        RouteVo r = xpMapClient.getDistanceAndDuration(remain).getData();
+                        if (r.getDistance() > distanceRegardAsEnding) {
+                            return false;
+                        }
+                        if (r.getDuration() / 60 > timeRegardAsEnding) {
+                            return false;
+                        }
+                        RouteAndFareDto next = new RouteAndFareDto();
+                        next.setOrigin(new LonLatDto(o.getStartLon(),o.getStartLat()));
+                        next.setDestination(new LonLatDto(o.getEndLon(),o.getEndLat()));
+                        RouteVo route = xpMapClient.getDistanceAndDuration(next).getData();
+                        if (route.getDistance() > backupPower + xpVehicle.getMileageRange())
+                            return false;
+                        return r.getDistance() < destToPassenger
+                                || now.plusSeconds(routeRemain.getDuration())
+                                .plusMinutes(endingTimeToUseTime)
+                                .isBefore(rideTime);
                     })
                     .findAny();
 
-            if (lucyOrderOpt.isPresent()) {
-                XpOrder lucyOder = lucyOrderOpt.get();
-                log.info("有空闲车辆 {} 订单 {}", lucyOder.getOrderNumber(), orderNo);
-                XpVehicle xpVehicle = xpVehicleClient.queryById(lucyOder.getVehicleId()).getData();
+            if (luckyOrderOpt.isPresent()) {
+                XpOrder luckyOder = luckyOrderOpt.get();
+                log.info("有空闲车辆 {} 订单 {}", luckyOder.getOrderNumber(), orderNo);
+                XpVehicle xpVehicle = xpVehicleClient.queryById(luckyOder.getVehicleId()).getData();
                 // 设置路线信息
                 RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
-                routeAndFareDto.setDestination(lonLatDto);
-                routeAndFareDto.setOrigin(new LonLatDto(lucyOder.getEndLon(),lucyOder.getEndLat()));
-                Object cacheObject = redisService.getCacheObject(CacheConstants.navigationEnd(lucyOder.getAppUserId().toString()));
-                RouteVo routeRemain = JSON.parseObject(cacheObject.toString(), RouteVo.class);
+                routeAndFareDto.setDestination(current);
+                routeAndFareDto.setOrigin(new LonLatDto(luckyOder.getEndLon(),luckyOder.getEndLat()));
                 RouteVo routeToOrigin = xpMapClient.getDistanceAndDuration(routeAndFareDto).getData();
+                Object cacheObject = redisService.getCacheObject(CacheConstants.navigationEnd(luckyOder.getAppUserId().toString()));
+                RouteVo routeRemain = JSON.parseObject(cacheObject.toString(), RouteVo.class);
                 routeToOrigin.getPolyline().addAll(0, routeRemain.getPolyline());
                 routeToOrigin.setDuration(routeToOrigin.getDuration() + routeRemain.getDuration());
                 routeToOrigin.setDistance(routeToOrigin.getDistance() + routeRemain.getDistance());
@@ -1121,7 +1162,7 @@
                 pushOrderDto.setVin(xpVehicle.getVehicleVin());
                 // 订单流转
                 orderMissionClient.pushOrder(pushOrderDto);
-                redisService.setCacheObject(CacheConstants.nextOrder(lucyOder.getId().toString()), xpOrder.getId());
+                redisService.setCacheObject(CacheConstants.nextOrder(luckyOder.getId().toString()), xpOrder.getId());
                 redisService.setCacheObject(CacheConstants.navigationStart(xpOrder.getAppUserId().toString()), routeToOrigin);
                 redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
                 log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);

--
Gitblit v1.7.1