fix(dal): Исправлен метод захвата заданий роботом. Теперь правильно захватываются зависшие задачи.

This commit is contained in:
Mikhail Trubnikov
2026-05-27 08:19:20 +10:00
parent b952a83ab3
commit c67f12081e

View File

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