From 4f7fd9e879d9de211b255eb21535a034893ffbff Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期四, 14 五月 2026 16:20:48 +0800
Subject: [PATCH] 合并代码
---
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java | 101 ++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 96 insertions(+), 5 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 403e0a1..c6c90cd 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
@@ -7,6 +7,7 @@
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;
@@ -15,6 +16,8 @@
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.OrderMissionClient;
import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient;
import com.xiaopeng.api.feignClient.automaticPilot.VehicleBuriedPointClient;
import com.xiaopeng.api.feignClient.maintenance.XpTaskClient;
@@ -25,10 +28,13 @@
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.SubscribeMessageClient;
+import com.xiaopeng.api.feignClient.pushMessage.WebSocketMessageClient;
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.operation.XpSystemSetting;
+import com.xiaopeng.api.model.order.OrderTrajectory;
import com.xiaopeng.api.model.order.XpCruiseOrder;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.order.XpTestOrder;
@@ -38,6 +44,7 @@
import com.xiaopeng.api.vo.automaticPilot.protobuf.*;
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.api.vo.order.OrderTrajectoryVo;
+import com.xiaopeng.api.vo.pushMessage.UpdateEndAddStatusVo;
import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo;
import com.xiaopeng.automaticPilot.job.base.QuartzManager;
import com.xiaopeng.automaticPilot.job.base.TimeJobType;
@@ -49,6 +56,7 @@
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.exception.ServiceException;
import com.xiaopeng.common.core.utils.DateUtils;
import com.xiaopeng.common.core.utils.StringUtils;
import com.xiaopeng.common.core.utils.uuid.UUID;
@@ -91,6 +99,12 @@
private XpOrderClient xpOrderClient;
@Resource
+ private OrderMissionClient orderMissionClient;
+
+ @Resource
+ private XpCruiseOrderClient xpCruiseOrderClient;
+
+ @Resource
private MongoTemplate mongoTemplate;
@Resource
@@ -110,9 +124,6 @@
@Resource
private UserVehicleClient userVehicleClient;
-
- @Resource
- private XpCruiseOrderClient xpCruiseOrderClient;
@Resource
private RedisService redisService;
@@ -142,6 +153,9 @@
@Resource
private RedissonClient redissonClient;
+
+ @Resource
+ private WebSocketMessageClient webSocketMessageClient;
@Resource
private XpSystemSettingClient systemSettingClient;
@@ -320,7 +334,22 @@
}
dto.setXpVehicleVin(vin);
dto.setOrderType(orderType);
- xpOrderClient.popOrder(dto);
+ R<?> r = xpOrderClient.popOrder(dto);
+ if(200 != r.getCode()){
+ //业务执行失败,给差车端发送取消任务报文,继续执行巡游任务
+ PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setOrderId(orderId);
+ pushOrderDto.setVin(vin);
+ pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
+ orderMissionClient.cancelOrder(pushOrderDto);
+ log.info("用户取消订单成功,开始执行巡游订单 {}", orderId);
+ //车辆继续巡游
+ xpOrderClient.addNewCruiseMission(orderId);
+ log.error("处理车辆接单后的业务逻辑异常,车辆继续执行巡游 {}", orderId);
+ //放入队列,重新执行派单
+ xpOrderClient.againPushOrder(orderId);
+ return;
+ }
log.info("订单状态更新:{}", response.getResults(0).getOrderId());
}
} catch (InvalidProtocolBufferException e) {
@@ -462,6 +491,8 @@
orderTrajectory.setCreateTime(new Date());
//只有乘客订单需要推送剩余导航数据
if(!order_id.contains("TEST")){
+ //推送修改目的地权限状态
+ pushUpdateEndAddressStatus(orderId);
xpPushMessageClient.pushOrderRoute(dto);//存储历史轨迹
// 给连环派单的用户推送
String json = redisService.getCacheObject(CacheConstants.nextOrder(order_id));
@@ -486,7 +517,65 @@
}
+ /**
+ * 推送修改目的地权限状态
+ * @param orderId
+ */
+ private void pushUpdateEndAddressStatus(Long orderId){
+ XpOrder xpOrder = xpOrderClient.queryOrderById(orderId).getData();
+ Boolean hasKey = redisService.hasKey("UPDATE_END_ADDRESS_STATUS_MSG:" + xpOrder.getAppUserId());
+ if(hasKey){
+ return;
+ }
+ Integer status = 0;
+ if(xpOrder.getStatus() < 6){
+ status = 1;
+ }
+ if(xpOrder.getStatus() == 6){
+ XpSystemSetting xpSystemSetting = systemSettingClient.getSystemSettingOne().getData();
+ //行程中剩余里程
+ Integer xczSyDistance = xpSystemSetting.getXczSyDistance();
+ //行程中剩余时间
+ Integer xczSyTime = xpSystemSetting.getXczSyTime();
+ //行程中修改目地次数
+ Integer xczCaCount = xpSystemSetting.getXczCaCount();
+ //行程中豁免时速 km/h
+ Integer xczHmSpeedPerHour = xpSystemSetting.getXczHmSpeedPerHour();
+ //行程中豁免持续时间 分钟
+ Integer xczHmDuration = xpSystemSetting.getXczHmDuration();
+ Object cacheObject = redisService.getCacheObject("ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId());
+ if(null != cacheObject){
+ RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class);
+ //剩余时间 秒
+ Integer duration = routeVo.getDuration();
+ //剩余距离 米
+ Integer distance = routeVo.getDistance();
+ if(xczSyDistance < distance && xczSyTime * 60 < duration && xpOrder.getOrderChange() < xczCaCount){
+ status = 1;
+ }else{
+ //计算豁免
+ //计算平均时速小于设定值,可豁免限制
+ LocalDateTime localDateTime = LocalDateTime.now().minusMinutes(xczHmDuration);
+ List<OrderTrajectory> orderTrajectories = mongoTemplate.find(Query.query(Criteria.where("orderId").is(orderId).gt("createTime").is(localDateTime)), OrderTrajectory.class);
+ double speed = orderTrajectories.stream().map(OrderTrajectory::getSpeed).reduce(Double::sum).orElse(0D) / orderTrajectories.size();
+ if(speed <= xczHmSpeedPerHour){
+ status = 1;
+ }
+ }
+ }
+ }
+ UpdateEndAddStatusVo vo = new UpdateEndAddStatusVo();
+ vo.setAppUserId(xpOrder.getAppUserId());
+ JSONObject message = new JSONObject();
+ message.put("type", "UPDATE_END_ADDRESS_STATUS");
+ JSONObject content = new JSONObject();
+ content.put("status", status);
+ message.put("content", content);
+ message.put("timestamp", System.currentTimeMillis());
+ vo.setMessage(message.toString());
+ webSocketMessageClient.sendUpdateEndAddStatus(vo);
+ }
/**
* XPU发布系统运行状态---车辆实时位置
@@ -1160,7 +1249,8 @@
}
- @Resource OrderMissionClient orderMissionClient;
+
+
/**
* 订单状态更新事件
* @param msgContent
@@ -1570,6 +1660,7 @@
return JSON.parseObject(cacheObject.toString());
}
+
private JSONObject resolveReassignCancelContext(String orderId, OrderStatusInfo orderStatusInfo) {
if (OrderStateChangeSource.ORDER_STATE_CHANGE_SOURCE_VEHICLE != orderStatusInfo.getChangeSource()) {
return null;
--
Gitblit v1.7.1