using Microsoft.AspNetCore.Authorization; 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.Constants; using PARR.DAL.Contracts; using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces.Unit; using PARR.DAL.TransformServices; namespace PARR.API.Controllers.V1 { /// /// Выдает задания Агенту сервера /// [Authorize(Roles = ParrRoles.Agent.RoleOrAdmin)] public class AgentTaskController : BaseApiController { private readonly IClientService clientService; private readonly ITemplateService templateService; private readonly IUnitService unitService; private readonly IEsppScheduleTransformService esppScheduleTransformService; private readonly ILogger logger; public AgentTaskController( IClientService clientService, ITemplateService templateService, IUnitService unitService, IEsppScheduleTransformService esppScheduleTransformService, ILogger logger ) { this.clientService = clientService; this.templateService = templateService; this.unitService = unitService; this.esppScheduleTransformService = esppScheduleTransformService; this.logger = logger; } /// /// Список заданий агенту по ip-адресу клиента исполнителя /// /// /// [HttpGet(ApiRoutes.AgentTask.GetByIp)] public async Task 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 { new ErrorModel { Message = "Client IP address is null." } })); //var date = request.Date ?? DateTimeOffset.UtcNow; var date = DateTimeOffset.UtcNow; //Агент получает задания, если `IsAgent = true`, шаблон и расписания активны, и статус синхронизации шаблона и расписания `= Ok`, и `NextRun = сегодня`, так же если у ApplicationInWork есть расписание. // С одним IP может быть несколько информационных систем, так что может быть несколько хостов var units = await unitService.GetWithIncludes().AsNoTracking().Where(t => t.UnitValues.Any(v => v.Field!.AihitName == "IP_АДРЕС" && v.Value!.Value == ip)).ToListAsync(); var templates = await templateService.Get() .Include(t => t.RobotConfigurations) .Include(t => t.Job) .ThenInclude(t=>t!.Group) .ThenInclude(t => t!.EsppSchValues) .Include(t => t.Unit) .Where(t => units.Any(u=>u.Id == t.UnitId) //&& t.ApplicationsInWork!.IsAgent == true//TODO Migration to job && t.IsActiveTemplate == true && t.IsActiveSchedule == true //&& t.ApplicationsInWork!.NextRun.DateTime.Date == date.Date.Date && t.NextRun.DateTime.Date == date.Date.Date && t.RobotConfigurations.All(c => c.TaskStatusCode == (int)TaskStatusEnum.Ok) && t.Job!.Group!.EsppSchValues.Any()//.ApplicationsInWork.EsppSchValues.Any() ).ToListAsync(); if (!templates.Any()) return NoContent(); var response = new AgentTaskMinResponse { Scheduled = new List() }; foreach (var template in templates) { //var templateSchedule = await esppScheduleTransformService.GetNextScheduleAsync(template.ApplicationInWorkId, template.ApplicationsInWork!.LastRun ?? template.ApplicationsInWork!.NextRun); var templateSchedule = await esppScheduleTransformService.GetNextScheduleAsync(template.Job!.GroupId, template.NextRun); if (!templateSchedule.Any()) { logger.LogWarning($"Запросили раписание для агента по NextRun и вернулся пустой список! Такого не должно быть! " + $"JobGroupId: {template.Job.GroupId}, latRun: {template.LastRun}, NextRun: {template.NextRun}, ip: {ip}, date: {date}"); continue; } if (string.IsNullOrEmpty(template.Job.Group!.AgentName) && string.IsNullOrEmpty(template.Job.Group!.AgentScript)) { logger.LogWarning($"Запросили задание для агента с пустыми значениями AgentName && AgentScript. Такого не должно быть! " + $"JobGroupId: {template.Job.GroupId}, AgentName: {template.Job.Group.AgentName}, AgentScript: {template.Job.Group.AgentScript} , ip: {ip}, date: {date}"); continue; } templateSchedule.ForEach(item => response.Scheduled.Add(new AgentTaskMinScheduleResponse { Name = template.Job.Group.AgentName ?? "", Script = template.Job.Group.AgentScript ?? "", StartAt = item, TemplateId = template.Id })); } if (!response.Scheduled.Any()) return NoContent(); response.Scheduled = response.Scheduled.OrderBy(t => t.StartAt).ToList(); logger.LogInformation($"Агент с IP-адресом {ip} получил задания: [{string.Join(';', response.Scheduled.Select(s => $"StartAt:{s.StartAt}, Name:{s.Name}, TemplateId:{s.TemplateId}"))}]"); return Ok(response); } } }