From 274422a2d5cbb8f4518c29cc1748a805f8d9a00b Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期四, 30 四月 2026 08:54:15 +0800
Subject: [PATCH] 修改bug和补充功能

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java |  956 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 911 insertions(+), 45 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 49035d7..f555485 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
@@ -4,6 +4,7 @@
 import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
 import com.xiaopeng.api.dto.map.RouteAndFareDto;
 import com.xiaopeng.api.dto.operation.LonLatDto;
@@ -18,7 +19,9 @@
 import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
 import com.xiaopeng.api.model.operation.XpElectronicFence;
+import com.xiaopeng.api.model.operation.XpTargetedServiceVehicle;
 import com.xiaopeng.api.model.operation.XpTradingStrategy;
+import com.xiaopeng.api.model.operation.XpTradingStrategyPush;
 import com.xiaopeng.api.model.order.XpCruiseOrder;
 import com.xiaopeng.api.model.order.XpOrder;
 import com.xiaopeng.api.model.order.XpOrderReassign;
@@ -54,6 +57,7 @@
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -63,10 +67,12 @@
 @Slf4j
 @Component
 public class TaskOrderUtil {
-
+    @Resource
+    private XpTargetedServiceService xpTargetedServiceService;
 
     @Resource
-    XpTargetedServiceService xpTargetedServiceService;
+    private XpTargetedServiceVehicleService xpTargetedServiceVehicleService;
+
     @Resource
     private RedisService redisService;
 
@@ -84,6 +90,9 @@
 
     @Resource
     private IXpTradingStrategyService xpTradingStrategyService;
+
+    @Resource
+    private IXpTradingStrategyPushService xpTradingStrategyPushService;
 
     @Resource
     private XpCruiseOrderClient xpCruiseOrderClient;
@@ -138,25 +147,19 @@
      */
     @Scheduled(cron = "0/5 * * * * ?")
     public void taskOrder() {
-//        System.out.println("5秒执行一次");
+        System.out.println("5秒执行一次");
         Set<String> quoteMatchName = redisService.getQuoteMatchName(CacheConstants.QUEUE_POINT_ID);
         for (String name : quoteMatchName) {
             String firstElement = redisService.getFirstElement(name);
             if (firstElement != null) {
-                String[] split = firstElement.split("_");
-                if(split.length>8){
-                    String targetedVal = split[8];
-                    if (!"0".equals(targetedVal)) {
-                        continue;
-                    }
-                }
+                String[] split = firstElement.toString().split("_");
                 // 如果未处理 创建新任务
-                if ("0".equals(split[2])) {
+                if (split[2].equals("0")) {
                     String value = split[0] + "_" + split[1] + "_1" + "_" + split[3] + "_" + split[4] + "_" + split[5] + "_" + split[6] + "_" + split[7];
                     // 状态改为处理中
                     redisService.updateFirst(name, value);
                     threadPoolTaskExecutor.submit(() -> {
-                        orderProcess(name, firstElement);
+                        orderProcess(name, firstElement.toString(), false);
                     });
                 }
             }
@@ -168,25 +171,20 @@
      */
     @Scheduled(cron = "0/5 * * * * ?")
     public void taskOrder_targeted() {
-//        System.out.println("5秒执行一次");
-        Set<String> quoteMatchName = redisService.getQuoteMatchName(CacheConstants.QUEUE_POINT_ID);
+        System.out.println("5秒执行一次");
+        Set<String> quoteMatchName = redisService.getQuoteMatchName(CacheConstants.SP_QUEUE_POINT_ID);
         for (String name : quoteMatchName) {
             String firstElement = redisService.getFirstElement(name);
             if (firstElement != null) {
-                String[] split = firstElement.split("_");
-                if(split.length>8){
-                    String targetedVal = split[8];
-                    if (!"0".equals(targetedVal)) {
-                        // 如果未处理 创建新任务
-                        if ("0".equals(split[2])) {
-                            String value = split[0] + "_" + split[1] + "_1" + "_" + split[3] + "_" + split[4] + "_" + split[5] + "_" + split[6] + "_" + split[7];
-                            // 状态改为处理中
-                            redisService.updateFirst(name, value);
-                            threadPoolTaskExecutor.submit(() -> {
-                                orderProcess(name, firstElement);
-                            });
-                        }
-                    }
+                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];
+                    // 状态改为处理中
+                    redisService.updateFirst(name, value);
+                    threadPoolTaskExecutor.submit(() -> {
+                        orderProcess(name, firstElement.toString(), true);
+                    });
                 }
             }
         }
@@ -198,7 +196,7 @@
      * @param quoteName 队列名称
      * @param firstElement 队列第一个元素
      */
-    private void orderProcess(String quoteName, String firstElement) {
+    private void orderProcess(String quoteName, String firstElement, Boolean isTargetedService) {
         XpTradingStrategy xpTradingStrategy = xpTradingStrategyService.getOne(null);
         String orderId = firstElement.split("_")[0];
         String lonLat = firstElement.split("_")[1];
@@ -214,58 +212,68 @@
         // 经纬度
         String[] split = lonLat.split(",");
 
+        //查询当前时段是不是特殊推单时段
+        List<XpTradingStrategyPush> tradingStrategyId = xpTradingStrategyPushService.list(new QueryWrapper<XpTradingStrategyPush>().eq("trading_strategy_id", xpTradingStrategy));
+        long now = Long.parseLong(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HHmm")));
+        XpTradingStrategyPush xpTradingStrategyPush = tradingStrategyId.stream().filter(item -> {
+            long start = Long.parseLong(item.getStarTime().replace(":", ""));
+            long end = Long.parseLong(item.getEndTime().replace(":", ""));
+            return now >= start && now < end;
+        }).findFirst().orElse(null);
+
+
         // 5轮找车辆
         //每次查找车辆推单后的等待秒数
         int sleepTime = 3;
-        Integer onePushTime = xpTradingStrategy.getOnePushTime();
-        Double onePushDistance = xpTradingStrategy.getOnePushDistance();
+        Integer onePushTime = null != xpTradingStrategyPush ? xpTradingStrategyPush.getOnePushTime() : xpTradingStrategy.getOnePushTime();
+        Double onePushDistance = null != xpTradingStrategyPush ? xpTradingStrategyPush.getOnePushDistance() : xpTradingStrategy.getOnePushDistance();
         int count = onePushTime / sleepTime;
         // 第一轮推单
         log.info("开始第一轮推单 {}", orderNo);
-        Boolean processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, onePushDistance, distance, duration, planRule);
+        Boolean processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, onePushDistance, distance, duration, planRule, isTargetedService);
         if(processed){
             log.info("订单推送成功 {}", orderNo);
             return;
         }
         // 第二轮推单
-        Integer twoPushTime = xpTradingStrategy.getTwoPushTime();
-        Double twoPushDistance = xpTradingStrategy.getTwoPushDistance();
+        Integer twoPushTime = null != xpTradingStrategyPush ? xpTradingStrategyPush.getTwoPushTime() : xpTradingStrategy.getTwoPushTime();
+        Double twoPushDistance = null != xpTradingStrategyPush ? xpTradingStrategyPush.getTwoPushDistance() : xpTradingStrategy.getTwoPushDistance();
         count = twoPushTime / sleepTime;
         log.info("开始第二轮推单 {}", orderNo);
-        processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, twoPushDistance, distance, duration, planRule);
+        processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, twoPushDistance, distance, duration, planRule, isTargetedService);
         if(processed){
             log.info("订单推送成功 {}", orderNo);
             return;
         }
 
         // 第三轮推单
-        Integer threePushTime = xpTradingStrategy.getThreePushTime();
-        Double threePushDistance = xpTradingStrategy.getThreePushDistance();
+        Integer threePushTime = null != xpTradingStrategyPush ? xpTradingStrategyPush.getThreePushTime() : xpTradingStrategy.getThreePushTime();
+        Double threePushDistance = null != xpTradingStrategyPush ? xpTradingStrategyPush.getThreePushDistance() : xpTradingStrategy.getThreePushDistance();
         count = threePushTime / sleepTime;
         log.info("开始第三轮推单 {}", orderNo);
-        processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, threePushDistance, distance, duration, planRule);
+        processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, threePushDistance, distance, duration, planRule, isTargetedService);
         if(processed){
             log.info("订单推送成功 {}", orderNo);
             return;
         }
 
         // 第四轮推单
-        Integer fourPushTime = xpTradingStrategy.getFourPushTime();
-        Double fourPushDistance = xpTradingStrategy.getFourPushDistance();
+        Integer fourPushTime = null != xpTradingStrategyPush ? xpTradingStrategyPush.getFourPushTime() : xpTradingStrategy.getFourPushTime();
+        Double fourPushDistance = null != xpTradingStrategyPush ? xpTradingStrategyPush.getFourPushDistance() : xpTradingStrategy.getFourPushDistance();
         count = fourPushTime / sleepTime;
         log.info("开始第四轮推单 {}", orderNo);
-        processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, fourPushDistance, distance, duration, planRule);
+        processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, fourPushDistance, distance, duration, planRule, isTargetedService);
         if(processed){
             log.info("订单推送成功 {}", orderNo);
             return;
         }
 
         // 第五轮推单
-        Integer fivePushTime = xpTradingStrategy.getFivePushTime();
-        Double fivePushDistance = xpTradingStrategy.getFivePushDistance();
+        Integer fivePushTime = null != xpTradingStrategyPush ? xpTradingStrategyPush.getFivePushTime() : xpTradingStrategy.getFivePushTime();
+        Double fivePushDistance = null != xpTradingStrategyPush ? xpTradingStrategyPush.getFivePushDistance() : xpTradingStrategy.getFivePushDistance();
         count = fivePushTime / sleepTime;
         log.info("开始第五轮推单 {}", orderNo);
-        processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, fivePushDistance, distance, duration, planRule);
+        processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, fivePushDistance, distance, duration, planRule, isTargetedService);
         if(processed){
             log.info("订单推送成功 {}", orderNo);
             return;
@@ -320,7 +328,863 @@
      * @param xpTradingStrategy  规则
      */
     @SneakyThrows
-    private Boolean processPushOrder(String quoteName, int count, int sleepTime, String uid, String[] split, String orderNo, XpTradingStrategy xpTradingStrategy, Double pushDistance, String distance, String duration, String planRule) {
+    private Boolean processPushOrder(String quoteName, int count, int sleepTime, String uid, String[] split, String orderNo, XpTradingStrategy xpTradingStrategy, Double pushDistance, String distance, String duration, String planRule, Boolean isTargetedService) {
+        log.info("进入推单环节 单号 {}", orderNo);
+        if (count == 0) {
+            count = 1;
+        }
+        // 订单状态
+        R<XpOrder> xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
+        if (xpOrderR.getCode() != 200) {
+            return false;
+        }
+        if (xpOrderR.getData().getStatus() != 1) {
+            return true;
+        }
+        XpOrder xpOrder = xpOrderR.getData();
+        if (xpOrder.getStatus() == 0) {
+            redisService.removeByPattern(quoteName, xpOrder.getOrderNumber());
+        }
+
+        // 找出围栏id
+        Long xpElectronicFenceAreaId = xpOrder.getXpElectronicFenceAreaId();
+        Long electronicId = xpElectronicFenceAreaService.getById(xpElectronicFenceAreaId).getElectronicId();
+        XpElectronicFence xpElectronicFence = xpElectronicFenceMapper.selectById(electronicId);
+
+        // ===== 新增:UID-VIN 优先匹配(仅 enabled=true 时生效)=====
+        log.info("[人车订单绑定测试] >>>>>> 进入优先匹配判断, uid={}, orderNo={}, 围栏区域ID={}", uid, orderNo, xpElectronicFenceAreaId);
+        if (uidVinBindingConfig.isEnabled()) {
+            log.info("[人车订单绑定测试] 总开关已开启, 开始执行优先匹配逻辑, uid={}, orderNo={}", uid, orderNo);
+            try {
+                PriorityMatchResult priorityResult = uidVinPriorityMatcher.tryPriorityMatch(uid, orderNo, String.valueOf(xpElectronicFenceAreaId));
+                log.info("[人车订单绑定测试] 优先匹配结果: matched={}, vin={}, failReason={}, uid={}, orderNo={}",
+                        priorityResult != null ? priorityResult.isMatched() : "null",
+                        priorityResult != null ? priorityResult.getVin() : "null",
+                        priorityResult != null ? priorityResult.getFailReason() : "null",
+                        uid, orderNo);
+                if (priorityResult != null && priorityResult.isMatched()) {
+                    String priorityVin = priorityResult.getVin();
+                    log.info("[人车订单绑定测试] 匹配成功, 准备获取分布式锁, lockKey=FIND_CAR_{}, orderNo={}", priorityVin, orderNo);
+                    RLock priorityLock = redissonClient.getLock("FIND_CAR_" + priorityVin);
+                    priorityLock.lock(10, TimeUnit.SECONDS);
+                    log.info("[人车订单绑定测试] 分布式锁获取成功, vin={}, orderNo={}", priorityVin, orderNo);
+                    try {
+                        // 二次校验车辆状态
+                        log.info("[人车订单绑定测试] 开始二次校验车辆状态, vin={}, orderNo={}", priorityVin, orderNo);
+                        R<XpVehicle> vehicleR = xpVehicleClient.findByVehicleVin(priorityVin);
+                        log.info("[人车订单绑定测试] 二次校验-车辆查询结果: code={}, hasData={}, vin={}", vehicleR.getCode(), vehicleR.getData() != null, priorityVin);
+                        if (vehicleR.getCode() == 200 && vehicleR.getData() != null) {
+                            XpVehicle vehicle = vehicleR.getData();
+                            //判断当前车辆是否在禁派单车辆内
+                            String cacheList = redisService.getCacheObject("CAN_NOT_RECEIVE_ORDER_VEHICLE:" + xpOrder.getId());
+                            List<String> strings = new ArrayList<>();
+                            if(null != cacheList){
+                                strings = JSON.parseArray(cacheList, String.class);
+                            }
+                            log.info("[人车订单绑定测试] 二次校验-车辆状态: operatingStatus={}, state={}, vehicleType={}, vin={}",
+                                    vehicle.getOperatingStatus(), vehicle.getState(), vehicle.getVehicleType(), priorityVin);
+                            if (vehicle.getOperatingStatus() == 1 && vehicle.getState() == 0 && vehicle.getVehicleType() != 1 && !strings.contains(vehicle.getVehicleVin())) {
+                                log.info("[人车订单绑定测试] 二次校验-车辆状态通过(空闲), 开始校验订单状态, orderNo={}", orderNo);
+                                // 二次校验订单状态
+                                R<XpOrder> orderCheck = xpOrderClient.queryOrderByOrderNo(orderNo);
+                                log.info("[人车订单绑定测试] 二次校验-订单查询结果: code={}, status={}, orderNo={}",
+                                        orderCheck.getCode(),
+                                        orderCheck.getData() != null ? orderCheck.getData().getStatus() : "null",
+                                        orderNo);
+                                if (orderCheck.getCode() == 200 && orderCheck.getData() != null && orderCheck.getData().getStatus() == 1) {
+                                    log.info("[人车订单绑定测试] 二次校验全部通过, 开始关闭巡游单, vin={}, orderNo={}", priorityVin, orderNo);
+                                    // 关闭巡游单
+                                    R stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(priorityVin);
+                                    log.info("[人车订单绑定测试] 关闭巡游单结果: code={}, vin={}, orderNo={}",
+                                            stringR != null ? stringR.getCode() : "null", priorityVin, orderNo);
+                                    if (stringR != null && stringR.getCode() == 200) {
+                                        log.info("[人车订单绑定测试] 关闭巡游单成功, 开始下发XPU命令, vin={}, orderNo={}", priorityVin, orderNo);
+                                        // 下发XPU命令
+                                        PushOrderDto pushOrderDto = new PushOrderDto();
+                                        pushOrderDto.setVin(priorityVin);
+                                        pushOrderDto.setOrderId(orderCheck.getData().getId().toString());
+                                        pushOrderDto.setStartLatitude(orderCheck.getData().getStartLat());
+                                        pushOrderDto.setStartLongitude(orderCheck.getData().getStartLon());
+                                        pushOrderDto.setEndLatitude(orderCheck.getData().getEndLat());
+                                        pushOrderDto.setEndLongitude(orderCheck.getData().getEndLon());
+                                        pushOrderDto.setEndPoiName(orderCheck.getData().getEndPointName());
+                                        pushOrderDto.setOrderType(OrderType.USER_ORDER);
+                                        pushOrderDto.setStage(1);
+                                        log.info("[人车订单绑定测试] XPU推单参数: vin={}, orderId={}, startLat={}, startLon={}, endLat={}, endLon={}, orderNo={}",
+                                                priorityVin, orderCheck.getData().getId(), orderCheck.getData().getStartLat(), orderCheck.getData().getStartLon(),
+                                                orderCheck.getData().getEndLat(), orderCheck.getData().getEndLon(), orderNo);
+                                        orderMissionClient.pushOrder(pushOrderDto);
+                                        log.info("[人车订单绑定测试] ====== 派单成功! uid={}, vin={}, orderNo={}, 从队列移除订单 ======", uid, priorityVin, orderNo);
+                                        redisService.removeByPattern(quoteName, orderNo);
+                                        return true;
+                                    } else {
+                                        log.info("[人车订单绑定测试] 关闭巡游单失败, 回退常规流程, vin={}, orderNo={}", priorityVin, orderNo);
+                                    }
+                                } else {
+                                    log.info("[人车订单绑定测试] 二次校验-订单状态不满足(非待派单), 回退常规流程, orderNo={}", orderNo);
+                                }
+                            } else {
+                                if (vehicle.getState() != 0) {
+                                    log.info("[人车订单绑定测试] 二次校验-车辆已接单(state={}), 当前有未完成订单, 无法指派, vin={}, plateNumber={}, orderNo={}",
+                                            vehicle.getState(), priorityVin, vehicle.getPlateNumber(), orderNo);
+                                } else {
+                                    log.info("[人车订单绑定测试] 二次校验-车辆状态不满足, 回退常规流程, vin={}, operatingStatus={}, state={}, vehicleType={}",
+                                            priorityVin, vehicle.getOperatingStatus(), vehicle.getState(), vehicle.getVehicleType());
+                                }
+                            }
+                        } else {
+                            log.info("[人车订单绑定测试] 二次校验-车辆查询失败, 回退常规流程, vin={}, code={}", priorityVin, vehicleR.getCode());
+                        }
+                    } catch (Exception e) {
+                        log.error("[人车订单绑定测试] 锁内执行异常,回退常规流程, uid={}, vin={}, orderNo={}", uid, priorityVin, orderNo, e);
+                    } finally {
+                        priorityLock.unlock();
+                        log.info("[人车订单绑定测试] 分布式锁已释放, vin={}, orderNo={}", priorityVin, orderNo);
+                    }
+                } else {
+                    log.info("[人车订单绑定测试] 优先匹配未命中, 进入常规流程, uid={}, orderNo={}", uid, orderNo);
+                }
+            } catch (Exception e) {
+                log.error("[人车订单绑定测试] 优先匹配过程异常,回退常规流程, uid={}, orderNo={}", uid, orderNo, e);
+            }
+        } else {
+            log.info("[人车订单绑定测试] 总开关未开启(enabled=false), 跳过优先匹配, uid={}, orderNo={}", uid, orderNo);
+        }
+        // ===== 新增结束 =====
+
+        for (int i = 0; i < count; i++) {
+            //等到sleepTime秒钟
+            Thread.sleep(sleepTime * 1000);
+            // 根据距离找车
+            // 车多则根据配置找具体车数量 根据距离最近
+            // 更改 暂不限制数量
+            List<VehiclePosition> positionList = vehiclePositionService.findAvailableVehiclesNearby(Double.parseDouble(split[0]), Double.parseDouble(split[1]), pushDistance, xpTradingStrategy.getSimultaneouslyOrderCount());
+            log.info("根据距离找车 {} 距离 {}KM  经度 {} 维度 {} 查找结果 {} 单号 {}", orderNo, pushDistance, split[0], split[1], JSON.toJSONString(positionList), orderNo);
+            // 获取车辆的区域信息
+            if (positionList.isEmpty()) {
+                continue;
+            }
+            Set<String> vinList = positionList.stream().map(VehiclePosition::getVin).collect(Collectors.toSet());
+
+            //判断当前车辆是否在禁派单车辆内
+            String cacheList = redisService.getCacheObject("CAN_NOT_RECEIVE_ORDER_VEHICLE:" + xpOrder.getId());
+            if(Objects.nonNull(cacheList)){
+                List<String> strings = JSON.parseArray(cacheList, String.class);
+                Set<String> vins = new HashSet<>();
+                for (String s : vinList) {
+                    if (!strings.contains(s)) {
+                        vins.add(s);
+                    }
+                }
+                vinList = vins;
+            }
+
+            // 获取车辆的信息 筛选出可用车辆,定向服务的车辆排除
+            R<List<String>> vehiclePositionVos = xpVehicleClient.queryVehiclePositionByVin(new VehiclePositionByVinDto(xpElectronicFence.getId(), vinList, xpTradingStrategy.getSimultaneouslyOrderCount()));
+            log.info("筛选可用车辆结果 {} 单号 {}", JSON.toJSONString(vehiclePositionVos), orderNo);
+            List<String> vehicleVinByTargetedService = xpTargetedServiceVehicleService.getVehicleVinByTargetedService(xpOrderR.getData().getCityCode());
+            if(!isTargetedService){
+                vehiclePositionVos.getData().removeAll(vehicleVinByTargetedService);
+                log.info("筛选调定向服务车辆后的结果 {} 单号 {}", JSON.toJSONString(vehiclePositionVos), orderNo);
+            }else{
+                vehicleVinByTargetedService.removeAll(vehiclePositionVos.getData());
+                vehiclePositionVos.setData(vehicleVinByTargetedService);
+                log.info("筛选调定向服务车辆后的结果 {} 单号 {}", JSON.toJSONString(vehiclePositionVos), orderNo);
+            }
+            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());
+
+            if (!availableVehiclesNearby.isEmpty()) {
+                if (availableVehiclesNearby.size() > 1) {
+                    log.info("附近有 {} 辆车,进入权重判断流程 单号 {}", availableVehiclesNearby.size(), orderNo);
+                    // 走权重
+
+                    // 订单价值
+                    Integer tendencyOrderValue = xpTradingStrategy.getTendencyOrderValue();
+
+                    // 距离价值
+                    Integer tendencyDistance = xpTradingStrategy.getTendencyDistance();
+
+                    // 时间价值
+                    Integer tendencyTime = xpTradingStrategy.getTendencyTime();
+
+                    try {
+
+                        // 电量价值
+                        Integer tendencyElectricity = xpTradingStrategy.getTendencyElectricity();
+                        // 找出最大的值是那个
+                        Integer max = Math.max(tendencyOrderValue, Math.max(tendencyDistance, Math.max(tendencyTime, tendencyElectricity)));
+                        if (max.equals(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);
+                                    if(planRule!=null&& !"null".equals(planRule)){
+                                        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);
+                                    if(planRule!=null&& !"null".equals(planRule)){
+                                        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)) {
+                                log.info("车子距离~~");
+                                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]));
+                                    if(planRule!=null&& !"null".equals(planRule)){
+                                        routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule));
+                                    }
+                                    routeAndFareDto.setDestination(lonLatDto1);
+                                    //  调用地图 获取时间
+                                    R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto);
+                                    if (r.getCode() == 200) {
+                                        log.info("车子距离~~{},{},{}",vehiclePosition.getVin(),r.getData().getDistance(),orderNo);
+                                        vehiclePosition.setDistance(Double.valueOf(r.getData().getDistance()));
+                                    } else {
+                                        vehiclePosition.setDistance(0.0);
+                                    }
+
+                                }
+
+                                // 分数计算 把时间短的分数调高
+                                availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getDistance)).collect(Collectors.toList());
+                                double score = 10;
+                                for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                    vehiclePosition.setDistance(score);
+                                    score--;
+                                }
+
+                            }
+
+                            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]));
+                                    if(planRule!=null&& !"null".equals(planRule)){
+                                        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);
+                                    }
+                                }
+                                // 分数计算 把时间短的分数调高
+                                availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getSecond)).collect(Collectors.toList());
+                                int score = 10;
+                                for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                    vehiclePosition.setSecond(score);
+                                    score--;
+                                }
+
+                            }
+
+                            if (max1.equals(weightElectricity)) {
+                                // 计算车的分数  分数最大是车的size
+                                availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList());
+                                int size = tendencyElectricity;
+                                // 做比对的分数
+                                int temp = availableVehiclesNearby.get(0).getCurrentElectricity();
+                                for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                    vehiclePosition.setCurrentElectricityScore(vehiclePosition.getCurrentElectricityScore() + size);
+                                    if (temp != vehiclePosition.getCurrentElectricity()) {
+                                        size--;
+                                    }
+                                }
+                            }
+
+
+                            // 算出总分 再来排序计算
+                            for (VehiclePositionVo vehiclePositionVo : availableVehiclesNearby) {
+                                vehiclePositionVo.setOrderValueTotal(vehiclePositionVo.getCurrentElectricityScore() + vehiclePositionVo.getDistanceScore() + vehiclePositionVo.getTimeScore() + vehiclePositionVo.getDistanceDifference() + vehiclePositionVo.getTimeDifference()+vehiclePositionVo.getSecond()+vehiclePositionVo.getDistance().intValue());
+                            }
+                            availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getOrderValueTotal).reversed()).collect(Collectors.toList());
+
+
+                            int size = tendencyOrderValue;
+                            // 做比对的分数
+                            double temp = availableVehiclesNearby.get(0).getOrderValueTotal();
+                            for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                vehiclePosition.setValueScore(vehiclePosition.getValueScore() + size);
+                                if (temp != vehiclePosition.getOrderValueTotal()) {
+                                    size--;
+                                }
+                            }
+
+
+                        }
+
+                        // 距离分数
+                        if (max.equals(tendencyDistance)) {
+                            log.info("车子距离~~");
+                            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]));
+
+                                if(planRule!=null&& !"null".equals(planRule)){
+                                    routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule));
+                                }
+                                routeAndFareDto.setDestination(lonLatDto1);
+                                //  调用地图 获取时间
+                                R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto);
+                                if (r.getCode() == 200) {
+                                    log.info("车子距离~~{},{},{}",vehiclePosition.getVin(),r.getData().getDistance(),orderNo);
+                                    vehiclePosition.setDistance(Double.valueOf(r.getData().getDistance()));
+                                } else {
+                                    vehiclePosition.setDistance(0.0);
+                                }
+                            }
+//                            availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getDistance)).collect(Collectors.toList());
+//                            int size = tendencyDistance;
+//                            // 做比对的分数
+//                            double temp = availableVehiclesNearby.get(0).getDistance();
+//                            for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+//                                vehiclePosition.setDistanceScore(vehiclePosition.getDistanceScore() + size);
+//                                if (temp != vehiclePosition.getDistance()) {
+//                                    size--;
+//                                }
+//                            }
+
+                            // 分数计算 把时间短的分数调高
+                            availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getDistance)).collect(Collectors.toList());
+                            int score = 10;
+                            for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                vehiclePosition.setDistanceScore(score);
+                                score--;
+                            }
+                        }
+
+
+                        // 时间分数
+                        if (max.equals(tendencyTime)) {
+                            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]));
+
+                                if(planRule!=null&& !"null".equals(planRule)){
+                                    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);
+                                }
+                            }
+
+                            // 分数计算 把时间短的分数调高
+                            availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getSecond)).collect(Collectors.toList());
+                            int score = 10;
+                            for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                vehiclePosition.setTimeScore(score);
+                                score--;
+                            }
+//                            availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getSecond)).collect(Collectors.toList());
+//                            int size = tendencyTime;
+//                            // 做比对的分数
+//                            double temp = availableVehiclesNearby.get(0).getSecond();
+//                            for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+//                                vehiclePosition.setTimeScore(vehiclePosition.getTimeScore() + size);
+//                                if (temp != vehiclePosition.getSecond()) {
+//                                    size--;
+//                                }
+//                            }
+
+                        }
+
+
+                        // 电量分数
+                        if (max.equals(tendencyElectricity)) {
+                            // 计算车的分数  分数最大是车的size
+                            availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList());
+                            int size = tendencyElectricity;
+                            // 做比对的分数
+                            int temp = availableVehiclesNearby.get(0).getCurrentElectricity();
+
+                            int maxTemp = 0;
+                            for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                vehiclePosition.setCurrentElectricityScore(vehiclePosition.getCurrentElectricityScore() + size);
+                                if (temp != vehiclePosition.getCurrentElectricity()) {
+                                    size--;
+                                } else {
+                                    maxTemp++;
+                                }
+                            }
+
+                            if (maxTemp > 1) {
+                                // 证明有最高相同电量的  找下一个
+                                // 找出最第二大的值是那个
+                                // 将四个值放入列表
+                                List<Integer> values = Arrays.asList(tendencyOrderValue, tendencyDistance, tendencyTime);
+                                // 降序排序
+                                values.sort(Collections.reverseOrder());
+                                // 获取第二大值
+                                Integer secondMax = values.get(1);
+
+                                // 判断第二大的是哪个
+                                if (Objects.equals(secondMax, tendencyDistance)) {
+                                    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]));
+                                        if(planRule!=null&& !"null".equals(planRule)){
+                                            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);
+                                        }
+                                    }
+                                    availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getDistance)).collect(Collectors.toList());
+                                    int size1 = tendencyDistance;
+                                    // 做比对的分数
+                                    double temp1 = availableVehiclesNearby.get(0).getDistance();
+                                    for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                        vehiclePosition.setDistanceScore(vehiclePosition.getDistanceScore() + size1);
+                                        if (temp1 != vehiclePosition.getDistance()) {
+                                            size1--;
+                                        }
+                                    }
+                                }
+
+
+                                if (Objects.equals(secondMax, tendencyTime)) {
+                                    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]));
+
+                                        if(planRule!=null&& !"null".equals(planRule)){
+                                            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);
+                                        }
+                                    }
+                                    availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getSecond)).collect(Collectors.toList());
+                                    int size1 = tendencyTime;
+                                    // 做比对的分数
+                                    double temp1 = availableVehiclesNearby.get(0).getSecond();
+                                    for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+                                        vehiclePosition.setTimeScore(vehiclePosition.getTimeScore() + size1);
+                                        if (temp1 != vehiclePosition.getSecond()) {
+                                            size1--;
+                                        }
+                                    }
+                                }
+
+
+                                // 订单价值
+                                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);
+                                            if(planRule!=null&& !"null".equals(planRule)){
+                                                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);
+                                            if(planRule!=null&& !"null".equals(planRule)){
+                                                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]));
+                                            if(planRule!=null&& !"null".equals(planRule)){
+                                                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]));
+                                            if(planRule!=null&& !"null".equals(planRule)){
+                                                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()+vehiclePositionVo.getSecond()+vehiclePositionVo.getDistance().intValue());
+                                }
+                                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--;
+                                    }
+                                }
+
+                            }
+                        }
+
+
+                    } catch (Exception e) {
+                        log.error("异常", e);
+                    }
+
+                    // 判断总分来计算
+                    for (VehiclePositionVo vehiclePositionVo : availableVehiclesNearby) {
+                        vehiclePositionVo.setTotal(vehiclePositionVo.getCurrentElectricityScore() + vehiclePositionVo.getDistanceScore() + vehiclePositionVo.getTimeScore() + vehiclePositionVo.getValueScore());
+                    }
+                    VehiclePositionVo vehiclePositionVo = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getTotal).reversed()).collect(Collectors.toList()).get(0);
+
+//
+//                    VehiclePositionVo vehiclePositionVo1 = vehiclePositionVo;
+
+
+                    RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePositionVo.getVin());
+                    lock.lock(10, TimeUnit.SECONDS);
+                    log.info("队列 {} 车辆 {} 单号 {}", quoteName, vehiclePositionVo.getVin(), orderNo);
+                    try {
+
+
+
+//                        VehiclePosition vehiclePosition = vehiclePositionService.findByVehicleId(vehiclePositionVo.getVehicle_id());
+                        R<XpVehicle> vehiclePositionR = xpVehicleClient.findByVehicleVin(vehiclePositionVo.getVin());
+                        if (vehiclePositionR.getCode() != 200) {
+                            continue;
+                        }
+                        XpVehicle vehiclePosition = vehiclePositionR.getData();
+                        log.info("符合条件的车辆 {} ,直接推单XPU。单号 {}", vehiclePosition.getPlateNumber(), orderNo);
+                        log.info("当前车辆状态 {} 单号 {}", vehiclePosition.getStatus(), orderNo);
+                        if (vehiclePosition.getOperatingStatus() != 1 || vehiclePosition.getState() != 0 || vehiclePosition.getVehicleType() == 1) {
+                            continue;
+                        }
+
+                        // 再次查询一下订单 看是否取消
+                        xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
+                        if (xpOrderR.getCode() != 200) {
+                            continue;
+                        }
+                        xpOrder = xpOrderR.getData();
+                        if (xpOrder.getStatus() != 1) {
+                            continue;
+                        }
+
+
+                        //  关闭巡游单子
+                        R stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vehiclePosition.getVehicleVin());
+                        if (stringR == null || stringR.getCode() != 200) {
+                            log.info("关闭巡游单子失败 车牌号 {}", vehiclePosition.getPlateNumber());
+                            continue;
+                        }
+                        log.info("关闭巡游单成功 {} {}", vehiclePosition.getPlateNumber(), orderNo);
+                        // 下发命令
+                        PushOrderDto pushOrderDto = new PushOrderDto();
+                        pushOrderDto.setVin(vehiclePosition.getVehicleVin());
+                        pushOrderDto.setOrderId(xpOrder.getId().toString());
+                        pushOrderDto.setStartLatitude(xpOrder.getStartLat());
+                        pushOrderDto.setStartLongitude(xpOrder.getStartLon());
+                        pushOrderDto.setEndLatitude(xpOrder.getEndLat());
+                        pushOrderDto.setEndLongitude(xpOrder.getEndLon());
+                        pushOrderDto.setEndPoiName(xpOrder.getEndPointName());
+                        pushOrderDto.setOrderType(OrderType.USER_ORDER);
+                        pushOrderDto.setStage(1);
+                        // 调用推送服务  orderId + carVin
+                        orderMissionClient.pushOrder(pushOrderDto);
+                        log.info("开始推送 {} 订单到XPU。单号 {}", xpOrder.getOrderNumber(), orderNo);
+
+                        redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
+                        log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
+                        return true;
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    } finally {
+                        lock.unlock();
+                    }
+
+                } else {
+                    // 直接派单  定义一个锁来锁定车辆
+                    VehiclePositionVo vehiclePosition = availableVehiclesNearby.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();
+                        log.info("附近只有一个车辆 {} ,直接推单XPU。单号 {}", vehicleId1.getPlateNumber(), orderNo);
+                        log.info("当前车辆状态 运营状态 {} 单号 {}", vehicleId1.getState(), orderNo);
+                        if (vehicleId1.getOperatingStatus() != 1 || vehicleId1.getState() != 0 || vehicleId1.getVehicleType() == 1) {
+                            continue;
+                        }
+
+
+                        // 再次查询一下订单 看是否取消
+                        xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
+                        if (xpOrderR.getCode() != 200) {
+                            continue;
+                        }
+                        xpOrder = xpOrderR.getData();
+                        if (xpOrder.getStatus() != 1) {
+                            continue;
+                        }
+
+                        //  关闭巡游单子
+                        R<?> stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vehicleId1.getVehicleVin());
+                        if (stringR == null || stringR.getCode() != 200) {
+                            log.info("关闭巡游单子失败 车牌号 {}", vehicleId1.getPlateNumber());
+                            continue;
+                        }
+                        log.info("关闭巡游单成功 {} {}", vehicleId1.getPlateNumber(), orderNo);
+                        PushOrderDto pushOrderDto = new PushOrderDto();
+                        pushOrderDto.setVin(vehiclePosition.getVin());
+                        pushOrderDto.setOrderId(xpOrder.getId().toString());
+                        pushOrderDto.setStartLatitude(xpOrder.getStartLat());
+                        pushOrderDto.setStartLongitude(xpOrder.getStartLon());
+                        pushOrderDto.setEndLatitude(xpOrder.getEndLat());
+                        pushOrderDto.setEndLongitude(xpOrder.getEndLon());
+                        pushOrderDto.setEndPoiName(xpOrder.getEndPointName());
+                        pushOrderDto.setOrderType(OrderType.USER_ORDER);
+                        pushOrderDto.setStage(1);
+                        // 调用推送服务  orderId + carVin
+                        orderMissionClient.pushOrder(pushOrderDto);
+                        log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber());
+                        redisService.popFirstElement(quoteName);
+                        log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
+                        return true;
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    } finally {
+                        lock.unlock();
+                    }
+
+                }
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * 定向服务订单处理
+     * @param quoteName  队列名称
+     * @param count 轮数
+     * @param uid
+     * @param split  经纬度
+     * @param orderNo 订单号
+     * @param xpTradingStrategy  规则
+     */
+    @SneakyThrows
+    private Boolean processPushSpOrder(String quoteName, int count, int sleepTime, String uid, String[] split, String orderNo, XpTradingStrategy xpTradingStrategy, Double pushDistance, String distance, String duration, String planRule) {
         log.info("进入推单环节 单号 {}", orderNo);
         if (count == 0) {
             count = 1;
@@ -1256,6 +2120,8 @@
         return false;
     }
 
+
+
     private static PushOrderDto buildPushOrderDto(XpOrder xpOrder) {
         PushOrderDto pushOrderDto = new PushOrderDto();
         pushOrderDto.setOrderId(xpOrder.getId().toString());

--
Gitblit v1.7.1