From 33c7c61e0319b240e72f7ae0471630a12bd45c91 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期五, 13 二月 2026 17:03:08 +0800
Subject: [PATCH] bug修改,计算费用工具类

---
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java |   62 ++++++++++++++++++++++++-------
 1 files changed, 48 insertions(+), 14 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 9fd1e5f..4971207 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
@@ -71,6 +71,7 @@
 import com.xiaopeng.order.service.IXpOrderEvaluateService;
 import com.xiaopeng.order.service.IXpOrderReassignService;
 import com.xiaopeng.order.service.IXpOrderService;
+import com.xiaopeng.order.utils.TaxiPricingDemoService;
 import com.xiaopeng.order.utils.holiday.HolidayUtil;
 import com.xiaopeng.order.vo.OrderDetailVo;
 import io.swagger.annotations.ApiModelProperty;
@@ -771,11 +772,11 @@
         // 消息推送
         Map<String, Object> params = new HashMap<>();
         Map<String, Object> content = new HashMap<>();
-        content.put("orderId",order.getId());
+        content.put("orderId", order.getId());
         content.put("status", OrderStatusEnum.CANCELED.getCode());
         params.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc());
         params.put("content", com.alibaba.fastjson2.JSONObject.toJSONString(content));
-        params.put("timestamp", new Date().getTime()+"");
+        params.put("timestamp", new Date().getTime() + "");
         String message = JSONObject.toJSONString(params);
         SendMessageDTO sendMessageDTO = new SendMessageDTO();
         sendMessageDTO.setMessage(message);
@@ -920,8 +921,41 @@
 
             userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
         }
-        // 计算起步价
+        // 费用
+        // 查询订单轨迹
+        List<OrderTrajectory> trajectories = mongoTemplate.find(
+                new Query(Criteria.where("orderId").is(orderId))
+                        .with(Sort.by(Sort.Direction.ASC, "locatetime")),
+                OrderTrajectory.class
+        );
+        List<TaxiPricingDemoService.GpsPoint> gpsPoints = new ArrayList<>();
+        for (OrderTrajectory trajectory : trajectories) {
+            TaxiPricingDemoService.GpsPoint point = new TaxiPricingDemoService.GpsPoint(trajectory.getDistance(),trajectory.getLocatetime() );
+            gpsPoints.add(point);
+        }
+        TaxiPricingDemoService.PricingConfig config = new TaxiPricingDemoService.PricingConfig();
+        config.peak = new TaxiPricingDemoService.PricingRule("高峰期", "14:40", "14:46", 15.0, 3.0, 5.0, 3.0, 0.8);
+        config.night = new TaxiPricingDemoService.PricingRule("夜间行驶", "14:47", "14:48", 18.0, 3.0, 5.0, 3.5, 1.0);
+        config.holiday = new TaxiPricingDemoService.PricingRule("节假日", "18:47", "18:48", 18.0, 3.0, 5.0, 4, 2.0);
+        config.normals.add(new TaxiPricingDemoService.PricingRule("普通时段", "14:46", "14:47", 10.0, 3.0, 5.0, 2.4, 0.5));
+        config.normals.add(new TaxiPricingDemoService.PricingRule("普通时段", "14:48", "17:59", 10.0, 3.0, 5.0, 2.4, 0.5));
 
+        // --- 远途加价区间配置 (关键修改) ---
+        // 1. 超过 num1(12) 不足 num2(20), 加收 num3(1.2)
+        config.longSteps.add(new TaxiPricingDemoService.LongRangeStep(5.0, 6.0, 1.2));
+        // 2. 超过 num4(20) 不足 num5(35), 加收 num6(2.0)
+        config.longSteps.add(new TaxiPricingDemoService.LongRangeStep(6.0, 7.0, 2.0));
+        // 3. 超过 num7(35) 以后, 加收 num8(3.5) -> numEnd 传个极大值
+        config.longSteps.add(new TaxiPricingDemoService.LongRangeStep(7.0, 8.0, 3.5));
+
+        TaxiPricingDemoService.TaxiPricingService service = new TaxiPricingDemoService.TaxiPricingService();
+        Map<String, BigDecimal> bill = service.calculateOrderPrice(DateUtils.toDate(order.getCreateTime()), order.getMileageKilometers(), gpsPoints, config);
+        System.err.println("======= 订单计费账单 =======");
+        bill.forEach((detail, price) -> System.err.println(detail + ": " + price + " 元"));
+
+        BigDecimal totalAmount = bill.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+        System.err.println("--------------------------");
+        System.err.println("应付总额: " + totalAmount + " 元");
 
 //        // 计算实际价格
 //        // 根据订单所属开通城市id 查询定价
@@ -1277,11 +1311,10 @@
 ////        );
 
 
-
     }
 
 
-    private MileageDto  mileageType(MileageDto param,JSONArray startingFareJsonArray, Date mileageDate, LocalDateTime begin, String num14, String num16, String num17, String num21, String num22, String num24, String num25, String num30, String num31) {
+    private MileageDto mileageType(MileageDto param, JSONArray startingFareJsonArray, Date mileageDate, LocalDateTime begin, String num14, String num16, String num17, String num21, String num22, String num24, String num25, String num30, String num31) {
         // 计算出是在哪个普通时间段内
         for (Object o : startingFareJsonArray) {
             JSONObject startingFare = (JSONObject) o;
@@ -1296,7 +1329,7 @@
             calendarEnd.set(Calendar.MINUTE, Integer.valueOf(startingFare.getString("num2").split(":")[1]));
             // 找到符合条件的直接跳出循环
             if (mileageDate.getTime() > calendarStart.getTimeInMillis() && mileageDate.getTime() < calendarEnd.getTimeInMillis()) {
-                param.setMileage(startingFare.getString("num6")) ;
+                param.setMileage(startingFare.getString("num6"));
                 param.setTime(startingFare.getString("num7"));
                 param.setMileageTypeTemp(1);
                 break;
@@ -1318,7 +1351,7 @@
         if (date.getTime() > calendarStart.getTimeInMillis() && date.getTime() < calendarEnd.getTimeInMillis()
         ) {
 
-            param.setMileage(num16) ;
+            param.setMileage(num16);
             param.setTime(num17);
             param.setMileageTypeTemp(2);
         }
@@ -1345,7 +1378,7 @@
         if ((date.getTime() > calendar1Start.getTimeInMillis() && date.getTime() < calendar1End.getTimeInMillis())
                 || (date.getTime() > calendar2Start.getTimeInMillis() && date.getTime() < calendar2End.getTimeInMillis())) {
 
-            param.setMileage(num24) ;
+            param.setMileage(num24);
             param.setTime(num25);
             param.setMileageTypeTemp(3);
         }
@@ -1353,7 +1386,7 @@
         boolean holiday = holidayUtil.isHoliday(localDate);
         if (holiday) {
             // 判断是否为节假日 起步价修改
-            param.setMileage(num30) ;
+            param.setMileage(num30);
             param.setTime(num31);
             param.setMileageTypeTemp(4);
         }
@@ -1605,7 +1638,7 @@
         BeanUtils.copyProperties(order, orderDetailVo);
         // 查询车辆信息
         XpVehicle vehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
-        if (vehicle!=null){
+        if (vehicle != null) {
             orderDetailVo.setVehicleCode(vehicle.getVehicleCode());
             orderDetailVo.setPlateNumber(vehicle.getPlateNumber());
             orderDetailVo.setVehicleColor(vehicle.getVehicleColor());
@@ -1627,15 +1660,15 @@
                 OrderTrajectory.class
         );
         orderDetailVo.setTrajectories(trajectories);
-        if (order.getTripBegin()!=null&&order.getTripEnd()!=null){
+        if (order.getTripBegin() != null && order.getTripEnd() != null) {
             // 计算两个时间相差多少分钟
             long minutesDifference = Duration.between(order.getTripBegin(), order.getTripEnd()).toMinutes();
             orderDetailVo.setOrderTime(minutesDifference);
-        }else{
+        } else {
             orderDetailVo.setOrderTime(0l);
         }
-        if (order.getStartMileage()!=null){
-            orderDetailVo.setTotalMileage(order.getStartMileage()+(order.getMileageKilometers()!=null?order.getMileageKilometers():0D));
+        if (order.getStartMileage() != null) {
+            orderDetailVo.setTotalMileage(order.getStartMileage() + (order.getMileageKilometers() != null ? order.getMileageKilometers() : 0D));
 
         }
         return orderDetailVo;
@@ -1644,6 +1677,7 @@
 
     /**
      * 成功操作下发命令后调用 用于弹出redis队列的获取成功的数据
+     *
      * @param dto
      */
     @Override

--
Gitblit v1.7.1