高峰时段计费
This commit is contained in:
parent
63687abe0b
commit
3d9d23dacd
@ -36,6 +36,7 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
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 decimal = BigDecimal.ZERO;
|
||||
//TODO:计算起步费用后时间后移
|
||||
List<ResFeignEbikeSysRcostsetTimePeriodDto> timePeriodDtos = feignEbikeSysRcostsetDto.getEbikeSysRcostsetTimePeriodDtos();
|
||||
|
||||
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();
|
||||
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;
|
||||
}
|
||||
|
||||
@ -497,7 +533,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
|
||||
|
||||
|
||||
/**
|
||||
* 检查是否高峰期
|
||||
* 检查是否高峰日
|
||||
*
|
||||
* @param weekNumber 周几
|
||||
* @param feignEbikeSysRcostsetDto 计费规则
|
||||
@ -513,6 +549,27 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 按照时间段计费(默认
|
||||
*
|
||||
|
||||
@ -198,4 +198,23 @@ public class TimeUtils {
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user