From f572d49e6f1c20394bbb26d123cd565d70012633 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期六, 14 三月 2026 22:57:00 +0800
Subject: [PATCH] 优化并发判断地图导航点位是否有效
---
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java | 74 -----
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/base/AbstractJob.java | 3
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/EndTripJob.java | 10
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/AddCruiseMissionJob.java | 38 +-
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java | 237 +++++--------------
sql/增量sql/xprt_operation.sql | 20 +
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java | 70 ++--
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java | 254 ++++-----------------
8 files changed, 198 insertions(+), 508 deletions(-)
diff --git "a/sql/\345\242\236\351\207\217sql/xprt_operation.sql" "b/sql/\345\242\236\351\207\217sql/xprt_operation.sql"
index ff0d8aa..51ab800 100644
--- "a/sql/\345\242\236\351\207\217sql/xprt_operation.sql"
+++ "b/sql/\345\242\236\351\207\217sql/xprt_operation.sql"
@@ -1,7 +1,19 @@
-ALTER TABLE `xp_banner` ADD COLUMN `sort` int NULL DEFAULT NULL COMMENT '排序' AFTER `banner_status`;
+ALTER TABLE `xp_point_0` ADD COLUMN `fp_electronic_area_id` bigint NULL DEFAULT NULL COMMENT '分片建' AFTER `electronic_area_id`;
-ALTER TABLE `xp_cruise_plan_vehicle` ADD COLUMN `id` bigint NOT NULL COMMENT '自增id' FIRST;
+ALTER TABLE `xp_point_1` ADD COLUMN `fp_electronic_area_id` bigint NULL DEFAULT NULL COMMENT '分片建' AFTER `electronic_area_id`;
-ALTER TABLE `xp_cruise_plan_vehicle` ADD PRIMARY KEY (`id`) USING BTREE;
+ALTER TABLE `xp_point_2` ADD COLUMN `fp_electronic_area_id` bigint NULL DEFAULT NULL COMMENT '分片建' AFTER `electronic_area_id`;
-ALTER TABLE `xp_cruise_plan_vehicle` MODIFY COLUMN `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id';
+ALTER TABLE `xp_point_3` ADD COLUMN `fp_electronic_area_id` bigint NULL DEFAULT NULL COMMENT '分片建' AFTER `electronic_area_id`;
+
+ALTER TABLE `xp_point_4` ADD COLUMN `fp_electronic_area_id` bigint NULL DEFAULT NULL COMMENT '分片建' AFTER `electronic_area_id`;
+
+ALTER TABLE `xp_point_5` ADD COLUMN `fp_electronic_area_id` bigint NULL DEFAULT NULL COMMENT '分片建' AFTER `electronic_area_id`;
+
+ALTER TABLE `xp_point_6` ADD COLUMN `fp_electronic_area_id` bigint NULL DEFAULT NULL COMMENT '分片建' AFTER `electronic_area_id`;
+
+ALTER TABLE `xp_point_7` ADD COLUMN `fp_electronic_area_id` bigint NULL DEFAULT NULL COMMENT '分片建' AFTER `electronic_area_id`;
+
+ALTER TABLE `xp_point_8` ADD COLUMN `fp_electronic_area_id` bigint NULL DEFAULT NULL COMMENT '分片建' AFTER `electronic_area_id`;
+
+ALTER TABLE `xp_point_9` ADD COLUMN `fp_electronic_area_id` bigint NULL DEFAULT NULL COMMENT '分片建' AFTER `electronic_area_id`;
\ No newline at end of file
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 b647791..aa2c412 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
@@ -793,8 +793,10 @@
break;
case ORDER_RECEIVED:
//收到订单
- buildPushOrderStatus(orderId, OrderStatusEnum.READY_DEPART, sequence);
- xpOrderClient.updateOrderStatus(Long.parseLong(orderId.contains("XU") ? orderId.substring(2) : orderId), OrderStatusEnum.READY_DEPART.getCode());
+ if(!orderId.contains("XU")){
+ buildPushOrderStatus(orderId, OrderStatusEnum.READY_DEPART, sequence);
+ xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.READY_DEPART.getCode());
+ }
break;
case ORDER_STARTED:
//开始执行订单
@@ -802,8 +804,10 @@
break;
case ORDER_EN_ROUTE_TO_PICKUP:
//前往上车点
- buildPushOrderStatus(orderId, OrderStatusEnum.PICK_UP, sequence);
- xpOrderClient.updateOrderStatus(Long.parseLong(orderId.contains("XU") ? orderId.substring(2) : orderId), OrderStatusEnum.PICK_UP.getCode());
+ if(!orderId.contains("XU")){
+ buildPushOrderStatus(orderId, OrderStatusEnum.PICK_UP, sequence);
+ xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.PICK_UP.getCode());
+ }
break;
case ORDER_ARRIVED_AT_PICKUP:
//到达上车点
@@ -811,49 +815,41 @@
break;
case ORDER_WAITING_FOR_PICKUP:
//等待乘客上车
- buildPushOrderStatus(orderId, OrderStatusEnum.PICK_UP_GUESTS, sequence);
- xpOrderClient.updateOrderStatus(Long.parseLong(orderId.contains("XU") ? orderId.substring(2) : orderId), OrderStatusEnum.PICK_UP_GUESTS.getCode());
+ if(!orderId.contains("XU")){
+ buildPushOrderStatus(orderId, OrderStatusEnum.PICK_UP_GUESTS, sequence);
+ xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.PICK_UP_GUESTS.getCode());
+ }
break;
case ORDER_PASSENGER_ONBOARD:
//乘客已上车
- buildPushOrderStatus(orderId, OrderStatusEnum.PASSENGER_BOARDED, sequence);
- xpOrderClient.updateOrderStatus(Long.parseLong(orderId.contains("XU") ? orderId.substring(2) : orderId), OrderStatusEnum.PASSENGER_BOARDED.getCode());
+ if(!orderId.contains("XU")){
+ buildPushOrderStatus(orderId, OrderStatusEnum.PASSENGER_BOARDED, sequence);
+ xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.PASSENGER_BOARDED.getCode());
+ }
break;
case ORDER_EN_ROUTE_TO_DESTINATION:
//前往目的地
- buildPushOrderStatus(orderId, OrderStatusEnum.IN_SERVICE, sequence);
- xpOrderClient.updateOrderStatus(Long.parseLong(orderId.contains("XU") ? orderId.substring(2) : orderId), OrderStatusEnum.IN_SERVICE.getCode());
+ if(!orderId.contains("XU")){
+ buildPushOrderStatus(orderId, OrderStatusEnum.IN_SERVICE, sequence);
+ xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.IN_SERVICE.getCode());
+ }
break;
case ORDER_ARRIVED_AT_DESTINATION:
//到达目的地
log.info("到达目的地,不做任何处理:{}", orderId);
break;
case ORDER_WAITING_FOR_DROPOFF:
- //等待乘客下车
- buildPushOrderStatus(orderId, OrderStatusEnum.SEE_OFF_GUESTS, sequence);
- xpOrderClient.updateOrderStatus(Long.parseLong(orderId.contains("XU") ? orderId.substring(2) : orderId), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
+ //等待乘客下车,开始倒计时发下巡游单
+ if(!orderId.contains("XU")){
+ buildPushOrderStatus(orderId, OrderStatusEnum.SEE_OFF_GUESTS, sequence);
+ xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
+ }
break;
case ORDER_DROPOFF_COMPLETED:
//下车完成
- buildPushOrderStatus(orderId, OrderStatusEnum.APPROVAL_REJECTION, sequence);
- xpOrderClient.updateOrderStatus(Long.parseLong(orderId.contains("XU") ? orderId.substring(2) : orderId), OrderStatusEnum.APPROVAL_REJECTION.getCode());
- // 下发巡游任务
- R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.parseLong(orderId));
- if(xpOrderR.getCode()==200){
- XpOrder orderData = xpOrderR.getData();
- Long vehicleId =orderData.getVehicleId();
- R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(vehicleId);
- if(xpVehicleR.getData()!=null){
- XpVehicle xpVehicle = xpVehicleR.getData();
- //订单结束,在添加导航数据之前先将车辆状态修改为空闲
- xpVehicleClient.updateVehicleStatus(new UpdateVehicleStateDto(xpVehicle.getVehicleVin(), 0));
- xpVehicle = xpVehicleClient.queryById(vehicleId).getData();
-
- AddCruiseMissionDto addCruiseMissionDto = new AddCruiseMissionDto();
- addCruiseMissionDto.setOrder(orderData);
- addCruiseMissionDto.setVehicle(xpVehicle);
- xpCruiseOrderClient.addCruiseMission(addCruiseMissionDto);
- }
+ if(!orderId.contains("XU")){
+ buildPushOrderStatus(orderId, OrderStatusEnum.APPROVAL_REJECTION, sequence);
+ xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.APPROVAL_REJECTION.getCode());
}
break;
case ORDER_COMPLETED:
@@ -862,12 +858,16 @@
break;
case ORDER_CANCELLED:
//已取消
- buildPushOrderStatus(orderId, OrderStatusEnum.CANCELED, sequence);
- xpOrderClient.updateOrderStatus(Long.parseLong(orderId.contains("XU") ? orderId.substring(2) : orderId), OrderStatusEnum.CANCELED.getCode());
+ if(!orderId.contains("XU")){
+ buildPushOrderStatus(orderId, OrderStatusEnum.CANCELED, sequence);
+ xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.CANCELED.getCode());
+ }
break;
case ORDER_ARRIVED_AT_CRUISE_DESTINATION:
//到达巡游终点
- buildPushOrderStatus(orderId, OrderStatusEnum.COMPLETED, sequence);
+ if(orderId.contains("XU")){
+ buildPushOrderStatus(orderId, OrderStatusEnum.COMPLETED, sequence);
+ }
break;
case ORDER_PAUSED:
//订单暂停
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
index 87a4b3a..db69b44 100644
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
+++ b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
@@ -217,7 +217,7 @@
}
-// // 算距离
+ // 算距离
R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto);
if (distanceAndDuration.getCode() != 200) {
throw new ServiceException("获取导肮信息失败", I18nKeyConstant.PATH_NOT_FOUND);
@@ -310,35 +310,7 @@
// 8. 构建响应对象
RouteAndFareVo routeAndFareVo = new RouteAndFareVo();
-
- // MOCK数据
-// RouteVo routeVo = new RouteVo();
-// routeVo.setDistance(3000);
-// routeVo.setDuration(5);
-// routeVo.setRouteID("1");
-// List<LonLatDto> routePolyline = Arrays.asList(
-// // 起点:天府新谷
-// new LonLatDto(104.05363, 30.58937),
-//
-// // 途经点1:府城大道与交子北二路交叉口附近
-// new LonLatDto(104.05821, 30.58745),
-//
-// // 途经点2:交子大道与成汉南路交叉口
-// new LonLatDto(104.06418, 30.58492),
-//
-// // 途经点3:交子大道与万象南路交叉口
-// new LonLatDto(104.06975, 30.58321),
-//
-// // 途经点4:交子大道与益州大道交叉口
-// new LonLatDto(104.07366, 30.58198),
-//
-// // 终点:金融城(地铁站附近)
-// new LonLatDto(104.076544, 30.581039)
-// );
-// routeVo.setPolyline(routePolyline);
routeAndFareVo.setRoute(routeVo);
-
-
routeAndFareVo.setXpPricingCard(xpPricingCardVo);
FareVo fareVo = new FareVo();
@@ -393,8 +365,6 @@
redisService.setCacheObject(key, voJsonStr, 5l, TimeUnit.MINUTES);
//缓存导航数据,用于下单后推送导航给车端和乘客端
redisService.setCacheObject("ORDER_NAVIGATION_END_DATA:" + userId, JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
-
-
return routeAndFareVo;
}
@@ -562,18 +532,6 @@
xpOrder.setCreateTime(LocalDateTime.now());
- // 计算距离 和 时间
- RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
- LonLatDto lonLatDto = new LonLatDto();
- lonLatDto.setLongitude(xpPoint.getPointLon());
- lonLatDto.setLatitude(xpPoint.getPointLat());
- routeAndFareDto.setOrigin(lonLatDto);
-
- LonLatDto lonLatDto1 = new LonLatDto();
- lonLatDto1.setLongitude(endXpPoint.getPointLon());
- lonLatDto1.setLatitude(endXpPoint.getPointLat());
- routeAndFareDto.setDestination(lonLatDto1);
-
XpOpenCity openCities = xpOpenCityMapper.selectById(dto.getOpenCityId());
if (openCities == null) {
throw new ServiceException("获取城市信息失败", I18nKeyConstant.CITY_NOT_FOUND);
@@ -582,18 +540,15 @@
dto.setOpenCityId(xpOpenCity.getId());
xpOrder.setCityCode(xpOpenCity.getCityCode());
XpRoutePlan xpRoutePlan = xpRoutePlanMapper.selectOne(new LambdaQueryWrapper<XpRoutePlan>().eq(XpRoutePlan::getAuditStatus, 2).eq(XpRoutePlan::getCityCode, xpOpenCity.getCityCode()));
- if (xpRoutePlan != null) {
- routeAndFareDto.setRoutePlanRule(xpRoutePlan.getRoutePlanRule());
- }
- R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto);
+
Integer distance = 0;
Integer duration = 0;
- if (distanceAndDuration.getCode() != 200) {
-// throw new ServiceException("订单生成失败", I18nKeyConstant.ORDER_CREATE_FAIL);
+ Object cacheObject = redisService.getCacheObject("ORDER_NAVIGATION_END_DATA:" + uid);
+ if (cacheObject != null) {
+ RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class);
+ distance = routeVo.getDistance();
+ duration = routeVo.getDuration();
}
-// distance = distanceAndDuration.getData().getDistance();
-// duration = distanceAndDuration.getData().getDuration();
-
// 产生订单
R<Long> addOrderR = xpOrderClient.addOrder(xpOrder);
@@ -626,7 +581,7 @@
// 和上车点进行判断是否<maxPushDistance
double v = FastDistanceCalculator.distanceFast(Double.parseDouble(lonLat.split(",")[1]), Double.parseDouble(lonLat.split(",")[0]), xpPoint.getPointLat(), xpPoint.getPointLon());
if (v < maxPushDistance) {
- String value = orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + routeAndFareDto.getRoutePlanRule();
+ String value = orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + xpRoutePlan.getRoutePlanRule();
if (isPriorityDispatch) {
// 头部 value 订单_经纬度_状态_用户id_订单编号_距离_时间
redisService.addToHead(s, value);
@@ -654,7 +609,7 @@
}
String key = CacheConstants.QUEUE_POINT_ID + "-" + xpPoint.getId() + "-" + xpPoint.getPointLon() + "," + xpPoint.getPointLat();
- redisService.setCacheList(key, Arrays.asList(orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + routeAndFareDto.getRoutePlanRule()));
+ redisService.setCacheList(key, Arrays.asList(orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + xpRoutePlan.getRoutePlanRule()));
log.info("订单推单:{} {}", key, redisService.getCacheList(key));
xpOrder.setQueueName(key);
xpOrderClient.updateOrder(xpOrder);
@@ -670,17 +625,6 @@
xpGeoQueryEntity.setTimestamp(System.currentTimeMillis());
geoQueryEntityService.save(xpGeoQueryEntity);
return orderId.toString();
-
-//
-// XpElectronicFenceArea xpElectronicFenceArea = xpElectronicFenceAreaMapper.selectById(dto.getXpElectronicFenceAreaId());
-// // 获取电子围栏的车辆
-// R<List<XpVehicle>> vehicles = xpVehicleClient.listByFenceId(xpElectronicFenceArea.getElectronicId());
-//
-
-
- // 产生订单 存订单数据 // 下发指令 消息推送用户端
-// return null;
-
}
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java
index 0eb8c08..d0d79c1 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java
@@ -32,200 +32,8 @@
@Autowired
private XpGeoFencingPolygonService xpGeoFencingPolygonService;
- // 自定义线程池配置
- private static final int CORE_POOL_SIZE = 5; // 核心线程数
- private static final int MAX_POOL_SIZE = 10; // 最大线程数
- private static final long KEEP_ALIVE_TIME = 60L; // 线程空闲存活时间
- private static final int QUEUE_CAPACITY = 100; // 阻塞队列容量
- // 创建自定义线程池
- private final ExecutorService customThreadPool = new ThreadPoolExecutor(
- CORE_POOL_SIZE,
- MAX_POOL_SIZE,
- KEEP_ALIVE_TIME,
- TimeUnit.SECONDS,
- new LinkedBlockingQueue<>(QUEUE_CAPACITY),
- new ThreadFactory() {
- private final AtomicInteger threadNumber = new AtomicInteger(1);
- @Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(r, "route-check-thread-" + threadNumber.getAndIncrement());
- t.setDaemon(true); // 设置为守护线程,避免应用关闭时线程未停止
- return t;
- }
- },
- new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略:调用线程执行
- );
-// public RouteVo getDistanceAndTime(LonLatDto start, LonLatDto end, String avoidRoads, String fenceId, Integer routePlanRule) {
-// RouteVo routeVo = new RouteVo();
-//
-// String url = "https://tsapi.amap.com/v1/route/price?key=" + key + "&extensions=all&start=" + start.getLongitude() + "," + start.getLatitude();
-// HashMap<String, Object> params = new HashMap<>();
-// params.put("extensions", "all");
-// params.put("start", start.getLongitude() + "," + start.getLatitude());
-// params.put("end", end.getLongitude() + "," + end.getLatitude());
-// params.put("routeUserType", 2);
-// if (avoidRoads != null && !avoidRoads.isEmpty()) {
-// params.put("voidPolygons", avoidRoads);
-// }
-// if (routePlanRule != null) {
-// params.put("strategy", routePlanRule);
-// }
-//
-// String post = HttpUtils.post(url, JSON.toJSONString(params));
-// System.out.println("高德地图返回结果:" + post);
-//
-// JSONObject jsonObject = JSON.parseObject(post);
-// String data = jsonObject.getString("data");
-// JSONObject jsonObject1 = JSON.parseObject(data);
-// JSONArray path = jsonObject1.getJSONArray("paths");
-//
-// if (path == null || path.isEmpty()) {
-// return null;
-// }
-//
-// // 使用自定义线程池并行处理每个路径的围栏检查
-// List<Future<PathCheckResult>> futures = new ArrayList<>();
-// CountDownLatch latch = new CountDownLatch(path.size()); // 用于等待所有任务完成
-//
-// // 提交每个路径的处理任务
-// for (int j = 0; j < path.size(); j++) {
-// final int index = j;
-// JSONObject pathObject = path.getJSONObject(index);
-//
-// Future<PathCheckResult> future = customThreadPool.submit(() -> {
-// try {
-// PathCheckResult result = new PathCheckResult();
-// result.setIndex(index);
-// result.setPathObject(pathObject);
-//
-// String points = pathObject.getString("points");
-// String[] split = points.split(";");
-//
-// // 检查点位是否在围栏内
-// boolean inFence = checkPointsInFence(split, fenceId);
-// result.setInFence(inFence);
-//
-// return result;
-// } finally {
-// latch.countDown(); // 任务完成,计数器减1
-// }
-// });
-//
-// futures.add(future);
-// }
-//
-// try {
-// // 等待所有任务完成,设置超时时间
-// if (!latch.await(10, TimeUnit.SECONDS)) {
-// System.out.println("路径检查任务超时");
-// // 取消所有未完成的任务
-// for (Future<PathCheckResult> future : futures) {
-// if (!future.isDone()) {
-// future.cancel(true);
-// }
-// }
-// }
-// } catch (InterruptedException e) {
-// Thread.currentThread().interrupt();
-// System.out.println("路径检查任务被中断");
-// return null;
-// }
-//
-// // 收集处理结果,找到第一个不在围栏内的路径
-// PathCheckResult validPathResult = null;
-//
-// for (Future<PathCheckResult> future : futures) {
-// try {
-// if (future.isDone() && !future.isCancelled()) {
-// PathCheckResult result = future.get();
-// if (!result.isInFence()) {
-// validPathResult = result;
-// break; // 找到有效的就停止
-// }
-// }
-// } catch (InterruptedException | ExecutionException e) {
-// System.out.println("获取路径检查结果失败: " + e.getMessage());
-// e.printStackTrace();
-// }
-// }
-//
-// // 如果找到了有效路径,处理该路径数据
-// if (validPathResult != null) {
-// JSONObject validPath = validPathResult.getPathObject();
-// String routeID = validPath.getString("routeID");
-// String points = validPath.getString("points");
-// String[] split = points.split(";");
-//
-// Integer costTime = validPath.getInteger("costTime");
-// Integer distance = validPath.getInteger("distance");
-//
-// routeVo.setDistance(distance);
-// routeVo.setDuration(costTime);
-//
-// ArrayList<LonLatDto> lonLatDtos = new ArrayList<>(split.length);
-// for (String s : split) {
-// String[] split1 = s.split(",");
-// LonLatDto lonLatDto = new LonLatDto(Double.parseDouble(split1[0]), Double.parseDouble(split1[1]));
-// lonLatDtos.add(lonLatDto);
-// }
-// routeVo.setPolyline(lonLatDtos);
-// routeVo.setRouteID(routeID);
-//
-// return routeVo;
-// }
-//
-// return null;
-// }
- /**
- * 路径检查结果内部类
- */
- private static class PathCheckResult {
- private int index;
- private JSONObject pathObject;
- private boolean inFence; // true: 所有点都在围栏内, false: 有点不在围栏内
-
- public int getIndex() {
- return index;
- }
-
- public void setIndex(int index) {
- this.index = index;
- }
-
- public JSONObject getPathObject() {
- return pathObject;
- }
-
- public void setPathObject(JSONObject pathObject) {
- this.pathObject = pathObject;
- }
-
- public boolean isInFence() {
- return inFence;
- }
-
- public void setInFence(boolean inFence) {
- this.inFence = inFence;
- }
- }
- /**
- * 检查路径点位是否在围栏内
- */
- private boolean checkPointsInFence(String[] points, String fenceId) {
- // 取5分之一的点位进行检查
- for (int i = 0; i < points.length; i++) {
- if (i % 5 == 0) {
- String[] split1 = points[i].split(",");
- LonLatDto lonLatDto = new LonLatDto(Double.parseDouble(split1[0]), Double.parseDouble(split1[1]));
- if (!xpGeoFencingPolygonService.isInFence(lonLatDto.getLongitude(), lonLatDto.getLatitude(), fenceId, "operating_area")) {
- return false; // 有点位不在围栏内
- }
- }
- }
- return true; // 所有检查的点都在围栏内
- }
/**
* 根据起始点获取驾车距离 和 时间 以及避让区域
@@ -263,23 +71,22 @@
JSONObject jsonObject1 = JSON.parseObject(data);
JSONArray path = jsonObject1.getJSONArray("paths");
+ log.info("开始判断导航路径是否在运营区域范围内 {}", fenceId);
for (Object o : path) {
JSONObject jsonObject2 = (JSONObject) o;
String routeID = jsonObject2.getString("routeID");
String points = jsonObject2.getString("points");
String[] split = points.split(";");
- int temp=0;
- // 取5分之一的点位
- for (int i = 0; i < split.length; i++) {
- if (i % 10 == 0) {
- String[] split1 = split[i].split(",");
- LonLatDto lonLatDto = new LonLatDto(Double.parseDouble(split1[0]), Double.parseDouble(split1[1]));
- if (!xpGeoFencingPolygonService.isInFence(lonLatDto.getLongitude(), lonLatDto.getLatitude(), fenceId, "operating_area")) {
- temp++;
- break;
- }
- }
+ List<LonLatDto> pointsArray = new ArrayList<>();
+ for (String string : split) {
+ String[] split1 = string.split(",");
+ LonLatDto lonLatDto = new LonLatDto(Double.parseDouble(split1[0]), Double.parseDouble(split1[1]));
+ pointsArray.add(lonLatDto);
}
+ ForkJoinPool pool = new ForkJoinPool(); // 创建ForkJoinPool对象(默认使用处理器的核心数作为线程池大小)
+ ArrayPointsTask arrayPointsTask = new ArrayPointsTask(pointsArray, fenceId); // 创建求和任务对象并传入数组作为参数(这里也可以传入数组的一部分作为参数来实现更细粒度的拆分)
+ Long temp = pool.invoke(arrayPointsTask); // 提交任务并等待处理完成(也可以使用submit方法提交任务并获取一个Future对象来异步获取结果)
+ pool.shutdown(); // 关闭ForkJoinPool(释放资源)
if(temp==0){
Integer costTime = jsonObject2.getInteger("costTime");
Integer distance = jsonObject2.getInteger("distance");
@@ -293,15 +100,54 @@
}
routeVo.setPolyline(lonLatDtos);
routeVo.setRouteID(routeID);
+ log.info("导航 {} 在 {} 运营区域内", routeVo.getRouteID(), fenceId);
return routeVo;
}
}
-
return null;
}
+
+ class ArrayPointsTask extends RecursiveTask<Long>{
+ //最大定位集合阈值
+ private final int THRESHOLD = 10;
+ //围栏ID
+ String fenceId;
+ //定位点集合
+ List<LonLatDto> pointsArray;
+
+
+ public ArrayPointsTask(List<LonLatDto> pointsArray, String fenceId) {
+ this.pointsArray = pointsArray;
+ this.fenceId = fenceId;
+ }
+
+ @Override
+ protected Long compute() {
+ if(this.pointsArray.size() > THRESHOLD){
+ int num = this.pointsArray.size() / 2;
+ ArrayPointsTask task1 = new ArrayPointsTask(this.pointsArray.subList(0, num), fenceId);
+ ArrayPointsTask task2 = new ArrayPointsTask(this.pointsArray.subList(num, this.pointsArray.size()), fenceId);
+ task1.fork();
+ task2.fork();
+ return task1.join() + task2.join();
+ }else{
+ long temp = 0;
+ for (LonLatDto lonLatDto : this.pointsArray) {
+ if (!xpGeoFencingPolygonService.isInFence(lonLatDto.getLongitude(), lonLatDto.getLatitude(), fenceId, "operating_area")) {
+ temp++;
+ break;
+ }
+ }
+ return temp;
+ }
+ }
+ }
+
+
+
/**
* 线路还原接口
* 车端使用的数据
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/base/AbstractJob.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/base/AbstractJob.java
index e00dbb4..b66ea0b 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/base/AbstractJob.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/base/AbstractJob.java
@@ -2,6 +2,7 @@
import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient;
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.order.XpCruiseOrder;
import com.xiaopeng.order.service.IXpCruiseOrderService;
@@ -26,6 +27,7 @@
protected IXpCruiseOrderService xpCruiseOrderService;
protected OrderMissionClient orderMissionClient;
protected XpVehicleClient xpVehicleClient;
+ protected UserVehicleClient userVehicleClient;
public AbstractJob(){
this.xpOrderService = SpringContextsUtil.getBean(IXpOrderService.class);
this.xpPushMessageClient = SpringContextsUtil.getBean(XpPushMessageClient.class);
@@ -33,6 +35,7 @@
this.xpCruiseOrderService = SpringContextsUtil.getBean(IXpCruiseOrderService.class);
this.orderMissionClient = SpringContextsUtil.getBean(OrderMissionClient.class);
this.xpVehicleClient = SpringContextsUtil.getBean(XpVehicleClient.class);
+ this.userVehicleClient = SpringContextsUtil.getBean(UserVehicleClient.class);
}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/AddCruiseMissionJob.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/AddCruiseMissionJob.java
index 486e60f..eefa938 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/AddCruiseMissionJob.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/AddCruiseMissionJob.java
@@ -5,6 +5,7 @@
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.OrderType;
+import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.order.job.base.AbstractJob;
import lombok.extern.slf4j.Slf4j;
@@ -29,26 +30,23 @@
throws JobExecutionException {
JobDataMap maps = context.getMergedJobDataMap();
Long orderId = maps.getLong("id");
- try {
- log.info("开始执行添加任务");
- XpCruiseOrder xpCruiseOrder = xpCruiseOrderService.getById(orderId);
- R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(xpCruiseOrder.getVehicleId());
- if(xpVehicleR.getData().getState()==0){
- PushOrderDto pushOrderDto = new PushOrderDto();
- pushOrderDto.setVin(xpCruiseOrder.getVehicleVin());
- pushOrderDto.setOrderId("XU" + xpCruiseOrder.getId());
- pushOrderDto.setStartLatitude(xpCruiseOrder.getStartLat());
- pushOrderDto.setStartLongitude(xpCruiseOrder.getStartLon());
- pushOrderDto.setEndLatitude(xpCruiseOrder.getEndLat());
- pushOrderDto.setEndLongitude(xpCruiseOrder.getEndLon());
- pushOrderDto.setOrderType(OrderType.CRUISE_ORDER);
- pushOrderDto.setStage(2);
- // 调用推送服务 orderId + carVin
- orderMissionClient.pushOrder(pushOrderDto);
- }
- }catch(Exception e){
- e.printStackTrace();
- }
+ String appid = maps.getString("appid");
+ XpOrder xpOrder = xpOrderService.getById(orderId);
+ // 解绑用户与车辆关系
+ CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo();
+ XpVehicle vehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
+ if (vehicle != null) {
+ cancelTaxiPassengerVo.setVin(vehicle.getVehicleVin());
+ cancelTaxiPassengerVo.setUid(xpOrder.getAppUserId().toString());
+ cancelTaxiPassengerVo.setOrderNo(xpOrder.getOrderNumber());
+ cancelTaxiPassengerVo.setAppId(appid);
+ userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
+
+ // 修改车辆接单状态
+ vehicle.setState(0);
+ xpVehicleClient.updateVehicleById(vehicle);
+ }
+ xpOrderService.addCruiseMission(vehicle, xpOrder);
}
}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/EndTripJob.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/EndTripJob.java
index 7fe3a84..940b8ff 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/EndTripJob.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/EndTripJob.java
@@ -3,6 +3,7 @@
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.order.XpOrderTimeoutLog;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
+import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.order.job.base.AbstractJob;
import lombok.extern.slf4j.Slf4j;
@@ -25,19 +26,18 @@
throws JobExecutionException {
JobDataMap maps = context.getMergedJobDataMap();
Long orderId = maps.getLong("id");
- try {
+ try {
log.info("开始执行自动结束行程任务");
XpOrder xpOrder = xpOrderService.getById(orderId);
- xpOrderService.endTrip(xpOrder.getId(), String.valueOf(xpOrder.getAppUserId()));
+ if(xpOrder.getStatus() == 7){
+ xpOrderService.endTrip(xpOrder.getId(), String.valueOf(xpOrder.getAppUserId()));
+ }
log.info("结束执行自动结束行程任务");
// 添加超时记录
XpOrderTimeoutLog xpOrderTimeoutLog = new XpOrderTimeoutLog();
xpOrderTimeoutLog.setOrderId(xpOrder.getId());
xpOrderTimeoutLog.setUserId(xpOrder.getAppUserId());
xpOrderTimeoutLogService.save(xpOrderTimeoutLog);
-
- R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(xpOrder.getVehicleId());
- xpOrderService.addCruiseMission(xpVehicleR.getData(),xpOrder);
}catch(Exception e){
e.printStackTrace();
}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
index 58af009..2b05499 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -1378,7 +1378,9 @@
if (xpOrder.getStatus() == 0) {
return R.fail("订单已取消");
}
- xpOrder.setStatus(status);
+ if(xpOrder.getStatus() >= 8){
+ return R.fail("订单已结束");
+ }
switch (status) {
case 4:
// 查询起点点位
@@ -1409,37 +1411,51 @@
xpOrder.setTripBegin(LocalDateTime.now());
break;
case 7:
- // 查询自动结束行程时间
- if (xpOrder.getOpenTrunk() != 1) {
- Integer arriveTime = xpSystemSettingClient.getOrderFinishTime().getData();
- // 添加自动结束行程定时任务job
- Map<String, ? extends Object> endTripJobMaps =
- new ImmutableMap.Builder<String, Long>().
- put("id", xpOrder.getId())
- .build();
- QuartzManager.addJob(
- EndTripJob.class,
- (EndTripJob.name + xpOrder.getId()).toUpperCase(),
- TimeJobType.END_TRIP,
- DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(arriveTime)),
- endTripJobMaps
- );
- // 推送倒计时消息
- Map<String, Object> params = new HashMap<>();
- Map<String, Object> content = new HashMap<>();
- content.put("orderId", xpOrder.getId().toString());
- content.put("isOpen", 1);
- params.put("type", PushMessageTypeEnum.OPEN_TRUNK.getDesc());
- params.put("content", JSONObject.toJSONString(content));
- params.put("timestamp", new Date().getTime() + "");
- String message = JSONObject.toJSONString(params);
- SendMessageDTO sendMessageDTO = new SendMessageDTO();
- sendMessageDTO.setMessage(message);
- sendMessageDTO.setAppUserId(String.valueOf(xpOrder.getAppUserId()));
- xpPushMessageClient.sendStatus(sendMessageDTO);
- }
+ Integer arriveTime = xpSystemSettingClient.getOrderFinishTime().getData();
+ // 添加自动结束行程定时任务job
+ Map<String, ? extends Object> endTripJobMaps =
+ new ImmutableMap.Builder<String, String>()
+ .put("id", xpOrder.getId().toString())
+ .put("appid", appid)
+ .build();
+ QuartzManager.addJob(
+ EndTripJob.class,
+ (EndTripJob.name + xpOrder.getId()).toUpperCase(),
+ TimeJobType.END_TRIP,
+ DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(arriveTime)),
+ endTripJobMaps
+ );
+ // 添加车辆到达终点后限停时间到后驶离的定时任务
+ //时间到后添加巡游订单,解绑车辆关系,车辆驶离点位
+ XpPoint point = xpPointClient.queryById(xpOrder.getEndPointId()).getData();
+ Map<String, ? extends Object> jobMaps =
+ new ImmutableMap.Builder<String, String>()
+ .put("id", xpOrder.getId().toString())
+ .put("appid", appid)
+ .build();
+ QuartzManager.addJob(
+ AddCruiseMissionJob.class,
+ (AddCruiseMissionJob.name + xpOrder.getId()).toUpperCase(),
+ TimeJobType.ADD_CRUISE_MISSION,
+ DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(point.getParkingTimeLimit())),
+ jobMaps
+ );
+ // 推送倒计时消息
+ Map<String, Object> params = new HashMap<>();
+ Map<String, Object> content = new HashMap<>();
+ content.put("orderId", xpOrder.getId().toString());
+ content.put("isOpen", 1);
+ params.put("type", PushMessageTypeEnum.OPEN_TRUNK.getDesc());
+ params.put("content", JSONObject.toJSONString(content));
+ params.put("timestamp", new Date().getTime() + "");
+ String message = JSONObject.toJSONString(params);
+ SendMessageDTO sendMessageDTO = new SendMessageDTO();
+ sendMessageDTO.setMessage(message);
+ sendMessageDTO.setAppUserId(String.valueOf(xpOrder.getAppUserId()));
+ xpPushMessageClient.sendStatus(sendMessageDTO);
break;
}
+ xpOrder.setStatus(status);
xpOrder.setAppUserId(null);
this.updateById(xpOrder);
return R.ok();
@@ -1474,24 +1490,7 @@
exactMinutes = new BigDecimal(exactMinutes).setScale(2, RoundingMode.HALF_UP).doubleValue();
order.setDuration(exactMinutes);
-// order.setMileageKilometers(80.0);
baseMapper.updateById(order);
- // 解绑用户与车辆关系
- CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo();
- XpVehicle vehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
- if (vehicle != null) {
- cancelTaxiPassengerVo.setVin(vehicle.getVehicleVin());
- cancelTaxiPassengerVo.setUid(uid);
- cancelTaxiPassengerVo.setOrderNo(order.getOrderNumber());
- // TODO 加配置文件取
- cancelTaxiPassengerVo.setAppId(appid);
- userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
-
- // 修改车辆接单状态
- vehicle.setState(0);
- xpVehicleClient.updateVehicleById(vehicle);
- }
-
// 根据订单所属开通城市id 查询定价
R<XpPricing> pricingByCityId = xpPricingClient.getPricingByCid(order.getCityId());
@@ -1511,9 +1510,6 @@
TaxiPricingDemoService.GpsPoint point = new TaxiPricingDemoService.GpsPoint(trajectory.getDistance(), trajectory.getLocatetime());
gpsPoints.add(point);
}
-// 补充临时轨迹数据
-// List<TaxiPricingDemoService.GpsPoint> gpsPoints = TaxiPricingDemoService.createMockGpsPoints(DateUtils.toDate(order.getCreateTime()));
-
TaxiPricingDemoService.PricingConfig config = new TaxiPricingDemoService.PricingConfig();
JSONArray startingFareJsonArray = JSONArray.parseArray(pricing.getStartingFareJson());
@@ -1532,16 +1528,7 @@
Double duration1 = order.getDuration();
com.alibaba.fastjson.JSONObject basicPricingJson = com.alibaba.fastjson.JSONObject.parseObject(pricing.getBasicPricingJson());
-// String num1 = "00:00";
-// String num2 = "23:59";
-// String num3 = basicPricingJson.getString("num1");
-// String num4 = basicPricingJson.getString("num2");
-// String num5 = basicPricingJson.getString("num3");
-// String num6 = basicPricingJson.getString("num4");
-// String num7 = basicPricingJson.getString("num5");
-// config.normals.add(new TaxiPricingDemoService.PricingRule("普通时段", num1, num2, Double.parseDouble(num3), Double.parseDouble(num4), Double.parseDouble(num5), Double.parseDouble(num6), Double.parseDouble(num7)));
-// paramNum4 = basicPricingJson.getDouble("num2");
-// paramNum5 = basicPricingJson.getDouble("num3");
+
XpPricingCardVo xpPricingCardVo = xpPricingUtil.calculationFixedPrice(orderAppUserId.toString(), basicPricingJson, null, mileageKilometers, duration1, 0, 0.0, pricing.getIsDynamicPrice(), order.getCityId(), pricing.getDynamicPricingJson());
XpOrderDetail xpOrderDetail = new XpOrderDetail();
xpOrderDetail.setDetailType(1);
@@ -1574,11 +1561,7 @@
order.setOrderMoney(totalPrice);
order.setAppUserId(null);
baseMapper.updateById(order);
-
-
} else {
-
-
//动态计费
if (pricing.getPricingType() == 1) {
@@ -1828,18 +1811,7 @@
BigDecimal add = order.getDurationMoney().add(fareBreakdownDetailVo.getMoney());
order.setDurationMoney(add);
}
-// for (XpOrderDetail xpOrderDetail : xpOrderDetails) {
-// if (xpOrderDetail.getDetailType() == 1) {
-// order.setDurationType(xpOrderDetail.getType());
-// order.setDurationMoney(xpOrderDetail.getMoney());
-//// order.setDuration(Double.parseDouble(xpOrderDetail.getDuration() + ""));
-// } else {
-// order.setLongDistanceType(order.getDurationType());
-// order.setLongDistance(xpOrderDetail.getMileage().doubleValue());
-// order.setLongDistancemoney(xpOrderDetail.getMoney());
-// }
-//
-// }
+
BigDecimal orderMoney = startMoney.add(mileageMoney).add(order.getDurationMoney() != null ? order.getDurationMoney() : BigDecimal.ZERO)
.add(order.getLongDistancemoney() != null ? order.getLongDistancemoney() : BigDecimal.ZERO)
@@ -1872,87 +1844,6 @@
}
order.setAppUserId(null);
baseMapper.updateById(order);
-
-
- // 结束后的车辆操作
- if (vehicle != null) {
- // 修改车辆状态
- vehicle.setState(0);
- //发送巡游订单
- addCruiseMission(vehicle, order);
-// // 获取配置 根据配置判断是否该收车 如果是则找到收车点位进行收车操作
-// R<XpTaskRule> xpTaskRuleR = xpTaskRuleClient.queryDetail();
-// XpTaskRule xpTaskRule = xpTaskRuleR.getData();
-//
-// // 生成新的巡游单子 回到最新巡游的初始起点位置
-// XpCruiseOrder xpCruiseOrders = xpCruiseOrderMapper.selectOne(new LambdaQueryWrapper<XpCruiseOrder>().eq(XpCruiseOrder::getVehicleId, vehicle.getId()).eq(XpCruiseOrder::getStatus, 2).orderByDesc(BaseModel::getCreateTime).last("limit 1"));
-// int temp=0;
-// if(xpCruiseOrders==null){
-// temp=1;
-// //特殊情况 可能没有产生终止的订单 (到站点就被正常接单了)所以找正常订单
-// xpCruiseOrders=xpCruiseOrderMapper.selectOne(new LambdaQueryWrapper<XpCruiseOrder>().eq(XpCruiseOrder::getVehicleId, vehicle.getId()).eq(XpCruiseOrder::getStatus, 3).orderByDesc(BaseModel::getCreateTime).last("limit 1"));
-// }
-// XpCruiseOrder xpCruiseOrder = new XpCruiseOrder();
-// xpCruiseOrder.setVehicleId(vehicle.getId());
-// xpCruiseOrder.setFleetId(vehicle.getFleetId());
-// xpCruiseOrder.setVehicleVin(vehicle.getVehicleVin());
-// xpCruiseOrder.setOrderType(2);
-// // 返程起点是当前正常订单的终点
-// xpCruiseOrder.setStartPointId(order.getEndPointId());
-// xpCruiseOrder.setStartPointName(order.getEndPointName());
-// xpCruiseOrder.setStartLon(order.getEndLon());
-// xpCruiseOrder.setStartLat(order.getEndLat());
-//
-// // 完成的直接走终点 终止的走起点
-// if(temp==0){
-// xpCruiseOrder.setEndPointId(xpCruiseOrders.getStartPointId());
-// xpCruiseOrder.setEndPointName(xpCruiseOrders.getStartPointName());
-// xpCruiseOrder.setEndLon(xpCruiseOrders.getStartLon());
-// xpCruiseOrder.setEndLat(xpCruiseOrders.getStartLat());
-// }else {
-// xpCruiseOrder.setEndPointId(xpCruiseOrders.getEndPointId());
-// xpCruiseOrder.setEndPointName(xpCruiseOrders.getEndPointName());
-// xpCruiseOrder.setEndLon(xpCruiseOrders.getEndLon());
-// xpCruiseOrder.setEndLat(xpCruiseOrders.getEndLat());
-// }
-//
-//
-// xpCruiseOrder.setStatus(0);
-// xpCruiseOrder.setLastOrderId(xpCruiseOrders.getId());
-// xpCruiseOrder.setCreateTime(LocalDateTime.now());
-// xpCruiseOrder.setId("XU"+ IdUtil.fastUUID());
-//
-// // 判断当前时分秒是否大于收车时间
-// LocalTime vehicleCollectionTime = xpTaskRule.getVehicleCollectionTime();
-// if (vehicleCollectionTime.isBefore(LocalTime.now())) {
-// vehicle.setOperatingStatus(3);
-// //找到车辆的收车点位 更新终点点位
-// R<XpCruiseOrder> returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder);
-// xpCruiseOrder = returnCruisePoint.getData();
-// }
-// xpVehicleClient.updateVehicleById(vehicle);
-//
-// xpCruiseOrderMapper.insert(xpCruiseOrder);
-//
-//
-// R<XpPoint> xpPointR = xpPointClient.queryById(order.getEndPointId());
-// XpPoint data = xpPointR.getData();
-// //下发命令
-// // 添加自动结束行程定时任务job
-// Map<String, ? extends Object> jobMaps =
-// new ImmutableMap.Builder<String, String>().
-// put("id", xpCruiseOrder.getId())
-// .build();
-// QuartzManager.addJob(
-// AddCruiseMissionJob.class,
-// (AddCruiseMissionJob.name + xpCruiseOrder.getId()).toUpperCase(),
-// TimeJobType.ADD_CRUISE_MISSION,
-// DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(data.getParkingTimeLimit())),
-// jobMaps
-// );
-
-
- }
}
@@ -1964,6 +1855,7 @@
*/
public void addCruiseMission(XpVehicle vehicle, XpOrder order) {
+ log.info("添加巡游订单 {}", vehicle.getPlateNumber());
if (vehicle.getState() != 0 || vehicle.getOperatingStatus() != 1) {
log.info("添加巡游单失败,车辆状态限制 {}", vehicle.getState());
return;
@@ -2048,25 +1940,20 @@
}
xpVehicleClient.updateVehicleById(vehicle);
}
-
xpCruiseOrderMapper.insert(xpCruiseOrder);
-
-
- R<XpPoint> xpPointR = xpPointClient.queryById(order.getEndPointId());
- XpPoint data = xpPointR.getData();
- //下发命令
- // 添加自动结束行程定时任务job
- Map<String, ? extends Object> jobMaps =
- new ImmutableMap.Builder<String, String>().
- put("id", xpCruiseOrder.getId() + "")
- .build();
- QuartzManager.addJob(
- AddCruiseMissionJob.class,
- (AddCruiseMissionJob.name + xpCruiseOrder.getId()).toUpperCase(),
- TimeJobType.ADD_CRUISE_MISSION,
- DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(data.getParkingTimeLimit())),
- jobMaps
- );
+ log.info("添加巡游单成功 {}", xpCruiseOrder.getId());
+ //下发XUP巡游订单报文
+ PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setVin(xpCruiseOrder.getVehicleVin());
+ pushOrderDto.setOrderId("XU" + xpCruiseOrder.getId());
+ pushOrderDto.setStartLatitude(xpCruiseOrder.getStartLat());
+ pushOrderDto.setStartLongitude(xpCruiseOrder.getStartLon());
+ pushOrderDto.setEndLatitude(xpCruiseOrder.getEndLat());
+ pushOrderDto.setEndLongitude(xpCruiseOrder.getEndLon());
+ pushOrderDto.setOrderType(OrderType.CRUISE_ORDER);
+ pushOrderDto.setStage(2);
+ orderMissionClient.pushOrder(pushOrderDto);
+ log.info("下发XUP巡游订单报文成功");
}
--
Gitblit v1.7.1