费用计算规则优化

This commit is contained in:
yanglei 2026-01-16 09:42:44 +08:00
parent 513e0e45fc
commit 51b4f41d03

View File

@ -450,11 +450,13 @@ public class EbikeOrderServiceImpl extends ServiceImpl<EbikeOrderMapper, EbikeOr
// 1. 基础参数
BigDecimal baseFee = Objects.requireNonNullElse(order.getBaseFee(), BigDecimal.ZERO);
BigDecimal durationFee = Objects.requireNonNullElse(order.getDurationFee(), BigDecimal.ZERO);
Integer freeDurationMinutes = Objects.requireNonNullElse(order.getFreeDurationMinutes(), 0);
Integer baseDurationMinutes = Objects.requireNonNullElse(order.getBaseDurationMinutes(), 0);
int freeDurationMinutes = Objects.requireNonNullElse(order.getFreeDurationMinutes(), 0);
int baseDurationMinutes = Objects.requireNonNullElse(order.getBaseDurationMinutes(), 0);
int chargeDurationMinutes = Objects.requireNonNullElse(order.getChargeDurationMinutes(), 1);
// 2. 计算调度费用
if (chargeDurationMinutes <= 0) {
chargeDurationMinutes = 1;
}
// 2. 计算调度费用(运营区域外>停车区外>禁停区)
BigDecimal additionalFee = BigDecimal.ZERO;
if (data != null) {
if (Boolean.FALSE.equals(data.getBikeInRegion())) {
@ -480,16 +482,15 @@ public class EbikeOrderServiceImpl extends ServiceImpl<EbikeOrderMapper, EbikeOr
return dto;
}
// 5. 起步阶段免费之后但未超出起步时长 只收起步费
long includedInBaseMinutes = freeDurationMinutes + baseDurationMinutes;
if (totalRideMinutes <= includedInBaseMinutes) {
// 5. 起步阶段免费 < 骑行 起步 只收起步费用
if (totalRideMinutes <= baseDurationMinutes) {
dto.setBaseFee(baseFee);
dto.setTotalCost(baseFee.add(additionalFee));
return dto;
}
// 6. 超出起步阶段计算额外时长费用
long extraMinutes = totalRideMinutes - includedInBaseMinutes;
long extraMinutes = totalRideMinutes - baseDurationMinutes;
long chargeUnits = (extraMinutes + chargeDurationMinutes - 1) / chargeDurationMinutes;
BigDecimal durationCost = durationFee.multiply(BigDecimal.valueOf(chargeUnits));
@ -497,7 +498,7 @@ public class EbikeOrderServiceImpl extends ServiceImpl<EbikeOrderMapper, EbikeOr
dto.setDurationFee(durationCost);
BigDecimal baseCost = baseFee.add(durationCost);
// 7. 总费用 + 封顶
// 7. 总费用 是否 大于封顶费用 大于则直接用封顶费用
BigDecimal totalCost = baseCost.add(additionalFee);
BigDecimal maxFee = order.getMaxFeeAmount();
if (maxFee != null && totalCost.compareTo(maxFee) > 0) {