From 2307a796598aeada6d071ff3e989fac8cdfa9953 Mon Sep 17 00:00:00 2001 From: haozq <1611483981@qq.com> Date: Tue, 20 Jan 2026 11:32:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=97=A5=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cost/service/ProjectCostServiceImpl.java | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/com/bonus/cost/service/ProjectCostServiceImpl.java b/src/com/bonus/cost/service/ProjectCostServiceImpl.java index cb1c6c0..75fb7f8 100644 --- a/src/com/bonus/cost/service/ProjectCostServiceImpl.java +++ b/src/com/bonus/cost/service/ProjectCostServiceImpl.java @@ -26,8 +26,10 @@ import org.springframework.transaction.annotation.Transactional; import java.io.OutputStream; import java.net.URLEncoder; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; @@ -336,6 +338,14 @@ public class ProjectCostServiceImpl implements ProjectCostService { return settlementId; } + public static void main(String[] args) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime operateTime = LocalDateTime.parse("2025-04-14 16:14:00", formatter); + LocalDateTime endtime = LocalDateTime.parse("2025-05-26 14:21:00", formatter); + long daysBetween = java.time.Duration.between(operateTime, endtime).toDays(); + System.err.println(daysBetween); + + } @Override public Map calculateSettlement(ProjectLeaseCostDetail o) { @@ -421,7 +431,9 @@ public class ProjectCostServiceImpl implements ProjectCostService { for (Map.Entry> entry : groupedByMachineType.entrySet()) { String machineTypeId = entry.getKey(); List items = entry.getValue(); - + if("531".equals(machineTypeId)) { + System.err.println(machineTypeId); + } // 按操作时间排序 items.sort(Comparator.comparing(ProjectLeaseCostDetail::getOperateTime, Comparator.nullsFirst(Comparator.naturalOrder()))); @@ -487,8 +499,12 @@ public class ProjectCostServiceImpl implements ProjectCostService { // 如果统计期间内有操作,计算从开始时间到第一个操作时间的费用 // 如果统计期间内没有操作,计算从开始时间到结束时间的费用 LocalDateTime endTimeForInitialSegment = firstOperateTimeInPeriod != null ? firstOperateTimeInPeriod : endDate; - long daysBetween = java.time.Duration.between(startDate, endTimeForInitialSegment).toDays(); - + long daysBetween = getDay(startDate, endTimeForInitialSegment); + + LocalDateTime lastTimes = LocalDateTime.parse(o.getEndTime()+" 23:59:59", formatter); + if(lastTimes.equals(endTimeForInitialSegment)) { + daysBetween+=1; + } if (daysBetween > 0) { double segmentAmount = currentCount * unitPrice * daysBetween; totalItemAmount += segmentAmount; @@ -536,7 +552,7 @@ public class ProjectCostServiceImpl implements ProjectCostService { // 计算上一个时间点到当前操作时间的租赁费用 if (currentCount > 0 && !previousTime.equals(operateTime)) { // 计算两个时间点之间的天数 - long daysBetween = java.time.Duration.between(previousTime, operateTime).toDays(); + long daysBetween = getDay(previousTime, operateTime); // 如果天数为0(开始时间等于结束时间),跳过这个时间段 if (daysBetween == 0) { @@ -546,7 +562,8 @@ public class ProjectCostServiceImpl implements ProjectCostService { if (daysBetween < 1) { daysBetween = 1; } - + + // 计算该时间段的租赁费用 double segmentAmount = currentCount * unitPrice * daysBetween; totalItemAmount += segmentAmount; @@ -594,7 +611,7 @@ public class ProjectCostServiceImpl implements ProjectCostService { // 计算最后一个操作时间点到统计结束时间的租赁费用 if (currentCount > 0 && !previousTime.equals(endDate)) { // 计算两个时间点之间的天数 - long daysBetween = java.time.Duration.between(previousTime, endDate).toDays(); + long daysBetween =getDay(previousTime, endDate); // 如果天数为0(开始时间等于结束时间),跳过这个时间段 if (daysBetween == 0) { @@ -603,6 +620,8 @@ public class ProjectCostServiceImpl implements ProjectCostService { // 不足一天按一天计算 if (daysBetween < 1) { daysBetween = 1; + }else { + daysBetween+=1; } // 计算该时间段的租赁费用 @@ -687,6 +706,15 @@ public class ProjectCostServiceImpl implements ProjectCostService { result.put("totalAmount", totalAmount); // 总金额 return result; } + + public long getDay(LocalDateTime operateTime,LocalDateTime endtime) { + LocalDate startDate = operateTime.toLocalDate(); + LocalDate endDate = endtime.toLocalDate(); + long naturalDays = ChronoUnit.DAYS.between(startDate, endDate); + System.out.println("自然日天数差(正确结果):" + naturalDays); + return naturalDays; + + } @Override public List> getAllProjects() {