From 9adef3dd7723930d44f72713c3cf28e50b002055 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期三, 01 四月 2026 15:45:19 +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 | 303 ++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 233 insertions(+), 70 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 73ad12f..b79d9e2 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
@@ -42,6 +42,7 @@
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.StringUtils;
@@ -71,6 +72,8 @@
@Slf4j
@Service
public class KafkaConsumerService {
+ private static final String CANCEL_ORDER_CONTEXT_PREFIX = "CANCEL_ORDER_CONTEXT:";
+
@Resource
private XpMapClient xpMapClient;
@@ -441,6 +444,7 @@
}
}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) {
@@ -591,6 +595,79 @@
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);
+ 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);
+ }
+ //驶往下车点的行程
+ 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 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;
+
+ //构建导航数据给到车端
+ 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 routeVo = routeVoR.getData();
+ routeID = routeVo.getRouteID();
+
+ vehicleId = testOrder.getVehicleId();
+ }
} else {
orderType = OrderType.USER_ORDER;
//正常单
@@ -701,77 +778,100 @@
vehicleId = xpCruiseOrder.getVehicleId();
}
} else if(orderId.contains("TEST")){
- orderType = OrderType.TEST_ORDER;
- //正常单
- R<XpTestOrder> xpOrderR = testOrderClient.queryOrderById(Long.parseLong(orderId.substring(4)));
- if (200 != xpOrderR.getCode()) {
- throw new RuntimeException("订单不存在 " + orderId);
- }
- XpTestOrder xpOrder = xpOrderR.getData();
- XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
- //驶往上车点的行程
- if (orderPhase.equals(OrderPhase.ROUTE_TO_PICKUP)) {
- //直接取缓存中的导航数据推送给车端和乘客
- Object cacheObject = redisService.getCacheObject("TEST_ORDER_NAVIGATION_START_DATA:" + xpOrder.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("车辆位置信息不存在");
+ 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();
}
- origin.setLongitude(vehiclePosition.getPoint().getX());
- origin.setLatitude(vehiclePosition.getPoint().getY());
- destination.setLongitude(xpOrder.getStartLon());
- destination.setLatitude(xpOrder.getStartLat());
+ }
+ //驶往下车点的行程
+ 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));
+ dto.setOrderId(Long.parseLong(orderId.substring(4)));
dto.setOrigin(origin);
dto.setDestination(destination);
- dto.setRouteType(2);
+ dto.setRouteType(3);
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:" + xpOrder.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:" + xpOrder.getVehicleId());
- 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);
- 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:" + xpOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
- }else{
- RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class);
- routeID = routeVo.getRouteID();
- }
- }
- vehicleId = xpOrder.getVehicleId();
+ vehicleId = testOrder.getVehicleId();
}else{
orderType = OrderType.USER_ORDER;
//正常单
@@ -1024,10 +1124,6 @@
case ORDER_DROPOFF_COMPLETED:
//下车完成,不需要处理状态,由后续的乘客主动触发或者定时任务触发
log.info("乘客已下车,不做任何处理:{}", orderId);
-// if(!orderId.contains("XU")){
-// buildPushOrderStatus(orderId, OrderStatusEnum.APPROVAL_REJECTION, sequence);
-// xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.APPROVAL_REJECTION.getCode());
-// }
break;
case ORDER_COMPLETED:
//已完成
@@ -1069,17 +1165,36 @@
case ORDER_CANCELLED:
//已取消
if(!orderId.contains("XU")){
+ String taskId = orderStatusInfo.getTaskId();
+ JSONObject cancelContext = getCancelOrderContext(taskId);
+ if (shouldSkipCancelForReassign(cancelContext)) {
+ log.info("改派旧车取消回调,跳过订单取消处理,orderId: {}, taskId: {}, cancelScene: {}, context: {}",
+ orderId, taskId, cancelContext.getString("cancelScene"), cancelContext);
+ //响应消息
+ responseMessage(sequence, cancelContext.getString("vin"));
+ return;
+ }
if(orderId.contains("TEST")){
//判断订单状态,已经取消的不作处理
- Object cacheObject = redisService.getCacheObject("ORDER_STATUS:" + orderId.substring(4));
+ 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;
+ }
//行程中取消订单,按照行程结束处理
- testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
+ 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);
@@ -1089,9 +1204,20 @@
return;
}
}
- //行程中取消订单,按照行程结束处理
- buildPushOrderStatus(orderId, OrderStatusEnum.SEE_OFF_GUESTS, sequence);
- xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
+ 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.substring(4), 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.substring(4), OrderStatusEnum.CANCELED.getCode(), 24L, TimeUnit.HOURS);
+ }
}
}
break;
@@ -1132,8 +1258,16 @@
}
}
}else if(orderId.contains("TEST")){
- //测试巡游单处理逻辑
- testOrderClient.updateOrderStatus(Long.parseLong(orderId.substring(4)), OrderStatusEnum.COMPLETED.getCode());
+ //测试巡游单完成状态
+ 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:
@@ -1248,6 +1382,35 @@
}
/**
+ * 根据taskId获取订单取消的上下文信息
+ * @param taskId
+ * @return
+ */
+ private JSONObject getCancelOrderContext(String taskId) {
+ if (StringUtils.isEmpty(taskId)) {
+ return null;
+ }
+ Object cacheObject = redisService.getCacheObject(CANCEL_ORDER_CONTEXT_PREFIX + taskId);
+ if (cacheObject == null) {
+ return null;
+ }
+ return JSON.parseObject(cacheObject.toString());
+ }
+
+ /**
+ * 判断是否是改派旧车取消回调,是则跳过订单取消处理
+ * @param cancelContext
+ * @return
+ */
+ private boolean shouldSkipCancelForReassign(JSONObject cancelContext) {
+ if (cancelContext == null) {
+ return false;
+ }
+ return CancelOrderSceneEnum.REASSIGN_OLD_VEHICLE == CancelOrderSceneEnum.fromCode(
+ cancelContext.getString("cancelScene"));
+ }
+
+ /**
* 云端下发导航到XPU
* @param requestId XPU请求id
* @param routeId 高德导航id
--
Gitblit v1.7.1