diff --git a/src/com/bonus/cost/service/NewSettlementService.java b/src/com/bonus/cost/service/NewSettlementService.java index b328e99..ef0d51a 100644 --- a/src/com/bonus/cost/service/NewSettlementService.java +++ b/src/com/bonus/cost/service/NewSettlementService.java @@ -180,10 +180,7 @@ public class NewSettlementService { //结束时间-转成日期 LocalDateTime startDate = LocalDateTime.parse(startTimeStr + "T00:00:00"); LocalDateTime endDate = LocalDateTime.parse(endTimeStr + "T23:59:59"); - - double totalAmount = 0.0; - //计算金额 for (Map.Entry> entry : groupedByMachineType.entrySet()) { Map timeLineData = new HashMap<>(); // 存储时间线上的数量变化 @@ -195,7 +192,7 @@ public class NewSettlementService { Comparator.nullsFirst(Comparator.naturalOrder()))); ProjectLeaseCostDetail firstItem = items.get(0); // - if("2402".equals(machineTypeId)) { + if("1143".equals(machineTypeId)) { System.err.println(machineTypeId); } double totalItemAmount = 0.0; @@ -263,7 +260,7 @@ public class NewSettlementService { double unitPrice = firstItem.getPrice() != null ? firstItem.getPrice() : 0; //直接循环获取数据 // String fasetStarTimeStr = formatLocalDateTimeToDate(fasetStarTime); - + boolean isLast=false; for (Map.Entry> mapObject : maps.entrySet()) { Map mapData=mapObject.getValue(); String key=mapObject.getKey(); @@ -288,15 +285,15 @@ public class NewSettlementService { fasetStarTime=operateTime; //初始化时间只有领取的 -无退换的 则不需要计算 下方是有退料的 则需要将使用的时间计算出来 if(delNum!=0) { - //如果今天有退还的 并且是开始的时间必须要按照一天计算 - long daysBetween=getDay(fasetStarTime,operateTime); - if(daysBetween==0) { - add=false; + LocalDateTime nextDayTime = operateTime.plusDays(1); + fasetStarTime=nextDayTime; + //如果今天有退还的 并且是开始的时间必须要按照一天计算 + long daysBetween=getDay(fasetStarTime,nextDayTime); daysBetween=daysBetween+1; double segmentAmount = currentCount * unitPrice * daysBetween; Map segment = new HashMap<>(); segment.put("startTime",fasetStarTime.toString()); - segment.put("endTime", operateTime.toString()); + segment.put("endTime", nextDayTime.toString()); segment.put("days", daysBetween); totalItemAmount=totalItemAmount+segmentAmount; //计算数量 @@ -306,11 +303,11 @@ public class NewSettlementService { segments.add(segment); //下次计算进行减去今日退换的 currentCount=currentCount-delNum; - } + } //操作在结束时间点 }else if(key.equals(endTimeStr)) { - + isLast=false; //存在之前领用的数据的 先将之前的数据计算出来 if(currentCount>0) { //有领用的 @@ -386,8 +383,12 @@ public class NewSettlementService { }else { if(delNum>0) { + String fasetStarTimeStr1 = formatLocalDateTimeToDate(fasetStarTime); + String operateTimeStr = formatLocalDateTimeToDate(operateTime); + if(fasetStarTimeStr1.equals(operateTimeStr)) { + operateTime = operateTime.plusDays(1); + } //先把领取的 - long daysBetween=getDay(fasetStarTime,operateTime); if(daysBetween==0) { daysBetween=1; @@ -419,7 +420,11 @@ public class NewSettlementService { //然后减去 currentCount=currentCount-delNum; fasetStarTime=nextDayTime; - + String fasetStarTimeStr = formatLocalDateTimeToDate(fasetStarTime); + if(fasetStarTimeStr.equals(endTimeStr)) { + isLast=true; + + } }else { //无之前的数据的 第一次进来的 if(fasetStarTime==null) { @@ -446,6 +451,12 @@ public class NewSettlementService { } } }else { + String fasetStarTimeStr1 = formatLocalDateTimeToDate(fasetStarTime); + String operateTimeStr = formatLocalDateTimeToDate(operateTime); + if(fasetStarTimeStr1.equals(operateTimeStr)) { + operateTime = operateTime.plusDays(1); + } + //处于中间的 之前有数据的 //有添加数据的 long daysBetween=getDay(fasetStarTime,operateTime); @@ -453,36 +464,55 @@ public class NewSettlementService { daysBetween=daysBetween+1; add=false; } - if(currentCount+addNum-addNum==0) { + if(currentCount+addNum-delNum==0) { daysBetween=daysBetween+1; add=false; } - - double segmentAmount = currentCount * unitPrice * daysBetween; - Map segment = new HashMap<>(); - segment.put("startTime",fasetStarTime.toString()); - segment.put("endTime", operateTime.toString()); - segment.put("days", daysBetween); - totalItemAmount=totalItemAmount+segmentAmount; - segment.put("count", currentCount); - segment.put("amount", segmentAmount); - segments.add(segment); - fasetStarTime=operateTime; - //将数量减少-或者添加 - currentCount=currentCount+addNum; - currentCount=currentCount-delNum; + if(currentCount==0) { + fasetStarTime=operateTime; + currentCount=currentCount+addNum; + }else { + double segmentAmount = currentCount * unitPrice * daysBetween; + Map segment = new HashMap<>(); + segment.put("startTime",fasetStarTime.toString()); + segment.put("endTime", operateTime.toString()); + segment.put("days", daysBetween); + totalItemAmount=totalItemAmount+segmentAmount; + segment.put("count", currentCount); + segment.put("amount", segmentAmount); + segments.add(segment); + fasetStarTime=operateTime; + //将数量减少-或者添加 + currentCount=currentCount+addNum; + currentCount=currentCount-delNum; + String fasetStarTimeStr = formatLocalDateTimeToDate(fasetStarTime); + if(fasetStarTimeStr.equals(endTimeStr)) { + isLast=true; + + } + } + } - - - - } - - } } - //如果还是存在数据--并且 最后一天未计算的 + + + String fasetStarTimeStr = formatLocalDateTimeToDate(fasetStarTime); + //加上的数据刚好 是最后一天的 + if(currentCount>0 &&fasetStarTimeStr.equals(endTimeStr) && isLast) { + Map segment = new HashMap<>(); + segment.put("startTime",fasetStarTime.toString()); + segment.put("endTime", endDate.toString()); + segment.put("days", 1); + double segmentAmount3 = currentCount * unitPrice * 1; + totalItemAmount=totalItemAmount+segmentAmount3; + segment.put("count", currentCount); + segment.put("amount", segmentAmount3); + segments.add(segment); + } + //如果还是存在数据--并且 最后一天未计算的 if(currentCount>0 && !fasetStarTimeStr.equals(endTimeStr)) { long daysBetween=getDay(fasetStarTime,endDate); if(daysBetween==0) {