From 40c97867e634b0c4949dfd964bf06da35fc4bd88 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 13 二月 2026 22:06:40 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java |  274 ++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 230 insertions(+), 44 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 a2a83db..b240625 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
@@ -1,14 +1,15 @@
 package com.xiaopeng.operation.utils;
 
 import cn.hutool.core.bean.BeanUtil;
+import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
 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.automaticPilot.OrderMissionClient;
 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;
@@ -16,6 +17,7 @@
 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.operation.VehiclePositionVo;
 import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo;
 import com.xiaopeng.common.core.constant.CacheConstants;
 import com.xiaopeng.common.core.domain.R;
@@ -25,8 +27,8 @@
 import com.xiaopeng.operation.service.IXpTradingStrategyService;
 import com.xiaopeng.operation.service.XpPointService;
 import com.xiaopeng.operation.utils.mango.VehiclePositionService;
-import com.xiaopeng.api.vo.operation.VehiclePositionVo;
 import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,6 +41,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
+@Slf4j
 @Component
 public class TaskOrderUtil {
 
@@ -72,6 +75,9 @@
 
     @Autowired
     private XpMapClient xpMapClient;
+    //
+    @Autowired
+    private OrderMissionClient orderMissionClient;
 
 
     // 自定义线程池
@@ -102,7 +108,7 @@
                 String[] split = firstElement.toString().split("_");
                 // 如果未处理 创建新任务
                 if (split[2].equals("0")) {
-                    String value = split[0] + "_" + split[1] + "_1" + "_"+split[3] + "_"+ split[4] + "_"+ split[5] + "_"+ split[6] + "_"+ split[7];
+                    String value = split[0] + "_" + split[1] + "_1" + "_" + split[3] + "_" + split[4] + "_" + split[5] + "_" + split[6] + "_" + split[7];
                     // 状态改为处理中
                     redisService.updateFirst(name, value);
                     threadPoolTaskExecutor.submit(() -> {
@@ -220,8 +226,8 @@
     @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;
+        if (count == 0) {
+            count = 1;
         }
         // 订单状态
         R<XpOrder> xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
@@ -596,7 +602,142 @@
 
                             // 订单价值
                             if (Objects.equals(secondMax, tendencyOrderValue)) {
+                                // 订单价值
+                                // 时间差权重
+                                Integer weightTimeDifference = xpTradingStrategy.getWeightTimeDifference();
+                                // 距离差权重
+                                Integer weightDistanceDifference = xpTradingStrategy.getWeightDistanceDifference();
+                                // 距离权重
+                                Integer weightDistance = xpTradingStrategy.getWeightDistance();
+                                // 时间权重
+                                Integer weightTime = xpTradingStrategy.getWeightTime();
+                                // 电量权重
+                                Integer weightElectricity = xpTradingStrategy.getWeightElectricity();
 
+                                // 找出最大的值是那个
+                                Integer max1 = Math.max(weightTimeDifference, Math.max(weightDistanceDifference, Math.max(weightDistance, Math.max(weightTime, weightElectricity))));
+
+                                //  时间差
+                                if (max1.equals(weightTimeDifference)) {
+                                    for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                        RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
+                                        LonLatDto lonLatDto = new LonLatDto();
+                                        lonLatDto.setLongitude(vehiclePosition.getPoint().getX());
+                                        lonLatDto.setLatitude(vehiclePosition.getPoint().getY());
+                                        routeAndFareDto.setOrigin(lonLatDto);
+                                        LonLatDto lonLatDto1 = new LonLatDto();
+                                        lonLatDto1.setLongitude(Double.valueOf(split[0]));
+                                        lonLatDto1.setLatitude(Double.valueOf(split[1]));
+                                        routeAndFareDto.setDestination(lonLatDto1);
+                                        routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule));
+                                        R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto);
+                                        if (distanceAndDuration.getCode() == 200) {
+                                            // 送驾- 接驾
+                                            Integer durationDifference = Integer.parseInt(duration) - distanceAndDuration.getData().getDuration();
+                                            vehiclePosition.setTimeDifference(durationDifference);
+                                        }
+                                    }
+                                }
+
+                                if (max1.equals(weightDistanceDifference)) {
+                                    for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                        RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
+                                        LonLatDto lonLatDto = new LonLatDto();
+                                        lonLatDto.setLongitude(vehiclePosition.getPoint().getX());
+                                        lonLatDto.setLatitude(vehiclePosition.getPoint().getY());
+                                        routeAndFareDto.setOrigin(lonLatDto);
+                                        LonLatDto lonLatDto1 = new LonLatDto();
+                                        lonLatDto1.setLongitude(Double.valueOf(split[0]));
+                                        lonLatDto1.setLatitude(Double.valueOf(split[1]));
+                                        routeAndFareDto.setDestination(lonLatDto1);
+                                        routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule));
+                                        R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto);
+                                        if (distanceAndDuration.getCode() == 200) {
+                                            // 送驾- 接驾
+                                            Integer distanceDifference = Integer.parseInt(distance) - distanceAndDuration.getData().getDistance();
+                                            vehiclePosition.setDistanceDifference(distanceDifference);
+                                        }
+                                    }
+
+                                }
+
+                                if (max1.equals(weightDistance)) {
+                                    for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                        RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
+                                        LonLatDto lonLatDto = new LonLatDto();
+                                        lonLatDto.setLongitude(vehiclePosition.getPoint().getX());
+                                        lonLatDto.setLatitude(vehiclePosition.getPoint().getY());
+                                        routeAndFareDto.setOrigin(lonLatDto);
+                                        LonLatDto lonLatDto1 = new LonLatDto();
+                                        lonLatDto1.setLongitude(Double.parseDouble(split[0]));
+                                        lonLatDto1.setLatitude(Double.parseDouble(split[1]));
+
+                                        routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule));
+                                        routeAndFareDto.setDestination(lonLatDto1);
+                                        //  调用地图 获取时间
+                                        R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto);
+                                        if (r.getCode() == 200) {
+                                            vehiclePosition.setDistance(Double.valueOf(r.getData().getDistance()));
+                                        } else {
+                                            vehiclePosition.setDistance(0.0);
+                                        }
+                                    }
+                                }
+
+                                if (max1.equals(weightTime)) {
+                                    for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                        RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
+                                        LonLatDto lonLatDto = new LonLatDto();
+                                        lonLatDto.setLongitude(vehiclePosition.getPoint().getX());
+                                        lonLatDto.setLatitude(vehiclePosition.getPoint().getY());
+                                        routeAndFareDto.setOrigin(lonLatDto);
+                                        LonLatDto lonLatDto1 = new LonLatDto();
+                                        lonLatDto1.setLongitude(Double.parseDouble(split[0]));
+                                        lonLatDto1.setLatitude(Double.parseDouble(split[1]));
+
+                                        routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule));
+                                        routeAndFareDto.setDestination(lonLatDto1);
+                                        //  调用地图 获取时间
+                                        R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto);
+                                        if (r.getCode() == 200) {
+                                            vehiclePosition.setSecond(r.getData().getDuration());
+                                        } else {
+                                            vehiclePosition.setSecond(0);
+                                        }
+                                    }
+                                }
+
+                                if (max1.equals(weightElectricity)) {
+                                    // 计算车的分数  分数最大是车的size
+                                    availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList());
+                                    int size1 = tendencyElectricity;
+                                    // 做比对的分数
+                                    int temp1 = availableVehiclesNearby.get(0).getCurrentElectricity();
+                                    for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                        vehiclePosition.setCurrentElectricityScore(vehiclePosition.getCurrentElectricityScore() + size1);
+                                        if (temp1 != vehiclePosition.getCurrentElectricity()) {
+                                            size1--;
+                                        }
+                                    }
+                                }
+
+
+                                // 算出总分 再来排序计算
+                                for (VehiclePositionVo vehiclePositionVo : availableVehiclesNearby) {
+                                    vehiclePositionVo.setOrderValueTotal(vehiclePositionVo.getCurrentElectricityScore() + vehiclePositionVo.getDistanceScore() + vehiclePositionVo.getTimeScore() + vehiclePositionVo.getDistanceDifference() + vehiclePositionVo.getTimeDifference());
+                                }
+                                availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getOrderValueTotal).reversed()).collect(Collectors.toList());
+
+
+                                int size2 = tendencyOrderValue;
+                                // 做比对的分数
+                                double temp2 = availableVehiclesNearby.get(0).getOrderValueTotal();
+                                for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                    vehiclePosition.setValueScore(vehiclePosition.getValueScore() + size2);
+                                    if (temp2 != vehiclePosition.getOrderValueTotal()) {
+                                        size2--;
+                                    }
+                                }
 
                             }
                         }
@@ -616,7 +757,7 @@
 
                     RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePositionVo.getVin());
                     lock.lock(10, TimeUnit.SECONDS);
-                    System.err.println("队列:"+quoteName+"  车辆:"+vehiclePositionVo.getVin()+"订单"+orderNo);
+                    System.err.println("队列:" + quoteName + "  车辆:" + vehiclePositionVo.getVin() + "订单" + orderNo);
                     try {
 //                        VehiclePosition vehiclePosition = vehiclePositionService.findByVehicleId(vehiclePositionVo.getVehicle_id());
                         R<XpVehicle> vehiclePositionR = xpVehicleClient.findByVehicleVin(vehiclePositionVo.getVin());
@@ -630,27 +771,15 @@
                         }
                         //  关闭巡游单子 TODO
 
-                        AddTaxiPassengerVo addTaxiPassengerVo = new AddTaxiPassengerVo();
-                        addTaxiPassengerVo.setVin(vehiclePosition.getVehicleVin());
-                        addTaxiPassengerVo.setUid(uid);
-                        addTaxiPassengerVo.setOrderNo(orderNo);
-                        // TODO appid
-                        addTaxiPassengerVo.setAppId("");
+
+                        PushOrderDto pushOrderDto = new PushOrderDto();
+                        pushOrderDto.setOrderId(xpOrder.getId());
+                        pushOrderDto.setVin(vehiclePosition.getVehicleVin());
 
 
-                        BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.addTaxiPassenger(addTaxiPassengerVo);
-                        if (baseVehicleUserDto!=null && baseVehicleUserDto.getCode() == 200) {
-                            // TODO 下单
+                        // 调用推送服务  orderId + carVin
+                        orderMissionClient.pushOrder(pushOrderDto);
 
-                            // 调用推送服务  orderId + carVin
-
-
-
-
-                            // 绑定成功  弹出这个队列第一个订单
-                            redisService.popFirstElement(quoteName);
-                            return;
-                        }
                     } catch (Exception e) {
                         e.printStackTrace();
                     } finally {
@@ -666,33 +795,25 @@
                     lock.lock(10, TimeUnit.SECONDS);
                     try {
                         // 查询车辆状态
-                       R<XpVehicle> vehicleR = xpVehicleClient.findByVehicleVin(vehicleVin);
-                       if(vehicleR.getCode()!=200){
-                           continue;
-                       }
-                       XpVehicle vehicleId1 = vehicleR.getData();
+                        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;
                         }
-                        if (vehiclePosition.getHasOrder() == 1) {
-                            //  关闭巡游单子 TODO
-                        }
-                        AddTaxiPassengerVo addTaxiPassengerVo = new AddTaxiPassengerVo();
-                        addTaxiPassengerVo.setVin(vehiclePosition.getVin());
-                        addTaxiPassengerVo.setUid(uid);
-                        addTaxiPassengerVo.setOrderNo(orderNo);
-                        // TODO appid
-                        addTaxiPassengerVo.setAppId("");
-                        BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.addTaxiPassenger(addTaxiPassengerVo);
-                        if (baseVehicleUserDto.getCode() == 200) {
+                        //  关闭巡游单子 TODO
 
 
+                        PushOrderDto pushOrderDto = new PushOrderDto();
+                        pushOrderDto.setOrderId(xpOrder.getId());
+                        pushOrderDto.setVin(vehiclePosition.getVin());
 
-                            redisService.popFirstElement(quoteName);
-                            lock.unlock();
-                            return;
-                        }
+                        // 调用推送服务  orderId + carVin
+                        orderMissionClient.pushOrder(pushOrderDto);
+
                     } catch (Exception e) {
 
                     } finally {
@@ -704,5 +825,70 @@
         }
     }
 
+    /**
+     * 订单处理
+     * @param count 轮数
+     * @param uid
+     * @param longitude  经度
+     * @param latitude  纬度
+     * @param orderNo 订单号
+     */
+    @SneakyThrows
+    public void reassignPushOrder(int count, String uid, Double longitude, Double latitude, String orderNo) {
+        System.out.println("进入推单环环节");
+        if (count == 0) {
+            count = 1;
+        }
+        // 订单状态
+        R<XpOrder> xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
+        if (xpOrderR.getCode() != 200) {
+            return;
+        }
+        if (xpOrderR.getData().getStatus() != 1) {
+            return;
+        }
+        XpOrder data = xpOrderR.getData();
+        XpTradingStrategy xpTradingStrategy = xpTradingStrategyService.getOne(null);
+        for (int i = 0; i < count; i++) {
+            log.info("进入找车环节");
+            List<VehiclePosition> positionList = vehiclePositionService.findAvailableVehiclesNearby(longitude, latitude, xpTradingStrategy.getOnePushDistance(), xpTradingStrategy.getSimultaneouslyOrderCount());
+
+            // 获取车辆的区域信息
+            if (positionList.isEmpty()) {
+                continue;
+            }
+
+            // 直接派单  定义一个锁来锁定车辆
+            VehiclePosition vehiclePosition = positionList.get(0);
+            String vehicleVin = vehiclePosition.getVin();
+
+            RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePosition.getVin());
+            lock.lock(10, TimeUnit.SECONDS);
+            try {
+                // 查询车辆状态
+                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;
+                }
+                //  关闭巡游单子 TODO
+
+                PushOrderDto pushOrderDto = new PushOrderDto();
+                pushOrderDto.setOrderId(data.getId());
+                pushOrderDto.setVin(vehiclePosition.getVin());
+                // 调用推送服务  orderId + carVin
+                orderMissionClient.pushOrder(pushOrderDto);
+            } catch (Exception e) {
+
+            } finally {
+                lock.unlock();
+            }
+        }
+    }
+
 
 }

--
Gitblit v1.7.1