From 5cad6611646e3b2fce100b4ed97c5e4511893620 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期三, 25 二月 2026 16:55:02 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java | 150 ++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 126 insertions(+), 24 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 d52dcaf..1a3149a 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,8 +1,10 @@
package com.xiaopeng.automaticPilot.service;
import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
+import com.xiaopeng.api.dto.automaticPilot.MqttPublishDto;
import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.dto.operation.ReassignOrderDTO;
@@ -11,16 +13,21 @@
import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
import com.xiaopeng.api.feignClient.map.XpMapClient;
import com.xiaopeng.api.feignClient.operation.ReassignOrderClient;
+import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient;
import com.xiaopeng.api.feignClient.order.XpOrderClient;
import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
+import com.xiaopeng.api.model.order.XpCruiseOrder;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.api.vo.automaticPilot.proto.down.GeoPoint;
import com.xiaopeng.api.vo.automaticPilot.proto.down.ResponseMessage;
import com.xiaopeng.api.vo.automaticPilot.proto.down.StatusCode;
+import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudCreateOrder.RTTask;
+import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudCreateOrder.TaskStatus;
+import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudCreateOrder.TaskType;
import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudOrderOperation.*;
import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudPushNavigation.RestoreNavigationData;
import com.xiaopeng.api.vo.automaticPilot.proto.up.MessageType;
@@ -41,8 +48,10 @@
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.enums.OrderStatusEnum;
import com.xiaopeng.common.core.enums.PushMessageTypeEnum;
+import com.xiaopeng.common.core.utils.SnowFlake;
import com.xiaopeng.common.core.utils.StringUtils;
import com.xiaopeng.common.core.utils.uuid.UUID;
+import com.xiaopeng.common.redis.service.RedisService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
@@ -91,7 +100,12 @@
private UserVehicleClient userVehicleClient;
@Resource
+ private XpCruiseOrderClient xpCruiseOrderClient;
+
+ @Resource
private Snowflake snowflake;
+ @Autowired
+ private RedisService redisService;
/**
@@ -249,7 +263,8 @@
//车辆动态信息
VehicleDynamicStatus dynamicStatus = vehicleStatus.getDynamic_status();
dynamicStatus.setSpeed(dynamicStatus.getSpeed());
- vehiclePosition.setCurrentElectricity(dynamicStatus.getBattery_level());
+ vehiclePosition.setCurrentElectricity(dynamicStatus.getBms_soc_disp());
+ vehiclePosition.setMileageRange(dynamicStatus.getDst_bat_disp());
//订单信息
OrderStatusInfo runningOrderStatusInfo = systemRuntimeStatus.getRunning_order_status_info();
Long orderId = null;
@@ -464,17 +479,37 @@
//订单类型 1:乘客订单,2=巡游订单
LonLatDto destination = new LonLatDto();
LonLatDto origin = new LonLatDto();
+ //导航id
+ String routeID = "";
+ Long vehicleId = null;
if (orderId.contains("XU")) {
// todo 下发巡游单的导航数据
//巡游单
if (orderPhase.equals(OrderPhase.ROUTE_TO_CRUISE)) {
- origin.setLongitude(116.40528);
- origin.setLatitude(39.90498);
- destination.setLongitude(116.40528);
- destination.setLatitude(39.90498);
-
//先响应消息
responseMessage(sequence, "");
+ /* 构建导航数据给到车端 */
+ R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(orderId);
+ XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
+
+ origin.setLongitude(xpCruiseOrder.getStartLon());
+ origin.setLatitude(xpCruiseOrder.getStartLat());
+ 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();
+
+
+// vehicleId = xpOrder.getVehicleId();
}
} else {
//正常单
@@ -498,31 +533,57 @@
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();
}
//驶往下车点的行程
if (orderPhase.equals(OrderPhase.ROUTE_TO_DESTINATION)) {
- //查询起点到终点的线路
- origin.setLongitude(xpOrder.getStartLon());
- origin.setLatitude(xpOrder.getStartLat());
- destination.setLongitude(xpOrder.getEndLon());
- destination.setLatitude(xpOrder.getEndLat());
+ //直接取缓存中的导航数据推送给车端和乘客
+ Object cacheObject = redisService.getCacheObject("ORDER_NAVIGATION_DATA:" + xpOrder.getAppUserId());
+ if(null == cacheObject){
+ //没有缓存数据,重新规划线路
+ //查询起点到终点的线路
+ origin.setLongitude(xpOrder.getStartLon());
+ origin.setLatitude(xpOrder.getStartLat());
+ destination.setLongitude(xpOrder.getEndLon());
+ destination.setLatitude(xpOrder.getEndLat());
+ OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
+ dto.setOrderId(Long.parseLong(orderId));
+ dto.setOrigin(origin);
+ dto.setDestination(destination);
+ R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
+ if (200 != routeVoR.getCode()) {
+ throw new RuntimeException("获取订单线路和运费失败");
+ }
+ RouteVo routeVo = routeVoR.getData();
+ routeID = routeVo.getRouteID();
+ //缓存导航数据,用于后面的逻辑中给乘客端推送导航数据
+ redisService.setCacheObject("ORDER_NAVIGATION_DATA:" + xpOrder.getAppUserId(), com.alibaba.fastjson.JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+ }else{
+ RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class);
+ routeID = routeVo.getRouteID();
+ }
}
- 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("获取订单线路和运费失败");
- }
- XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
- RouteVo routeVo = routeVoR.getData();
- R<String> stringR = xpMapClient.queryRouted(routeVo.getRouteID());
+ 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, routeVo.getRouteID(), stringR.getData(), orderId, xpVehicle.getVehicleVin(), xpVehicle.getXpuId());
+ cloudPushNavigationInfo(requestId, routeID, stringR.getData(), orderId, xpVehicle.getVehicleVin(), xpVehicle.getXpuId());
}
}
@@ -687,7 +748,6 @@
if(orderId.contains("XU")){
//巡游单
//响应消息
- // TODO 1.处理结束当前巡游订单 2.创建新的巡游订单 返航 3.调用xpu车机接口 (判断是返航还是正常 返航需要存储之前的订单id)
responseMessage(sequence, "");
//前往目的地
if(OrderStatusEnum.IN_SERVICE.equals(status)){
@@ -696,6 +756,48 @@
//到达目的地
if(OrderStatusEnum.COMPLETED.equals(status)){
+ // 返程找到目前的订单 -》之前的订单 查询生成一个 正常巡游 找到下一个点位 若到达最后点位 则反向找点位 每次判断是否收车状态 是则不进行处理了
+ // 找到这个订单
+ R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(orderId);
+ if(cruiseOrder!=null){
+ XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
+ Long vehicleId = xpCruiseOrder.getVehicleId();
+
+ // 关闭当前巡游单子 已完成
+ xpCruiseOrderClient.closeCruiseOrder(xpCruiseOrder.getVehicleVin());
+ R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(vehicleId);
+ XpVehicle xpVehicle = xpVehicleR.getData();
+ // 运营中 继续执行
+ if(xpVehicle.getOperatingStatus()==1 && xpVehicle.getState()==0){
+ // 创建新的巡游单子 判断是否为返程单子
+ if(xpCruiseOrder.getOrderType()==2){
+ R<XpCruiseOrder> lastOrder = xpCruiseOrderClient.getCruiseOrder(xpCruiseOrder.getLastOrderId());
+ XpCruiseOrder lastXpCruiseOrder = lastOrder.getData();
+
+ // 修改一下id 加一个一样的巡游单子
+ lastXpCruiseOrder.setId("XU"+ IdUtil.fastUUID());
+ lastXpCruiseOrder.setStatus(1);
+ xpCruiseOrderClient.addCruiseOrder(lastXpCruiseOrder);
+
+
+ RTTask task = new RTTask();
+ task.setOrder_id(lastXpCruiseOrder.getId());
+ task.setTask_id("MISSION_"+ IdUtil.fastUUID());
+ task.setTask_type(TaskType.CRUISE);
+ task.setStatus(TaskStatus.PENDING);
+ SnowFlake snowFlake = new SnowFlake(0, 0);
+ snowFlake.withStartTimestamp(1420041600000L);
+ long sequence1 = snowFlake.nextId();
+ xpuUtil.cloudCreateOrder(task, xpVehicle.getVehicleVin(),sequence1);
+ }else if(xpCruiseOrder.getOrderType()==1){
+ // 正常巡游 找到下一个点位 若到达最后点位 则反向找点位 TODO v
+
+
+ }
+
+ }
+
+ }
}
}else{
//普通单
--
Gitblit v1.7.1