diff --git a/PARR.DAL/Services/Implementations/TemplateService.cs b/PARR.DAL/Services/Implementations/TemplateService.cs index 731e797f..5f34b4b9 100644 --- a/PARR.DAL/Services/Implementations/TemplateService.cs +++ b/PARR.DAL/Services/Implementations/TemplateService.cs @@ -109,64 +109,61 @@ namespace PARR.DAL.Services.Implementations } - public async Task ReserveUnusedTemplateAsync(Guid newUnitId, Guid newJobId, HistoryInitiator initiator) + public async Task ReserveUnusedTemplateAsync(Guid newUnitId, HistoryInitiator initiator) { - logger.LogDebug("Резервирую неиспользуемый шаблон с проверкой конфигураций роботов для UnitId: {UnitId}, JobId: {JobId}", newUnitId, newJobId); + logger.LogDebug("Резервирую неиспользуемый шаблон с проверкой конфигураций роботов для UnitId: {UnitId}", newUnitId); var sql = @" - UPDATE ""Templates"" - SET ""StatusTypeId"" = @NewStatus, - ""DateModified"" = @DateModified, - ""UnitId"" = @NewUnitId, - ""JobId"" = @NewJobId, - ""InitiatorIp"" = @InitiatorIp, - ""InitiatorParrComponentId"" = @InitiatorComponent, - ""InitiatorComment"" = @InitiatorComment - WHERE ""Id"" = ( - SELECT t.""Id"" - FROM ""Templates"" t - WHERE t.""StatusTypeId"" = @OldStatus - AND t.""UnitId"" != @NewUnitId - AND EXISTS ( - SELECT 1 - FROM ""RobotConfigurations"" rc - WHERE rc.""TemplateId"" = t.""Id"" - AND rc.""RobotCode"" = @RobotCode1 - AND rc.""TaskStatusCode"" = @TaskStatus - AND rc.""RobotStatusCode"" = @RobotStatus - ) - AND EXISTS ( - SELECT 1 - FROM ""RobotConfigurations"" rc - WHERE rc.""TemplateId"" = t.""Id"" - AND rc.""RobotCode"" = @RobotCode2 - AND rc.""TaskStatusCode"" = @TaskStatus - AND rc.""RobotStatusCode"" = @RobotStatus - ) - ORDER BY t.""DateCreated"" ASC - LIMIT 1 - ) - RETURNING ""Id"";"; + UPDATE ""Templates"" + SET ""StatusTypeId"" = @NewStatus, + ""DateModified"" = @DateModified, + ""InitiatorIp"" = @InitiatorIp, + ""InitiatorParrComponentId"" = @InitiatorComponent, + ""InitiatorComment"" = @InitiatorComment + WHERE ""Id"" = ( + SELECT t.""Id"" + FROM ""Templates"" t + WHERE t.""StatusTypeId"" = @OldStatus + AND t.""UnitId"" != @NewUnitId + AND EXISTS ( + SELECT 1 + FROM ""RobotConfigurations"" rc + WHERE rc.""TemplateId"" = t.""Id"" + AND rc.""RobotCode"" = @RobotCode1 + AND rc.""TaskStatusCode"" = @TaskStatus + AND rc.""RobotStatusCode"" = @RobotStatus + ) + AND EXISTS ( + SELECT 1 + FROM ""RobotConfigurations"" rc + WHERE rc.""TemplateId"" = t.""Id"" + AND rc.""RobotCode"" = @RobotCode2 + AND rc.""TaskStatusCode"" = @TaskStatus + AND rc.""RobotStatusCode"" = @RobotStatus + ) + ORDER BY t.""DateCreated"" ASC + LIMIT 1 + ) + RETURNING ""Id"";"; var parameters = new[] { - new NpgsqlParameter("@NewStatus", (int)TemplateStatusTypeEnum.Updating), - new NpgsqlParameter("@DateModified", DateTimeOffset.UtcNow), - new NpgsqlParameter("@NewUnitId", newUnitId), - new NpgsqlParameter("@NewJobId", newJobId), - new NpgsqlParameter("@InitiatorIp", initiator.InitiatorIp ?? (object)DBNull.Value), - new NpgsqlParameter("@InitiatorComponent", - initiator.InitiatorParrComponentId.HasValue - ? (object)(int)initiator.InitiatorParrComponentId.Value - : DBNull.Value), - new NpgsqlParameter("@InitiatorComment", initiator.InitiatorComment ?? (object)DBNull.Value), - new NpgsqlParameter("@OldStatus", (int)TemplateStatusTypeEnum.Unused), - // Параметры для проверки конфигураций роботов - new NpgsqlParameter("@RobotCode1", (int)RobotsEnum.TemplateOrder), - new NpgsqlParameter("@RobotCode2", (int)RobotsEnum.ScheduleOrder), - new NpgsqlParameter("@TaskStatus", (int)TaskStatusEnum.Ok), - new NpgsqlParameter("@RobotStatus", (int)RobotStatusEnum.Complete) - }; + new NpgsqlParameter("@NewStatus", (int)TemplateStatusTypeEnum.Updating), + new NpgsqlParameter("@DateModified", DateTimeOffset.UtcNow), + new NpgsqlParameter("@InitiatorIp", initiator.InitiatorIp ?? (object)DBNull.Value), + new NpgsqlParameter("@InitiatorComponent", + initiator.InitiatorParrComponentId.HasValue + ? (object)(int)initiator.InitiatorParrComponentId.Value + : DBNull.Value), + new NpgsqlParameter("@InitiatorComment", initiator.InitiatorComment ?? (object)DBNull.Value), + new NpgsqlParameter("@OldStatus", (int)TemplateStatusTypeEnum.Unused), + new NpgsqlParameter("@NewUnitId", newUnitId), + // Параметры для проверки конфигураций роботов + new NpgsqlParameter("@RobotCode1", (int)RobotsEnum.TemplateOrder), + new NpgsqlParameter("@RobotCode2", (int)RobotsEnum.ScheduleOrder), + new NpgsqlParameter("@TaskStatus", (int)TaskStatusEnum.Ok), + new NpgsqlParameter("@RobotStatus", (int)RobotStatusEnum.Complete) + }; try { @@ -178,19 +175,19 @@ namespace PARR.DAL.Services.Implementations if (reservedTemplateId != default(Guid)) { - logger.LogInformation("Успешно зарезервирован шаблон с ID: {TemplateId} для UnitId: {UnitId}, JobId: {JobId}", - reservedTemplateId, newUnitId, newJobId); + logger.LogInformation("Успешно зарезервирован шаблон с ID: {TemplateId} для UnitId: {UnitId}", + reservedTemplateId, newUnitId); } else { - logger.LogDebug("Не удалось зарезервировать шаблон для UnitId: {UnitId}, JobId: {JobId} (не найдено подходящих конфигураций роботов)", newUnitId, newJobId); + logger.LogDebug("Не удалось зарезервировать шаблон для UnitId: {UnitId} (не найдено подходящих конфигураций роботов)", newUnitId); } return reservedTemplateId; } catch (Exception ex) { - logger.LogError(ex, "Ошибка при резервировании шаблона для UnitId: {UnitId}, JobId: {JobId}", newUnitId, newJobId); + logger.LogError(ex, "Ошибка при резервировании шаблона для UnitId: {UnitId}", newUnitId); throw; } } diff --git a/PARR.DAL/Services/Interfaces/ITemplateService.cs b/PARR.DAL/Services/Interfaces/ITemplateService.cs index 31bd1385..231493e4 100644 --- a/PARR.DAL/Services/Interfaces/ITemplateService.cs +++ b/PARR.DAL/Services/Interfaces/ITemplateService.cs @@ -8,18 +8,18 @@ namespace PARR.DAL.Services.Interfaces { Task GetTemplateByNameAsync(string name); + /// - /// Резервирует неиспользуемый шаблон для указанного ЭК и работы. - /// Для корректного расчета NextRun назначает захваченному шаблону ЭК и работу + /// Резервирует неиспользуемый шаблон: устанавливает статус + /// и фиксирует данные инициатора. /// - /// Id ЭК. - /// Id работы. + /// Идентификатор подразделения (используется для фильтрации и логирования). /// Данные инициатора операции. /// - /// Id зарезервированного шаблона или , + /// Идентификатор зарезервированного шаблона или , /// если подходящий шаблон не найден. /// - Task ReserveUnusedTemplateAsync(Guid newUnitId, Guid newJobId, HistoryInitiator initiator); + Task ReserveUnusedTemplateAsync(Guid newUnitId, HistoryInitiator initiator); IQueryable