From 41e05da9a811cd9394ce9bddf5edcb7cde58db06 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期四, 06 三月 2025 16:49:36 +0800 Subject: [PATCH] Merge branch 'master' of https://gitee.com/xiaochen991015/xizang --- ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java | 478 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 465 insertions(+), 13 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 48bf079..3240660 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 @@ -30,15 +30,28 @@ import com.ruoyi.common.enums.ProcessCategoryEnum; import com.ruoyi.common.enums.SubmitStatusEnum; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.system.mapper.TCheckAcceptRecordMapper; +import com.ruoyi.system.model.TBill; +import com.ruoyi.system.model.TCheckAcceptRecord; +import com.ruoyi.system.model.TContract; +import com.ruoyi.system.model.TContractRentType; import com.ruoyi.system.service.ISysRoleService; +import com.ruoyi.system.service.TBillService; +import com.ruoyi.system.service.TContractRentTypeService; import com.ruoyi.system.service.TContractService; import com.ruoyi.system.task.base.QuartzManager; import com.ruoyi.system.task.base.TimeJobType; import com.ruoyi.system.task.jobs.StateProcessJob; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -68,7 +81,9 @@ private final ISysRoleService sysRoleService; private final FlwTaskMapper flwTaskMapper; private final TContractService contractService; - + private final TContractRentTypeService contractRentTypeService; + private final TBillService billService; + private final TCheckAcceptRecordMapper checkAcceptRecordMapper; @Override public boolean notify(EventType eventType, Supplier<FlwTask> supplier, NodeModel nodeModel, FlowCreator flowCreator) { @@ -101,7 +116,7 @@ new ImmutableMap.Builder<String, Long>(). put("id", flwTask.getId()) .build(); - QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name+flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT,new Date(new Date().getTime()+10*1000L), maps); + QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name + flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT, new Date(new Date().getTime() + 48 * 60 * 60 * 1000L), maps); //对比发起人和节点审批人 @@ -124,9 +139,9 @@ List<String> roleIds = nodeAssigneeList.stream().map(NodeAssignee::getId).collect(Collectors.toList()); List<SysRole> actorList = sysRoleService.selectRoleByUserIds(roleIds); List<FlwTaskActor> flwTaskActors = new ArrayList<>(); - if(ObjectUtils.isNotEmpty(actorList)) { + if (ObjectUtils.isNotEmpty(actorList)) { for (SysRole sysRole : actorList) { - if(ObjectUtil.isEmpty(sysRole.getRoleName())) { + if (ObjectUtil.isEmpty(sysRole.getRoleName())) { continue; } NodeAssignee nodeAssignee = new NodeAssignee(); @@ -152,7 +167,7 @@ new ImmutableMap.Builder<String, Long>(). put("id", flwTask.getId()) .build(); - QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name+flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT,new Date(new Date().getTime()+10*1000L), maps); + QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name + flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT, new Date(new Date().getTime() + 48 * 60 * 60 * 1000L), maps); //对比发起人和节点审批人 @@ -185,8 +200,8 @@ log.error("节点不存在 TaskName:{} InstanceId:{}", flwTask.getTaskName(), flwTask.getInstanceId()); return true; } - long count = flwTaskMapper.selectCount(new LambdaQueryWrapper<FlwTask>().eq(FlwTask::getInstanceId,flwTask.getInstanceId())); - if(count > 0){ + long count = flwTaskMapper.selectCount(new LambdaQueryWrapper<FlwTask>().eq(FlwTask::getInstanceId, flwTask.getInstanceId())); + if (count > 0) { return true; } //最后一个节点 @@ -209,7 +224,7 @@ System.out.println("流程完成:" + flwTask.getVariable()); handlerBusiness(flwTask.getVariable(), 1); } - } else if(eventType.eq(EventType.autoJump)){ + } else if (eventType.eq(EventType.autoJump)) { // 查询流程模型 自动跳转 FlwExtInstance flwExtInstance = flwExtInstanceMapper.selectById(flwTask.getInstanceId()); String modelContent = flwExtInstance.getModelContent(); @@ -219,8 +234,8 @@ log.error("节点不存在 TaskName:{} InstanceId:{}", flwTask.getTaskName(), flwTask.getInstanceId()); return true; } - long count = flwTaskMapper.selectCount(new LambdaQueryWrapper<FlwTask>().eq(FlwTask::getInstanceId,flwTask.getInstanceId())); - if(count > 0){ + long count = flwTaskMapper.selectCount(new LambdaQueryWrapper<FlwTask>().eq(FlwTask::getInstanceId, flwTask.getInstanceId())); + if (count > 0) { return true; } //最后一个节点 @@ -244,21 +259,458 @@ switch (categoryEnum) { case CATEGORY1: { // 合同新增审批 - int submitStatus = status==0?2:(status==1?3:5); + int submitStatus = status == 0 ? 2 : (status == 1 ? 3 : 5); contractService.updateContractAuditStatus(processParameter.getString("projectId"), submitStatus); // TODO 发短信 break; } case CATEGORY2: { // 合同签订审批 - int submitStatus = status==0?3:(status==1?4:5); + int submitStatus = status == 0 ? 3 : (status == 1 ? 4 : 5); contractService.updateContractAuditStatus(processParameter.getString("projectId"), submitStatus); + TContract contract = contractService.getById(processParameter.getString("projectId")); + List<TContractRentType> contractRentTypes = contractRentTypeService.list(); + TContractRentType tContractRentType = contractRentTypes.stream().filter(e -> e.getContractId().equals(contract.getId())).findFirst().orElse(null); + + // 生成第一笔账单 + // 第一次应缴费日期 + LocalDateTime firstPayTime = contract.getStartTime().plusDays(10).withHour(0).withMinute(0).withSecond(0); + TBill rentBill = new TBill(); + rentBill.setContractId(contract.getId()); + rentBill.setContractNumber(contract.getContractNumber()); + rentBill.setPayableFeesTime(firstPayTime.toLocalDate()); + rentBill.setPayFeesStatus("1"); + + rentBill.setBillType("1"); + rentBill.setStartTime(contract.getStartPayTime()); + if (rentBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).isAfter(contract.getEndTime())) { + if (rentBill.getStartTime().getDayOfMonth() != 1) { + rentBill.setEndTime(rentBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth())); + } else { + rentBill.setEndTime(rentBill.getStartTime().plusMonths(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12).with(TemporalAdjusters.lastDayOfMonth())); + } + } else { + rentBill.setEndTime(contract.getEndTime()); + } + if (tContractRentType != null && rentBill.getEndTime().isAfter(tContractRentType.getChangeTime())) { + long moneyDays = 0; + moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), rentBill.getEndTime()); + // 计算租金变动的天数 + contract.setChangeTime(tContractRentType.getChangeTime()); + // 递增递减的租金 + 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(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(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(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(contract.getChangeRent().subtract(tContractRentType.getNumericalValue())); + break; + } + break; + } + // 不需要涨租金的时间段 + long originalDays = Math.abs(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()); + } else { + // 不走递增递减 + long allDays = ChronoUnit.DAYS.between(contract.getStartPayTime(), rentBill.getEndTime()); + int dayOfMonth = rentBill.getStartTime().getDayOfMonth(); + if (dayOfMonth == 1) { + rentBill.setPayableFeesMoney(contract.getMonthRent().multiply(new BigDecimal(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12))); + } else { + rentBill.setPayableFeesMoney(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(allDays))); + } + rentBill.setOutstandingMoney(rentBill.getPayableFeesMoney()); + } + // 押金账单 + 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()); + + depositBill.setPayFeesStatus("1"); + + + depositBill.setBillType("2"); + contractService.updateById(contract); + 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().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.setContractId(contract.getId()); + if (contract.getIsIncreasing()) { + if (tContractRentType != null) { + // 如果变过 并且时间在递增递减时间段内 + if (contract.getChangeTime() != null) { + // 下次递增递减时间 + LocalDateTime changeTime = contract.getChangeTime().plusYears(tContractRentType.getCycleTime()); + // 之前已经涨、跌过租金了 需要判断周期是否还需要再涨、跌 + if (changeTime.isBefore(tBill.getEndTime()) && changeTime.isAfter(tBill.getStartTime())) { + contract.setChangeTime(changeTime); + // 租金递增递减的时长 天 + long moneyDays = Math.abs(ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), beforeBill.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(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(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(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(contract.getChangeRent().subtract(tContractRentType.getNumericalValue())); + break; + } + break; + } + // 不需要涨租金的时间段 + 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)) + .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 = Math.abs(ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), beforeBill.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(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(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(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(contract.getChangeRent().subtract(tContractRentType.getNumericalValue())); + break; + } + break; + } + // 不需要涨租金的时间段 + 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)) + .multiply(new BigDecimal(originalDays)); + } + tBill.setPayableFeesMoney(contractRentTypeMoney.add(originalMoney)); + tBill.setOutstandingMoney(tBill.getPayableFeesMoney()); + } + } + } else { + + tBill.setPayableFeesMoney(contract.getMonthRent().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)); + tBill.setEndTime(beforeBill.getEndTime().plusMonths(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12).with(TemporalAdjusters.lastDayOfMonth())); + billService.save(tBill); + beforeBill.setEndTime(beforeBill.getEndTime().plusMonths(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12).with(TemporalAdjusters.lastDayOfMonth())); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + TBill beforeBill = billService.lambdaQuery().eq(TBill::getContractId, contract.getId()).eq(TBill::getBillType, 1).orderByDesc(TBill::getStartTime) + .last("limit 1").one(); + // 生成最后一笔账单 + if (!(beforeBill.getEndTime().toLocalDate().equals(contract.getEndTime().toLocalDate())) + && beforeBill.getEndTime().isBefore(contract.getEndTime()) + ) { + TBill tBill = new TBill(); + tBill.setContractId(contract.getId()); + tBill.setPayFeesStatus("1"); + tBill.setBillType("1"); + 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 ((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())); + } + + billService.save(tBill); + } break; } case CATEGORY3: { // 合同提前终止审批 - int submitStatus = status==0?4:(status==1?6:5); + int submitStatus = status == 0 ? 4 : (status == 1 ? 6 : 5); contractService.updateContractAuditStatus(processParameter.getString("projectId"), submitStatus); + // 生成验收记录 + TContract contract = contractService.getById(processParameter.getString("projectId")); + contract.setStatus("7"); + TCheckAcceptRecord tCheckAcceptRecord = new TCheckAcceptRecord(); + tCheckAcceptRecord.setContractId(contract.getId()); + tCheckAcceptRecord.setHouseId(contract.getHouseId()); + 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 = billService.list(new LambdaQueryWrapper<TBill>() + .in(TBill::getPayFeesStatus, Arrays.asList("1,2,4")) + .eq(TBill::getContractId, contract.getId())); + for (TBill tBill : tBills) { + tBill.setPayFeesStatus("5"); + } + billService.updateBatchById(tBills); break; } default: -- Gitblit v1.7.1