From 0a68de6a5606869d6422a34742d8bc3cb7bdab21 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期四, 12 二月 2026 19:11:02 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi

---
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java |  103 ++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 97 insertions(+), 6 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 0b23609..26bd344 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
@@ -34,14 +34,13 @@
 import com.xiaopeng.api.model.order.XpOrderEvaluate;
 import com.xiaopeng.api.model.order.XpOrderReassign;
 import com.xiaopeng.api.vo.account.UserCouponVo;
-import com.xiaopeng.api.vo.order.FareBreakdownVo;
-import com.xiaopeng.api.vo.order.XpHistoryEndPointsVo;
-import com.xiaopeng.api.vo.order.XpHistoryStartPointsVo;
-import com.xiaopeng.api.vo.order.XpPointInfoVo;
+import com.xiaopeng.api.vo.order.*;
 import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo;
+import com.xiaopeng.common.core.constant.CacheConstants;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.exception.ServiceException;
 import com.xiaopeng.common.core.utils.DateUtils;
+import com.xiaopeng.common.core.utils.GeodesyUtil;
 import com.xiaopeng.common.core.utils.StringUtils;
 import com.xiaopeng.common.core.web.domain.BaseModel;
 import com.xiaopeng.common.core.web.page.PageInfo;
@@ -49,6 +48,9 @@
 import com.xiaopeng.common.security.utils.SecurityUtils;
 import com.xiaopeng.order.constant.I18nKeyConstant;
 import com.xiaopeng.order.job.jobs.EndTripJob;
+import com.xiaopeng.order.mangodb.model.OrderTrajectory;
+import com.xiaopeng.order.mangodb.service.OrderTrajectoryService;
+import com.xiaopeng.order.mangodb.model.OrderTrajectory;
 import com.xiaopeng.order.mapper.XpOrderMapper;
 import com.xiaopeng.order.model.dto.XpOrderCommentDto;
 import com.xiaopeng.order.model.dto.XpOrderPayDto;
@@ -66,7 +68,12 @@
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -107,7 +114,12 @@
     private final RedisService redisService;
     private final XpPricingClient xpPricingClient;
     private final XpSystemSettingClient xpSystemSettingClient;
+    private final OrderTrajectoryService orderTrajectoryService;
 
+    @Autowired
+    private MongoTemplate mongoTemplate;
+//    @Autowired
+//    private XpPricingUtil xpPricingUtil;
 
     @Override
     public OrderStatisticsDTO getOrderStatistics(StatisticsQueryDTO query) {
@@ -851,6 +863,36 @@
         if (pricing == null) {
             throw new ServiceException("当前城市未配置定价规则", I18nKeyConstant.ORDER_PRICING_NOT_EXISTS);
         }
+        // 查询订单轨迹
+        List<OrderTrajectory> trajectories = mongoTemplate.find(
+                new Query(Criteria.where("orderId").is(orderId))
+                        .with(Sort.by(Sort.Direction.ASC, "locatetime")),
+                OrderTrajectory.class
+        );
+        // 计算等待时间
+        LocalDateTime boardingTime = order.getBoardingTime();// 上车时间
+        LocalDateTime arrivalTime = order.getArrivalTime();// 车辆到达上车点时间
+        // 行程开始时间
+        Integer waitTime =Math.abs( (int) Duration.between(boardingTime, arrivalTime).getSeconds());
+        // 计算订单总行驶距离,单位米
+        Double totalDistance = 0.00D;
+        // 行程总时间 秒
+        LocalDateTime tripBegin = order.getTripBegin();
+        LocalDateTime tripEnd = order.getTripEnd();
+        long seconds = Duration.between(tripBegin, tripEnd).getSeconds();
+        for (OrderTrajectory trajectory : trajectories) {
+
+        }
+//        XpPricingCardVo xpPricingCardVo = xpPricingUtil.calculationPrice(
+//                order.getAppUserId().toString(),JSON.parseObject(pricing.getBasicPricingJson()),
+//                JSON.parseArray(pricing.getStartingFareJson()),
+//                pricing.getDynamicPricingJson(),
+//                pricing.getIsDynamicPrice(),
+//                totalDistance,
+//                seconds,
+//                order.getCityId()
+//        );
+
 //        Long id = pricing.getId();
 //        Integer pricingType = pricing.getPricingType();
 //        String basicPricingJson = pricing.getBasicPricingJson();
@@ -883,8 +925,8 @@
 //
 //        }
 
-        // 计算完价格后 挑选优惠券
-        GetUserCouponDto getUserCouponDto = new GetUserCouponDto();
+                // 计算完价格后 挑选优惠券
+                GetUserCouponDto getUserCouponDto = new GetUserCouponDto();
         getUserCouponDto.setUserId(Long.valueOf(uid));
         getUserCouponDto.setTotalAmount(order.getOrderMoney().doubleValue());
         R<UserCouponVo> userCouponVoR = xpAppUserCouponClient.getUserCoupon(getUserCouponDto);
@@ -912,6 +954,18 @@
     @Override
     public R<FareBreakdownVo> fareBreakdown(Long orderId, String uid) {
         XpOrder order = this.getById(orderId);
+        // 查询订单轨迹
+        List<OrderTrajectory> trajectories = mongoTemplate.find(
+                new Query(Criteria.where("orderId").is(orderId))
+                        .with(Sort.by(Sort.Direction.ASC, "locatetime")),
+                OrderTrajectory.class
+        );
+        // 计算订单总行驶距离,单位米
+        Double totalDistance = 0.00D;
+        for (OrderTrajectory trajectory : trajectories) {
+
+
+        }
         FareBreakdownVo fareBreakdownVo = new FareBreakdownVo();
 //        fareBreakdownVo.setStart();
 //        fareBreakdownVo.setMileage();
@@ -951,6 +1005,7 @@
 
     /**
      * 添加订单
+     *
      * @param xpOrder
      * @return
      */
@@ -973,6 +1028,7 @@
 
     /**
      * 获取订单数量
+     *
      * @param dto
      * @return
      */
@@ -982,6 +1038,41 @@
         return num.intValue();
     }
 
+    @Override
+    public void saveVehicleLocation(OrderTrajectory orderTrajectory) {
+        // 查询订单信息
+        XpOrder xpOrder = this.getById(orderTrajectory.getOrderId());
+
+        // 计算距离
+        // 获取上一次定位
+        String oldLocation = redisService.getCacheObject(CacheConstants.ORDER_OLD_LOCATION + orderTrajectory.getOrderId());
+        if(StringUtils.isEmpty(oldLocation)){
+            // 首次定位
+            xpOrder.setMileageKilometers(0D);
+            this.updateById(xpOrder);
+            orderTrajectory.setDistance(0D);
+            // 存储mongo数据
+            orderTrajectoryService.create(orderTrajectory);
+            // 存储首次定位
+            redisService.setCacheObject(CacheConstants.ORDER_OLD_LOCATION + orderTrajectory.getOrderId(), orderTrajectory.getLocation());
+        }else {
+            Map<String, Double> distance = GeodesyUtil.getDistance(orderTrajectory.getLocation(), oldLocation);
+            if(null != distance){
+                Double distance1 = distance.get("WGS84");
+                if(distance1 > 50 && xpOrder.getStatus() == 6){//大于50米表示在移动,且在服务中的时候记录里程
+                    xpOrder.setMileageKilometers(BigDecimal.valueOf(xpOrder.getMileageKilometers()).add(new BigDecimal(distance1)).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
+                    this.updateById(xpOrder);
+                    // 存储本次距离
+                    orderTrajectory.setDistance(distance1);
+                    // 存储mongo数据
+                    orderTrajectoryService.create(orderTrajectory);
+                }
+            }else{
+                log.error("调用高德计算距离出错");
+            }
+        }
+    }
+
 
     /**
      * 获取当前用户正在执行的订单

--
Gitblit v1.7.1