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

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

View File

@ -386,7 +386,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
totalAmount = totalAmount.add(decimal);
BigDecimal cappedAmount = feignEbikeSysRcostsetDto.getCappedAmount();
int result = cappedAmount.compareTo(totalAmount);
if (result > 0){
if (result > 0) {
totalAmount = cappedAmount;
}
userOrders.setStatus(OrderStatus.PENDING_PAYMENT);
@ -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;
@ -528,12 +553,12 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
LocalDateTime endTime = userOrders.getEndTime();
long minutes = TimeUtils.betweenMinutes(startTime, endTime);
BigDecimal startupCost = feignEbikeSysRcostsetDto.getStartupCost();
EbikeOrderDetails startupDetails = new EbikeOrderDetails(orderId,OrderDetailsType.STARTING_FEE,"默认起步费用",startupCost,JSONObject.toJSONString(feignEbikeSysRcostsetDto),null,LocalDateTime.now());
EbikeOrderDetails startupDetails = new EbikeOrderDetails(orderId, OrderDetailsType.STARTING_FEE, "默认起步费用", startupCost, JSONObject.toJSONString(feignEbikeSysRcostsetDto), null, LocalDateTime.now());
list.add(startupDetails);
decimal = decimal.add(startupCost);
Integer startupDuration = feignEbikeSysRcostsetDto.getStartupDuration();
//判断是否超出起步时长
if (minutes>startupDuration) {
if (minutes > startupDuration) {
startTime = startTime.plusMinutes(startupDuration);
long newMinutes = TimeUtils.betweenMinutes(startTime, endTime);
Integer duration = feignEbikeSysRcostsetDto.getDuration();
@ -544,7 +569,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
BigDecimal bigDecimalCeil = BigDecimal.valueOf(ceil);
//总时长费用
BigDecimal multiply = bigDecimalCeil.multiply(durationCost);
EbikeOrderDetails timeDetails = new EbikeOrderDetails(orderId,OrderDetailsType.CYCLING_DURATION_FEE,"默认时长费用",multiply,JSONObject.toJSONString(feignEbikeSysRcostsetDto),null,LocalDateTime.now());
EbikeOrderDetails timeDetails = new EbikeOrderDetails(orderId, OrderDetailsType.CYCLING_DURATION_FEE, "默认时长费用", multiply, JSONObject.toJSONString(feignEbikeSysRcostsetDto), null, LocalDateTime.now());
list.add(timeDetails);
decimal = decimal.add(multiply);
}