From 759c5b1cad51c74c590135ebadbfb410731dcd10 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期六, 14 二月 2026 16:55:57 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/XpPricingUtil.java |   80 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 80 insertions(+), 0 deletions(-)

diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/XpPricingUtil.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/XpPricingUtil.java
index 221bffa..29bef73 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/XpPricingUtil.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/XpPricingUtil.java
@@ -64,6 +64,86 @@
 
 
     /**
+     * 计算一口价
+     */
+    public XpPricingCardVo calculationFixedPrice(String uid,JSONObject rule, JSONArray startingFareJson, double distance, long duration, long wait, Double waitMoney,Integer isDynamicPriceStatus,Long openCityId,String dynamicPricingJson) {
+        // 默认费率1
+        double priceRate=1;
+        if(isDynamicPriceStatus==1){
+            // 先判断是否已经调价过了
+            Object userDynamicPriceObj = redisService.getCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid);
+            if(userDynamicPriceObj!=null){
+                // 是否调价过了
+                priceRate = Double.parseDouble(userDynamicPriceObj.toString());
+            }else {
+                // 没有调过
+                //是否触发动态调价 redis获取
+                Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + openCityId);
+                if(dynamicPriceObj!=null){
+                    JSONObject jsonObject = JSONObject.parseObject(dynamicPricingJson);
+                    // 触发动态调价
+                    // value=时间
+                    String timeStr = dynamicPriceObj.toString();
+                    // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
+                    R<Integer> r = xpOrderClient.getOrderNum(new GetOrderNumDto(timeStr,openCityId));
+                    if(r.getData()==200){
+                        int num = r.getData();
+                        // 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_" + openCityId + "_" + uid, priceRate,time.longValue(), TimeUnit.MINUTES);
+                        }
+                    }
+
+                }
+            }
+
+        }
+
+        XpPricingCardVo xpPricingCardVo = new XpPricingCardVo();
+        double amount = 0;
+
+        double realDistance = distance / 1000;//实际公里
+        double realTime = duration / 60;//实际时间
+        double exceedDistance = (realDistance - rule.getDouble("num2")) < 0 ? 0 : realDistance - rule.getDouble("num2");//超出起步里程的公里
+        double exceedTime = (realTime - rule.getDouble("num3")) < 0 ? 0 : realTime - rule.getDouble("num3");//超过起步分钟数的时间
+
+        // 起步价
+        Double startPrice = rule.getDouble("num1");
+
+        // 超出公里数价格
+        Double distancePrice = rule.getDouble("num4") * exceedDistance;
+
+        // 超出时间价格
+        Double durationPrice = rule.getDouble("num5") * exceedTime;
+
+        startPrice = new BigDecimal(startPrice).multiply(BigDecimal.valueOf(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
+
+        xpPricingCardVo.setStartPrice(startPrice);
+        xpPricingCardVo.setDistancePrice(distancePrice);
+        xpPricingCardVo.setDurationPrice(durationPrice);
+        xpPricingCardVo.setTotalPrice(startPrice + distancePrice + durationPrice);
+        // 里程
+        xpPricingCardVo.setDistance(realDistance);
+        xpPricingCardVo.setDuration(realTime);
+
+        return xpPricingCardVo;
+    }
+
+    /**
      *  计算基础价格
      * @param rule 基础规则
      * @param distance 里程

--
Gitblit v1.7.1