From 07034b763fcd9ffcfdea59b2864aeefc15ef2cdd Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期四, 06 三月 2025 18:07:21 +0800
Subject: [PATCH] 权限

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java |  141 ++++++++++++++++++-----------------------------
 1 files changed, 54 insertions(+), 87 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
index 3240660..73a6b1f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
@@ -379,7 +379,6 @@
                                         beforeBill.getEndTime().plusMonths(1).withDayOfMonth(15).toLocalDate() : contract.getPayType().equals("2") ?
                                         beforeBill.getEndTime().plusMonths(3).withDayOfMonth(15).toLocalDate() : beforeBill.getEndTime().withDayOfMonth(15).plusMonths(12).toLocalDate()));
                             }
-                            // 根据支付方式判断需不需要生成订单
                             tBill.setContractId(contract.getId());
                             if (contract.getIsIncreasing()) {
                                 if (tContractRentType != null) {
@@ -427,7 +426,7 @@
                                             // 不需要涨租金的时间段
                                             long originalDays = ChronoUnit.DAYS.between(beforeBill.getEndTime(), tContractRentType.getChangeTime());
                                             if (originalDays > 0) {
-                                                originalMoney = originalMoney.add(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN))
+                                                originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN))
                                                         .multiply(new BigDecimal(originalDays));
                                             }
                                             tBill.setPayableFeesMoney(contractRentTypeMoney.add(originalMoney));
@@ -483,16 +482,16 @@
                                             }
                                             tBill.setPayableFeesMoney(contractRentTypeMoney.add(originalMoney));
                                             tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
+                                            contractService.updateById(contract);
+
                                         }
                                     }
                                 } else {
-
-                                    tBill.setPayableFeesMoney(contract.getMonthRent().multiply(new BigDecimal(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12)));
+                                    tBill.setPayableFeesMoney(contract.getChangeRent().multiply(new BigDecimal(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12)));
                                     tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
 
                                 }
                                 tBill.setContractNumber(contract.getContractNumber());
-
                                 tBill.setPayFeesStatus("1");
                                 tBill.setBillType("1");
                                 tBill.setStartTime(beforeBill.getEndTime().plusDays(1));
@@ -518,66 +517,16 @@
                     tBill.setStartTime(beforeBill.getEndTime().plusDays(1));
                     tBill.setEndTime(contract.getEndTime());
                     if (contract.getIsIncreasing()) {
-                        if (tContractRentType != null
-                                && beforeBill.getEndTime().isBefore(tContractRentType.getChangeTime())
-                                && beforeBill.getEndTime().plusMonths(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12).with(TemporalAdjusters.lastDayOfMonth()).isAfter(tContractRentType.getChangeTime())) {
-                            // 如果没变过
-                            if (contract.getChangeTime() == null) {
-                                contract.setChangeTime(LocalDateTime.now());
-                                // 租金递增递减的时长 天
-                                long moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), contract.getEndTime());
-                                // 递增递减的租金
-                                BigDecimal contractRentTypeMoney = new BigDecimal("0");
-                                // 不递增递减的租金
-                                BigDecimal originalMoney = new BigDecimal("0");
-                                // 原租金
-                                switch (tContractRentType.getIncreasingDecreasingType()) {
-                                    case 1:
-                                        switch (tContractRentType.getIncreasingDecreasing()) {
-                                            case 1:
-                                                contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().multiply(new BigDecimal(100).add(tContractRentType.getNumericalValue())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays)));
-                                                contract.setChangeRent(contractRentTypeMoney);
-                                                break;
-                                            case 2:
-                                                contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().multiply((new BigDecimal(100).subtract(tContractRentType.getNumericalValue()))).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays)).divide(new BigDecimal(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12), 2, BigDecimal.ROUND_DOWN));
-                                                contract.setChangeRent(contractRentTypeMoney);
-                                                break;
-                                        }
-                                        break;
-                                    case 2:
-                                        switch (tContractRentType.getIncreasingDecreasing()) {
-                                            case 1:
-                                                contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().add(tContractRentType.getNumericalValue())).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays));
-                                                contract.setChangeRent(contractRentTypeMoney);
-                                                break;
-                                            case 2:
-                                                contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().subtract(tContractRentType.getNumericalValue())).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays));
-                                                contract.setChangeRent(contractRentTypeMoney);
-
-                                                break;
-                                        }
-                                        break;
-                                }
-                                // 不需要涨租金的时间段
-                                long originalDays = ChronoUnit.DAYS.between(beforeBill.getEndTime(), tContractRentType.getChangeTime());
-
-                                // 不需要涨租金的时间段
-                                if (contract.getFirstPayTime().isBefore(tContractRentType.getChangeTime())) {
-                                    originalMoney = originalMoney.add(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN))
-                                            .multiply(new BigDecimal(originalDays));
-                                    tBill.setPayableFeesMoney(contractRentTypeMoney.add(originalMoney));
-                                    tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
-                                } else {
-                                    tBill.setPayableFeesMoney(contractRentTypeMoney);
-                                    tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
-                                }
-
-                            } else {
+                        if (tContractRentType != null) {
+                            // 如果变过 并且时间在递增递减时间段内
+                            if (contract.getChangeTime() != null) {
+                                // 下次递增递减时间
+                                LocalDateTime changeTime = contract.getChangeTime().plusYears(tContractRentType.getCycleTime());
                                 // 之前已经涨、跌过租金了 需要判断周期是否还需要再涨、跌
-                                if ((LocalDateTime.now().getYear() - contract.getChangeTime().getYear()) % tContractRentType.getCycleTime() == 0) {
-                                    contract.setChangeTime(LocalDateTime.now());
+                                if (changeTime.isBefore(tBill.getEndTime()) && changeTime.isAfter(tBill.getStartTime())) {
+                                    contract.setChangeTime(changeTime);
                                     // 租金递增递减的时长 天
-                                    long moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), contract.getEndTime());
+                                    long moneyDays = Math.abs(ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), beforeBill.getEndTime()));
                                     // 递增递减的租金
                                     BigDecimal contractRentTypeMoney = new BigDecimal("0");
                                     // 不递增递减的租金
@@ -588,11 +537,12 @@
                                             switch (tContractRentType.getIncreasingDecreasing()) {
                                                 case 1:
                                                     contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().multiply(new BigDecimal(100).add(tContractRentType.getNumericalValue())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays)));
-                                                    contract.setChangeRent(contractRentTypeMoney);
+                                                    // 变动后的每月租金
+                                                    contract.setChangeRent(contract.getChangeRent().multiply(new BigDecimal(100).add(tContractRentType.getNumericalValue())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN));
                                                     break;
                                                 case 2:
-                                                    contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().multiply((new BigDecimal(100).subtract(tContractRentType.getNumericalValue()))).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays)).divide(new BigDecimal(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12), 2, BigDecimal.ROUND_DOWN));
-                                                    contract.setChangeRent(contractRentTypeMoney);
+                                                    contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().multiply((new BigDecimal(100).subtract(tContractRentType.getNumericalValue()))).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays)));
+                                                    contract.setChangeRent(contract.getChangeRent().multiply((new BigDecimal(100).subtract(tContractRentType.getNumericalValue()))).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN));
                                                     break;
                                             }
                                             break;
@@ -600,27 +550,34 @@
                                             switch (tContractRentType.getIncreasingDecreasing()) {
                                                 case 1:
                                                     contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().add(tContractRentType.getNumericalValue())).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays));
-                                                    contract.setChangeRent(contractRentTypeMoney);
+                                                    contract.setChangeRent(contract.getChangeRent().add(tContractRentType.getNumericalValue()));
                                                     break;
                                                 case 2:
                                                     contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().subtract(tContractRentType.getNumericalValue())).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays));
-                                                    contract.setChangeRent(contractRentTypeMoney);
-
+                                                    contract.setChangeRent(contract.getChangeRent().subtract(tContractRentType.getNumericalValue()));
                                                     break;
                                             }
                                             break;
                                     }
                                     // 不需要涨租金的时间段
                                     long originalDays = ChronoUnit.DAYS.between(beforeBill.getEndTime(), tContractRentType.getChangeTime());
-                                    originalMoney = originalMoney.add(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN))
-                                            .multiply(new BigDecimal(originalDays));
+                                    if (originalDays > 0) {
+                                        originalMoney = originalMoney.add(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN))
+                                                .multiply(new BigDecimal(originalDays));
+                                    }
                                     tBill.setPayableFeesMoney(contractRentTypeMoney.add(originalMoney));
                                     tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
-
+                                    contractService.updateById(contract);
                                 } else {
                                     // 不涨租金 用上次的
+                                    tBill.setPayableFeesMoney(contract.getChangeRent().multiply(new BigDecimal(contract.getPayType().equals("1")?1:contract.getPayType().equals("2")?3:12)));
+                                    tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
+                                }
+                            }else{
+                                if (tContractRentType.getChangeTime().isBefore(tBill.getEndTime()) && tContractRentType.getChangeTime().isAfter(tBill.getStartTime())) {
+                                    contract.setChangeTime(tContractRentType.getChangeTime());
                                     // 租金递增递减的时长 天
-                                    long moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), contract.getEndTime());
+                                    long moneyDays = Math.abs(ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), beforeBill.getEndTime()));
                                     // 递增递减的租金
                                     BigDecimal contractRentTypeMoney = new BigDecimal("0");
                                     // 不递增递减的租金
@@ -631,11 +588,12 @@
                                             switch (tContractRentType.getIncreasingDecreasing()) {
                                                 case 1:
                                                     contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().multiply(new BigDecimal(100).add(tContractRentType.getNumericalValue())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays)));
-                                                    contract.setChangeRent(contractRentTypeMoney);
+                                                    // 变动后的每月租金
+                                                    contract.setChangeRent(contract.getChangeRent().multiply(new BigDecimal(100).add(tContractRentType.getNumericalValue())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN));
                                                     break;
                                                 case 2:
-                                                    contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().multiply((new BigDecimal(100).subtract(tContractRentType.getNumericalValue()))).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays)).divide(new BigDecimal(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12), 2, BigDecimal.ROUND_DOWN));
-                                                    contract.setChangeRent(contractRentTypeMoney);
+                                                    contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().multiply((new BigDecimal(100).subtract(tContractRentType.getNumericalValue()))).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays)));
+                                                    contract.setChangeRent(contract.getChangeRent().multiply((new BigDecimal(100).subtract(tContractRentType.getNumericalValue()))).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN));
                                                     break;
                                             }
                                             break;
@@ -643,32 +601,41 @@
                                             switch (tContractRentType.getIncreasingDecreasing()) {
                                                 case 1:
                                                     contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().add(tContractRentType.getNumericalValue())).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays));
-                                                    contract.setChangeRent(contractRentTypeMoney);
+                                                    contract.setChangeRent(contract.getChangeRent().add(tContractRentType.getNumericalValue()));
                                                     break;
                                                 case 2:
                                                     contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().subtract(tContractRentType.getNumericalValue())).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays));
-                                                    contract.setChangeRent(contractRentTypeMoney);
-
+                                                    contract.setChangeRent(contract.getChangeRent().subtract(tContractRentType.getNumericalValue()));
                                                     break;
                                             }
                                             break;
                                     }
                                     // 不需要涨租金的时间段
                                     long originalDays = ChronoUnit.DAYS.between(beforeBill.getEndTime(), tContractRentType.getChangeTime());
-                                    originalMoney = originalMoney.add(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN))
-                                            .multiply(new BigDecimal(originalDays));
+                                    if (originalDays > 0) {
+                                        originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN))
+                                                .multiply(new BigDecimal(originalDays));
+                                    }
                                     tBill.setPayableFeesMoney(contractRentTypeMoney.add(originalMoney));
                                     tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
+                                    contractService.updateById(contract);
 
                                 }
                             }
+                        } else {
+                            if (tBill.getStartTime().getDayOfMonth()==1 && tBill.getEndTime().toLocalDate().equals(tBill.getEndTime().with(TemporalAdjusters.lastDayOfMonth()).toLocalDate())){
+                                tBill.setPayableFeesMoney(contract.getChangeRent().multiply(new BigDecimal(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12)));
+                                tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
+                            }else{
+                                // 最后一笔账单时间
+                                long finalDays = ChronoUnit.DAYS.between(beforeBill.getEndTime(), contract.getEndTime());
+                                tBill.setPayableFeesMoney(contract.getChangeRent().divide(new BigDecimal("30"),2,BigDecimal.ROUND_DOWN).multiply(new BigDecimal(finalDays)));
+                                tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
+                            }
+
 
                         }
-                    } else {
-                        long allDays = ChronoUnit.DAYS.between(beforeBill.getEndTime(), contract.getEndTime());
-                        tBill.setPayableFeesMoney(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(allDays)));
-                        tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
-                    }
+                        }
                     tBill.setContractNumber(contract.getContractNumber());
                     if (beforeBill.getEndTime().plusMonths(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12).getDayOfMonth() <= 15) {
                         tBill.setPayableFeesTime(contract.getEndTime().withHour(0).withMinute(0).withSecond(0).toLocalDate());
@@ -705,7 +672,7 @@
                 checkAcceptRecordMapper.insert(tCheckAcceptRecord);
                 // 将所有未缴费账单设置未已失效
                 List<TBill> tBills = billService.list(new LambdaQueryWrapper<TBill>()
-                        .in(TBill::getPayFeesStatus, Arrays.asList("1,2,4"))
+                        .ne(TBill::getPayFeesStatus, 3)
                         .eq(TBill::getContractId, contract.getId()));
                 for (TBill tBill : tBills) {
                     tBill.setPayFeesStatus("5");

--
Gitblit v1.7.1