fix(dal): Исправлен метод захвата заданий роботом. Теперь правильно захватываются зависшие задачи.
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user