Parcourir la source

分账逻辑优化

liuj il y a 5 mois
Parent
commit
b5bfefcd81

+ 48 - 56
src/main/java/com/sunxung/factoring/service/ledger/impl/LedgerManagementServiceImpl.java

@@ -1196,47 +1196,40 @@ public class LedgerManagementServiceImpl implements LedgerManagementService {
                                 //说明管理费分多了,需要将多的退掉
                                 unAssignManagement = refundManagement.negate();
                                 //删除未分配的管理费
-                                deleteUnAssignList(managementFeeFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo);
+                                deleteUnAssignList(managementFeeFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo, null);
                                 //将部分分配的管理费计划金额改为实收金额
                                 updatePartAssignList(managementFeeFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo);
                             } else if (refundManagement.compareTo(BigDecimal.ZERO) == 0) {
                                 //说明管理费正好,只需要处理未完成的计划
                                 //删除未分配的管理费
-                                deleteUnAssignList(managementFeeFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo);
+                                deleteUnAssignList(managementFeeFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo, null);
                                 //将部分分配的管理费计划金额改为实收金额
                                 updatePartAssignList(managementFeeFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo);
                             } else if (refundManagement.compareTo(BigDecimal.ZERO) < 0) {
                                 //说明管理费还需要补
                                 BigDecimal toAssignManagement = refundManagement.negate();
                                 if (assignAmount.compareTo(BigDecimal.ZERO) > 0) {
-                                    if (assignAmount.compareTo(toAssignManagement) >= 0) {
-                                        //说明本次分的钱可以把管理费分完,增加一条管理费分配记录
-                                        if (goodsAssignVo.getHasAssignInterest()) {
-                                            //如果本次选择分管理费
+                                    //判断是否需要分配
+                                    if (goodsAssignVo.getHasAssignInterest()) {
+                                        if (assignAmount.compareTo(toAssignManagement) >= 0) {
                                             ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, toAssignManagement, toAssignManagement,
                                                     IncomeExpenditureTypeDict.ChildEnum.MANAGEMENT_FEE.getCode(), goodsAssignVo, 0));
                                             financingManagementFee = financingManagementFee.add(toAssignManagement);
                                             assignAmount = assignAmount.subtract(toAssignManagement);
-                                        } else {
-                                            //如果本次选择不分管理费
-                                            ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, toAssignManagement, BigDecimal.ZERO,
-                                                    IncomeExpenditureTypeDict.ChildEnum.MANAGEMENT_FEE.getCode(), goodsAssignVo, 0));
-                                        }
-                                    } else if (assignAmount.compareTo(toAssignManagement) < 0) {
-                                        //说明本次分的钱把管理费分不完,增加一条管理费分配记录
-                                        if (goodsAssignVo.getHasAssignInterest()) {
-                                            //如果本次选择分管理费
+                                        } else if (assignAmount.compareTo(toAssignManagement) < 0) {
                                             ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, assignAmount, assignAmount,
                                                     IncomeExpenditureTypeDict.ChildEnum.MANAGEMENT_FEE.getCode(), goodsAssignVo, 0));
                                             financingManagementFee = financingManagementFee.add(assignAmount);
+                                            //剩余未分配管理费
+                                            unAssignManagement = toAssignManagement.subtract(assignAmount);
                                             assignAmount = BigDecimal.ZERO;
-                                        } else {
-                                            //如果本次选择不分管理费
-                                            ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, assignAmount, BigDecimal.ZERO,
-                                                    IncomeExpenditureTypeDict.ChildEnum.MANAGEMENT_FEE.getCode(), goodsAssignVo, 0));
                                         }
-                                        //剩余未分配管理费
-                                        unAssignManagement = toAssignManagement.subtract(assignAmount);
+                                    } else {
+                                        //这种场景可能存在未分配的管理费,要删除分账日期之前的状态为计划中的数据
+                                        deleteUnAssignList(managementFeeFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo, ledgerDate);
+                                        //如果本次选择不分管理费
+                                        ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, toAssignManagement, BigDecimal.ZERO,
+                                                IncomeExpenditureTypeDict.ChildEnum.MANAGEMENT_FEE.getCode(), goodsAssignVo, 0));
                                     }
                                 }
                             }
@@ -1249,46 +1242,41 @@ public class LedgerManagementServiceImpl implements LedgerManagementService {
                                 //说明利息分多了,需要将多的退掉
                                 unAssignInterest = refundInterest.negate();
                                 //删除未分配的利息
-                                deleteUnAssignList(interestFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo);
+                                deleteUnAssignList(interestFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo, null);
                                 //将部分分配的利息计划金额改为实收金额
                                 updatePartAssignList(interestFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo);
                             } else if (refundInterest.compareTo(BigDecimal.ZERO) == 0) {
                                 //删除未分配的利息
-                                deleteUnAssignList(interestFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo);
+                                deleteUnAssignList(interestFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo, null);
                                 //将部分分配的利息计划金额改为实收金额
                                 updatePartAssignList(interestFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo);
                             } else if (refundInterest.compareTo(BigDecimal.ZERO) < 0) {
                                 //说明利息还需要补
                                 BigDecimal toAssignInterest = refundInterest.negate();
                                 if (assignAmount.compareTo(BigDecimal.ZERO) > 0) {
-                                    if (assignAmount.compareTo(toAssignInterest) >= 0) {
-                                        //说明本次分的钱可以把管理费分完,增加一条利息分配记录(应分=实分)
-                                        if (goodsAssignVo.getHasAssignInterest()) {
+                                    //判断是否需要分配
+                                    if (goodsAssignVo.getHasAssignInterest()) {
+                                        //如果需要分配利息
+                                        if (assignAmount.compareTo(toAssignInterest) >= 0) {
                                             ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, toAssignInterest, toAssignInterest,
                                                     IncomeExpenditureTypeDict.ChildEnum.INTEREST.getCode(), goodsAssignVo, 0));
                                             financeInterest = financeInterest.add(toAssignInterest);
                                             assignAmount = assignAmount.subtract(toAssignInterest);
-                                        } else {
-                                            ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, toAssignInterest, BigDecimal.ZERO,
-                                                    IncomeExpenditureTypeDict.ChildEnum.INTEREST.getCode(), goodsAssignVo, 0));
-                                        }
-                                    } else if (assignAmount.compareTo(toAssignInterest) < 0) {
-                                        //说明本次分的钱把管理费分不完,增加一条利息分配记录(应分>实分)
-                                        if (goodsAssignVo.getHasAssignInterest()) {
-                                            //如果本次选择分利息
+                                        } else if (assignAmount.compareTo(toAssignInterest) < 0) {
                                             ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, assignAmount, assignAmount,
                                                     IncomeExpenditureTypeDict.ChildEnum.INTEREST.getCode(), goodsAssignVo, 0));
                                             financeInterest = financeInterest.add(assignAmount);
+                                            //剩余未分配利息
+                                            unAssignInterest = toAssignInterest.subtract(assignAmount);
                                             assignAmount = BigDecimal.ZERO;
-                                        } else {
-                                            //如果选择不分利息
-                                            ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, assignAmount, BigDecimal.ZERO,
-                                                    IncomeExpenditureTypeDict.ChildEnum.INTEREST.getCode(), goodsAssignVo, 0));
                                         }
-                                        //剩余未分配利息
-                                        unAssignInterest = toAssignInterest.subtract(assignAmount);
+                                    } else {
+                                        //这种场景可能存在未分配的管理费,要删除分账日期之前的状态为计划中的数据
+                                        deleteUnAssignList(interestFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo, ledgerDate);
+                                        //如果不分配利息
+                                        ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, toAssignInterest, BigDecimal.ZERO,
+                                                IncomeExpenditureTypeDict.ChildEnum.INTEREST.getCode(), goodsAssignVo, 0));
                                     }
-
                                 }
                             }
                             if (assignAmount.compareTo(BigDecimal.ZERO) > 0) {
@@ -1350,14 +1338,14 @@ public class LedgerManagementServiceImpl implements LedgerManagementService {
                             }
                             if (returnedAmount.compareTo(BigDecimal.ZERO) == 0) {
                                 //说明此分配本金已经分完了
-                                if (unAssignInterest.compareTo(BigDecimal.ZERO) != 0) {
+                                if (unAssignInterest.compareTo(BigDecimal.ZERO) < 0) {
                                     //将之前未分配的利息分完
-                                    ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, unAssignInterest, unAssignInterest,
+                                    ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, unAssignInterest, BigDecimal.ZERO,
                                             IncomeExpenditureTypeDict.ChildEnum.INTEREST.getCode(), goodsAssignVo, 0));
                                 }
-                                if (unAssignManagement.compareTo(BigDecimal.ZERO) != 0) {
+                                if (unAssignManagement.compareTo(BigDecimal.ZERO) < 0) {
                                     //将之前未分配的管理费分完
-                                    ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, unAssignManagement, unAssignManagement,
+                                    ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, unAssignManagement, BigDecimal.ZERO,
                                             IncomeExpenditureTypeDict.ChildEnum.MANAGEMENT_FEE.getCode(), goodsAssignVo, 0));
                                 }
                             } else if (returnedAmount.compareTo(BigDecimal.ZERO) > 0) {
@@ -1384,9 +1372,7 @@ public class LedgerManagementServiceImpl implements LedgerManagementService {
                                 if (surplusInterest.compareTo(BigDecimal.ZERO) != 0) {
                                     PaymentCollectionPlanFactoring lastInterestFactoring = getLastPrincipalFactoring(allPlanFactoringList, interestDict, lastPlanDate);
                                     if (lastInterestFactoring == null) {
-                                        //这种场景可能存在未分配的利息,要删除
-                                        deleteUnAssignList(interestFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo);
-                                        ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, surplusInterest, BigDecimal.ZERO,
+                                        ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(lastPlanDate, surplusInterest, BigDecimal.ZERO,
                                                 IncomeExpenditureTypeDict.ChildEnum.INTEREST.getCode(), goodsAssignVo, 0));
                                     } else {
                                         lastInterestFactoring.setAmount(surplusInterest);
@@ -1411,9 +1397,7 @@ public class LedgerManagementServiceImpl implements LedgerManagementService {
                                 if (surplusManagement.compareTo(BigDecimal.ZERO) != 0) {
                                     PaymentCollectionPlanFactoring lastManagementFactoring = getLastPrincipalFactoring(allPlanFactoringList, managementFeeDict, lastPlanDate);
                                     if (lastManagementFactoring == null) {
-                                        //这种场景可能存在未分配的管理费,要删除
-                                        deleteUnAssignList(managementFeeFactoringList, ledgerPlanFactoringAssignList, goodsAssignVo);
-                                        ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(ledgerDate, surplusManagement, BigDecimal.ZERO,
+                                        ledgerPlanFactoringAssignList.add(addPlanFactoringInsertAssign(lastPlanDate, surplusManagement, BigDecimal.ZERO,
                                                 IncomeExpenditureTypeDict.ChildEnum.MANAGEMENT_FEE.getCode(), goodsAssignVo, 0));
                                     } else {
                                         lastManagementFactoring.setAmount(surplusManagement);
@@ -1955,12 +1939,20 @@ public class LedgerManagementServiceImpl implements LedgerManagementService {
      *
      * @param planFactoringList
      */
-    private void deleteUnAssignList(List<PaymentCollectionPlanFactoring> planFactoringList,
-                                    List<LedgerPlanFactoringAssign> ledgerPlanFactoringAssignList, LedgerFundGoodsAssign goodsAssign) {
+    private void deleteUnAssignList(List<PaymentCollectionPlanFactoring> planFactoringList, List<LedgerPlanFactoringAssign> ledgerPlanFactoringAssignList,
+                                    LedgerFundGoodsAssign goodsAssign, Date ledgerDate) {
         if (CollectionUtil.isNotEmpty(planFactoringList)) {
-            //退款的数据虽然没有实际收付但也不能删除
-            planFactoringList.stream().filter(p -> CollectionUtil.isEmpty(p.getAmountAllocationList()) && p.getAmount().compareTo(BigDecimal.ZERO) > 0)
-                    .forEach(p -> ledgerPlanFactoringAssignList.add(addPlanFactoringDeleteAssign(p, goodsAssign, 0)));
+            if (ledgerDate == null) {
+                //退款的数据虽然没有实际收付但也不能删除
+                planFactoringList.stream().filter(p -> CollectionUtil.isEmpty(p.getAmountAllocationList()) && p.getAmount().compareTo(BigDecimal.ZERO) > 0)
+                        .forEach(p -> ledgerPlanFactoringAssignList.add(addPlanFactoringDeleteAssign(p, goodsAssign, 0)));
+            } else {
+                //退款的数据虽然没有实际收付但也不能删除
+                planFactoringList.stream().filter(p -> CollectionUtil.isEmpty(p.getAmountAllocationList())
+                                && p.getAmount().compareTo(BigDecimal.ZERO) > 0 && DateUtil.beginOfDay(p.getPlanDate()).compareTo(ledgerDate) <= 0)
+                        .forEach(p -> ledgerPlanFactoringAssignList.add(addPlanFactoringDeleteAssign(p, goodsAssign, 0)));
+            }
+
         }
     }