结算修改

This commit is contained in:
hayu 2026-01-28 20:52:18 +08:00
parent 48cf463236
commit 4ccd339437
7 changed files with 271 additions and 252 deletions

View File

@ -232,15 +232,6 @@
form = layui.form,
laydate = layui.laydate;
// 初始化日期选择器
laydate.render({
elem: '#startDate'
});
laydate.render({
elem: '#endDate'
});
// 加载projectCost模块
layui.use('projectCost', function(){
var projectCost = layui.projectCost;

View File

@ -47,7 +47,7 @@
AND start_time >= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND end_time &lt;= #{endTime}
AND end_time &lt; DATE_ADD(#{endTime}, INTERVAL 1 DAY)
</if>
ORDER BY create_time DESC
</select>

View File

@ -3,6 +3,7 @@ package com.bonus.cost.beans;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
@ -167,6 +168,10 @@ public class ProjectLeaseCostDetail {
*/
private Integer sequence;
private List<ProjectLeaseCostDetail> modifications;
private ProjectLeaseCostDetail modification;
/**
* 查询关键字
*/
@ -443,5 +448,21 @@ public class ProjectLeaseCostDetail {
public void setCalculationId(Integer calculationId) {
this.calculationId = calculationId;
}
public List<ProjectLeaseCostDetail> getModifications() {
return modifications;
}
public void setModifications(List<ProjectLeaseCostDetail> modifications) {
this.modifications = modifications;
}
public ProjectLeaseCostDetail getModification() {
return modification;
}
public void setModification(ProjectLeaseCostDetail modification) {
this.modification = modification;
}
}

View File

@ -140,9 +140,9 @@ public class ProjectCostController extends BaseController<T> {
return ar;
}
@RequestMapping("editSettlement")
@RequestMapping("submitModifications")
@ResponseBody
public AjaxRes editSettlement(@RequestBody ProjectLeaseCostDetail o) {
public AjaxRes submitModifications(@RequestBody ProjectLeaseCostDetail o) {
AjaxRes ar = getAjaxRes();
try {
int res = projectCostService.editSettlement(o);

View File

@ -55,81 +55,86 @@ public class NewSettlementService {
@Transactional(rollbackFor = Exception.class)
public int editSettlement(ProjectLeaseCostDetail o) {
//根据领料还是退料进行数据修改
Byte operateType = o.getOperateType();
if (Byte.valueOf("1").equals(operateType)) {
int res = projectCostDao.editWfTaskRecord(o);
if (res == 0) {
throw new RuntimeException("修改领料数据失败!");
}
} else if (Byte.valueOf("2").equals(operateType)) {
int res = projectCostDao.editWfInfoRecord(o);
if (res == 0) {
throw new RuntimeException("修改退料数据失败!");
}
}
//调用结算计算逻辑
ProjectLeaseCostDetail bean = new ProjectLeaseCostDetail();
bean.setProjectId(o.getProjectId());
bean.setStartTime(o.getStartTime());
bean.setEndTime(o.getEndTime());
Map<String, Object> newSettlement = getNewSettlement(bean);
//将结算数据保存更新
List<Map<String, Object>> calculationResults = (List<Map<String, Object>>) newSettlement
.get("calculationResults");
//总金额
Double totalAmount = safeToDouble(newSettlement.get("totalAmount"), 0.0);
//修改总金额
int res = projectCostDao.editProjectCostCalculation(o.getCalculationId(), totalAmount);
//删除之前的数据
//1现根据calculationId查询详情数据
List<ProjectCostCalculationDetail> details = projectCostDao.queryCalculationDetails(o.getCalculationId());
//2根据详情数据删除工程费用计算结果时间段表
for (ProjectCostCalculationDetail detail : details){
projectCostDao.deleteCalculationSegments(detail.getId());
}
//3删除详情数据
projectCostDao.deleteCalculationDetails(o.getCalculationId());
// 保存计算结果明细和时间段
if (calculationResults != null && !calculationResults.isEmpty()) {
for (Map<String, Object> resultItem : calculationResults) {
// 创建明细记录
ProjectCostCalculationDetail detail = new ProjectCostCalculationDetail();
detail.setCalculationId(o.getCalculationId());
detail.setMachineTypeId(safeToInteger(resultItem.get("machineTypeId"), 0));
detail.setMachineTypeName(safeToString(resultItem.get("machineTypeName"), ""));
detail.setMachineModel(safeToString(resultItem.get("machineModel"), ""));
detail.setMachineUnit(safeToString(resultItem.get("machineUnit"), ""));
detail.setPrice(safeToDouble(resultItem.get("price"), 0.0));
detail.setCurrentCount(safeToInteger(resultItem.get("currentCount"), 0));
detail.setAmount(safeToDouble(resultItem.get("amount"), 0.0));
detail.setFirstLeaseTime(safeToString(resultItem.get("firstLeaseTime"), ""));
detail.setLastReturnTime(safeToString(resultItem.get("lastReturnTime"), ""));
// 保存明细记录
projectCostDao.saveCalculationDetail(detail);
Integer detailId = detail.getId();
// 保存时间段记录
@SuppressWarnings("unchecked")
List<Map<String, Object>> segments = (List<Map<String, Object>>) resultItem.get("segments");
if (segments != null && !segments.isEmpty()) {
List<ProjectCostCalculationSegment> segmentList = new ArrayList<>();
for (Map<String, Object> segmentItem : segments) {
ProjectCostCalculationSegment segment = new ProjectCostCalculationSegment();
segment.setCalculationDetailId(detailId);
segment.setStartTime(safeToString(segmentItem.get("startTime"), ""));
segment.setEndTime(safeToString(segmentItem.get("endTime"), ""));
segment.setDays(safeToInteger(segmentItem.get("days"), 0));
segment.setCount(safeToInteger(segmentItem.get("count"), 0));
segment.setAmount(safeToDouble(segmentItem.get("amount"), 0.0));
segmentList.add(segment);
List<ProjectLeaseCostDetail> leaseDetails = o.getModifications();
if (leaseDetails.size()>0){
for (ProjectLeaseCostDetail leaseDetail : leaseDetails){
//根据领料还是退料进行数据修改
Byte operateType = leaseDetail.getOperateType();
if (Byte.valueOf("1").equals(operateType)) {
int res = projectCostDao.editWfTaskRecord(leaseDetail);
if (res == 0) {
throw new RuntimeException("修改领料数据失败!");
}
} else if (Byte.valueOf("2").equals(operateType)) {
int res = projectCostDao.editWfInfoRecord(leaseDetail);
if (res == 0) {
throw new RuntimeException("修改退料数据失败!");
}
}
}
//调用结算计算逻辑
ProjectLeaseCostDetail bean = new ProjectLeaseCostDetail();
bean.setProjectId(o.getProjectId());
bean.setStartTime(o.getStartTime());
bean.setEndTime(o.getEndTime());
Map<String, Object> newSettlement = getNewSettlement(bean);
//将结算数据保存更新
List<Map<String, Object>> calculationResults = (List<Map<String, Object>>) newSettlement
.get("calculationResults");
//总金额
Double totalAmount = safeToDouble(newSettlement.get("totalAmount"), 0.0);
//修改总金额
int res = projectCostDao.editProjectCostCalculation(o.getCalculationId(), totalAmount);
//删除之前的数据
//1现根据calculationId查询详情数据
List<ProjectCostCalculationDetail> details = projectCostDao.queryCalculationDetails(o.getCalculationId());
//2根据详情数据删除工程费用计算结果时间段表
for (ProjectCostCalculationDetail detail : details){
projectCostDao.deleteCalculationSegments(detail.getId());
}
//3删除详情数据
projectCostDao.deleteCalculationDetails(o.getCalculationId());
// 保存计算结果明细和时间段
if (calculationResults != null && !calculationResults.isEmpty()) {
for (Map<String, Object> resultItem : calculationResults) {
// 创建明细记录
ProjectCostCalculationDetail detail = new ProjectCostCalculationDetail();
detail.setCalculationId(o.getCalculationId());
detail.setMachineTypeId(safeToInteger(resultItem.get("machineTypeId"), 0));
detail.setMachineTypeName(safeToString(resultItem.get("machineTypeName"), ""));
detail.setMachineModel(safeToString(resultItem.get("machineModel"), ""));
detail.setMachineUnit(safeToString(resultItem.get("machineUnit"), ""));
detail.setPrice(safeToDouble(resultItem.get("price"), 0.0));
detail.setCurrentCount(safeToInteger(resultItem.get("currentCount"), 0));
detail.setAmount(safeToDouble(resultItem.get("amount"), 0.0));
detail.setFirstLeaseTime(safeToString(resultItem.get("firstLeaseTime"), ""));
detail.setLastReturnTime(safeToString(resultItem.get("lastReturnTime"), ""));
// 保存明细记录
projectCostDao.saveCalculationDetail(detail);
Integer detailId = detail.getId();
// 保存时间段记录
@SuppressWarnings("unchecked")
List<Map<String, Object>> segments = (List<Map<String, Object>>) resultItem.get("segments");
if (segments != null && !segments.isEmpty()) {
List<ProjectCostCalculationSegment> segmentList = new ArrayList<>();
for (Map<String, Object> segmentItem : segments) {
ProjectCostCalculationSegment segment = new ProjectCostCalculationSegment();
segment.setCalculationDetailId(detailId);
segment.setStartTime(safeToString(segmentItem.get("startTime"), ""));
segment.setEndTime(safeToString(segmentItem.get("endTime"), ""));
segment.setDays(safeToInteger(segmentItem.get("days"), 0));
segment.setCount(safeToInteger(segmentItem.get("count"), 0));
segment.setAmount(safeToDouble(segmentItem.get("amount"), 0.0));
segmentList.add(segment);
}
projectCostDao.saveCalculationSegments(segmentList);
}
projectCostDao.saveCalculationSegments(segmentList);
}
}
}
@ -146,7 +151,12 @@ public class NewSettlementService {
List<ProjectLeaseCostDetail> leaseDetails = queryProjectLeaseDetails(o);
// 获取退料明细
List<ProjectLeaseCostDetail> returnDetails = queryProjectReturnDetails(o);
//计算逻辑
return settlementLogic(o,leaseDetails,returnDetails);
}
public Map<String, Object> settlementLogic(ProjectLeaseCostDetail o,List<ProjectLeaseCostDetail> leaseDetails,List<ProjectLeaseCostDetail> returnDetails){
// 创建一个新的列表来存储合并后的结果
List<ProjectLeaseCostDetail> mergedList = new ArrayList<>();
if (leaseDetails != null) {
@ -170,21 +180,21 @@ 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<>(); // 存储时间线上的数量变化
List<Map<String, Object>> segments = new ArrayList<>(); // 存储各个时间段
String machineTypeId = entry.getKey();
List<ProjectLeaseCostDetail> items = entry.getValue();
items.sort(Comparator.comparing(ProjectLeaseCostDetail::getOperateTime,
Comparator.nullsFirst(Comparator.naturalOrder())));
ProjectLeaseCostDetail firstItem = items.get(0);
//
//
if("2402".equals(machineTypeId)) {
System.err.println(machineTypeId);
}
@ -217,10 +227,10 @@ public class NewSettlementService {
}
}else {
Object addObj = map.get("add");
int addNum = (addObj != null) ? (int) addObj : 0; // 无值时给默认值0
Object delObj = map.get("del");
int delNum = (delObj != null) ? (int) delObj : 0; // 无值时给默认值0
Object listObj = map.get("list");
int addNum = (addObj != null) ? (int) addObj : 0; // 无值时给默认值0
Object delObj = map.get("del");
int delNum = (delObj != null) ? (int) delObj : 0; // 无值时给默认值0
Object listObj = map.get("list");
@SuppressWarnings("unchecked")
List<ProjectLeaseCostDetail> list=(listObj != null) ?(List<ProjectLeaseCostDetail>) listObj:new ArrayList<ProjectLeaseCostDetail>();
//从操作中获取到数据
@ -248,76 +258,76 @@ public class NewSettlementService {
LocalDateTime fasetStarTime=null;
if(currentCount>0) {
//如果之前有数据 则必须是条件的第天
fasetStarTime=startDate;
fasetStarTime=startDate;
}
double unitPrice = firstItem.getPrice() != null ? firstItem.getPrice() : 0;
//直接循环获取数据
// String fasetStarTimeStr = formatLocalDateTimeToDate(fasetStarTime);
for (Map.Entry<String, Map<String, Object>> mapObject : maps.entrySet()) {
Map<String, Object> mapData=mapObject.getValue();
String key=mapObject.getKey();
//从数据中获取到相关数据
Object addObj = mapData.get("add");
int addNum = (addObj != null) ? (int) addObj : 0; // 无值时给默认值0
Object delObj = mapData.get("del");
int delNum = (delObj != null) ? (int) delObj : 0; // 无值时给默认值0
Object listObj = mapData.get("list");
int addNum = (addObj != null) ? (int) addObj : 0; // 无值时给默认值0
Object delObj = mapData.get("del");
int delNum = (delObj != null) ? (int) delObj : 0; // 无值时给默认值0
Object listObj = mapData.get("list");
@SuppressWarnings("unchecked")
List<ProjectLeaseCostDetail> dataList=(listObj != null) ?(List<ProjectLeaseCostDetail>) listObj:new ArrayList<ProjectLeaseCostDetail>();
ProjectLeaseCostDetail itemData=dataList.get(dataList.size()-1);
LocalDateTime operateTime = LocalDateTime.parse(itemData.getOperateTime(), INPUT_FORMATTER);
System.out.println("日期:" + key);
//正对两种特殊的情况 -一种是 操作在开始时间的
//一种操作在结束时间的
//操作在开始时间的
if(key.equals(startTimeStr)) {
//先把数量加上来
currentCount=currentCount+addNum;
//记录操作时间
fasetStarTime=operateTime;
//初始化时间只有领取的 -无退换的 则不需要计算 下方是有退料的 则需要将使用的时间计算出来
if(delNum!=0) {
//如果今天有退还的 并且是开始的时间必须要按照一天计算
long daysBetween=getDay(fasetStarTime,operateTime);
if(daysBetween==0) {
add=false;
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("days", daysBetween);
totalItemAmount=totalItemAmount+segmentAmount;
//计算数量
currentCount=currentCount+addNum;
segment.put("count", currentCount);
segment.put("amount", segmentAmount);
segments.add(segment);
//下次计算进行减去今日退换的
currentCount=currentCount-delNum;
}
}
//操作在结束时间点
}else if(key.equals(endTimeStr)) {
//存在之前领用的数据的 先将之前的数据计算出来
if(currentCount>0) {
//有领用的
if(addNum>0) {
//计算天数
long daysBetween=getDay(fasetStarTime,operateTime);
if(daysBetween==0) {
daysBetween=1;
add=false;
}
double segmentAmount = currentCount * unitPrice * daysBetween;
Map<String, Object> segment = new HashMap<>();
System.out.println("日期:" + key);
//正对两种特殊的情况 -一种是 操作在开始时间的
//一种操作在结束时间的
//操作在开始时间的
if(key.equals(startTimeStr)) {
//先把数量加上来
currentCount=currentCount+addNum;
//记录操作时间
fasetStarTime=operateTime;
//初始化时间只有领取的 -无退换的 则不需要计算 下方是有退料的 则需要将使用的时间计算出来
if(delNum!=0) {
//如果今天有退还的 并且是开始的时间必须要按照一天计算
long daysBetween=getDay(fasetStarTime,operateTime);
if(daysBetween==0) {
add=false;
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("days", daysBetween);
totalItemAmount=totalItemAmount+segmentAmount;
//计算数量
currentCount=currentCount+addNum;
segment.put("count", currentCount);
segment.put("amount", segmentAmount);
segments.add(segment);
//下次计算进行减去今日退换的
currentCount=currentCount-delNum;
}
}
//操作在结束时间点
}else if(key.equals(endTimeStr)) {
//存在之前领用的数据的 先将之前的数据计算出来
if(currentCount>0) {
//有领用的
if(addNum>0) {
//计算天数
long daysBetween=getDay(fasetStarTime,operateTime);
if(daysBetween==0) {
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);
@ -334,14 +344,14 @@ public class NewSettlementService {
segment2.put("amount", segmentAmount2);
segments.add(segment2);
totalItemAmount=totalItemAmount+segmentAmount2;
}else {
//计算天数
long daysBetween=getDay(fasetStarTime,operateTime);
if(add) {
daysBetween=daysBetween+1;
}
double segmentAmount = currentCount * unitPrice * daysBetween;
Map<String, Object> segment = new HashMap<>();
}else {
//计算天数
long daysBetween=getDay(fasetStarTime,operateTime);
if(add) {
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("days", daysBetween);
@ -352,40 +362,40 @@ public class NewSettlementService {
segment.put("amount", segmentAmount);
segments.add(segment);
fasetStarTime=operateTime;
}
}else {
if(fasetStarTime==null) {
fasetStarTime=operateTime;
}
//计算数量
}
}else {
if(fasetStarTime==null) {
fasetStarTime=operateTime;
}
//计算数量
currentCount=currentCount+addNum;
//计算最后一天的数据
double segmentAmount = currentCount * unitPrice * 1;
Map<String, Object> segment = new HashMap<>();
//计算最后一天的数据
double segmentAmount = currentCount * unitPrice * 1;
Map<String, Object> segment = new HashMap<>();
segment.put("startTime",fasetStarTime.toString());
segment.put("endTime", operateTime.toString());
segment.put("days", 1);
totalItemAmount=totalItemAmount+segmentAmount;
totalItemAmount=totalItemAmount+segmentAmount;
segment.put("count", currentCount);
segment.put("amount", segmentAmount);
segments.add(segment);
fasetStarTime=operateTime;
}
}else {
if(delNum>0) {
//先把领取的
long daysBetween=getDay(fasetStarTime,operateTime);
if(daysBetween==0) {
daysBetween=1;
add =false;
}
double segmentAmount = currentCount * unitPrice * daysBetween;
Map<String, Object> segment = new HashMap<>();
}
}else {
if(delNum>0) {
//先把领取的
long daysBetween=getDay(fasetStarTime,operateTime);
if(daysBetween==0) {
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);
@ -394,11 +404,11 @@ public class NewSettlementService {
segment.put("amount", segmentAmount);
segments.add(segment);
currentCount=currentCount+addNum;
// 然后将领取的座位最后一天单独计算
double segmentAmount2 = currentCount * unitPrice * 1;
Map<String, Object> segment2 = new HashMap<>();
LocalDateTime nextDayTime = operateTime.plusDays(1);
LocalDateTime nextDayTime = operateTime.plusDays(1);
segment2.put("startTime",operateTime.toString());
segment2.put("endTime", nextDayTime.toString());
segment2.put("days", 1);
@ -409,67 +419,67 @@ public class NewSettlementService {
//然后减去
currentCount=currentCount-delNum;
fasetStarTime=nextDayTime;
}else {
//无之前的数据的 第一次进来的
if(fasetStarTime==null) {
currentCount=currentCount+addNum;
fasetStarTime=operateTime;
if(delNum!=0) {
//如果今天有退还的 并且是开始的时间必须要按照一天计算
long daysBetween=getDay(fasetStarTime,operateTime);
if(daysBetween==0) {
double segmentAmount = currentCount * unitPrice * daysBetween;
daysBetween=daysBetween+1;
Map<String, Object> segment = new HashMap<>();
segment.put("startTime",fasetStarTime.toString());
segment.put("endTime", operateTime.toString());
segment.put("days", daysBetween);
totalItemAmount=totalItemAmount+segmentAmount;
//计算数量
currentCount=currentCount+addNum;
segment.put("count", currentCount);
segment.put("amount", segmentAmount);
segments.add(segment);
//下次计算进行减去今日退换的
currentCount=currentCount-delNum;
}
}
}else {
//处于中间的 之前有数据的
//有添加数据的
long daysBetween=getDay(fasetStarTime,operateTime);
if(daysBetween==0) {
daysBetween=daysBetween+1;
add=false;
}
if(currentCount+addNum-addNum==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;
}
}
}
}else {
//无之前的数据的 第一次进来的
if(fasetStarTime==null) {
currentCount=currentCount+addNum;
fasetStarTime=operateTime;
if(delNum!=0) {
//如果今天有退还的 并且是开始的时间必须要按照一天计算
long daysBetween=getDay(fasetStarTime,operateTime);
if(daysBetween==0) {
double segmentAmount = currentCount * unitPrice * daysBetween;
daysBetween=daysBetween+1;
Map<String, Object> segment = new HashMap<>();
segment.put("startTime",fasetStarTime.toString());
segment.put("endTime", operateTime.toString());
segment.put("days", daysBetween);
totalItemAmount=totalItemAmount+segmentAmount;
//计算数量
currentCount=currentCount+addNum;
segment.put("count", currentCount);
segment.put("amount", segmentAmount);
segments.add(segment);
//下次计算进行减去今日退换的
currentCount=currentCount-delNum;
}
}
}else {
//处于中间的 之前有数据的
//有添加数据的
long daysBetween=getDay(fasetStarTime,operateTime);
if(daysBetween==0) {
daysBetween=daysBetween+1;
add=false;
}
if(currentCount+addNum-addNum==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;
}
}
}
}
//如果还是存在数据--并且 最后一天未计算的
String fasetStarTimeStr = formatLocalDateTimeToDate(fasetStarTime);
@ -481,7 +491,7 @@ public class NewSettlementService {
if(add) {
daysBetween=daysBetween+1;
}
}
Map<String, Object> segment = new HashMap<>();
segment.put("startTime",fasetStarTime.toString());
@ -512,20 +522,17 @@ public class NewSettlementService {
}
// 将原始明细按操作时间排序
List<ProjectLeaseCostDetail> sortedDetails = mergedList.stream().filter(Objects::nonNull).sorted(Comparator
.comparing(ProjectLeaseCostDetail::getOperateTime, Comparator.nullsFirst(Comparator.naturalOrder())))
.comparing(ProjectLeaseCostDetail::getOperateTime, Comparator.nullsFirst(Comparator.naturalOrder())))
.collect(Collectors.toList());
// 返回结果
Map<String, Object> result = new HashMap<>();
result.put("details", sortedDetails); // 原始按时间排序的明细
result.put("calculationResults", calculationResults); // 计算结果
result.put("totalAmount", totalAmount); // 总金额
return result;
}
/**
* 将local日期 转成当日日期
* @param dateTime