using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using PARR.API.Contracts.V1; using PARR.API.Contracts.V1.Requests.Queries; using PARR.API.Controllers.V1.Base; using PARR.API.Services.Interfaces; using PARR.Constants; using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces.Unit; 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) { return Ok("Метод не реализован"); ////ПАРР-ДВС-ПТК__ВРТ-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); } } }