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 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); } } }