From b6f3de8451867d85242b2bd706fcfa4a65df4ff7 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期六, 11 四月 2026 02:46:30 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi

---
 xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java | 1108 ++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 800 insertions(+), 308 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 275b682..468af59 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,69 +1,70 @@
 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;
 import com.google.protobuf.util.JsonFormat;
+import com.xiaopeng.api.dto.automaticPilot.MqttPublishDto;
+import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
+import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO;
 import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
 import com.xiaopeng.api.dto.operation.CruisePointDto;
 import com.xiaopeng.api.dto.operation.LonLatDto;
 import com.xiaopeng.api.dto.operation.ReassignOrderDTO;
+import com.xiaopeng.api.dto.order.AddCruiseMissionDto;
 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.dto.vehicleConvoy.UpdateVehicleStateDto;
+import com.xiaopeng.api.feignClient.automaticPilot.VehicleBuriedPointClient;
+import com.xiaopeng.api.feignClient.maintenance.XpTaskClient;
 import com.xiaopeng.api.feignClient.map.XpMapClient;
 import com.xiaopeng.api.feignClient.operation.ReassignOrderClient;
 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.SystemEventType;
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
 import com.xiaopeng.api.vo.automaticPilot.protobuf.*;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.AbnormalReason;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.GearLevel;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderPhase;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderStatusInfo;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.RealtimePose;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.ResponseMessage;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.RtTripInfo;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.StatusCode;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.VehicleDynamicStatus;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.VehicleStaticInfo;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.VehicleStatus;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.Wgs;
 import com.xiaopeng.api.vo.operation.RouteVo;
+import com.xiaopeng.api.vo.order.OrderTrajectoryVo;
 import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo;
 import com.xiaopeng.automaticPilot.util.XPUUtil;
 import com.xiaopeng.common.core.constant.CacheConstants;
+import com.xiaopeng.common.core.constant.Constants;
 import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.enums.CancelOrderSceneEnum;
 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.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
-;
 
 /**
  * Kafka 消费者服务
@@ -71,6 +72,8 @@
 @Slf4j
 @Service
 public class KafkaConsumerService {
+    private static final String REASSIGN_CANCEL_CONTEXT_PREFIX = "REASSIGN_CANCEL_CONTEXT:";
+
 
     @Resource
     private XpMapClient xpMapClient;
@@ -108,6 +111,24 @@
     @Resource
     private XpCruisePlanClient xpCruisePlanClient;
 
+    @Resource(name = "hutoolSnowflake")
+    private Snowflake snowflake;
+
+    @Value("${robotaxi.appId:xp_robotaxi_api}")
+    private String appid;
+
+    @Resource
+    private XpTaskClient xpTaskClient;
+    @Resource
+    private VehicleBuriedPointClient vehicleBuriedPointClient;
+
+    @Resource
+    private XpTestOrderClient testOrderClient;
+
+    private static final JsonFormat.Printer jsonPrinter = JsonFormat.printer()
+            .printingEnumsAsInts()
+            .preservingProtoFieldNames();
+
 
 
     /**
@@ -135,11 +156,24 @@
 
     private MsgContent parseMsgContent(String message) {
         try {
+            // 首先解析外层JSON,提取payload字段
+            JSONObject outerJson = JSON.parseObject(message);
+            String payload = outerJson.getString("payload");
+
+            if (StringUtils.isEmpty(payload)) {
+                log.error("Payload is empty in message: {}", message);
+                return null;
+            }
+
+            // 使用payload构建MsgContent
             MsgContent.Builder builder = MsgContent.newBuilder();
-            JsonFormat.parser().ignoringUnknownFields().merge(message, builder);
+            JsonFormat.parser().ignoringUnknownFields().merge(payload, builder);
             return builder.build();
         } catch (InvalidProtocolBufferException e) {
             log.error("Failed to parse message: {}", message, e);
+            return null;
+        } catch (Exception e) {
+            log.error("Failed to extract payload from message: {}", message, e);
             return null;
         }
     }
@@ -223,29 +257,44 @@
                     log.info("消息不在处理范围内,忽略:{}", message);
             }
         }
-        //TODO 这里的逻辑要再确认下
         //消息应答
-        if(MessageType.MESSAGE_TYPE_RESPONSE == type){
-            ResponseMessage response = msgContent.getResponse();
-            StatusCode code = response.getCode();
-            long requestSeq = response.getRequestSeq();
-            if(code == StatusCode.OK){
-                Object sequence = redisTemplate.opsForValue().get(requestSeq);
-                if(sequence!=null){
-                    JSONObject jsonObject = JSON.parseObject(sequence.toString());
-                    String event = jsonObject.getString("event");
-                    //推送导航的响应消息
-                    if(SystemEventType.PUSH_NAVIGATION.equals(event)){
+        if(MessageType.MESSAGE_TYPE_RESPONSE == type) {
+            //区分业务类型
+            int cmdValue = header.getCmd();
+            RTCmdType cmd = RTCmdType.getByValue(cmdValue);
+            if (cmd == null) {
+                log.warn("Unknown cmd value: {}", cmdValue);
+                return;
+            }
+            //云端下发订单的响应报文
+            if (cmd == RTCmdType.CLOUD_SEND_RT_TASK) {
+                RtTaskListResponse response = msgContent.getRtTaskListResponse();
+                try {
+                    log.info("云端下发订单操作的响应消息 (XPU→云端):{}", jsonPrinter.print(response));
+                    Object sequence = redisService.getCacheObject("CREATE_ORDER:" + response.getResults().getOrderId());
+                    if(sequence!=null){
+                        JSONObject jsonObject = JSON.parseObject(sequence.toString());
                         String orderId = jsonObject.getString("orderId");
                         String vin = jsonObject.getString("vin");
                         String orderType = jsonObject.getString("orderType");
                         PopOrderDto dto = new PopOrderDto();
-                        dto.setOrderId(Long.valueOf(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);
+                        log.info("订单状态更新:{}", response.getResults().getOrderId());
                     }
+                } catch (InvalidProtocolBufferException e) {
+                    log.error("Failed to print RtTaskListResponse: {}", response, e);
                 }
+            } else {
+                log.info("响应消息不在处理范围内,忽略:{}", message);
             }
         }
     }
@@ -278,52 +327,89 @@
         long sequence = msgContent.getHeader().getSequence();
         responseMessage(sequence, vin);
         //保存车辆实时位置到redis
-        redisTemplate.opsForGeo().add("vehiclePosition:" + vin, new Point(longitude, latitude), vin);
-
-        //保存车辆实时信息到mongodb
-        VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
-        if (null == vehiclePosition) {
-            vehiclePosition = new VehiclePosition();
+        if(0 != longitude && 0 != latitude){
+            redisTemplate.opsForGeo().add("vehiclePosition:" + vin, new Point(longitude, latitude), vin);
         }
-        vehiclePosition.setVin(vin);
-        vehiclePosition.setPoint(new GeoJsonPoint(longitude, latitude));
-        vehiclePosition.setCourse(course);
-        vehiclePosition.setAlt(alt);
+
         VehicleStatus vehicleStatus = systemRuntimeStatus.getVehicleStatus();
+        OrderStatusInfo runningOrderStatusInfo = systemRuntimeStatus.getRunningOrderStatusInfo();
+        String order_id = runningOrderStatusInfo.getOrderId();
         //车辆动态信息
         VehicleDynamicStatus dynamicStatus = vehicleStatus.getDynamicStatus();
-        vehiclePosition.setSpeed(dynamicStatus.getSpeed());
-        vehiclePosition.setCurrentElectricity(dynamicStatus.getBmsSocDisp());
-        vehiclePosition.setMileageRange(dynamicStatus.getDstBatDisp());
-        //订单信息
-        OrderStatusInfo runningOrderStatusInfo = systemRuntimeStatus.getRunningOrderStatusInfo();
         Long orderId = null;
-        String order_id = runningOrderStatusInfo.getOrderId();
-        vehiclePosition.setHasOrder(0);
+        Integer hasOrder = 0;
         if (StringUtils.isNotEmpty(order_id)) {
             if (order_id.contains("XU")) {
-                vehiclePosition.setHasOrder(1);
+                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);
             }
         }
-        vehiclePosition.setOrderId(orderId);
-        mongoTemplate.save(vehiclePosition);
-        //调用推送服务接口
-        if (null != orderId) {
-            RtTripInfo rtTripInfo = systemRuntimeStatus.getRtTripInfo();
-            PushOrderRouteDTO dto = new PushOrderRouteDTO();
-            dto.setOrderId(orderId);
-            dto.setRouteType(order_id.contains("XU") ? 2 : 1);
-            dto.setLongitude(longitude);
-            dto.setLatitude(latitude);
-            //TODO 这两个字段现在拿不到
+        //保存车辆实时信息到mongodb
+        if(0 != longitude && 0 != latitude){
+            VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
+            if (null == vehiclePosition) {
+                vehiclePosition = new VehiclePosition();
+                vehiclePosition.setVin(vin);
+                vehiclePosition.setPoint(new GeoJsonPoint(longitude, latitude));
+                vehiclePosition.setCourse(course);
+                vehiclePosition.setAlt(alt);
+                vehiclePosition.setSpeed(dynamicStatus.getSpeed());
+                vehiclePosition.setCurrentElectricity(dynamicStatus.getBmsSocDisp());
+                vehiclePosition.setMileageRange(dynamicStatus.getDstBatDisp());
+                vehiclePosition.setOrderId(orderId);
+                vehiclePosition.setTotalOdometer(dynamicStatus.getTotalOdometer());
+                vehiclePosition.setAddTime(System.currentTimeMillis());
+                mongoTemplate.save(vehiclePosition);
+            }else{
+                vehiclePosition.setOrderId(orderId);
+                Update update = new Update()
+                        .set("point", new GeoJsonPoint(longitude, latitude))
+                        .set("course", course)
+                        .set("alt", alt)
+                        .set("speed", dynamicStatus.getSpeed())
+                        .set("currentElectricity", dynamicStatus.getBmsSocDisp())
+                        .set("mileageRange", dynamicStatus.getDstBatDisp())
+                        .set("hasOrder", hasOrder)
+                        .set("orderId", orderId)
+                        .set("totalOdometer", dynamicStatus.getTotalOdometer()
+                        .set("addTime", System.currentTimeMillis()));
+                mongoTemplate.updateFirst(new Query(Criteria.where("vin").is(vin)), update, VehiclePosition.class);
+            }
+            //调用推送服务接口,给乘客推送剩余轨迹和里程时长
+            if (null != orderId && !order_id.contains("XU")) {
+                RtTripInfo rtTripInfo = systemRuntimeStatus.getRtTripInfo();
+                PushOrderRouteDTO dto = new PushOrderRouteDTO();
+                dto.setOrderId(orderId);
+                dto.setRouteType(1);
+                dto.setLongitude(longitude);
+                dto.setLatitude(latitude);
+                //TODO 这两个字段现在拿不到
 //            dto.setDuration(rtTripInfo.getRemaining_time());
 //            dto.setDistance(rtTripInfo.getRemaining_distance().intValue());
-            xpPushMessageClient.pushOrderRoute(dto);
+//            dto.setDirection();
+                //只有乘客订单需要推送剩余导航数据
+                if(!order_id.contains("TEST")){
+                    xpPushMessageClient.pushOrderRoute(dto);
+                }
+
+                //存储历史轨迹
+                OrderTrajectoryVo orderTrajectory = new OrderTrajectoryVo();
+                orderTrajectory.setOrderId(orderId);
+                orderTrajectory.setLocation(longitude + "," + latitude);
+                orderTrajectory.setDirection(dto.getDirection());
+                orderTrajectory.setSpeed(0D);
+                orderTrajectory.setLocatetime(System.currentTimeMillis());
+                orderTrajectory.setCreateTime(new Date());
+                xpOrderClient.saveVehicleLocation(orderTrajectory);
+            }
         }
     }
+
+
 
 
     /**
@@ -338,37 +424,90 @@
         // 存储车辆挡位
         GearLevel gearLevel = systemRuntimeStatus.getVehicleStatus().getDynamicStatus().getGearLevel();
         int value = gearLevel.getNumber();
-        redisTemplate.opsForValue().set(CacheConstants.GEAR_LEVEL + systemRuntimeStatus.getVehicleStatus().getStaticInfo().getXpuId(), value);
+        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.cancelCruiseOrderById(Long.parseLong(orderId.substring(2)));
+                XpCruiseOrder cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2))).getData();
+                vehicle = xpVehicleClient.queryById(cruiseOrder.getVehicleId()).getData();
+                if (vehicle != null) {
+                    // 修改车辆状态
+                    XpVehicle vehicle1 = new XpVehicle();
+                    vehicle1.setOperatingStatus(4);
+                    vehicle1.setId(vehicle.getId());
+                    xpVehicleClient.updateVehicleById(vehicle1);
+                }
+            }else if(orderId.contains("TEST")){
+                //测试订单故障则取消订单
+                testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), 0);
+                XpTestOrder testOrder = testOrderClient.queryOrderById(Long.parseLong(orderId.substring(4))).getData();
+                vehicle = xpVehicleClient.queryById(testOrder.getVehicleId()).getData();
+                if (vehicle != null) {
+                    // 修改车辆状态
+                    XpVehicle vehicle1 = new XpVehicle();
+                    vehicle1.setOperatingStatus(4);
+                    vehicle1.setId(vehicle.getId());
+                    xpVehicleClient.updateVehicleById(vehicle1);
+                    log.info("车辆故障,车辆状态修改0 {}", vehicle.getPlateNumber());
+                }
+            }else {
+                //正常订单
+                XpOrder xpOrder = xpOrderClient.queryOrderById(Long.parseLong(orderId)).getData();
+                vehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
+                if (vehicle != null) {
+                    // 修改车辆状态
+                    XpVehicle vehicle1 = new XpVehicle();
+                    vehicle1.setState(0);
+                    vehicle1.setOperatingStatus(4);
+                    vehicle1.setId(vehicle.getId());
+                    xpVehicleClient.updateVehicleById(vehicle1);
+                    log.info("车辆故障,车辆状态修改0 {}", vehicle.getPlateNumber());
+                    // 解绑用户与车辆关系
+                    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());
+
+            // 封装埋点消息实体
+            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);
         }
     }
 
@@ -391,15 +530,15 @@
                 log.info("订单的任务未开始执行");
                 break;
             case ROUTE_TO_PICKUP:
-                log.info("驶往上车点的行程");
+                log.info("驶往上车点的行程 {}", orderId);
                 buildNaviRequest(requestId, orderId, orderPhase, msgContent.getHeader().getSequence());
                 break;
             case ROUTE_TO_DESTINATION:
-                log.info("驶往下车点的行程");
+                log.info("驶往下车点的行程 {}", orderId);
                 buildNaviRequest(requestId, orderId, orderPhase, msgContent.getHeader().getSequence());
                 break;
             case ROUTE_TO_CRUISE:
-                log.info("巡游阶段路线");
+                log.info("巡游阶段路线 {}", orderId);
                 buildNaviRequest(requestId, orderId, orderPhase, msgContent.getHeader().getSequence());
                 break;
         }
@@ -412,79 +551,69 @@
      * @param msgContent
      */
     public void navigationDeviationEvent(MsgContent msgContent) {
-        //先响应消息
-        long sequence = msgContent.getHeader().getSequence();
         //开始处理消息对应的业务逻辑
         NavigationDeviationEvent deviationEvent = msgContent.getNaviDeviationEvent();
-        // todo 请求id确认是否有这个参数
-//        String requestId = deviationEvent.getRequestId();
-        String requestId = "";
+        String requestId = deviationEvent.getNavigationDeviationMessage().getNaviRecalcRequestSeq() + "";
         //导航id
         String routeID = "";
         Long vehicleId = null;
         String orderType = "";
         //偏航事件类型 1:请求导航,2:取消导航
-//        if (deviationEvent.getEvent_type().equals(RtEventType.RT_EVENT_TYPE_REQUEST)) {
-            NavigationDeviationMessage navigationDeviationMessage = deviationEvent.getNavigationDeviationMessage();
-            String orderId = navigationDeviationMessage.getOrderId();
-            String taskId = navigationDeviationMessage.getTaskId();
-            Wgs wgs = navigationDeviationMessage.getPoint();
-            Double longitude = wgs.getLongitude();
-            Double latitude = wgs.getLatitude();
-            //订单类型  1:乘客订单,2=巡游订单
-            LonLatDto destination = new LonLatDto();
-            LonLatDto origin = new LonLatDto();
+        NavigationDeviationMessage navigationDeviationMessage = deviationEvent.getNavigationDeviationMessage();
+        String orderId = navigationDeviationMessage.getOrderId();
+        String taskId = navigationDeviationMessage.getTaskId();
+        Wgs wgs = navigationDeviationMessage.getPoint();
+        Double longitude = wgs.getLongitude();
+        Double latitude = wgs.getLatitude();
+        //订单类型  1:乘客订单,2=巡游订单
+        LonLatDto destination = new LonLatDto();
+        LonLatDto origin = new LonLatDto();
 
-            if (orderId.contains("XU")) {
-                orderType = OrderType.CRUISE_ORDER;
+        if (orderId.contains("XU")) {
+            orderType = OrderType.CRUISE_ORDER;
 
-                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(orderId);
-                XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
+            R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2)));
+            XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
 
-                //先响应消息
-                responseMessage(sequence, "");
-                //构建导航数据给到车端
-                origin.setLongitude(longitude);
-                origin.setLatitude(latitude);
-                destination.setLongitude(xpCruiseOrder.getEndLon());
-                destination.setLatitude(xpCruiseOrder.getEndLat());
+            //构建导航数据给到车端
+            origin.setLongitude(longitude);
+            origin.setLatitude(latitude);
+            destination.setLongitude(xpCruiseOrder.getEndLon());
+            destination.setLatitude(xpCruiseOrder.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();
-                routeID = routeVo.getRouteID();
+            OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
+            dto.setOrderId(Long.parseLong(orderId.substring(2)));
+            dto.setOrigin(origin);
+            dto.setDestination(destination);
+            dto.setRouteType(3);
+            R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
+            if (200 != routeVoR.getCode()) {
+                throw new RuntimeException("获取订单线路和运费失败");
+            }
+            RouteVo routeVo = routeVoR.getData();
+            routeID = routeVo.getRouteID();
 
 
-                vehicleId = xpCruiseOrder.getVehicleId();
-            } else {
-                orderType = OrderType.USER_ORDER;
-                //正常单
-                R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.parseLong(orderId));
-                if (200 != xpOrderR.getCode()) {
-                    throw new RuntimeException("订单不存在");
-                }
-                XpOrder xpOrder = xpOrderR.getData();
-                XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
-                //响应消息
-                responseMessage(sequence, xpVehicle.getVehicleVin());
+            vehicleId = xpCruiseOrder.getVehicleId();
+        } else if(orderId.contains("TEST")){
+            R<XpTestOrder> cruiseOrder = testOrderClient.queryOrderById(Long.parseLong(orderId.substring(4)));
+            XpTestOrder testOrder = cruiseOrder.getData();
+            //区分测试单和测试巡游单
+            if(1 == testOrder.getOrderType()){
+                orderType = OrderType.TEST_ORDER;
                 //驶往上车点的行程
-                if (Arrays.asList(3).contains(xpOrder.getStatus())) {
+                if (3 == testOrder.getStatus()) {
                     //查询司机当前位置到起点的线路
                     origin.setLongitude(longitude);
                     origin.setLatitude(latitude);
-                    destination.setLongitude(xpOrder.getStartLon());
-                    destination.setLatitude(xpOrder.getStartLat());
+                    destination.setLongitude(testOrder.getStartLon());
+                    destination.setLatitude(testOrder.getStartLat());
 
                     OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
-                    dto.setOrderId(Long.parseLong(orderId));
+                    dto.setOrderId(Long.parseLong(orderId.substring(4)));
                     dto.setOrigin(origin);
                     dto.setDestination(destination);
+                    dto.setRouteType(1);
                     R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
                     if (200 != routeVoR.getCode()) {
                         throw new RuntimeException("获取订单线路和运费失败");
@@ -492,19 +621,20 @@
                     RouteVo routeVo = routeVoR.getData();
                     routeID = routeVo.getRouteID();
                     //缓存数据,用于后续推给乘客导航线路
-                    redisService.setCacheObject("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+                    redisService.setCacheObject("TEST_ORDER_NAVIGATION_START_DATA:" + testOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
                 }
                 //驶往下车点的行程
-                if (Arrays.asList(6).contains(xpOrder.getStatus())) {
+                if (6 == testOrder.getStatus()) {
                     origin.setLongitude(longitude);
                     origin.setLatitude(latitude);
-                    destination.setLongitude(xpOrder.getEndLon());
-                    destination.setLatitude(xpOrder.getEndLat());
+                    destination.setLongitude(testOrder.getEndLon());
+                    destination.setLatitude(testOrder.getEndLat());
 
                     OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
-                    dto.setOrderId(Long.parseLong(orderId));
+                    dto.setOrderId(Long.parseLong(orderId.substring(4)));
                     dto.setOrigin(origin);
                     dto.setDestination(destination);
+                    dto.setRouteType(2);
                     R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
                     if (200 != routeVoR.getCode()) {
                         throw new RuntimeException("获取订单线路和运费失败");
@@ -512,22 +642,96 @@
                     RouteVo routeVo = routeVoR.getData();
                     routeID = routeVo.getRouteID();
                     //缓存导航数据,用于后面的逻辑中给乘客端推送导航数据
-                    redisService.setCacheObject("ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId(), com.alibaba.fastjson.JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+                    redisService.setCacheObject("TEST_ORDER_NAVIGATION_END_DATA:" + testOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
                 }
-                vehicleId = xpOrder.getVehicleId();
-            }
 
-            if(StringUtils.isNotEmpty(routeID)){
-                XpVehicle xpVehicle = xpVehicleClient.queryById(vehicleId).getData();
-                R<String> stringR = xpMapClient.queryRouted(routeID);
-                if (200 != stringR.getCode()) {
-                    throw new RuntimeException("根据导航ID获取车端需要的导航数据失败");
+            }else{
+                orderType = OrderType.TEST_CRUISE_ORDER;
+
+                //构建导航数据给到车端
+                origin.setLongitude(longitude);
+                origin.setLatitude(latitude);
+                destination.setLongitude(testOrder.getEndLon());
+                destination.setLatitude(testOrder.getEndLat());
+
+                OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
+                dto.setOrderId(Long.parseLong(orderId.substring(4)));
+                dto.setOrigin(origin);
+                dto.setDestination(destination);
+                dto.setRouteType(3);
+                R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
+                if (200 != routeVoR.getCode()) {
+                    throw new RuntimeException("获取订单线路和运费失败");
                 }
-                //TODO 这里的逻辑不太对,收到导航偏航事件之后
-                //构建导航下发请求对象
-                cloudPushNavigationInfo(requestId, routeID, stringR.getData(), orderType, orderId, xpVehicle.getVehicleVin(), xpVehicle.getXpuId());
+                RouteVo routeVo = routeVoR.getData();
+                routeID = routeVo.getRouteID();
+
+                vehicleId = testOrder.getVehicleId();
             }
-//        }
+        } else {
+            orderType = OrderType.USER_ORDER;
+            //正常单
+            R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.parseLong(orderId));
+            if (200 != xpOrderR.getCode()) {
+                throw new RuntimeException("订单不存在");
+            }
+            XpOrder xpOrder = xpOrderR.getData();
+            XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
+            //驶往上车点的行程
+            if (3 == xpOrder.getStatus()) {
+                //查询司机当前位置到起点的线路
+                origin.setLongitude(longitude);
+                origin.setLatitude(latitude);
+                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("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+            }
+            //驶往下车点的行程
+            if (6 == 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);
+                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("ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+            }
+            vehicleId = xpOrder.getVehicleId();
+        }
+        //直接响应回最新导航数据
+        if(StringUtils.isNotEmpty(routeID)){
+            XpVehicle xpVehicle = xpVehicleClient.queryById(vehicleId).getData();
+            R<String> stringR = xpMapClient.queryRouted(routeID);
+            if (200 != stringR.getCode()) {
+                throw new RuntimeException("根据导航ID获取车端需要的导航数据失败");
+            }
+            //构建响应导航数据给车端
+            cloudPushNavigationInfo(requestId, routeID, stringR.getData(), orderType, orderId, xpVehicle.getVehicleVin(), xpVehicle.getXpuId());
+        }
     }
 
 
@@ -546,14 +750,11 @@
         Long vehicleId = null;
         String orderType = "";
         if (orderId.contains("XU")) {
-
             orderType = OrderType.CRUISE_ORDER;
             //巡游单
             if (orderPhase.equals(OrderPhase.ROUTE_TO_CRUISE)) {
-                //先响应消息
-                responseMessage(sequence, "");
                 /* 构建导航数据给到车端 */
-                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(orderId);
+                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2)));
                 XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
 
                 origin.setLongitude(xpCruiseOrder.getStartLon());
@@ -562,9 +763,10 @@
                 destination.setLatitude(xpCruiseOrder.getEndLat());
 
                 OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
-                dto.setOrderId(Long.parseLong(orderId));
+                dto.setOrderId(Long.parseLong(orderId.substring(2)));
                 dto.setOrigin(origin);
                 dto.setDestination(destination);
+                dto.setRouteType(3);
                 R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
                 if (200 != routeVoR.getCode()) {
                     throw new RuntimeException("获取订单线路和运费失败");
@@ -575,42 +777,142 @@
 
                 vehicleId = xpCruiseOrder.getVehicleId();
             }
-        } else {
+        } else if(orderId.contains("TEST")){
+            R<XpTestOrder> cruiseOrder = testOrderClient.queryOrderById(Long.parseLong(orderId.substring(4)));
+            XpTestOrder testOrder = cruiseOrder.getData();
+            XpVehicle xpVehicle = xpVehicleClient.queryById(testOrder.getVehicleId()).getData();
+            //区分测试单和测试巡游单
+            if(1 == testOrder.getOrderType()){
+                orderType = OrderType.TEST_ORDER;
+                //驶往上车点的行程
+                if (orderPhase.equals(OrderPhase.ROUTE_TO_PICKUP)) {
+                    //直接取缓存中的导航数据推送给车端和乘客
+                    Object cacheObject = redisService.getCacheObject("TEST_ORDER_NAVIGATION_START_DATA:" + testOrder.getVehicleId());
+                    if(null == cacheObject){
+                        //没有缓存数据,重新规划线路
+                        //查询车辆位置
+                        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(testOrder.getStartLon());
+                        destination.setLatitude(testOrder.getStartLat());
+                        OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
+                        dto.setOrderId(Long.parseLong(orderId.substring(4)));
+                        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_START_DATA:" + testOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+                    }else{
+                        RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class);
+                        routeID = routeVo.getRouteID();
+                    }
+                }
+                //驶往下车点的行程
+                if (orderPhase.equals(OrderPhase.ROUTE_TO_DESTINATION)) {
+                    //直接取缓存中的导航数据推送给车端和乘客
+                    Object cacheObject = redisService.getCacheObject("TEST_ORDER_NAVIGATION_END_DATA:" + testOrder.getVehicleId());
+                    if(null == cacheObject){
+                        //没有缓存数据,重新规划线路
+                        //查询起点到终点的线路
+                        origin.setLongitude(testOrder.getStartLon());
+                        origin.setLatitude(testOrder.getStartLat());
+                        destination.setLongitude(testOrder.getEndLon());
+                        destination.setLatitude(testOrder.getEndLat());
+                        OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
+                        dto.setOrderId(Long.parseLong(orderId.substring(4)));
+                        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:" + testOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+                    }else{
+                        RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class);
+                        routeID = routeVo.getRouteID();
+                    }
+                }
+
+            }else{
+                orderType = OrderType.TEST_CRUISE_ORDER;
+
+                //巡游单
+                if (orderPhase.equals(OrderPhase.ROUTE_TO_CRUISE)) {
+                    /* 构建导航数据给到车端 */
+                    origin.setLongitude(testOrder.getStartLon());
+                    origin.setLatitude(testOrder.getStartLat());
+                    destination.setLongitude(testOrder.getEndLon());
+                    destination.setLatitude(testOrder.getEndLat());
+
+                    OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
+                    dto.setOrderId(Long.parseLong(orderId.substring(4)));
+                    dto.setOrigin(origin);
+                    dto.setDestination(destination);
+                    dto.setRouteType(3);
+                    R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
+                    if (200 != routeVoR.getCode()) {
+                        throw new RuntimeException("获取订单线路和运费失败");
+                    }
+                    RouteVo routeVo = routeVoR.getData();
+                    routeID = routeVo.getRouteID();
+                }
+            }
+            vehicleId = testOrder.getVehicleId();
+        }else{
             orderType = OrderType.USER_ORDER;
             //正常单
             R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.parseLong(orderId));
             if (200 != xpOrderR.getCode()) {
-                throw new RuntimeException("订单不存在");
+                throw new RuntimeException("订单不存在 " + orderId);
             }
             XpOrder xpOrder = xpOrderR.getData();
             XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
-            //先响应消息
-            responseMessage(sequence, xpVehicle.getVehicleVin());
             //驶往上车点的行程
             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());
+                Object cacheObject = redisService.getCacheObject("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId());
+                if(null == cacheObject){
+                    //查询车辆位置
+                    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);
-                R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
-                if (200 != routeVoR.getCode()) {
-                    throw new RuntimeException("获取订单线路和运费失败");
-                }
-                RouteVo routeVo = routeVoR.getData();
-                routeID = routeVo.getRouteID();
-                //缓存数据,用于后续推给乘客导航线路
-                redisService.setCacheObject("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+                    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("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+                }else{
+                    RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class);
+                    routeID = routeVo.getRouteID();
+                };
             }
             //驶往下车点的行程
             if (orderPhase.equals(OrderPhase.ROUTE_TO_DESTINATION)) {
@@ -627,6 +929,7 @@
                     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("获取订单线路和运费失败");
@@ -634,7 +937,7 @@
                     RouteVo routeVo = routeVoR.getData();
                     routeID = routeVo.getRouteID();
                     //缓存导航数据,用于后面的逻辑中给乘客端推送导航数据
-                    redisService.setCacheObject("ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId(), com.alibaba.fastjson.JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+                    redisService.setCacheObject("ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
                 }else{
                     RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class);
                     routeID = routeVo.getRouteID();
@@ -644,11 +947,13 @@
         }
 
         if(StringUtils.isNotEmpty(routeID)){
+            log.info("开始推送导航信息 {}", orderId);
             XpVehicle xpVehicle = xpVehicleClient.queryById(vehicleId).getData();
             R<String> stringR = xpMapClient.queryRouted(routeID);
             if (200 != stringR.getCode()) {
                 throw new RuntimeException("根据导航ID获取车端需要的导航数据失败");
             }
+            log.info("根据导航ID获取车端需要的导航数据 订单 {} 导航数据 {}", orderId, stringR.getData());
             //构建导航下发请求对象
             cloudPushNavigationInfo(requestId, routeID, stringR.getData(), orderType, orderId, xpVehicle.getVehicleVin(), xpVehicle.getXpuId());
         }
@@ -697,11 +1002,9 @@
 
         }
         orderOperationBuilder.addAllWaypoints(waypoints);
-        SnowFlake snowFlake = new SnowFlake(0, 0);
-        snowFlake.withStartTimestamp(1420041600000L);
-        long sequence = snowFlake.nextId();
+        long sequence = snowflake.nextId();
         // 处理数据
-        redisTemplate.opsForValue().set(sequence,"pushOrder_"+orderId+"_"+vin,30, TimeUnit.MINUTES);
+        redisService.setCacheObject(sequence + "","pushOrder_"+orderId+"_"+vin,30L, TimeUnit.MINUTES);
         //开发发送请求到XPU
         xpuUtil.cloudOrderOperation(orderOperationBuilder.build(), vin,sequence);
     }
@@ -742,8 +1045,14 @@
                     break;
                 case ORDER_RECEIVED:
                     //收到订单
-                    buildPushOrderStatus(orderId, OrderStatusEnum.READY_DEPART, sequence);
-                    xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.READY_DEPART.getCode());
+                    if(!orderId.contains("XU")){
+                        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:
                     //开始执行订单
@@ -751,8 +1060,14 @@
                     break;
                 case ORDER_EN_ROUTE_TO_PICKUP:
                     //前往上车点
-                    buildPushOrderStatus(orderId, OrderStatusEnum.PICK_UP, sequence);
-                    xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.PICK_UP.getCode());
+                    if(!orderId.contains("XU")){
+                        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:
                     //到达上车点
@@ -760,45 +1075,206 @@
                     break;
                 case ORDER_WAITING_FOR_PICKUP:
                     //等待乘客上车
-                    buildPushOrderStatus(orderId, OrderStatusEnum.PICK_UP_GUESTS, sequence);
-                    xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.PICK_UP_GUESTS.getCode());
+                    if(!orderId.contains("XU")){
+                        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:
                     //乘客已上车
-                    buildPushOrderStatus(orderId, OrderStatusEnum.PASSENGER_BOARDED, sequence);
-                    xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.PASSENGER_BOARDED.getCode());
+                    if(!orderId.contains("XU")){
+                        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:
                     //前往目的地
-                    buildPushOrderStatus(orderId, OrderStatusEnum.IN_SERVICE, sequence);
-                    xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.IN_SERVICE.getCode());
+                    if(!orderId.contains("XU")){
+                        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:
                     //到达目的地
                     log.info("到达目的地,不做任何处理:{}", orderId);
                     break;
                 case ORDER_WAITING_FOR_DROPOFF:
-                    //等待乘客下车
-                    buildPushOrderStatus(orderId, OrderStatusEnum.SEE_OFF_GUESTS, sequence);
-                    xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
+                    //等待乘客下车,开始倒计时发下巡游单
+                    if(!orderId.contains("XU")){
+                        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:
-                    //下车完成
-                    buildPushOrderStatus(orderId, OrderStatusEnum.APPROVAL_REJECTION, sequence);
-                    xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.APPROVAL_REJECTION.getCode());
+                    //下车完成,不需要处理状态,由后续的乘客主动触发或者定时任务触发
+                    log.info("乘客已下车,不做任何处理:{}", orderId);
                     break;
                 case ORDER_COMPLETED:
                     //已完成
                     log.info("已完成,不做任何处理:{}", orderId);
+                    if(!orderId.contains("XU")){
+                        XpOrder xpOrder = xpOrderClient.queryOrderById(Long.valueOf(orderId)).getData();
+                        if (Objects.nonNull(xpOrder)){
+                            // 查询车辆
+                            XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
+                            if (Objects.nonNull(xpVehicle)){
+                                String vin = xpVehicle.getVehicleVin();
+                                // 封装埋点消息实体
+                                VehicleEventDTO vehicleEventDTO = new VehicleEventDTO();
+                                vehicleEventDTO.setVin(vin);
+                                vehicleEventDTO.setXpuId("");
+                                vehicleEventDTO.setOrderId(orderId);
+                                vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload");
+                                vehicleEventDTO.setEventTime(System.currentTimeMillis());
+                                Map<String,Object> attributes = new HashMap<>();
+                                attributes.put("vin",vin);
+                                attributes.put("order_id",vehicleEventDTO.getOrderId());
+                                attributes.put("order_type","user_order");
+                                attributes.put("timestamp",vehicleEventDTO.getEventTime());
+                                attributes.put("current_main_status",OrderStatus.ORDER_COMPLETED);
+                                attributes.put("current_sub_status","");
+                                VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
+                                if(Objects.nonNull(vehiclePosition)){
+                                    attributes.put("odometer_km",vehiclePosition.getTotalOdometer());
+                                }else {
+                                    attributes.put("odometer_km","");
+                                }
+                                vehicleEventDTO.setAttributes(attributes);
+                                vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO);
+                                log.info("已完成,推送埋点:{}", orderId);
+                            }
+                        }
+                    }
                     break;
                 case ORDER_CANCELLED:
                     //已取消
-                    buildPushOrderStatus(orderId, OrderStatusEnum.CANCELED, sequence);
-                    xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.CANCELED.getCode());
+                    if(!orderId.contains("XU")){
+                        String taskId = orderStatusInfo.getTaskId();
+                        JSONObject reassignCancelContext = resolveReassignCancelContext(orderId, orderStatusInfo);
+                        if (Objects.nonNull(reassignCancelContext)) {
+                            log.info("改派旧车取消回调,跳过订单取消处理,orderId: {}, taskId: {}, cancelScene: {}, context: {}",
+                                    orderId, taskId, reassignCancelContext.getString("cancelScene"), reassignCancelContext);
+                            //响应消息
+                            String responseVin = resolveReassignCancelResponseVin(reassignCancelContext);
+                            if (StringUtils.isNotEmpty(responseVin)) {
+                                responseMessage(sequence, responseVin);
+                            } else {
+                                log.warn("改派旧车取消回调未找到响应VIN,orderId: {}, taskId: {}, context: {}",
+                                        orderId, taskId, reassignCancelContext);
+                            }
+                            return;
+                        }
+                        if(orderId.contains("TEST")){
+                            //判断订单状态,已经取消的不作处理
+                            Object cacheObject = redisService.getCacheObject("TEST_ORDER_STATUS:" + orderId.substring(4));
+                            if(null != cacheObject){
+                                int order_status = Integer.parseInt(cacheObject.toString());
+                                if(0 == order_status){
+                                    return;
+                                }
+                            }
+                            XpTestOrder testOrder = testOrderClient.queryOrderById(Long.valueOf(orderId.substring(4))).getData();
+                            if(testOrder.getStatus() == 0 || testOrder.getStatus() >= 8){
+                                return;
+                            }
+                            //行程中取消订单,按照行程结束处理
+                            if(testOrder.getStatus() > 5 && testOrder.getStatus() < 8){
+                                testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
+                                redisService.setCacheObject("TEST_ORDER_STATUS:" + orderId.substring(4), OrderStatusEnum.SEE_OFF_GUESTS.getCode(), 24L, TimeUnit.HOURS);
+                            }else{
+                                testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), OrderStatusEnum.CANCELED.getCode());
+                                redisService.setCacheObject("TEST_ORDER_STATUS:" + orderId.substring(4), OrderStatusEnum.CANCELED.getCode(), 24L, TimeUnit.HOURS);
+                            }
+                        }else{
+                            //判断订单状态,已经取消的不作处理
+                            Object cacheObject = redisService.getCacheObject("ORDER_STATUS:" + orderId);
+                            if(null != cacheObject){
+                                int order_status = Integer.parseInt(cacheObject.toString());
+                                if(0 == order_status){
+                                    return;
+                                }
+                            }
+                            XpOrder xpOrder = xpOrderClient.queryOrderById(Long.parseLong(orderId)).getData();
+                            if(xpOrder.getStatus() == 0 || xpOrder.getStatus() >= 8){
+                                return;
+                            }
+                            if(xpOrder.getStatus() > 5 && xpOrder.getStatus() < 8){
+                                //行程中取消订单,按照行程结束处理
+                                buildPushOrderStatus(orderId, OrderStatusEnum.SEE_OFF_GUESTS, sequence);
+                                xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
+                                redisService.setCacheObject("ORDER_STATUS:" + orderId, OrderStatusEnum.SEE_OFF_GUESTS.getCode(), 24L, TimeUnit.HOURS);
+                            }else{
+                                buildPushOrderStatus(orderId, OrderStatusEnum.CANCELED, sequence);
+                                xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.CANCELED.getCode());
+                                redisService.setCacheObject("ORDER_STATUS:" + orderId, OrderStatusEnum.CANCELED.getCode(), 24L, TimeUnit.HOURS);
+                            }
+                        }
+                    }
                     break;
                 case ORDER_ARRIVED_AT_CRUISE_DESTINATION:
                     //到达巡游终点
-                    buildPushOrderStatus(orderId, OrderStatusEnum.COMPLETED, sequence);
+                    if(orderId.contains("XU")){
+                        buildPushOrderStatus(orderId, OrderStatusEnum.COMPLETED, sequence);
+                        String cruiseOrderId = orderId.substring(2);
+                        XpCruiseOrder xpCruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(cruiseOrderId)).getData();
+                        if (Objects.nonNull(xpCruiseOrder)){
+                            // 查询车辆
+                            XpVehicle xpVehicle = xpVehicleClient.queryById(xpCruiseOrder.getVehicleId()).getData();
+                            if (Objects.nonNull(xpVehicle)){
+                                String vin = xpVehicle.getVehicleVin();
+                                // 封装埋点消息实体
+                                VehicleEventDTO vehicleEventDTO = new VehicleEventDTO();
+                                vehicleEventDTO.setVin(vin);
+                                vehicleEventDTO.setXpuId("");
+                                vehicleEventDTO.setOrderId(cruiseOrderId);
+                                vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload");
+                                vehicleEventDTO.setEventTime(System.currentTimeMillis());
+                                Map<String,Object> attributes = new HashMap<>();
+                                attributes.put("vin",vin);
+                                attributes.put("order_id",vehicleEventDTO.getOrderId());
+                                attributes.put("order_type","cruise_order");
+                                attributes.put("timestamp",vehicleEventDTO.getEventTime());
+                                attributes.put("current_main_status",OrderStatus.ORDER_ARRIVED_AT_CRUISE_DESTINATION);
+                                attributes.put("current_sub_status","");
+                                VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
+                                if(Objects.nonNull(vehiclePosition)){
+                                    attributes.put("odometer_km",vehiclePosition.getTotalOdometer());
+                                }else {
+                                    attributes.put("odometer_km","");
+                                }
+                                vehicleEventDTO.setAttributes(attributes);
+                                vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO);
+                                log.info("到达巡游终点,推送埋点:{}", orderId);
+                            }
+                        }
+                    }else if(orderId.contains("TEST")){
+                        //测试巡游单完成状态
+                        XpTestOrder testOrder = testOrderClient.queryOrderById(Long.parseLong(orderId.substring(4))).getData();
+                        if(testOrder.getOrderType() == 2){
+                            XpVehicle xpVehicle = xpVehicleClient.queryById(testOrder.getVehicleId()).getData();
+                            //响应消息
+                            responseMessage(sequence, xpVehicle.getVehicleVin());
+                            //测试巡游单处理逻辑
+                            testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), OrderStatusEnum.COMPLETED.getCode());
+                            redisService.setCacheObject("TEST_ORDER_STATUS:" + orderId.substring(4), OrderStatusEnum.COMPLETED.getCode(), 24L, TimeUnit.HOURS);
+                        }
+                    }
                     break;
                 case ORDER_PAUSED:
                     //订单暂停
@@ -819,101 +1295,49 @@
     public void buildPushOrderStatus(String orderId, OrderStatusEnum status, Long sequence){
         if(orderId.contains("XU")){
             //巡游单
-            //响应消息
-            responseMessage(sequence, "");
-            //前往目的地
-            if(OrderStatusEnum.IN_SERVICE.equals(status)){
-
-            }
             //到达目的地
             if(OrderStatusEnum.COMPLETED.equals(status)){
-
                 // 返程找到目前的订单 -》之前的订单 查询生成一个   正常巡游 找到下一个点位   若到达最后点位  则反向找点位  每次判断是否收车状态 是则不进行处理了
                 // 找到这个订单
-                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();
-
                     // 完成当前巡游单子 已完成
-                    xpCruiseOrderClient.closeCruiseOrder(xpCruiseOrder.getVehicleVin());
+                    xpCruiseOrderClient.completeCruiseOrder(Long.parseLong(orderId.substring(2)));
                     R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(vehicleId);
                     XpVehicle xpVehicle = xpVehicleR.getData();
+                    //响应消息
+                    responseMessage(sequence, xpVehicle.getVehicleVin());
                     // 运营中 继续执行
                     if(xpVehicle.getOperatingStatus()==1 && xpVehicle.getState()==0){
+                        log.info("巡游单到达终点,继续执行下一笔巡游单");
                         // 创建新的巡游单子  判断是否为返程单子
-                        if(xpCruiseOrder.getOrderType()==2){
-                            R<XpCruiseOrder> lastOrder = xpCruiseOrderClient.getCruiseOrder(xpCruiseOrder.getLastOrderId());
-                            XpCruiseOrder lastXpCruiseOrder = lastOrder.getData();
+                        // 正常巡游 找到下一个点位   若到达最后点位  则反向找点位
+                        // 起点
+                        Double endLon = xpCruiseOrder.getEndLon();
+                        Double endLat = xpCruiseOrder.getEndLat();
+                        XpCruiseOrder newXpCruiseOrder = new XpCruiseOrder();
+                        newXpCruiseOrder.setVehicleId(xpCruiseOrder.getVehicleId());
+                        newXpCruiseOrder.setVehicleVin(xpCruiseOrder.getVehicleVin());
+                        newXpCruiseOrder.setFleetId(xpCruiseOrder.getFleetId());
+                        newXpCruiseOrder.setOrderType(1);
+                        newXpCruiseOrder.setStartLat(endLat);
+                        newXpCruiseOrder.setStartLon(endLon);
+                        newXpCruiseOrder.setStartPointId(xpCruiseOrder.getEndPointId());
+                        newXpCruiseOrder.setStartPointName(xpCruiseOrder.getEndPointName());
+                        newXpCruiseOrder.setStatus(1);
+                        newXpCruiseOrder.setLastOrderId(xpCruiseOrder.getId());
 
-                            // 修改一下id 加一个一样的巡游单子
-                            lastXpCruiseOrder.setId("XU"+ IdUtil.fastUUID());
-                            lastXpCruiseOrder.setStatus(1);
-                            xpCruiseOrderClient.addCruiseOrder(lastXpCruiseOrder);
-
-
-
-                            // 获取点位id
-                            Long endPointId = xpCruiseOrder.getEndPointId();
-                            // 获取点位信息 获取点位是否需要停车
-//                            xpCruisePlanClient.getPlanPointInfo(endPointId);
-
-
-
-                            RtTask.Builder taskBuilder = RtTask.newBuilder();
-                            taskBuilder.setOrderId(lastXpCruiseOrder.getId());
-                            taskBuilder.setTaskId("MISSION_"+ IdUtil.fastUUID());
-                            taskBuilder.setTaskType(com.xiaopeng.api.vo.automaticPilot.protobuf.OrderType.ORDER_TYPE_CRUISE);
-
-                            RtTask task = taskBuilder.build();
-                            RtTaskList taskList = RtTaskList.newBuilder().addTasks(task).build();
-
-
-                            SnowFlake snowFlake = new SnowFlake(0, 0);
-                            snowFlake.withStartTimestamp(1420041600000L);
-                            long sequence1 = snowFlake.nextId();
-                            xpuUtil.cloudCreateOrder(taskList, xpVehicle.getVehicleVin(),sequence1);
-                        }else if(xpCruiseOrder.getOrderType()==1){
-                           // 正常巡游 找到下一个点位   若到达最后点位  则反向找点位
-                            // 起点
-                            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());
-                            newXpCruiseOrder.setOrderType(1);
-                            newXpCruiseOrder.setStartLat(endLat);
-                            newXpCruiseOrder.setStartLon(endLon);
-                            newXpCruiseOrder.setStartPointId(xpCruiseOrder.getEndPointId());
-                            newXpCruiseOrder.setStartPointName(xpCruiseOrder.getEndPointName());
-                            newXpCruiseOrder.setStatus(1);
-                            newXpCruiseOrder.setLastOrderId(xpCruiseOrder.getId());
-
-
-                            // 通过车找终点id
-                            CruisePointDto cruisePointDto = new CruisePointDto();
-                            cruisePointDto.setNewXpCruiseOrder(newXpCruiseOrder);
-                            cruisePointDto.setVehicleId(xpCruiseOrder.getVehicleId());
-                            cruisePointDto.setPointId(newXpCruiseOrder.getStartPointId());
-                            cruisePointDto.setOrderReverse(xpCruiseOrder.getOrderReverse());
-                            R<XpCruiseOrder> cruisePoint = xpCruisePlanClient.getCruisePoint(cruisePointDto);
-                            if(cruisePoint!=null){
-                                xpCruiseOrderClient.addCruiseOrder(cruisePoint.getData());
-                                RtTask.Builder taskBuilder = RtTask.newBuilder();
-                                //TODO 设置目标地点信息
-                                taskBuilder.setOrderId(newXpCruiseOrder.getId());
-                                taskBuilder.setTaskId("MISSION_"+ IdUtil.fastUUID());
-                                taskBuilder.setTaskType(com.xiaopeng.api.vo.automaticPilot.protobuf.OrderType.ORDER_TYPE_CRUISE);
-                                RtTaskList.Builder taskListBuilder = RtTaskList.newBuilder();
-                                taskListBuilder.addTasks(taskBuilder.build());
-
-                                SnowFlake snowFlake = new SnowFlake(0, 0);
-                                snowFlake.withStartTimestamp(1420041600000L);
-                                long sequence1 = snowFlake.nextId();
-                                xpuUtil.cloudCreateOrder(taskListBuilder.build(), xpVehicle.getVehicleVin(),sequence1);
-                            }
+                        // 通过车找终点id
+                        CruisePointDto cruisePointDto = new CruisePointDto();
+                        cruisePointDto.setNewXpCruiseOrder(newXpCruiseOrder);
+                        cruisePointDto.setVehicleId(xpCruiseOrder.getVehicleId());
+                        cruisePointDto.setPointId(newXpCruiseOrder.getStartPointId());
+                        cruisePointDto.setOrderReverse(xpCruiseOrder.getOrderReverse());
+                        R<XpCruiseOrder> cruisePoint = xpCruisePlanClient.getCruisePoint(cruisePointDto);
+                        if(cruisePoint!=null){
+                            xpCruiseOrderClient.addCruiseOrder(cruisePoint.getData());
                         }
                     }
                 }
@@ -940,10 +1364,85 @@
             dto.setAppUserId(appUserId + "");
             dto.setMessage(message);
             R<String> stringR = xpPushMessageClient.sendStatus(dto);
-            if (R.isError(stringR)) {
-                log.error("推送消息失败:{}", stringR.getMsg());
+
+            //推送失败,重试3次
+            if(stringR.getCode() != Constants.SUCCESS){
+                ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
+                executor.execute(() -> {
+                    for (int i = 0; i < 3; i++) {
+                        R<String> stringR1 = xpPushMessageClient.sendStatus(dto);
+                        if(stringR1.getCode() == Constants.SUCCESS){
+                            break;
+                        }
+                        try {
+                            Thread.sleep(1000);
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
+                        log.info("推送订单状态消息失败:{} {} {}", stringR1.getMsg(), JSON.toJSONString(dto), xpOrder.getOrderNumber());
+                    }
+                });
             }
+
         }
+    }
+
+    private JSONObject getReassignCancelContext(String orderId) {
+        if (StringUtils.isEmpty(orderId)) {
+            return null;
+        }
+        Object cacheObject = redisService.getCacheObject(REASSIGN_CANCEL_CONTEXT_PREFIX + orderId);
+        if (cacheObject == null) {
+            return null;
+        }
+        return JSON.parseObject(cacheObject.toString());
+    }
+
+    private JSONObject resolveReassignCancelContext(String orderId, OrderStatusInfo orderStatusInfo) {
+        if (OrderStateChangeSource.ORDER_STATE_CHANGE_SOURCE_VEHICLE != orderStatusInfo.getChangeSource()) {
+            return null;
+        }
+        JSONObject cancelContext = getReassignCancelContext(orderId);
+        if (cancelContext == null) {
+            return null;
+        }
+        if (CancelOrderSceneEnum.REASSIGN_OLD_VEHICLE != CancelOrderSceneEnum.fromCode(
+                cancelContext.getString("cancelScene"))) {
+            return null;
+        }
+        R<XpOrder> orderResult = xpOrderClient.queryOrderById(Long.parseLong(orderId));
+        XpOrder xpOrder = orderResult == null ? null : orderResult.getData();
+        if (xpOrder == null) {
+            log.warn("改派取消回调识别失败,订单不存在,orderId: {}, context: {}", orderId, cancelContext);
+            return null;
+        }
+        Long newVehicleId = cancelContext.getLong("newVehicleId");
+        Integer currentStatus = xpOrder.getStatus();
+        boolean vehicleMatched = Objects.nonNull(newVehicleId) && Objects.equals(newVehicleId, xpOrder.getVehicleId());
+        boolean statusMatched = Objects.nonNull(currentStatus) && currentStatus > 0 && currentStatus < 8;
+        if (vehicleMatched && statusMatched) {
+            return cancelContext;
+        }
+        log.info("改派取消回调未命中专用上下文,orderId: {}, currentVehicleId: {}, newVehicleId: {}, currentStatus: {}",
+                orderId, xpOrder.getVehicleId(), newVehicleId, currentStatus);
+        return null;
+    }
+
+    private String resolveReassignCancelResponseVin(JSONObject cancelContext) {
+        if (cancelContext == null) {
+            return null;
+        }
+        String oldVehicleVin = cancelContext.getString("oldVehicleVin");
+        if (StringUtils.isNotEmpty(oldVehicleVin)) {
+            return oldVehicleVin;
+        }
+        Long oldVehicleId = cancelContext.getLong("oldVehicleId");
+        if (Objects.isNull(oldVehicleId)) {
+            return null;
+        }
+        R<XpVehicle> vehicleResult = xpVehicleClient.queryById(oldVehicleId);
+        XpVehicle xpVehicle = vehicleResult == null ? null : vehicleResult.getData();
+        return xpVehicle == null ? null : xpVehicle.getVehicleVin();
     }
 
     /**
@@ -962,17 +1461,10 @@
         navigationDataBuilder.setRequestId(requestId);
         navigationDataBuilder.setContent(routeDataContent);
         navigationDataBuilder.setTimestamp(System.currentTimeMillis());
-        SnowFlake snowFlake = new SnowFlake(0, 0);
-        snowFlake.withStartTimestamp(1420041600000L);
-        long sequence = snowFlake.nextId();
-        // 处理数据
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put("event", SystemEventType.PUSH_NAVIGATION);
-        jsonObject.put("orderType", orderType);
-        jsonObject.put("orderId", orderId);
-        jsonObject.put("vin", vin);
-        redisTemplate.opsForValue().set(sequence, jsonObject.toJSONString(),30, TimeUnit.MINUTES);
-        xpuUtil.cloudPushNavigation(navigationDataBuilder.build(), xpuId, sequence);
+        long sequence = snowflake.nextId();
+        log.info("开始推送导航数据 {}", orderId);
+        MqttPublishDto mqttPublishDto = xpuUtil.cloudPushNavigation(navigationDataBuilder.build(), xpuId, sequence);
+        log.info("推送导航的响应消息,{}", JSON.toJSONString(mqttPublishDto));
     }
 
 }

--
Gitblit v1.7.1