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

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

View File

@ -385,8 +385,8 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
}; };
totalAmount = totalAmount.add(decimal); totalAmount = totalAmount.add(decimal);
BigDecimal cappedAmount = feignEbikeSysRcostsetDto.getCappedAmount(); BigDecimal cappedAmount = feignEbikeSysRcostsetDto.getCappedAmount();
int result = cappedAmount.compareTo(totalAmount); int result = cappedAmount.compareTo(totalAmount);
if (result > 0){ if (result > 0) {
totalAmount = cappedAmount; totalAmount = cappedAmount;
} }
userOrders.setStatus(OrderStatus.PENDING_PAYMENT); userOrders.setStatus(OrderStatus.PENDING_PAYMENT);
@ -423,7 +423,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
* @param orderId 订单编号 * @param orderId 订单编号
* @return 当前时间段收取金额 * @return 当前时间段收取金额
*/ */
BigDecimal timeFee(TimeSegment timeSegment, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto, List<EbikeOrderDetails> list, long orderId) { BigDecimal timeFee(TimeSegment timeSegment, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto, List<EbikeOrderDetails> list, long orderId) {
BigDecimal decimal = BigDecimal.ZERO; BigDecimal decimal = BigDecimal.ZERO;
// LocalDateTime start = timeSegment.getStart(); // LocalDateTime start = timeSegment.getStart();
// LocalDateTime end = timeSegment.getEnd(); // LocalDateTime end = timeSegment.getEnd();
@ -483,14 +483,41 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
LocalDateTime startTime = userOrders.getStartTime(); LocalDateTime startTime = userOrders.getStartTime();
LocalDateTime endTime = userOrders.getEndTime(); LocalDateTime endTime = userOrders.getEndTime();
Long orderId = userOrders.getOrderId(); Long orderId = userOrders.getOrderId();
//TODO计算起步费用后时间后移 String weekNumber = TimeUtils.getDayOfWeekNumber(startTime);
//处理为自然时间段防止跨天 boolean checked = checkWeek(weekNumber, feignEbikeSysRcostsetDto);
List<TimeSegment> timeSegments = TimeUtils.splitByDays(startTime, endTime); if (checked) {
for (int i = 0; i < timeSegments.size(); i++) { //高峰日计费
TimeSegment timeSegment = timeSegments.get(i); List<ResFeignEbikeSysRcostsetWeekDto> weekDtos = feignEbikeSysRcostsetDto.getEbikeSysRcostsetWeekDtos();
boolean checked = checkWeek(timeSegment, feignEbikeSysRcostsetDto); for (ResFeignEbikeSysRcostsetWeekDto weekCostCalculation : weekDtos) {
BigDecimal dailiedFee = BigDecimal.ZERO; if (weekCostCalculation.getWeek().contains(weekNumber)) {
decimal = decimal.add(dailiedFee); 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; return decimal;
} }
@ -499,14 +526,12 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
/** /**
* 检查是否高峰期 * 检查是否高峰期
* *
* @param timeSegment 自然时间段 * @param weekNumber 周几
* @param feignEbikeSysRcostsetDto 计费规则 * @param feignEbikeSysRcostsetDto 计费规则
* @return 是否 * @return 是否
*/ */
boolean checkWeek(TimeSegment timeSegment, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto) { boolean checkWeek(String weekNumber, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto) {
List<ResFeignEbikeSysRcostsetWeekDto> weekDtos = feignEbikeSysRcostsetDto.getEbikeSysRcostsetWeekDtos(); List<ResFeignEbikeSysRcostsetWeekDto> weekDtos = feignEbikeSysRcostsetDto.getEbikeSysRcostsetWeekDtos();
LocalDateTime startTime = timeSegment.getStart();
String weekNumber = TimeUtils.getDayOfWeekNumber(startTime);
for (ResFeignEbikeSysRcostsetWeekDto weekCostCalculation : weekDtos) { for (ResFeignEbikeSysRcostsetWeekDto weekCostCalculation : weekDtos) {
if (weekCostCalculation.getWeek().contains(weekNumber)) { if (weekCostCalculation.getWeek().contains(weekNumber)) {
return true; return true;
@ -528,12 +553,12 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
LocalDateTime endTime = userOrders.getEndTime(); LocalDateTime endTime = userOrders.getEndTime();
long minutes = TimeUtils.betweenMinutes(startTime, endTime); long minutes = TimeUtils.betweenMinutes(startTime, endTime);
BigDecimal startupCost = feignEbikeSysRcostsetDto.getStartupCost(); 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); list.add(startupDetails);
decimal = decimal.add(startupCost); decimal = decimal.add(startupCost);
Integer startupDuration = feignEbikeSysRcostsetDto.getStartupDuration(); Integer startupDuration = feignEbikeSysRcostsetDto.getStartupDuration();
//判断是否超出起步时长 //判断是否超出起步时长
if (minutes>startupDuration) { if (minutes > startupDuration) {
startTime = startTime.plusMinutes(startupDuration); startTime = startTime.plusMinutes(startupDuration);
long newMinutes = TimeUtils.betweenMinutes(startTime, endTime); long newMinutes = TimeUtils.betweenMinutes(startTime, endTime);
Integer duration = feignEbikeSysRcostsetDto.getDuration(); Integer duration = feignEbikeSysRcostsetDto.getDuration();
@ -544,7 +569,7 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
BigDecimal bigDecimalCeil = BigDecimal.valueOf(ceil); BigDecimal bigDecimalCeil = BigDecimal.valueOf(ceil);
//总时长费用 //总时长费用
BigDecimal multiply = bigDecimalCeil.multiply(durationCost); 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); list.add(timeDetails);
decimal = decimal.add(multiply); decimal = decimal.add(multiply);
} }