feat(billing): 新增逾期账单自动标记定时任务
1. 新增Hangfire定时任务BillingOverdueProcessJob 2. 修复逾期账单查询条件过宽问题 3. 默认每10分钟执行一次逾期检查
This commit is contained in:
@@ -32,6 +32,11 @@ public static class SchedulerServiceCollectionExtensions
|
||||
.ValidateDataAnnotations()
|
||||
.ValidateOnStart();
|
||||
|
||||
services.AddOptions<BillingAutomationOptions>()
|
||||
.Bind(configuration.GetSection("Scheduler:BillingAutomation"))
|
||||
.ValidateDataAnnotations()
|
||||
.ValidateOnStart();
|
||||
|
||||
services.AddHangfire((serviceProvider, config) =>
|
||||
{
|
||||
var options = serviceProvider.GetRequiredService<IOptionsMonitor<SchedulerOptions>>().CurrentValue;
|
||||
@@ -59,6 +64,7 @@ public static class SchedulerServiceCollectionExtensions
|
||||
services.AddScoped<SubscriptionRenewalReminderJob>();
|
||||
services.AddScoped<SubscriptionExpiryCheckJob>();
|
||||
services.AddScoped<SubscriptionAutoRenewalJob>();
|
||||
services.AddScoped<BillingOverdueProcessJob>();
|
||||
|
||||
return services;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
using MediatR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using TakeoutSaaS.Application.App.Billings.Commands;
|
||||
using TakeoutSaaS.Module.Scheduler.Options;
|
||||
|
||||
namespace TakeoutSaaS.Module.Scheduler.Jobs;
|
||||
|
||||
/// <summary>
|
||||
/// 账单逾期标记任务:将超过到期日的待支付账单标记为逾期。
|
||||
/// </summary>
|
||||
public sealed class BillingOverdueProcessJob(
|
||||
IMediator mediator,
|
||||
IOptionsMonitor<BillingAutomationOptions> optionsMonitor,
|
||||
ILogger<BillingOverdueProcessJob> logger)
|
||||
{
|
||||
/// <summary>
|
||||
/// 执行逾期账单标记。
|
||||
/// </summary>
|
||||
public async Task ExecuteAsync()
|
||||
{
|
||||
// 1. 读取配置并执行逾期处理
|
||||
var options = optionsMonitor.CurrentValue;
|
||||
var updatedCount = await mediator.Send(new ProcessOverdueBillingsCommand());
|
||||
|
||||
// 2. 记录执行结果
|
||||
logger.LogInformation(
|
||||
"定时任务:逾期账单标记完成,更新 {UpdatedCount} 条(Cron={Cron})",
|
||||
updatedCount,
|
||||
options.OverdueBillingProcessCron);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace TakeoutSaaS.Module.Scheduler.Options;
|
||||
|
||||
/// <summary>
|
||||
/// 账单自动化相关配置(逾期标记等)。
|
||||
/// </summary>
|
||||
public sealed class BillingAutomationOptions
|
||||
{
|
||||
/// <summary>
|
||||
/// 逾期账单标记任务 Cron 表达式(Hangfire)。
|
||||
/// 默认每 10 分钟执行一次。
|
||||
/// </summary>
|
||||
[Required]
|
||||
public string OverdueBillingProcessCron { get; set; } = "*/10 * * * *";
|
||||
}
|
||||
@@ -9,7 +9,10 @@ namespace TakeoutSaaS.Module.Scheduler.Services;
|
||||
/// <summary>
|
||||
/// 周期性任务注册器。
|
||||
/// </summary>
|
||||
public sealed class RecurringJobRegistrar(IOptionsMonitor<SubscriptionAutomationOptions> subscriptionAutomationOptions) : IRecurringJobRegistrar
|
||||
public sealed class RecurringJobRegistrar(
|
||||
IOptionsMonitor<SubscriptionAutomationOptions> subscriptionAutomationOptions,
|
||||
IOptionsMonitor<BillingAutomationOptions> billingAutomationOptions)
|
||||
: IRecurringJobRegistrar
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public Task RegisterAsync(CancellationToken cancellationToken = default)
|
||||
@@ -34,7 +37,13 @@ public sealed class RecurringJobRegistrar(IOptionsMonitor<SubscriptionAutomation
|
||||
job => job.ExecuteAsync(),
|
||||
$"0 {options.SubscriptionExpiryCheckExecuteHourUtc} * * *");
|
||||
|
||||
// 3. (空行后) 账单自动化任务(逾期标记)
|
||||
var billingOptions = billingAutomationOptions.CurrentValue;
|
||||
RecurringJob.AddOrUpdate<BillingOverdueProcessJob>(
|
||||
"billings.overdue-process",
|
||||
job => job.ExecuteAsync(),
|
||||
billingOptions.OverdueBillingProcessCron);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user