From 8f44c10610c8d4bc9587799ff50dbf200d0197a2 Mon Sep 17 00:00:00 2001 From: attiya <2413103649@qq.com> Date: Thu, 8 May 2025 16:31:21 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A1=E8=B4=B9=E8=A7=84=E5=88=99=EF=BC=9A?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/entity/EbikeOrderDetails.java | 9 ++ .../service/impl/UserOrdersServiceImpl.java | 142 ++++-------------- .../com/cdzy/orders/uitls/NumberUtils.java | 12 ++ 3 files changed, 53 insertions(+), 110 deletions(-) diff --git a/ebike-orders/src/main/java/com/cdzy/orders/model/entity/EbikeOrderDetails.java b/ebike-orders/src/main/java/com/cdzy/orders/model/entity/EbikeOrderDetails.java index 409ce40e..3af433d0 100644 --- a/ebike-orders/src/main/java/com/cdzy/orders/model/entity/EbikeOrderDetails.java +++ b/ebike-orders/src/main/java/com/cdzy/orders/model/entity/EbikeOrderDetails.java @@ -69,4 +69,13 @@ public class EbikeOrderDetails implements Serializable { @Column(onInsertValue = "now()") private LocalDateTime createdAt; + public EbikeOrderDetails(Long orderId, Integer itemType, String itemName, BigDecimal itemAmount, String calculationRule, String couponId, LocalDateTime createdAt) { + this.orderId = orderId; + this.itemType = itemType; + this.itemName = itemName; + this.itemAmount = itemAmount; + this.calculationRule = calculationRule; + this.couponId = couponId; + this.createdAt = createdAt; + } } 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 1c0a23fc..9bc2071e 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 @@ -162,6 +162,7 @@ public class UserOrdersServiceImpl extends ServiceImpl timeSlotCostCalculation(list, userOrders, feignEbikeSysRcostsetDto); @@ -384,7 +386,7 @@ public class UserOrdersServiceImpl extends ServiceImpl 0){ totalAmount = cappedAmount; } userOrders.setStatus(OrderStatus.PENDING_PAYMENT); @@ -401,7 +403,7 @@ public class UserOrdersServiceImpl extends ServiceImpl list, EbikeUserOrders userOrders, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto) { - BigDecimal decimal = new BigDecimal(0); + BigDecimal decimal = BigDecimal.ZERO; //TODO:计算起步费用后时间后移 List timeSegments = TimeUtils.splitByDays(userOrders.getStartTime(), userOrders.getEndTime()); //TODO:时间划分不同自然时间段,每一段才判断在高峰时间段内有多长时间收费多少,非高峰期多长时间收费多少 @@ -477,7 +479,7 @@ public class UserOrdersServiceImpl extends ServiceImpl list, EbikeUserOrders userOrders, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto) { - BigDecimal decimal = new BigDecimal(0); + BigDecimal decimal = BigDecimal.ZERO; LocalDateTime startTime = userOrders.getStartTime(); LocalDateTime endTime = userOrders.getEndTime(); Long orderId = userOrders.getOrderId(); @@ -487,113 +489,12 @@ public class UserOrdersServiceImpl extends ServiceImpl list, long orderId) { - BigDecimal decimal = new BigDecimal(0); - List weekDtos = feignEbikeSysRcostsetDto.getEbikeSysRcostsetWeekDtos(); - LocalDateTime startTime = timeSegment.getStart(); - String weekNumber = TimeUtils.getDayOfWeekNumber(startTime); - LocalDateTime endTime = timeSegment.getEnd(); - long minutes = TimeUtils.betweenMinutes(startTime, endTime); - BigDecimal minutesNew = BigDecimal.valueOf(minutes); - if (isWeek) { - //高峰日出现计算 - for (ResFeignEbikeSysRcostsetWeekDto weekCostCalculation : weekDtos) { - //根据符合要求的规则计算费用 - if (weekCostCalculation.getWeek().contains(weekNumber)) { - if (isStart) { - EbikeOrderDetails orderDetails = new EbikeOrderDetails(); - orderDetails.setOrderId(orderId); - orderDetails.setItemAmount(weekCostCalculation.getStartupCost()); - orderDetails.setItemType(OrderDetailsType.TRAVEL_EXPENSES_ON_PEAK_DAYS); - orderDetails.setItemName("高峰日出行费用-起步费用"); - orderDetails.setCalculationRule(JSONObject.toJSONString(feignEbikeSysRcostsetDto)); - list.add(orderDetails); - Integer startupDuration = weekCostCalculation.getStartupDuration(); - if (minutes > startupDuration) { - - BigDecimal startupDurationNew = BigDecimal.valueOf(startupDuration); - //超出时长(总时长减去起步时长 - minutesNew = minutesNew.subtract(startupDurationNew); - } - } - //时长计费 - BigDecimal durationCost = weekCostCalculation.getDurationCost(); - //时长多久计费一次 - Integer duration = weekCostCalculation.getDuration(); - //总计费几次(向上取整 - int ceil = NumberUtils.divideAndCeil(duration, minutesNew.intValue()); - BigDecimal ceilCost = BigDecimal.valueOf(ceil); - //最终值 - BigDecimal multiply = durationCost.multiply(ceilCost); - - EbikeOrderDetails durationCostOrderDetails = new EbikeOrderDetails(); - durationCostOrderDetails.setOrderId(orderId); - durationCostOrderDetails.setItemAmount(multiply); - durationCostOrderDetails.setItemType(OrderDetailsType.TRAVEL_EXPENSES_ON_PEAK_DAYS); - durationCostOrderDetails.setItemName("高峰日出行费用-时长计费"); - durationCostOrderDetails.setCalculationRule(JSONObject.toJSONString(feignEbikeSysRcostsetDto)); - list.add(durationCostOrderDetails); - decimal = decimal.add(multiply); - break; - } - } - - } else { - //非高峰出行日计费 - if (isStart) { - //起始计费 - Integer startupDuration = feignEbikeSysRcostsetDto.getStartupDuration(); - BigDecimal startupCost = feignEbikeSysRcostsetDto.getStartupCost(); - EbikeOrderDetails orderDetails = new EbikeOrderDetails(); - orderDetails.setOrderId(orderId); - orderDetails.setItemAmount(startupCost); - orderDetails.setItemType(OrderDetailsType.STARTING_FEE); - orderDetails.setItemName("起步费用"); - orderDetails.setCalculationRule(JSONObject.toJSONString(feignEbikeSysRcostsetDto)); - list.add(orderDetails); - decimal = decimal.add(startupCost); - //超出起步时长计费 - if (minutes > startupDuration) { - BigDecimal startupDurationNew = BigDecimal.valueOf(startupDuration); - //超出时长 - minutesNew = minutesNew.subtract(startupDurationNew); - } - } - //时长计费 - BigDecimal durationCost = feignEbikeSysRcostsetDto.getDurationCost(); - //时长多久计费一次 - Integer duration = feignEbikeSysRcostsetDto.getDuration(); - //总计费几次(向上取整 - int ceil = NumberUtils.divideAndCeil(duration, minutesNew.intValue()); - BigDecimal ceilCost = BigDecimal.valueOf(ceil); - //最终值 - BigDecimal multiply = durationCost.multiply(ceilCost); - - EbikeOrderDetails durationCostOrderDetails = new EbikeOrderDetails(); - durationCostOrderDetails.setOrderId(orderId); - durationCostOrderDetails.setItemAmount(multiply); - durationCostOrderDetails.setItemType(OrderDetailsType.CYCLING_DURATION_FEE); - durationCostOrderDetails.setItemName("时长计费"); - durationCostOrderDetails.setCalculationRule(JSONObject.toJSONString(feignEbikeSysRcostsetDto)); - list.add(durationCostOrderDetails); - decimal = decimal.add(multiply); - } - return decimal; - } - /** * 检查是否高峰期 @@ -622,10 +523,31 @@ public class UserOrdersServiceImpl extends ServiceImpl list, EbikeUserOrders userOrders, ResFeignEbikeSysRcostsetDto feignEbikeSysRcostsetDto, long orderId) { + BigDecimal decimal = BigDecimal.ZERO; LocalDateTime startTime = userOrders.getStartTime(); LocalDateTime endTime = userOrders.getEndTime(); - //TODO:计算起步费用后时间后移 - TimeSegment timeSegment = new TimeSegment(startTime, endTime); - return dailyFee(timeSegment, feignEbikeSysRcostsetDto, true, false, list, orderId); + 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()); + list.add(startupDetails); + decimal = decimal.add(startupCost); + Integer startupDuration = feignEbikeSysRcostsetDto.getStartupDuration(); + //判断是否超出起步时长 + if (minutes>startupDuration) { + startTime = startTime.plusMinutes(startupDuration); + long newMinutes = TimeUtils.betweenMinutes(startTime, endTime); + Integer duration = feignEbikeSysRcostsetDto.getDuration(); + //时长费用 + BigDecimal durationCost = feignEbikeSysRcostsetDto.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.CYCLING_DURATION_FEE,"默认时长费用",multiply,JSONObject.toJSONString(feignEbikeSysRcostsetDto),null,LocalDateTime.now()); + list.add(timeDetails); + decimal = decimal.add(multiply); + } + return decimal; } } diff --git a/ebike-orders/src/main/java/com/cdzy/orders/uitls/NumberUtils.java b/ebike-orders/src/main/java/com/cdzy/orders/uitls/NumberUtils.java index 1fbff002..a14d137c 100644 --- a/ebike-orders/src/main/java/com/cdzy/orders/uitls/NumberUtils.java +++ b/ebike-orders/src/main/java/com/cdzy/orders/uitls/NumberUtils.java @@ -23,6 +23,18 @@ public final class NumberUtils { return (int) Math.ceil((double) dividend / divisor); } + /** + * 安全的将long转换为int + * @param value long值 + * @return int值 + */ + public static int longConvertInt(long value) { + if (value < Integer.MIN_VALUE || value > Integer.MAX_VALUE) { + throw new ArithmeticException("大小超出安全值"); + } + return (int) value; + } + /** * 安全转换字符串为整数 * @param str 要转换的字符串