From 3896cbb9ed6fa03d90a4032238dad7b2f39c607c Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期二, 24 三月 2026 20:23:55 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java |  187 ++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 162 insertions(+), 25 deletions(-)

diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
index 80e2520..4c46e35 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -23,11 +23,13 @@
 import com.xiaopeng.api.feignClient.operation.XpCruisePlanClient;
 import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient;
 import com.xiaopeng.api.feignClient.order.XpOrderClient;
+import com.xiaopeng.api.feignClient.order.XpTestOrderClient;
 import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
 import com.xiaopeng.api.model.order.XpCruiseOrder;
 import com.xiaopeng.api.model.order.XpOrder;
+import com.xiaopeng.api.model.order.XpTestOrder;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.api.vo.OrderType;
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
@@ -115,6 +117,9 @@
     private XpTaskClient xpTaskClient;
     @Resource
     private VehicleBuriedPointClient vehicleBuriedPointClient;
+
+    @Resource
+    private XpTestOrderClient testOrderClient;
 
     private static final JsonFormat.Printer jsonPrinter = JsonFormat.printer()
             .printingEnumsAsInts()
@@ -269,7 +274,13 @@
                         String vin = jsonObject.getString("vin");
                         String orderType = jsonObject.getString("orderType");
                         PopOrderDto dto = new PopOrderDto();
-                        dto.setOrderId(Long.valueOf(orderId.contains("XU") ? orderId.substring(2) : orderId));
+                        if(orderId.contains("XU")){
+                            dto.setOrderId(Long.valueOf(orderId.substring(2)));
+                        }else if(orderId.contains("TEST")){
+                            dto.setOrderId(Long.valueOf(orderId.substring(4)));
+                        }else{
+                            dto.setOrderId(Long.valueOf(orderId));
+                        }
                         dto.setXpVehicleVin(vin);
                         dto.setOrderType(orderType);
                         xpOrderClient.popOrder(dto);
@@ -327,7 +338,9 @@
             if (order_id.contains("XU")) {
                 hasOrder = 1;
                 orderId = Long.parseLong(order_id.substring(2));
-            } else {
+            } else if(order_id.contains("TEST")) {
+                orderId = Long.parseLong(order_id.substring(4));
+            }else{
                 orderId = Long.parseLong(order_id);
             }
         }
@@ -361,7 +374,7 @@
                 mongoTemplate.updateFirst(new Query(Criteria.where("vin").is(vin)), update, VehiclePosition.class);
             }
             //调用推送服务接口
-            if (null != orderId && !order_id.contains("XU")) {
+            if (null != orderId && !order_id.contains("XU") && !order_id.contains("TEST")) {
                 RtTripInfo rtTripInfo = systemRuntimeStatus.getRtTripInfo();
                 PushOrderRouteDTO dto = new PushOrderRouteDTO();
                 dto.setOrderId(orderId);
@@ -454,6 +467,24 @@
             }
             //添加车辆异常任务和发送消息
             xpTaskClient.saveVehicleAccidentError(vehicle.getId());
+
+            // 封装埋点消息实体
+            VehicleEventDTO vehicleEventDTO = new VehicleEventDTO();
+            vehicleEventDTO.setVin(vehicle.getVehicleVin());
+            vehicleEventDTO.setXpuId("");
+            vehicleEventDTO.setOrderId("");
+            vehicleEventDTO.setEventKey("RT_web_vehicle_status_changed");
+            vehicleEventDTO.setEventTime(System.currentTimeMillis());
+            Map<String,Object> attributes = new HashMap<>();
+            attributes.put("vin",vehicle.getVehicleVin());
+            attributes.put("order_id","");
+            attributes.put("timestamp",vehicleEventDTO.getEventTime());
+            attributes.put("main_status","OFFLINE");
+            // TODO 预留位置 目前无状态
+            attributes.put("sub_status","");
+            attributes.put("prev_sub_status","");
+            vehicleEventDTO.setAttributes(attributes);
+            vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO);
         }
     }
 
@@ -650,7 +681,73 @@
 
                 vehicleId = xpCruiseOrder.getVehicleId();
             }
-        } else {
+        } else if(orderId.contains("TEST")){
+            orderType = OrderType.TEST_ORDER;
+            //正常单
+            R<XpTestOrder> xpOrderR = testOrderClient.queryOrderById(Long.parseLong(orderId.substring(4)));
+            if (200 != xpOrderR.getCode()) {
+                throw new RuntimeException("订单不存在 " + orderId);
+            }
+            XpTestOrder xpOrder = xpOrderR.getData();
+            XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
+            //驶往上车点的行程
+            if (orderPhase.equals(OrderPhase.ROUTE_TO_PICKUP)) {
+                //查询车辆位置
+                VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
+                if (Objects.isNull(vehiclePosition)) {
+                    throw new RuntimeException("车辆位置信息不存在");
+                }
+                //查询司机当前位置到起点的线路
+                origin.setLongitude(vehiclePosition.getPoint().getX());
+                origin.setLatitude(vehiclePosition.getPoint().getY());
+                destination.setLongitude(xpOrder.getStartLon());
+                destination.setLatitude(xpOrder.getStartLat());
+
+                OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
+                dto.setOrderId(Long.parseLong(orderId));
+                dto.setOrigin(origin);
+                dto.setDestination(destination);
+                dto.setRouteType(1);
+                R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
+                if (200 != routeVoR.getCode()) {
+                    throw new RuntimeException("获取订单线路和运费失败");
+                }
+                RouteVo routeVo = routeVoR.getData();
+                routeID = routeVo.getRouteID();
+                //缓存数据,用于后续推给乘客导航线路
+                redisService.setCacheObject("TEST_ORDER_NAVIGATION_START_DATA:" + xpOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+            }
+            //驶往下车点的行程
+            if (orderPhase.equals(OrderPhase.ROUTE_TO_DESTINATION)) {
+                //直接取缓存中的导航数据推送给车端和乘客
+                Object cacheObject = redisService.getCacheObject("TEST_ORDER_NAVIGATION_END_DATA:" + xpOrder.getVehicleId());
+                if(null == cacheObject){
+                    //没有缓存数据,重新规划线路
+                    //查询起点到终点的线路
+                    origin.setLongitude(xpOrder.getStartLon());
+                    origin.setLatitude(xpOrder.getStartLat());
+                    destination.setLongitude(xpOrder.getEndLon());
+                    destination.setLatitude(xpOrder.getEndLat());
+                    OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
+                    dto.setOrderId(Long.parseLong(orderId));
+                    dto.setOrigin(origin);
+                    dto.setDestination(destination);
+                    dto.setRouteType(2);
+                    R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
+                    if (200 != routeVoR.getCode()) {
+                        throw new RuntimeException("获取订单线路和运费失败");
+                    }
+                    RouteVo routeVo = routeVoR.getData();
+                    routeID = routeVo.getRouteID();
+                    //缓存导航数据,用于后面的逻辑中给乘客端推送导航数据
+                    redisService.setCacheObject("TEST_ORDER_NAVIGATION_END_DATA:" + xpOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+                }else{
+                    RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class);
+                    routeID = routeVo.getRouteID();
+                }
+            }
+            vehicleId = xpOrder.getVehicleId();
+        }else{
             orderType = OrderType.USER_ORDER;
             //正常单
             R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.parseLong(orderId));
@@ -818,8 +915,12 @@
                 case ORDER_RECEIVED:
                     //收到订单
                     if(!orderId.contains("XU")){
-                        buildPushOrderStatus(orderId, OrderStatusEnum.READY_DEPART, sequence);
-                        xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.READY_DEPART.getCode());
+                        if(orderId.contains("TEST")){
+                            testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), OrderStatusEnum.READY_DEPART.getCode());
+                        }else{
+                            buildPushOrderStatus(orderId, OrderStatusEnum.READY_DEPART, sequence);
+                            xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.READY_DEPART.getCode());
+                        }
                     }
                     break;
                 case ORDER_STARTED:
@@ -829,8 +930,12 @@
                 case ORDER_EN_ROUTE_TO_PICKUP:
                     //前往上车点
                     if(!orderId.contains("XU")){
-                        buildPushOrderStatus(orderId, OrderStatusEnum.PICK_UP, sequence);
-                        xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.PICK_UP.getCode());
+                        if(orderId.contains("TEST")){
+                            testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), OrderStatusEnum.PICK_UP.getCode());
+                        }else{
+                            buildPushOrderStatus(orderId, OrderStatusEnum.PICK_UP, sequence);
+                            xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.PICK_UP.getCode());
+                        }
                     }
                     break;
                 case ORDER_ARRIVED_AT_PICKUP:
@@ -840,22 +945,34 @@
                 case ORDER_WAITING_FOR_PICKUP:
                     //等待乘客上车
                     if(!orderId.contains("XU")){
-                        buildPushOrderStatus(orderId, OrderStatusEnum.PICK_UP_GUESTS, sequence);
-                        xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.PICK_UP_GUESTS.getCode());
+                        if(orderId.contains("TEST")){
+                            testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), OrderStatusEnum.PICK_UP_GUESTS.getCode());
+                        }else{
+                            buildPushOrderStatus(orderId, OrderStatusEnum.PICK_UP_GUESTS, sequence);
+                            xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.PICK_UP_GUESTS.getCode());
+                        }
                     }
                     break;
                 case ORDER_PASSENGER_ONBOARD:
                     //乘客已上车
                     if(!orderId.contains("XU")){
-                        buildPushOrderStatus(orderId, OrderStatusEnum.PASSENGER_BOARDED, sequence);
-                        xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.PASSENGER_BOARDED.getCode());
+                        if(orderId.contains("TEST")){
+                            testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), OrderStatusEnum.PASSENGER_BOARDED.getCode());
+                        }else{
+                            buildPushOrderStatus(orderId, OrderStatusEnum.PASSENGER_BOARDED, sequence);
+                            xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.PASSENGER_BOARDED.getCode());
+                        }
                     }
                     break;
                 case ORDER_EN_ROUTE_TO_DESTINATION:
                     //前往目的地
                     if(!orderId.contains("XU")){
-                        buildPushOrderStatus(orderId, OrderStatusEnum.IN_SERVICE, sequence);
-                        xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.IN_SERVICE.getCode());
+                        if(orderId.contains("TEST")){
+                            testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), OrderStatusEnum.IN_SERVICE.getCode());
+                        }else{
+                            buildPushOrderStatus(orderId, OrderStatusEnum.IN_SERVICE, sequence);
+                            xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.IN_SERVICE.getCode());
+                        }
                     }
                     break;
                 case ORDER_ARRIVED_AT_DESTINATION:
@@ -865,8 +982,12 @@
                 case ORDER_WAITING_FOR_DROPOFF:
                     //等待乘客下车,开始倒计时发下巡游单
                     if(!orderId.contains("XU")){
-                        buildPushOrderStatus(orderId, OrderStatusEnum.SEE_OFF_GUESTS, sequence);
-                        xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
+                        if(orderId.contains("TEST")){
+                            testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
+                        }else{
+                            buildPushOrderStatus(orderId, OrderStatusEnum.SEE_OFF_GUESTS, sequence);
+                            xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
+                        }
                     }
                     break;
                 case ORDER_DROPOFF_COMPLETED:
@@ -917,17 +1038,30 @@
                 case ORDER_CANCELLED:
                     //已取消
                     if(!orderId.contains("XU")){
-                        //判断订单状态,已经取消的不作处理
-                        Object cacheObject = redisService.getCacheObject("ORDER_STATUS:" + orderId);
-                        if(null != cacheObject){
-                            int order_status = Integer.parseInt(cacheObject.toString());
-                            if(0 == order_status){
-                                return;
+                        if(orderId.contains("TEST")){
+                            //判断订单状态,已经取消的不作处理
+                            Object cacheObject = redisService.getCacheObject("ORDER_STATUS:" + orderId.substring(4));
+                            if(null != cacheObject){
+                                int order_status = Integer.parseInt(cacheObject.toString());
+                                if(0 == order_status){
+                                    return;
+                                }
                             }
+                            //行程中取消订单,按照行程结束处理
+                            testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
+                        }else{
+                            //判断订单状态,已经取消的不作处理
+                            Object cacheObject = redisService.getCacheObject("ORDER_STATUS:" + orderId);
+                            if(null != cacheObject){
+                                int order_status = Integer.parseInt(cacheObject.toString());
+                                if(0 == order_status){
+                                    return;
+                                }
+                            }
+                            //行程中取消订单,按照行程结束处理
+                            buildPushOrderStatus(orderId, OrderStatusEnum.SEE_OFF_GUESTS, sequence);
+                            xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
                         }
-                        //行程中取消订单,按照行程结束处理
-                        buildPushOrderStatus(orderId, OrderStatusEnum.SEE_OFF_GUESTS, sequence);
-                        xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
                     }
                     break;
                 case ORDER_ARRIVED_AT_CRUISE_DESTINATION:
@@ -966,6 +1100,9 @@
                                 log.info("到达巡游终点,推送埋点:{}", orderId);
                             }
                         }
+                    }else if(orderId.contains("TEST")){
+                        //测试巡游单处理逻辑
+                        testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), OrderStatusEnum.COMPLETED.getCode());
                     }
                     break;
                 case ORDER_PAUSED:

--
Gitblit v1.7.1