From 82407910e0962f53ed42a400ebee1474b7000ab0 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Wed, 7 Aug 2024 14:01:47 +1000 Subject: [PATCH] =?UTF-8?q?feat(api):=20=D1=81=D1=82=D0=B0=D1=82=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D0=BA=D0=B0=20=D0=B7=D0=B0=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B8=D0=BE=D0=B4=20=D0=BE=20=D0=B2=D1=8B=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D1=80=D0=BE=D0=B1=D0=BE=D1=82=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.API/Contracts/V1/ApiRoutes.cs | 1 + .../Statistics/StatRobotTaskPeriodResponse.cs | 27 ++++++ .../V1/Statistics/StatRobotTaskController.cs | 92 +++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 PARR.API/Contracts/V1/Responses/Statistics/StatRobotTaskPeriodResponse.cs diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index 864ac14b..8b6182a7 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -184,6 +184,7 @@ public static class StatRobotTask { public const string Get = BaseStat + "/robot-tasks/"; + public const string GetPeriodStatistics = BaseStat + "/robot-tasks/{robot}/period/"; } public static class StatRobotStatus diff --git a/PARR.API/Contracts/V1/Responses/Statistics/StatRobotTaskPeriodResponse.cs b/PARR.API/Contracts/V1/Responses/Statistics/StatRobotTaskPeriodResponse.cs new file mode 100644 index 00000000..3abdd1c6 --- /dev/null +++ b/PARR.API/Contracts/V1/Responses/Statistics/StatRobotTaskPeriodResponse.cs @@ -0,0 +1,27 @@ +namespace PARR.API.Contracts.V1.Responses.Statistics +{ + public class StatRobotTaskPeriodResponse + { + public DateTimeOffset Date { get; set; } + + /// + /// Робот взял заданий на создание + /// + public int Creating { get; set; } + + /// + /// Взял заданий на обновление + /// + public int Updating { get; set; } + + /// + /// Робот успешно выполнил заданий + /// + public int Ok { get; set; } + + /// + /// Ошибок + /// + public int Errors { get; set; } + } +} diff --git a/PARR.API/Controllers/V1/Statistics/StatRobotTaskController.cs b/PARR.API/Controllers/V1/Statistics/StatRobotTaskController.cs index 4bd26c13..54173850 100644 --- a/PARR.API/Controllers/V1/Statistics/StatRobotTaskController.cs +++ b/PARR.API/Controllers/V1/Statistics/StatRobotTaskController.cs @@ -2,12 +2,14 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using NodaTime.Extensions; using PARR.API.Contracts.V1; using PARR.API.Contracts.V1.Responses; using PARR.API.Contracts.V1.Responses.Base; using PARR.API.Contracts.V1.Responses.Statistics; using PARR.API.Controllers.V1.Base; using PARR.Constants; +using PARR.DAL.Contracts; using PARR.DAL.Services.Interfaces; namespace PARR.API.Controllers.V1.Statistics @@ -21,18 +23,21 @@ namespace PARR.API.Controllers.V1.Statistics private readonly IRobotService robotService; private readonly IRobotConfigurationService robotConfigurationService; private readonly ITaskStatusService taskStatusService; + private readonly IRobotHistoryService robotHistoryService; private readonly IMapper mapper; public StatRobotTaskController( IRobotService robotService, IRobotConfigurationService robotConfigurationService, ITaskStatusService taskStatusService, + IRobotHistoryService robotHistoryService, IMapper mapper ) { this.robotService = robotService; this.robotConfigurationService = robotConfigurationService; this.taskStatusService = taskStatusService; + this.robotHistoryService = robotHistoryService; this.mapper = mapper; } @@ -72,5 +77,92 @@ namespace PARR.API.Controllers.V1.Statistics return Ok(new Response>(response, true)); } + + + /// + /// Статистика по заданиям для роботов за период + /// + /// + /// + [HttpGet(ApiRoutes.StatRobotTask.GetPeriodStatistics)] + public async Task GetPeriodStatistics([FromRoute] RobotsEnum robot) + { + int minusHour = 24; + var queryDate = DateTimeOffset.UtcNow.AddHours(-minusHour); + //queryDate = queryDate.Date + new TimeSpan(queryDate.Hour, 0, 0); + //queryDate=queryDate.ToOffset(TimeSpan.Zero); + + + var query = robotHistoryService.Get() + .Include(t => t.RobotConfiguration) + .Where(t => t.RobotConfiguration!.RobotCode == (int)robot && t.DateCreated >= queryDate) + .GroupBy(t => new { Date = t.DateCreated.Date, Hour = t.DateCreated.Hour }) + .Select(t => new + { + Date = t.Key, + Creating = t.Count(c => c.TaskStatusCode == (int)TaskStatusEnum.Creating), + Updating = t.Count(c => c.TaskStatusCode == (int)TaskStatusEnum.Updating), + Ok = t.Count(c => c.TaskStatusCode == (int)TaskStatusEnum.Ok), + Errors = t.Count(c => c.HistoryLevel == (int)RobotHistoryLevelEnum.Error), + }); + + var statistics = await query.ToListAsync(); + + if (!statistics.Any()) + return NoContent(); + + var periodList = GetPeriodList(queryDate, DateTimeOffset.UtcNow); + + //var response = statistics.Select(t => new StatRobotTaskPeriodResponse + //{ + // Date = new DateTimeOffset(t.Date.Date.Year, t.Date.Date.Month, t.Date.Date.Day, t.Date.Hour, 0, 0, new TimeSpan(0)), + // Creating = t.Creating, + // Errors = t.Errors, + // Ok = t.Ok, + // Updating = t.Updating + //}).OrderBy(t => t.Date).ToList(); + + periodList.ForEach(item => + { + var statItem = statistics.FirstOrDefault(t => t.Date.Date == item.Date.Date && t.Date.Hour == item.Date.Hour); + if (statItem != null) + { + item.Errors = statItem.Errors; + item.Creating = statItem.Creating; + item.Updating = statItem.Updating; + item.Ok = statItem.Ok; + } + }); + + return Ok(new Response>(periodList, true)); + } + + private List GetPeriodList(DateTimeOffset start, DateTimeOffset end) + { + var periodList = new List(); + + if (end < start) + return periodList; + + var periodDate = start; + + while (periodDate <= end) + { + periodList.Add(new StatRobotTaskPeriodResponse + { + Creating = 0, + Errors = 0, + Ok = 0, + Updating = 0, + Date = new DateTimeOffset(periodDate.Date.Year, periodDate.Date.Month, periodDate.Date.Day, periodDate.Hour, 0, 0, new TimeSpan(0)), + }); + + periodDate = periodDate.AddHours(1); + } + + return periodList; + } + + } }