|
@@ -544,54 +544,58 @@ public class TWarehouseAgreementServiceImpl implements ITWarehouseAgreementServi
|
|
|
String remark = "";
|
|
|
// 计费区间 月日-月日X钱
|
|
|
String billingInterval = "";
|
|
|
+ // 已计费天数
|
|
|
+ Long earlySumDays = storageFeesDto.getEarlySumDays();
|
|
|
+ // 计费天数
|
|
|
+ Long days = storageFeesDto.getDays();
|
|
|
+
|
|
|
for (TWarehouseAgreementitems tWarehouseAgreementitems : itemList) {
|
|
|
+ feeId = tWarehouseAgreementitems.getfFeeid();
|
|
|
// 如果要计费天数不足一天,不予计算
|
|
|
- if (storageFeesDto.getDays() < 1) {
|
|
|
+ if (days < 1) {
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
dayLength = tWarehouseAgreementitems.getfEndays() - tWarehouseAgreementitems.getfFromdays() + 1L;
|
|
|
// 如果已计费天数超出本阶层,则进入下一层规则,并剪掉当前层天数
|
|
|
- if (storageFeesDto.getEarlySumDays() >= dayLength) {
|
|
|
- storageFeesDto.setEarlySumDays(storageFeesDto.getEarlySumDays() - dayLength);
|
|
|
- continue; //将已算账的天数 与 计费规则的 最后一天作比较如果 已算10天 > 规则结束 不算帐
|
|
|
+ if (earlySumDays >= dayLength) {
|
|
|
+ earlySumDays -= dayLength;
|
|
|
+ continue;
|
|
|
}
|
|
|
- // 如果计费日期超过本层天数
|
|
|
- if (storageFeesDto.getDays() >= dayLength) {
|
|
|
- // 天数剪掉 剩余已计费库存天数
|
|
|
- dayLength -= storageFeesDto.getEarlySumDays();
|
|
|
- storageFeesDto.setEarlySumDays(0L);
|
|
|
- feeId = tWarehouseAgreementitems.getfFeeid();
|
|
|
- // 获取最终金额:数量 * 单价 * 天数
|
|
|
- BigDecimal calculate = this.getCalculate(qty, tWarehouseAgreementitems.getfPrice(), dayLength);
|
|
|
- money = money.add(calculate);
|
|
|
|
|
|
- storageFeesDto.setDays(storageFeesDto.getDays() - dayLength);
|
|
|
+ if (earlySumDays + days > dayLength) {
|
|
|
+ // 当前层需要计算的天数
|
|
|
+ Long tempDays = dayLength - earlySumDays;
|
|
|
+ earlySumDays = 0L;
|
|
|
+ days -= tempDays;
|
|
|
+ // 计算最终金额:数量 * 单价 * 天数
|
|
|
+ BigDecimal calculate = this.getCalculate(qty, tWarehouseAgreementitems.getfPrice(), tempDays);
|
|
|
+ money = money.add(calculate);
|
|
|
// 组装运费明细记录
|
|
|
String details = assemblyBillingDetails(StorageFeeRangeDTO.builder()
|
|
|
- .dayNum(dayLength).price(tWarehouseAgreementitems.getfPrice()).qty(qty).amt(calculate)
|
|
|
+ .dayNum(tempDays).price(tWarehouseAgreementitems.getfPrice()).qty(qty).amt(calculate)
|
|
|
.build());
|
|
|
remark = StringUtils.isEmpty(remark) ? details : remark + "," + details;
|
|
|
- // 计算区间费用信息
|
|
|
- String costRange = assemblyBillingInterval(StorageFeeRangeDTO.builder()
|
|
|
- .startTime(storageFeesDto.getStartTime()).dayNum(dayLength).price(tWarehouseAgreementitems.getfPrice())
|
|
|
+ // 计算区间的费用信息
|
|
|
+ String interval = assemblyBillingInterval(StorageFeeRangeDTO.builder()
|
|
|
+ .startTime(storageFeesDto.getStartTime()).dayNum(tempDays).price(tWarehouseAgreementitems.getfPrice())
|
|
|
.qty(qty).unit(agreementitems.getfFeeunitid())
|
|
|
.build());
|
|
|
- billingInterval = StringUtils.isEmpty(billingInterval) ? costRange : billingInterval + "," + costRange;
|
|
|
+ billingInterval = StringUtils.isEmpty(billingInterval) ? interval : billingInterval + "," + interval;
|
|
|
|
|
|
- storageFeesDto.setStartTime(DateUtils.dateAdd(storageFeesDto.getStartTime(), dayLength.intValue()));
|
|
|
+ // 下一个区间的开始时间调整
|
|
|
+ storageFeesDto.setStartTime(DateUtils.dateAdd(storageFeesDto.getStartTime(), tempDays.intValue()));
|
|
|
} else {
|
|
|
- // 最后一次计算天数
|
|
|
- feeId = tWarehouseAgreementitems.getfFeeid();
|
|
|
- BigDecimal calculate = this.getCalculate(qty, tWarehouseAgreementitems.getfPrice(), storageFeesDto.getDays());
|
|
|
+ BigDecimal calculate = this.getCalculate(qty, tWarehouseAgreementitems.getfPrice(), days);
|
|
|
money = money.add(calculate);
|
|
|
// 计算费用明细
|
|
|
String details = assemblyBillingDetails(StorageFeeRangeDTO.builder()
|
|
|
- .dayNum(storageFeesDto.getDays()).price(tWarehouseAgreementitems.getfPrice()).qty(qty).amt(calculate)
|
|
|
+ .dayNum(days).price(tWarehouseAgreementitems.getfPrice()).qty(qty).amt(calculate)
|
|
|
.build());
|
|
|
remark = StringUtils.isEmpty(remark) ? details : remark + "," + details;
|
|
|
- // 计算区间费用信息
|
|
|
+ // 计算区间的费用信息
|
|
|
String interval = assemblyBillingInterval(StorageFeeRangeDTO.builder()
|
|
|
- .startTime(storageFeesDto.getStartTime()).dayNum(storageFeesDto.getDays())
|
|
|
+ .startTime(storageFeesDto.getStartTime()).dayNum(days)
|
|
|
.price(tWarehouseAgreementitems.getfPrice())
|
|
|
.qty(qty).unit(agreementitems.getfFeeunitid())
|
|
|
.build());
|
|
@@ -668,10 +672,8 @@ public class TWarehouseAgreementServiceImpl implements ITWarehouseAgreementServi
|
|
|
* @return
|
|
|
*/
|
|
|
public BigDecimal getCalculate(BigDecimal itemNumsBig, BigDecimal unitPrice, Long dateLength) {
|
|
|
- BigDecimal money;
|
|
|
BigDecimal bigDaysBig = new BigDecimal(dateLength);
|
|
|
- money = itemNumsBig.multiply(unitPrice).multiply(bigDaysBig);
|
|
|
- return money;
|
|
|
+ return itemNumsBig.multiply(unitPrice).multiply(bigDaysBig);
|
|
|
}
|
|
|
|
|
|
/**
|