From 43e9944347e51d5628166f8c1b78d98cfd2013ea Mon Sep 17 00:00:00 2001
From: yyy <1083599556@qq.com>
Date: 星期三, 22 四月 2026 22:12:22 +0800
Subject: [PATCH] 1.调试接口修改问题 2.修改定向服务的播单和 改派

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java |   84 ++++++++++++++++++++++++++++++++++++------
 1 files changed, 72 insertions(+), 12 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 9c072e0..d972c7d 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,6 +1,7 @@
 package com.xiaopeng.operation.utils;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
@@ -27,6 +28,7 @@
 import com.xiaopeng.api.vo.automaticPilot.protobuf.TaskActionType;
 import com.xiaopeng.api.vo.operation.RouteVo;
 import com.xiaopeng.api.vo.operation.VehiclePositionVo;
+import com.xiaopeng.api.vo.operation.XpTargetedServiceVehicleVo;
 import com.xiaopeng.api.vo.operation.XpTradingStrategyDetailVO;
 import com.xiaopeng.common.core.constant.CacheConstants;
 import com.xiaopeng.common.core.constant.Constants;
@@ -36,13 +38,11 @@
 import com.xiaopeng.operation.config.UidVinBindingConfig;
 import com.xiaopeng.operation.dto.PriorityMatchResult;
 import com.xiaopeng.operation.mapper.XpElectronicFenceMapper;
-import com.xiaopeng.operation.service.IXpElectronicFenceAreaService;
-import com.xiaopeng.operation.service.IXpTradingStrategyService;
-import com.xiaopeng.operation.service.UidVinPriorityMatcher;
-import com.xiaopeng.operation.service.XpPointService;
+import com.xiaopeng.operation.service.*;
 import com.xiaopeng.operation.utils.mango.VehiclePositionService;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.springframework.data.mongodb.core.MongoTemplate;
@@ -65,6 +65,8 @@
 public class TaskOrderUtil {
 
 
+    @Resource
+    XpTargetedServiceService xpTargetedServiceService;
     @Resource
     private RedisService redisService;
 
@@ -132,7 +134,7 @@
 
     /**
      * 5秒执行一次
-     * 播单
+     * 播单 在下单的时候会存一个 redis 队列
      */
     @Scheduled(cron = "0/5 * * * * ?")
     public void taskOrder() {
@@ -141,15 +143,50 @@
         for (String name : quoteMatchName) {
             String firstElement = redisService.getFirstElement(name);
             if (firstElement != null) {
-                String[] split = firstElement.toString().split("_");
+                String[] split = firstElement.split("_");
+                if(split.length>8){
+                    String targetedVal = split[8];
+                    if (!"0".equals(targetedVal)) {
+                        continue;
+                    }
+                }
                 // 如果未处理 创建新任务
-                if (split[2].equals("0")) {
+                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.toString());
+                        orderProcess(name, firstElement);
                     });
+                }
+            }
+        }
+    }
+
+    /**
+     * 定向订单
+     */
+    @Scheduled(cron = "0/5 * * * * ?")
+    public void taskOrder_targeted() {
+        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)) {
+                        // 如果未处理 创建新任务
+                        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);
+                            });
+                        }
+                    }
                 }
             }
         }
@@ -406,7 +443,8 @@
             log.info("[人车订单绑定测试] 总开关未开启(enabled=false), 跳过优先匹配, uid={}, orderNo={}", uid, orderNo);
         }
         // ===== 新增结束 =====
-
+        //根据 用户id 和 城市编码 查询 定向服务的 车辆信息
+        List<String> targetedServiceVehicleVinList = xpTargetedServiceService.findSetVehicleVinByUserIdAndCityCode(xpOrder.getAppUserId(), xpOrder.getCityCode());
         for (int i = 0; i < count; i++) {
             //等到sleepTime秒钟
             Thread.sleep(sleepTime * 1000);
@@ -427,11 +465,19 @@
             if (vehiclePositionVos.getCode() != 200) {
                 continue;
             }
-            List<VehiclePositionVo> availableVehiclesNearby = BeanUtil.copyToList(positionList, VehiclePositionVo.class);
-            List<String> data = vehiclePositionVos.getData();
+            List<String> data = vehiclePositionVos.getData(); //指定区域的车
+            // 计算交集:指定区域的车辆 与 定向服务车辆列表的交集
+            if (targetedServiceVehicleVinList != null && !targetedServiceVehicleVinList.isEmpty() && data != null) {
+                Collection<String> newVehicleVinList = CollUtil.intersection(data,targetedServiceVehicleVinList);
+                if(CollUtil.isNotEmpty(newVehicleVinList)){
+                    data = (List<String>) newVehicleVinList;
+                }
+            }
 
+            List<VehiclePositionVo> availableVehiclesNearby = BeanUtil.copyToList(positionList, VehiclePositionVo.class);
             // 找出符合条件的
-            availableVehiclesNearby = availableVehiclesNearby.stream().filter(e -> data.contains(e.getVin())).collect(Collectors.toList());
+            List<String> finalData = data;
+            availableVehiclesNearby = availableVehiclesNearby.stream().filter(e -> finalData.contains(e.getVin())).collect(Collectors.toList());
 //            List<VehiclePositionVo> availableVehiclesNearby =vehiclePositionVos.getData();
 
             if (!availableVehiclesNearby.isEmpty()) {
@@ -1268,6 +1314,10 @@
         XpOrderReassign entity = new XpOrderReassign(data.getId(),data.getVehicleId(),data.getFleetId(),longitude,latitude,"接驾故障");
         entity.setIsComplete(false);
         entity.setAppUserId(Long.valueOf(uid));
+
+        // 根据城市编码获取 定向服务设置的车辆
+        List<String> targetedServiceVehicleVinList = xpTargetedServiceService.findSetVehicleVinByUserIdAndCityCode(data.getAppUserId(), data.getCityCode());
+
         //循环找车
         for (int i = 0; i < count; i++) {
             log.info("进入找车环节");
@@ -1352,10 +1402,20 @@
                 }
             }
 
+
             // 直接派单  定义一个锁来锁定车辆
             VehiclePosition vehiclePosition = positionList.get(0);
+            if(CollUtil.isNotEmpty(targetedServiceVehicleVinList)){//定向服务获取的车
+                for (VehiclePosition position : positionList) {
+                    if(targetedServiceVehicleVinList.contains(position.getVin())){
+                        vehiclePosition = position;
+                        break;
+                    }
+                }
+            }
             String vehicleVin = vehiclePosition.getVin();
 
+
             RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePosition.getVin());
             lock.lock(10, TimeUnit.SECONDS);
             try {

--
Gitblit v1.7.1