From c98d3f2fc620b3f5d699e2be34eaabc1033b42b2 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 11 三月 2026 16:17:32 +0800
Subject: [PATCH] 修改巡游订单部分逻辑

---
 xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java |  122 +++++++++++++++++++++++-----------------
 1 files changed, 71 insertions(+), 51 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 6602ed1..1267084 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
@@ -1,6 +1,6 @@
 package com.xiaopeng.automaticPilot.service;
 
-import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.lang.Snowflake;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.google.protobuf.InvalidProtocolBufferException;
@@ -14,6 +14,10 @@
 import com.xiaopeng.api.dto.order.PopOrderDto;
 import com.xiaopeng.api.dto.pushMessage.PushOrderRouteDTO;
 import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
+import com.xiaopeng.api.feignClient.account.XpOperationUserClient;
+import com.xiaopeng.api.feignClient.account.XpOperationUserNotificationClient;
+import com.xiaopeng.api.feignClient.maintenance.XpTaskClient;
+import com.xiaopeng.api.feignClient.maintenance.XpTaskRuleClient;
 import com.xiaopeng.api.feignClient.map.XpMapClient;
 import com.xiaopeng.api.feignClient.operation.ReassignOrderClient;
 import com.xiaopeng.api.feignClient.operation.XpCruisePlanClient;
@@ -21,13 +25,13 @@
 import com.xiaopeng.api.feignClient.order.XpOrderClient;
 import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetVehicleClient;
 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.vehicleConvoy.XpFleet;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.api.vo.OrderType;
-import com.xiaopeng.api.vo.SystemEventType;
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
 import com.xiaopeng.api.vo.automaticPilot.protobuf.*;
 import com.xiaopeng.api.vo.operation.RouteVo;
@@ -37,18 +41,17 @@
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.enums.OrderStatusEnum;
 import com.xiaopeng.common.core.enums.PushMessageTypeEnum;
-import com.xiaopeng.common.core.utils.SnowFlake;
 import com.xiaopeng.common.core.utils.StringUtils;
 import com.xiaopeng.common.core.utils.uuid.UUID;
 import com.xiaopeng.common.redis.service.RedisService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.geo.Point;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.data.mongodb.core.query.Update;
-import org.springframework.data.mongodb.core.query.UpdateDefinition;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
@@ -100,6 +103,15 @@
 
     @Resource
     private XpCruisePlanClient xpCruisePlanClient;
+
+    @Resource
+    private Snowflake snowflake;
+
+    @Value("${robotaxi.appId:xp_robotaxi_api}")
+    private String appid;
+
+    @Resource
+    private XpTaskClient xpTaskClient;
 
     private static final com.google.protobuf.util.JsonFormat.Printer jsonPrinter = com.google.protobuf.util.JsonFormat.printer()
             .printingEnumsAsInts()
@@ -377,35 +389,52 @@
         int value = gearLevel.getNumber();
         redisService.setCacheObject(CacheConstants.GEAR_LEVEL + systemRuntimeStatus.getVehicleStatus().getStaticInfo().getXpuId(), value);
         // 判断是否为故障状态
+        XpVehicle vehicle = null;
         if (abnormalReason == AbnormalReason.FAULT) {
             log.info("车辆故障,开始处理故障");
-            // TODO 添加异常任务
-            // 解绑用户与车辆关系
-            CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo();
             String orderId = systemRuntimeStatus.getRunningOrderStatusInfo().getOrderId();
-            XpOrder xpOrder = xpOrderClient.queryOrderById(Long.parseLong(orderId)).getData();
-            XpVehicle vehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
-            if (vehicle != null) {
-                // 修改车辆状态
-                vehicle.setOperatingStatus(4);
-                xpVehicleClient.updateVehicleById(vehicle);
-                cancelTaxiPassengerVo.setVin(vehicle.getVehicleVin());
-                cancelTaxiPassengerVo.setUid(xpOrder.getAppUserId().toString());
-                cancelTaxiPassengerVo.setOrderNo(xpOrder.getOrderNumber());
-                userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
+            if(!orderId.contains("XU")){
+                //巡游订单,需要关闭订单
+                xpCruiseOrderClient.updateCruiseOrderId(Long.parseLong(orderId.substring(2)));
+                XpCruiseOrder cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2))).getData();
+                vehicle = xpVehicleClient.queryById(cruiseOrder.getVehicleId()).getData();
+                if (vehicle != null) {
+                    // 修改车辆状态
+                    vehicle.setOperatingStatus(4);
+                    xpVehicleClient.updateVehicleById(vehicle);
+                }
+            }else{
+                //正常订单
+                XpOrder xpOrder = xpOrderClient.queryOrderById(Long.parseLong(orderId)).getData();
+                vehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
+                if (vehicle != null) {
+                    // 修改车辆状态
+                    vehicle.setState(0);
+                    vehicle.setOperatingStatus(4);
+                    xpVehicleClient.updateVehicleById(vehicle);
+                    // 解绑用户与车辆关系
+                    CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo();
+                    cancelTaxiPassengerVo.setVin(vehicle.getVehicleVin());
+                    cancelTaxiPassengerVo.setUid(xpOrder.getAppUserId().toString());
+                    cancelTaxiPassengerVo.setOrderNo(xpOrder.getOrderNumber());
+                    cancelTaxiPassengerVo.setAppId(appid);
+                    userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
+                }
+                // TODO 重新派单
+                ReassignOrderDTO reassignOrderDTO = new ReassignOrderDTO();
+                reassignOrderDTO.setUid(xpOrder.getAppUserId().toString());
+                reassignOrderDTO.setOrderNo(xpOrder.getOrderNumber());
+                reassignOrderDTO.setCount(10);
+                RealtimePose pose = systemRuntimeStatus.getPose();
+                Wgs naviPose = pose.getNaviPose();
+                Double latitude = naviPose.getLatitude();
+                Double longitude = naviPose.getLongitude();
+                reassignOrderDTO.setLongitude(longitude);
+                reassignOrderDTO.setLatitude(latitude);
+                reassignOrderClient.reassignOrder(reassignOrderDTO);
             }
-            // TODO 重新派单
-            ReassignOrderDTO reassignOrderDTO = new ReassignOrderDTO();
-            reassignOrderDTO.setUid(xpOrder.getAppUserId().toString());
-            reassignOrderDTO.setOrderNo(xpOrder.getOrderNumber());
-            reassignOrderDTO.setCount(10);
-            RealtimePose pose = systemRuntimeStatus.getPose();
-            Wgs naviPose = pose.getNaviPose();
-            Double latitude = naviPose.getLatitude();
-            Double longitude = naviPose.getLongitude();
-            reassignOrderDTO.setLongitude(longitude);
-            reassignOrderDTO.setLatitude(latitude);
-            reassignOrderClient.reassignOrder(reassignOrderDTO);
+            //添加车辆异常任务和发送消息
+            xpTaskClient.saveVehicleAccidentError(vehicle.getId());
         }
     }
 
@@ -475,7 +504,7 @@
             if (orderId.contains("XU")) {
 //                orderType = OrderType.CRUISE_ORDER;
 
-                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(orderId);
+                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2)));
                 XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
 
                 //先响应消息
@@ -591,7 +620,7 @@
             //巡游单
             if (orderPhase.equals(OrderPhase.ROUTE_TO_CRUISE)) {
                 /* 构建导航数据给到车端 */
-                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(orderId);
+                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2)));
                 XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
 
                 origin.setLongitude(xpCruiseOrder.getStartLon());
@@ -738,9 +767,7 @@
 
         }
         orderOperationBuilder.addAllWaypoints(waypoints);
-        SnowFlake snowFlake = new SnowFlake(0, 0);
-        snowFlake.withStartTimestamp(1420041600000L);
-        long sequence = snowFlake.nextId();
+        long sequence = snowflake.nextId();
         // 处理数据
         redisService.setCacheObject(sequence + "","pushOrder_"+orderId+"_"+vin,30L, TimeUnit.MINUTES);
         //开发发送请求到XPU
@@ -892,7 +919,7 @@
 
                 // 返程找到目前的订单 -》之前的订单 查询生成一个   正常巡游 找到下一个点位   若到达最后点位  则反向找点位  每次判断是否收车状态 是则不进行处理了
                 // 找到这个订单
-                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(orderId);
+                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2)));
                 if(cruiseOrder!=null){
                     XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
                     Long vehicleId = xpCruiseOrder.getVehicleId();
@@ -909,13 +936,13 @@
                             XpCruiseOrder lastXpCruiseOrder = lastOrder.getData();
 
                             // 修改一下id 加一个一样的巡游单子
-                            lastXpCruiseOrder.setId("XU"+ IdUtil.fastUUID());
+                            lastXpCruiseOrder.setId(null);
                             lastXpCruiseOrder.setStatus(1);
                             xpCruiseOrderClient.addCruiseOrder(lastXpCruiseOrder);
                             //构建下发XPU订单报文数据
                             RtTask.Builder taskBuilder = RtTask.newBuilder();
-                            taskBuilder.setOrderId(lastXpCruiseOrder.getId());
-                            taskBuilder.setTaskId("MISSION_"+ IdUtil.fastUUID());
+                            taskBuilder.setOrderId("XU" + lastXpCruiseOrder.getId());
+                            taskBuilder.setTaskId(snowflake.nextId() + "");
                             taskBuilder.setTaskType(com.xiaopeng.api.vo.automaticPilot.protobuf.OrderType.ORDER_TYPE_CRUISE);
                             //构建点位信息
                             Waypoint.Builder pointBuilder = Waypoint.newBuilder();
@@ -932,9 +959,7 @@
                             RtTask task = taskBuilder.build();
                             RtTaskList taskList = RtTaskList.newBuilder().addTasks(task).build();
 
-                            SnowFlake snowFlake = new SnowFlake(0, 0);
-                            snowFlake.withStartTimestamp(1420041600000L);
-                            long sequence1 = snowFlake.nextId();
+                            long sequence1 = snowflake.nextId();
                             xpuUtil.cloudCreateOrder(taskList, xpVehicle.getVehicleVin(),sequence1);
                         }else if(xpCruiseOrder.getOrderType()==1){
                            // 正常巡游 找到下一个点位   若到达最后点位  则反向找点位
@@ -942,7 +967,6 @@
                             Double endLon = xpCruiseOrder.getEndLon();
                             Double endLat = xpCruiseOrder.getEndLat();
                             XpCruiseOrder newXpCruiseOrder = new XpCruiseOrder();
-                            newXpCruiseOrder.setId("XU"+ IdUtil.fastUUID());
                             newXpCruiseOrder.setVehicleId(xpCruiseOrder.getVehicleId());
                             newXpCruiseOrder.setVehicleVin(xpCruiseOrder.getVehicleVin());
                             newXpCruiseOrder.setFleetId(xpCruiseOrder.getFleetId());
@@ -966,8 +990,8 @@
                                 xpCruiseOrderClient.addCruiseOrder(cruisePoint.getData());
                                 RtTask.Builder taskBuilder = RtTask.newBuilder();
 
-                                taskBuilder.setOrderId(newXpCruiseOrder.getId());
-                                taskBuilder.setTaskId("MISSION_"+ IdUtil.fastUUID());
+                                taskBuilder.setOrderId("XU" + newXpCruiseOrder.getId());
+                                taskBuilder.setTaskId(snowflake.nextId() + "");
                                 taskBuilder.setTaskType(com.xiaopeng.api.vo.automaticPilot.protobuf.OrderType.ORDER_TYPE_CRUISE);
 
                                 //构建点位信息
@@ -985,9 +1009,7 @@
                                 RtTaskList.Builder taskListBuilder = RtTaskList.newBuilder();
                                 taskListBuilder.addTasks(taskBuilder.build());
 
-                                SnowFlake snowFlake = new SnowFlake(0, 0);
-                                snowFlake.withStartTimestamp(1420041600000L);
-                                long sequence1 = snowFlake.nextId();
+                                long sequence1 = snowflake.nextId();
                                 xpuUtil.cloudCreateOrder(taskListBuilder.build(), xpVehicle.getVehicleVin(),sequence1);
                             }
                         }
@@ -1038,9 +1060,7 @@
         navigationDataBuilder.setRequestId(requestId);
         navigationDataBuilder.setContent(routeDataContent);
         navigationDataBuilder.setTimestamp(System.currentTimeMillis());
-        SnowFlake snowFlake = new SnowFlake(0, 0);
-        snowFlake.withStartTimestamp(1420041600000L);
-        long sequence = snowFlake.nextId();
+        long sequence = snowflake.nextId();
         log.info("开始推送导航数据 {}", orderId);
         MqttPublishDto mqttPublishDto = xpuUtil.cloudPushNavigation(navigationDataBuilder.build(), xpuId, sequence);
         log.info("推送导航的响应消息,{}", JSON.toJSONString(mqttPublishDto));

--
Gitblit v1.7.1