From 0bcfca6b2561d096a2ce26e2e7200cd0768b2b6d Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 12 五月 2026 09:27:03 +0800
Subject: [PATCH] Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0
---
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java | 136 +++++++++++++++++++++++++--------------------
1 files changed, 75 insertions(+), 61 deletions(-)
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
index c8f72f0..4cad90b 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -57,6 +57,7 @@
import javax.annotation.Resource;
import java.time.LocalDateTime;
+import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
@@ -406,6 +407,8 @@
PushOrderDto pushOrderDto = new PushOrderDto();
pushOrderDto.setVin(priorityVin);
pushOrderDto.setOrderId(orderCheck.getData().getId().toString());
+ pushOrderDto.setStartWaypointId(orderCheck.getData().getStartPointId());
+ pushOrderDto.setEndWaypointId(orderCheck.getData().getEndPointId());
pushOrderDto.setStartLatitude(orderCheck.getData().getStartLat());
pushOrderDto.setStartLongitude(orderCheck.getData().getStartLon());
pushOrderDto.setEndLatitude(orderCheck.getData().getEndLat());
@@ -1091,6 +1094,8 @@
PushOrderDto pushOrderDto = new PushOrderDto();
pushOrderDto.setVin(vehiclePosition.getVehicleVin());
pushOrderDto.setOrderId(xpOrder.getId().toString());
+ pushOrderDto.setStartWaypointId(xpOrder.getStartPointId());
+ pushOrderDto.setEndWaypointId(xpOrder.getEndPointId());
pushOrderDto.setStartLatitude(xpOrder.getStartLat());
pushOrderDto.setStartLongitude(xpOrder.getStartLon());
pushOrderDto.setEndLatitude(xpOrder.getEndLat());
@@ -1156,6 +1161,8 @@
PushOrderDto pushOrderDto = new PushOrderDto();
pushOrderDto.setVin(vehiclePosition.getVin());
pushOrderDto.setOrderId(xpOrder.getId().toString());
+ pushOrderDto.setStartWaypointId(xpOrder.getStartPointId());
+ pushOrderDto.setEndWaypointId(xpOrder.getEndPointId());
pushOrderDto.setStartLatitude(xpOrder.getStartLat());
pushOrderDto.setStartLongitude(xpOrder.getStartLon());
pushOrderDto.setEndLatitude(xpOrder.getEndLat());
@@ -1188,79 +1195,76 @@
if (servingVehicles.getCode() != 200) {
continue;
}
-
- LonLatDto userPostion = new LonLatDto(Double.parseDouble(split[0]), Double.parseDouble(split[1]));
+ log.info("连环派单查询车辆结果 {} {}", orderNo, JSON.toJSONString(servingVehicles.getData()));
XpTradingStrategyDetailVO strategyDetailVO = tradingStrategyClient.queryById().getData();
-
+ log.info("连环排查推单逻辑 {} {}", orderNo, JSON.toJSONString(strategyDetailVO));
Integer distanceRegardAsEnding = strategyDetailVO.getDistanceRegardAsEnding();
Integer timeRegardAsEnding = strategyDetailVO.getTimeRegardAsEnding();
Integer backupPower = strategyDetailVO.getBackupPower();
Integer destToPassenger = strategyDetailVO.getDestToPassenger();
Integer endingTimeToUseTime = strategyDetailVO.getEndingTimeToUseTime();
- LocalDateTime rideTime = xpOrder.getRideTime();
- LocalDateTime now = LocalDateTime.now();
- Optional<XpOrder> luckyOrderOpt = servingVehicles.getData().stream()
- //获取位置
- .map(vin -> mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class))
- .map(VehiclePosition::getOrderId)
- .map(xpOrderClient::queryOrderById)
- .filter(R::isSuccess)
- .map(R::getData)
- .filter(o -> {
- XpVehicle xpVehicle = xpVehicleClient.queryById(o.getVehicleId()).getData();
- Object cacheObject = redisService.getCacheObject(CacheConstants.navigationEnd(o.getAppUserId().toString()));
- RouteVo routeRemain = JSON.parseObject(cacheObject.toString(), RouteVo.class);
- if (routeRemain.getDuration() / 60 > timeRegardAsEnding) {
- return false;
- }
- if (routeRemain.getDistance() > distanceRegardAsEnding) {
- return false;
- }
- RouteAndFareDto next = new RouteAndFareDto();
- next.setOrigin(new LonLatDto(o.getStartLon(),o.getStartLat()));
- next.setDestination(new LonLatDto(o.getEndLon(),o.getEndLat()));
- RouteVo route = xpMapClient.getDistanceAndDuration(next).getData();
- if (route.getDistance() > backupPower + xpVehicle.getMileageRange())
- return false;
- return routeRemain.getDistance() < destToPassenger
- || now.plusSeconds(routeRemain.getDuration())
- .plusMinutes(endingTimeToUseTime)
- .isBefore(rideTime);
- })
- .findAny();
- if (luckyOrderOpt.isPresent()) {
- XpOrder luckyOder = luckyOrderOpt.get();
- log.info("有空闲车辆 {} 订单 {}", luckyOder.getOrderNumber(), orderNo);
- XpVehicle xpVehicle = xpVehicleClient.queryById(luckyOder.getVehicleId()).getData();
- // 设置路线信息
- RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
- routeAndFareDto.setDestination(userPostion);
- routeAndFareDto.setOrigin(new LonLatDto(luckyOder.getEndLon(),luckyOder.getEndLat()));
- RouteVo routeToOrigin = xpMapClient.getDistanceAndDuration(routeAndFareDto).getData();
- Object cacheObject = redisService.getCacheObject(CacheConstants.navigationEnd(luckyOder.getAppUserId().toString()));
+ for (String vin : servingVehicles.getData()) {
+ VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
+ if(null == vehiclePosition){
+ log.info("连环派单 {} 车辆查询定位数据失败 {}", vin, orderNo);
+ continue;
+ }
+ XpOrder xpOrder1 = xpOrderClient.queryOrderById(vehiclePosition.getOrderId()).getData();
+ Object cacheObject = redisService.getCacheObject(CacheConstants.navigationEnd(xpOrder1.getAppUserId().toString()));
RouteVo routeRemain = JSON.parseObject(cacheObject.toString(), RouteVo.class);
- routeToOrigin.getPolyline().addAll(0, routeRemain.getPolyline());
- routeToOrigin.setDuration(routeToOrigin.getDuration() + routeRemain.getDuration());
- routeToOrigin.setDistance(routeToOrigin.getDistance() + routeRemain.getDistance());
+ if (routeRemain.getDuration() / 60 > timeRegardAsEnding && routeRemain.getDistance() / 1000 > distanceRegardAsEnding) {
+ log.info("连环派单 {} 车辆订单结束时间不满足条件 {} 秒 {} 米 {}", vin, routeRemain.getDuration(), routeRemain.getDistance(), orderNo);
+ continue;
+ }
- //此处找到车后先不忙给车推送接单消息,先修改订单上的车辆信息
- xpOrder.setVehicleId(xpVehicle.getId());
- xpOrder.setAcceptanceTime(LocalDateTime.now());
- xpOrder.setStatus(2);
- xpOrderClient.updateOrder(xpOrder);
+ //剩余里程》=下一单预估里程+50
+ //预估接驾行程+送驾行程
+ RouteAndFareDto next = new RouteAndFareDto();
+ next.setOrigin(new LonLatDto(xpOrder1.getEndLon(),xpOrder1.getEndLat()));
+ next.setDestination(new LonLatDto(xpOrder.getStartLon(),xpOrder.getStartLat()));
+ RouteVo route = xpMapClient.getDistanceAndDuration(next).getData();
+ Object new_cacheObject = redisService.getCacheObject(CacheConstants.navigationEnd(xpOrder.getAppUserId().toString()));
+ RouteVo new_routeRemain = JSON.parseObject(new_cacheObject.toString(), RouteVo.class);
+ long xh = (new_routeRemain.getDistance() + route.getDistance()) / 1000 + backupPower;
+ if(vehiclePosition.getMileageRange() < xh){
+ log.info("连环派单 {} 车辆剩余续航不满足派车条件 {} KM {}", vin, xh, orderNo);
+ continue;
+ }
- JSONObject jsonObject = new JSONObject();
- jsonObject.put("orderId", xpOrder.getId());
- jsonObject.put("endLongitude", xpOrder.getEndLat());
- jsonObject.put("endLatitude", xpOrder.getEndLat());
- redisService.setCacheObject(CacheConstants.nextOrder(luckyOder.getId().toString()), jsonObject.toJSONString());
- redisService.setCacheObject(CacheConstants.navigationStart(xpOrder.getAppUserId().toString()), routeToOrigin);
- redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
- log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
- break;
+ //下一单的起点距离本单终点小于X公里,或者下一单的用车时间与本单的预计结束时间偏差小于X分钟
+ next = new RouteAndFareDto();
+ next.setOrigin(new LonLatDto(xpOrder1.getEndLon(),xpOrder1.getEndLat()));
+ next.setDestination(new LonLatDto(xpOrder.getStartLon(),xpOrder.getStartLat()));
+ route = xpMapClient.getDistanceAndDuration(next).getData();
+ //相差秒时间
+ long time = routeRemain.getDuration() - xpOrder.getCreateTime().toEpochSecond(ZoneOffset.of("+8"));
+ if(route.getDistance() / 1000 <= destToPassenger || time / 60 <= endingTimeToUseTime){
+ log.info("连环派单 {} 找到满足条件的车辆 {}", vin, orderNo);
+ // 设置接驾导航数据
+ //将上一单的剩余导航添加到接驾导航中
+ route.getPolyline().addAll(0, routeRemain.getPolyline());
+ route.setDuration(route.getDuration() + routeRemain.getDuration());
+ route.setDistance(route.getDistance() + routeRemain.getDistance());
+
+ //此处找到车后先不忙给车推送接单消息,先修改订单上的车辆信息
+ xpOrder.setVehicleId(xpOrder1.getVehicleId());
+ xpOrder.setAcceptanceTime(LocalDateTime.now());
+ xpOrder.setStatus(2);
+ xpOrderClient.updateOrder(xpOrder);
+
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("orderId", xpOrder.getId());
+ jsonObject.put("endLongitude", xpOrder.getEndLat());
+ jsonObject.put("endLatitude", xpOrder.getEndLat());
+ redisService.setCacheObject(CacheConstants.nextOrder(xpOrder1.getId().toString()), jsonObject.toJSONString());
+ redisService.setCacheObject(CacheConstants.navigationStart(xpOrder.getAppUserId().toString()), JSON.toJSONString(route));
+ redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
+ log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
+ return true;
+ }
}
}
return false;
@@ -1349,6 +1353,8 @@
pushOrderDto.setStartTaskId(orderCheck.getData().getXpuStartTaskId());
pushOrderDto.setEndTaskId(orderCheck.getData().getXpuEndTaskId());
pushOrderDto.setOrderId(orderCheck.getData().getId().toString());
+ pushOrderDto.setStartWaypointId(orderCheck.getData().getStartPointId());
+ pushOrderDto.setEndWaypointId(orderCheck.getData().getEndPointId());
pushOrderDto.setStartLatitude(orderCheck.getData().getStartLat());
pushOrderDto.setStartLongitude(orderCheck.getData().getStartLon());
pushOrderDto.setEndLatitude(orderCheck.getData().getEndLat());
@@ -2027,6 +2033,8 @@
pushOrderDto.setEndTaskId(xpOrder.getXpuEndTaskId());
pushOrderDto.setVin(vehiclePosition.getVehicleVin());
pushOrderDto.setOrderId(xpOrder.getId().toString());
+ pushOrderDto.setStartWaypointId(xpOrder.getStartPointId());
+ pushOrderDto.setEndWaypointId(xpOrder.getEndPointId());
pushOrderDto.setStartLatitude(xpOrder.getStartLat());
pushOrderDto.setStartLongitude(xpOrder.getStartLon());
pushOrderDto.setEndLatitude(xpOrder.getEndLat());
@@ -2095,6 +2103,8 @@
pushOrderDto.setEndTaskId(xpOrder.getXpuEndTaskId());
pushOrderDto.setVin(vehiclePosition.getVin());
pushOrderDto.setOrderId(xpOrder.getId().toString());
+ pushOrderDto.setStartWaypointId(xpOrder.getStartPointId());
+ pushOrderDto.setEndWaypointId(xpOrder.getEndPointId());
pushOrderDto.setStartLatitude(xpOrder.getStartLat());
pushOrderDto.setStartLongitude(xpOrder.getStartLon());
pushOrderDto.setEndLatitude(xpOrder.getEndLat());
@@ -2218,6 +2228,8 @@
private static PushOrderDto buildPushOrderDto(XpOrder xpOrder) {
PushOrderDto pushOrderDto = new PushOrderDto();
pushOrderDto.setOrderId(xpOrder.getId().toString());
+ pushOrderDto.setStartWaypointId(xpOrder.getStartPointId());
+ pushOrderDto.setEndWaypointId(xpOrder.getEndPointId());
pushOrderDto.setStartLatitude(xpOrder.getStartLat());
pushOrderDto.setStartLongitude(xpOrder.getStartLon());
pushOrderDto.setEndLatitude(xpOrder.getEndLat());
@@ -2401,6 +2413,8 @@
pushOrderDto.setEndTaskId(data.getXpuEndTaskId());
pushOrderDto.setVin(vehiclePosition.getVin());
pushOrderDto.setOrderId(data.getId().toString());
+ pushOrderDto.setStartWaypointId(data.getStartPointId());
+ pushOrderDto.setEndWaypointId(data.getEndPointId());
pushOrderDto.setStartLatitude(data.getStartLat());
pushOrderDto.setStartLongitude(data.getStartLon());
pushOrderDto.setEndLatitude(data.getEndLat());
--
Gitblit v1.7.1