| | |
| | | |
| | | /** |
| | | * 更新应收账单账龄分析数据 |
| | | * 每天凌晨执行,更新所有应收账单的账龄分段数据 |
| | | * 每天凌晨执行,使用数据库层面批量更新,性能最优 |
| | | */ |
| | | 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++; |
| | | } |
| | | } |
| | | // 使用数据库层面批量更新,避免查询数据到应用层 |
| | | int updatedCount = receivableBillManagementService.batchUpdateAgingAnalysisData(); |
| | | |
| | | logger.info("应收账单账龄分析数据更新任务完成,共更新 {} 条记录", updatedCount); |
| | | |