From 216d50aa9f7d2402dea1ca2087c5f23255916664 Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期六, 21 三月 2026 19:39:01 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java |  131 +++++++++++++++++++------------------------
 1 files changed, 59 insertions(+), 72 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 f1fdc2c..6a65cdc 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
@@ -1260,12 +1260,13 @@
         try {
             redisService.removeByPattern(order.getQueueName(), order.getOrderNumber());
         } catch (Exception e) {
+            e.printStackTrace();
         }
         //判断还原车辆状态
         if (null == order.getVehicleId()) {
             Object cacheObject1 = redisService.getCacheObject("CREATE_ORDER:" + order.getId().toString());
             if (null != cacheObject1) {
-                com.alibaba.fastjson2.JSONObject jsonObject = com.alibaba.fastjson2.JSON.parseObject(cacheObject1.toString());
+                JSONObject jsonObject = JSON.parseObject(cacheObject1.toString());
                 String vin = jsonObject.getString("vin");
                 XpVehicle vehicle = xpVehicleClient.findByVehicleVin(vin).getData();
                 if (null != vehicle && 0 != vehicle.getState()) {
@@ -1302,21 +1303,6 @@
             Integer i = Integer.valueOf(cacheObject.toString());
             redisService.setCacheCancelOrder("CANCEL_ORDER_" + uid, i + 1);
         }
-
-        // 消息推送
-//        Map<String, Object> params = new HashMap<>();
-//        Map<String, Object> content = new HashMap<>();
-//        content.put("orderId", order.getId().toString());
-//        content.put("status", OrderStatusEnum.CANCELED.getCode());
-//        params.put("type", PushMessageTypeEnum.ORDER_STATUS.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(uid);
-//        xpPushMessageClient.sendStatus(sendMessageDTO);
-//        log.info("订单取消消息推送完毕");
 
         // 移除mongo数据
         xpPricingClient.deleteXpGeoQueryEntity(order.getId().toString());
@@ -1481,6 +1467,9 @@
         if(xpOrder.getStatus() >= 8){
             return R.fail("订单已结束");
         }
+        Long appUserId = xpOrder.getAppUserId();
+        // 查询车辆
+        XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
         switch (status) {
             case 4:
                 // 查询起点点位
@@ -1505,6 +1494,8 @@
                 LocalDateTime now = LocalDateTime.now();
                 xpOrder.setBoardingTime(now);
                 xpOrder.setRideTime(now);
+                //推送行起点到终点的驶轨迹给乘客端
+                sendRoute(appUserId.toString(), orderId, "ORDER_NAVIGATION_END_DATA", xpVehicle.getVehicleVin());
                 // 删除定时任务job
                 QuartzManager.removeJob((OrderCancelJob.name + xpOrder.getId()).toUpperCase(), TimeJobType.ORDER_CANCEL);
                 break;
@@ -1515,8 +1506,6 @@
             case 7:
                 xpOrder.setGetoffTime(LocalDateTime.now());
                 // 解析下车地点
-                // 查询车辆
-                XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
                 VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
                 if(Objects.nonNull(vehiclePosition)){
                     GeoJsonPoint point = vehiclePosition.getPoint();
@@ -1582,7 +1571,7 @@
                         endTripJobMaps
                 );
                 // 添加车辆到达终点后限停时间到后驶离的定时任务
-                //时间到后添加巡游订单,解绑车辆关系,车辆驶离点位
+                //时间到后将车辆状态回滚到空闲、添加巡游订单,解绑用户和车辆关系,车辆驶离点位
                 XpPoint point = xpPointClient.queryById(xpOrder.getEndPointId()).getData();
                 Map<String, ? extends Object> jobMaps =
                         new ImmutableMap.Builder<String, String>()
@@ -1627,11 +1616,6 @@
         order.setStatus(8);
         order.setAppUserId(null);
         order.setTripEnd(LocalDateTime.now());
-
-        double exactMinutes = Duration.between(order.getBoardingTime(), order.getTripEnd()).toMillis() / (1000.0 * 60);
-        exactMinutes = new BigDecimal(exactMinutes).setScale(2, RoundingMode.HALF_UP).doubleValue();
-        order.setDuration(exactMinutes);
-
         baseMapper.updateById(order);
         redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 8, 24L, TimeUnit.HOURS);
 
@@ -1678,6 +1662,8 @@
             xpOrderDetail.setOrderId(orderId);
             xpOrderDetail.setType(1);
             xpOrderDetail.setMileage(new BigDecimal(mileageKilometers).setScale(2, RoundingMode.HALF_UP));
+            String currentTimeSlot = DateUtils.getCurrentTimeSlot();
+            xpOrderDetail.setTime(currentTimeSlot);
             xpOrderDetail.setDuration(duration1);
             xpOrderDetail.setMoney(new BigDecimal(xpPricingCardVo.getStartPrice()).setScale(2, RoundingMode.HALF_UP));
             xpOrderDetails.add(xpOrderDetail);
@@ -1685,7 +1671,6 @@
             xpOrderDetail.setDetailType(2);
             xpOrderDetail.setOrderId(orderId);
             xpOrderDetail.setType(1);
-            xpOrderDetail.setMileage(new BigDecimal(mileageKilometers).setScale(2, RoundingMode.HALF_UP));
             xpOrderDetail.setMoney(new BigDecimal(xpPricingCardVo.getDistancePrice()).setScale(2,RoundingMode.HALF_UP));
             xpOrderDetails.add(xpOrderDetail);
             xpOrderDetail = new XpOrderDetail();
@@ -2424,16 +2409,8 @@
 
     @Override
     public R<FareBreakdownVo> fareBreakdown(Long orderId, String uid) {
-
         XpOrder order = this.getById(orderId);
         order.setAppUserId(null);
-        // 查询订单轨迹
-        List<OrderTrajectory> trajectories = mongoTemplate.find(
-                new Query(Criteria.where("orderId").is(orderId))
-                        .with(Sort.by(Sort.Direction.ASC, "locatetime")),
-                OrderTrajectory.class
-        );
-
         FareBreakdownVo res = new FareBreakdownVo();
         res.setChangeMoneyFlag(order.getChangeMoneyFlag());
 
@@ -2461,22 +2438,6 @@
             }
         }
 
-//        if (order.getDuration() != null && order.getDuration() > 0) {
-//            FareBreakdownDetailVo durationDetail = new FareBreakdownDetailVo();
-//            durationDetail.setType(order.getDurationType());
-//            durationDetail.setDuration(order.getDuration());
-//            durationDetail.setMoney(order.getDurationMoney());
-//            duration.add(durationDetail);
-//        }
-
-//
-//        if (order.getLongDistance() != null && order.getLongDistance() > 0) {
-//            FareBreakdownDetailVo longDistanceDetail = new FareBreakdownDetailVo();
-//            longDistanceDetail.setType(order.getLongDistanceType());
-//            longDistanceDetail.setMileage(BigDecimal.valueOf(order.getLongDistance()));
-//            longDistanceDetail.setMoney(order.getLongDistancemoney());
-//            longDistance.add(longDistanceDetail);
-//        }
         res.setStart(start);
         res.setMileage(mileage);
         res.setDuration(duration);
@@ -2492,9 +2453,7 @@
             order.setTripEnd(tripEnd);
             this.updateById(order);
         }
-
-        double exactMinutes = Duration.between(order.getBoardingTime(), order.getTripEnd()).toMillis() / (1000.0 * 60);
-        res.setTime(new BigDecimal(exactMinutes).setScale(2, RoundingMode.HALF_UP));
+        res.setTime(new BigDecimal(order.getDuration() == null ? 0 : order.getDuration()).multiply(new BigDecimal(60)).setScale(0, RoundingMode.HALF_UP));
         return R.ok(res);
     }
 
@@ -2573,7 +2532,7 @@
     public void saveVehicleLocation(OrderTrajectory orderTrajectory) {
         // 查询订单信息
         Integer status = redisService.getCacheObject("ORDER_STATUS:" + orderTrajectory.getOrderId());
-        if(status != 6){
+        if(status < 6){
             return;
         }
 
@@ -2585,7 +2544,7 @@
             // 存储mongo数据
             mongoTemplate.save(orderTrajectory);
             // 存储首次定位
-            redisService.setCacheObject(CacheConstants.ORDER_OLD_LOCATION + orderTrajectory.getOrderId(), orderTrajectory.getLocation());
+            redisService.setCacheObject(CacheConstants.ORDER_OLD_LOCATION + orderTrajectory.getOrderId(), orderTrajectory.getLocation(), 1L, TimeUnit.HOURS);
         } else {
             Map<String, Double> distance = GeodesyUtil.getDistance(orderTrajectory.getLocation(), oldLocation);
             if (null != distance) {
@@ -2595,7 +2554,7 @@
                 // 存储mongo数据
                 mongoTemplate.save(orderTrajectory);
                 // 更新定位
-                redisService.setCacheObject(CacheConstants.ORDER_OLD_LOCATION + orderTrajectory.getOrderId(), orderTrajectory.getLocation());
+                redisService.setCacheObject(CacheConstants.ORDER_OLD_LOCATION + orderTrajectory.getOrderId(), orderTrajectory.getLocation(), 1L, TimeUnit.HOURS);
             } else {
                 log.error("调用高德计算距离出错");
             }
@@ -2788,27 +2747,55 @@
                 }
                 // 存mongo数据
                 xpPricingClient.updateXpGeoQueryEntity(order.getId().toString());
-
-
                 // 修改车辆信息
                 vehicle.setState(1);
                 xpVehicleClient.updateVehicleById(vehicle);
 
                 //绑定用户和车辆关系
                 addTaxiPassengerVo.setUid(appUserId.toString());
-
                 order.setAppUserId(null);
                 this.updateById(order);
+
+                //构建推送消息
+                Map<String, Object> params = new HashMap<>();
+                Map<String, Object> content = new HashMap<>();
+                content.put("orderId", orderId.toString());
+                content.put("status", 2);
+                params.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc());
+                params.put("content", JSONObject.toJSONString(content));
+                params.put("timestamp", System.currentTimeMillis() + "");
+                String message = JSONObject.toJSONString(params);
+                SendMessageDTO dto1 = new SendMessageDTO();
+                dto1.setAppUserId(appUserId + "");
+                dto1.setMessage(message);
+                R<String> stringR = xpPushMessageClient.sendStatus(dto1);
+
+                //推送失败,重试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> stringR1 = xpPushMessageClient.sendStatus(dto1);
+                            if(stringR1.getCode() == Constants.SUCCESS){
+                                break;
+                            }
+                            try {
+                                Thread.sleep(1000);
+                            } catch (InterruptedException e) {
+                                throw new RuntimeException(e);
+                            }
+                            log.info("推送订单状态消息失败:{} {} {}", stringR1.getMsg(), JSON.toJSONString(dto), order.getOrderNumber());
+                        }
+                    });
+                }
+
+
                 redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 2, 24L, TimeUnit.HOURS);
                 addTaxiPassengerVo.setOrderNo(order.getOrderNumber());
-                // TODO appid
                 addTaxiPassengerVo.setAppId(appid);
                 userVehicleClient.addTaxiPassenger(addTaxiPassengerVo);
                 //推送乘客车辆到达预约点的导航数据
                 sendRoute(addTaxiPassengerVo.getUid(), orderId, "ORDER_NAVIGATION_START_DATA", dto.getXpVehicleVin());
-            } else {
-                //推送行起点到终点的驶轨迹给乘客端
-                sendRoute(appUserId.toString(), orderId, "ORDER_NAVIGATION_END_DATA", dto.getXpVehicleVin());
             }
         }
     }
@@ -2900,16 +2887,16 @@
             XpPoint endPoint = xpPointR1.getData();
             xpOrderDetailVO.setEndParkingTimeLimit(endPoint.getParkingTimeLimit());
         }
-        // 算时间
-        if (xpOrder.getStatus() == 1) {
-            R<Integer> r = xpPricingClient.getWaitTime(new LonLatDto(xpOrder.getStartLon(), xpOrder.getStartLat()));
-            if (r.getCode() == R.SUCCESS) {
-                xpOrderDetailVO.setEstimatedTime(r.getData());
-            } else {
-                throw new RuntimeException(r.getMsg());
-            }
-
-        }
+//        // 算时间
+//        if (xpOrder.getStatus() == 1) {
+//            R<Integer> r = xpPricingClient.getWaitTime(new LonLatDto(xpOrder.getStartLon(), xpOrder.getStartLat()));
+//            if (r.getCode() == R.SUCCESS) {
+//                xpOrderDetailVO.setEstimatedTime(r.getData());
+//            } else {
+//                throw new RuntimeException(r.getMsg());
+//            }
+//
+//        }
 
         if (xpOrder.getVehicleId() != null) {
             R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(xpOrder.getVehicleId());

--
Gitblit v1.7.1