免费阶段加调度费

This commit is contained in:
yanglei 2026-01-15 17:35:45 +08:00
parent fb78f577b7
commit fb2a782f23

View File

@ -49,7 +49,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import static com.cdzy.user.model.entity.table.EbikeOrderDetailTableDef.EBIKE_ORDER_DETAIL;
import static com.cdzy.user.model.entity.table.EbikeOrderTableDef.EBIKE_ORDER; import static com.cdzy.user.model.entity.table.EbikeOrderTableDef.EBIKE_ORDER;
import static com.cdzy.user.model.entity.table.EbikeRefundTableDef.EBIKE_REFUND; import static com.cdzy.user.model.entity.table.EbikeRefundTableDef.EBIKE_REFUND;
@ -455,35 +454,7 @@ public class EbikeOrderServiceImpl extends ServiceImpl<EbikeOrderMapper, EbikeOr
Integer baseDurationMinutes = Objects.requireNonNullElse(order.getBaseDurationMinutes(), 0); Integer baseDurationMinutes = Objects.requireNonNullElse(order.getBaseDurationMinutes(), 0);
int chargeDurationMinutes = Objects.requireNonNullElse(order.getChargeDurationMinutes(), 1); int chargeDurationMinutes = Objects.requireNonNullElse(order.getChargeDurationMinutes(), 1);
// 2. 计算总骑行时长 // 2. 计算调度费用
long totalRideSeconds = Duration.between(order.getStartTime(), endTime).toSeconds();
// 向上取整为分钟
long totalRideMinutes = (totalRideSeconds + 59) / 60;
// 3. 免费阶段总时长 <= 免费时长
if (totalRideMinutes <= freeDurationMinutes) {
dto.setTotalCost(BigDecimal.ZERO);
return dto;
}
// 4. 起步阶段免费之后但未超出起步时长 只收起步费
long includedInBaseMinutes = freeDurationMinutes + baseDurationMinutes;
if (totalRideMinutes <= includedInBaseMinutes) {
dto.setBaseFee(baseFee);
dto.setTotalCost(baseFee);
return dto;
}
// 5. 超出起步阶段计算额外时长费用
long extraMinutes = totalRideMinutes - includedInBaseMinutes;
long chargeUnits = (extraMinutes + chargeDurationMinutes - 1) / chargeDurationMinutes;
BigDecimal durationCost = durationFee.multiply(BigDecimal.valueOf(chargeUnits));
dto.setBaseFee(baseFee);
dto.setDurationFee(durationCost);
BigDecimal baseCost = baseFee.add(durationCost);
// 6. 调度费用
BigDecimal additionalFee = BigDecimal.ZERO; BigDecimal additionalFee = BigDecimal.ZERO;
if (data != null) { if (data != null) {
if (Boolean.FALSE.equals(data.getBikeInRegion())) { if (Boolean.FALSE.equals(data.getBikeInRegion())) {
@ -498,6 +469,34 @@ public class EbikeOrderServiceImpl extends ServiceImpl<EbikeOrderMapper, EbikeOr
} }
} }
// 3. 计算总骑行时长
long totalRideSeconds = Duration.between(order.getStartTime(), endTime).toSeconds();
// 向上取整为分钟
long totalRideMinutes = (totalRideSeconds + 59) / 60;
// 4. 免费阶段总时长 <= 免费时长
if (totalRideMinutes <= freeDurationMinutes) {
dto.setTotalCost(additionalFee);
return dto;
}
// 5. 起步阶段免费之后但未超出起步时长 只收起步费
long includedInBaseMinutes = freeDurationMinutes + baseDurationMinutes;
if (totalRideMinutes <= includedInBaseMinutes) {
dto.setBaseFee(baseFee);
dto.setTotalCost(baseFee.add(additionalFee));
return dto;
}
// 6. 超出起步阶段计算额外时长费用
long extraMinutes = totalRideMinutes - includedInBaseMinutes;
long chargeUnits = (extraMinutes + chargeDurationMinutes - 1) / chargeDurationMinutes;
BigDecimal durationCost = durationFee.multiply(BigDecimal.valueOf(chargeUnits));
dto.setBaseFee(baseFee);
dto.setDurationFee(durationCost);
BigDecimal baseCost = baseFee.add(durationCost);
// 7. 总费用 + 封顶 // 7. 总费用 + 封顶
BigDecimal totalCost = baseCost.add(additionalFee); BigDecimal totalCost = baseCost.add(additionalFee);
BigDecimal maxFee = order.getMaxFeeAmount(); BigDecimal maxFee = order.getMaxFeeAmount();