ad62ac96ac
Шаг маршрута получает флаг «Автосогласование» (AutoApprove). Когда у активной строки такого шага истекает SLA, часовая задача Hangfire принимает за согласующего положительное решение: помечает строку, двигает очередь и пересчитывает статус заявки — тем же набором правил, что и портал, когда решение принимает человек (зеркало approverDecision.service.ts/decide). Флаг не nullable, в отличие от SLA рядом: наследовать его неоткуда — у типа заявки такого поля нет и быть не должно. - ApprovalRow и константы статусов переехали в общий Approvals: их теперь читают и напоминания, и автосогласование, разъезжаться разбору одного и того же списка нельзя; - SharePointClient научился MERGE'ить элементы (раньше умел только читать). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
41 lines
2.9 KiB
C#
41 lines
2.9 KiB
C#
namespace Tnsu.ApprovalRoute.Application.Approvals;
|
|
|
|
public sealed class AutoApproveOptions
|
|
{
|
|
/// <summary>
|
|
/// Включено ли автосогласование вообще. Выключение снимает рекуррентную задачу
|
|
/// из Hangfire (см. Program.cs), а не просто делает её пустой: иначе в дашборде
|
|
/// осталась бы задача, которая регулярно запускается и ничего не делает.
|
|
/// </summary>
|
|
public bool Enabled { get; set; } = true;
|
|
|
|
/// <summary>
|
|
/// Расписание запуска (cron, UTC). Раз в час: SLA задаётся в ЧАСАХ, поэтому
|
|
/// час — предельная точность, которая вообще имеет смысл, а более частый опрос
|
|
/// всех списков SharePoint ничего не ускоряет по существу.
|
|
///
|
|
/// Следствие: шаг согласуется не в сам момент истечения SLA, а на ближайшем
|
|
/// запуске после него — то есть в пределах часа позже. Это осознанно: раньше
|
|
/// срока не согласуется никогда, а опоздание в пределах часа для срока,
|
|
/// измеряемого часами, роли не играет.
|
|
/// </summary>
|
|
public string Cron { get; set; } = "0 * * * *";
|
|
|
|
/// <summary>
|
|
/// Комментарий, который задача пишет в строку согласования вместо комментария
|
|
/// согласующего. Нужен, чтобы в матрице заявки было видно, что решение принял не
|
|
/// человек: других признаков у автосогласованной строки нет — статус и дата у неё
|
|
/// такие же, как у обычной.
|
|
/// </summary>
|
|
public string Comment { get; set; } = "Согласовано автоматически: истёк срок SLA по этому шагу.";
|
|
|
|
/// <summary>
|
|
/// Сколько строк автосогласовать максимум за один запуск. Предохранитель на
|
|
/// случай массового включения флага или сдвига дат: без него один запуск мог бы
|
|
/// пройти по всему архиву партиций и написать в SharePoint тысячи изменений,
|
|
/// упёршись в троттлинг. Остаток уедет в следующий запуск — задача идемпотентна
|
|
/// (уже решённые строки в выборку активных не попадают).
|
|
/// </summary>
|
|
public int MaxRowsPerRun { get; set; } = 200;
|
|
}
|