From 40c97867e634b0c4949dfd964bf06da35fc4bd88 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 13 二月 2026 22:06:40 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi
---
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java | 274 ++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 230 insertions(+), 44 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 a2a83db..b240625 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
@@ -1,14 +1,15 @@
package com.xiaopeng.operation.utils;
import cn.hutool.core.bean.BeanUtil;
+import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
import com.xiaopeng.api.dto.map.RouteAndFareDto;
import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto;
import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto;
+import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient;
import com.xiaopeng.api.feignClient.map.XpMapClient;
import com.xiaopeng.api.feignClient.order.XpOrderClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient;
-import com.xiaopeng.api.feignClient.vehicleConvoy.VehicleControlClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.operation.XpElectronicFence;
import com.xiaopeng.api.model.operation.XpTradingStrategy;
@@ -16,6 +17,7 @@
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.api.vo.operation.RouteVo;
+import com.xiaopeng.api.vo.operation.VehiclePositionVo;
import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo;
import com.xiaopeng.common.core.constant.CacheConstants;
import com.xiaopeng.common.core.domain.R;
@@ -25,8 +27,8 @@
import com.xiaopeng.operation.service.IXpTradingStrategyService;
import com.xiaopeng.operation.service.XpPointService;
import com.xiaopeng.operation.utils.mango.VehiclePositionService;
-import com.xiaopeng.api.vo.operation.VehiclePositionVo;
import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
@@ -39,6 +41,7 @@
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
+@Slf4j
@Component
public class TaskOrderUtil {
@@ -72,6 +75,9 @@
@Autowired
private XpMapClient xpMapClient;
+ //
+ @Autowired
+ private OrderMissionClient orderMissionClient;
// 自定义线程池
@@ -102,7 +108,7 @@
String[] split = firstElement.toString().split("_");
// 如果未处理 创建新任务
if (split[2].equals("0")) {
- String value = split[0] + "_" + split[1] + "_1" + "_"+split[3] + "_"+ split[4] + "_"+ split[5] + "_"+ split[6] + "_"+ split[7];
+ String value = split[0] + "_" + split[1] + "_1" + "_" + split[3] + "_" + split[4] + "_" + split[5] + "_" + split[6] + "_" + split[7];
// 状态改为处理中
redisService.updateFirst(name, value);
threadPoolTaskExecutor.submit(() -> {
@@ -220,8 +226,8 @@
@SneakyThrows
private void processPushOrder(String quoteName, int count, String uid, String[] split, String orderNo, XpTradingStrategy xpTradingStrategy, String distance, String duration, String planRule) {
System.out.println("进入推单环环节");
- if(count==0){
- count=1;
+ if (count == 0) {
+ count = 1;
}
// 订单状态
R<XpOrder> xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
@@ -596,7 +602,142 @@
// 订单价值
if (Objects.equals(secondMax, tendencyOrderValue)) {
+ // 订单价值
+ // 时间差权重
+ Integer weightTimeDifference = xpTradingStrategy.getWeightTimeDifference();
+ // 距离差权重
+ Integer weightDistanceDifference = xpTradingStrategy.getWeightDistanceDifference();
+ // 距离权重
+ Integer weightDistance = xpTradingStrategy.getWeightDistance();
+ // 时间权重
+ Integer weightTime = xpTradingStrategy.getWeightTime();
+ // 电量权重
+ Integer weightElectricity = xpTradingStrategy.getWeightElectricity();
+ // 找出最大的值是那个
+ Integer max1 = Math.max(weightTimeDifference, Math.max(weightDistanceDifference, Math.max(weightDistance, Math.max(weightTime, weightElectricity))));
+
+ // 时间差
+ if (max1.equals(weightTimeDifference)) {
+ for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+ RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
+ LonLatDto lonLatDto = new LonLatDto();
+ lonLatDto.setLongitude(vehiclePosition.getPoint().getX());
+ lonLatDto.setLatitude(vehiclePosition.getPoint().getY());
+ routeAndFareDto.setOrigin(lonLatDto);
+ LonLatDto lonLatDto1 = new LonLatDto();
+ lonLatDto1.setLongitude(Double.valueOf(split[0]));
+ lonLatDto1.setLatitude(Double.valueOf(split[1]));
+ routeAndFareDto.setDestination(lonLatDto1);
+ routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule));
+ R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto);
+ if (distanceAndDuration.getCode() == 200) {
+ // 送驾- 接驾
+ Integer durationDifference = Integer.parseInt(duration) - distanceAndDuration.getData().getDuration();
+ vehiclePosition.setTimeDifference(durationDifference);
+ }
+ }
+ }
+
+ if (max1.equals(weightDistanceDifference)) {
+ for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+ RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
+ LonLatDto lonLatDto = new LonLatDto();
+ lonLatDto.setLongitude(vehiclePosition.getPoint().getX());
+ lonLatDto.setLatitude(vehiclePosition.getPoint().getY());
+ routeAndFareDto.setOrigin(lonLatDto);
+ LonLatDto lonLatDto1 = new LonLatDto();
+ lonLatDto1.setLongitude(Double.valueOf(split[0]));
+ lonLatDto1.setLatitude(Double.valueOf(split[1]));
+ routeAndFareDto.setDestination(lonLatDto1);
+ routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule));
+ R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto);
+ if (distanceAndDuration.getCode() == 200) {
+ // 送驾- 接驾
+ Integer distanceDifference = Integer.parseInt(distance) - distanceAndDuration.getData().getDistance();
+ vehiclePosition.setDistanceDifference(distanceDifference);
+ }
+ }
+
+ }
+
+ if (max1.equals(weightDistance)) {
+ for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+ RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
+ LonLatDto lonLatDto = new LonLatDto();
+ lonLatDto.setLongitude(vehiclePosition.getPoint().getX());
+ lonLatDto.setLatitude(vehiclePosition.getPoint().getY());
+ routeAndFareDto.setOrigin(lonLatDto);
+ LonLatDto lonLatDto1 = new LonLatDto();
+ lonLatDto1.setLongitude(Double.parseDouble(split[0]));
+ lonLatDto1.setLatitude(Double.parseDouble(split[1]));
+
+ routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule));
+ routeAndFareDto.setDestination(lonLatDto1);
+ // 调用地图 获取时间
+ R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto);
+ if (r.getCode() == 200) {
+ vehiclePosition.setDistance(Double.valueOf(r.getData().getDistance()));
+ } else {
+ vehiclePosition.setDistance(0.0);
+ }
+ }
+ }
+
+ if (max1.equals(weightTime)) {
+ for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+ RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
+ LonLatDto lonLatDto = new LonLatDto();
+ lonLatDto.setLongitude(vehiclePosition.getPoint().getX());
+ lonLatDto.setLatitude(vehiclePosition.getPoint().getY());
+ routeAndFareDto.setOrigin(lonLatDto);
+ LonLatDto lonLatDto1 = new LonLatDto();
+ lonLatDto1.setLongitude(Double.parseDouble(split[0]));
+ lonLatDto1.setLatitude(Double.parseDouble(split[1]));
+
+ routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule));
+ routeAndFareDto.setDestination(lonLatDto1);
+ // 调用地图 获取时间
+ R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto);
+ if (r.getCode() == 200) {
+ vehiclePosition.setSecond(r.getData().getDuration());
+ } else {
+ vehiclePosition.setSecond(0);
+ }
+ }
+ }
+
+ if (max1.equals(weightElectricity)) {
+ // 计算车的分数 分数最大是车的size
+ availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList());
+ int size1 = tendencyElectricity;
+ // 做比对的分数
+ int temp1 = availableVehiclesNearby.get(0).getCurrentElectricity();
+ for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+ vehiclePosition.setCurrentElectricityScore(vehiclePosition.getCurrentElectricityScore() + size1);
+ if (temp1 != vehiclePosition.getCurrentElectricity()) {
+ size1--;
+ }
+ }
+ }
+
+
+ // 算出总分 再来排序计算
+ for (VehiclePositionVo vehiclePositionVo : availableVehiclesNearby) {
+ vehiclePositionVo.setOrderValueTotal(vehiclePositionVo.getCurrentElectricityScore() + vehiclePositionVo.getDistanceScore() + vehiclePositionVo.getTimeScore() + vehiclePositionVo.getDistanceDifference() + vehiclePositionVo.getTimeDifference());
+ }
+ availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getOrderValueTotal).reversed()).collect(Collectors.toList());
+
+
+ int size2 = tendencyOrderValue;
+ // 做比对的分数
+ double temp2 = availableVehiclesNearby.get(0).getOrderValueTotal();
+ for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) {
+ vehiclePosition.setValueScore(vehiclePosition.getValueScore() + size2);
+ if (temp2 != vehiclePosition.getOrderValueTotal()) {
+ size2--;
+ }
+ }
}
}
@@ -616,7 +757,7 @@
RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePositionVo.getVin());
lock.lock(10, TimeUnit.SECONDS);
- System.err.println("队列:"+quoteName+" 车辆:"+vehiclePositionVo.getVin()+"订单"+orderNo);
+ System.err.println("队列:" + quoteName + " 车辆:" + vehiclePositionVo.getVin() + "订单" + orderNo);
try {
// VehiclePosition vehiclePosition = vehiclePositionService.findByVehicleId(vehiclePositionVo.getVehicle_id());
R<XpVehicle> vehiclePositionR = xpVehicleClient.findByVehicleVin(vehiclePositionVo.getVin());
@@ -630,27 +771,15 @@
}
// 关闭巡游单子 TODO
- AddTaxiPassengerVo addTaxiPassengerVo = new AddTaxiPassengerVo();
- addTaxiPassengerVo.setVin(vehiclePosition.getVehicleVin());
- addTaxiPassengerVo.setUid(uid);
- addTaxiPassengerVo.setOrderNo(orderNo);
- // TODO appid
- addTaxiPassengerVo.setAppId("");
+
+ PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setOrderId(xpOrder.getId());
+ pushOrderDto.setVin(vehiclePosition.getVehicleVin());
- BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.addTaxiPassenger(addTaxiPassengerVo);
- if (baseVehicleUserDto!=null && baseVehicleUserDto.getCode() == 200) {
- // TODO 下单
+ // 调用推送服务 orderId + carVin
+ orderMissionClient.pushOrder(pushOrderDto);
- // 调用推送服务 orderId + carVin
-
-
-
-
- // 绑定成功 弹出这个队列第一个订单
- redisService.popFirstElement(quoteName);
- return;
- }
} catch (Exception e) {
e.printStackTrace();
} finally {
@@ -666,33 +795,25 @@
lock.lock(10, TimeUnit.SECONDS);
try {
// 查询车辆状态
- R<XpVehicle> vehicleR = xpVehicleClient.findByVehicleVin(vehicleVin);
- if(vehicleR.getCode()!=200){
- continue;
- }
- XpVehicle vehicleId1 = vehicleR.getData();
+ R<XpVehicle> vehicleR = xpVehicleClient.findByVehicleVin(vehicleVin);
+ if (vehicleR.getCode() != 200) {
+ continue;
+ }
+ XpVehicle vehicleId1 = vehicleR.getData();
if (vehicleId1.getStatus() != 1 || vehicleId1.getState() != 0) {
lock.unlock();
continue;
}
- if (vehiclePosition.getHasOrder() == 1) {
- // 关闭巡游单子 TODO
- }
- AddTaxiPassengerVo addTaxiPassengerVo = new AddTaxiPassengerVo();
- addTaxiPassengerVo.setVin(vehiclePosition.getVin());
- addTaxiPassengerVo.setUid(uid);
- addTaxiPassengerVo.setOrderNo(orderNo);
- // TODO appid
- addTaxiPassengerVo.setAppId("");
- BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.addTaxiPassenger(addTaxiPassengerVo);
- if (baseVehicleUserDto.getCode() == 200) {
+ // 关闭巡游单子 TODO
+ PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setOrderId(xpOrder.getId());
+ pushOrderDto.setVin(vehiclePosition.getVin());
- redisService.popFirstElement(quoteName);
- lock.unlock();
- return;
- }
+ // 调用推送服务 orderId + carVin
+ orderMissionClient.pushOrder(pushOrderDto);
+
} catch (Exception e) {
} finally {
@@ -704,5 +825,70 @@
}
}
+ /**
+ * 订单处理
+ * @param count 轮数
+ * @param uid
+ * @param longitude 经度
+ * @param latitude 纬度
+ * @param orderNo 订单号
+ */
+ @SneakyThrows
+ public void reassignPushOrder(int count, String uid, Double longitude, Double latitude, String orderNo) {
+ System.out.println("进入推单环环节");
+ if (count == 0) {
+ count = 1;
+ }
+ // 订单状态
+ R<XpOrder> xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
+ if (xpOrderR.getCode() != 200) {
+ return;
+ }
+ if (xpOrderR.getData().getStatus() != 1) {
+ return;
+ }
+ XpOrder data = xpOrderR.getData();
+ XpTradingStrategy xpTradingStrategy = xpTradingStrategyService.getOne(null);
+ for (int i = 0; i < count; i++) {
+ log.info("进入找车环节");
+ List<VehiclePosition> positionList = vehiclePositionService.findAvailableVehiclesNearby(longitude, latitude, xpTradingStrategy.getOnePushDistance(), xpTradingStrategy.getSimultaneouslyOrderCount());
+
+ // 获取车辆的区域信息
+ if (positionList.isEmpty()) {
+ continue;
+ }
+
+ // 直接派单 定义一个锁来锁定车辆
+ VehiclePosition vehiclePosition = positionList.get(0);
+ String vehicleVin = vehiclePosition.getVin();
+
+ RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePosition.getVin());
+ lock.lock(10, TimeUnit.SECONDS);
+ try {
+ // 查询车辆状态
+ R<XpVehicle> vehicleR = xpVehicleClient.findByVehicleVin(vehicleVin);
+ if (vehicleR.getCode() != 200) {
+ continue;
+ }
+ XpVehicle vehicleId1 = vehicleR.getData();
+ if (vehicleId1.getStatus() != 1 || vehicleId1.getState() != 0) {
+ lock.unlock();
+ continue;
+ }
+ // 关闭巡游单子 TODO
+
+ PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setOrderId(data.getId());
+ pushOrderDto.setVin(vehiclePosition.getVin());
+ // 调用推送服务 orderId + carVin
+ orderMissionClient.pushOrder(pushOrderDto);
+ } catch (Exception e) {
+
+ } finally {
+ lock.unlock();
+ }
+ }
+ }
+
}
--
Gitblit v1.7.1