From c8a524b28f5d3dbe1c5f079f2b8a98c308e267d6 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Mon, 29 Jul 2024 10:25:57 +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=D1=80=D0=B0=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B3=D0=BB=D0=B0=D0=BC=D0=B5=D0=BD=D1=82=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.API/Contracts/V1/ApiRoutes.cs | 4 + .../StatTemplateDistributorResponse.cs | 17 ++++ .../StatTemplateDistributionController.cs | 87 +++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 PARR.API/Contracts/V1/Responses/Statistics/StatTemplateDistributorResponse.cs create mode 100644 PARR.API/Controllers/V1/Statistics/StatTemplateDistributionController.cs diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index c0fec12e..864ac14b 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -237,6 +237,10 @@ public const string Get = BaseStat + "/auth"; } + public static class StatTemplateDistribution + { + public const string Get = BaseStat + "/template-distribution/{applicationInWorkId}"; + } #endregion diff --git a/PARR.API/Contracts/V1/Responses/Statistics/StatTemplateDistributorResponse.cs b/PARR.API/Contracts/V1/Responses/Statistics/StatTemplateDistributorResponse.cs new file mode 100644 index 00000000..22f126be --- /dev/null +++ b/PARR.API/Contracts/V1/Responses/Statistics/StatTemplateDistributorResponse.cs @@ -0,0 +1,17 @@ +namespace PARR.API.Contracts.V1.Responses.Statistics +{ + public class StatTemplateDistributorResponse + { + public WorkGroupResponse? WorkGroup { get; set; } + + public int CountTemplates { get; set; } + + public List? Stat { get; set; } + } + + public class StatTemplateDistributorDateStat + { + public DateTimeOffset Date { get; set; } + public int Count { get; set; } + } +} diff --git a/PARR.API/Controllers/V1/Statistics/StatTemplateDistributionController.cs b/PARR.API/Controllers/V1/Statistics/StatTemplateDistributionController.cs new file mode 100644 index 00000000..e3673e37 --- /dev/null +++ b/PARR.API/Controllers/V1/Statistics/StatTemplateDistributionController.cs @@ -0,0 +1,87 @@ +using AutoMapper; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +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.Services.Interfaces; + +namespace PARR.API.Controllers.V1.Statistics +{ + /// + /// Статистика распределения шаблонов + /// + [Authorize(Roles = ParrRoles.Administrator.Role)] + public class StatTemplateDistributionController : BaseApiController + { + private readonly ITemplateService templateService; + private readonly IWorkGroupService workGroupService; + private readonly IMapper mapper; + + public StatTemplateDistributionController( + ITemplateService templateService, + IWorkGroupService workGroupService, + IMapper mapper + ) + { + this.templateService = templateService; + this.workGroupService = workGroupService; + this.mapper = mapper; + } + + + /// + /// Статистика распределения шаблонов по JobId (ApplicationInWorkId) + /// + /// + /// + [HttpGet(ApiRoutes.StatTemplateDistribution.Get)] + public async Task Get([FromRoute] Guid applicationInWorkId) + { + // f87dbe9f-cabf-4108-9c93-12068d4b48a5 + + var query = templateService.Get() + .Include(t => t.Host) + .Where(t => t.ApplicationInWorkId == applicationInWorkId) + .GroupBy(t => t.Host!.WorkGroupId) + .Select(x => new + { + WorkGroupId = x.Key, + CountTemplates = x.Count(), + GroupingByDate = + x.GroupBy(d => d.NextRun).OrderBy(d => d.Key).Select(d => + new + { + Date = d.Key, + Count = d.Count() + } + ) + + }); + + var statResult = await query.ToListAsync(); + + var workGroups = await workGroupService.Get() + .Include(t => t.ResponseArea) + .Where(t => statResult.Select(x => x.WorkGroupId).Any(w => w == t.Id)) + .ToListAsync(); + + + var response = statResult.Select(stat => new StatTemplateDistributorResponse + { + WorkGroup = mapper.Map(workGroups.FirstOrDefault(x => x.Id == stat.WorkGroupId)), + CountTemplates = stat.CountTemplates, + Stat = stat.GroupingByDate.Select(x => new StatTemplateDistributorDateStat { Count = x.Count, Date = x.Date }).ToList() + }) + .OrderBy(t => t.WorkGroup?.Name) + .ToList(); + + + return Ok(new Response>(response, true)); + } + } +}