高峰时段计费

This commit is contained in:
attiya 2025-05-09 10:44:33 +08:00
parent 63687abe0b
commit 3d9d23dacd
2 changed files with 79 additions and 3 deletions

View File

@ -36,6 +36,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@ -438,8 +439,43 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
BigDecimal timeSlotCostCalculation(List<EbikeOrderDetails> list, EbikeUserOrders userOrders, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto) { BigDecimal timeSlotCostCalculation(List<EbikeOrderDetails> list, EbikeUserOrders userOrders, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto) {
BigDecimal decimal = BigDecimal.ZERO; BigDecimal decimal = BigDecimal.ZERO;
//TODO计算起步费用后时间后移 //TODO计算起步费用后时间后移
boolean checked = checkTime(userOrders.getStartTime(), feignEbikeSysRcostsetDto);
if (checked) {
LocalDateTime userOrdersStartTime = userOrders.getStartTime();
LocalDateTime userOrdersEndTime = userOrders.getEndTime();
LocalTime localTime = userOrdersStartTime.toLocalTime();
List<ResFeignEbikeSysRcostsetTimePeriodDto> timePeriodDtos = feignEbikeSysRcostsetDto.getEbikeSysRcostsetTimePeriodDtos(); List<ResFeignEbikeSysRcostsetTimePeriodDto> timePeriodDtos = feignEbikeSysRcostsetDto.getEbikeSysRcostsetTimePeriodDtos();
for (ResFeignEbikeSysRcostsetTimePeriodDto timePeriodDto : timePeriodDtos) {
LocalTime endTime = timePeriodDto.getEndTime();
LocalTime startupTime = timePeriodDto.getStartupTime();
boolean range = TimeUtils.isTimeWithinRange(localTime, startupTime, endTime);
if (range){
BigDecimal startupCost = timePeriodDto.getStartupCost();
Integer startupDuration = timePeriodDto.getStartupDuration();
EbikeOrderDetails startupCostDetails = new EbikeOrderDetails(userOrders.getOrderId(), OrderDetailsType.TRAVEL_EXPENSES_ON_PEAK_DAYS, "高峰时段起步费用", startupCost, JSONObject.toJSONString(feignEbikeSysRcostsetDto), null, LocalDateTime.now());
list.add(startupCostDetails);
decimal = decimal.add(startupCost);
long minutes = TimeUtils.betweenMinutes(userOrdersStartTime, userOrdersEndTime);
if (minutes > startupDuration) {
userOrdersStartTime = userOrdersStartTime.plusMinutes(startupDuration);
long newMinutes = TimeUtils.betweenMinutes(userOrdersStartTime, userOrdersEndTime);
Integer duration = timePeriodDto.getDuration();
//时长费用
BigDecimal durationCost = timePeriodDto.getDurationCost();
int newMinutesInt = NumberUtils.longConvertInt(newMinutes);
int ceil = NumberUtils.divideAndCeil(newMinutesInt, duration);
BigDecimal bigDecimalCeil = BigDecimal.valueOf(ceil);
//总时长费用
BigDecimal multiply = bigDecimalCeil.multiply(durationCost);
EbikeOrderDetails timeDetails = new EbikeOrderDetails(userOrders.getOrderId(), OrderDetailsType.TRAVEL_EXPENSES_ON_PEAK_DAYS, "高峰时段时长费用", multiply, JSONObject.toJSONString(feignEbikeSysRcostsetDto), null, LocalDateTime.now());
list.add(timeDetails);
decimal = decimal.add(multiply);
}
}
}
}else {
decimal = defaultCostCalculation(list,userOrders,feignEbikeSysRcostsetDto,userOrders.getOrderId());
}
return decimal; return decimal;
} }
@ -497,7 +533,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
/** /**
* 检查是否高峰 * 检查是否高峰
* *
* @param weekNumber 周几 * @param weekNumber 周几
* @param feignEbikeSysRcostsetDto 计费规则 * @param feignEbikeSysRcostsetDto 计费规则
@ -513,6 +549,27 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
return false; return false;
} }
/**
* 检查是否高峰时段
*
* @param start 骑行开始时间
* @param feignEbikeSysRcostsetDto 计费规则
* @return 是否
*/
boolean checkTime(LocalDateTime start, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto) {
LocalTime localTime = start.toLocalTime();
List<ResFeignEbikeSysRcostsetTimePeriodDto> timePeriodDtos = feignEbikeSysRcostsetDto.getEbikeSysRcostsetTimePeriodDtos();
for (ResFeignEbikeSysRcostsetTimePeriodDto timePeriodDto : timePeriodDtos) {
LocalTime endTime = timePeriodDto.getEndTime();
LocalTime startupTime = timePeriodDto.getStartupTime();
boolean range = TimeUtils.isTimeWithinRange(localTime, startupTime, endTime);
if (range){
return true;
}
}
return false;
}
/** /**
* 按照时间段计费(默认 * 按照时间段计费(默认
* *

View File

@ -198,4 +198,23 @@ public class TimeUtils {
return segments; return segments;
} }
/**
* 判断目标时间是否在时间范围内支持跨天时间
* @param target 要检查的时间
* @param start 开始时间
* @param end 结束时间
* @return 是否在时间范围内
*/
public static boolean isTimeWithinRange(LocalTime target,
LocalTime start,
LocalTime end) {
// 处理跨天时间的情况 22:00 - 02:00
if (start.isAfter(end)) {
return !target.isBefore(start) || !target.isAfter(end);
}
// 普通时间范围判断
return !target.isBefore(start) && !target.isAfter(end);
}
} }