Skip to content

Commit 2025841

Browse files
928255095gitee-org
authored andcommitted
优化非自然月实收按天计算bug
Signed-off-by: java110 <[email protected]>
1 parent 3425f13 commit 2025841

File tree

1 file changed

+124
-20
lines changed

1 file changed

+124
-20
lines changed

service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java

Lines changed: 124 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,15 @@ public void waitDispersedFeeDetail(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMont
135135

136136
for (FeeDetailDto feeDetailDto : feeDetailDtos) {
137137
// todo 逐条去离散
138-
doDispersedFeeDetail(feeDetailDto, feeDto, payFeeMonthOwnerDto, feePrice);
138+
try {
139+
// 自然月实收处理
140+
doDispersedFeeDetailNormalMonth(feeDetailDto, feeDto, payFeeMonthOwnerDto, feePrice);
141+
142+
//非自然月或者一次性费用处理已经交过费的
143+
doDispersedFeeDetailUnNormalMonth(feeDetailDto, feeDto, payFeeMonthOwnerDto, feePrice);
144+
}catch (Exception e){
145+
e.printStackTrace();
146+
}
139147
}
140148
}
141149

@@ -165,10 +173,10 @@ public void waitDispersedOweFee(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOw
165173
}
166174

167175
// 自然月周期性费用计算
168-
waitDispersedOweFeeCycleNormalMonth(feeDto,payFeeMonthOwnerDto,feePrice,deadlineTime);
176+
waitDispersedOweFeeCycleNormalMonth(feeDto, payFeeMonthOwnerDto, feePrice, deadlineTime);
169177

170178
// 一次性或者非自然月处理
171-
waitDispersedOweFeeOnceUnNormalMonth(feeDto,payFeeMonthOwnerDto,feePrice,deadlineTime,oweMonth);
179+
waitDispersedOweFeeOnceUnNormalMonth(feeDto, payFeeMonthOwnerDto, feePrice, deadlineTime, oweMonth);
172180

173181
}
174182

@@ -186,7 +194,7 @@ private void waitDispersedOweFeeCycleNormalMonth(FeeDto feeDto, PayFeeMonthOwner
186194
return;
187195
}
188196
// 不是自然月 费用直接返回
189-
if(DateUtil.getDay(feeDto.getStartTime()) !=1){
197+
if (DateUtil.getDay(feeDto.getStartTime()) != 1) {
190198
return;
191199
}
192200
List<PayFeeDetailMonthPo> payFeeDetailMonthPos = new ArrayList<>();
@@ -257,15 +265,16 @@ private void waitDispersedOweFeeCycleNormalMonth(FeeDto feeDto, PayFeeMonthOwner
257265

258266
/**
259267
* 一次性或者非自然月处理
268+
*
260269
* @param feeDto
261270
* @param payFeeMonthOwnerDto
262271
* @param deadlineTime
263272
* @param oweMonth
264273
*/
265-
private void waitDispersedOweFeeOnceUnNormalMonth(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto,double feePrice, Date deadlineTime, double oweMonth) {
274+
private void waitDispersedOweFeeOnceUnNormalMonth(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto, double feePrice, Date deadlineTime, double oweMonth) {
266275

267276
// 不是一次性费用 并且是 自然月就返回
268-
if(!FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag()) && DateUtil.getDay(feeDto.getStartTime()) == 1){
277+
if (!FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag()) && DateUtil.getDay(feeDto.getStartTime()) == 1) {
269278
return;
270279
}
271280
List<PayFeeDetailMonthPo> payFeeDetailMonthPos = new ArrayList<>();
@@ -274,7 +283,7 @@ private void waitDispersedOweFeeOnceUnNormalMonth(FeeDto feeDto, PayFeeMonthOwne
274283
Date endTime = DateUtil.deadTimeToDate(deadlineTime);
275284

276285

277-
BigDecimal receivableAmount = new BigDecimal(feePrice).multiply(new BigDecimal(oweMonth)).setScale(8,BigDecimal.ROUND_HALF_UP);
286+
BigDecimal receivableAmount = new BigDecimal(feePrice).multiply(new BigDecimal(oweMonth)).setScale(8, BigDecimal.ROUND_HALF_UP);
278287

279288
BigDecimal dayReceivableAmount = null;
280289

@@ -325,8 +334,27 @@ private void waitDispersedOweFeeOnceUnNormalMonth(FeeDto feeDto, PayFeeMonthOwne
325334
payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
326335
}
327336

328-
private void doDispersedFeeDetail(FeeDetailDto feeDetailDto, FeeDto feeDto, PayFeeMonthOwnerDto
337+
338+
339+
340+
/**
341+
* 自然月处理已经交过费的
342+
*
343+
* @param feeDetailDto
344+
* @param feeDto
345+
* @param payFeeMonthOwnerDto
346+
* @param feePrice
347+
*/
348+
private void doDispersedFeeDetailNormalMonth(FeeDetailDto feeDetailDto, FeeDto feeDto, PayFeeMonthOwnerDto
329349
payFeeMonthOwnerDto, Double feePrice) {
350+
// 一次性费用直接返回
351+
if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
352+
return;
353+
}
354+
// 不是自然月 费用直接返回
355+
if (DateUtil.getDay(feeDto.getStartTime()) != 1) {
356+
return;
357+
}
330358
List<PayFeeDetailMonthPo> payFeeDetailMonthPos = new ArrayList<>();
331359

332360
// todo 去除 开始时间和 结束时间的 小时 分钟 秒
@@ -344,8 +372,8 @@ private void doDispersedFeeDetail(FeeDetailDto feeDetailDto, FeeDto feeDto, PayF
344372
BigDecimal receivableAmount = new BigDecimal(feePrice + "");
345373
BigDecimal receivedAmount = new BigDecimal(Double.parseDouble(feeDetailDto.getReceivedAmount()));
346374

347-
BigDecimal dayReceivableAmount = receivableAmount.divide(new BigDecimal(day), 8, BigDecimal.ROUND_HALF_UP);// 日 应收
348-
BigDecimal dayReceivedAmount = receivedAmount.divide(new BigDecimal(day), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
375+
BigDecimal dayReceivableAmount = null;
376+
BigDecimal dayReceivedAmount = null;
349377

350378
// todo 寻找第一个自然月 一日
351379
Calendar firstMonthDayCal = Calendar.getInstance();
@@ -366,11 +394,9 @@ private void doDispersedFeeDetail(FeeDetailDto feeDetailDto, FeeDto feeDto, PayF
366394
Calendar calendar = Calendar.getInstance();
367395
calendar.setTime(startMonthDayTime);
368396
curMonthMaxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
369-
if (!FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
370-
dayReceivableAmount = receivableAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
371-
dayReceivedAmount = receivedAmount.divide(new BigDecimal(month + ""), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
372-
dayReceivedAmount = dayReceivedAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
373-
}
397+
dayReceivableAmount = receivableAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
398+
dayReceivedAmount = receivedAmount.divide(new BigDecimal(month + ""), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
399+
dayReceivedAmount = dayReceivedAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
374400
// todo 计算 应收
375401
curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
376402
// todo 计算 实收
@@ -395,11 +421,90 @@ private void doDispersedFeeDetail(FeeDetailDto feeDetailDto, FeeDto feeDto, PayF
395421
Calendar calendar = Calendar.getInstance();
396422
calendar.setTime(startMonthDayTime);
397423
curMonthMaxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
398-
if (!FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
399-
dayReceivableAmount = receivableAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
400-
dayReceivedAmount = receivedAmount.divide(new BigDecimal(month + ""), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
401-
dayReceivedAmount = dayReceivedAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
424+
dayReceivableAmount = receivableAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
425+
dayReceivedAmount = receivedAmount.divide(new BigDecimal(month + ""), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
426+
dayReceivedAmount = dayReceivedAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
427+
428+
// todo 计算 应收
429+
curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
430+
// todo 计算 实收
431+
curMonthReceivedAmount = new BigDecimal(curDay).multiply(dayReceivedAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
432+
433+
// todo 保存数据到pay_fee_detail_month
434+
toSavePayFeeDetailMonth(curMonthReceivableAmount.doubleValue(), curMonthReceivedAmount.doubleValue(), feeDetailDto, feeDto, payFeeMonthOwnerDto, payFeeDetailMonthPos, startMonthDayTime, endTime);
435+
payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
436+
}
437+
438+
439+
/**
440+
* 非自然月或者一次性费用处理已经交过费的
441+
*
442+
* @param feeDetailDto
443+
* @param feeDto
444+
* @param payFeeMonthOwnerDto
445+
* @param feePrice
446+
*/
447+
private void doDispersedFeeDetailUnNormalMonth(FeeDetailDto feeDetailDto, FeeDto feeDto, PayFeeMonthOwnerDto
448+
payFeeMonthOwnerDto, Double feePrice) {
449+
// 不是一次性费用 并且是 自然月就返回
450+
if (!FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag()) && DateUtil.getDay(feeDto.getStartTime()) == 1) {
451+
return;
452+
}
453+
454+
List<PayFeeDetailMonthPo> payFeeDetailMonthPos = new ArrayList<>();
455+
456+
// todo 去除 开始时间和 结束时间的 小时 分钟 秒
457+
Date startTime = DateUtil.timeToDate(feeDetailDto.getStartTime());
458+
Date endTime = feeDetailDto.getEndTime();
459+
endTime = DateUtil.getNextSecDateTime(endTime);
460+
endTime = DateUtil.timeToDate(endTime);
461+
462+
int day = DateUtil.daysBetween(endTime, startTime);
463+
if (day < 1) {
464+
day = 1;
402465
}
466+
467+
BigDecimal receivableAmount = new BigDecimal(feeDetailDto.getReceivableAmount());
468+
BigDecimal receivedAmount = new BigDecimal(feeDetailDto.getReceivedAmount());
469+
470+
BigDecimal dayReceivableAmount = receivableAmount.divide(new BigDecimal(day), 8, BigDecimal.ROUND_HALF_UP);// 日 应收
471+
BigDecimal dayReceivedAmount = receivedAmount.divide(new BigDecimal(day), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
472+
473+
// todo 寻找第一个自然月 一日
474+
Calendar firstMonthDayCal = Calendar.getInstance();
475+
firstMonthDayCal.setTime(startTime);
476+
firstMonthDayCal.add(Calendar.MONTH, 1);
477+
firstMonthDayCal.set(Calendar.DAY_OF_MONTH, 1);
478+
Date firstMonthDayTime = firstMonthDayCal.getTime();
479+
480+
Date startMonthDayTime = startTime;
481+
// todo 循环,只到 firstMonthDayTime 大于 endTime
482+
int curDay = 0;
483+
BigDecimal curMonthReceivableAmount = null;
484+
BigDecimal curMonthReceivedAmount = null;
485+
int curMonthMaxDay = 30;
486+
while (firstMonthDayTime.getTime() < endTime.getTime()) {
487+
curDay = DateUtil.daysBetween(firstMonthDayTime, startMonthDayTime);
488+
// todo 计算 应收
489+
curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
490+
// todo 计算 实收
491+
curMonthReceivedAmount = new BigDecimal(curDay).multiply(dayReceivedAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
492+
// todo 保存数据到pay_fee_detail_month
493+
toSavePayFeeDetailMonth(curMonthReceivableAmount.doubleValue(), curMonthReceivedAmount.doubleValue(), feeDetailDto, feeDto, payFeeMonthOwnerDto, payFeeDetailMonthPos, startMonthDayTime, endTime);
494+
495+
// todo 将startTime 修改为 下月1日时间
496+
startMonthDayTime = firstMonthDayTime;
497+
firstMonthDayCal.add(Calendar.MONTH, 1);
498+
firstMonthDayTime = firstMonthDayCal.getTime();
499+
}
500+
501+
//todo 最后处理 最后 startMonthDayTime 到endTime 的
502+
if (startMonthDayTime.getTime() >= endTime.getTime()) {
503+
payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
504+
return;
505+
}
506+
507+
curDay = DateUtil.daysBetween(endTime, startMonthDayTime);
403508
// todo 计算 应收
404509
curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
405510
// todo 计算 实收
@@ -410,7 +515,6 @@ private void doDispersedFeeDetail(FeeDetailDto feeDetailDto, FeeDto feeDto, PayF
410515
payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
411516

412517
}
413-
414518
/**
415519
* 保存数据
416520
*

0 commit comments

Comments
 (0)