xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/automaticPilot/PushOrderDto.java
@@ -12,6 +12,9 @@ @AllArgsConstructor @NoArgsConstructor public class PushOrderDto { @ApiModelProperty("任务id") private String taskId; @ApiModelProperty("车辆vin") private String vin; @@ -41,4 +44,7 @@ * 订单操作类型 */ private OrderOperationType operation_type; @ApiModelProperty("取消场景") private String cancelScene; } xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -26,6 +26,7 @@ import com.xiaopeng.api.vo.order.OrderTrajectoryVo; import com.xiaopeng.automaticPilot.util.XPUUtil; 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; @@ -276,9 +277,10 @@ @PostMapping("/inner/cancelOrder") R<Boolean> cancelOrder(@RequestBody PushOrderDto dto) { String taskId = StringUtils.isNotEmpty(dto.getTaskId()) ? dto.getTaskId() : snowflake.nextId() + ""; OrderOperation.Builder operationBuilder = OrderOperation.newBuilder(); operationBuilder.setOrderId(dto.getOrderId().toString()); operationBuilder.setTaskId(snowflake.nextId() + ""); operationBuilder.setTaskId(taskId); if (dto.getOperation_type() != null) { operationBuilder.setOperationType(OrderOperationType.forNumber(dto.getOperation_type().getNumber())); } @@ -288,8 +290,16 @@ if (mqttPublishDto.getCode() == 200) { if(!dto.getOrderId().contains("XU")){ // 正常订单处理 redisService.setCacheObject(String.valueOf(sequence), "cancelOrder_" + dto.getOrderId() + "_" + dto.getVin(), 30l, TimeUnit.MINUTES); Map<String, Object> cancelContext = new HashMap<>(); cancelContext.put("orderId", dto.getOrderId()); cancelContext.put("vin", dto.getVin()); cancelContext.put("cancelScene", StringUtils.isNotEmpty(dto.getCancelScene()) ? dto.getCancelScene() : CancelOrderSceneEnum.NORMAL_CANCEL.getCode()); redisService.setCacheObject("CANCEL_ORDER_CONTEXT:" + taskId, JSONObject.toJSONString(cancelContext), 30L, TimeUnit.MINUTES); log.info("记录取消订单上下文成功,orderId: {}, vin: {}, taskId: {}, cancelScene: {}", dto.getOrderId(), dto.getVin(), taskId, cancelContext.get("cancelScene")); } return R.ok(true); } 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; @@ -1162,6 +1165,15 @@ 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("TEST_ORDER_STATUS:" + orderId.substring(4)); @@ -1370,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 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -59,6 +59,7 @@ import com.xiaopeng.common.core.constant.Constants; import com.xiaopeng.common.core.constant.HttpStatus; 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.exception.ServiceException; @@ -962,11 +963,14 @@ // 6.1.1 取消原订单指令 PushOrderDto cancelDto = new PushOrderDto(); cancelDto.setTaskId(IdUtil.getSnowflakeNextIdStr()); cancelDto.setOrderId(order.getId().toString()); cancelDto.setVin(oldVehicle.getVehicleVin()); cancelDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER); cancelDto.setCancelScene(CancelOrderSceneEnum.REASSIGN_OLD_VEHICLE.getCode()); orderMissionClient.cancelOrder(cancelDto); log.info("已取消原车辆订单指令,订单ID: {}, VIN: {}", orderId, oldVehicle.getVehicleVin()); log.info("已取消原车辆订单指令,订单ID: {}, VIN: {}, taskId: {}, cancelScene: {}", orderId, oldVehicle.getVehicleVin(), cancelDto.getTaskId(), cancelDto.getCancelScene()); // 6.1.2 解绑乘客与原车辆关系 if (Objects.nonNull(order.getAppUserId())) {