From f27bdb65b17e97f6650d0ff9ee834b9e926f5f42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 22 Aug 2024 15:00:13 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Изменено описание API 2. Добавлено кеширвоание --- AsbCloudApp/Requests/TelemetryInfoRequest.cs | 50 ++----------------- .../Services/SAUB/TelemetryService.cs | 42 ++++++++++------ .../Controllers/TelemetryInfoController.cs | 17 +++++-- 3 files changed, 42 insertions(+), 67 deletions(-) diff --git a/AsbCloudApp/Requests/TelemetryInfoRequest.cs b/AsbCloudApp/Requests/TelemetryInfoRequest.cs index 9dd0c321..fb6f68d4 100644 --- a/AsbCloudApp/Requests/TelemetryInfoRequest.cs +++ b/AsbCloudApp/Requests/TelemetryInfoRequest.cs @@ -1,28 +1,14 @@ -using System.Collections.Generic; - -namespace AsbCloudApp.Requests; +namespace AsbCloudApp.Requests; /// /// Запрос получения информации по телеметрии /// -public class TelemetryInfoRequestBase +public class TelemetryInfoRequest { /// - /// Конструктор по умолчанию + /// Идентификатор компании /// - public TelemetryInfoRequestBase() - { - } - - /// - /// Копирующий конструктор - /// - /// - public TelemetryInfoRequestBase(TelemetryInfoRequestBase request) - { - IdWellState = request.IdWellState; - SortFields = request.SortFields; - } + public int IdCompany { get; set; } /// /// Определяет состояние скважины @@ -31,32 +17,4 @@ public class TelemetryInfoRequestBase /// 2 - завершена /// public int IdWellState { get; set; } - - /// - /// Сортировки: - /// Содержат список названий полей сортировки - /// Указать направление сортировки можно через пробел "asc" или "desc" - /// - public IEnumerable? SortFields { get; set; } -} - -/// -/// Запрос получения информации по телеметрии -/// -public class TelemetryInfoRequest : TelemetryInfoRequestBase -{ - /// - /// Копирующий конструктор - /// - public TelemetryInfoRequest(int idCompany, - TelemetryInfoRequestBase request) - : base(request) - { - IdCompany = idCompany; - } - - /// - /// Идентификатор компании - /// - public int IdCompany { get; set; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs index 13aea69c..d67f3a18 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs @@ -25,7 +25,6 @@ public class TelemetryService : ITelemetryService //TODO: методы использующие ITelemetryDataCache, скорее всего, тут не нужны private readonly ITelemetryDataCache dataSaubCache; private readonly ITimezoneService timezoneService; - public ITimezoneService TimeZoneService => timezoneService; public TelemetryService( @@ -81,28 +80,39 @@ public class TelemetryService : ITelemetryService public async Task> GetInfoAsync(TelemetryInfoRequest request, CancellationToken token) { - var idTelemetries = await db.Set().Include(x => x.RelationCompaniesWells) + var idTelemetries = await db.Set() + .Include(x => x.RelationCompaniesWells) .Where(x => x.RelationCompaniesWells.Any(y => y.IdCompany == request.IdCompany) && x.IdState == request.IdWellState) - .Select(x => x.IdTelemetry) + .Where(x => x.IdTelemetry.HasValue) + .Select(x => x.IdTelemetry!.Value) .ToArrayAsync(token); - var query = db.Set() - .Where(x => idTelemetries.Contains(x.Id)); + var key = $"TelemetryInfo_{string.Join("", idTelemetries)}"; - if (request.SortFields?.Any() == true) - query = query.SortBy(request.SortFields); - - var entities = await query - .AsNoTracking() - .ToArrayAsync(token); - - return entities.Select(x => + var result = await memoryCache.GetOrCreateAsync(key, async entry => { - var dto = x.Info.Adapt(); - dto.DrillingStartDate = x.Info.DrillingStartDate.ToRemoteDateTime(dto.TimeZoneOffsetTotalHours); - return dto; + entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10); + + var query = db.Set() + .Where(x => idTelemetries.Contains(x.Id)) + .OrderBy(x => x.Info.DrillingStartDate); + + var entities = await query + .AsNoTracking() + .ToArrayAsync(token); + + var dtos = entities.Select(x => + { + var dto = x.Info.Adapt(); + dto.DrillingStartDate = x.Info.DrillingStartDate.ToRemoteDateTime(dto.TimeZoneOffsetTotalHours); + return dto; + }); + + return dtos; }); + + return result!; } [Obsolete("This method will be private. Use TelemetryDto.TimeZone prop.")] diff --git a/AsbCloudWebApi/Controllers/TelemetryInfoController.cs b/AsbCloudWebApi/Controllers/TelemetryInfoController.cs index b8c5cd5a..b7890f18 100644 --- a/AsbCloudWebApi/Controllers/TelemetryInfoController.cs +++ b/AsbCloudWebApi/Controllers/TelemetryInfoController.cs @@ -11,7 +11,7 @@ using Microsoft.AspNetCore.Mvc; namespace AsbCloudWebApi.Controllers; /// -/// Информация о телеметрии +/// Версии прошивок /// [Route("api/[controller]")] [ApiController] @@ -26,22 +26,29 @@ public class TelemetryInfoController : ControllerBase } /// - /// Получить список информации о телеметрии + /// Получить список версий прошивок /// - /// + /// Определяет состояние скважины + /// 0 - неизвестно, + /// 1 - в работе, + /// 2 - завершена /// /// [HttpGet] [Permission] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public async Task GetAsync([FromQuery] TelemetryInfoRequestBase request, CancellationToken token) + public async Task GetAsync([FromQuery] int idWellState, CancellationToken token) { var idCompany = User.GetCompanyId(); if (!idCompany.HasValue) return Forbid(); - var requestToService = new TelemetryInfoRequest(idCompany.Value, request); + var requestToService = new TelemetryInfoRequest + { + IdCompany = idCompany.Value, + IdWellState = idWellState + }; var telemetriesInfo = await telemetryService.GetInfoAsync(requestToService, token);