计费规则:高峰日出行计算

This commit is contained in:
attiya 2025-05-08 16:58:52 +08:00
parent 8f44c10610
commit 6954ef1391

View File

@ -483,14 +483,41 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
LocalDateTime startTime = userOrders.getStartTime();
LocalDateTime endTime = userOrders.getEndTime();
Long orderId = userOrders.getOrderId();
//TODO计算起步费用后时间后移
//处理为自然时间段防止跨天
List<TimeSegment> timeSegments = TimeUtils.splitByDays(startTime, endTime);
for (int i = 0; i < timeSegments.size(); i++) {
TimeSegment timeSegment = timeSegments.get(i);
boolean checked = checkWeek(timeSegment, feignEbikeSysRcostsetDto);
BigDecimal dailiedFee = BigDecimal.ZERO;
decimal = decimal.add(dailiedFee);
String weekNumber = TimeUtils.getDayOfWeekNumber(startTime);
boolean checked = checkWeek(weekNumber, feignEbikeSysRcostsetDto);
if (checked) {
//高峰日计费
List<ResFeignEbikeSysRcostsetWeekDto> weekDtos = feignEbikeSysRcostsetDto.getEbikeSysRcostsetWeekDtos();
for (ResFeignEbikeSysRcostsetWeekDto weekCostCalculation : weekDtos) {
if (weekCostCalculation.getWeek().contains(weekNumber)) {
long minutes = TimeUtils.betweenMinutes(startTime, endTime);
BigDecimal startupCost = weekCostCalculation.getStartupCost();
EbikeOrderDetails startupDetails = new EbikeOrderDetails(orderId, OrderDetailsType.TRAVEL_EXPENSES_ON_PEAK_DAYS, "高峰日起步费用", startupCost, JSONObject.toJSONString(feignEbikeSysRcostsetDto), null, LocalDateTime.now());
list.add(startupDetails);
decimal = decimal.add(startupCost);
Integer startupDuration = weekCostCalculation.getStartupDuration();
//判断是否超出起步时长
if (minutes > startupDuration) {
startTime = startTime.plusMinutes(startupDuration);
long newMinutes = TimeUtils.betweenMinutes(startTime, endTime);
Integer duration = weekCostCalculation.getDuration();
//时长费用
BigDecimal durationCost = weekCostCalculation.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(orderId, OrderDetailsType.TRAVEL_EXPENSES_ON_PEAK_DAYS, "高峰日时长费用", multiply, JSONObject.toJSONString(feignEbikeSysRcostsetDto), null, LocalDateTime.now());
list.add(timeDetails);
decimal = decimal.add(multiply);
break;
}
}
}
} else {
//默认计费
decimal = defaultCostCalculation(list, userOrders, feignEbikeSysRcostsetDto, userOrders.getOrderId());
}
return decimal;
}
@ -499,14 +526,12 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
/**
* 检查是否高峰期
*
* @param timeSegment 自然时间段
* @param weekNumber 周几
* @param feignEbikeSysRcostsetDto 计费规则
* @return 是否
*/
boolean checkWeek(TimeSegment timeSegment, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto) {
boolean checkWeek(String weekNumber, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto) {
List<ResFeignEbikeSysRcostsetWeekDto> weekDtos = feignEbikeSysRcostsetDto.getEbikeSysRcostsetWeekDtos();
LocalDateTime startTime = timeSegment.getStart();
String weekNumber = TimeUtils.getDayOfWeekNumber(startTime);
for (ResFeignEbikeSysRcostsetWeekDto weekCostCalculation : weekDtos) {
if (weekCostCalculation.getWeek().contains(weekNumber)) {
return true;