From 1632956ff51882192bb01dbfc5a3761482ff4603 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 17 四月 2026 10:34:02 +0800
Subject: [PATCH] 合并线上代码

---
 xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java |  542 ++++++++++++++++++++++++++++-------------------------
 1 files changed, 287 insertions(+), 255 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 d81cf34..f32d96c 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
@@ -49,6 +49,9 @@
 import com.xiaopeng.common.core.utils.uuid.UUID;
 import com.xiaopeng.common.redis.service.RedisService;
 import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RTopic;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.geo.Point;
 import org.springframework.data.mongodb.core.MongoTemplate;
@@ -60,9 +63,11 @@
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.*;
-import java.util.concurrent.*;
-import java.util.function.Consumer;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
 
 /**
@@ -129,6 +134,9 @@
 
     @Resource
     private XpTestOrderClient testOrderClient;
+
+    @Resource
+    private RedissonClient redissonClient;
 
     private static final JsonFormat.Printer jsonPrinter = JsonFormat.printer()
             .printingEnumsAsInts()
@@ -348,109 +356,118 @@
         if (xpuResPingEnable) {
             responseMessage(cmd, sequence, vin);
         }
-        //保存车辆实时位置到redis
-        if(0 != longitude && 0 != latitude){
-            redisTemplate.opsForGeo().add("vehiclePosition:" + vin, new Point(longitude, latitude), vin);
-        }
 
         VehicleStatus vehicleStatus = systemRuntimeStatus.getVehicleStatus();
         OrderStatusInfo runningOrderStatusInfo = systemRuntimeStatus.getRunningOrderStatusInfo();
         String order_id = runningOrderStatusInfo.getOrderId();
-        //车辆动态信息
-        VehicleDynamicStatus dynamicStatus = vehicleStatus.getDynamicStatus();
-        Long orderId = null;
-        Integer hasOrder = 0;
-        if (StringUtils.isNotEmpty(order_id)) {
-            if (order_id.contains("XU")) {
-                hasOrder = 1;
-                orderId = Long.parseLong(order_id.substring(2));
-            } else if(order_id.contains("TEST")) {
-                orderId = Long.parseLong(order_id.substring(4));
-            }else{
-                orderId = Long.parseLong(order_id);
+        RLock lock = redissonClient.getLock("PUSH_ORDER_ROUTE_LOCK:" + order_id);
+        try {
+            boolean tryLock = lock.tryLock(10, 10, TimeUnit.SECONDS);
+            if (!tryLock) {
+                log.info("获取锁失败,订单ID:{} 无法完成车辆实时位置的逻辑处理。", order_id);
+                return;
             }
-        }
-        //保存车辆实时信息到mongodb
-        if(0 != longitude && 0 != latitude){
-            //缓存车辆历史定位,用户辅助获取导航抓路用
-            List<HistoryPointDto> history = redisService.getCacheList("VEHICLE_HISTORY_POINT_LIST:" + xpVehicle.getId());
-            if(history.size() >= 10){
-                history = new ArrayList<>(history.subList(history.size() - 9, history.size()));
-            }
-            HistoryPointDto historyPointDto = new HistoryPointDto();
-            historyPointDto.setLocation(longitude + "," + latitude);
-            historyPointDto.setLocateTime(System.currentTimeMillis() + "");
-            historyPointDto.setAccuracy(naviPose.getPosAcc());
-            historyPointDto.setDirection(course);
-            historyPointDto.setSpeed(dynamicStatus.getSpeed());
-            historyPointDto.setHeight(naviPose.getAlt());
-            history.add(historyPointDto);
-            redisService.setCacheList("VEHICLE_HISTORY_POINT_LIST:" + xpVehicle.getId(), history);
-
-            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);
-            }
-            //调用推送服务接口,给乘客推送剩余轨迹和里程时长
-            RtTripInfo rtTripInfo = systemRuntimeStatus.getRunningOrderStatusInfo().getRtTripInfo();
-            if (null != orderId && !order_id.contains("XU")) {
-                PushOrderRouteDTO dto = new PushOrderRouteDTO();
-                dto.setOrderId(orderId);
-                dto.setRouteType(1);
-                dto.setLongitude(longitude);
-                dto.setLatitude(latitude);
-                if (rtTripInfo.hasCurrentTask() && rtTripInfo.getCurrentTask().hasNaviProgressInfo()) {
-                    dto.setDuration(rtTripInfo.getCurrentTask().getNaviProgressInfo().getRouteRemainTime());
-                    dto.setDistance(rtTripInfo.getCurrentTask().getNaviProgressInfo().getRouteRemainDist());
-                    dto.setDirection(course.intValue());
-                }
-
-                OrderTrajectoryVo orderTrajectory = new OrderTrajectoryVo();
-                orderTrajectory.setOrderId(orderId);
-                orderTrajectory.setLocation(longitude + "," + latitude);
-                orderTrajectory.setDirection(dto.getDirection());
-                orderTrajectory.setSpeed((double) dynamicStatus.getSpeed());
-                orderTrajectory.setLocatetime(System.currentTimeMillis());
-                orderTrajectory.setCreateTime(new Date());
-                //只有乘客订单需要推送剩余导航数据
-                if(!order_id.contains("TEST")){
-                    xpPushMessageClient.pushOrderRoute(dto);//存储历史轨迹
-                    // 给连环派单的用户推送
-                    Long nextOrderId = redisService.getCacheObject(CacheConstants.nextOrder(order_id));
-                    if (null != nextOrderId){
-                        dto.setOrderId(nextOrderId);
-                        xpPushMessageClient.pushOrderRoute(dto);
-                    }
-                    xpOrderClient.saveVehicleLocation(orderTrajectory);
+            //车辆动态信息
+            VehicleDynamicStatus dynamicStatus = vehicleStatus.getDynamicStatus();
+            Long orderId = null;
+            Integer hasOrder = 0;
+            if (StringUtils.isNotEmpty(order_id)) {
+                if (order_id.contains("XU")) {
+                    hasOrder = 1;
+                    orderId = Long.parseLong(order_id.substring(2));
+                } else if(order_id.contains("TEST")) {
+                    orderId = Long.parseLong(order_id.substring(4));
                 }else{
-                    testOrderClient.saveVehicleLocation(orderTrajectory);
+                    orderId = Long.parseLong(order_id);
                 }
             }
+            //保存车辆实时信息到mongodb
+            if(0 != longitude && 0 != latitude){
+                //缓存车辆历史定位,用户辅助获取导航抓路用
+//            List<HistoryPointDto> history = redisService.getCacheList("VEHICLE_HISTORY_POINT_LIST:" + xpVehicle.getId());
+//            if(history.size() >= 10){
+//                history = new ArrayList<>(history.subList(history.size() - 9, history.size()));
+//            }
+//            HistoryPointDto historyPointDto = new HistoryPointDto();
+//            historyPointDto.setLocation(longitude + "," + latitude);
+//            historyPointDto.setLocateTime(System.currentTimeMillis() + "");
+//            historyPointDto.setAccuracy(naviPose.getPosAcc());
+//            historyPointDto.setDirection(new BigDecimal(course).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+//            historyPointDto.setSpeed(dynamicStatus.getSpeed());
+//            historyPointDto.setHeight(naviPose.getAlt());
+//            history.add(historyPointDto);
+//            redisService.setCacheList("VEHICLE_HISTORY_POINT_LIST:" + xpVehicle.getId(), history);
+
+                redisTemplate.opsForGeo().add("vehiclePosition:" + vin, new Point(longitude, latitude), vin);
+                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);
+                }
+                //调用推送服务接口,给乘客推送剩余轨迹和里程时长
+                RtTripInfo rtTripInfo = systemRuntimeStatus.getRunningOrderStatusInfo().getRtTripInfo();
+                if (null != orderId && !order_id.contains("XU")) {
+                    PushOrderRouteDTO dto = new PushOrderRouteDTO();
+                    dto.setOrderId(orderId);
+                    dto.setRouteType(1);
+                    dto.setLongitude(longitude);
+                    dto.setLatitude(latitude);
+                    if (rtTripInfo.hasCurrentTask() && rtTripInfo.getCurrentTask().hasNaviProgressInfo()) {
+                        dto.setDuration(rtTripInfo.getCurrentTask().getNaviProgressInfo().getRouteRemainTime());
+                        dto.setDistance(rtTripInfo.getCurrentTask().getNaviProgressInfo().getRouteRemainDist());
+                        dto.setDirection(course.intValue());
+                    }
+
+                    OrderTrajectoryVo orderTrajectory = new OrderTrajectoryVo();
+                    orderTrajectory.setOrderId(orderId);
+                    orderTrajectory.setLocation(longitude + "," + latitude);
+                    orderTrajectory.setDirection(dto.getDirection());
+                    orderTrajectory.setSpeed((double) dynamicStatus.getSpeed());
+                    orderTrajectory.setLocatetime(System.currentTimeMillis());
+                    orderTrajectory.setCreateTime(new Date());
+                    //只有乘客订单需要推送剩余导航数据
+                    if(!order_id.contains("TEST")){
+                        xpPushMessageClient.pushOrderRoute(dto);//存储历史轨迹
+                        // 给连环派单的用户推送
+                        Long nextOrderId = redisService.getCacheObject(CacheConstants.nextOrder(order_id));
+                        if (null != nextOrderId){
+                            dto.setOrderId(nextOrderId);
+                            xpPushMessageClient.pushOrderRoute(dto);
+                        }
+                        xpOrderClient.saveVehicleLocation(orderTrajectory);
+                    }else{
+                        testOrderClient.saveVehicleLocation(orderTrajectory);
+                    }
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }finally {
+            lock.unlock();
         }
     }
 
@@ -631,94 +648,31 @@
         LonLatDto destination = new LonLatDto();
         LonLatDto origin = new LonLatDto();
         RouteVo routeVo = null;
-        if (orderId.contains("XU")) {
-            orderType = OrderType.CRUISE_ORDER;
+        String key = "";
 
-            R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2)));
-            XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
 
-            //构建导航数据给到车端
-            origin.setLongitude(longitude);
-            origin.setLatitude(latitude);
-            destination.setLongitude(xpCruiseOrder.getEndLon());
-            destination.setLatitude(xpCruiseOrder.getEndLat());
-
-            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("获取订单线路和运费失败");
+        //添加redis锁,用于在发生偏航后重新规划线路与正常推送剩余导航数据之间的冲突
+        RLock lock = redissonClient.getLock("PUSH_ORDER_ROUTE_LOCK:" + orderId);
+        try {
+            boolean tryLock = lock.tryLock(10, 10, TimeUnit.SECONDS);
+            if(!tryLock){
+                log.info("获取锁失败,订单ID:{} 无法完成偏航后的逻辑处理。", orderId);
+                return;
             }
-            routeVo = routeVoR.getData();
-            routeID = routeVo.getRouteID();
+            if (orderId.contains("XU")) {
+                orderType = OrderType.CRUISE_ORDER;
 
-
-            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 (3 == testOrder.getStatus()) {
-                    //查询司机当前位置到起点的线路
-                    origin.setLongitude(longitude);
-                    origin.setLatitude(latitude);
-                    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(1);
-                    dto.setVehicleId(testOrder.getVehicleId());
-                    R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
-                    if (200 != routeVoR.getCode()) {
-                        throw new RuntimeException("获取订单线路和运费失败");
-                    }
-                    routeVo = routeVoR.getData();
-                    routeID = routeVo.getRouteID();
-                    //缓存数据,用于后续推给乘客导航线路
-                    redisService.setCacheObject("TEST_ORDER_NAVIGATION_START_DATA:" + testOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
-                }
-                //驶往下车点的行程
-                if (6 == testOrder.getStatus()) {
-                    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(2);
-                    R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
-                    if (200 != routeVoR.getCode()) {
-                        throw new RuntimeException("获取订单线路和运费失败");
-                    }
-                    routeVo = routeVoR.getData();
-                    routeID = routeVo.getRouteID();
-                    //缓存导航数据,用于后面的逻辑中给乘客端推送导航数据
-                    redisService.setCacheObject("TEST_ORDER_NAVIGATION_END_DATA:" + testOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
-                }
-
-            }else{
-                orderType = OrderType.TEST_CRUISE_ORDER;
+                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2)));
+                XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
 
                 //构建导航数据给到车端
                 origin.setLongitude(longitude);
                 origin.setLatitude(latitude);
-                destination.setLongitude(testOrder.getEndLon());
-                destination.setLatitude(testOrder.getEndLat());
+                destination.setLongitude(xpCruiseOrder.getEndLon());
+                destination.setLatitude(xpCruiseOrder.getEndLat());
 
                 OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
-                dto.setOrderId(Long.parseLong(orderId.substring(4)));
+                dto.setOrderId(Long.parseLong(orderId.substring(2)));
                 dto.setOrigin(origin);
                 dto.setDestination(destination);
                 dto.setRouteType(3);
@@ -729,90 +683,168 @@
                 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);
-                dto.setVehicleId(xpOrder.getVehicleId());
-                R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
-                if (200 != routeVoR.getCode()) {
-                    throw new RuntimeException("获取订单线路和运费失败");
-                }
-                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());
+                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 (3 == testOrder.getStatus()) {
+                        //查询司机当前位置到起点的线路
+                        origin.setLongitude(longitude);
+                        origin.setLatitude(latitude);
+                        destination.setLongitude(testOrder.getStartLon());
+                        destination.setLatitude(testOrder.getStartLat());
 
-                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 = 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)){
-            //推送小程序新的导航数据
-            if(orderType.equals(OrderType.USER_ORDER)){
-                PushOrderRouteDTO dto = new PushOrderRouteDTO();
-                dto.setOrderId(Long.parseLong(orderId));
-                dto.setRouteType(1);
-                dto.setLongitude(longitude);
-                dto.setLatitude(latitude);
-                if (null != routeVo) {
-                    dto.setDuration(null == routeVo.getDuration() ? 0 : routeVo.getDuration().doubleValue());
-                    dto.setDistance(null == routeVo.getDistance() ? 0 : routeVo.getDistance().doubleValue());
-                    dto.setDirection(null == routeVo.getDirection() ? 0 : routeVo.getDirection().intValue());
-                }
-                xpPushMessageClient.pushOrderRoute(dto);
-                log.info("完成小程序下发导航偏离后的新轨迹:" + orderId);
-            }
+                        OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
+                        dto.setOrderId(Long.parseLong(orderId.substring(4)));
+                        dto.setOrigin(origin);
+                        dto.setDestination(destination);
+                        dto.setRouteType(1);
+                        dto.setVehicleId(testOrder.getVehicleId());
+                        R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
+                        if (200 != routeVoR.getCode()) {
+                            throw new RuntimeException("获取订单线路和运费失败");
+                        }
+                        routeVo = routeVoR.getData();
+                        routeID = routeVo.getRouteID();
+                        key = "TEST_ORDER_NAVIGATION_START_DATA:" + testOrder.getVehicleId();
+                    }
+                    //驶往下车点的行程
+                    if (6 == testOrder.getStatus()) {
+                        origin.setLongitude(longitude);
+                        origin.setLatitude(latitude);
+                        destination.setLongitude(testOrder.getEndLon());
+                        destination.setLatitude(testOrder.getEndLat());
 
-            XpVehicle xpVehicle = xpVehicleClient.queryById(vehicleId).getData();
-            R<String> stringR = xpMapClient.queryRouted(routeID);
-            if (200 != stringR.getCode()) {
-                throw new RuntimeException("根据导航ID获取车端需要的导航数据失败");
+                        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 = routeVoR.getData();
+                        routeID = routeVo.getRouteID();
+                        key = "TEST_ORDER_NAVIGATION_END_DATA:" + testOrder.getVehicleId();
+                    }
+
+                }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("获取订单线路和运费失败");
+                    }
+                    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);
+                    dto.setVehicleId(xpOrder.getVehicleId());
+                    R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
+                    if (200 != routeVoR.getCode()) {
+                        throw new RuntimeException("获取订单线路和运费失败");
+                    }
+                    routeVo = routeVoR.getData();
+                    routeID = routeVo.getRouteID();
+                    key = "ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId();
+                }
+                //驶往下车点的行程
+                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 = routeVoR.getData();
+                    routeID = routeVo.getRouteID();
+                    key = "ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId();
+                }
+                vehicleId = xpOrder.getVehicleId();
             }
-            log.info("开始下发XPU导航偏离后新的导航数据:" + orderId);
-            //构建响应导航数据给车端
-            cloudPushNavigationInfo(requestId, routeID, stringR.getData(), orderType, orderId, xpVehicle.getVehicleVin(), xpVehicle.getXpuId(), taskId);
-            log.info("完成下发XPU导航偏离后新的导航数据:" + orderId);
+            //直接响应回最新导航数据
+            if(StringUtils.isNotEmpty(routeID)){
+                //推送小程序新的导航数据
+                if(orderType.equals(OrderType.USER_ORDER)){
+                    //缓存导航数据,用于后面的逻辑中给乘客端推送导航数据
+                    redisService.setCacheObject(key, JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+                    PushOrderRouteDTO dto = new PushOrderRouteDTO();
+                    dto.setOrderId(Long.parseLong(orderId));
+                    dto.setRouteType(1);
+                    dto.setLongitude(longitude);
+                    dto.setLatitude(latitude);
+                    if (null != routeVo) {
+                        dto.setDuration(null == routeVo.getDuration() ? 0 : routeVo.getDuration().doubleValue());
+                        dto.setDistance(null == routeVo.getDistance() ? 0 : routeVo.getDistance().doubleValue());
+                        dto.setDirection(null == routeVo.getDirection() ? 0 : routeVo.getDirection().intValue());
+                    }
+                    dto.setMessageType(PushMessageTypeEnum.ORDER_UPDATE_LINE.getDesc());
+                    xpPushMessageClient.pushOrderRoute(dto);
+                    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("开始下发XPU导航偏离后新的导航数据:" + orderId);
+                //构建响应导航数据给车端
+                cloudPushNavigationInfo(requestId, routeID, stringR.getData(), orderType, orderId, xpVehicle.getVehicleVin(), xpVehicle.getXpuId(), taskId);
+                log.info("完成下发XPU导航偏离后新的导航数据:" + orderId);
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }finally {
+            lock.unlock();
         }
     }
 

--
Gitblit v1.7.1