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