feat: Сервисы и модели RabbitMq разнесены согласно архитектуры

This commit is contained in:
Mikhail Trubnikov
2026-04-14 12:01:49 +10:00
parent 734c2e3c99
commit e892aa12d3
196 changed files with 589 additions and 1232 deletions

View File

@@ -0,0 +1,22 @@
namespace PARR.Domain.Common.Rabbit.Messages
{
/// <summary>
/// Модель в MQ, данные из АИХИТ
/// </summary>
public class AihitDataMq
{
public required string EK { get; set; }
public string? IP { get; set; }
public string? DB { get; set; }
public string? APP { get; set; }
public string? CKBS { get; set; }
public string? IB { get; set; }
public string? SI { get; set; }
public string? SM { get; set; }
public string? OS { get; set; }
public string? WorkGroup { get; set; }
public required string Status { get; set; }
public required string ResponseArea { get; set; }
public required string WorkGroupResponseArea { get; set; }
}
}

View File

@@ -0,0 +1,18 @@
namespace PARR.Domain.Common.Rabbit.Messages
{
/// <summary>
/// Модель в MQ, данные из АИХИТ для любой ХП
/// </summary>
public class AihitMainDataMq
{
/// <summary>
/// ЭК
/// </summary>
public required string Name { get; set; }
/// <summary>
/// Список полей ЭК, в формате - имя поля / значение
/// </summary>
public Dictionary<string, string?> Properties { get; set; } = new Dictionary<string, string?>();
}
}

View File

@@ -0,0 +1,50 @@
using PARR.Domain.Entities.Base.History;
namespace PARR.Domain.Common.Rabbit.Messages
{
/// <summary>
/// Модель в MQ, запрос на генерацию шаблона
/// </summary>
public class GeneratorTemplateMq
{
/// <summary>
/// Id работы
/// </summary>
public Guid WorkId { get; set; }
/// <summary>
/// Id приложения
/// </summary>
public Guid ApplicationId { get; set; }
/// <summary>
/// Действие: create, deactivate
/// </summary>
public required string Action { get; set; }
/// <summary>
/// ЭК, принимает регулярное выражение. Например: *, ВРТ-*-ДВС
/// </summary>
public required string Ek { get; set; }
/// <summary>
/// Статус ЭК. Допустимые значения: 0 - все статусы, 1,2,3,4,5,6,7,9
/// </summary>
public int StatusEk { get; set; }
/// <summary>
/// Активировать шаблон
/// </summary>
public bool? IsActiveTemplate { get; set; }
/// <summary>
/// Активировать расписание
/// </summary>
public bool? IsActiveSchedule { get; set; }
/// <summary>
/// Инициатор запроса к генератору
/// </summary>
public HistoryInitiator? HistoryInitiator { get; set; }
}
}

View File

@@ -0,0 +1,14 @@
using PARR.Domain.Entities.Base.History;
namespace PARR.Domain.Common.Rabbit.Messages
{
/// <summary>
/// Запрос на обновление всех nextRun для JobGroup
/// </summary>
public class NextRunUpdateMq
{
public Guid JobGroupId { get; set; }
public required HistoryInitiator Initiator { get; set; }
}
}

View File

@@ -0,0 +1,10 @@
namespace PARR.Domain.Common.Rabbit.Messages
{
/// <summary>
/// Модель в MQ, запрос на изменение Наряда в ЕСПП
/// </summary>
public class OrderManageMq
{
public Guid OrderId { get; set; }
}
}

View File

@@ -0,0 +1,43 @@
using PARR.Domain.Entities.Base.History;
using PARR.Domain.Enums;
namespace PARR.Domain.Common.Rabbit.Messages
{
/// <summary>
/// Модель в MQ, активация/деактивация шаблонов/расписаний
/// </summary>
public class TemplateActivatorMq
{
/// <summary>
/// ИД объекта, JobGroupId, JobId, TemplateId
/// </summary>
public Guid Id { get; set; }
/// <summary>
/// Тип объекта
/// </summary>
public SyncTaskEntityTypeEnum EntityType { get; set; }
/// <summary>
/// Учитывать неиспользованные шаблоны
/// </summary>
public bool AllowUnused { get; set; } = false;
/// <summary>
/// Объект воздейстивя (шаблон, расписание)
/// </summary>
public TemplateActivatorEsppObjectTypesEnum EsppObject { get; set; }
/// <summary>
/// Новое состояние объекта
/// </summary>
public bool NewState { get; set; }
/// <summary>
/// Инициатор изменений
/// </summary>
public required HistoryInitiator HistoryInitiator { get; set; }
}
}

View File

@@ -0,0 +1,14 @@
using PARR.Domain.Entities.Base.History;
namespace PARR.Domain.Common.Rabbit.Messages
{
/// <summary>
/// Модель в MQ, распределить шаблоны для JobGroupId (для TemplateDistributor)
/// </summary>
public class TemplateDistributorMq
{
public Guid JobGroupId { get; set; }
public required HistoryInitiator Initiator { get; set; }
}
}

View File

@@ -0,0 +1,46 @@
using PARR.Domain.Entities.Base.History;
namespace PARR.Domain.Common.Rabbit.Messages
{
/// <summary>
/// Модель в MQ, простого создания Template
/// </summary>
public class TemplateGeneratorMq
{
/// <summary>
/// Id регламентной работы
/// </summary>
public Guid JobId { get; set; }
/// <summary>
/// Id Юнита(единицы обслуживания)/ЭК
/// </summary>
public Guid UnitId { get; set; }
/// <summary>
/// Актировать шаблон при инициализации
/// </summary>
public bool? IsActiveTemplate { get; set; }
/// <summary>
/// Актировать расписание при инициализации
/// </summary>
public bool? IsActiveSchedule { get; set; }
/// <summary>
/// Инициатор запроса к генератору
/// </summary>
public HistoryInitiator? HistoryInitiator { get; set; }
/// <summary>
/// Связанные ЭК для сгруппированного типа JobGroup
/// </summary>
public required List<Guid> UnitsInTemplate { get; set; }
/// <summary>
/// Индекс, используется в групповых шаблонах
/// </summary>
public int? Index { get; set; }
}
}

View File

@@ -0,0 +1,13 @@
using PARR.Domain.Entities.Base.History;
using PARR.Domain.Enums;
namespace PARR.Domain.Common.Rabbit.Messages
{
public class TemplateMatcherMq
{
public Guid Id { get; set; }
public SyncTaskEntityTypeEnum EntityType { get; set; }
public TemplateMatcherActionEnum Action { get; set; }
public required HistoryInitiator Initiator { get; set; }
}
}

View File

@@ -0,0 +1,13 @@
namespace PARR.Domain.Common.Rabbit.Messages
{
/// <summary>
/// Модель в MQ, генератора заданий на генерацию шаблонов
/// </summary>
public class TemplateTaskGeneratorMq
{
/// <summary>
/// Id регламентной работы
/// </summary>
public Guid JobId { get; set; }
}
}

View File

@@ -0,0 +1,58 @@
using PARR.Domain.Entities.Base.History;
using PARR.Domain.Enums;
namespace PARR.Domain.Common.Rabbit.Messages
{
public class TemplateUpdaterMq
{
public Guid TemplateId { get; set; }
/// <summary>
/// Id регламентной работы
/// </summary>
public Guid JobId { get; set; }
public required string Name { get; set; }
/// <summary>
/// Актировать шаблон при инициализации
/// </summary>
public bool IsActiveTemplate { get; set; }
/// <summary>
/// Актировать расписание при инициализации
/// </summary>
public bool IsActiveSchedule { get; set; }
//public DateTimeOffset? LastRun { get; set; }
//public DateTimeOffset NextRun { get; set; }
/// <summary>
/// Это новый шаблон? (true - перемещаем существующий в новый Job) (false - шаблон остается в своем Job)
/// </summary>
public bool IsNew { get; set; }
/// <summary>
/// Id Юнита(единицы обслуживания)/ЭК
/// </summary>
public Guid UnitId { get; set; }
/// <summary>
/// Индекс, используется в групповых шаблонах
/// </summary>
public int? Index { get; set; }
public TemplateStatusTypeEnum StatusTypeId { get; set; }
/// <summary>
/// Инициатор запроса к генератору
/// </summary>
public required HistoryInitiator Initiator { get; set; }
/// <summary>
/// Связанные ЭК для сгруппированного типа JobGroup
/// </summary>
public required List<Guid> UnitsInTemplate { get; set; }
}
}

View File

@@ -0,0 +1,18 @@
namespace PARR.Domain.Common.Rabbit
{
/// <summary>
/// Результат отправки очереди в MQ
/// </summary>
public record RabbitSendResult
{
/// <summary>
/// Результат отправки
/// </summary>
public bool IsSuccess { get; init; }
/// <summary>
/// Неотправленные сообщения
/// </summary>
public string[]? NotSendMessages { get; init; }
}
}

View File

@@ -0,0 +1,44 @@
namespace PARR.Domain.Common.Roles
{
/// <summary>
/// Роли ПАРР
/// </summary>
public static class ParrRoles
{
// Подробнее о авторизации в документации в разделе Авторизация
private const string Base = Administrator.Role + ",";
/// <summary>
/// Роль: Администратор
/// </summary>
public static class Administrator
{
public const string Role = "administrator";
public const string Description = "Администратор";
}
/// <summary>
/// Роль: agent Агент
/// </summary>
public static class Agent
{
public const string Role = "agent";
public const string RoleOrAdmin = Base + Role;
public const string Description = "Агент";
}
/// <summary>
/// Роль: espp-robot Робот ЕСПП
/// </summary>
public static class EsppRobot
{
public const string Role = "espp-robot";
public const string RoleOrAdmin = Base + Role;
public const string Description = "Робот ЕСПП";
}
}
}

View File

@@ -0,0 +1,14 @@
namespace PARR.Domain.DTOs.RabbitApi
{
/// <summary>
/// Ответ от API RabbitMQ
/// </summary>
public record RabbitApiResult
{
public bool IsSuccess { get; init; }
public object? Response { get; init; }
public Exception? Exception { get; init; }
}
}

View File

@@ -0,0 +1,13 @@
namespace PARR.Domain.Enums
{
/// <summary>
/// Тип периода распределения РР
/// </summary>
public enum DistributionPeriodTypeEnum
{
Day,
Month,
Year
//TimeSpan
}
}

View File

@@ -0,0 +1,33 @@
namespace PARR.Domain.Enums
{
/// <summary>
/// Статус Наряда в ЕСПП
/// </summary>
public enum OrderStatusEnum
{
/// <summary>
/// 1-Направлен в группу
/// </summary>
New = 1,
/// <summary>
/// 2-В работе
/// </summary>
InWork = 2,
/// <summary>
/// 3-Приостановлен
/// </summary>
Stop = 3,
/// <summary>
/// 4-Выполнен
/// </summary>
Complete = 4,
/// <summary>
/// 5-Закрыт
/// </summary>
Closed = 5
}
}

View File

@@ -0,0 +1,28 @@
namespace PARR.Domain.Enums
{
/// <summary>
/// Список всех роботов (в бд нет 3, 4)
/// </summary>
public enum RobotsAllEnum //: RobotsEnum
{
/// <summary>
/// Робот по созданию/изменению шаблона наряда ЕСПП
/// </summary>
TemplateOrder = 1,
/// <summary>
/// Робот по созданию/изменению расписания шаблона наряда в ЕСПП
/// </summary>
ScheduleOrder = 2,
/// <summary>
/// Робот экспорта шаблонов из ЕСПП в ПАРР
/// </summary>
TemplatesExport = 3,
/// <summary>
/// Робот экспорта расписаний из ЕСПП в ПАРР
/// </summary>
ScheduleExport = 4
}
}

View File

@@ -0,0 +1,18 @@
namespace PARR.Domain.Enums
{
/// <summary>
/// Список роботов
/// </summary>
public enum RobotsEnum
{
/// <summary>
/// Робот по созданию/изменению шаблона наряда ЕСПП
/// </summary>
TemplateOrder = 1,
/// <summary>
/// Робот по созданию/изменению расписания шаблона наряда в ЕСПП
/// </summary>
ScheduleOrder = 2
}
}

View File

@@ -0,0 +1,15 @@
using System.Text.Json.Serialization;
namespace PARR.Domain.Enums
{
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ShortcodeTypeEnum
{
Static,
Standard,
Relationship,
FieldValue,
GroupValue,
Transform
}
}

View File

@@ -0,0 +1,13 @@
using System.Text.Json.Serialization;
namespace PARR.Domain.Enums
{
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum SyncTaskEntityTypeEnum
{
Job,
JobGroup,
Template
}
}

View File

@@ -0,0 +1,70 @@
namespace PARR.Domain.Enums
{
//todo: удалить!!!
/// <summary>
/// Действия с шаблонами/расписаниями для TemplateActivator
/// </summary>
public enum TemplateActivatorActionsEnum
{
/// <summary>
/// Активировать все шаблоны
/// </summary>
ActivateAllTemplates = 0,
/// <summary>
/// Активировать шаблоны у которых активировано расписание
/// </summary>
ActivateTemplatesWithActiveSchedules = 1,
/// <summary>
/// Деактивировать все шаблоны
/// </summary>
DeactivateAllTemplates = 2,
/// <summary>
/// Деактивировать шаблоны у которынх деактивировано расписание
/// </summary>
DeactivateTemplatesWithDeactivationSchedules = 3,
/// <summary>
/// Активировать все расписания
/// </summary>
ActivateAllSchedules = 4,
/// <summary>
/// Деактивировать все расписания
/// </summary>
DeactivateAllSchedules = 5,
/// <summary>
/// Активировать все расписания у которых активированы шаблоны
/// </summary>
ActivateSchedulesWithActiveTemplates = 6,
/// <summary>
/// Деактивировать все расписания у которых деактивированы шаблоны
/// </summary>
DeactivateSchedulesWithDeactivationTemplates = 7,
/// <summary>
/// Деактивировать расписания у которых шаблоны синхронизированы с ошибкой
/// </summary>
DeactivateSchedulesWithTemplateSyncErrors = 8,
/// <summary>
/// Деактивировать в соответствии с настройками авто-контроля
/// </summary>
DeactivateAllForAutoControl = 9,
/// <summary>
/// Активировать в соответствии с настройками авто-контроля
/// </summary>
ActivateAllForAutoControl = 10
//только в интерфейсе:
//активировать все шаблоны и расписания (отправлю 2 запроса)
//деактивировать все шаблоны и расписания (отправлю 2 запроса)
}
}

View File

@@ -0,0 +1,21 @@
using System.Text.Json.Serialization;
namespace PARR.Domain.Enums
{
/// <summary>
/// Объект воздействия активатора
/// </summary>
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum TemplateActivatorEsppObjectTypesEnum
{
/// <summary>
/// Шаблон
/// </summary>
Template=0,
/// <summary>
/// Расписание
/// </summary>
Schedule =1,
}
}

View File

@@ -0,0 +1,20 @@
using System.Text.Json.Serialization;
namespace PARR.Domain.Enums
{
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum TemplateMatcherActionEnum
{
/// <summary>
/// Только сгенерировать недостающие шаблоны(можно использовать IsUnused).
/// Создать недостающие шаблоны, перепривязать к нужному Job в рамках одного JobGroup.
/// Выключить+включить в соответствии с настройками фильтров.
/// Полное соответвие Template к Job.
/// </summary>
Sync = 0,
/// <summary>
/// Только меняет имя шаблона
/// </summary>
Update = 1
}
}

View File

@@ -0,0 +1,25 @@
namespace PARR.Domain.Enums
{
public enum TemplateStatusTypeEnum
{
/// <summary>
/// Шаблон используется
/// </summary>
Used = 0,
/// <summary>
/// Шаблон не используется
/// </summary>
Unused = 1,
/// <summary>
/// Шаблон в статусе обновления
/// </summary>
Updating = 2,
/// <summary>
/// Шаблон в статусе ошибки
/// </summary>
Error = 3
}
}

View File

@@ -7,9 +7,8 @@
</PropertyGroup>
<ItemGroup>
<Folder Include="DTOs\" />
<Folder Include="Common\Rabbit\Events\" />
<Folder Include="Exceptions\" />
<Folder Include="Settings\" />
</ItemGroup>
<ItemGroup>

View File

@@ -0,0 +1,27 @@
namespace PARR.Domain.Settings
{
/// <summary>
/// Поля настроек MQ, используется для appsettings.json
/// </summary>
public interface IMqSettings
{
string HostName { get; init; }
string QueueName { get; init; }
string User { get; init; }
string Password { get; init; }
/// <summary>
/// Кол-во сообщений которые может принимать consumer за один раз. 0 или null - без ограничений
/// </summary>
ushort? PrefetchCount { get; init; }
}
public record MqSettingsBase : IMqSettings
{
public string HostName { get; init; } = string.Empty;
public string QueueName { get; init; } = string.Empty;
public string User { get; init; } = string.Empty;
public string Password { get; init; } = string.Empty;
public ushort? PrefetchCount { get; init; } = 0;
}
}