From a6d543bcef73e2a78d8da9b065e241643c166aa8 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期五, 13 二月 2026 11:40:29 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java |  105 +++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 79 insertions(+), 26 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 22acf2e..5794535 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
@@ -3,30 +3,33 @@
 import cn.hutool.core.bean.BeanUtil;
 import com.xiaopeng.api.dto.map.RouteAndFareDto;
 import com.xiaopeng.api.dto.operation.LonLatDto;
+import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto;
 import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto;
 import com.xiaopeng.api.feignClient.map.XpMapClient;
 import com.xiaopeng.api.feignClient.order.XpOrderClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.VehicleControlClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
+import com.xiaopeng.api.model.operation.XpElectronicFence;
 import com.xiaopeng.api.model.operation.XpTradingStrategy;
 import com.xiaopeng.api.model.order.XpOrder;
+import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
 import com.xiaopeng.api.vo.operation.RouteVo;
 import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo;
 import com.xiaopeng.common.core.constant.CacheConstants;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.redis.service.RedisService;
+import com.xiaopeng.operation.mapper.XpElectronicFenceMapper;
 import com.xiaopeng.operation.service.IXpElectronicFenceAreaService;
 import com.xiaopeng.operation.service.IXpTradingStrategyService;
 import com.xiaopeng.operation.service.XpPointService;
 import com.xiaopeng.operation.utils.mango.VehiclePositionService;
-import com.xiaopeng.operation.utils.map.FastDistanceCalculator;
-import com.xiaopeng.operation.vo.RouterVo;
-import com.xiaopeng.operation.vo.VehiclePositionVo;
-import org.redisson.Redisson;
+import com.xiaopeng.api.vo.operation.VehiclePositionVo;
+import lombok.SneakyThrows;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
@@ -62,6 +65,9 @@
     private UserVehicleClient userVehicleClient;
 
     @Autowired
+    private XpVehicleClient xpVehicleClient;
+
+    @Autowired
     private RedissonClient redissonClient;
 
     @Autowired
@@ -80,21 +86,24 @@
         threadPoolTaskExecutor.initialize();
     }
 
+    @Autowired
+    private XpElectronicFenceMapper xpElectronicFenceMapper;
+
     /**
      * 5秒执行一次
      */
-//    @Scheduled(cron = "0/5 * * * * ?")
+    @Scheduled(cron = "0/5 * * * * ?")
     public void taskOrder() {
         System.out.println("5秒执行一次");
         Set<String> quoteMatchName = redisService.getQuoteMatchName(CacheConstants.QUEUE_POINT_ID);
         for (String name : quoteMatchName) {
-            Object firstElement = redisService.getFirstElement(name);
+            String firstElement = redisService.getFirstElement(name);
             if (firstElement != null) {
                 String[] split = firstElement.toString().split("_");
                 // 如果市未处理 创建新任务
                 if (split[2].equals("0")) {
                     // 状态改为处理中
-                    redisService.updateFirst(name, split[0] + "_" + split[1] + "_1");
+//                    redisService.updateFirst(name, split[0] + "_" + split[1] + "_1"+split[3]+split[4]+split[5]+split[6]);
                     threadPoolTaskExecutor.submit(() -> {
                         orderProcess(name, firstElement.toString());
                     });
@@ -110,6 +119,7 @@
      * @param firstElement 队列第一个元素
      */
     private void orderProcess(String quoteName, String firstElement) {
+        System.out.println("进入处理环节");
         XpTradingStrategy xpTradingStrategy = xpTradingStrategyService.getOne(null);
         String orderId = firstElement.split("_")[0];
         String lonLat = firstElement.split("_")[1];
@@ -190,7 +200,7 @@
         processPushOrder(quoteName, count, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule);
 
         // 最终没找到车
-        redisService.popFirstElement(quoteName);
+//        redisService.popFirstElement(quoteName);
         // 取消订单
         xpOrderClient.cancelOrder(orderId);
 
@@ -206,7 +216,12 @@
      * @param orderNo 订单号
      * @param xpTradingStrategy  规则
      */
+    @SneakyThrows
     private void processPushOrder(String quoteName, int count, String uid, String[] split, String orderNo, XpTradingStrategy xpTradingStrategy, String distance, String duration, String planRule) {
+        System.out.println("进入推单环环节");
+        if(count==0){
+            count=1;
+        }
         // 订单状态
         R<XpOrder> xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
         if (xpOrderR.getCode() != 200) {
@@ -215,12 +230,41 @@
         if (xpOrderR.getData().getStatus() != 1) {
             return;
         }
+        XpOrder xpOrder = xpOrderR.getData();
+
+        // 找出围栏id
+        Long xpElectronicFenceAreaId = xpOrder.getXpElectronicFenceAreaId();
+        Long electronicId = xpElectronicFenceAreaService.getById(xpElectronicFenceAreaId).getElectronicId();
+        XpElectronicFence xpElectronicFence = xpElectronicFenceMapper.selectById(electronicId);
 
         for (int i = 0; i < count; i++) {
+
+            System.out.println("进入找车环节");
             // 根据距离找车
             // 车多则根据配置找具体车数量 根据距离最近
+            // 更改 暂不限制数量
+
             List<VehiclePosition> positionList = vehiclePositionService.findAvailableVehiclesNearby(Double.parseDouble(split[0]), Double.parseDouble(split[1]), xpTradingStrategy.getOnePushDistance(), xpTradingStrategy.getSimultaneouslyOrderCount());
+
+            // 获取车辆的区域信息
+            if (positionList.isEmpty()) {
+                continue;
+            }
+            List<String> vinList = positionList.stream().map(VehiclePosition::getVin).collect(Collectors.toList());
+
+            // 获取车辆的信息 筛选出可用车辆
+            R<List<String>> vehiclePositionVos = xpVehicleClient.queryVehiclePositionByVin(new VehiclePositionByVinDto(xpElectronicFence.getId(), vinList, xpTradingStrategy.getSimultaneouslyOrderCount()));
+            if (vehiclePositionVos.getCode() != 200) {
+                continue;
+            }
+
             List<VehiclePositionVo> availableVehiclesNearby = BeanUtil.copyToList(positionList, VehiclePositionVo.class);
+            List<String> data = vehiclePositionVos.getData();
+
+            // 找出符合条件的
+            availableVehiclesNearby = availableVehiclesNearby.stream().filter(e -> data.contains(e.getVin())).collect(Collectors.toList());
+
+//            List<VehiclePositionVo> availableVehiclesNearby =vehiclePositionVos.getData();
 
             if (!availableVehiclesNearby.isEmpty()) {
                 if (availableVehiclesNearby.size() > 1) {
@@ -348,7 +392,7 @@
 
                         if (max1.equals(weightElectricity)) {
                             // 计算车的分数  分数最大是车的size
-                            availableVehiclesNearby= availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList());
+                            availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList());
                             int size = tendencyElectricity;
                             // 做比对的分数
                             int temp = availableVehiclesNearby.get(0).getCurrentElectricity();
@@ -363,9 +407,9 @@
 
                         // 算出总分 再来排序计算
                         for (VehiclePositionVo vehiclePositionVo : availableVehiclesNearby) {
-                            vehiclePositionVo.setOrderValueTotal(vehiclePositionVo.getCurrentElectricityScore() + vehiclePositionVo.getDistanceScore() + vehiclePositionVo.getTimeScore() + vehiclePositionVo.getDistanceDifference()+ vehiclePositionVo.getTimeDifference());
+                            vehiclePositionVo.setOrderValueTotal(vehiclePositionVo.getCurrentElectricityScore() + vehiclePositionVo.getDistanceScore() + vehiclePositionVo.getTimeScore() + vehiclePositionVo.getDistanceDifference() + vehiclePositionVo.getTimeDifference());
                         }
-                        availableVehiclesNearby= availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getOrderValueTotal).reversed()).collect(Collectors.toList());
+                        availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getOrderValueTotal).reversed()).collect(Collectors.toList());
 
 
                         int size = tendencyOrderValue;
@@ -481,7 +525,7 @@
                             Integer secondMax = values.get(1);
 
                             // 判断第二大的是哪个
-                            if(Objects.equals(secondMax, tendencyDistance)){
+                            if (Objects.equals(secondMax, tendencyDistance)) {
                                 for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
                                     RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
                                     LonLatDto lonLatDto = new LonLatDto();
@@ -515,7 +559,7 @@
                             }
 
 
-                            if(Objects.equals(secondMax, tendencyTime)){
+                            if (Objects.equals(secondMax, tendencyTime)) {
                                 for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
                                     RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
                                     LonLatDto lonLatDto = new LonLatDto();
@@ -550,7 +594,7 @@
 
 
                             // 订单价值
-                            if(Objects.equals(secondMax, tendencyOrderValue)){
+                            if (Objects.equals(secondMax, tendencyOrderValue)) {
 
 
                             }
@@ -565,28 +609,33 @@
                     }
                     VehiclePositionVo vehiclePositionVo = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getTotal).reversed()).collect(Collectors.toList()).get(0);
 
-
-                    VehiclePositionVo vehiclePositionVo1 = vehiclePositionVo;
-                    RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePositionVo1.getVin());
+//
+//                    VehiclePositionVo vehiclePositionVo1 = vehiclePositionVo;
+                    RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePositionVo.getVin());
                     lock.lock(10, TimeUnit.SECONDS);
                     try {
-                        VehiclePosition vehiclePosition = vehiclePositionService.findByVehicleId(vehiclePositionVo.getVehicle_id());
+//                        VehiclePosition vehiclePosition = vehiclePositionService.findByVehicleId(vehiclePositionVo.getVehicle_id());
+                        R<XpVehicle> vehiclePositionR = xpVehicleClient.findByVehicleVin(vehiclePositionVo.getVin());
+                        if (vehiclePositionR.getCode() != 200) {
+                            continue;
+                        }
+                        XpVehicle vehiclePosition = vehiclePositionR.getData();
                         if (vehiclePosition.getStatus() != 1 || vehiclePosition.getState() != 0) {
                             lock.unlock();
                             continue;
                         }
-                        if (vehiclePosition.getHasOrder() == 1) {
-                            //  关闭巡游单子 TODO
-                        }
+                        //  关闭巡游单子 TODO
+
                         AddTaxiPassengerVo addTaxiPassengerVo = new AddTaxiPassengerVo();
-                        addTaxiPassengerVo.setVin(vehiclePosition.getVin());
+                        addTaxiPassengerVo.setVin(vehiclePosition.getVehicleVin());
                         addTaxiPassengerVo.setUid(uid);
                         addTaxiPassengerVo.setOrderNo(orderNo);
                         // TODO appid
                         addTaxiPassengerVo.setAppId("");
+
+
                         BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.addTaxiPassenger(addTaxiPassengerVo);
                         if (baseVehicleUserDto.getCode() == 200) {
-
                             // TODO 下单
                             // 绑定成功  弹出这个队列第一个订单
                             redisService.popFirstElement(quoteName);
@@ -601,13 +650,17 @@
                 } else {
                     // 直接派单  定义一个锁来锁定车辆
                     VehiclePosition vehiclePosition = positionList.get(0);
-                    Long vehicleId = vehiclePosition.getVehicle_id();
+                    String vehicleVin = vehiclePosition.getVin();
 
                     RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePosition.getVin());
                     lock.lock(10, TimeUnit.SECONDS);
                     try {
                         // 查询车辆状态
-                        VehiclePosition vehicleId1 = vehiclePositionService.findByVehicleId(vehicleId);
+                       R<XpVehicle> vehicleR = xpVehicleClient.findByVehicleVin(vehicleVin);
+                       if(vehicleR.getCode()!=200){
+                           continue;
+                       }
+                       XpVehicle vehicleId1 = vehicleR.getData();
                         if (vehicleId1.getStatus() != 1 || vehicleId1.getState() != 0) {
                             lock.unlock();
                             continue;

--
Gitblit v1.7.1