结算修复

This commit is contained in:
马三炮 2026-01-29 13:21:30 +08:00
parent 0a55d87aae
commit be36d03fce
1 changed files with 66 additions and 36 deletions

View File

@ -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<String, List<ProjectLeaseCostDetail>> entry : groupedByMachineType.entrySet()) {
Map<String, Object> 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<String, Map<String, Object>> mapObject : maps.entrySet()) {
Map<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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) {