From 7bea01d99461a015b2c17e62bfbbe5db1f7ccf82 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期六, 21 三月 2026 23:25:33 +0800
Subject: [PATCH] 修改后台结束订单流程bug和完善查询车辆温度
---
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java | 150 ++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 128 insertions(+), 22 deletions(-)
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 6a65cdc..1d776b1 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
@@ -757,32 +757,50 @@
* 关闭订单
*/
private void closeOrder(XpOrder order) {
- // 更新订单状态为已完成(8)
- this.lambdaUpdate().set(XpOrder::getStatus, 7)
- .eq(XpOrder::getId, order.getId()).update();
+ XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
+ order.setStatus(7);
+ order.setGetoffTime(LocalDateTime.now());
+ // 解析下车地点
+ VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
+ if(Objects.nonNull(vehiclePosition)){
+ GeoJsonPoint point = vehiclePosition.getPoint();
+ if(Objects.nonNull(point)){
+ double x = point.getX();
+ double y = point.getY();
+ Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(x), String.valueOf(y));
+ order.setGetoffAddress(geocode.get("address"));
+ }
+ }
+ //计算行驶总距离和时长
+ List<OrderTrajectory> orderTrajectoryList = mongoTemplate.find(new Query().addCriteria(Criteria.where("orderId").is(order.getId())), OrderTrajectory.class);
+ Double reduce = orderTrajectoryList.stream().map(OrderTrajectory::getDistance).reduce(0.0, Double::sum);
+ order.setMileageKilometers(new BigDecimal(reduce).divide(new BigDecimal(1000)).setScale(4, RoundingMode.HALF_EVEN).doubleValue());
+ long duration = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) - order.getTripBegin().toEpochSecond(ZoneOffset.of("+8"));
+ order.setDuration(new BigDecimal(duration).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
+ Long appUserId = order.getAppUserId();
+ order.setAppUserId(null);
+ this.updateById(order);
- //结束行程
- endTrip(order.getId(), order.getAppUserId().toString());
// 消息推送
- Map<String, Object> params = new HashMap<>();
- Map<String, Object> content = new HashMap<>();
- content.put("orderId", order.getId().toString());
- content.put("status", OrderStatusEnum.APPROVAL_REJECTION.getCode());
- params.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc());
- params.put("content", com.alibaba.fastjson2.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(order.getAppUserId()));
- R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO);
+ Map<String, Object> params1 = new HashMap<>();
+ Map<String, Object> content1 = new HashMap<>();
+ content1.put("orderId", order.getId().toString());
+ content1.put("status", OrderStatusEnum.SEE_OFF_GUESTS.getCode());
+ params1.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc());
+ params1.put("content", JSON.toJSONString(content1));
+ params1.put("timestamp", new Date().getTime() + "");
+ String message1 = JSON.toJSONString(params1);
+ SendMessageDTO sendMessageDTO1 = new SendMessageDTO();
+ sendMessageDTO1.setMessage(message1);
+ sendMessageDTO1.setAppUserId(appUserId.toString());
+ R<String> stringR1 = xpPushMessageClient.sendStatus(sendMessageDTO1);
//推送失败,重试3次
- if(stringR.getCode() != Constants.SUCCESS){
+ if(stringR1.getCode() != Constants.SUCCESS){
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
executor.execute(() -> {
for (int i = 0; i < 3; i++) {
- R<String> stringR1 = xpPushMessageClient.sendStatus(sendMessageDTO);
- if(stringR1.getCode() == Constants.SUCCESS){
+ R<String> stringR2 = xpPushMessageClient.sendStatus(sendMessageDTO1);
+ if(stringR2.getCode() == Constants.SUCCESS){
break;
}
try {
@@ -790,11 +808,99 @@
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
- log.info("运维人员关闭订单推送订单状态消息失败:{} {} {}", stringR1.getMsg(), JSON.toJSONString(sendMessageDTO), order.getOrderNumber());
+ log.info("运维人员关闭订单推送订单状态消息失败:{} {} {}", stringR2.getMsg(), JSON.toJSONString(sendMessageDTO1), order.getOrderNumber());
}
});
}
- log.info("订单关闭成功,订单ID: {}, 操作人: {}", order.getId(), SecurityUtils.getUsername());
+
+ // 推送倒计时消息
+ Map<String, Object> params = new HashMap<>();
+ Map<String, Object> content = new HashMap<>();
+ content.put("orderId", order.getId().toString());
+ content.put("isOpen", 1);
+ params.put("type", PushMessageTypeEnum.OPEN_TRUNK.getDesc());
+ params.put("content", JSON.toJSONString(content));
+ params.put("timestamp", new Date().getTime() + "");
+ String message = JSON.toJSONString(params);
+ SendMessageDTO sendMessageDTO = new SendMessageDTO();
+ sendMessageDTO.setMessage(message);
+ sendMessageDTO.setAppUserId(appUserId.toString());
+ R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO);
+ //推送失败,重试3次
+ if(stringR.getCode() != Constants.SUCCESS){
+ ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
+ executor.execute(() -> {
+ for (int i = 0; i < 3; i++) {
+ R<String> stringR2 = xpPushMessageClient.sendStatus(sendMessageDTO);
+ if(stringR2.getCode() == Constants.SUCCESS){
+ break;
+ }
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ log.info("推送倒计时消息失败:{} {} {}", stringR2.getMsg(), JSON.toJSONString(sendMessageDTO), order.getOrderNumber());
+ }
+ });
+ }
+
+ //给XPU推送订单取消的报文
+ PushOrderDto pushOrderDto = new PushOrderDto();
+ pushOrderDto.setOrderId(order.getId().toString());
+ pushOrderDto.setVin(xpVehicle.getVehicleVin());
+ pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
+ orderMissionClient.cancelOrder(pushOrderDto);
+
+ //结束行程,修改状态和计算费用
+ endTrip(order.getId(), appUserId.toString());
+
+ // 消息推送
+ Map<String, Object> params2 = new HashMap<>();
+ Map<String, Object> content2 = new HashMap<>();
+ content2.put("orderId", order.getId().toString());
+ content2.put("status", OrderStatusEnum.APPROVAL_REJECTION.getCode());
+ params2.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc());
+ params2.put("content", JSON.toJSONString(content2));
+ params2.put("timestamp", new Date().getTime() + "");
+ String message2 = JSON.toJSONString(params2);
+ SendMessageDTO sendMessageDTO2 = new SendMessageDTO();
+ sendMessageDTO2.setMessage(message2);
+ sendMessageDTO2.setAppUserId(appUserId.toString());
+ R<String> stringR2 = xpPushMessageClient.sendStatus(sendMessageDTO2);
+ //推送失败,重试3次
+ if(stringR2.getCode() != Constants.SUCCESS){
+ ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
+ executor.execute(() -> {
+ for (int i = 0; i < 3; i++) {
+ R<String> stringR3 = xpPushMessageClient.sendStatus(sendMessageDTO2);
+ if(stringR3.getCode() == Constants.SUCCESS){
+ break;
+ }
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ log.info("运维人员关闭订单推送订单状态消息失败:{} {} {}", stringR3.getMsg(), JSON.toJSONString(sendMessageDTO1), order.getOrderNumber());
+ }
+ });
+ }
+
+ //创建定时任务执行延迟驶离终点和下发巡游单
+ XpPoint point = xpPointClient.queryById(order.getEndPointId()).getData();
+ Map<String, ? extends Object> jobMaps =
+ new ImmutableMap.Builder<String, String>()
+ .put("id", order.getId().toString())
+ .put("appid", appid)
+ .build();
+ QuartzManager.addJob(
+ AddCruiseMissionJob.class,
+ (AddCruiseMissionJob.name + order.getId()).toUpperCase(),
+ TimeJobType.ADD_CRUISE_MISSION,
+ DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(point.getParkingTimeLimit())),
+ jobMaps
+ );
}
/**
--
Gitblit v1.7.1