增加消耗性物资结算功能

- 新增消耗性物资的租赁费用计算逻辑
- 增加安全工器具的结算相关字段和功能
- 优化已结算和未结算协议的处理流程
-调整数据库查询以支持新的结算类型
This commit is contained in:
syruan 2025-09-01 01:39:44 +08:00
parent aea731d3b8
commit 40c7c19aa8
11 changed files with 257 additions and 86 deletions

View File

@ -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) {

View File

@ -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;

View File

@ -55,6 +55,11 @@ public interface IwsCostPushMapper {
*/
List<IwsCostPushBean> getPaidSltBaseInfo(IwsCostPushBean record);
/**
* 根据协议ID及月份查询当月已生成的区间租赁费用明细
*/
List<IwsCostPushBean> getLeaseCostsByAgreementIdAndMonth(IwsCostPushBean record);
/**
* @author jsk
*根据工程查询领用信息

View File

@ -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;
}
}

View File

@ -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());
}

View File

@ -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;

View File

@ -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;
}

View File

@ -65,6 +65,9 @@ public class PeriodCostSummaryVo {
@Excel(name = "总租赁费用")
private BigDecimal totalLeaseCost;
@ApiModelProperty(value = "总消耗费用")
private BigDecimal totalConsumeCost;
@ApiModelProperty(value = "平均日租金")
@Excel(name = "平均日租金")
private BigDecimal avgDailyRent;

View File

@ -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);

View File

@ -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>

View File

@ -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