高峰时段计费
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.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:计算起步费用后时间后移
|
||||||
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;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 按照时间段计费(默认
|
* 按照时间段计费(默认
|
||||||
*
|
*
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user