Files
tnsu-approval-route/backend/Tnsu.ApprovalRoute.Application/TemplateRouteSteps/TemplateRouteStepDto.cs
T
gorbenko.pavel ad62ac96ac feat(автосогласование): флаг на шаге маршрута и фоновая задача по SLA
Шаг маршрута получает флаг «Автосогласование» (AutoApprove). Когда у активной
строки такого шага истекает SLA, часовая задача Hangfire принимает за
согласующего положительное решение: помечает строку, двигает очередь и
пересчитывает статус заявки — тем же набором правил, что и портал, когда решение
принимает человек (зеркало approverDecision.service.ts/decide).

Флаг не nullable, в отличие от SLA рядом: наследовать его неоткуда — у типа
заявки такого поля нет и быть не должно.

- ApprovalRow и константы статусов переехали в общий Approvals: их теперь читают
  и напоминания, и автосогласование, разъезжаться разбору одного и того же
  списка нельзя;
- SharePointClient научился MERGE'ить элементы (раньше умел только читать).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 18:08:41 +05:00

79 lines
3.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Tnsu.ApprovalRoute.Domain.Enums;
namespace Tnsu.ApprovalRoute.Application.TemplateRouteSteps;
// AutoApprove — «согласовать шаг автоматически по истечении SLA». Обычный bool,
// а не три состояния: наследовать его неоткуда (см. TemplateRouteStep.AutoApprove).
//
// SlaHours/AskOverdueReason у шага перекрывают одноимённые поля типа заявки.
// null — «не задано, наследовать», поэтому оба поля nullable и необязательны
// (0 часов и false — это осознанный выбор, а не «пусто»). Добавлены в конец
// записей, чтобы не ломать существующие позиционные вызовы.
/// <summary>Одно условие появления шага — см. Domain.Entities.TemplateRouteStepCondition.</summary>
public sealed record RouteStepConditionDto(string FieldName, ComparisonOperator Operation, string Value);
public sealed record TemplateRouteStepDto(
int Id,
int OrderNo,
string? ExecutorEmail,
string? Position,
ProjectRole? ProjectRole,
HeadType? HeadType,
RouteStepStatus Status,
int RouteId,
bool AllowReassignToOtherApprovers,
IReadOnlyList<RouteStepConditionDto> Conditions,
ConditionsLogic ConditionsLogic,
string? Warning = null,
int? SlaHours = null,
bool? AskOverdueReason = null,
bool AutoApprove = false);
public sealed record CreateTemplateRouteStepRequest(
int OrderNo,
string? ExecutorEmail,
string? Position,
ProjectRole? ProjectRole,
HeadType? HeadType,
RouteStepStatus Status,
bool AllowReassignToOtherApprovers,
IReadOnlyList<RouteStepConditionDto>? Conditions,
ConditionsLogic ConditionsLogic,
int? SlaHours = null,
bool? AskOverdueReason = null,
bool AutoApprove = false);
public sealed record UpdateTemplateRouteStepRequest(
int OrderNo,
string? ExecutorEmail,
string? Position,
ProjectRole? ProjectRole,
HeadType? HeadType,
RouteStepStatus Status,
bool AllowReassignToOtherApprovers,
IReadOnlyList<RouteStepConditionDto>? Conditions,
ConditionsLogic ConditionsLogic,
int? SlaHours = null,
bool? AskOverdueReason = null,
bool AutoApprove = false);
/// <summary>
/// Как и остальные поля PATCH, Conditions=null означает «не менять». Отличить
/// «не менять» от «убрать все условия» здесь нельзя (тот же приём, что и раньше
/// для FieldName) — очистка условий делается через PUT с Conditions: [].
/// </summary>
public sealed record PatchTemplateRouteStepRequest(
int? OrderNo,
string? ExecutorEmail,
string? Position,
ProjectRole? ProjectRole,
HeadType? HeadType,
RouteStepStatus? Status,
bool? AllowReassignToOtherApprovers,
IReadOnlyList<RouteStepConditionDto>? Conditions,
ConditionsLogic? ConditionsLogic = null,
int? SlaHours = null,
bool? AskOverdueReason = null,
bool? AutoApprove = null);