From 88218faa480ffa4d596d40c49bca7e70eb3eebb5 Mon Sep 17 00:00:00 2001 From: haozq <1611483981@qq.com> Date: Thu, 22 Jan 2026 17:37:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cost/service/ProjectCostServiceImpl.java | 167 ++++++++++++++++-- 1 file changed, 150 insertions(+), 17 deletions(-) diff --git a/src/com/bonus/cost/service/ProjectCostServiceImpl.java b/src/com/bonus/cost/service/ProjectCostServiceImpl.java index 75fb7f8..ab26ba0 100644 --- a/src/com/bonus/cost/service/ProjectCostServiceImpl.java +++ b/src/com/bonus/cost/service/ProjectCostServiceImpl.java @@ -44,9 +44,16 @@ public class ProjectCostServiceImpl implements ProjectCostService { @Autowired private ProjectCostDao projectCostDao; + + @Autowired + private NewSettlementService newSettlementService; @Autowired private PlanApplicationDao planApplicationDao; + + // 定义两个格式化器:输入格式(带时分秒)、输出格式(仅年月日) + private static final DateTimeFormatter INPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + private static final DateTimeFormatter OUTPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); /** * 安全转换为Double类型 @@ -346,9 +353,16 @@ public class ProjectCostServiceImpl implements ProjectCostService { System.err.println(daysBetween); } - @Override public Map calculateSettlement(ProjectLeaseCostDetail o) { + return newSettlementService.getNewSettlement(o); + } + + + + public Map calculateSettlement2(ProjectLeaseCostDetail o) { + + // 获取领料明细 List leaseDetails = queryProjectLeaseDetails(o); // 获取退料明细 @@ -426,14 +440,17 @@ public class ProjectCostServiceImpl implements ProjectCostService { startDate = LocalDateTime.now().withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0); endDate = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59); } - + // 对每种物资类型进行计算 for (Map.Entry> entry : groupedByMachineType.entrySet()) { + boolean add=true; + boolean onlyAdd=true; String machineTypeId = entry.getKey(); List items = entry.getValue(); - if("531".equals(machineTypeId)) { + if("3627".equals(machineTypeId)) { System.err.println(machineTypeId); } + // 按操作时间排序 items.sort(Comparator.comparing(ProjectLeaseCostDetail::getOperateTime, Comparator.nullsFirst(Comparator.naturalOrder()))); @@ -456,6 +473,8 @@ public class ProjectCostServiceImpl implements ProjectCostService { // 第一步:处理统计期间开始之前的所有操作,计算期初在用数量 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + DateTimeFormatter formatter_day = DateTimeFormatter.ofPattern("yyyy-MM-dd"); for (ProjectLeaseCostDetail item : items) { if (item == null || item.getOperateTime() == null) { continue; @@ -479,16 +498,29 @@ public class ProjectCostServiceImpl implements ProjectCostService { } System.out.println("物资ID=" + machineTypeId + " 期初在用数量: " + currentCount); - + // 如果期初在用数量大于0,需要计算从统计开始时间到第一个操作时间(或统计结束时间)的费用 if (currentCount > 0) { // 找到统计期间内的第一个操作时间 LocalDateTime firstOperateTimeInPeriod = null; - for (ProjectLeaseCostDetail item : items) { + for (int i = 0; i < items.size(); i++) { + ProjectLeaseCostDetail item=items.get(i); if (item == null || item.getOperateTime() == null) { continue; } LocalDateTime operateTime = LocalDateTime.parse(item.getOperateTime(), formatter); + LocalDateTime startTimes = LocalDateTime.parse(o.getStartTime()+" 00:00:01", formatter); + //初始日期没有退料的 + String fastTimes = formatLocalDateTimeToDate(operateTime); + String start_times = formatLocalDateTimeToDate(startTimes); + //操作时间--如果操作时间为今天的 并且范围内没退料的 + if(fastTimes.equals(start_times)) { + if(2==item.getOperateType()) { + onlyAdd=false; + } + } + + if (!operateTime.isBefore(startDate) && !operateTime.isAfter(endDate)) { if (firstOperateTimeInPeriod == null || operateTime.isBefore(firstOperateTimeInPeriod)) { firstOperateTimeInPeriod = operateTime; @@ -499,16 +531,39 @@ public class ProjectCostServiceImpl implements ProjectCostService { // 如果统计期间内有操作,计算从开始时间到第一个操作时间的费用 // 如果统计期间内没有操作,计算从开始时间到结束时间的费用 LocalDateTime endTimeForInitialSegment = firstOperateTimeInPeriod != null ? firstOperateTimeInPeriod : endDate; - long daysBetween = getDay(startDate, endTimeForInitialSegment); - LocalDateTime lastTimes = LocalDateTime.parse(o.getEndTime()+" 23:59:59", formatter); - if(lastTimes.equals(endTimeForInitialSegment)) { - daysBetween+=1; + + long daysBetween = getDay(startDate, endTimeForInitialSegment); + LocalDateTime startTimes = LocalDateTime.parse(o.getStartTime()+" 00:00:01", formatter); + if(!onlyAdd) { + if(daysBetween==0) { + daysBetween=1; + add=false; + } + } + + LocalDateTime lastTimes = LocalDateTime.parse(o.getEndTime()+" 23:59:59", formatter); + String parsedDateOnly = formatLocalDateTimeToDate(lastTimes); + String end_times = formatLocalDateTimeToDate(endTimeForInitialSegment); + if(add) { + if(parsedDateOnly.equals(end_times)) { + daysBetween+=1; + }else { + ProjectLeaseCostDetail item=items.get(items.size()-1); + LocalDateTime operateTime = LocalDateTime.parse(item.getOperateTime(), formatter); + + + //判断当前数据是最后一条数据 ===== + if(2==item.getOperateType() && operateTime.equals(endTimeForInitialSegment)) { + daysBetween+=1; + } + + + } } if (daysBetween > 0) { double segmentAmount = currentCount * unitPrice * daysBetween; totalItemAmount += segmentAmount; - Map segment = new HashMap<>(); segment.put("startTime", startDate.toString()); segment.put("endTime", endTimeForInitialSegment.toString()); @@ -531,7 +586,11 @@ public class ProjectCostServiceImpl implements ProjectCostService { } // 第二步:处理统计期间内的所有操作 - for (ProjectLeaseCostDetail item : items) { + //数据加一 + for (int i = 0; i < items.size(); i++) { + ProjectLeaseCostDetail item=items.get(i); +// } +// for (ProjectLeaseCostDetail item : items) { if (item == null || item.getOperateTime() == null) { continue; } @@ -548,12 +607,24 @@ public class ProjectCostServiceImpl implements ProjectCostService { // 判断操作类型:1-领料,2-退料 boolean isLease = (item.getOperateType() == null || item.getOperateType() != 2); int quantity = 0; - + // 计算上一个时间点到当前操作时间的租赁费用 if (currentCount > 0 && !previousTime.equals(operateTime)) { + if("3627".equals(machineTypeId)) { + System.err.print(machineTypeId); + } // 计算两个时间点之间的天数 long daysBetween = getDay(previousTime, operateTime); - + LocalDateTime lastTimes = LocalDateTime.parse(o.getEndTime()+" 23:59:59", formatter); + String parsedDateOnly = formatLocalDateTimeToDate(lastTimes); + String end_times = formatLocalDateTimeToDate(operateTime); + if(add) { + if(parsedDateOnly.equals(end_times)) { + if (daysBetween == 0) { + daysBetween=1; + } + } + } // 如果天数为0(开始时间等于结束时间),跳过这个时间段 if (daysBetween == 0) { System.out.println("跳过无效时间段: " + previousTime + " 至 " + operateTime + " (开始时间等于结束时间)"); @@ -562,7 +633,24 @@ public class ProjectCostServiceImpl implements ProjectCostService { if (daysBetween < 1) { daysBetween = 1; } - + + if(add) { + if(parsedDateOnly.equals(end_times)) { + daysBetween+=1; + }else { + //计算-- + + if(i==items.size()-1 && 2==item.getOperateType()) { + long datadelNum = item.getReturnNum() != null ? item.getReturnNum() : 0; + if(currentCount==datadelNum) { + daysBetween+=1; + } + + } + + } + } +// // 计算该时间段的租赁费用 double segmentAmount = currentCount * unitPrice * daysBetween; @@ -576,7 +664,9 @@ public class ProjectCostServiceImpl implements ProjectCostService { segment.put("count", currentCount); segment.put("amount", segmentAmount); segments.add(segment); - + if("3627".equals(machineTypeId)) { + System.err.print(machineTypeId); + } // 添加调试信息 System.out.println("物资ID: " + machineTypeId + ", 时段: " + previousTime + " 至 " + operateTime + ", 天数: " + daysBetween + ", 数量: " + currentCount + ", 单价: " + unitPrice + ", 段金额: " @@ -612,6 +702,18 @@ public class ProjectCostServiceImpl implements ProjectCostService { if (currentCount > 0 && !previousTime.equals(endDate)) { // 计算两个时间点之间的天数 long daysBetween =getDay(previousTime, endDate); + + LocalDateTime lastTimes = LocalDateTime.parse(o.getEndTime()+" 23:59:59", formatter); + String parsedDateOnly = formatLocalDateTimeToDate(lastTimes); + String end_times = formatLocalDateTimeToDate(previousTime); + if(add) { + if(parsedDateOnly.equals(end_times)) { + if (daysBetween == 0) { + daysBetween=1; + add=false; + } + } + } // 如果天数为0(开始时间等于结束时间),跳过这个时间段 if (daysBetween == 0) { @@ -621,7 +723,11 @@ public class ProjectCostServiceImpl implements ProjectCostService { if (daysBetween < 1) { daysBetween = 1; }else { - daysBetween+=1; + if(add) { + daysBetween+=1; + } + + } // 计算该时间段的租赁费用 @@ -636,7 +742,9 @@ public class ProjectCostServiceImpl implements ProjectCostService { segment.put("count", currentCount); segment.put("amount", segmentAmount); segments.add(segment); - + if("3627".equals(machineTypeId)) { + System.err.print(machineTypeId); + } // 添加调试信息 System.out.println("物资ID: " + machineTypeId + ", 时段: " + previousTime + " 至 " + endDate + ", 天数: " + daysBetween + ", 数量: " + currentCount + ", 单价: " + unitPrice + ", 段金额: " + segmentAmount); @@ -707,6 +815,31 @@ public class ProjectCostServiceImpl implements ProjectCostService { return result; } + /** + * 新的结算逻辑 + * + * + */ + public Map getNewSettlement() { + Map result = new HashMap<>(); + + return result; + + } + + + + /** + * 核心方法:将LocalDateTime格式化为yyyy-MM-dd字符串 + * @param dateTime 待格式化的LocalDateTime对象 + * @return 仅年月日的字符串,格式为yyyy-MM-dd + */ + public static String formatLocalDateTimeToDate(LocalDateTime dateTime) { + if (dateTime == null) { + return null; // 处理空值,避免空指针 + } + return dateTime.format(OUTPUT_FORMATTER); + } public long getDay(LocalDateTime operateTime,LocalDateTime endtime) { LocalDate startDate = operateTime.toLocalDate(); LocalDate endDate = endtime.toLocalDate();