无关风月
2025-03-18 da81542b6dc8984f639687f30e7e610dc139b085
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java
@@ -1,188 +1,83 @@
package com.ruoyi.web.controller.task;
import com.ruoyi.system.model.TBill;
import com.ruoyi.system.model.TContract;
import com.ruoyi.system.service.TBillService;
import com.ruoyi.system.service.TContractService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
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.Random;
import java.util.stream.Collectors;
/**
 * @author zhibing.pu
 * @date 2023/7/11 8:39
 */
@Component
public class TaskUtil {
    @Autowired
    private TContractService contractService;
    @Autowired
    private TBillService billService;
    // 每天凌晨00点执行的定时任务 用于合同生成第一笔账单
    @Scheduled(cron = "0 0 0 * * ?")
    public void dayOfFirstBill() {
        try {
            // 查询所有已签订的合同并且未生成第一笔账单的
            List<TContract> list = contractService.lambdaQuery().eq(TContract::getStatus, 4).isNull(TContract::getFirstPayTime).list();
            List<TBill> bills = new ArrayList<>();
            for (TContract contract : list) {
                contract.setFirstPayTime(contract.getStartTime().plusDays(10));
                // 第一次应缴费日期
                LocalDateTime firstPayTime = contract.getStartTime().plusDays(10);
                LocalDate localDate = contract.getStartTime().plusDays(10).toLocalDate();
                LocalDate now = LocalDate.now();
                // 如果应缴费日期和当前时间不相同 跳过
                if (!localDate.equals(now)) {
                    continue;
                }
                TBill rentBill = new TBill();
                rentBill.setContractId(contract.getId());
                rentBill.setContractNumber(contract.getContractNumber());
                LocalDateTime startPayTime = contract.getStartPayTime();
                LocalDateTime endTime1 = contract.getEndTime();
                // 计算两个时间相差多少天
                long days = ChronoUnit.DAYS.between(startPayTime, endTime1)+1L;
                // 如果时间小于30天 需要计算每日租金
                if (days<30){
                    rentBill.setPayableFeesMoney(contract.getMonthRent().divide(new BigDecimal("30"),2,BigDecimal.ROUND_DOWN).multiply(new BigDecimal(days)));
                }else{
                    rentBill.setPayableFeesMoney(contract.getMonthRent());
                }
                rentBill.setPayableFeesTime(firstPayTime);
                rentBill.setPayFeesStatus("1");
                rentBill.setBillType("1");
                rentBill.setStartTime(contract.getStartPayTime());
                if (contract.getEndTime().getYear() == contract.getStartTime().getYear() && contract.getEndTime().getMonth() == contract.getStartTime().getMonth()) {
                    // 如果同年同月 那么账单周期为合同结束时间
                    rentBill.setEndTime(contract.getEndTime());
                } else {
                    // 否则 取当月最后一天
                    LocalDateTime endTime = contract.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).withSecond(59).withHour(23).withMinute(59);
                    rentBill.setEndTime(endTime);
                }
                // 租金账单
                bills.add(rentBill);
                // 押金账单
                TBill depositBill = new TBill();
                depositBill.setContractId(contract.getId());
                depositBill.setContractNumber(contract.getContractNumber());
                depositBill.setPayableFeesMoney(contract.getDeposit());
                depositBill.setPayableFeesTime(firstPayTime);
                depositBill.setPayFeesStatus("1");
                depositBill.setBillType("2");
                bills.add(depositBill);
            }
            contractService.updateBatchById(list);
            billService.saveBatch(bills);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 每月15号凌晨执行的定时任务 用于生成租金账单
    @Scheduled(cron = "0 0 0 15 * ?")
    public void monthOfBill() {
        try {
            // 查询所有已签订的合同
            List<TContract> list = contractService.lambdaQuery().eq(TContract::getStatus, 4).isNotNull(TContract::getFirstPayTime).list();
            List<TBill> bills = new ArrayList<>();
            for (TContract contract : list) {
                TBill tBill = new TBill();
                LocalDateTime endTime = contract.getEndTime();
                if (endTime.isBefore(LocalDateTime.now())){
                    // 最后缴费日期是当天
                    tBill.setContractId(contract.getId());
                    tBill.setContractNumber(contract.getContractNumber());
                    tBill.setPayableFeesMoney(contract.getMonthRent());
//                    tBill.setPayableFeesTime();
                    tBill.setPayFeesStatus("1");
                    tBill.setBillType("1");
                    tBill.setStartTime(contract.getStartPayTime());
                    // 如果同年同月 那么账单周期为合同结束时间
                    tBill.setEndTime(contract.getEndTime());
                }
                contract.setFirstPayTime(contract.getStartTime().plusDays(10));
                // 第一次应缴费日期
                LocalDateTime firstPayTime = contract.getStartTime().plusDays(10);
                LocalDate localDate = contract.getStartTime().plusDays(10).toLocalDate();
                LocalDate now = LocalDate.now();
                switch (contract.getPayType()){
                    case "1":
                        break;
                    case "2":
                        break;
                    case "3":
                        break;
                }
                if (!localDate.equals(now)) {
                    continue;
                }
                TBill rentBill = new TBill();
                rentBill.setContractId(contract.getId());
                rentBill.setContractNumber(contract.getContractNumber());
                rentBill.setPayableFeesMoney(contract.getMonthRent());
                rentBill.setPayableFeesTime(firstPayTime);
                rentBill.setPayFeesStatus("1");
                rentBill.setBillType("1");
                rentBill.setStartTime(contract.getStartPayTime());
                if (contract.getEndTime().getYear() == contract.getStartTime().getYear() && contract.getEndTime().getMonth() == contract.getStartTime().getMonth()) {
                    // 如果同年同月 那么账单周期为合同结束时间
                    rentBill.setEndTime(contract.getEndTime());
                } else {
                    // 否则 取当月最后一天
//                    LocalDateTime endTime = contract.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).withSecond(59).withHour(23).withMinute(59);
                    rentBill.setEndTime(endTime);
                }
                // 租金账单
                bills.add(rentBill);
                // 押金账单
                TBill depositBill = new TBill();
                depositBill.setContractId(contract.getId());
                depositBill.setContractNumber(contract.getContractNumber());
                depositBill.setPayableFeesMoney(contract.getDeposit());
                depositBill.setPayableFeesTime(firstPayTime);
                depositBill.setPayFeesStatus("1");
                depositBill.setBillType("2");
                bills.add(depositBill);
            }
            contractService.updateBatchById(list);
            billService.saveBatch(bills);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime now1 = LocalDateTime.now();
        long days = ChronoUnit.DAYS.between(now, now1);
        long days2 = ChronoUnit.DAYS.between(now.plusDays(1), now1);
        System.err.println(days);
        System.err.println(days2);
//        LocalDateTime endTime = now.with(TemporalAdjusters.lastDayOfMonth()).withSecond(59).withHour(23).withMinute(59);
//package com.ruoyi.web.controller.task;
//
//        System.err.println(endTime);
    }
}
//
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.ruoyi.common.utils.SmsUtil;
//import com.ruoyi.system.mapper.TBillMapper;
//import com.ruoyi.system.model.TBill;
//import com.ruoyi.system.model.TContract;
//import com.ruoyi.system.model.TContractRentType;
//import com.ruoyi.system.service.TBillService;
//import com.ruoyi.system.service.TContractRentTypeService;
//import com.ruoyi.system.service.TContractService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.math.BigDecimal;
//import java.time.LocalDate;
//import java.time.LocalDateTime;
//import java.time.LocalTime;
//import java.time.ZoneId;
//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.Random;
//import java.util.stream.Collectors;
//
///**
// * @author zhibing.pu
// * @date 2023/7/11 8:39
// */
//@Component
//public class TaskUtil {
//    @Autowired
//    private TContractService contractService;
//    @Autowired
//    private TBillMapper billMapper;
//    // 用于更新违约金账单
//    // 每分钟执行一次的定时任务
//
//    @Scheduled(cron = "0 * * * * ?")
//    public void dayOfProportionBill() {
//        try {
//            // 查询所有未缴费账单
//            List<TBill> list = billMapper.selectList(new LambdaQueryWrapper<TBill>().eq(TBill::getPayFeesStatus, 1)
//                    .le(TBill::getPayableFeesTime,LocalDate.now()));
//            for (TBill tBill : list) {
//                tBill.setPayFeesStatus("4");
//                TContract contract = contractService.getById(tBill.getContractId());
//                LocalDate payableFeesTime = tBill.getPayableFeesTime();
//                // 将LocalDate转化为LocalDateTime
//                LocalDateTime payableFeesTime1 = LocalDateTime.of(payableFeesTime, LocalTime.of(0, 0, 0));
//                LocalDateTime now = LocalDateTime.now();
//                // 计算两个时间相差多少个小时
//                long hours = ChronoUnit.HOURS.between(payableFeesTime1, now);
//                long l = hours / 24;
//                if (l>=3){
//                    // 违约金比例
//                    BigDecimal proportion = contract.getProportion();
//                    // 按每天 待缴费金额 * XX% 增加违约金费用
//                    if (tBill.getOutstandingMoney().compareTo(new BigDecimal("0"))==0){
//                        tBill.setPayFeesStatus("3");
//                        billMapper.updateById(tBill);
//                        continue;
//                    }
//                    BigDecimal money = tBill.getOutstandingMoney().multiply(new BigDecimal(100).add(proportion)).divide(new BigDecimal(100),2, BigDecimal.ROUND_DOWN);
//                    tBill.setOverDays((int) l);
//                    tBill.setPayableFeesPenalty((tBill.getPayableFeesPenalty()!=null?tBill.getPayableFeesPenalty():BigDecimal.ZERO).add(money));
//                    tBill.setOutstandingMoney(money);
//                    billMapper.updateById(tBill);
//
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//
//}