using AutoMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using PARR.API.Contracts.V1; using PARR.API.Contracts.V1.Requests.BaseRequests; using PARR.API.Contracts.V1.Requests.Queries; 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.API.Helpers; using PARR.Constants; using PARR.DAL.Models; using PARR.DAL.Services.Interfaces; namespace PARR.API.Controllers.V1.Statistics { /// /// Статистика по истории робота /// [Authorize(Roles = ParrRoles.Administrator.Role)] public class StatRobotHistoryController : BaseApiController { private readonly IRobotHistoryService robotHistoryService; private readonly IRobotHistoryLevelService robotHistoryLevelService; private readonly IMapper mapper; public StatRobotHistoryController( IRobotHistoryService robotHistoryService, IRobotHistoryLevelService robotHistoryLevelService, IMapper mapper ) { this.robotHistoryService = robotHistoryService; this.robotHistoryLevelService = robotHistoryLevelService; this.mapper = mapper; } /// /// Статистика истории роботов /// /// [HttpGet(ApiRoutes.StatRobotHistory.Get)] public async Task Get([FromQuery] StatRobotHistoryQuery request, [FromQuery] TimeZoneOffsetClient timeZoneQuery) { if (!request.Date.HasValue) request.Date = DateOnly.FromDateTime(DateTimeOffset.UtcNow.Date); // всего var allStat = await robotHistoryService.Get() .GroupBy(t => t.HistoryLevel) .Select(t => new { HistoryLevel = t.Key, Count = t.Count() }) .ToListAsync(); // Формируем диапазон в пользовательском времени var userDateStart = new DateTimeOffset(request.Date.Value.Year, request.Date.Value.Month, request.Date.Value.Day, 0, 0, 0, timeZoneQuery.TimeZoneOffset); var userDateEnd = userDateStart.AddDays(1); // Конвертируем в UTC для сравнения с БД var utcStart = userDateStart.UtcDateTime; var utcEnd = userDateEnd.UtcDateTime; // за дату var dateStat = await robotHistoryService.Get() //.Where(t => t.DateCreated.DateTime.Date == request.Date.Value.Date) //.Where(t => t.DateCreated.UtcDateTime >= utcStart && t.DateCreated.UtcDateTime < utcEnd) .FilterByDateRangeUtc(t => t.DateCreated, utcStart, utcEnd) .GroupBy(t => t.HistoryLevel) .Select(t => new { HistoryLevel = t.Key, Count = t.Count() }) .ToListAsync(); IQueryable levelsQuery = robotHistoryLevelService.Get(); if (request.HistoryLevel.HasValue) levelsQuery = levelsQuery.Where(t => t.Level == (int)request.HistoryLevel.Value); var levels = await levelsQuery.OrderBy(t => t.Level).ToListAsync(); var response = new List(); foreach (var level in levels) { response.Add(new StatRobotHistoryResponse { AllCount = allStat.FirstOrDefault(t => t.HistoryLevel == level.Level)?.Count ?? 0, DateCount = dateStat.FirstOrDefault(t => t.HistoryLevel == level.Level)?.Count ?? 0, Date = request.Date.Value, Level = mapper.Map(level) }); } return Ok(new Response>(response, true)); } } }