package com.ruoyi.system.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.aizuda.bpm.engine.FlowLongEngine;
import com.aizuda.bpm.engine.assist.ObjectUtils;
import com.aizuda.bpm.engine.core.FlowCreator;
import com.aizuda.bpm.engine.core.FlowLongContext;
import com.aizuda.bpm.engine.core.enums.EventType;
import com.aizuda.bpm.engine.core.enums.NodeApproveSelf;
import com.aizuda.bpm.engine.core.enums.NodeSetType;
import com.aizuda.bpm.engine.core.enums.TaskType;
import com.aizuda.bpm.engine.entity.FlwExtInstance;
import com.aizuda.bpm.engine.entity.FlwHisTask;
import com.aizuda.bpm.engine.entity.FlwTask;
import com.aizuda.bpm.engine.entity.FlwTaskActor;
import com.aizuda.bpm.engine.listener.TaskListener;
import com.aizuda.bpm.engine.model.NodeAssignee;
import com.aizuda.bpm.engine.model.NodeModel;
import com.aizuda.bpm.engine.model.ProcessModel;
import com.aizuda.bpm.mybatisplus.mapper.FlwExtInstanceMapper;
import com.aizuda.bpm.mybatisplus.mapper.FlwHisTaskMapper;
import com.aizuda.bpm.mybatisplus.mapper.FlwTaskActorMapper;
import com.aizuda.bpm.mybatisplus.mapper.FlwTaskMapper;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.google.common.collect.ImmutableMap;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.enums.ProcessCategoryEnum;
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.model.THouse;
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.service.THouseService;
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.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.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Supplier;
import java.util.stream.Collectors;
/**
* 工作流程全局任务监听 同步方式 只监听流程完成、流程中断类型,修改拒绝状态
*
* 1. 入户调查
* 2. 价格评估
* 3. 协议签订
* 4. 资金管理-预算资金
* 5. 住宅临时安置补助费
* 6. 停产停业经济损失补助费
* 7. 安置情况(流程图中叫做录入货币补偿金额信息)
* 固定对应表 state_process_module
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class FlowListenerService implements TaskListener {
private final FlwExtInstanceMapper flwExtInstanceMapper;
private final FlowLongEngine flowLongEngine;
private final FlwTaskActorMapper flwTaskActorMapper;
private final FlwHisTaskMapper flwHisTaskMapper;
private final ISysRoleService sysRoleService;
private final FlwTaskMapper flwTaskMapper;
private final TContractService contractService;
private final TContractRentTypeService contractRentTypeService;
private final TBillService billService;
private final TCheckAcceptRecordMapper checkAcceptRecordMapper;
private final THouseService houseService;
public static void main(String[] args) {
// LocalDate localDate1 = LocalDate.now().withYear(2025).withMonth(2).withDayOfMonth(10).with;
// System.err.println(localDate1.plusMonths(1));
//// LocalDate localDate2 = LocalDate.now().withYear(2025).withMonth(4).withDayOfMonth(16);
// LocalDateTime localDate1 = LocalDateTime.now().withYear(2025).withMonth(2).withDayOfMonth(10).withHour(00).withMinute(00).withSecond(00);
// LocalDateTime localDate2 = LocalDateTime.now().withYear(2025).withMonth(3).withDayOfMonth(31).withHour(00).withMinute(00).withSecond(00);
// LocalDateTime with = localDate1.plusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
// boolean before = with.isBefore(localDate2);
// System.err.println(before);
// long between = ChronoUnit.DAYS.between(localDate1, localDate2)+1;
// int monthValue = LocalDateTime.now().getMonthValue();
// LocalDateTime.now();
// LocalDateTime.now();
int dayOfMonth = LocalDateTime.now().getMonthValue();
System.err.println(dayOfMonth);
// System.err.println(LocalDateTime.now().isBefore(LocalDateTime.now()));
}
@Override
public boolean notify(EventType eventType, Supplier supplier, NodeModel nodeModel, FlowCreator flowCreator) {
FlwTask flwTask = supplier.get();
if (ObjectUtil.isNull(flwTask)) {
return true;
}
// 创建任务时候,判断是否自动审批通过
if (EventType.create.eq(eventType)) {
Integer approveSelf = nodeModel.getApproveSelf();
if (NodeApproveSelf.AutoSkip.eq(approveSelf)) {
// 普通成员情况
List nodeAssigneeList = null;
if (NodeSetType.specifyMembers.eq(nodeModel.getSetType())) {
nodeAssigneeList = nodeModel.getNodeAssigneeList();
if (ObjectUtil.isEmpty(nodeAssigneeList)) {
return true;
}
//查询发起人
LambdaQueryWrapper flwHisTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
flwHisTaskLambdaQueryWrapper.eq(FlwTask::getTaskType, TaskType.major.getValue());
flwHisTaskLambdaQueryWrapper.eq(FlwTask::getInstanceId, flwTask.getInstanceId());
FlwHisTask flwHisTask = flwHisTaskMapper.selectOne(flwHisTaskLambdaQueryWrapper);
if (ObjectUtil.isEmpty(flwHisTask)) {
return true;
}
// 添加定时任务
Map maps =
new ImmutableMap.Builder().
put("id", flwTask.getId())
.build();
QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name + flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT, new Date(new Date().getTime() + 48 * 60 * 60 * 1000L), maps);
//对比发起人和节点审批人
if (nodeAssigneeList.stream().noneMatch(t -> Objects.equals(t.getId(), flwHisTask.getCreateId()))) {
return true;
}
//查询当前节点审核人是否与创建人一致
List flwTaskActor = flwTaskActorMapper.selectListByTaskId(flwTask.getId());
if (ObjectUtil.isNotEmpty(flwTaskActor)) {
for (FlwTaskActor flwTaskActor1 : flwTaskActor) {
if (flwTaskActor1.getActorId().equals(flwHisTask.getCreateId())) {
return flowLongEngine.autoJumpTask(flwTask.getId(), flowCreator);
}
}
}
} else if (NodeSetType.role.eq(nodeModel.getSetType())) {
//角色任务跳过
nodeAssigneeList = nodeModel.getNodeAssigneeList();
//获取角色下的用户
List roleIds = nodeAssigneeList.stream().map(NodeAssignee::getId).collect(Collectors.toList());
List actorList = sysRoleService.selectRoleByUserIds(roleIds);
List flwTaskActors = new ArrayList<>();
if (ObjectUtils.isNotEmpty(actorList)) {
for (SysRole sysRole : actorList) {
if (ObjectUtil.isEmpty(sysRole.getRoleName())) {
continue;
}
NodeAssignee nodeAssignee = new NodeAssignee();
nodeAssignee.setId(String.valueOf(sysRole.getRoleId()));
nodeAssignee.setName(sysRole.getRoleName());
flwTaskActors.add(FlwTaskActor.of(nodeAssignee, 0));
}
}
if (ObjectUtil.isEmpty(flwTaskActors)) {
return true;
}
//查询发起人
LambdaQueryWrapper flwHisTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
flwHisTaskLambdaQueryWrapper.eq(FlwTask::getTaskType, TaskType.major.getValue());
flwHisTaskLambdaQueryWrapper.eq(FlwTask::getInstanceId, flwTask.getInstanceId());
FlwHisTask flwHisTask = flwHisTaskMapper.selectOne(flwHisTaskLambdaQueryWrapper);
if (ObjectUtil.isEmpty(flwHisTask)) {
return true;
}
// 添加定时任务
Map maps =
new ImmutableMap.Builder().
put("id", flwTask.getId())
.build();
QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name + flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT, new Date(new Date().getTime() + 48 * 60 * 60 * 1000L), maps);
//对比发起人和节点审批人
if (flwTaskActors.stream().noneMatch(t -> Objects.equals(t.getActorId(), flwHisTask.getCreateId()))) {
return true;
}
//查询当前节点审核人是否与创建人一致
List flwTaskActor = flwTaskActorMapper.selectListByTaskId(flwTask.getId());
if (ObjectUtil.isNotEmpty(flwTaskActor)) {
for (FlwTaskActor flwTaskActor1 : flwTaskActor) {
if (flwTaskActor1.getActorId().equals(flwHisTask.getCreateId())) {
return flowLongEngine.autoJumpTask(flwTask.getId(), flowCreator);
}
}
}
}
}
}
if (eventType.equals(EventType.reject) || eventType.equals(EventType.autoReject)) {
System.out.println("流程失败:" + flwTask.getVariable());
handlerBusiness(flwTask.getVariable(), 2);
} else if (eventType.equals(EventType.complete)) {
// 查询流程模型
FlwExtInstance flwExtInstance = flwExtInstanceMapper.selectById(flwTask.getInstanceId());
String modelContent = flwExtInstance.getModelContent();
ProcessModel processModel = FlowLongContext.parseProcessModel(modelContent, null, false);
NodeModel node = processModel.getNode(flwTask.getTaskKey());
if (ObjectUtil.isEmpty(node)) {
log.error("节点不存在 TaskName:{} InstanceId:{}", flwTask.getTaskName(), flwTask.getInstanceId());
return true;
}
long count = flwTaskMapper.selectCount(new LambdaQueryWrapper().eq(FlwTask::getInstanceId, flwTask.getInstanceId()));
if (count > 0) {
return true;
}
//最后一个节点
if (ObjectUtil.isEmpty(node.getChildNode()) || ObjectUtil.isEmpty(node.getChildNode().getNodeName())) {
System.out.println("流程完成:" + flwTask.getVariable());
handlerBusiness(flwTask.getVariable(), 1);
}
} else if (eventType.eq(EventType.cc)) {
// 查询流程模型//抄送
FlwExtInstance flwExtInstance = flwExtInstanceMapper.selectById(flwTask.getInstanceId());
String modelContent = flwExtInstance.getModelContent();
ProcessModel processModel = FlowLongContext.parseProcessModel(modelContent, null, false);
NodeModel node = processModel.getNode(flwTask.getTaskKey());
if (ObjectUtil.isEmpty(node)) {
log.error("节点不存在 TaskName:{} InstanceId:{}", flwTask.getTaskName(), flwTask.getInstanceId());
return true;
}
//抄送是最后一个节点
if (ObjectUtil.isEmpty(node.getChildNode()) || ObjectUtil.isEmpty(node.getChildNode().getNodeName())) {
System.out.println("流程完成:" + flwTask.getVariable());
handlerBusiness(flwTask.getVariable(), 1);
}
} else if (eventType.eq(EventType.autoJump)) {
// 查询流程模型 自动跳转
FlwExtInstance flwExtInstance = flwExtInstanceMapper.selectById(flwTask.getInstanceId());
String modelContent = flwExtInstance.getModelContent();
ProcessModel processModel = FlowLongContext.parseProcessModel(modelContent, null, false);
NodeModel node = processModel.getNode(flwTask.getTaskKey());
if (ObjectUtil.isEmpty(node)) {
log.error("节点不存在 TaskName:{} InstanceId:{}", flwTask.getTaskName(), flwTask.getInstanceId());
return true;
}
long count = flwTaskMapper.selectCount(new LambdaQueryWrapper().eq(FlwTask::getInstanceId, flwTask.getInstanceId()));
if (count > 0) {
return true;
}
//最后一个节点
if (ObjectUtil.isEmpty(node.getChildNode()) || ObjectUtil.isEmpty(node.getChildNode().getNodeName())) {
System.out.println("流程完成:" + flwTask.getVariable());
handlerBusiness(flwTask.getVariable(), 1);
}
}
return true;
}
/**
* 业务状态变更
*/
private void handlerBusiness(String variable, Integer status) {
JSONObject processParameter = JSON.parseObject(variable);
//必须参数,肯定有不判断null
Integer category = processParameter.getInteger("category");
//状态 暂定:0待审核 1审核通过 2审核拒绝
ProcessCategoryEnum categoryEnum = ProcessCategoryEnum.getEnumByKey(category);
switch (categoryEnum) {
case CATEGORY1: {
// 合同新增审批
int submitStatus = status == 0 ? 2 : (status == 1 ? 3 : 1);
contractService.updateContractAuditStatus(processParameter.getString("projectId"), submitStatus);
// TODO 发短信
break;
}
case CATEGORY2: {
// 合同签订审批
int submitStatus = status == 0 ? 3 : (status == 1 ? 4 : 1);
contractService.updateContractAuditStatus(processParameter.getString("projectId"), submitStatus);
TContract contract = contractService.getById(processParameter.getString("projectId"));
if (contract.getStatus().equals("4")) {
// 修改房屋状态
THouse house = houseService.getById(contract.getHouseId());
if (Objects.nonNull(house)) {
house.setLeaseStatus("2");
houseService.updateById(house);
}
List 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 (contract.getPayType().equals("2")) {
// 季付 取3 6 9 12
int temp = 0 ;
if (contract.getStartPayTime().getMonthValue() <= 3 ) {
temp = 3;
} else if (contract.getStartPayTime().getMonthValue() <= 6) {
temp = 6;
} else if (contract.getStartPayTime().getMonthValue() <= 9) {
temp = 9;
} else {
temp = 12;
}
if (contract.getEndTime().isAfter(contract.getStartPayTime().withMonth(temp).with(TemporalAdjusters.lastDayOfMonth()))){
rentBill.setEndTime(contract.getStartPayTime().withMonth(temp).with(TemporalAdjusters.lastDayOfMonth()));
}else {
rentBill.setEndTime(contract.getEndTime());
}
} else if (contract.getPayType().equals("3")) {
if (contract.getEndTime().isAfter(contract.getStartPayTime().withMonth(12).with(TemporalAdjusters.lastDayOfMonth()))){
rentBill.setEndTime(contract.getStartPayTime().withMonth(12).with(TemporalAdjusters.lastDayOfMonth()));
}else {
rentBill.setEndTime(contract.getEndTime());
}
} else {
rentBill.setEndTime(rentBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()));
}
if (tContractRentType != null && rentBill.getEndTime().isAfter(tContractRentType.getChangeTime())){
long moneyDays = 0;
if (tContractRentType.getChangeTime().with(TemporalAdjusters.lastDayOfMonth()).isBefore(rentBill.getEndTime())){
moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), tContractRentType.getChangeTime().with(TemporalAdjusters.lastDayOfMonth())) + 1;
}else{
moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(),rentBill.getEndTime()) + 1;
}
// 计算租金变动的天数
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)).setScale(2, BigDecimal.ROUND_DOWN));
// 变动后的每月租金
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)).setScale(2, BigDecimal.ROUND_DOWN));
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)).setScale(2, BigDecimal.ROUND_DOWN);
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)).setScale(2, BigDecimal.ROUND_DOWN);
contract.setChangeRent(contract.getChangeRent().subtract(tContractRentType.getNumericalValue()));
break;
}
break;
}
LocalDateTime localDateTime = tContractRentType.getChangeTime().with(TemporalAdjusters.lastDayOfMonth()).plusDays(1);
while(true){
if (localDateTime.isBefore(rentBill.getEndTime())){
if (localDateTime.plusMonths(1).isBefore(rentBill.getEndTime())){
contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent());
localDateTime = localDateTime.plusMonths(1);
}else {
break;
}
}else{
break;
}
}
long temp = ChronoUnit.DAYS.between(localDateTime,rentBill.getEndTime()) + 1;
contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(temp)));
// 不需要涨租金的时间段
long originalDays = 0;
if (contract.getFirstPayTime().with(TemporalAdjusters.lastDayOfMonth()).isBefore(tContractRentType.getChangeTime())){
originalDays = Math.abs(ChronoUnit.DAYS.between(contract.getFirstPayTime(), contract.getFirstPayTime().with(TemporalAdjusters.lastDayOfMonth())));
}else{
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)));
LocalDateTime originalTime = contract.getFirstPayTime().with(TemporalAdjusters.lastDayOfMonth()).plusDays(1);
while(true){
if (originalTime.isBefore(tContractRentType.getChangeTime())){
if (originalTime.plusMonths(1).isBefore(tContractRentType.getChangeTime())){
originalMoney = originalMoney.add(contract.getMonthRent());
originalTime = originalTime.plusMonths(1);
}else {
break;
}
}else{
break;
}
}
long tempOriginal = ChronoUnit.DAYS.between(localDateTime,tContractRentType.getChangeTime()) ;
originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(tempOriginal)));
rentBill.setPayableFeesMoney(contractRentTypeMoney.add(originalMoney));
rentBill.setOutstandingMoney(rentBill.getPayableFeesMoney());
} else {
// 不走递增递减
if (contract.getPayType().equals("2")){
BigDecimal money = new BigDecimal("0");
// 第一个月计算天
int dayOfMonth = rentBill.getStartTime().getDayOfMonth();
if (dayOfMonth == 1) {
System.err.println("第一笔账单 1号计算整月:");
money = money.add(contract.getMonthRent());
} else {
long allDays = Math.abs(ChronoUnit.DAYS.between(rentBill.getStartTime(), rentBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth())) + 1);
System.err.println("第一笔账单 计算天数"+allDays);
money =money.add(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(allDays)));
System.err.println("第一笔账单 计算天数金额"+money);
}
// 后续
if (contract.getStartPayTime().getMonthValue()==3||contract.getStartPayTime().getMonthValue()==6||contract.getStartPayTime().getMonthValue()==9||contract.getStartPayTime().getMonthValue()==12){
System.err.println("后续账单 月为3 6 9 12金额"+money);
rentBill.setPayableFeesMoney(money);
rentBill.setOutstandingMoney(rentBill.getPayableFeesMoney());
}else{
LocalDateTime localDateTime = rentBill.getStartTime().plusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
System.err.println("后续账单逻辑时间"+localDateTime);
while (true){
if (localDateTime.toLocalDate().isBefore(rentBill.getEndTime().toLocalDate())){
System.err.println("后续while 在结束之前");
money = money.add(contract.getMonthRent());
}else if(localDateTime.toLocalDate().equals(rentBill.getEndTime().toLocalDate())){
System.err.println("后续while 结束");
money = money.add(contract.getMonthRent());
break;
}else {
System.err.println("后续while 加一个月大于结束时间");
if (localDateTime.with(TemporalAdjusters.firstDayOfMonth()).isBefore(rentBill.getEndTime())){
long a = ChronoUnit.DAYS.between(localDateTime.with(TemporalAdjusters.firstDayOfMonth()),rentBill.getEndTime())+1;
System.err.println("后续while 加一个月大于结束时间 计算天数"+a);
money = money.add(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(
new BigDecimal(ChronoUnit.DAYS.between(localDateTime.with(TemporalAdjusters.firstDayOfMonth()),rentBill.getEndTime())+1))
);
}
break;
}
localDateTime = localDateTime.plusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
}
rentBill.setPayableFeesMoney(money);
rentBill.setOutstandingMoney(rentBill.getPayableFeesMoney());
}
}else if (contract.getPayType().equals("3")){
BigDecimal money = new BigDecimal("0");
// 第一个月计算天
int dayOfMonth = rentBill.getStartTime().getDayOfMonth();
if (dayOfMonth == 1) {
money = money.add(contract.getMonthRent());
} else {
long allDays = ChronoUnit.DAYS.between(rentBill.getStartTime(), rentBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth())) ;
money =money.add(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(allDays)));
}
// 后续
if (contract.getStartPayTime().getMonthValue()==12){
rentBill.setPayableFeesMoney(money);
rentBill.setOutstandingMoney(rentBill.getPayableFeesMoney());
}else{
// LocalDateTime localDateTime = rentBill.getStartTime().plusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
LocalDateTime localDateTime = rentBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).plusDays(1);
while (true){
if (localDateTime.isBefore(rentBill.getEndTime())){
localDateTime = localDateTime.plusMonths(1);
money = money.add(contract.getMonthRent());
}else{
money = money.add(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(ChronoUnit.DAYS.between(rentBill.getEndTime(),localDateTime.with(TemporalAdjusters.firstDayOfMonth())))));
break;
}
}
rentBill.setPayableFeesMoney(money);
rentBill.setOutstandingMoney(rentBill.getPayableFeesMoney());
}
}else {
long allDays = ChronoUnit.DAYS.between(contract.getStartPayTime(), rentBill.getEndTime()) + 1;
int dayOfMonth = rentBill.getStartTime().getDayOfMonth();
if (dayOfMonth == 1) {
rentBill.setPayableFeesMoney(contract.getMonthRent());
} 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);
rentBill.setBusinessDeptId(contract.getBusinessDeptId());
depositBill.setBusinessDeptId(contract.getBusinessDeptId());
billService.save(rentBill);
billService.save(depositBill);
// 生成后续账单
try {
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())) {
while (beforeBill.getEndTime().plusMonths(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12).isBefore(contract.getEndTime())) {
System.err.println("生成后续账单");
TBill tBill = new TBill();
tBill.setContractId(contract.getId());
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()));
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(beforeBill.getEndTime().plusMonths(1).withDayOfMonth(15).toLocalDate());
}
tBill.setContractId(contract.getId());
if (contract.getIsIncreasing()) {
System.err.println("执行递增递减");
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 = 0;
if (changeTime.with(TemporalAdjusters.lastDayOfMonth()).isBefore(tBill.getEndTime())){
moneyDays = ChronoUnit.DAYS.between(changeTime, changeTime.with(TemporalAdjusters.lastDayOfMonth())) + 1;
}else{
moneyDays = ChronoUnit.DAYS.between(changeTime,tBill.getEndTime()) + 1;
}
// 递增递减的租金
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)).setScale(2, BigDecimal.ROUND_DOWN));
// 变动后的每月租金
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)).setScale(2, BigDecimal.ROUND_DOWN));
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)).setScale(2, BigDecimal.ROUND_DOWN);
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)).setScale(2, BigDecimal.ROUND_DOWN);
contract.setChangeRent(contract.getChangeRent().subtract(tContractRentType.getNumericalValue()));
break;
}
break;
}
LocalDateTime localDateTime = changeTime.with(TemporalAdjusters.lastDayOfMonth()).plusDays(1);
while(true){
if (localDateTime.isBefore(tBill.getEndTime())){
if (localDateTime.plusMonths(1).isBefore(tBill.getEndTime())){
contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent());
localDateTime = localDateTime.plusMonths(1);
}else {
break;
}
}else{
break;
}
}
long temp = ChronoUnit.DAYS.between(localDateTime,tBill.getEndTime()) + 1;
contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(temp)));
// 不需要涨租金的时间段
long originalDays = 0;
if (tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).isBefore(changeTime)){
originalDays = Math.abs(ChronoUnit.DAYS.between(tBill.getStartTime(), tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth())));
}else{
originalDays = Math.abs(ChronoUnit.DAYS.between(tBill.getStartTime(), changeTime));
}
originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(originalDays)));
LocalDateTime originalTime = tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).plusDays(1);
while(true){
if (originalTime.isBefore(changeTime)){
if (originalTime.plusMonths(1).isBefore(changeTime)){
originalMoney = originalMoney.add(contract.getChangeRent());
originalTime = originalTime.plusMonths(1);
}else {
break;
}
}else{
break;
}
}
long tempOriginal = ChronoUnit.DAYS.between(originalTime,changeTime);
originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(tempOriginal)));
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())) {
System.err.println("首次递增递减");
contract.setChangeTime(tContractRentType.getChangeTime());
// 租金递增递减的时长 天
long moneyDays = 0 ;
if (tContractRentType.getChangeTime().with(TemporalAdjusters.lastDayOfMonth()).isBefore(rentBill.getEndTime())){
moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), tContractRentType.getChangeTime().with(TemporalAdjusters.lastDayOfMonth())) + 1;
}else{
moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(),rentBill.getEndTime()) + 1;
}
// 递增递减的租金
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)).setScale(2, BigDecimal.ROUND_DOWN));
// 变动后的每月租金
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)).setScale(2, BigDecimal.ROUND_DOWN));
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)).setScale(2, BigDecimal.ROUND_DOWN);
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)).setScale(2, BigDecimal.ROUND_DOWN);
contract.setChangeRent(contract.getChangeRent().subtract(tContractRentType.getNumericalValue()));
break;
}
break;
}
LocalDateTime localDateTime = tContractRentType.getChangeTime().with(TemporalAdjusters.lastDayOfMonth()).plusDays(1);
while(true){
if (localDateTime.isBefore(tBill.getEndTime())){
if (localDateTime.plusMonths(1).isBefore(tBill.getEndTime())){
contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent());
localDateTime = localDateTime.plusMonths(1);
}else {
break;
}
}else{
break;
}
}
long temp = ChronoUnit.DAYS.between(localDateTime,tBill.getEndTime()) + 1;
contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(temp)));
// 不需要涨租金的时间段
long originalDays = 0;
if (tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).isBefore(tContractRentType.getChangeTime())){
originalDays = Math.abs(ChronoUnit.DAYS.between(tBill.getStartTime(), tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth())));
}else{
originalDays = Math.abs(ChronoUnit.DAYS.between(tBill.getStartTime(), tContractRentType.getChangeTime()));
}
originalMoney = originalMoney.add(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(originalDays)));
LocalDateTime originalTime = contract.getFirstPayTime().with(TemporalAdjusters.lastDayOfMonth()).plusDays(1);
while(true){
if (originalTime.isBefore(tContractRentType.getChangeTime())){
if (originalTime.plusMonths(1).isBefore(tContractRentType.getChangeTime())){
originalMoney = originalMoney.add(contract.getMonthRent());
originalTime = originalTime.plusMonths(1);
}else {
break;
}
}else{
break;
}
}
long tempOriginal = ChronoUnit.DAYS.between(originalTime,tContractRentType.getChangeTime()) ;
originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(tempOriginal)));
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 {
tBill.setPayableFeesMoney(contract.getChangeRent().multiply(new BigDecimal(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12)));
tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
}
} else {
System.err.println("不执行递增递减");
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.setBusinessDeptId(contract.getBusinessDeptId());
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());
tBill.setContractNumber(contract.getContractNumber());
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 = 0;
if (changeTime.with(TemporalAdjusters.lastDayOfMonth()).isBefore(tBill.getEndTime())){
moneyDays = ChronoUnit.DAYS.between(changeTime, changeTime.with(TemporalAdjusters.lastDayOfMonth())) + 1;
}else{
moneyDays = ChronoUnit.DAYS.between(changeTime,tBill.getEndTime()) + 1;
}
// 递增递减的租金
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)).setScale(2, BigDecimal.ROUND_DOWN));
// 变动后的每月租金
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)).setScale(2, BigDecimal.ROUND_DOWN));
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)).setScale(2, BigDecimal.ROUND_DOWN);
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)).setScale(2, BigDecimal.ROUND_DOWN);
contract.setChangeRent(contract.getChangeRent().subtract(tContractRentType.getNumericalValue()));
break;
}
break;
}
LocalDateTime localDateTime = changeTime.with(TemporalAdjusters.lastDayOfMonth()).plusDays(1);
while(true){
if (localDateTime.isBefore(tBill.getEndTime())){
if (localDateTime.plusMonths(1).isBefore(tBill.getEndTime())){
contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent());
localDateTime = localDateTime.plusMonths(1);
}else {
break;
}
}else{
break;
}
}
long temp = ChronoUnit.DAYS.between(localDateTime,tBill.getEndTime()) + 1;
contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(temp)));
// 不需要涨租金的时间段
long originalDays = 0;
if (tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).isBefore(tContractRentType.getChangeTime())){
originalDays = Math.abs(ChronoUnit.DAYS.between(tBill.getStartTime(), changeTime.with(TemporalAdjusters.lastDayOfMonth())));
}else{
originalDays = Math.abs(ChronoUnit.DAYS.between(tBill.getStartTime(), changeTime));
}
originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(originalDays)));
LocalDateTime originalTime = tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).plusDays(1);
while(true){
if (originalTime.isBefore(changeTime)){
if (originalTime.plusMonths(1).isBefore(changeTime)){
originalMoney = originalMoney.add(contract.getChangeRent());
originalTime = originalTime.plusMonths(1);
}else {
break;
}
}else{
break;
}
}
long tempOriginal = ChronoUnit.DAYS.between(originalTime,changeTime);
originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(tempOriginal)));
tBill.setPayableFeesMoney(contractRentTypeMoney.add(originalMoney));
tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
contractService.updateById(contract);
} 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 {
if (tContractRentType.getChangeTime().isBefore(tBill.getEndTime()) && tContractRentType.getChangeTime().isAfter(tBill.getStartTime())) {
contract.setChangeTime(tContractRentType.getChangeTime());
// 租金递增递减的时长 天
// 租金递增递减的时长 天
long moneyDays = 0;
if (tContractRentType.getChangeTime().with(TemporalAdjusters.lastDayOfMonth()).isBefore(tBill.getEndTime())){
moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), tContractRentType.getChangeTime().with(TemporalAdjusters.lastDayOfMonth())) + 1;
}else{
moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(),tBill.getEndTime()) + 1;
}
// 递增递减的租金
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)).setScale(2, BigDecimal.ROUND_DOWN));
// 变动后的每月租金
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)).setScale(2, BigDecimal.ROUND_DOWN));
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)).setScale(2, BigDecimal.ROUND_DOWN);
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)).setScale(2, BigDecimal.ROUND_DOWN);
contract.setChangeRent(contract.getChangeRent().subtract(tContractRentType.getNumericalValue()));
break;
}
break;
}
LocalDateTime localDateTime = tContractRentType.getChangeTime().with(TemporalAdjusters.lastDayOfMonth()).plusDays(1);
while(true){
if (localDateTime.isBefore(tBill.getEndTime())){
if (localDateTime.plusMonths(1).isBefore(tBill.getEndTime())){
contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent());
localDateTime = localDateTime.plusMonths(1);
}else {
break;
}
}else{
break;
}
}
long temp = ChronoUnit.DAYS.between(localDateTime,tBill.getEndTime()) + 1;
contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(temp)));
// 不需要涨租金的时间段
long originalDays = 0;
if (tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).isBefore(tContractRentType.getChangeTime())){
originalDays = Math.abs(ChronoUnit.DAYS.between(tBill.getStartTime(), tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth())));
}else{
originalDays = Math.abs(ChronoUnit.DAYS.between(tBill.getStartTime(), tContractRentType.getChangeTime()));
}
originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(originalDays)));
LocalDateTime originalTime = tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).plusDays(1);
while(true){
if (originalTime.isBefore(tContractRentType.getChangeTime())){
if (originalTime.plusMonths(1).isBefore(tContractRentType.getChangeTime())){
originalMoney = originalMoney.add(contract.getChangeRent());
originalTime = originalTime.plusMonths(1);
}else {
break;
}
}else{
break;
}
}
long tempOriginal = ChronoUnit.DAYS.between(originalTime,tContractRentType.getChangeTime());
originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(tempOriginal)));
tBill.setPayableFeesMoney(contractRentTypeMoney.add(originalMoney));
tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
contractService.updateById(contract);
}
}
} else {
BigDecimal originalMoney = new BigDecimal("0");
// 不需要涨租金的时间段
long originalDays = 0;
if (tBill.getStartTime().getDayOfMonth()==1&&(tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).toLocalDate().isAfter(tBill.getEndTime().toLocalDate())||tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).toLocalDate().equals(tBill.getEndTime().toLocalDate()))){
// 计算整月
originalMoney = originalMoney.add(contract.getChangeRent());
}else{
// 计算天
if (tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).isBefore(tBill.getEndTime())){
originalDays = Math.abs(ChronoUnit.DAYS.between(tBill.getStartTime(), tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth())))+1;
}else{
originalDays = Math.abs(ChronoUnit.DAYS.between(tBill.getStartTime(), tBill.getEndTime()))+1;
}
}
originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(originalDays)));
LocalDateTime originalTime = tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).plusDays(1);
while(true){
if (originalTime.isBefore(tBill.getEndTime())){
if (originalTime.plusMonths(1).isBefore(tContractRentType.getChangeTime())){
originalMoney = originalMoney.add(contract.getChangeRent());
originalTime = originalTime.plusMonths(1);
}else {
break;
}
}else{
break;
}
}
long tempOriginal = ChronoUnit.DAYS.between(originalTime,tBill.getEndTime());
originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(tempOriginal)));
tBill.setPayableFeesMoney(originalMoney);
tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
}
} else {
BigDecimal originalMoney = new BigDecimal("0");
// 不需要涨租金的时间段
long originalDays = 0;
if (tBill.getStartTime().getDayOfMonth()==1
&&
(
tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).toLocalDate().isBefore(tBill.getEndTime().toLocalDate())
||tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).toLocalDate().equals(tBill.getEndTime().toLocalDate())
)
){
// 计算整月
originalMoney = originalMoney.add(contract.getChangeRent());
}else{
// 计算天
if (tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).isBefore(tBill.getEndTime())){
originalDays = Math.abs(ChronoUnit.DAYS.between(tBill.getStartTime(), tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth())))+1;
}else{
originalDays = Math.abs(ChronoUnit.DAYS.between(tBill.getStartTime(), tBill.getEndTime()))+1;
}
originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(originalDays)));
}
LocalDateTime originalTime = tBill.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).plusDays(1);
while(true){
if (originalTime.isBefore(tBill.getEndTime())){
if (originalTime.plusMonths(1).isBefore(tBill.getEndTime())){
originalMoney = originalMoney.add(contract.getChangeRent());
originalTime = originalTime.plusMonths(1);
}else {
break;
}
}else{
break;
}
}
if (originalTime.isBefore(tBill.getEndTime())||originalTime.toLocalDate().equals(tBill.getEndTime().toLocalDate())){
long tempOriginal = ChronoUnit.DAYS.between(originalTime,tBill.getEndTime())+1;
originalMoney = originalMoney.add(contract.getChangeRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(tempOriginal)));
}
tBill.setPayableFeesMoney(originalMoney);
tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
}
// if (tBill.getEndTime().getDayOfMonth() >= 15) {
// tBill.setPayableFeesTime(tBill.getStartTime().withDayOfMonth(15).toLocalDate());
// } else if (tBill.getStartTime().getYear() == tBill.getEndTime().getYear() && tBill.getStartTime().getMonthValue() == tBill.getEndTime().getMonthValue()) {
// // 如果同年同月 且日小于15 缴费时间取合同
// tBill.setPayableFeesTime(tBill.getStartTime().toLocalDate());
// } else {
tBill.setPayableFeesTime(tBill.getStartTime().withDayOfMonth(15).toLocalDate());
// }
tBill.setBusinessDeptId(contract.getBusinessDeptId());
billService.save(tBill);
}
}
break;
}
case CATEGORY3: {
// 合同提前终止审批
int submitStatus = status == 0 ? 4 : (status == 1 ? 7 : 4);
contractService.updateContractAuditStatus(processParameter.getString("projectId"), submitStatus);
// 生成验收记录
TContract contract = contractService.getById(processParameter.getString("projectId"));
//更新合同结束时间
contract.setEndTime(contract.getTerminateTime());
contractService.updateById(contract);
// 修改房屋状态
THouse house = houseService.getById(contract.getHouseId());
house.setLeaseStatus("1");
houseService.updateById(house);
TCheckAcceptRecord tCheckAcceptRecord = new TCheckAcceptRecord();
tCheckAcceptRecord.setContractId(contract.getId());
tCheckAcceptRecord.setHouseId(contract.getHouseId());
tCheckAcceptRecord.setLeaseReason("后台终止合同");
tCheckAcceptRecord.setAcceptanceTime(LocalDateTime.now());
LocalDate now = LocalDate.now();
String replace = (now + "").replace("-", "");
int size = checkAcceptRecordMapper.selectList(new LambdaQueryWrapper()
.likeRight(TCheckAcceptRecord::getAcceptanceTime, LocalDate.now())).size();
tCheckAcceptRecord.setCode(replace.substring(2) + String.format("%03d", size + 1));
checkAcceptRecordMapper.insert(tCheckAcceptRecord);
break;
}
default:
throw new ServiceException("错误类型");
}
}
}