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;
+ }
+
+
}
}