增加消耗性物资结算功能
- 新增消耗性物资的租赁费用计算逻辑 - 增加安全工器具的结算相关字段和功能 - 优化已结算和未结算协议的处理流程 -调整数据库查询以支持新的结算类型
This commit is contained in:
parent
aea731d3b8
commit
40c7c19aa8
|
|
@ -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<SltAgreementInfo> repairList = sltAgreementInfoService.getRepairList(sltAgreementInfo);
|
||||
return getDataTable(repairList);
|
||||
} catch (NumberFormatException e) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -55,6 +55,11 @@ public interface IwsCostPushMapper {
|
|||
*/
|
||||
List<IwsCostPushBean> getPaidSltBaseInfo(IwsCostPushBean record);
|
||||
|
||||
/**
|
||||
* 根据协议ID及月份查询当月已生成的区间租赁费用明细
|
||||
*/
|
||||
List<IwsCostPushBean> getLeaseCostsByAgreementIdAndMonth(IwsCostPushBean record);
|
||||
|
||||
/**
|
||||
* @author jsk
|
||||
*根据工程查询领用信息
|
||||
|
|
|
|||
|
|
@ -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<Byte, List<IwsCostPushBean>> agreementListMap = agreementList.stream().collect(Collectors.groupingBy(IwsCostPushBean::getIsSettlement));
|
||||
// 过滤拿已结算协议列表
|
||||
List<IwsCostPushBean> settlementAgreementList = agreementListMap.getOrDefault((byte) 1, Collections.emptyList());
|
||||
// 过滤拿未结算协议列表
|
||||
List<IwsCostPushBean> unsettlementAgreementList = agreementListMap.getOrDefault((byte) 0, Collections.emptyList());
|
||||
List<IwsCostPushBean> settlementAgreementList = new ArrayList<>(); //工器具已结算协议
|
||||
List<IwsCostPushBean> safetySettlementAgreementList = new ArrayList<>(); // 安全工器具已结算协议
|
||||
List<IwsCostPushBean> unsettlementAgreementList = new ArrayList<>(); // 工器具未结算协议
|
||||
List<IwsCostPushBean> 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<PeriodCostSummaryVo> 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<PeriodCostSummaryVo> 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<PeriodCostResultVo> 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<SltAgreementInfo> settlementEquipmentCosts = new ArrayList<>();
|
||||
List<PeriodCostResultVo> settlementEquipmentCostsDetails = new ArrayList<>();
|
||||
List<SltAgreementInfo> settlementSafetyEquipmentCosts = new ArrayList<>();
|
||||
List<PeriodCostResultVo> settlementSafetyEquipmentCostsDetails = new ArrayList<>();
|
||||
|
||||
// 计算已结算协议 ---- (工器具)租赁、维修、丢失、报废4项费用
|
||||
List<SltAgreementInfo> settlementEquipmentCosts = sltAgreementInfoService.getSltReportedList(new SltAgreementInfo()
|
||||
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)
|
||||
);
|
||||
|
||||
// 计算已结算协议 ---- (安全工器具)租赁、维修、丢失、报废4项费用
|
||||
List<SltAgreementInfo> settlementSafetyEquipmentCosts = sltAgreementInfoService.getSltReportedList(new SltAgreementInfo()
|
||||
// 获取已结算协议 ---- (工器具)本月租赁的区间费用明细
|
||||
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<PeriodCostResultVo> 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<PeriodCostResultVo> 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);
|
||||
}
|
||||
}
|
||||
|
||||
/// --------------- 已经结算协议 -----------------------
|
||||
|
||||
|
||||
|
|
@ -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<IwsCostPushBean> theMonthAgreementLeaseList = iwsCostPushMapper.getPaidSltBaseInfo(record);
|
||||
//List<IwsCostPushBean> theMonthAgreementLeaseList = iwsCostPushMapper.getPaidSltBaseInfo(record);
|
||||
List<IwsCostPushBean> 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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<SltAgreementInfo> list) {
|
||||
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<String> unitNames = new ArrayList<>();
|
||||
List<String> 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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,6 +65,9 @@ public class PeriodCostSummaryVo {
|
|||
@Excel(name = "总租赁费用")
|
||||
private BigDecimal totalLeaseCost;
|
||||
|
||||
@ApiModelProperty(value = "总消耗费用")
|
||||
private BigDecimal totalConsumeCost;
|
||||
|
||||
@ApiModelProperty(value = "平均日租金")
|
||||
@Excel(name = "平均日租金")
|
||||
private BigDecimal avgDailyRent;
|
||||
|
|
|
|||
|
|
@ -1177,8 +1177,7 @@ public class SltAgreementInfoServiceImpl implements ISltAgreementInfoService {
|
|||
* @param inputEndDate 前端输入的结束日期
|
||||
* @return 计算后的结果列表
|
||||
*/
|
||||
private List<PeriodCostResultVo> calculatePeriodCosts(List<PeriodCostResultVo> filteredResults,
|
||||
Date inputStartDate, Date inputEndDate) {
|
||||
private List<PeriodCostResultVo> calculatePeriodCosts(List<PeriodCostResultVo> filteredResults, Date inputStartDate, Date inputEndDate) {
|
||||
List<PeriodCostResultVo> 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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
<where>
|
||||
<if test="agreementCode != null and agreementCode != ''">
|
||||
AND bma.agreement_code LIKE CONCAT('%',#{agreementCode},'%')
|
||||
|
|
@ -108,6 +110,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
</where>
|
||||
</select>
|
||||
|
||||
<select id="getLeaseCostsByAgreementIdAndMonth" resultType="com.bonus.material.push.domain.IwsCostPushBean">
|
||||
SELECT
|
||||
pmi.typeId as typeId, pmi.leaseNum as leaseNum, pmi.leaseDate, pmi.returnDate as backDate,
|
||||
pmi.leasePrice as leasePrice, pmi.leaseMoney as leaseMoney, pmi.jiju_type as settlementType,
|
||||
mt1.type_name as typeName,
|
||||
mt.type_name as modelName,
|
||||
mt.unit_name AS unitName
|
||||
FROM
|
||||
project_month_info pmi
|
||||
INNER JOIN calc_project_month cpm ON pmi.taskId = cpm.ID AND cpm.`MONTH` = #{month}
|
||||
LEFT JOIN ma_type mt ON mt.type_id = pmi.typeId
|
||||
LEFT JOIN ma_type mt1 ON mt.parent_id = mt1.type_id
|
||||
WHERE
|
||||
pmi.agreementId = #{agreementId}
|
||||
AND pmi.jiju_type = #{settlementType,jdbcType=TINYINT}
|
||||
</select>
|
||||
|
||||
<insert id="insertProjectMonthCosts">
|
||||
INSERT INTO project_month_costs(
|
||||
AGREEMENT_ID,
|
||||
|
|
@ -421,4 +440,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
|
||||
|
||||
</mapper>
|
||||
|
|
|
|||
|
|
@ -47,6 +47,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<result property="status" column="status"/>
|
||||
<result property="mtUnitName" column="mt_unit_name"/>
|
||||
<result property="remark" column="remark"/>
|
||||
<result property="comsumable" column="comsumable"/>
|
||||
<result property="buyPrice" column="buy_price"/>
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectSltAgreementInfoVo">
|
||||
|
|
@ -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
|
||||
<if test="settlementType != null">
|
||||
and saa.settlement_type = #{settlementType}
|
||||
</if>
|
||||
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"
|
|||
<if test="startTime != null and endTime != null">
|
||||
and saa.create_time between #{startTime} and #{endTime}
|
||||
</if>
|
||||
<if test="agreementIds != null and agreementIds.size() > 0">
|
||||
and bai.agreement_id in
|
||||
<foreach item="item" index="index" collection="agreementIds" open="(" separator="," close=")">
|
||||
#{item}
|
||||
</foreach>
|
||||
</if>
|
||||
|
||||
<choose>
|
||||
<when test="sltStatus == '1'.toString()">
|
||||
|
|
@ -856,7 +867,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
and saa.status = '3'
|
||||
</when>
|
||||
</choose>
|
||||
GROUP BY bai.agreement_id, bai.settlement_type
|
||||
GROUP BY bai.agreement_id
|
||||
ORDER BY saa.create_time desc
|
||||
</select>
|
||||
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue