diff --git a/PARR.DAL/Repositories/RobotConfigurationRepository.cs b/PARR.DAL/Repositories/RobotConfigurationRepository.cs index dc37a2e7..ad3c63f6 100644 --- a/PARR.DAL/Repositories/RobotConfigurationRepository.cs +++ b/PARR.DAL/Repositories/RobotConfigurationRepository.cs @@ -5,12 +5,18 @@ using PARR.DAL.Context; using PARR.DAL.Repositories.Base; using PARR.Domain.Entities; using PARR.Domain.Enums; +using PARR.Domain.Settings; namespace PARR.DAL.Repositories { internal class RobotConfigurationRepository : BaseRepository, IRobotConfigurationRepository { - public RobotConfigurationRepository(DataContext dataContext, ILogger logger) : base(logger, dataContext) { } + private readonly SettingsFromDb settingsFromDb; + + public RobotConfigurationRepository(DataContext dataContext, ILogger logger, SettingsFromDb settingsFromDb) : base(logger, dataContext) + { + this.settingsFromDb = settingsFromDb; + } public void ChangeTaskStatus(TaskStatusEnum taskStatus, RobotConfiguration configuration) @@ -107,8 +113,21 @@ namespace PARR.DAL.Repositories { // Если задание все еще в статусе Wait (RobotStatusEnum.Wait), установить ему статус "InProgress" + var endDate = DateTimeOffset.UtcNow.Add(-settingsFromDb.RobotWaitTime); + // Выполняем атомарный UPDATE напрямую в базе данных - var affectedRows = await EntitySet.Where(t => t.Id == id && t.RobotStatusCode == (int)RobotStatusEnum.Wait) + var affectedRows = await EntitySet.Where(t => t.Id == id + && ( + // Задания в статусе ожидание + t.RobotStatusCode == (int)RobotStatusEnum.Wait + || ( + // Задание в статусе в работе, но они зависли + t.RobotStatusCode == (int)RobotStatusEnum.InProgress + && t.AttemptsNumber < settingsFromDb.RobotAttemptsNumber + && t.LastRobotStatusUpdated < endDate + ) + ) + ) .ExecuteUpdateAsync(s => s .SetProperty(t => t.RobotStatusCode, (int)RobotStatusEnum.InProgress) .SetProperty(t => t.LastRobotStatusUpdated, DateTimeOffset.UtcNow)