From 9b4ff25563c913a72be7ffc426009b5ccf7248f6 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期四, 13 二月 2025 10:58:58 +0800
Subject: [PATCH] 生成合同导出

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java |  120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 113 insertions(+), 7 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java
index cbe4cc0..7c46415 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java
@@ -17,16 +17,20 @@
 import com.ruoyi.system.query.TContractBillQuery;
 import com.ruoyi.system.query.TContractQuery;
 import com.ruoyi.system.service.TBillService;
+import com.ruoyi.system.service.TContractRentTypeService;
 import com.ruoyi.system.service.TContractService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.system.vo.BillVO;
 import com.ruoyi.system.vo.CheckAcceptRecordVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -126,7 +130,8 @@
         checkAcceptRecordVO.setHouse(tHouse);
         return checkAcceptRecordVO;
     }
-
+    @Autowired
+    private TContractRentTypeService contractRentTypeService;
     @Override
     public R signContract(SignContractDTO dto) {
         TContract contract = contractMapper.selectById(dto.getId());
@@ -135,13 +140,114 @@
         contract.setSignature(dto.getSignature());
         contract.setStatus("2");
         contractMapper.updateById(contract);
+        contract.setFirstPayTime(contract.getStartTime().plusDays(10));
+        List<TBill> bills = new ArrayList<>();
+        List<TContractRentType> contractRentTypes = contractRentTypeService.list();
+        // 第一次应缴费日期
+        LocalDateTime firstPayTime = contract.getStartTime().plusDays(10).withHour(0).withMinute(0).withSecond(0);
+        LocalDate localDate = contract.getStartTime().plusDays(10).toLocalDate();
+        LocalDate now = LocalDate.now();
+
+        TBill rentBill = new TBill();
+        rentBill.setContractId(contract.getId());
+        rentBill.setContractNumber(contract.getContractNumber());
+        LocalDateTime startPayTime = contract.getStartPayTime();
+        LocalDateTime endTime1 = contract.getEndTime();
+//                // 计算两个时间相差多少天
+//                // 如果时间小于30天 需要计算每日租金
+//                if (days<30){
+//                    rentBill.setPayableFeesMoney(contract.getMonthRent().divide(new BigDecimal("30"),2,BigDecimal.ROUND_DOWN).multiply(new BigDecimal(days)));
+//                }else{
+//                    rentBill.setPayableFeesMoney(contract.getPayType().equals("1")?contract.getMonthRent():
+//                            contract.getPayType().equals("2")?contract.getMonthRent().multiply(new BigDecimal("3")):contract.getMonthRent().multiply(new BigDecimal("12")).setScale(2,BigDecimal.ROUND_DOWN));
+//                }
+        rentBill.setPayableFeesTime(firstPayTime);
+        rentBill.setPayFeesStatus("1");
+        rentBill.setBillType("1");
+        rentBill.setStartTime(contract.getStartPayTime());
+        TContractRentType tContractRentType = contractRentTypes.stream().filter(e -> e.getContractId().equals(contract.getId())).findFirst().orElse(null);
+
+        if (tContractRentType!=null && contract.getStartPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12).isAfter(tContractRentType.getChangeTime())){
+            // 计算租金变动的天数
+            long moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), contract.getStartPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12))+1L;
+            contract.setChangeTime(LocalDateTime.now());
+            // 递增递减的租金
+            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.add(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)));
+                            contract.setChangeRent(contractRentTypeMoney.add(contract.getChangeRent().multiply(new BigDecimal(100).subtract(tContractRentType.getNumericalValue()).divide(new BigDecimal(100),2,BigDecimal.ROUND_DOWN))));
+                            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.add(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.add(contract.getChangeRent().subtract(tContractRentType.getNumericalValue())));
+
+                            break;
+                    }
+                    break;
+            }
+            // 不需要涨租金的时间段
+            long originalDays = ChronoUnit.DAYS.between(contract.getFirstPayTime(), tContractRentType.getChangeTime());
+            originalMoney=originalMoney.add(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN))
+                    .multiply(new BigDecimal(originalDays));
+            rentBill.setPayableFeesMoney(contractRentTypeMoney.add(originalMoney));
+            rentBill.setOutstandingMoney(rentBill.getPayableFeesMoney());
+            if (contract.getFirstPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12).isAfter(contract.getEndTime())){
+                rentBill.setEndTime(contract.getFirstPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12));
+            }else{
+                rentBill.setEndTime(contract.getEndTime());
+            }
+        }else{
+            if (contract.getFirstPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12).isAfter(contract.getEndTime())){
+                rentBill.setEndTime(contract.getFirstPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12));
+            }else{
+                rentBill.setEndTime(contract.getEndTime());
+            }
+            // 不走递增递减
+            long allDays = ChronoUnit.DAYS.between(contract.getFirstPayTime(), rentBill.getEndTime());
+            rentBill.setPayableFeesMoney(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(allDays)));
+            rentBill.setOutstandingMoney(rentBill.getPayableFeesMoney());
+
+        }
+        // 租金账单
+        bills.add(rentBill);
+        // 押金账单
+        TBill depositBill = new TBill();
+        depositBill.setContractId(contract.getId());
+        depositBill.setContractNumber(contract.getContractNumber());
+        depositBill.setPayableFeesMoney(contract.getDeposit());
+        depositBill.setOutstandingMoney(depositBill.getPayableFeesMoney());
+
+        depositBill.setPayableFeesTime(firstPayTime);
+        depositBill.setPayFeesStatus("1");
+        depositBill.setBillType("2");
+        bills.add(depositBill);
+        this.updateById(contract);
+        billService.saveBatch(bills);
         // 用户签订合同后 生成第一批账单包含租金账单和押金账单 后续账单通过定时任务生成
-        TBill rent = new TBill();
-        rent.setContractId(contract.getId());
-        // 应缴费租金
-        BigDecimal payableFeesMoney = new BigDecimal("0");
-        LocalDateTime startTime = contract.getStartTime();
-        LocalDateTime endTime = contract.getEndTime();
+//        TBill rent = new TBill();
+//        rent.setContractId(contract.getId());
+//        // 应缴费租金
+//        BigDecimal payableFeesMoney = new BigDecimal("0");
+//        LocalDateTime startTime = contract.getStartTime();
+//        LocalDateTime endTime = contract.getEndTime();
 //        // 计算相差多少天
 //        long days = ChronoUnit.DAYS.between(startTime, endTime);
 //        // 计算相差多少个月

--
Gitblit v1.7.1