From 3d9d23dacd08e26813a97ee84bc6fdb6c4251a03 Mon Sep 17 00:00:00 2001 From: attiya <2413103649@qq.com> Date: Fri, 9 May 2025 10:44:33 +0800 Subject: [PATCH] =?UTF-8?q?=E9=AB=98=E5=B3=B0=E6=97=B6=E6=AE=B5=E8=AE=A1?= =?UTF-8?q?=E8=B4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/UserOrdersServiceImpl.java | 63 ++++++++++++++++++- .../java/com/cdzy/orders/uitls/TimeUtils.java | 19 ++++++ 2 files changed, 79 insertions(+), 3 deletions(-) diff --git a/ebike-orders/src/main/java/com/cdzy/orders/service/impl/UserOrdersServiceImpl.java b/ebike-orders/src/main/java/com/cdzy/orders/service/impl/UserOrdersServiceImpl.java index 579b61f5..910dc887 100644 --- a/ebike-orders/src/main/java/com/cdzy/orders/service/impl/UserOrdersServiceImpl.java +++ b/ebike-orders/src/main/java/com/cdzy/orders/service/impl/UserOrdersServiceImpl.java @@ -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 list, EbikeUserOrders userOrders, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto) { BigDecimal decimal = BigDecimal.ZERO; //TODO:计算起步费用后时间后移 - List timePeriodDtos = feignEbikeSysRcostsetDto.getEbikeSysRcostsetTimePeriodDtos(); - + boolean checked = checkTime(userOrders.getStartTime(), feignEbikeSysRcostsetDto); + if (checked) { + LocalDateTime userOrdersStartTime = userOrders.getStartTime(); + LocalDateTime userOrdersEndTime = userOrders.getEndTime(); + LocalTime localTime = userOrdersStartTime.toLocalTime(); + List 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 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; + } + /** * 按照时间段计费(默认 * diff --git a/ebike-orders/src/main/java/com/cdzy/orders/uitls/TimeUtils.java b/ebike-orders/src/main/java/com/cdzy/orders/uitls/TimeUtils.java index 280a0de0..924c7426 100644 --- a/ebike-orders/src/main/java/com/cdzy/orders/uitls/TimeUtils.java +++ b/ebike-orders/src/main/java/com/cdzy/orders/uitls/TimeUtils.java @@ -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); + } + }