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