无关风月
2026-02-14 ad37d93e63f3151c7863035c9ea80f7c8f6f57a5
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -8,6 +8,7 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.ImmutableMap;
import com.xiaopeng.api.dto.account.GetUserCouponDto;
import com.xiaopeng.api.dto.account.UseUserCouponDto;
import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.dto.order.GetOrderNumDto;
@@ -98,6 +99,7 @@
import java.text.SimpleDateFormat;
import java.time.*;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -999,6 +1001,47 @@
        System.err.println("--------------------------");
        System.err.println("应付总额: " + totalAmount + " 元");
        BigDecimal startMoney = BigDecimal.ZERO;
         // 默认费率1
        double priceRate = 1;
        if (pricing.getIsDynamicPrice() == 1) {
            // 先判断是否已经调价过了
            Object userDynamicPriceObj = redisService.getCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid);
            if (userDynamicPriceObj != null) {
                // 是否调价过了
                priceRate = Double.parseDouble(userDynamicPriceObj.toString());
            } else {
                // 没有调过
                //是否触发动态调价 redis获取
                Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + order.getCityId());
                if (dynamicPriceObj != null) {
                    JSONObject jsonObject = JSONObject.parseObject(pricing.getDynamicPricingJson());
                    // 触发动态调价
                    // value=时间
                    String timeStr = dynamicPriceObj.toString();
                    // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
                    Integer num = this.getOrderNum(new GetOrderNumDto(timeStr, order.getCityId()));
                    // X单上升一次调价
                    Integer orderNum = getOrderNum(jsonObject, 4);
                    // 需要调价的次数
                    int count = num / orderNum;
                    if (count > 0) {
                        // 计算每次上升的费率
                        Integer upRate = getOrderNum(jsonObject, 5);
                        BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
                        for (int i = count; i > 0; i--) {
                            // 当前费率+(费率*上升百分比)
                            priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
                        }
                        // 冷却时间
                        Integer time = getOrderNum(jsonObject, 6);
                        // 触发调价了
                        redisService.setCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid, priceRate, time.longValue(), TimeUnit.MINUTES);
                    }
                }
            }
        }
        // 封装费用明细数据
        for (Map.Entry<String, BigDecimal> stringBigDecimalEntry : bill.entrySet()) {
            // 封装起步价
@@ -1031,7 +1074,8 @@
                    BigDecimal distance = bill.get(key1);
                    BigDecimal money = bill.get(key2);
                    mileageDetail.setMileage(distance);
                    mileageDetail.setMoney(money);
                    order.setStartMoney(money.multiply(BigDecimal.valueOf(priceRate)));
                    mileageDetail.setMoney(money.multiply(BigDecimal.valueOf(priceRate)));
                } else if (key.contains("夜间行驶")) {
                    mileageDetail.setType(2);
                    String key1 = "distance夜间行驶" + key.split("\\|")[1];
@@ -1039,7 +1083,9 @@
                    BigDecimal distance = bill.get(key1);
                    BigDecimal money = bill.get(key2);
                    mileageDetail.setMileage(distance);
                    mileageDetail.setMoney(money);
                    order.setStartMoney(money.multiply(BigDecimal.valueOf(priceRate)));
                    mileageDetail.setMoney(money.multiply(BigDecimal.valueOf(priceRate)));
                } else if (key.contains("高峰期")) {
                    mileageDetail.setType(3);
                    String key1 = "distance高峰期" + key.split("\\|")[1];
@@ -1047,7 +1093,9 @@
                    BigDecimal distance = bill.get(key1);
                    BigDecimal money = bill.get(key2);
                    mileageDetail.setMileage(distance);
                    mileageDetail.setMoney(money);
                    order.setStartMoney(money.multiply(BigDecimal.valueOf(priceRate)));
                    mileageDetail.setMoney(money.multiply(BigDecimal.valueOf(priceRate)));
                } else if (key.contains("节假")) {
                    mileageDetail.setType(4);
                    String key1 = "distance节假日" + key.split("\\|")[1];
@@ -1055,10 +1103,10 @@
                    BigDecimal distance = bill.get(key1);
                    BigDecimal money = bill.get(key2);
                    mileageDetail.setMileage(distance);
                    mileageDetail.setMoney(money);
                    order.setStartMoney(money.multiply(BigDecimal.valueOf(priceRate)));
                    mileageDetail.setMoney(money.multiply(BigDecimal.valueOf(priceRate)));
                }
                mileage.add(mileageDetail);
            }
            // 封装时长费
            FareBreakdownDetailVo timeDetail = new FareBreakdownDetailVo();
@@ -1115,7 +1163,7 @@
        order.setOrderMoney(orderMoney);
        baseMapper.updateById(order);
        if (order.getCouponId() != null) {
            GetUserCouponDto useUserCouponDto = new GetUserCouponDto();
            UseUserCouponDto useUserCouponDto = new UseUserCouponDto();
            useUserCouponDto.setUserId(Long.valueOf(uid));
            useUserCouponDto.setTotalAmount(order.getOrderMoney().doubleValue());
            useUserCouponDto.setOpenCityId(order.getCityId());