From 4ccd339437abc2b80e36b8344faa64eb72841805 Mon Sep 17 00:00:00 2001 From: hayu <1604366271@qq.com> Date: Wed, 28 Jan 2026 20:52:18 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=93=E7=AE=97=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebContent/WEB-INF/views/projectCost/list.jsp | 9 - .../static/js/projectCost/projectCost.js | Bin 142870 -> 149216 bytes .../static/js/projectCost/projectCostEdit.js | Bin 112066 -> 113192 bytes .../cost/ProjectCostCalculationMapper.xml | 2 +- .../cost/beans/ProjectLeaseCostDetail.java | 21 + .../controller/ProjectCostController.java | 4 +- .../cost/service/NewSettlementService.java | 487 +++++++++--------- 7 files changed, 271 insertions(+), 252 deletions(-) diff --git a/WebContent/WEB-INF/views/projectCost/list.jsp b/WebContent/WEB-INF/views/projectCost/list.jsp index 85cbce7..908f57d 100644 --- a/WebContent/WEB-INF/views/projectCost/list.jsp +++ b/WebContent/WEB-INF/views/projectCost/list.jsp @@ -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; diff --git a/WebContent/static/js/projectCost/projectCost.js b/WebContent/static/js/projectCost/projectCost.js index 847f071db8385d152ba87f924144bab4eb595359..551da8d236e17ddb6c46c1aa17a7a1401b0a6d3d 100644 GIT binary patch delta 3532 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 delta 495 zcmZ4Sh3(L5whhxXC-YhHvF9+PG9)q-PySzJJ$arc+hi?qr^#2E1SUT);$XF6P++K@ zKCz6^a`J@^fywt2IGBM#lP?-bPG(6|n_QqQFquOlWO9PG#pG{>4wD7+geLnLMNNLd z%K=o+Gucm*XYx6tj>#9|j3)OPubDhSoon$MT_%vV+(kfZOBhNSiWu@HGge#D(CW>7 z#=n>*8#RhdZcvk%++`-kuD}5DnEK>EYt89=>lpba-!LfHo4kO@WU@ho#$*M@TO4O6Zb)4aRNFtaVbqvhsHQpjNVEkgpr;$GXLOl-KwhNT!DG9F2jh!E0LJ{QyZ`_I diff --git a/resources/mybatis/cost/ProjectCostCalculationMapper.xml b/resources/mybatis/cost/ProjectCostCalculationMapper.xml index 4260521..de04cf7 100644 --- a/resources/mybatis/cost/ProjectCostCalculationMapper.xml +++ b/resources/mybatis/cost/ProjectCostCalculationMapper.xml @@ -47,7 +47,7 @@ AND start_time >= #{startTime} - AND end_time <= #{endTime} + AND end_time < DATE_ADD(#{endTime}, INTERVAL 1 DAY) ORDER BY create_time DESC diff --git a/src/com/bonus/cost/beans/ProjectLeaseCostDetail.java b/src/com/bonus/cost/beans/ProjectLeaseCostDetail.java index 7ed7177..09cce81 100644 --- a/src/com/bonus/cost/beans/ProjectLeaseCostDetail.java +++ b/src/com/bonus/cost/beans/ProjectLeaseCostDetail.java @@ -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 modifications; + + private ProjectLeaseCostDetail modification; + /** * 查询关键字 */ @@ -443,5 +448,21 @@ public class ProjectLeaseCostDetail { public void setCalculationId(Integer calculationId) { this.calculationId = calculationId; } + + public List getModifications() { + return modifications; + } + + public void setModifications(List modifications) { + this.modifications = modifications; + } + + public ProjectLeaseCostDetail getModification() { + return modification; + } + + public void setModification(ProjectLeaseCostDetail modification) { + this.modification = modification; + } } diff --git a/src/com/bonus/cost/controller/ProjectCostController.java b/src/com/bonus/cost/controller/ProjectCostController.java index 8b628e4..775980e 100644 --- a/src/com/bonus/cost/controller/ProjectCostController.java +++ b/src/com/bonus/cost/controller/ProjectCostController.java @@ -140,9 +140,9 @@ public class ProjectCostController extends BaseController { 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); diff --git a/src/com/bonus/cost/service/NewSettlementService.java b/src/com/bonus/cost/service/NewSettlementService.java index 79e358e..b328e99 100644 --- a/src/com/bonus/cost/service/NewSettlementService.java +++ b/src/com/bonus/cost/service/NewSettlementService.java @@ -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 newSettlement = getNewSettlement(bean); - //将结算数据保存更新 - List> calculationResults = (List>) newSettlement - .get("calculationResults"); - - //总金额 - Double totalAmount = safeToDouble(newSettlement.get("totalAmount"), 0.0); - //修改总金额 - int res = projectCostDao.editProjectCostCalculation(o.getCalculationId(), totalAmount); - //删除之前的数据 - //1、现根据calculationId查询详情数据 - List 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 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> segments = (List>) resultItem.get("segments"); - if (segments != null && !segments.isEmpty()) { - List segmentList = new ArrayList<>(); - for (Map 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 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 newSettlement = getNewSettlement(bean); + //将结算数据保存更新 + List> calculationResults = (List>) newSettlement + .get("calculationResults"); + + //总金额 + Double totalAmount = safeToDouble(newSettlement.get("totalAmount"), 0.0); + //修改总金额 + int res = projectCostDao.editProjectCostCalculation(o.getCalculationId(), totalAmount); + //删除之前的数据 + //1、现根据calculationId查询详情数据 + List 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 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> segments = (List>) resultItem.get("segments"); + if (segments != null && !segments.isEmpty()) { + List segmentList = new ArrayList<>(); + for (Map 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 leaseDetails = queryProjectLeaseDetails(o); // 获取退料明细 List returnDetails = queryProjectReturnDetails(o); - + + //计算逻辑 + return settlementLogic(o,leaseDetails,returnDetails); + } + + public Map settlementLogic(ProjectLeaseCostDetail o,List leaseDetails,List returnDetails){ // 创建一个新的列表来存储合并后的结果 List 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> entry : groupedByMachineType.entrySet()) { Map timeLineData = new HashMap<>(); // 存储时间线上的数量变化 List> segments = new ArrayList<>(); // 存储各个时间段 - + String machineTypeId = entry.getKey(); List 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 list=(listObj != null) ?(List) listObj:new ArrayList(); //从操作中获取到数据 @@ -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> mapObject : maps.entrySet()) { Map 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 dataList=(listObj != null) ?(List) listObj:new ArrayList(); 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 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 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 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 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 segment = new HashMap<>(); + }else { + //计算天数 + long daysBetween=getDay(fasetStarTime,operateTime); + if(add) { + daysBetween=daysBetween+1; + } + double segmentAmount = currentCount * unitPrice * daysBetween; + Map 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 segment = new HashMap<>(); + //计算最后一天的数据 + double segmentAmount = currentCount * unitPrice * 1; + Map 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 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 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 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 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 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 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 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 segment = new HashMap<>(); segment.put("startTime",fasetStarTime.toString()); @@ -512,20 +522,17 @@ public class NewSettlementService { } // 将原始明细按操作时间排序 List 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 result = new HashMap<>(); result.put("details", sortedDetails); // 原始按时间排序的明细 result.put("calculationResults", calculationResults); // 计算结果 result.put("totalAmount", totalAmount); // 总金额 return result; - } - - /** * 将local日期 转成当日日期 * @param dateTime