From c67f12081e825d106148a2ef100df9201d07c4fa Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Wed, 27 May 2026 08:19:20 +1000 Subject: [PATCH] =?UTF-8?q?fix(dal):=20=D0=98=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=B7=D0=B0=D1=85=D0=B2=D0=B0=D1=82=D0=B0=20=D0=B7=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B9=20=D1=80=D0=BE=D0=B1=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=BC.=20=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE=20=D0=B7=D0=B0=D1=85?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8B=D0=B2=D0=B0=D1=8E=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D1=88=D0=B8=D0=B5=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D1=87=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RobotConfigurationRepository.cs | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) 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)