From f941da4ef0742ee067bcf9cb54ccf39c9ca2fefe Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期三, 15 四月 2026 18:25:01 +0800
Subject: [PATCH] [feat]连环派代70%

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java |   67 ++++++++++++++++++++++++++++++++-
 1 files changed, 64 insertions(+), 3 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 7531c25..3327966 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
@@ -40,15 +40,16 @@
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
 import java.util.*;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.*;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -106,6 +107,8 @@
 
     // 自定义线程池
     private static final ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
+
+    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(20);
 
     static {
         threadPoolTaskExecutor.setCorePoolSize(20);
@@ -1081,12 +1084,70 @@
                     }
 
                 }
+            }
 
+            log.info("没有找到空闲车辆 {},尝试连环派单给即将服务结束的车辆", orderNo);
+            // 查询状态为1的车辆vin
+            R<List<String>> servingVehicles = xpVehicleClient.queryVehiclePositionByVin(new VehiclePositionByVinDto(xpElectronicFence.getId(), vinList, xpTradingStrategy.getSimultaneouslyOrderCount(),1));
+            if (vehiclePositionVos.getCode() != 200) {
+                continue;
+            }
+            LonLatDto lonLatDto = new LonLatDto(Double.parseDouble(split[0]), Double.parseDouble(split[1]));
+            RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
+            routeAndFareDto.setDestination(lonLatDto);
+
+            Optional<XpOrder> lucyOrderOpt = servingVehicles.getData().stream()
+                    //获取位置
+                    .map(vin -> mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class))
+                    .map(VehiclePosition::getOrderId)
+                    .map(xpOrderClient::queryOrderById)
+                    .filter(R::isSuccess)
+                    .map(R::getData)
+                    .filter(o -> isClose(o, routeAndFareDto))
+                    .findAny();
+
+            if (lucyOrderOpt.isPresent()) {
+                XpOrder lucyOder = lucyOrderOpt.get();
+                routeAndFareDto.setOrigin(new LonLatDto(lucyOder.getEndLon(),lucyOder.getEndLat()));
+                routeAndFareDto.setOrigin(lonLatDto);
+
+                RouteAndFareDto routeAndFare = null;//TODO 获取导航路线
+                if (null == routeAndFare) { //轨迹不在运营区
+                    continue;
+                }
+                // 当轨迹是否在运营区内,存储
+                xpOrder.setStatus(1);
+                xpOrderClient.updateOrder(xpOrder);
+                scheduler.scheduleWithFixedDelay(this::pushProgress, 0, 5, TimeUnit.SECONDS);
             }
         }
         return false;
     }
 
+    private void pushProgress() {
+        //TODO 调用push message 服务
+        PushOrderDto pushOrderDto = new PushOrderDto();
+//        pushOrderDto.setVin(lucyOrder.get().getVin());
+//        pushOrderDto.setOrderId(xpOrder.getId().toString());
+//        pushOrderDto.setStartLatitude(xpOrder.getStartLat());
+//        pushOrderDto.setStartLongitude(xpOrder.getStartLon());
+//        pushOrderDto.setEndLatitude(xpOrder.getEndLat());
+//        pushOrderDto.setEndLongitude(xpOrder.getEndLon());
+//        pushOrderDto.setOrderType(OrderType.USER_ORDER);
+    }
+
+    private boolean isClose(XpOrder xpOrder,RouteAndFareDto routeAndFareDto) {
+        LonLatDto lonLatDto = new LonLatDto(xpOrder.getStartLon(), xpOrder.getStartLat());
+        routeAndFareDto.setOrigin(lonLatDto);
+        return xpMapClient.getDistanceAndDuration(routeAndFareDto).getData().getDistance() < 800;
+    }
+
+    @Resource
+    private MongoTemplate mongoTemplate;
+    boolean isClose(Long orderId) {
+        // yong id 去查目的地坐标,判断是否小于800
+        return false;
+    }
     /**
      * 订单处理
      * @param count 轮数

--
Gitblit v1.7.1