xuhy
2025-02-10 c77b1732c23a6a53a81e693dc7630308661d13e8
Merge remote-tracking branch 'origin/master'
2个文件已修改
1个文件已添加
206 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
@@ -210,17 +210,13 @@
        String url = wordUtil.generatePdf("/templates", "1_yzj_租赁合同.xml", templateParam, "租赁合同", "E:\\");
        return R.ok(url);
    }
    @ApiOperation(value = "导出")
    @PostMapping("/export")
    public void export(@RequestBody TContractQuery query){
        contractService.export(query);
    }
    /**
     * 光缆巡检列表导出
     */
    @ApiOperation(value = "光缆巡检列表导出")
    @Log(title = "现场作业-光缆巡检列表导出", businessType = BusinessType.EXPORT)
    @PostMapping("/exportOpticalInspection")
    @ApiOperation(value = "导出")
    @Log(title = "导出", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void exportOpticalInspection(@RequestBody TContractQuery query)
    {
        List<ContractExport> contractExports = new ArrayList<>();
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java
New file
@@ -0,0 +1,188 @@
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);
//
//        System.err.println(endTime);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java
@@ -52,6 +52,10 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("end_time")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "开始计费事件")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("start_pay_time")
    private LocalDateTime startPayTime;
    @ApiModelProperty(value = "每月租金")
    @TableField("month_rent")
@@ -65,7 +69,7 @@
    @TableField("pay_type")
    private String payType;
    @ApiModelProperty(value = "第一次支付日期")
    @ApiModelProperty(value = "账单第一次支付日期 合同生效日期+10天 (不是真正的支付日期)生成第一次帐单后存值")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("first_pay_time")
    private LocalDateTime firstPayTime;