using AutoMapper; 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.Contracts.V1.Responses.Statistics; using PARR.API.Controllers.V1.Base; 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) { if (!request.Date.HasValue) request.Date = DateTime.Now.Date; // всего var allStat = await robotHistoryService.Get() .GroupBy(t => t.HistoryLevel) .Select(t => new { HistoryLevel = t.Key, Count = t.Count() }) .ToListAsync(); // за дату var dateStat = await robotHistoryService.Get() .Where(t => t.DateCreated.DateTime.Date == request.Date.Value.Date) .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.Date, Level = mapper.Map(level) }); } return Ok(new Response>(response, true)); } } }