using MediatR; using TakeoutSaaS.Application.App.Billings.Commands; using TakeoutSaaS.Domain.Tenants.Repositories; namespace TakeoutSaaS.Application.App.Billings.Handlers; /// /// 处理逾期账单命令处理器(后台任务)。 /// public sealed class ProcessOverdueBillingsCommandHandler( ITenantBillingRepository billingRepository) : IRequestHandler { /// public async Task Handle(ProcessOverdueBillingsCommand request, CancellationToken cancellationToken) { // 1. 查询逾期账单(到期日已过且未支付) var overdueBillings = await billingRepository.GetOverdueBillingsAsync(cancellationToken); if (overdueBillings.Count == 0) { return 0; } // 2. (空行后) 标记为逾期并更新通知时间 var now = DateTime.UtcNow; var updatedCount = 0; foreach (var billing in overdueBillings) { var before = billing.Status; billing.MarkAsOverdue(); if (before != billing.Status) { billing.OverdueNotifiedAt ??= now; await billingRepository.UpdateAsync(billing, cancellationToken); updatedCount++; } } // 3. (空行后) 持久化 if (updatedCount > 0) { await billingRepository.SaveChangesAsync(cancellationToken); } return updatedCount; } }