From 8712e98a272ef5d1db34abfc8387bbaf04953df8 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 13 二月 2026 00:23:00 +0800
Subject: [PATCH] 合并代码

---
 xp-robotaxi-automaticPilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java |  272 ++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 242 insertions(+), 30 deletions(-)

diff --git a/xp-robotaxi-automaticPilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java b/xp-robotaxi-automaticPilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
index eb3c28b..1f46d8e 100644
--- a/xp-robotaxi-automaticPilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
+++ b/xp-robotaxi-automaticPilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -2,8 +2,8 @@
 
 import cn.hutool.core.lang.Snowflake;
 import cn.hutool.core.util.IdUtil;
-import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
 import com.xiaopeng.api.dto.operation.LonLatDto;
 import com.xiaopeng.api.dto.pushMessage.PushOrderRouteDTO;
@@ -16,17 +16,25 @@
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
 import com.xiaopeng.api.vo.automaticPilot.proto.down.GeoPoint;
+import com.xiaopeng.api.vo.automaticPilot.proto.down.ResponseMessage;
+import com.xiaopeng.api.vo.automaticPilot.proto.down.StatusCode;
 import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudOrderOperation.*;
 import com.xiaopeng.api.vo.automaticPilot.proto.up.MessageType;
 import com.xiaopeng.api.vo.automaticPilot.proto.up.MsgContent;
 import com.xiaopeng.api.vo.automaticPilot.proto.up.RTCmdType;
 import com.xiaopeng.api.vo.automaticPilot.proto.up.RtMsgHeader;
+import com.xiaopeng.api.vo.automaticPilot.proto.up.navigationDeviationEvent.NavigationDeviationEvent;
+import com.xiaopeng.api.vo.automaticPilot.proto.up.navigationDeviationEvent.NavigationDeviationMessage;
+import com.xiaopeng.api.vo.automaticPilot.proto.up.navigationDeviationEvent.RtEventType;
+import com.xiaopeng.api.vo.automaticPilot.proto.up.orderStateUpdateEvent.OrderStatusInfoEvent;
 import com.xiaopeng.api.vo.automaticPilot.proto.up.systemStatusXpu.*;
 import com.xiaopeng.api.vo.automaticPilot.proto.up.xpuNavigationRequest.NavigationRequest;
 import com.xiaopeng.api.vo.automaticPilot.proto.up.xpuNavigationRequest.OrderPhase;
 import com.xiaopeng.api.vo.operation.RouteVo;
 import com.xiaopeng.automaticPilot.util.XPUUtil;
 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.StringUtils;
 import com.xiaopeng.common.core.utils.uuid.UUID;
 import com.xiaopeng.common.redis.service.RedisService;
@@ -40,9 +48,7 @@
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * Kafka 消费者服务
@@ -88,6 +94,7 @@
             switch (cmd) {
                 case SYSTEM_STATUS_XPU:
                     log.info("XPU发布系统运行状态 (XPU→云端):{}", message);
+                    systemStatusXpu(msgContent);
                     break;
                 case XPU_NAVIGATION_REQUEST:
                     log.info("XPU向云端请求导航 (XPU→云端):{}", message);
@@ -110,6 +117,7 @@
                     break;
                 case ORDER_STATE_UPDATE_EVENT:
                     log.info("订单状态变化(XPU→云端)(XPU→座舱):{}", message);
+                    orderStateUpdateEvent(msgContent);
                     break;
                 case POINT_ARRIVAL_STATUS_EVENT:
                     log.info("到达目标点状态(XPU→云端)(XPU→座舱):{}", message);
@@ -122,6 +130,7 @@
                     break;
                 case NAVIGATION_DEVIATION_EVENT:
                     log.info("导航偏航(XPU→云端):{}", message);
+                    navigationDeviationEvent(msgContent);
                     break;
                 case EMERGENCY_STOP_EVENT:
                     log.info("急停(XPU→云端)(XPU→座舱):{}", message);
@@ -141,7 +150,6 @@
                 default:
                     log.info("消息不在处理范围内,忽略:{}", message);
             }
-
 
 
         }
@@ -185,6 +193,7 @@
                     break;
                 case ORDER_STATE_UPDATE_EVENT:
                     log.info("订单状态变化(XPU→云端)(XPU→座舱):{}", message);
+                    orderStateUpdateEvent(msgContent);
                     break;
                 case POINT_ARRIVAL_STATUS_EVENT:
                     log.info("到达目标点状态(XPU→云端)(XPU→座舱):{}", message);
@@ -197,6 +206,7 @@
                     break;
                 case NAVIGATION_DEVIATION_EVENT:
                     log.info("导航偏航(XPU→云端):{}", message);
+                    navigationDeviationEvent(msgContent);
                     break;
                 case EMERGENCY_STOP_EVENT:
                     log.info("急停(XPU→云端)(XPU→座舱):{}", message);
@@ -225,9 +235,14 @@
 
     /**
      * XPU发布系统运行状态---车辆实时位置
+     *
      * @param msgContent
      */
-    public void systemStatusXpu(MsgContent msgContent){
+    public void systemStatusXpu(MsgContent msgContent) {
+        //先响应消息
+        Long sequence = msgContent.getHeader().getSequence();
+        responseMessage(sequence);
+        //开始处理消息对应的业务逻辑
         SystemRuntimeStatus systemRuntimeStatus = msgContent.getContent_detail().getObject("systemRuntimeStatus", SystemRuntimeStatus.class);
         //获取实时位姿
         RealtimePose pose = systemRuntimeStatus.getPose();
@@ -243,7 +258,7 @@
 
         //保存车辆实时信息到mongodb
         VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
-        if(null == vehiclePosition){
+        if (null == vehiclePosition) {
             vehiclePosition = new VehiclePosition();
         }
         vehiclePosition.setVin(vin);
@@ -260,18 +275,18 @@
         Long orderId = null;
         String order_id = runningOrderStatusInfo.getOrder_id();
         vehiclePosition.setHasOrder(0);
-        if(StringUtils.isNotEmpty(order_id)){
-            if(order_id.contains("XU")){
+        if (StringUtils.isNotEmpty(order_id)) {
+            if (order_id.contains("XU")) {
                 vehiclePosition.setHasOrder(1);
                 orderId = Long.parseLong(order_id.substring(2));
-            }else{
+            } else {
                 orderId = Long.parseLong(order_id);
             }
         }
         vehiclePosition.setOrderId(orderId);
         mongoTemplate.save(vehiclePosition);
         //调用推送服务接口
-        if(null != orderId){
+        if (null != orderId) {
             RtTripInfo rtTripInfo = systemRuntimeStatus.getRt_trip_info();
             PushOrderRouteDTO dto = new PushOrderRouteDTO();
             dto.setOrderId(orderId);
@@ -285,21 +300,23 @@
     }
 
 
-
-
-
     /**
      * XPU向云端请求导航
+     *
      * @param msgContent
      */
-    public void xpuNavigationRequest(MsgContent msgContent){
+    public void xpuNavigationRequest(MsgContent msgContent) {
+        //先响应消息
+        Long sequence = msgContent.getHeader().getSequence();
+        responseMessage(sequence);
+        //开始处理消息对应的业务逻辑
         NavigationRequest naviRequest = msgContent.getContent_detail().getObject("naviRequest", NavigationRequest.class);
         String orderId = naviRequest.getOrder_id();
         String taskId = naviRequest.getTask_id();
         OrderPhase orderPhase = naviRequest.getOrder_phase();
         log.info("订单ID:{}", orderId);
         log.info("任务ID:{}", taskId);
-        switch (orderPhase){
+        switch (orderPhase) {
             case IDLE:
                 log.info("订单的任务未开始执行");
                 break;
@@ -309,47 +326,119 @@
                 break;
             case ROUTE_TO_DESTINATION:
                 log.info("驶往下车点的行程");
+                buildNaviRequest(orderId, taskId, orderPhase);
                 break;
             case ROUTE_TO_CRUISE:
                 log.info("巡游阶段路线");
+                buildNaviRequest(orderId, taskId, orderPhase);
                 break;
         }
     }
 
 
     /**
+     * 车辆偏航后重新规划线路
+     *
+     * @param msgContent
+     */
+    public void navigationDeviationEvent(MsgContent msgContent) {
+        //先响应消息
+        Long sequence = msgContent.getHeader().getSequence();
+        responseMessage(sequence);
+        //开始处理消息对应的业务逻辑
+        NavigationDeviationEvent deviationEvent = msgContent.getContent_detail().getObject("deviationEvent", NavigationDeviationEvent.class);
+        //偏航事件类型 1:请求导航,2:取消导航
+        if (deviationEvent.getEvent_type().equals(RtEventType.RT_EVENT_TYPE_REQUEST)) {
+            NavigationDeviationMessage navigationDeviationMessage = deviationEvent.getNavigation_deviation_message();
+            String orderId = navigationDeviationMessage.getOrder_id();
+            String taskId = navigationDeviationMessage.getTask_id();
+            Double longitude = navigationDeviationMessage.getLongitude();
+            Double latitude = navigationDeviationMessage.getLatitude();
+            //订单类型  1:乘客订单,2=巡游订单
+            Integer orderType = 1;
+            LonLatDto destination = new LonLatDto();
+            LonLatDto origin = new LonLatDto();
+            if (orderId.contains("XU")) {
+                orderType = 2;
+                // todo 下发巡游单的导航数据
+                //巡游单
+                origin.setLongitude(longitude);
+                origin.setLatitude(latitude);
+                destination.setLongitude(116.40528);
+                destination.setLatitude(39.90498);
+            } else {
+                //正常单
+                R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.parseLong(orderId));
+                if (200 != xpOrderR.getCode()) {
+                    throw new RuntimeException("订单不存在");
+                }
+                XpOrder xpOrder = xpOrderR.getData();
+                //驶往上车点的行程
+                if (Arrays.asList(3).contains(xpOrder.getStatus())) {
+                    //查询司机当前位置到起点的线路
+                    origin.setLongitude(longitude);
+                    origin.setLatitude(latitude);
+                    destination.setLongitude(xpOrder.getStartLon());
+                    destination.setLatitude(xpOrder.getStartLat());
+                }
+                //驶往下车点的行程
+                if (Arrays.asList(6).contains(xpOrder.getStatus())) {
+                    //查询起点到终点的线路
+                    origin.setLongitude(longitude);
+                    origin.setLatitude(latitude);
+                    destination.setLongitude(xpOrder.getEndLon());
+                    destination.setLatitude(xpOrder.getEndLat());
+                }
+                OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
+                dto.setOrderId(Long.parseLong(orderId));
+                dto.setOrigin(origin);
+                dto.setDestination(destination);
+                R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
+                if (200 != routeVoR.getCode()) {
+                    throw new RuntimeException("获取订单线路和运费失败");
+                }
+                RouteVo routeVo = routeVoR.getData();
+                //构建导航下发请求对象
+                cloudOrderOperation(orderType, orderId, taskId, routeVo);
+            }
+        }
+    }
+
+
+    /**
      * 构建导航请求
+     *
      * @param orderId
      * @param taskId
      * @param orderPhase
      */
-    public void buildNaviRequest(String orderId, String taskId, OrderPhase orderPhase){
+    public void buildNaviRequest(String orderId, String taskId, OrderPhase orderPhase) {
         //订单类型  1:乘客订单,2=巡游订单
         Integer orderType = 1;
         LonLatDto destination = new LonLatDto();
         LonLatDto origin = new LonLatDto();
-        if(orderId.contains("XU")){
+        if (orderId.contains("XU")) {
             orderType = 2;
             // todo 下发巡游单的导航数据
             //巡游单
-            if(orderPhase.equals(OrderPhase.ROUTE_TO_CRUISE)){
+            if (orderPhase.equals(OrderPhase.ROUTE_TO_CRUISE)) {
                 origin.setLongitude(116.40528);
                 origin.setLatitude(39.90498);
                 destination.setLongitude(116.40528);
                 destination.setLatitude(39.90498);
             }
-        }else{
+        } else {
             //正常单
             R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.parseLong(orderId));
-            if(200 != xpOrderR.getCode()){
+            if (200 != xpOrderR.getCode()) {
                 throw new RuntimeException("订单不存在");
             }
             XpOrder xpOrder = xpOrderR.getData();
             //驶往上车点的行程
-            if(orderPhase.equals(OrderPhase.ROUTE_TO_PICKUP)){
+            if (orderPhase.equals(OrderPhase.ROUTE_TO_PICKUP)) {
                 XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
                 VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
-                if(Objects.isNull(vehiclePosition)){
+                if (Objects.isNull(vehiclePosition)) {
                     throw new RuntimeException("车辆位置信息不存在");
                 }
                 //查询司机当前位置到起点的线路
@@ -359,7 +448,7 @@
                 destination.setLatitude(xpOrder.getStartLat());
             }
             //驶往下车点的行程
-            if(orderPhase.equals(OrderPhase.ROUTE_TO_DESTINATION)){
+            if (orderPhase.equals(OrderPhase.ROUTE_TO_DESTINATION)) {
                 //查询起点到终点的线路
                 origin.setLongitude(xpOrder.getStartLon());
                 origin.setLatitude(xpOrder.getStartLat());
@@ -371,7 +460,7 @@
             dto.setOrigin(origin);
             dto.setDestination(destination);
             R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
-            if(200 != routeVoR.getCode()){
+            if (200 != routeVoR.getCode()) {
                 throw new RuntimeException("获取订单线路和运费失败");
             }
             RouteVo routeVo = routeVoR.getData();
@@ -383,9 +472,10 @@
 
     /**
      * 云端订单操作----下发导航数据
+     *
      * @param routeVo
      */
-    public void cloudOrderOperation(Integer orderType, String orderId, String taskId, RouteVo routeVo){
+    public void cloudOrderOperation(Integer orderType, String orderId, String taskId, RouteVo routeVo) {
         //构建消息体
         OrderOperation orderOperation = new OrderOperation();
         orderOperation.setOrder_id(orderId);
@@ -399,14 +489,14 @@
             LonLatDto lonLatDto = polyline.get(i);
             Waypoint waypoint = new Waypoint();
             waypoint.setWaypoint_id(UUID.randomUUID().toString());
-            if(0 == i){
+            if (0 == i) {
                 waypoint.setPoint_type(PointType.START_POINT);
                 //订单类型不同,点位的动作类型不同
                 waypoint.setAction_type(1 == orderType ? ActionType.PICK_UP : ActionType.ACTION_UNSPECIFIED);
-            }else if(polyline.size() - 1 == i){
+            } else if (polyline.size() - 1 == i) {
                 waypoint.setPoint_type(PointType.END_POINT);
                 waypoint.setAction_type(1 == orderType ? ActionType.DROP_OFF : ActionType.ACTION_UNSPECIFIED);
-            }else{
+            } else {
                 waypoint.setPoint_type(PointType.WAY_POINT);
                 //订单类型不同,点位的动作类型不同
                 waypoint.setAction_type(ActionType.ACTION_UNSPECIFIED);
@@ -425,10 +515,132 @@
     }
 
 
-    public void c(MsgContent msgContent){
+    /**
+     * 构建响应消息
+     */
+    public void responseMessage(Long request_seq) {
+        ResponseMessage responseMessage = new ResponseMessage();
+        responseMessage.setRequest_seq(request_seq);
+        responseMessage.setCode(StatusCode.OK);
+        responseMessage.setTimestamp(System.currentTimeMillis());
+        xpuUtil.responseMessage(responseMessage);
+    }
 
 
+    /**
+     * 订单状态更新事件
+     * @param msgContent
+     */
+    public void orderStateUpdateEvent(MsgContent msgContent) {
+        //先响应消息
+        Long sequence = msgContent.getHeader().getSequence();
+        responseMessage(sequence);
+        //开始处理消息对应的业务逻辑
+        OrderStatusInfoEvent orderStatusInfoEvent = msgContent.getContent_detail().getObject("orderStatusInfoEvent", OrderStatusInfoEvent.class);
+        //只处理请求消息
+        if (orderStatusInfoEvent.getEvent_type().equals(RtEventType.RT_EVENT_TYPE_REQUEST)) {
+            com.xiaopeng.api.vo.automaticPilot.proto.up.orderStateUpdateEvent.OrderStatusInfo orderStatusInfo = orderStatusInfoEvent.getOrder_status_info();
+            String orderId = orderStatusInfo.getOrder_id();
+            //普通单
+            com.xiaopeng.api.vo.automaticPilot.proto.up.orderStateUpdateEvent.OrderStatus status = orderStatusInfo.getStatus();
+            switch (status) {
+                case ORDER_STATUS_UNSPECIFIED:
+                    //订单状态未知
+                    log.info("订单状态未知,不做任何处理:{}", orderId);
+                    break;
+                case ORDER_RECEIVED:
+                    //收到订单
+                    buildPushOrderStatus(orderId, OrderStatusEnum.READY_DEPART);
+                    break;
+                case ORDER_STARTED:
+                    //开始执行订单
+                    log.info("开始执行订单,不做任何处理:{}", orderId);
+                    break;
+                case ORDER_EN_ROUTE_TO_PICKUP:
+                    //前往上车点
+                    buildPushOrderStatus(orderId, OrderStatusEnum.PICK_UP);
+                    break;
+                case ORDER_ARRIVED_AT_PICKUP:
+                    //到达上车点
+                    log.info("到达上车点,不做任何处理:{}", orderId);
+                    break;
+                case ORDER_WAITING_FOR_PICKUP:
+                    //等待乘客上车
+                    buildPushOrderStatus(orderId, OrderStatusEnum.PICK_UP_GUESTS);
+                    break;
+                case ORDER_PASSENGER_ONBOARD:
+                    //乘客已上车
+                    buildPushOrderStatus(orderId, OrderStatusEnum.PASSENGER_BOARDED);
+                    break;
+                case ORDER_EN_ROUTE_TO_DESTINATION:
+                    //前往目的地
+                    buildPushOrderStatus(orderId, OrderStatusEnum.IN_SERVICE);
+                    break;
+                case ORDER_ARRIVED_AT_DESTINATION:
+                    //到达目的地
+                    log.info("到达目的地,不做任何处理:{}", orderId);
+                    break;
+                case ORDER_WAITING_FOR_DROPOFF:
+                    //等待乘客下车
+                    buildPushOrderStatus(orderId, OrderStatusEnum.SEE_OFF_GUESTS);
+                    break;
+                case ORDER_DROPOFF_COMPLETED:
+                    //下车完成
+                    buildPushOrderStatus(orderId, OrderStatusEnum.APPROVAL_REJECTION);
+                    break;
+                case ORDER_COMPLETED:
+                    //已完成
+                    log.info("已完成,不做任何处理:{}", orderId);
+                    break;
+                case ORDER_CANCELLED:
+                    //已取消
+                    buildPushOrderStatus(orderId, OrderStatusEnum.CANCELED);
+                    break;
+                case ORDER_ARRIVED_AT_CRUISE_DESTINATION:
+                    //到达巡游终点
+                    buildPushOrderStatus(orderId, null);
+                    break;
+                case ORDER_PAUSED:
+                    //订单暂停
+                    log.info("订单暂停,不做任何处理:{}", orderId);
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
 
+
+    /**
+     * 构建订单状态推送消息
+     * @param orderId
+     * @param status
+     */
+    public void buildPushOrderStatus(String orderId, OrderStatusEnum status){
+        if(orderId.contains("XU")){
+            //巡游单
+        }else{
+            //普通单
+            //构建推送消息
+            Map<String, Object> params = new HashMap<>();
+            Map<String, Object> content = new HashMap<>();
+            content.put("orderId", orderId);
+            content.put("status", status.getCode());
+            params.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc());
+            params.put("content", com.alibaba.fastjson2.JSONObject.toJSONString(content));
+            params.put("timestamp", System.currentTimeMillis() + "");
+            String message = JSONObject.toJSONString(params);
+            R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.parseLong(orderId));
+            XpOrder xpOrder = xpOrderR.getData();
+            Long appUserId = xpOrder.getAppUserId();
+            SendMessageDTO dto = new SendMessageDTO();
+            dto.setAppUserId(appUserId + "");
+            dto.setMessage(message);
+            R<String> stringR = xpPushMessageClient.sendStatus(dto);
+            if (R.isError(stringR)) {
+                log.error("推送消息失败:{}", stringR.getMsg());
+            }
+        }
     }
 
 }

--
Gitblit v1.7.1