@@ -135,7 +135,15 @@ public void waitDispersedFeeDetail(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMont
135
135
136
136
for (FeeDetailDto feeDetailDto : feeDetailDtos ) {
137
137
// 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
+ }
139
147
}
140
148
}
141
149
@@ -165,10 +173,10 @@ public void waitDispersedOweFee(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOw
165
173
}
166
174
167
175
// 自然月周期性费用计算
168
- waitDispersedOweFeeCycleNormalMonth (feeDto ,payFeeMonthOwnerDto ,feePrice ,deadlineTime );
176
+ waitDispersedOweFeeCycleNormalMonth (feeDto , payFeeMonthOwnerDto , feePrice , deadlineTime );
169
177
170
178
// 一次性或者非自然月处理
171
- waitDispersedOweFeeOnceUnNormalMonth (feeDto ,payFeeMonthOwnerDto ,feePrice ,deadlineTime ,oweMonth );
179
+ waitDispersedOweFeeOnceUnNormalMonth (feeDto , payFeeMonthOwnerDto , feePrice , deadlineTime , oweMonth );
172
180
173
181
}
174
182
@@ -186,7 +194,7 @@ private void waitDispersedOweFeeCycleNormalMonth(FeeDto feeDto, PayFeeMonthOwner
186
194
return ;
187
195
}
188
196
// 不是自然月 费用直接返回
189
- if (DateUtil .getDay (feeDto .getStartTime ()) !=1 ) {
197
+ if (DateUtil .getDay (feeDto .getStartTime ()) != 1 ) {
190
198
return ;
191
199
}
192
200
List <PayFeeDetailMonthPo > payFeeDetailMonthPos = new ArrayList <>();
@@ -257,15 +265,16 @@ private void waitDispersedOweFeeCycleNormalMonth(FeeDto feeDto, PayFeeMonthOwner
257
265
258
266
/**
259
267
* 一次性或者非自然月处理
268
+ *
260
269
* @param feeDto
261
270
* @param payFeeMonthOwnerDto
262
271
* @param deadlineTime
263
272
* @param oweMonth
264
273
*/
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 ) {
266
275
267
276
// 不是一次性费用 并且是 自然月就返回
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 ) {
269
278
return ;
270
279
}
271
280
List <PayFeeDetailMonthPo > payFeeDetailMonthPos = new ArrayList <>();
@@ -274,7 +283,7 @@ private void waitDispersedOweFeeOnceUnNormalMonth(FeeDto feeDto, PayFeeMonthOwne
274
283
Date endTime = DateUtil .deadTimeToDate (deadlineTime );
275
284
276
285
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 );
278
287
279
288
BigDecimal dayReceivableAmount = null ;
280
289
@@ -325,8 +334,27 @@ private void waitDispersedOweFeeOnceUnNormalMonth(FeeDto feeDto, PayFeeMonthOwne
325
334
payFeeDetailMonthInnerServiceSMOImpl .savePayFeeDetailMonths (payFeeDetailMonthPos );
326
335
}
327
336
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
329
349
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
+ }
330
358
List <PayFeeDetailMonthPo > payFeeDetailMonthPos = new ArrayList <>();
331
359
332
360
// todo 去除 开始时间和 结束时间的 小时 分钟 秒
@@ -344,8 +372,8 @@ private void doDispersedFeeDetail(FeeDetailDto feeDetailDto, FeeDto feeDto, PayF
344
372
BigDecimal receivableAmount = new BigDecimal (feePrice + "" );
345
373
BigDecimal receivedAmount = new BigDecimal (Double .parseDouble (feeDetailDto .getReceivedAmount ()));
346
374
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 ;
349
377
350
378
// todo 寻找第一个自然月 一日
351
379
Calendar firstMonthDayCal = Calendar .getInstance ();
@@ -366,11 +394,9 @@ private void doDispersedFeeDetail(FeeDetailDto feeDetailDto, FeeDto feeDto, PayF
366
394
Calendar calendar = Calendar .getInstance ();
367
395
calendar .setTime (startMonthDayTime );
368
396
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 );// 日 实收
374
400
// todo 计算 应收
375
401
curMonthReceivableAmount = new BigDecimal (curDay ).multiply (dayReceivableAmount ).setScale (4 , BigDecimal .ROUND_HALF_UP );
376
402
// todo 计算 实收
@@ -395,11 +421,90 @@ private void doDispersedFeeDetail(FeeDetailDto feeDetailDto, FeeDto feeDto, PayF
395
421
Calendar calendar = Calendar .getInstance ();
396
422
calendar .setTime (startMonthDayTime );
397
423
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 ;
402
465
}
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 );
403
508
// todo 计算 应收
404
509
curMonthReceivableAmount = new BigDecimal (curDay ).multiply (dayReceivableAmount ).setScale (4 , BigDecimal .ROUND_HALF_UP );
405
510
// todo 计算 实收
@@ -410,7 +515,6 @@ private void doDispersedFeeDetail(FeeDetailDto feeDetailDto, FeeDto feeDto, PayF
410
515
payFeeDetailMonthInnerServiceSMOImpl .savePayFeeDetailMonths (payFeeDetailMonthPos );
411
516
412
517
}
413
-
414
518
/**
415
519
* 保存数据
416
520
*
0 commit comments