feat(api): Выдача заданий агенту.
This commit is contained in:
111
PARR.API/Controllers/V1/AgentTaskController.cs
Normal file
111
PARR.API/Controllers/V1/AgentTaskController.cs
Normal file
@@ -0,0 +1,111 @@
|
||||
using AutoMapper;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using PARR.API.Contracts.V1;
|
||||
using PARR.API.Contracts.V1.Requests.Queries;
|
||||
using PARR.API.Contracts.V1.Responses;
|
||||
using PARR.API.Contracts.V1.Responses.Base;
|
||||
using PARR.API.Controllers.V1.Base;
|
||||
using PARR.API.Services.Interfaces;
|
||||
using PARR.DAL.Contracts;
|
||||
using PARR.DAL.Services.Interfaces;
|
||||
using PARR.DAL.TransformServices;
|
||||
|
||||
namespace PARR.API.Controllers.V1
|
||||
{
|
||||
/// <summary>
|
||||
/// Выдает задания Агенту сервера
|
||||
/// </summary>
|
||||
public class AgentTaskController : BaseApiController
|
||||
{
|
||||
private readonly IMapper mapper;
|
||||
private readonly IClientService clientService;
|
||||
private readonly ITemplateService templateService;
|
||||
private readonly IEsppScheduleTransformService esppScheduleTransformService;
|
||||
private readonly ILogger<AgentTaskController> logger;
|
||||
|
||||
public AgentTaskController(
|
||||
IMapper mapper,
|
||||
IClientService clientService,
|
||||
ITemplateService templateService,
|
||||
IEsppScheduleTransformService esppScheduleTransformService,
|
||||
ILogger<AgentTaskController> logger
|
||||
)
|
||||
{
|
||||
this.mapper = mapper;
|
||||
this.clientService = clientService;
|
||||
this.templateService = templateService;
|
||||
this.esppScheduleTransformService = esppScheduleTransformService;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Список заданий агенту по ip-адресу клиента исполнителя
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet(ApiRoutes.AgentTask.GetByIp)]
|
||||
public async Task<IActionResult> GetByClientIp([FromQuery] AgentTaskGetByIpQuery request)
|
||||
{
|
||||
//ПАРР-ДВС-ПТК__ВРТ-DVGD-SDMI-WEB-01-ДВС__ПРОЧЕЕ(РАБОТЫ)
|
||||
//10.99.253.65
|
||||
//2023-10-16
|
||||
|
||||
var ip = request.Ip ?? clientService.GetClientIp()?.ToString();
|
||||
|
||||
if (string.IsNullOrEmpty(ip))
|
||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Client IP address is null." } }));
|
||||
|
||||
var date = request.Date ?? DateTimeOffset.UtcNow;
|
||||
|
||||
//Агент получает задания, если `IsAgent = true`, шаблон и расписания активны, и статус синхронизации шаблона и расписания `= Ok`, и `NextRun = сегодня`.
|
||||
|
||||
// С одним IP может быть несколько информационных систем, так что может быть несколько хостов
|
||||
var templates = await templateService.Get()
|
||||
.Include(t => t.RobotConfigurations)
|
||||
.Include(t => t.ApplicationsInWork)
|
||||
.Include(t => t.Host)
|
||||
.Where(t => t.Host!.IP == ip
|
||||
&& t.ApplicationsInWork!.IsAgent == true
|
||||
&& t.IsActiveTemplate == true
|
||||
&& t.IsActiveSchedule == true
|
||||
&& t.ApplicationsInWork!.NextRun.DateTime.Date == date.Date.Date
|
||||
&& t.RobotConfigurations.All(c => c.TaskStatusCode == (int)TaskStatusEnum.Ok)
|
||||
).ToListAsync();
|
||||
|
||||
if (!templates.Any())
|
||||
return NoContent();
|
||||
|
||||
// запросить расписание на день для каждого шаблона и сформировать из него список
|
||||
//TODO: идти в appInWorks и отуда формировать список заданий. Так же, как делать если время у заданий совпадает?
|
||||
|
||||
var response = new AgentTaskMinResponse
|
||||
{
|
||||
Scheduled = new List<AgentTaskMinScheduleResponse>()
|
||||
};
|
||||
|
||||
foreach (var template in templates)
|
||||
{
|
||||
var templateSchedule = await esppScheduleTransformService.GetNextScheduleAsync(template.ApplicationInWorkId, template.ApplicationsInWork!.LastRun ?? template.ApplicationsInWork!.NextRun);
|
||||
|
||||
if (!templateSchedule.Any())
|
||||
{
|
||||
logger.LogWarning($"Запросили рапсисание для агента по LastRun и вернулся пустой список! Такого не должно быть! " +
|
||||
$"ApplicationInWorkId: {template.ApplicationInWorkId}, latRun: {template.ApplicationsInWork!.LastRun}, NextRun: {template.ApplicationsInWork!.NextRun}, ip: {ip}, date: {date}");
|
||||
continue;
|
||||
}
|
||||
|
||||
// TODO: проверку что в бд есть поля AgentName, AgentScript
|
||||
templateSchedule.ForEach(item => response.Scheduled.Add(new AgentTaskMinScheduleResponse { Name = template.ApplicationsInWork!.AgentName, Script = template.ApplicationsInWork!.AgentScript, StartAt = item }));
|
||||
}
|
||||
|
||||
// отсортировать потом по дате
|
||||
|
||||
// минимальный респонс
|
||||
|
||||
return Ok(response);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -138,7 +138,9 @@ namespace PARR.API.Controllers.V1
|
||||
// передаем LastRun, если его нет, то NextRun
|
||||
var nextRun = await esppScheduleTransformService.GetNextDateAsync(task.Template!.ApplicationInWorkId, task.Template.ApplicationsInWork!.LastRun ?? task.Template.ApplicationsInWork.NextRun);
|
||||
|
||||
appInWorks.LastRun = appInWorks.NextRun;
|
||||
if (appInWorks.LastRun != null)
|
||||
appInWorks.LastRun = appInWorks.NextRun;
|
||||
|
||||
appInWorks.NextRun = nextRun;
|
||||
|
||||
await robotConfigurationService.CommitAsync();
|
||||
|
||||
Reference in New Issue
Block a user