From c98d3f2fc620b3f5d699e2be34eaabc1033b42b2 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 11 三月 2026 16:17:32 +0800
Subject: [PATCH] 修改巡游订单部分逻辑
---
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java | 122 +++++++++++++++++++++++-----------------
1 files changed, 71 insertions(+), 51 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 6602ed1..1267084 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,6 +1,6 @@
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;
@@ -14,6 +14,10 @@
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.feignClient.account.XpOperationUserClient;
+import com.xiaopeng.api.feignClient.account.XpOperationUserNotificationClient;
+import com.xiaopeng.api.feignClient.maintenance.XpTaskClient;
+import com.xiaopeng.api.feignClient.maintenance.XpTaskRuleClient;
import com.xiaopeng.api.feignClient.map.XpMapClient;
import com.xiaopeng.api.feignClient.operation.ReassignOrderClient;
import com.xiaopeng.api.feignClient.operation.XpCruisePlanClient;
@@ -21,13 +25,13 @@
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.XpFleetOperationsClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetVehicleClient;
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.XpFleet;
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.operation.RouteVo;
@@ -37,18 +41,17 @@
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.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.mongodb.core.query.UpdateDefinition;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@@ -100,6 +103,15 @@
@Resource
private XpCruisePlanClient xpCruisePlanClient;
+
+ @Resource
+ private Snowflake snowflake;
+
+ @Value("${robotaxi.appId:xp_robotaxi_api}")
+ private String appid;
+
+ @Resource
+ private XpTaskClient xpTaskClient;
private static final com.google.protobuf.util.JsonFormat.Printer jsonPrinter = com.google.protobuf.util.JsonFormat.printer()
.printingEnumsAsInts()
@@ -377,35 +389,52 @@
int value = gearLevel.getNumber();
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.updateCruiseOrderId(Long.parseLong(orderId.substring(2)));
+ XpCruiseOrder cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2))).getData();
+ vehicle = xpVehicleClient.queryById(cruiseOrder.getVehicleId()).getData();
+ if (vehicle != null) {
+ // 修改车辆状态
+ vehicle.setOperatingStatus(4);
+ xpVehicleClient.updateVehicleById(vehicle);
+ }
+ }else{
+ //正常订单
+ XpOrder xpOrder = xpOrderClient.queryOrderById(Long.parseLong(orderId)).getData();
+ vehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
+ if (vehicle != null) {
+ // 修改车辆状态
+ vehicle.setState(0);
+ vehicle.setOperatingStatus(4);
+ xpVehicleClient.updateVehicleById(vehicle);
+ // 解绑用户与车辆关系
+ 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());
}
}
@@ -475,7 +504,7 @@
if (orderId.contains("XU")) {
// orderType = OrderType.CRUISE_ORDER;
- R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(orderId);
+ R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2)));
XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
//先响应消息
@@ -591,7 +620,7 @@
//巡游单
if (orderPhase.equals(OrderPhase.ROUTE_TO_CRUISE)) {
/* 构建导航数据给到车端 */
- R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(orderId);
+ R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2)));
XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
origin.setLongitude(xpCruiseOrder.getStartLon());
@@ -738,9 +767,7 @@
}
orderOperationBuilder.addAllWaypoints(waypoints);
- SnowFlake snowFlake = new SnowFlake(0, 0);
- snowFlake.withStartTimestamp(1420041600000L);
- long sequence = snowFlake.nextId();
+ long sequence = snowflake.nextId();
// 处理数据
redisService.setCacheObject(sequence + "","pushOrder_"+orderId+"_"+vin,30L, TimeUnit.MINUTES);
//开发发送请求到XPU
@@ -892,7 +919,7 @@
// 返程找到目前的订单 -》之前的订单 查询生成一个 正常巡游 找到下一个点位 若到达最后点位 则反向找点位 每次判断是否收车状态 是则不进行处理了
// 找到这个订单
- 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();
@@ -909,13 +936,13 @@
XpCruiseOrder lastXpCruiseOrder = lastOrder.getData();
// 修改一下id 加一个一样的巡游单子
- lastXpCruiseOrder.setId("XU"+ IdUtil.fastUUID());
+ lastXpCruiseOrder.setId(null);
lastXpCruiseOrder.setStatus(1);
xpCruiseOrderClient.addCruiseOrder(lastXpCruiseOrder);
//构建下发XPU订单报文数据
RtTask.Builder taskBuilder = RtTask.newBuilder();
- taskBuilder.setOrderId(lastXpCruiseOrder.getId());
- taskBuilder.setTaskId("MISSION_"+ IdUtil.fastUUID());
+ taskBuilder.setOrderId("XU" + lastXpCruiseOrder.getId());
+ taskBuilder.setTaskId(snowflake.nextId() + "");
taskBuilder.setTaskType(com.xiaopeng.api.vo.automaticPilot.protobuf.OrderType.ORDER_TYPE_CRUISE);
//构建点位信息
Waypoint.Builder pointBuilder = Waypoint.newBuilder();
@@ -932,9 +959,7 @@
RtTask task = taskBuilder.build();
RtTaskList taskList = RtTaskList.newBuilder().addTasks(task).build();
- SnowFlake snowFlake = new SnowFlake(0, 0);
- snowFlake.withStartTimestamp(1420041600000L);
- long sequence1 = snowFlake.nextId();
+ long sequence1 = snowflake.nextId();
xpuUtil.cloudCreateOrder(taskList, xpVehicle.getVehicleVin(),sequence1);
}else if(xpCruiseOrder.getOrderType()==1){
// 正常巡游 找到下一个点位 若到达最后点位 则反向找点位
@@ -942,7 +967,6 @@
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());
@@ -966,8 +990,8 @@
xpCruiseOrderClient.addCruiseOrder(cruisePoint.getData());
RtTask.Builder taskBuilder = RtTask.newBuilder();
- taskBuilder.setOrderId(newXpCruiseOrder.getId());
- taskBuilder.setTaskId("MISSION_"+ IdUtil.fastUUID());
+ taskBuilder.setOrderId("XU" + newXpCruiseOrder.getId());
+ taskBuilder.setTaskId(snowflake.nextId() + "");
taskBuilder.setTaskType(com.xiaopeng.api.vo.automaticPilot.protobuf.OrderType.ORDER_TYPE_CRUISE);
//构建点位信息
@@ -985,9 +1009,7 @@
RtTaskList.Builder taskListBuilder = RtTaskList.newBuilder();
taskListBuilder.addTasks(taskBuilder.build());
- SnowFlake snowFlake = new SnowFlake(0, 0);
- snowFlake.withStartTimestamp(1420041600000L);
- long sequence1 = snowFlake.nextId();
+ long sequence1 = snowflake.nextId();
xpuUtil.cloudCreateOrder(taskListBuilder.build(), xpVehicle.getVehicleVin(),sequence1);
}
}
@@ -1038,9 +1060,7 @@
navigationDataBuilder.setRequestId(requestId);
navigationDataBuilder.setContent(routeDataContent);
navigationDataBuilder.setTimestamp(System.currentTimeMillis());
- SnowFlake snowFlake = new SnowFlake(0, 0);
- snowFlake.withStartTimestamp(1420041600000L);
- long sequence = snowFlake.nextId();
+ long sequence = snowflake.nextId();
log.info("开始推送导航数据 {}", orderId);
MqttPublishDto mqttPublishDto = xpuUtil.cloudPushNavigation(navigationDataBuilder.build(), xpuId, sequence);
log.info("推送导航的响应消息,{}", JSON.toJSONString(mqttPublishDto));
--
Gitblit v1.7.1