diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/controller/IwsCostPushController.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/controller/IwsCostPushController.java index a5f11704..f9daa2cd 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/controller/IwsCostPushController.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/controller/IwsCostPushController.java @@ -159,7 +159,7 @@ public class IwsCostPushController extends BaseController { } try { SltAgreementInfo sltAgreementInfo = new SltAgreementInfo(); - sltAgreementInfo.setAgreementId(Long.valueOf(obj.getAgreementId())); + sltAgreementInfo.setAgreementId(obj.getAgreementId()); List repairList = sltAgreementInfoService.getRepairList(sltAgreementInfo); return getDataTable(repairList); } catch (NumberFormatException e) { diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/domain/IwsCostPushBean.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/domain/IwsCostPushBean.java index 8dde7158..051259be 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/domain/IwsCostPushBean.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/domain/IwsCostPushBean.java @@ -122,6 +122,9 @@ public class IwsCostPushBean implements Serializable { @Excel(name = "是否结算", readConverterExp = "0=未结算,1=已结算", sort = 6) private Byte isSettlement = 0; + @ApiModelProperty(value = "安全工器具是否结算, 0未结算,1=已结算") + private Byte safetyIsSettlement = 0; + @Excel(name = "结算类型", readConverterExp = "1=工器具,2=安全工器具") private Byte settlementType; @@ -130,6 +133,10 @@ public class IwsCostPushBean implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime settlementTime; + @ApiModelProperty(value = "安全工器具结算时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime safetySettlementTime; + // 签订时间 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime signTime; diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/mapper/IwsCostPushMapper.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/mapper/IwsCostPushMapper.java index c3c48469..dc4dadff 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/mapper/IwsCostPushMapper.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/mapper/IwsCostPushMapper.java @@ -55,6 +55,11 @@ public interface IwsCostPushMapper { */ List getPaidSltBaseInfo(IwsCostPushBean record); + /** + * 根据协议ID及月份查询当月已生成的区间租赁费用明细 + */ + List getLeaseCostsByAgreementIdAndMonth(IwsCostPushBean record); + /** * @author jsk *根据工程查询领用信息 diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/service/impl/IwsCostPushServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/service/impl/IwsCostPushServiceImpl.java index e6869887..370d64dd 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/service/impl/IwsCostPushServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/push/service/impl/IwsCostPushServiceImpl.java @@ -87,16 +87,21 @@ public class IwsCostPushServiceImpl implements IwsCostPushService { @Override public AjaxResult computeTheMonthCost(IwsCostPushBean costDto) { // 获取当前年月 例如:2025-01 - String month = DateTimeHelper.getNowMonth(); + // todo String month = DateTimeHelper.getNowMonth(); + String month = "2025-08"; // 获取当月第一天的日期和最后一天日期 LocalDateTime firstDayOfMonth = getFirstDayOfMonth(month); LocalDateTime lastDayOfMonth = getLastDayOfMonthZ(month); ZoneId zone = ZoneId.systemDefault(); // 当月第一天 LocalDate firstDay = LocalDate.now().withDayOfMonth(1); + // todo 测试用 + firstDay = LocalDate.of(2025, 8, 1); Date firstDate = Date.from(firstDay.atStartOfDay(zone).toInstant()); // 当月最后一天 LocalDate lastDay = LocalDate.now().withDayOfMonth(LocalDate.now().lengthOfMonth()); + // todo 测试用 + lastDay = LocalDate.of(2025, 8, 31); Date lastDate = Date.from(lastDay.atStartOfDay(zone).toInstant()); // 塞入当前年月到参数中 @@ -114,13 +119,40 @@ public class IwsCostPushServiceImpl implements IwsCostPushService { agreementList.removeIf(Objects::isNull); // 处理数据,首先把已结算和未结算的协议数据分组处理 - Map> agreementListMap = agreementList.stream().collect(Collectors.groupingBy(IwsCostPushBean::getIsSettlement)); - // 过滤拿已结算协议列表 - List settlementAgreementList = agreementListMap.getOrDefault((byte) 1, Collections.emptyList()); - // 过滤拿未结算协议列表 - List unsettlementAgreementList = agreementListMap.getOrDefault((byte) 0, Collections.emptyList()); + List settlementAgreementList = new ArrayList<>(); //工器具已结算协议 + List safetySettlementAgreementList = new ArrayList<>(); // 安全工器具已结算协议 + List unsettlementAgreementList = new ArrayList<>(); // 工器具未结算协议 + List safetyUnsettlementAgreementList = new ArrayList<>(); // 安全工器具未结算协议 - /// ------------------------- 未结算协议 ------------------- + // 过滤拿已结算协议列表、并且是本月结算的协议 + if (CollectionUtils.isNotEmpty(agreementList)) { + // 工器具已结算协议 + settlementAgreementList = agreementList.stream().filter(item -> item.getSettlementTime() != null + && item.getIsSettlement() != null && item.getIsSettlement() == 1 + && item.getSettlementTime().getMonth() == firstDayOfMonth.getMonth() + && item.getSettlementTime().getYear() == firstDayOfMonth.getYear()) + .collect(Collectors.toList()); + // 安全🔐工器具已结算协议 + safetySettlementAgreementList = agreementList.stream().filter(item -> item.getSafetySettlementTime() != null + && item.getSafetyIsSettlement() != null && item.getSafetyIsSettlement() == 1 + && item.getSafetySettlementTime().getMonth() == firstDayOfMonth.getMonth() + && item.getSafetySettlementTime().getYear() == firstDayOfMonth.getYear()) + .collect(Collectors.toList()); + + /// --------过滤拿未结算协议列表------------ + // 工器具未结算协议 + unsettlementAgreementList = agreementList.stream().filter(obj -> obj.getIsSettlement() != null + && obj.getIsSettlement() == 0 + && (obj.getSafetyIsSettlement() == null || obj.getSafetyIsSettlement() == 0) + ).collect(Collectors.toList()); + // 安全🔐工器具未结算协议 + safetyUnsettlementAgreementList = agreementList.stream().filter(obj -> obj.getSafetyIsSettlement() != null + && obj.getSafetyIsSettlement() == 0 + && (obj.getIsSettlement() == null || obj.getIsSettlement() == 0) + ).collect(Collectors.toList()); + } + + /// ------------------未结算协议费用计算开始 ------------------- // 计算未结算协议 ---- (工器具)租赁费用info列表及details明细 List unsettlementEquipmentLeaseCosts = sltAgreementInfoService.selectPeriodCostSummary(new PeriodCostQueryDto() .setAgreementIds(unsettlementAgreementList.stream().map(IwsCostPushBean::getAgreementId).collect(Collectors.toList())) @@ -134,40 +166,80 @@ public class IwsCostPushServiceImpl implements IwsCostPushService { ); // 计算未结算协议 ---- (安全工器具)租赁费用info列表及details明细 List unsettlementSafetyEquipmentLeaseCosts = sltAgreementInfoService.selectPeriodCostSummary(new PeriodCostQueryDto() - .setAgreementIds(unsettlementAgreementList.stream().map(IwsCostPushBean::getAgreementId).collect(Collectors.toList())) + .setAgreementIds(safetyUnsettlementAgreementList.stream().map(IwsCostPushBean::getAgreementId).collect(Collectors.toList())) .setStartDate(firstDate).setEndDate(lastDate) .setSltManageType((byte) 2) ); List unsettlementSafetyEquipmentLeaseCostsDetails = sltAgreementInfoService.selectPeriodCostList(new PeriodCostQueryDto() - .setAgreementIds(unsettlementAgreementList.stream().map(IwsCostPushBean::getAgreementId).collect(Collectors.toList())) + .setAgreementIds(safetyUnsettlementAgreementList.stream().map(IwsCostPushBean::getAgreementId).collect(Collectors.toList())) .setStartDate(firstDate).setEndDate(lastDate) .setSltManageType((byte) 2) ); - /// -------------------------- 未结算协议 -------------------- + /// ------------------ 未结算协议费用计算结束 -------------------- /// ------------------------ 已经结算协议 ------------------- - // 已结算协议首先要删除掉不是本月结算的数据 - settlementAgreementList.removeIf(item -> - item.getSettlementTime().getMonth() != firstDayOfMonth.getMonth() || - item.getSettlementTime().getYear() != firstDayOfMonth.getYear() - ); + List settlementEquipmentCosts = new ArrayList<>(); + List settlementEquipmentCostsDetails = new ArrayList<>(); + List settlementSafetyEquipmentCosts = new ArrayList<>(); + List settlementSafetyEquipmentCostsDetails = new ArrayList<>(); - // 计算已结算协议 ---- (工器具)租赁、维修、丢失、报废4项费用 - List settlementEquipmentCosts = sltAgreementInfoService.getSltReportedList(new SltAgreementInfo() - .setAgreementIds(settlementAgreementList.stream().map(IwsCostPushBean::getAgreementId).collect(Collectors.toList())) - .setStartTime(firstDate) - .setEndTime(lastDate) - .setSettlementType((byte) 1) - ); + if (CollectionUtils.isNotEmpty(settlementAgreementList)) { + // 计算已结算协议 ---- (工器具)租赁、维修、丢失、报废4项费用统计📉 + settlementEquipmentCosts = sltAgreementInfoService.getSltReportedList(new SltAgreementInfo() + .setAgreementIds(settlementAgreementList.stream().map(IwsCostPushBean::getAgreementId).collect(Collectors.toList())) + .setStartTime(firstDate) + .setEndTime(lastDate) + .setSettlementType((byte) 1) + ); + // 获取已结算协议 ---- (工器具)本月租赁的区间费用明细 + settlementEquipmentCostsDetails = sltAgreementInfoService.selectPeriodCostList(new PeriodCostQueryDto() + .setAgreementIds(settlementAgreementList.stream().map(IwsCostPushBean::getAgreementId).collect(Collectors.toList())) + .setStartDate(firstDate).setEndDate(lastDate) + .setSltManageType((byte) 1) + ); + // 把区间计算的租赁费用覆盖已结算的用作展示 + for (SltAgreementInfo item : settlementEquipmentCosts) { + Long agreementId = item.getAgreementId(); + List filterArray = settlementEquipmentCostsDetails.stream().filter(obj -> obj.getAgreementId().equals(agreementId)).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(filterArray)) { + filterArray.removeIf(Objects::isNull); + BigDecimal leaseCostFilter = BigDecimal.ZERO; + for (PeriodCostResultVo vo : filterArray) { + leaseCostFilter = leaseCostFilter.add(vo.getLeaseCost()); + } + item.setLeaseCost(leaseCostFilter); + } + } + } + + if (CollectionUtils.isNotEmpty(safetySettlementAgreementList)) { + // 计算已结算协议 ---- (安全工器具)租赁、维修、丢失、报废4项费用统计📉 + settlementSafetyEquipmentCosts = sltAgreementInfoService.getSltReportedList(new SltAgreementInfo() + .setAgreementIds(safetySettlementAgreementList.stream().map(IwsCostPushBean::getAgreementId).collect(Collectors.toList())) + .setStartTime(firstDate) + .setEndTime(lastDate) + .setSettlementType((byte) 2) + ); + // 获取已结算协议 ---- (安全工器具)的本月租赁区间费用明细 + settlementSafetyEquipmentCostsDetails = sltAgreementInfoService.selectPeriodCostList(new PeriodCostQueryDto() + .setAgreementIds(safetySettlementAgreementList.stream().map(IwsCostPushBean::getAgreementId).collect(Collectors.toList())) + .setStartDate(firstDate).setEndDate(lastDate) + .setSltManageType((byte) 2) + ); + // 把区间计算的租赁费用覆盖已结算的用作展示 + for (SltAgreementInfo item : settlementSafetyEquipmentCosts) { + Long agreementId = item.getAgreementId(); + List filterArray = settlementSafetyEquipmentCostsDetails.stream().filter(obj -> obj.getAgreementId().equals(agreementId)).collect(Collectors.toList()); + filterArray.removeIf(Objects::isNull); + BigDecimal leaseCostFilter = BigDecimal.ZERO; + for (PeriodCostResultVo vo : filterArray) { + leaseCostFilter = leaseCostFilter.add(vo.getLeaseCost()); + } + item.setLeaseCost(leaseCostFilter); + } + } - // 计算已结算协议 ---- (安全工器具)租赁、维修、丢失、报废4项费用 - List settlementSafetyEquipmentCosts = sltAgreementInfoService.getSltReportedList(new SltAgreementInfo() - .setAgreementIds(settlementAgreementList.stream().map(IwsCostPushBean::getAgreementId).collect(Collectors.toList())) - .setStartTime(firstDate) - .setEndTime(lastDate) - .setSettlementType((byte) 2) - ); /// --------------- 已经结算协议 ----------------------- @@ -179,6 +251,7 @@ public class IwsCostPushServiceImpl implements IwsCostPushService { resultArray.add(new IwsCostPushBean() .setAgreementId(vo.getAgreementId()).setTaskId(costDto.getTaskId()).setSettlementType((byte) 1) .setLeaseMoney(vo.getTotalLeaseCost()) + .setConsumeMoney(vo.getTotalConsumeCost()) ); } // 转化未结算安全工器具费用 @@ -186,6 +259,7 @@ public class IwsCostPushServiceImpl implements IwsCostPushService { resultArray.add(new IwsCostPushBean() .setAgreementId(vo.getAgreementId()).setTaskId(costDto.getTaskId()).setSettlementType((byte) 2) .setLeaseMoney(vo.getTotalLeaseCost()) + .setConsumeMoney(vo.getTotalConsumeCost()) ); } // 转换已结算工器具费用 @@ -194,6 +268,7 @@ public class IwsCostPushServiceImpl implements IwsCostPushService { .setAgreementId(vo.getAgreementId()).setTaskId(costDto.getTaskId()).setSettlementType((byte) 1) .setLeaseMoney(vo.getLeaseCost()).setRepairMoney(vo.getRepairCost()) .setLostMoney(vo.getLoseCost()).setScrapMoney(vo.getScrapCost()) + .setConsumeMoney(vo.getConsumeCost()) ); } // 转换已结算安全工器具费用 @@ -202,28 +277,45 @@ public class IwsCostPushServiceImpl implements IwsCostPushService { .setAgreementId(vo.getAgreementId()).setTaskId(costDto.getTaskId()).setSettlementType((byte) 2) .setLeaseMoney(vo.getLeaseCost()).setRepairMoney(vo.getRepairCost()) .setLostMoney(vo.getLoseCost()).setScrapMoney(vo.getScrapCost()) + .setConsumeMoney(vo.getConsumeCost()) ); } - // 批量插入 -- 存入数据库info + // 批量插入 -- 存入数据库costs列表 int addProjectMonthCostsMapperResult = iwsCostPushMapper.insertProjectMonthCosts(resultArray); - // 批量插入 -- 存入数据库details + // 批量插入 -- 存入数据库租赁费用明细(project_month_info表) if (CollectionUtils.isNotEmpty(unsettlementEquipmentLeaseCostsDetails)) { - // 工器具类型的存入 + // (工器具)未结算租赁费用的存入 unsettlementEquipmentLeaseCostsDetails.forEach(item -> { item.setTaskId(costDto.getTaskId()); item.setEquipmentType((byte) 1); }); iwsCostPushMapper.insertProjectMonthCostsDetails(unsettlementEquipmentLeaseCostsDetails); } + if (CollectionUtils.isNotEmpty(settlementEquipmentCostsDetails)) { + // (工器具)已结算租赁费用的存入 + settlementEquipmentCostsDetails.forEach(item -> { + item.setTaskId(costDto.getTaskId()); + item.setEquipmentType((byte) 1); + }); + iwsCostPushMapper.insertProjectMonthCostsDetails(settlementEquipmentCostsDetails); + } if (CollectionUtils.isNotEmpty(unsettlementSafetyEquipmentLeaseCostsDetails)) { - // 安全工器具类型的存入 + // (安全工器具)未结算租赁费用的存入 unsettlementSafetyEquipmentLeaseCostsDetails.forEach(item -> { item.setTaskId(costDto.getTaskId()); item.setEquipmentType((byte) 2); }); iwsCostPushMapper.insertProjectMonthCostsDetails(unsettlementSafetyEquipmentLeaseCostsDetails); } + if (CollectionUtils.isNotEmpty(settlementSafetyEquipmentCostsDetails)) { + // (安全工器具)已结算租赁费用的存入 + settlementSafetyEquipmentCostsDetails.forEach(item -> { + item.setTaskId(costDto.getTaskId()); + item.setEquipmentType((byte) 2); + }); + iwsCostPushMapper.insertProjectMonthCostsDetails(settlementSafetyEquipmentCostsDetails); + } return 0 < addProjectMonthCostsMapperResult ? AjaxResult.success("月结费用计算成功") : AjaxResult.error("月结费用计算失败"); } @@ -241,10 +333,11 @@ public class IwsCostPushServiceImpl implements IwsCostPushService { } // 获取前端传入年月对应的第一天与最后一天 LocalDateTime对象 - LocalDateTime queryStartTime = getFirstDayOfMonth(record.getMonth()); - LocalDateTime queryEndTime = getLastDayOfMonthZ(record.getMonth()); + //LocalDateTime queryStartTime = getFirstDayOfMonth(record.getMonth()); + //LocalDateTime queryEndTime = getLastDayOfMonthZ(record.getMonth()); - List theMonthAgreementLeaseList = iwsCostPushMapper.getPaidSltBaseInfo(record); + //List theMonthAgreementLeaseList = iwsCostPushMapper.getPaidSltBaseInfo(record); + List theMonthAgreementLeaseList = iwsCostPushMapper.getLeaseCostsByAgreementIdAndMonth(record); if (CollectionUtils.isEmpty(theMonthAgreementLeaseList)) { return Collections.emptyList(); } else { @@ -255,38 +348,38 @@ public class IwsCostPushServiceImpl implements IwsCostPushService { Objects.isNull(item.getLeaseNum()) || Objects.isNull(item.getLeasePrice()) ); - for (IwsCostPushBean leaseCostInfo : theMonthAgreementLeaseList) { - if (null == leaseCostInfo.getLeaseDate()) { continue; } - if (null == leaseCostInfo.getBackDate()) { leaseCostInfo.setBackDate(queryEndTime); } - - // 校准计算后的日期 - if (leaseCostInfo.getLeaseDate().isBefore(queryStartTime)) { - leaseCostInfo.setLeaseDate(queryStartTime); - } else if (leaseCostInfo.getLeaseDate().isAfter(queryEndTime)) { - leaseCostInfo.setLeaseDays(0); - leaseCostInfo.setDelFlag(true); - continue; - } - if (leaseCostInfo.getBackDate().isAfter(queryEndTime)) { - leaseCostInfo.setBackDate(queryEndTime); - } else if (leaseCostInfo.getBackDate().isBefore(queryStartTime)) { - leaseCostInfo.setLeaseDays(0); - leaseCostInfo.setDelFlag(true); - continue; - } - - // 计算天数 - leaseCostInfo.setLeaseDays(Math.toIntExact(calculateDaysInclusive(leaseCostInfo.getLeaseDate(), leaseCostInfo.getBackDate()))); - // 计算费用 - leaseCostInfo.setLeaseMoney(new BigDecimal(leaseCostInfo.getLeaseDays()) - .multiply(leaseCostInfo.getLeasePrice()) - .multiply(leaseCostInfo.getLeaseNum()).setScale(2, RoundingMode.HALF_UP) - ); - - } +// for (IwsCostPushBean leaseCostInfo : theMonthAgreementLeaseList) { +// if (null == leaseCostInfo.getLeaseDate()) { continue; } +// if (null == leaseCostInfo.getBackDate()) { leaseCostInfo.setBackDate(queryEndTime); } +// +// // 校准计算后的日期 +// if (leaseCostInfo.getLeaseDate().isBefore(queryStartTime)) { +// leaseCostInfo.setLeaseDate(queryStartTime); +// } else if (leaseCostInfo.getLeaseDate().isAfter(queryEndTime)) { +// leaseCostInfo.setLeaseDays(0); +// leaseCostInfo.setDelFlag(true); +// continue; +// } +// if (leaseCostInfo.getBackDate().isAfter(queryEndTime)) { +// leaseCostInfo.setBackDate(queryEndTime); +// } else if (leaseCostInfo.getBackDate().isBefore(queryStartTime)) { +// leaseCostInfo.setLeaseDays(0); +// leaseCostInfo.setDelFlag(true); +// continue; +// } +// +// // 计算天数 +// leaseCostInfo.setLeaseDays(Math.toIntExact(calculateDaysInclusive(leaseCostInfo.getLeaseDate(), leaseCostInfo.getBackDate()))); +// // 计算费用 +// leaseCostInfo.setLeaseMoney(new BigDecimal(leaseCostInfo.getLeaseDays()) +// .multiply(leaseCostInfo.getLeasePrice()) +// .multiply(leaseCostInfo.getLeaseNum()).setScale(2, RoundingMode.HALF_UP) +// ); +// +// } // 删除标记的非期间段数据 - theMonthAgreementLeaseList.removeIf(IwsCostPushBean::isDelFlag); + // theMonthAgreementLeaseList.removeIf(IwsCostPushBean::isDelFlag); return theMonthAgreementLeaseList; } } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/controller/SltAgreementInfoController.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/controller/SltAgreementInfoController.java index f261851b..12d6e12a 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/controller/SltAgreementInfoController.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/controller/SltAgreementInfoController.java @@ -10,6 +10,7 @@ import java.util.stream.Collectors; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; @@ -116,9 +117,17 @@ public class SltAgreementInfoController extends BaseController { @ApiOperation(value = "根据协议获取结算清单") @PostMapping("/getSltInfo") public AjaxResult getSltInfo(@RequestBody List list) { - Byte settlementType = sltAgreementInfoService.checkLoginUserHasSettlementPermission(); - // 设置结算权限 - list.forEach(info -> info.setSettlementType(settlementType)); + if (CollectionUtil.isEmpty(list)) { + return AjaxResult.error("请选择协议"); + } + if (list.get(0).getSettlementType() == null || list.get(0).getSettlementType() < 1) { + Byte settlementType = sltAgreementInfoService.checkLoginUserHasSettlementPermission(); + // 设置结算权限 + list.forEach(info -> info.setSettlementType(settlementType)); + } else { + list.forEach(info -> info.setSettlementType(list.get(0).getSettlementType())); + } + List unitNames = new ArrayList<>(); List projectNames = new ArrayList<>(); @@ -150,7 +159,7 @@ public class SltAgreementInfoController extends BaseController { } bean = mergerData(bean, dataList,unitNames,projectNames); // 根据协议id获取申请时间 - TmTask tmTask = taskMapper.selectTaskById(agreementId, settlementType); + TmTask tmTask = taskMapper.selectTaskById(agreementId, list.get(0).getSettlementType()); if (tmTask != null) { bean.setApplyTime(tmTask.getCreateTime()); } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/domain/SltAgreementInfo.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/domain/SltAgreementInfo.java index 68afb5bb..6625804a 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/domain/SltAgreementInfo.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/domain/SltAgreementInfo.java @@ -235,6 +235,7 @@ public class SltAgreementInfo extends BaseEntity { private Integer isApp; private BigDecimal leaseCost; + private BigDecimal consumeCost; private BigDecimal repairCost; private BigDecimal scrapCost; private BigDecimal loseCost; diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/domain/vo/PeriodCostResultVo.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/domain/vo/PeriodCostResultVo.java index a41ed912..20843287 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/domain/vo/PeriodCostResultVo.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/domain/vo/PeriodCostResultVo.java @@ -56,6 +56,9 @@ public class PeriodCostResultVo { @ApiModelProperty(value = "租赁单价") private BigDecimal leasePrice; + @ApiModelProperty(value = "采购单价 原值") + private BigDecimal buyPrice; + @ApiModelProperty(value = "计算开始时间") @JsonFormat(pattern = "yyyy-MM-dd") private Date calcStartTime; @@ -70,6 +73,9 @@ public class PeriodCostResultVo { @ApiModelProperty(value = "租赁费用") private BigDecimal leaseCost; + @ApiModelProperty(value = "消耗费用") + private BigDecimal consumeCost; + @ApiModelProperty(value = "是否已结算 0-未结算 1-已结算") private String isSettled; @@ -99,4 +105,7 @@ public class PeriodCostResultVo { @ApiModelProperty(value = "备注") private String remark; + + @ApiModelProperty(value = "是否是消耗性物资 0否 1是") + private Integer comsumable; } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/domain/vo/PeriodCostSummaryVo.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/domain/vo/PeriodCostSummaryVo.java index 108887a0..243b0ec0 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/domain/vo/PeriodCostSummaryVo.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/domain/vo/PeriodCostSummaryVo.java @@ -65,6 +65,9 @@ public class PeriodCostSummaryVo { @Excel(name = "总租赁费用") private BigDecimal totalLeaseCost; + @ApiModelProperty(value = "总消耗费用") + private BigDecimal totalConsumeCost; + @ApiModelProperty(value = "平均日租金") @Excel(name = "平均日租金") private BigDecimal avgDailyRent; diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/service/impl/SltAgreementInfoServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/service/impl/SltAgreementInfoServiceImpl.java index be683264..e43dec68 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/service/impl/SltAgreementInfoServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/settlement/service/impl/SltAgreementInfoServiceImpl.java @@ -1177,8 +1177,7 @@ public class SltAgreementInfoServiceImpl implements ISltAgreementInfoService { * @param inputEndDate 前端输入的结束日期 * @return 计算后的结果列表 */ - private List calculatePeriodCosts(List filteredResults, - Date inputStartDate, Date inputEndDate) { + private List calculatePeriodCosts(List filteredResults, Date inputStartDate, Date inputEndDate) { List calculatedResults = new ArrayList<>(); for (PeriodCostResultVo result : filteredResults) { @@ -1204,18 +1203,26 @@ public class SltAgreementInfoServiceImpl implements ISltAgreementInfoService { // 计算租赁费用 BigDecimal leaseCost = BigDecimal.ZERO; + if (result.getComsumable() != null && result.getComsumable() == 1) { + if (result.getNum() == null) { + result.setNum(BigDecimal.ZERO); + } + // 消耗性物资直接计算购置价 + result.setConsumeCost(result.getNum().multiply(Optional.ofNullable(result.getBuyPrice()).orElse(BigDecimal.ZERO))); + } if (result.getNum() != null && result.getLeasePrice() != null && leaseDays > 0) { - leaseCost = result.getNum() - .multiply(result.getLeasePrice()) - .multiply(new BigDecimal(leaseDays)) - .setScale(2, RoundingMode.HALF_UP); + // 非消耗性物资按照租赁单价计算租赁费用 + leaseCost = result.getNum().multiply(result.getLeasePrice()).multiply(new BigDecimal(leaseDays)).setScale(2, RoundingMode.HALF_UP); } // 设置计算结果 result.setCalcStartTime(calcStartTime); result.setCalcEndTime(calcEndTime); result.setLeaseDays(leaseDays); - result.setLeaseCost(leaseCost); + result.setLeaseCost(Optional.of(leaseCost).orElse(BigDecimal.ZERO)); + if (result.getConsumeCost() == null || result.getConsumeCost().compareTo(BigDecimal.ZERO) == 0) { + result.setConsumeCost(BigDecimal.ZERO); + } calculatedResults.add(result); } @@ -1438,6 +1445,10 @@ public class SltAgreementInfoServiceImpl implements ISltAgreementInfoService { .map(detail -> detail.getLeaseCost() != null ? detail.getLeaseCost() : BigDecimal.ZERO) .reduce(BigDecimal.ZERO, BigDecimal::add); // 总租赁费用 + BigDecimal totalConsumeCost = agreementDetails.stream() + .map(detail -> detail.getConsumeCost() != null ? detail.getConsumeCost() : BigDecimal.ZERO) + .reduce(BigDecimal.ZERO, BigDecimal::add); // 统计总消耗费用 + // 计算平均日租金 BigDecimal avgDailyRent = BigDecimal.ZERO; if (totalLeaseDays > 0) { @@ -1467,6 +1478,7 @@ public class SltAgreementInfoServiceImpl implements ISltAgreementInfoService { summary.setTotalEquipmentCount(totalEquipmentCount); summary.setTotalLeaseDays(totalLeaseDays); summary.setTotalLeaseCost(totalLeaseCost); + summary.setTotalConsumeCost(totalConsumeCost); summary.setAvgDailyRent(avgDailyRent); summary.setEarliestLeaseTime(earliestLeaseTime); summary.setLatestReturnTime(latestReturnTime); diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/push/IwsCostPushMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/push/IwsCostPushMapper.xml index 51c2c171..5e88152f 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/push/IwsCostPushMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/push/IwsCostPushMapper.xml @@ -8,13 +8,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SELECT bp.pro_id AS projectId, bp.pro_name AS projectName, bp.pro_code AS projectCode, bu.unit_name AS unitName, - bma.agreement_id AS agreementId,bma.`agreement_code` AS agreementCode, IF(saa.audit_time IS NULL,0,1) AS isSettlement, - bma.sign_time AS signTime, bma.is_push AS isPush, - saa.audit_time AS settlementTime - FROM bm_agreement_info bma + bma.agreement_id AS agreementId,bma.`agreement_code` AS agreementCode, bma.sign_time AS signTime, bma.is_push AS isPush, + IF(saa.audit_time IS NULL,0,1) AS isSettlement, saa.audit_time AS settlementTime, + IF(saas.audit_time IS NULL,0,1) AS safetyIsSettlement, saas.audit_time AS safetySettlementTime + FROM + bm_agreement_info bma LEFT JOIN bm_project bp ON bp.pro_id = bma.project_id LEFT JOIN bm_unit bu ON bu.unit_id = bma.unit_id - LEFT JOIN slt_agreement_apply saa ON saa.agreement_id = bma.agreement_id AND bma.is_slt = 1 AND saa.`status` = '2' AND saa.settlement_type = #{settlementType} + LEFT JOIN slt_agreement_apply saa ON saa.agreement_id = bma.agreement_id AND saa.`status` = '2' AND saa.settlement_type = 1 + LEFT JOIN slt_agreement_apply saas ON saas.agreement_id = bma.agreement_id AND saas.`status` = '2' AND saas.settlement_type = 2 AND bma.agreement_code LIKE CONCAT('%',#{agreementCode},'%') @@ -108,6 +110,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + INSERT INTO project_month_costs( AGREEMENT_ID, @@ -421,4 +440,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ) + + diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/settlement/SltAgreementInfoMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/settlement/SltAgreementInfoMapper.xml index 58f98dc1..647dbc1f 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/settlement/SltAgreementInfoMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/settlement/SltAgreementInfoMapper.xml @@ -47,6 +47,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -828,6 +830,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" LEFT JOIN bm_project bp ON bp.pro_id = bai.project_id LEFT JOIN bm_unit bui ON bui.unit_id = bai.unit_id LEFT JOIN slt_agreement_apply saa on saa.agreement_id = bai.agreement_id + + and saa.settlement_type = #{settlementType} + LEFT JOIN slt_agreement_details sad ON saa.id = sad.apply_id LEFT JOIN sys_user su ON saa.auditor = su.user_id and su.del_flag = 0 where @@ -844,6 +849,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and saa.create_time between #{startTime} and #{endTime} + + and bai.agreement_id in + + #{item} + + @@ -856,7 +867,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and saa.status = '3' - GROUP BY bai.agreement_id, bai.settlement_type + GROUP BY bai.agreement_id ORDER BY saa.create_time desc @@ -1117,7 +1128,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bai.project_id, bp.pro_name as project_name, sai.type_id, - mt.type_name as model_name, + mt.type_name as model_name, mt.buy_price, mt1.type_name as type_name, sai.ma_id, sai.num, @@ -1127,7 +1138,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bai.is_slt AS is_settled, sai.slt_time AS settlement_time, sai.status, - mt.unit_name as mt_unit_name, + mt.unit_name as mt_unit_name, mt.comsumable, bai.remark FROM bm_agreement_info bai INNER JOIN slt_agreement_info sai ON bai.agreement_id = sai.agreement_id