wujianwei
2026-03-20 10309399433091888260ea31c2ab330aa57d685f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package com.ruoyi.quartz.task;
 
import com.ruoyi.cwgl.domain.ReceivableBillManagement;
import com.ruoyi.cwgl.service.IReceivableBillManagementService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
 
/**
 * 应收账单账龄分析定时任务
 * 每天更新应收账单的账龄分析数据
 * 
 * @author ruoyi
 */
@Component("receivableBillAgingTask")
public class ReceivableBillAgingTask
{
    private static Logger logger = LoggerFactory.getLogger(ReceivableBillAgingTask.class);
    
    @Autowired
    private IReceivableBillManagementService receivableBillManagementService;
 
    /**
     * 更新应收账单账龄分析数据
     * 每天凌晨执行,更新所有应收账单的账龄分段数据
     */
    public void updateAgingAnalysisData()
    {
        try {
            logger.info("开始执行应收账单账龄分析数据更新任务");
            
            // 查询所有需要更新账龄数据的应收账单
            ReceivableBillManagement query = new ReceivableBillManagement();
            List<ReceivableBillManagement> billList = receivableBillManagementService.selectReceivableBillManagementList(query);
            
            int updatedCount = 0;
            Date currentDate = new Date();
            
            for (ReceivableBillManagement bill : billList) {
                if (bill.getBillDueDate() != null && bill.getPendingAmount() != null && 
                    bill.getPendingAmount().compareTo(BigDecimal.ZERO) > 0) {
                    
                    // 计算逾期天数
                    long diffInMillies = Math.abs(currentDate.getTime() - bill.getBillDueDate().getTime());
                    long diffInDays = diffInMillies / (1000 * 60 * 60 * 24);
                    
                    // 重置所有账龄字段
                    bill.setDueIn30Days(BigDecimal.ZERO);
                    bill.setOverdueAmount(BigDecimal.ZERO);
                    bill.setOverdue1To30Days(BigDecimal.ZERO);
                    bill.setOverdue31To60Days(BigDecimal.ZERO);
                    bill.setOverdue61To90Days(BigDecimal.ZERO);
                    bill.setOverdue91To180Days(BigDecimal.ZERO);
                    bill.setOverdue181To365Days(BigDecimal.ZERO);
                    bill.setOverdueOver1Year(BigDecimal.ZERO);
                    bill.setOverdueDays(0);
                    
                    // 计算30天内到期金额
                    if (bill.getBillDueDate().after(currentDate)) {
                        long daysUntilDue = diffInDays;
                        if (daysUntilDue <= 30) {
                            bill.setDueIn30Days(bill.getPendingAmount());
                        }
                    } else {
                        // 账单已逾期
                        bill.setOverdueAmount(bill.getPendingAmount());
                        bill.setOverdueDays((int) diffInDays);
                        
                        // 根据逾期天数分配到不同的账龄分段
                        if (diffInDays <= 30) {
                            bill.setOverdue1To30Days(bill.getPendingAmount());
                        } else if (diffInDays <= 60) {
                            bill.setOverdue31To60Days(bill.getPendingAmount());
                        } else if (diffInDays <= 90) {
                            bill.setOverdue61To90Days(bill.getPendingAmount());
                        } else if (diffInDays <= 180) {
                            bill.setOverdue91To180Days(bill.getPendingAmount());
                        } else if (diffInDays <= 365) {
                            bill.setOverdue181To365Days(bill.getPendingAmount());
                        } else {
                            bill.setOverdueOver1Year(bill.getPendingAmount());
                        }
                    }
                    
                    // 更新账单记录
                    receivableBillManagementService.updateReceivableBillManagement(bill);
                    updatedCount++;
                }
            }
            
            logger.info("应收账单账龄分析数据更新任务完成,共更新 {} 条记录", updatedCount);
            
        } catch (Exception e) {
            logger.error("应收账单账龄分析数据更新任务执行失败", e);
        }
    }
}