2023-09-01 12:40:41 +10:00
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
|
using PARR.DAL.Context;
|
2023-10-04 12:00:43 +10:00
|
|
|
|
using PARR.DAL.Contracts;
|
2023-09-01 12:40:41 +10:00
|
|
|
|
using PARR.DAL.Models;
|
|
|
|
|
|
using PARR.DAL.Services.Abstracts;
|
|
|
|
|
|
using PARR.DAL.Services.Interfaces;
|
|
|
|
|
|
|
|
|
|
|
|
namespace PARR.DAL.Services.Implementations
|
|
|
|
|
|
{
|
|
|
|
|
|
internal class TemplateService : BaseService<Template>, ITemplateService
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly DataContext dataContext;
|
|
|
|
|
|
private readonly ILogger<TemplateService> logger;
|
|
|
|
|
|
|
|
|
|
|
|
protected override DbSet<Template> EntitySet => dataContext.Templates;
|
|
|
|
|
|
|
|
|
|
|
|
protected override DataContext EntitiContext => dataContext;
|
|
|
|
|
|
|
|
|
|
|
|
public TemplateService(DataContext dataContext, ILogger<TemplateService> logger) : base(logger)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.dataContext = dataContext;
|
|
|
|
|
|
this.logger = logger;
|
|
|
|
|
|
}
|
2023-09-01 16:19:32 +10:00
|
|
|
|
|
|
|
|
|
|
public async Task<Template?> GetTemplateByNameAsync(string name)
|
|
|
|
|
|
{
|
2023-09-21 15:54:46 +10:00
|
|
|
|
return await GetWithIncludes().FirstOrDefaultAsync(t => t.Name == name);
|
2023-09-01 16:19:32 +10:00
|
|
|
|
}
|
2023-09-19 16:42:06 +10:00
|
|
|
|
|
|
|
|
|
|
public IQueryable<Template> GetWithIncludes()
|
|
|
|
|
|
{
|
|
|
|
|
|
return Get()
|
|
|
|
|
|
.Include(h => h.Host)
|
2023-09-28 14:28:10 +10:00
|
|
|
|
.ThenInclude(t => t!.ResponseArea)
|
|
|
|
|
|
.Include(h => h.Host)
|
|
|
|
|
|
.ThenInclude(t => t!.EkStatus)
|
2023-10-04 12:00:43 +10:00
|
|
|
|
.Include(r => r.RobotStatus)
|
2023-09-19 16:42:06 +10:00
|
|
|
|
.Include(a => a.ApplicationsInWork)
|
|
|
|
|
|
.ThenInclude(w => w!.Work)
|
|
|
|
|
|
.ThenInclude(t => t!.Tnk)
|
|
|
|
|
|
.ThenInclude(s => s!.Subprocess)
|
|
|
|
|
|
.ThenInclude(p => p!.Process);
|
|
|
|
|
|
}
|
2023-10-04 12:00:43 +10:00
|
|
|
|
|
2023-10-05 16:56:02 +10:00
|
|
|
|
//TODO: удалить этот метод
|
|
|
|
|
|
#region delete
|
2023-10-04 12:00:43 +10:00
|
|
|
|
public async Task CheckAndSetErrorRobotStatusAsync(int robotAttemptsNumber, TimeSpan robotWaitTime)
|
|
|
|
|
|
{
|
|
|
|
|
|
//Ищем `RobotStatusCode` = 22 и `RobotLastStatusUpdated` истекло и `RobotAttemptsNumber` >= допустимого значения из настроек,
|
|
|
|
|
|
//ставим всем этим записям `RobotStatusCode`= 33
|
|
|
|
|
|
|
|
|
|
|
|
var endDate = DateTimeOffset.UtcNow.Add(-robotWaitTime);
|
|
|
|
|
|
|
|
|
|
|
|
var templates = await EntitySet.Where(t =>
|
|
|
|
|
|
t.RobotStatusCode == (int)RobotStatusEnum.InProgress
|
|
|
|
|
|
&& t.RobotAttemptsNumber >= robotAttemptsNumber
|
|
|
|
|
|
&& t.RobotLastStatusUpdated <= endDate
|
|
|
|
|
|
)
|
|
|
|
|
|
.ToListAsync();
|
|
|
|
|
|
|
|
|
|
|
|
if (!templates.Any())
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var template in templates)
|
|
|
|
|
|
{
|
|
|
|
|
|
template.RobotStatusCode = (int)RobotStatusEnum.Error;
|
|
|
|
|
|
template.DateModified = DateTimeOffset.UtcNow;
|
|
|
|
|
|
logger.LogInformation($"Устанавливаю RobotStatus: {RobotStatusEnum.Error} для шаблона {template.Name}");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var result = await CommitAsync();
|
|
|
|
|
|
|
|
|
|
|
|
if (!result)
|
|
|
|
|
|
logger.LogError($"Ошибка при сохранении изменений RobotStatus у шаблонов на {RobotStatusEnum.Error}");
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2023-10-05 16:56:02 +10:00
|
|
|
|
#endregion
|
2023-10-04 13:41:33 +10:00
|
|
|
|
|
|
|
|
|
|
public void ChangeRobotStatus(RobotStatusEnum status, ref Template template)
|
|
|
|
|
|
{
|
|
|
|
|
|
template.RobotStatusCode = (int)status;
|
|
|
|
|
|
|
|
|
|
|
|
switch (status)
|
|
|
|
|
|
{
|
|
|
|
|
|
case RobotStatusEnum.InProgress:
|
|
|
|
|
|
template.RobotAttemptsNumber++;
|
|
|
|
|
|
template.RobotLastStatusUpdated = DateTimeOffset.UtcNow;
|
|
|
|
|
|
break;
|
|
|
|
|
|
//case RobotStatusEnum.Error:
|
|
|
|
|
|
// break;
|
|
|
|
|
|
case RobotStatusEnum.Complete:
|
|
|
|
|
|
template.RobotLastStatusUpdated = DateTimeOffset.UtcNow;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case RobotStatusEnum.Wait:
|
|
|
|
|
|
template.RobotLastStatusUpdated = null;
|
|
|
|
|
|
template.RobotAttemptsNumber = 0;
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-10-05 16:56:02 +10:00
|
|
|
|
|
|
|
|
|
|
public override Task<bool> CreateAsync(Template obj)
|
|
|
|
|
|
{
|
|
|
|
|
|
// добавление роботов для шаблона
|
|
|
|
|
|
obj.RobotConfigurations = new List<RobotConfiguration>
|
|
|
|
|
|
{
|
|
|
|
|
|
// робот по управлению шаблоном
|
|
|
|
|
|
new RobotConfiguration
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = Guid.NewGuid(),
|
|
|
|
|
|
DateCreated = DateTimeOffset.UtcNow,
|
|
|
|
|
|
TemplateId = obj.Id,
|
|
|
|
|
|
RobotCode = (int)RobotsEnum.TemplateOrder,
|
|
|
|
|
|
TaskStatusCode = (int)TaskStatusEnum.Creating,
|
|
|
|
|
|
RobotStatusCode = (int)RobotStatusEnum.Wait,
|
|
|
|
|
|
AttemptsNumber = 0,
|
2023-10-06 11:38:33 +10:00
|
|
|
|
LastRobotStatusUpdated = null
|
2023-10-05 16:56:02 +10:00
|
|
|
|
},
|
|
|
|
|
|
// робот по управлениею расписанием
|
|
|
|
|
|
new RobotConfiguration
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = Guid.NewGuid(),
|
|
|
|
|
|
DateCreated = DateTimeOffset.UtcNow,
|
|
|
|
|
|
TemplateId = obj.Id,
|
|
|
|
|
|
RobotCode = (int)RobotsEnum.ScheduleOrder,
|
|
|
|
|
|
TaskStatusCode = (int)TaskStatusEnum.Creating,
|
|
|
|
|
|
RobotStatusCode = (int)RobotStatusEnum.Wait,
|
|
|
|
|
|
AttemptsNumber = 0,
|
2023-10-06 11:38:33 +10:00
|
|
|
|
LastRobotStatusUpdated = null
|
2023-10-05 16:56:02 +10:00
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return base.CreateAsync(obj);
|
|
|
|
|
|
}
|
2023-09-01 12:40:41 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|