ad62ac96ac
Шаг маршрута получает флаг «Автосогласование» (AutoApprove). Когда у активной строки такого шага истекает SLA, часовая задача Hangfire принимает за согласующего положительное решение: помечает строку, двигает очередь и пересчитывает статус заявки — тем же набором правил, что и портал, когда решение принимает человек (зеркало approverDecision.service.ts/decide). Флаг не nullable, в отличие от SLA рядом: наследовать его неоткуда — у типа заявки такого поля нет и быть не должно. - ApprovalRow и константы статусов переехали в общий Approvals: их теперь читают и напоминания, и автосогласование, разъезжаться разбору одного и того же списка нельзя; - SharePointClient научился MERGE'ить элементы (раньше умел только читать). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
36 lines
2.3 KiB
C#
36 lines
2.3 KiB
C#
using Hangfire;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace Tnsu.ApprovalRoute.Application.Approvals;
|
|
|
|
/// <summary>
|
|
/// Рекуррентная задача автосогласования — тонкая обёртка над
|
|
/// <see cref="AutoApproveService"/>: всё, что она добавляет сверху, — расписание,
|
|
/// защита от наложения запусков и одна строка в логе с итогом.
|
|
///
|
|
/// Повторы отключены (Attempts = 0) намеренно, в отличие от
|
|
/// CreateNextListPartitionJob: там повтор нужен, потому что пропуск задачи ломает
|
|
/// сценарий целиком (список не создан — писать некуда). Здесь же следующий запуск
|
|
/// придёт сам, через час, и сделает ровно ту же работу с актуальным состоянием —
|
|
/// уже согласованные строки в выборку не попадут. Повторять упавший проход раньше
|
|
/// этого смысла нет, а висящие в очереди повторы только прятали бы настоящую
|
|
/// причину сбоя.
|
|
/// </summary>
|
|
[AutomaticRetry(Attempts = 0)]
|
|
[DisableConcurrentExecution(timeoutInSeconds: 5 * 60)]
|
|
public sealed class AutoApproveJob(AutoApproveService service, ILogger<AutoApproveJob> logger)
|
|
{
|
|
/// <summary>
|
|
/// Идентификатор рекуррентной задачи в Hangfire. Константой — по нему задача и
|
|
/// заводится, и снимается при выключении настройки (см. Program.cs): разъехавшись,
|
|
/// эти два имени оставили бы в дашборде задачу, которую уже некому снять.
|
|
/// </summary>
|
|
public const string RecurringJobId = "auto-approve";
|
|
|
|
public async Task RunAsync(CancellationToken cancellationToken)
|
|
{
|
|
var approved = await service.RunAsync(cancellationToken);
|
|
logger.LogInformation("Автосогласование: строк согласовано автоматически — {Count}", approved);
|
|
}
|
|
}
|