feat(api, dal): поиск групп работ, работ, теперь по маске. Статистика по шаблонам по StatusType. Добавлены индексы в Template, RobotConfiguration

This commit is contained in:
Mikhail Trubnikov
2026-02-02 09:24:39 +10:00
parent bd4c9508c9
commit c0210656d9
12 changed files with 4280 additions and 5 deletions

View File

@@ -235,6 +235,11 @@
public const string GetForPeriod = BaseStat + "/templates/period";
}
public static class StatStatusTypeTemplates
{
public const string Get = BaseStat + "/status-type-templates/";
}
public static class StatTemplateAutoControl
{
public const string GetForPeriod = BaseStat + "/template-auto-controls/";

View File

@@ -5,7 +5,7 @@ namespace PARR.API.Contracts.V1.Requests.Queries
public class JobGroupQuery: FullQuery
{
/// <summary>
/// Поиск по имени
/// Поиск по имени. Например: "ДВС-*"
/// </summary>
public string? Name { get; set; }
}

View File

@@ -5,7 +5,7 @@ namespace PARR.API.Contracts.V1.Requests.Queries
public class JobQuery : FullQuery
{
/// <summary>
/// Поиск по имени
/// Поиск по имени. Например: "ДВС-*"
/// </summary>
public string? Name { get; set; }

View File

@@ -0,0 +1,9 @@
namespace PARR.API.Contracts.V1.Responses.Statistics
{
public class StatStatusTypeTemplatesResponse
{
public required TemplateStatusTypeResponse StatusType { get; set; }
public int TemplateCount { get; set; }
}
}

View File

@@ -13,6 +13,7 @@ using PARR.API.Extensions;
using PARR.API.Services.Interfaces;
using PARR.API.Settings;
using PARR.BLL.Domain.Mq;
using PARR.BLL.Helpers;
using PARR.BLL.Services.Interfaces;
using PARR.Common.Domain;
using PARR.Constants;
@@ -92,7 +93,11 @@ namespace PARR.API.Controllers.V1
query = query.OrderBy(t => t.Name);
if (!string.IsNullOrEmpty(filter.Name))
query = query.Where(t => t.Name.ToLower().Contains(filter.Name.ToLower()));
{
//query = query.Where(t => t.Name.ToLower().Contains(filter.Name.ToLower()));
query = query.Where(t=>EF.Functions.Like(t.Name.ToLower(), SqlHelpers.RegexToLike(filter.Name)));
}
if (filter.GroupId.HasValue)
query = query.Where(t => t.GroupId == filter.GroupId.Value);

View File

@@ -11,6 +11,7 @@ using PARR.API.Contracts.V1.Responses.Base;
using PARR.API.Controllers.V1.Base;
using PARR.API.Extensions;
using PARR.API.Services.Interfaces;
using PARR.BLL.Helpers;
using PARR.Constants;
using PARR.DAL.Contracts;
using PARR.DAL.DomainModels;
@@ -83,7 +84,10 @@ namespace PARR.API.Controllers.V1
query = query.OrderBy(t => t.GroupName);
if (!string.IsNullOrEmpty(filter.Name))
query = query.Where(t => t.GroupName.ToLower().Contains(filter.Name.ToLower()));
{
//query = query.Where(t => t.GroupName.ToLower().Contains(filter.Name.ToLower()));
query = query.Where(t => EF.Functions.Like(t.GroupName.ToLower(), SqlHelpers.RegexToLike(filter.Name)));
}
if (filter.IsFull)
query = query

View File

@@ -0,0 +1,70 @@
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
{
/// <summary>
/// Статистика шаблонов по типам статусов ПАРР
/// </summary>
[Authorize(Roles = ParrRoles.Administrator.Role)]
public class StatStatusTypeTemplates : BaseApiController
{
private readonly ITemplateService templateService;
private readonly ITemplateStatusTypeService templateStatusTypeService;
private readonly IMapper mapper;
public StatStatusTypeTemplates(
ITemplateService templateService,
ITemplateStatusTypeService templateStatusTypeService,
IMapper mapper
)
{
this.templateService = templateService;
this.templateStatusTypeService = templateStatusTypeService;
this.mapper = mapper;
}
/// <summary>
/// Статистика шаблонов по StatusType
/// </summary>
/// <returns></returns>
[HttpGet(ApiRoutes.StatStatusTypeTemplates.Get)]
public async Task<IActionResult> Get()
{
var templateStatistics = await templateService.Get()
.AsNoTracking()
.GroupBy(t => t.StatusTypeId)
.Select(t => new
{
StatusTypeId = t.Key,
TempaltesCount = t.Count()
})
.ToDictionaryAsync(t => t.StatusTypeId, t => t.TempaltesCount);
var statusTypes = await templateStatusTypeService.Get()
.AsNoTracking()
.OrderBy(t => t.Id)
.ToListAsync();
var response = statusTypes.Select(t => new StatStatusTypeTemplatesResponse
{
StatusType = mapper.Map<TemplateStatusTypeResponse>(t),
TemplateCount = templateStatistics.TryGetValue(t.Id, out int count) ? count : 0
}).ToList();
return Ok(new Response<List<StatStatusTypeTemplatesResponse>>(response, true));
}
}
}

View File

@@ -1,7 +1,6 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions.Internal;
using PARR.API.Contracts.V1;
using PARR.API.Contracts.V1.Requests.BaseRequests;
using PARR.API.Contracts.V1.Responses.Base;