From 40c97867e634b0c4949dfd964bf06da35fc4bd88 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 13 二月 2026 22:06:40 +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/utils/TaxiPricingDemoService.java | 48 ++++++++++++++++++++++++++++++++++++------------
1 files changed, 36 insertions(+), 12 deletions(-)
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaxiPricingDemoService.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaxiPricingDemoService.java
index ebd23ef..a6dc382 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaxiPricingDemoService.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaxiPricingDemoService.java
@@ -41,7 +41,7 @@
BigDecimal totalMileage = BigDecimal.valueOf(totalMileageKm);
PricingRule baseRule = config.findMatchedRule(orderTime);
- result.put("起步价(" + baseRule.ruleName + ")"+"-"+baseRule.start+"-"+baseRule.end, baseRule.baseFare);
+ result.put("起步价(" + baseRule.ruleName + ")"+"|"+baseRule.start+"-"+baseRule.end+"="+baseRule.baseMin+"&"+baseRule.baseKm, baseRule.baseFare);
if (totalMileage.compareTo(baseRule.baseKm) <= 0) {
return formatMap(result);
@@ -92,19 +92,19 @@
// BigDecimal totalSeg = distFee.add(timeFee).add(longExtra);
// 超出里程
if (isOverBaseM) {
- bill.put(activeRule.ruleName + "-"+activeRule.start + "-" + activeRule.end + "_Ml", bill.getOrDefault(activeRule.ruleName + activeRule.start + "-" + activeRule.end + "_Ml", BigDecimal.ZERO).add(segM));
+ bill.put(activeRule.ruleName + "|"+activeRule.start + "-" + activeRule.end + "_Ml", bill.getOrDefault(activeRule.ruleName + activeRule.start + "-" + activeRule.end + "_Ml", BigDecimal.ZERO).add(segM));
}
// 超出时间
if (isOverBaseMs) {
- bill.put(activeRule.ruleName + "-"+activeRule.start + "-" + activeRule.end + "_Ms", bill.getOrDefault(activeRule.ruleName + activeRule.start + "-" + activeRule.end + "_Ms", BigDecimal.ZERO).add(segMs));
+ bill.put(activeRule.ruleName + "|"+activeRule.start + "-" + activeRule.end + "_Ms", bill.getOrDefault(activeRule.ruleName + activeRule.start + "-" + activeRule.end + "_Ms", BigDecimal.ZERO).add(segMs));
}
// 若不存在规则名称,则添加
- activeRuleNameRate.computeIfAbsent(activeRule.ruleName + "-"+activeRule.start + "-" + activeRule.end + "_Ml", k -> activeRule.perKmRate); // 超出里程的加价
- activeRuleNameRate.computeIfAbsent(activeRule.ruleName + "-"+activeRule.start + "-" + activeRule.end + "_Ms",k ->activeRule.perMinRate); // 超出时间的加价
+ activeRuleNameRate.computeIfAbsent(activeRule.ruleName + "|"+activeRule.start + "-" + activeRule.end + "_Ml", k -> activeRule.perKmRate); // 超出里程的加价
+ activeRuleNameRate.computeIfAbsent(activeRule.ruleName + "|"+activeRule.start + "-" + activeRule.end + "_Ms",k ->activeRule.perMinRate); // 超出时间的加价
- activeRuleNameList.add(activeRule.ruleName + "-"+activeRule.start + "-" + activeRule.end + "_Ml");
- activeRuleNameList.add(activeRule.ruleName + "-"+activeRule.start + "-" + activeRule.end + "_Ms");
+ activeRuleNameList.add(activeRule.ruleName + "|"+activeRule.start + "-" + activeRule.end + "_Ml");
+ activeRuleNameList.add(activeRule.ruleName + "|"+activeRule.start + "-" + activeRule.end + "_Ms");
// result.put(activeRule.ruleName, result.getOrDefault(activeRule.ruleName, BigDecimal.ZERO).add(totalSeg));
}
// 1. 基础费率计算
@@ -113,6 +113,7 @@
if(ruleName.endsWith("_Ml")){
BigDecimal exceedValue = bill.get(ruleName);
if(Objects.nonNull(exceedValue)){
+ result.put("distance"+split[0], result.getOrDefault(split[0], BigDecimal.ZERO).add(exceedValue));
exceedValue = exceedValue.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
}else{
exceedValue = BigDecimal.ZERO;
@@ -127,12 +128,14 @@
exceedValue = BigDecimal.ZERO;
}
BigDecimal exceedRate = activeRuleNameRate.get(ruleName);
- result.put(split[0], result.getOrDefault(split[0], BigDecimal.ZERO).add(exceedValue.multiply(exceedRate)));
+ result.put("时长费"+split[0]+"&"+exceedValue, result.getOrDefault(split[0], BigDecimal.ZERO).add(exceedValue.multiply(exceedRate)));
}
}
// 2. 远途加价计算 (基于区间判定)
BigDecimal longExtra = calculateLongDistExtra(BigDecimal.valueOf(totalMileageKm), config.longSteps);
- result.put("远途费", longExtra);
+ // 计算远途里程
+ BigDecimal longExtraValue = calculateLongDistExtra(BigDecimal.valueOf(totalMileageKm), config.longSteps);
+ result.put("远途费&"+longExtraValue, longExtra);
return formatMap(result);
}
@@ -155,6 +158,26 @@
}
}
return billM.subtract(extraStart).multiply(extraRate);
+ }
+ /**
+ * 计算远途费的里程
+ */
+ private BigDecimal calculateLongDistExtraValue(BigDecimal billM, List<LongRangeStep> steps) {
+ if (billM.compareTo(BigDecimal.ZERO) <= 0) return BigDecimal.ZERO;
+
+ // 当前点所在的公里数
+ BigDecimal extraStart = BigDecimal.ZERO;
+ BigDecimal extraRate = BigDecimal.ZERO;
+
+ // 匹配区间规则
+ for (LongRangeStep step : steps) {
+ if (step.isMatch(billM)) {
+ extraRate = step.addPrice;
+ extraStart = step.numStart;
+ break;
+ }
+ }
+ return billM.subtract(extraStart);
}
private Map<String, BigDecimal> formatMap(Map<String, BigDecimal> map) {
@@ -183,7 +206,7 @@
public static class PricingConfig {
public PricingRule holiday;
- public PricingRule peak;
+ public List<PricingRule> peaks = new ArrayList<>();
public PricingRule night;
public List<PricingRule> normals = new ArrayList<>();
public List<LongRangeStep> longSteps = new ArrayList<>(); // 修改为区间列表
@@ -191,7 +214,7 @@
public PricingRule findMatchedRule(Date date) {
LocalTime t = date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
if (holiday.isMatch(t)) return holiday;
- if (peak.isMatch(t)) return peak;
+ for (PricingRule r : peaks) if (r.isMatch(t)) return r;
if (night.isMatch(t)) return night;
for (PricingRule r : normals) if (r.isMatch(t)) return r;
return normals.get(0);
@@ -229,7 +252,8 @@
private static PricingConfig setupMockConfig() {
PricingConfig config = new PricingConfig();
- config.peak = new PricingRule("高峰期", "14:40", "14:46", 15.0, 3.0, 5.0, 3.0, 0.8);
+ config.peaks.add(new PricingRule("高峰期", "14:40", "14:46", 15.0, 3.0, 5.0, 3.0, 0.8));
+ config.peaks.add(new PricingRule("高峰期", "19:40", "20:46", 15.0, 3.0, 5.0, 3.0, 0.8));
config.night = new PricingRule("夜间行驶", "14:47", "14:48", 18.0, 3.0, 5.0, 3.5, 1.0);
config.holiday = new PricingRule("节假日", "18:47", "18:48", 18.0, 3.0, 5.0, 4, 2.0);
config.normals.add(new PricingRule("普通时段", "14:46", "14:47", 10.0, 3.0, 5.0, 2.4, 0.5));
--
Gitblit v1.7.1