|  |  |  | 
|---|
|  |  |  | package com.ruoyi.system.service.impl; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
|---|
|  |  |  | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | 
|---|
|  |  |  | import com.ruoyi.common.basic.PageInfo; | 
|---|
|  |  |  | import com.ruoyi.common.constant.DictConstants; | 
|---|
|  |  |  | import com.ruoyi.common.core.domain.R; | 
|---|
|  |  |  | 
|---|
|  |  |  | import java.time.LocalDate; | 
|---|
|  |  |  | import java.time.LocalDateTime; | 
|---|
|  |  |  | import java.time.temporal.ChronoUnit; | 
|---|
|  |  |  | import java.time.temporal.TemporalAdjusters; | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  | import java.util.Arrays; | 
|---|
|  |  |  | import java.util.List; | 
|---|
|  |  |  | 
|---|
|  |  |  | TCheckAcceptRecord tCheckAcceptRecord = new TCheckAcceptRecord(); | 
|---|
|  |  |  | tCheckAcceptRecord.setContractId(dto.getId()); | 
|---|
|  |  |  | tCheckAcceptRecord.setHouseId(contract.getHouseId()); | 
|---|
|  |  |  | tCheckAcceptRecord.setLeaseReason("后台终止"); | 
|---|
|  |  |  | tCheckAcceptRecord.setStatus("1"); | 
|---|
|  |  |  | tCheckAcceptRecord.setLeaseReason("后台终止合同"); | 
|---|
|  |  |  | tCheckAcceptRecord.setStatus(false); | 
|---|
|  |  |  | tCheckAcceptRecord.setAcceptanceTime(LocalDateTime.now()); | 
|---|
|  |  |  | LocalDate now = LocalDate.now(); | 
|---|
|  |  |  | String replace = (now + "").replace("-", ""); | 
|---|
|  |  |  | int size = checkAcceptRecordMapper.selectList(new LambdaQueryWrapper<TCheckAcceptRecord>() | 
|---|
|  |  |  | .likeRight(TCheckAcceptRecord::getAcceptanceTime, LocalDate.now())).size(); | 
|---|
|  |  |  | tCheckAcceptRecord.setCode(replace.substring(2)+String.format("%03d", size+1)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | checkAcceptRecordMapper.insert(tCheckAcceptRecord); | 
|---|
|  |  |  | // 将所有未缴费账单设置未已失效 | 
|---|
|  |  |  | List<TBill> tBills = billMapper.selectList(new LambdaQueryWrapper<TBill>() | 
|---|
|  |  |  | 
|---|
|  |  |  | billService.updateBatchById(tBills); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public static void main(String[] args) { | 
|---|
|  |  |  | //        LocalDate now = LocalDate.now(); | 
|---|
|  |  |  | //        String replace = (now + "").replace("-", ""); | 
|---|
|  |  |  | //        System.err.println(replace.substring(2)); | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //        System.err.println(String.format("%03d",1)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public CheckAcceptRecordVO getCheckByContractId(String id) { | 
|---|
|  |  |  | CheckAcceptRecordVO checkAcceptRecordVO = new CheckAcceptRecordVO(); | 
|---|
|  |  |  | 
|---|
|  |  |  | if (contract==null)return R.fail("合同不存在"); | 
|---|
|  |  |  | if (contract.getStatus().equals("4"))return R.fail("该合同已签订"); | 
|---|
|  |  |  | contract.setSignature(dto.getSignature()); | 
|---|
|  |  |  | contract.setStatus("2"); | 
|---|
|  |  |  | contract.setStatus("4"); | 
|---|
|  |  |  | 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.setPayableFeesTime(firstPayTime.toLocalDate()); | 
|---|
|  |  |  | if (firstPayTime.toLocalDate().equals(LocalDate.now())){ | 
|---|
|  |  |  | rentBill.setPayFeesStatus("1"); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | rentBill.setPayFeesStatus("2"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 
|---|
|  |  |  | 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.setStartTime(contract.getStartPayTime()); | 
|---|
|  |  |  | depositBill.setEndTime(contract.getEndTime()); | 
|---|
|  |  |  | depositBill.setPayableFeesTime(firstPayTime.toLocalDate()); | 
|---|
|  |  |  | if (firstPayTime.toLocalDate().equals(LocalDate.now())){ | 
|---|
|  |  |  | depositBill.setPayFeesStatus("1"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | depositBill.setPayableFeesTime(firstPayTime); | 
|---|
|  |  |  | depositBill.setPayFeesStatus("1"); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | depositBill.setPayFeesStatus("2"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | //        // 计算相差多少天 | 
|---|
|  |  |  | //        long days = ChronoUnit.DAYS.between(startTime, endTime); | 
|---|
|  |  |  | //        // 计算相差多少个月 | 
|---|
|  |  |  | //        long months = ChronoUnit.MONTHS.between(startTime, endTime); | 
|---|
|  |  |  | //        if (months<=31){ | 
|---|
|  |  |  | //            // 小于等于一个月 合计租金就是首笔账单金额 | 
|---|
|  |  |  | //            payableFeesMoney = contract.getTotalRent(); | 
|---|
|  |  |  | //        }else{ | 
|---|
|  |  |  | //            switch (contract.getPayType()){ | 
|---|
|  |  |  | //                case "1": | 
|---|
|  |  |  | //                    break; | 
|---|
|  |  |  | //                case "2": | 
|---|
|  |  |  | //                    break; | 
|---|
|  |  |  | //                case "3": | 
|---|
|  |  |  | //                    break; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //        } | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //        rent.setPayableFeesMoney(payableFeesMoney); | 
|---|
|  |  |  | //        rent.setPayableFeesTime(contract.getFirstPayTime()); | 
|---|
|  |  |  | //        rent.setPayFeesStatus("1"); | 
|---|
|  |  |  | //        rent.setBillType("1"); | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //        TBill deposit = new TBill(); | 
|---|
|  |  |  | //        deposit.setContractId(contract.getId()); | 
|---|
|  |  |  | //        deposit.setPayableFeesMoney(contract.getDeposit()); | 
|---|
|  |  |  | //        deposit.setPayableFeesTime(contract.getFirstPayTime()); | 
|---|
|  |  |  | //        deposit.setPayFeesStatus("1"); | 
|---|
|  |  |  | //        deposit.setBillType("2"); | 
|---|
|  |  |  | billService.save(rentBill); | 
|---|
|  |  |  | billService.save(depositBill); | 
|---|
|  |  |  | // 生成后续账单 | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | TBill beforeBill = billService.lambdaQuery().eq(TBill::getContractId, contract.getId()).eq(TBill::getBillType, 1).orderByDesc(TBill::getCreateTime) | 
|---|
|  |  |  | .last("limit 1").one(); | 
|---|
|  |  |  | if (!beforeBill.getEndTime().toLocalDate().equals(contract.getEndTime().toLocalDate())){ | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | while(beforeBill.getEndTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12).isBefore(contract.getEndTime())){ | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TBill tBill = new TBill(); | 
|---|
|  |  |  | tBill.setContractId(contract.getId()); | 
|---|
|  |  |  | tBill.setContractNumber(contract.getContractNumber()); | 
|---|
|  |  |  | // 根据支付方式判断需不需要生成订单 | 
|---|
|  |  |  | if (!(beforeBill.getEndTime().toLocalDate().equals(contract.getEndTime().toLocalDate())) | 
|---|
|  |  |  | && | 
|---|
|  |  |  | (contract.getPayType().equals("1")? | 
|---|
|  |  |  | beforeBill.getEndTime().plusMonths(1):contract.getPayType().equals("2")? | 
|---|
|  |  |  | beforeBill.getEndTime().plusMonths(3):beforeBill.getEndTime().plusMonths(12)) | 
|---|
|  |  |  | .with(TemporalAdjusters.lastDayOfMonth()).isBefore(contract.getEndTime()) | 
|---|
|  |  |  | && beforeBill.getEndTime().isBefore(contract.getEndTime()) | 
|---|
|  |  |  | ){ | 
|---|
|  |  |  | tBill.setContractId(contract.getId()); | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | 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{ | 
|---|
|  |  |  | // 之前已经涨、跌过租金了 需要判断周期是否还需要再涨、跌 | 
|---|
|  |  |  | if ((LocalDateTime.now().getYear() - contract.getChangeTime().getYear())%tContractRentType.getCycleTime()==0){ | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | 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{ | 
|---|
|  |  |  | // 不涨租金 用上次的 | 
|---|
|  |  |  | // 租金递增递减的时长 天 | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | 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{ | 
|---|
|  |  |  | long allDays = ChronoUnit.DAYS.between(beforeBill.getEndTime(), (contract.getPayType().equals("1")? | 
|---|
|  |  |  | beforeBill.getEndTime().plusMonths(1):contract.getPayType().equals("2")? | 
|---|
|  |  |  | beforeBill.getEndTime().plusMonths(3):beforeBill.getEndTime().plusMonths(12)).with(TemporalAdjusters.lastDayOfMonth())); | 
|---|
|  |  |  | 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().toLocalDate()); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | tBill.setPayableFeesTime((contract.getPayType().equals("1")? | 
|---|
|  |  |  | 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.setPayFeesStatus("2"); | 
|---|
|  |  |  | tBill.setBillType("1"); | 
|---|
|  |  |  | tBill.setStartTime(beforeBill.getEndTime().plusDays(1)); | 
|---|
|  |  |  | tBill.setEndTime(contract.getEndTime()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | billMapper.insert(tBill); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | TBill beforeBill = billService.lambdaQuery().eq(TBill::getContractId, contract.getId()).eq(TBill::getBillType, 1).orderByDesc(TBill::getCreateTime) | 
|---|
|  |  |  | .last("limit 1").one(); | 
|---|
|  |  |  | // 生成最后一笔账单 | 
|---|
|  |  |  | if (!(beforeBill.getEndTime().toLocalDate().equals(contract.getEndTime().toLocalDate())) | 
|---|
|  |  |  | && | 
|---|
|  |  |  | (contract.getPayType().equals("1")? | 
|---|
|  |  |  | beforeBill.getEndTime().plusMonths(1):contract.getPayType().equals("2")? | 
|---|
|  |  |  | beforeBill.getEndTime().plusMonths(3):beforeBill.getEndTime().plusMonths(12)) | 
|---|
|  |  |  | .with(TemporalAdjusters.lastDayOfMonth()).isAfter(contract.getEndTime()) | 
|---|
|  |  |  | && beforeBill.getEndTime().isBefore(contract.getEndTime()) | 
|---|
|  |  |  | ){ | 
|---|
|  |  |  | TBill tBill = new TBill(); | 
|---|
|  |  |  | tBill.setContractId(contract.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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 ((LocalDateTime.now().getYear() - contract.getChangeTime().getYear())%tContractRentType.getCycleTime()==0){ | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | 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{ | 
|---|
|  |  |  | // 不涨租金 用上次的 | 
|---|
|  |  |  | // 租金递增递减的时长 天 | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | 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{ | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | tBill.setPayableFeesTime((contract.getPayType().equals("1")? | 
|---|
|  |  |  | beforeBill.getEndTime().plusMonths(1).withDayOfMonth(15).toLocalDate():contract.getPayType().equals("2")? | 
|---|
|  |  |  | beforeBill.getEndTime().plusMonths(3).withDayOfMonth(15).toLocalDate():beforeBill.getEndTime().withDayOfMonth(15).plusMonths(12).withHour(0).withMinute(0).withSecond(0).toLocalDate())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | tBill.setPayFeesStatus("1"); | 
|---|
|  |  |  | tBill.setBillType("1"); | 
|---|
|  |  |  | tBill.setStartTime(beforeBill.getEndTime().plusDays(1)); | 
|---|
|  |  |  | tBill.setEndTime(beforeBill.getEndTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12)); | 
|---|
|  |  |  | billService.save(tBill); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return R.ok(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return list; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Boolean updateContractAuditStatus(String projectId, Integer status) { | 
|---|
|  |  |  | LambdaUpdateWrapper<TContract> contractLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); | 
|---|
|  |  |  | contractLambdaUpdateWrapper.eq(TContract::getId, projectId).set(TContract::getStatus, status); | 
|---|
|  |  |  | return this.update(contractLambdaUpdateWrapper); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|