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