diff --git a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs index 8fc98c07..d8f2b8be 100644 --- a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs +++ b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs @@ -4,7 +4,6 @@ using AsbCloudApp.Services.WITS; using AsbCloudDb.Model; using AsbCloudDb.Model.GTR; using Microsoft.EntityFrameworkCore; -using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; @@ -15,7 +14,7 @@ namespace AsbCloudInfrastructure.Repository { #nullable enable public class GtrWitsRepository : IGtrRepository - where T : WitsItemBase, ITelemetryData + where T : WitsItemBase { private readonly IAsbCloudDbContext db; private readonly ITelemetryService telemetryService; @@ -36,6 +35,7 @@ namespace AsbCloudInfrastructure.Repository var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell); if (telemetry is null) return Enumerable.Empty(); + var timezone = telemetryService.GetTimezone(telemetry.Id); var filterByDateEnd = dateBegin != default; @@ -54,10 +54,50 @@ namespace AsbCloudInfrastructure.Repository if (dateBeginUtc == default) dateBeginUtc = DateTime.UtcNow.AddSeconds(-intervalSec); - var dateEnd = dateBeginUtc.AddSeconds(intervalSec); - //временная заглушка(для билда без ошибок) - return Enumerable.Empty(); + //var cacheData = telemetryDataCache.GetOrDefault(telemetry.Id, dateBeginUtc.ToRemoteDateTime(timezone.Hours), intervalSec, approxPointsCount); + //if (cacheData is not null) + // return cacheData; + + var dateEnd = dateBeginUtc.AddSeconds(intervalSec); + var dbSet = db.Set(); + + var query = dbSet + .Where(d => d.IdTelemetry == telemetry.Id + && d.DateTime >= dateBeginUtc); + + if (filterByDateEnd) + query = query.Where(d => d.DateTime <= dateEnd); + + var fullDataCount = await query.CountAsync(token) + .ConfigureAwait(false); + + if (fullDataCount == 0) + return Enumerable.Empty(); + + if (fullDataCount > 1.75 * approxPointsCount) + { + var m = (int)Math.Round(1d * fullDataCount / approxPointsCount); + if (m > 1) + query = query.Where((d) => (((d.DateTime.DayOfYear * 24 + d.DateTime.Hour) * 60 + d.DateTime.Minute) * 60 + d.DateTime.Second) % m == 0); + } + + var entities = await query + .OrderBy(d => d.DateTime) + .AsNoTracking() + .ToListAsync(token) + .ConfigureAwait(false); + + var groupRecord = entities + .GroupBy(g => g.IdRecord) + .ToList(); + var dtos = new List(); + foreach(var group in groupRecord) + { + var dto = GetDto(group, telemetry.Id, timezone.Hours); + dtos.Add(dto); + } + return dtos; } @@ -104,7 +144,7 @@ namespace AsbCloudInfrastructure.Repository { var itemsCount = recordItems.Items.Count; var entities = new List>(itemsCount); - + foreach (var dtoItems in recordItems.Items) { var entityItems = new WitsItemBase @@ -119,6 +159,24 @@ namespace AsbCloudInfrastructure.Repository } return entities; } + + private static WitsRecordDto GetDto(IEnumerable> entities, int idTelemetry, double timezoneHours) + { + var entity = entities.First(); + var dto = new WitsRecordDto + { + Id = entity.IdRecord, + Date = entity.DateTime.ToRemoteDateTime(timezoneHours), + IdTelemetry = idTelemetry + }; + + foreach (var entityItems in entities) + { + var valueItem = new JsonValue(entityItems.Value!); + dto.Items.Add(entityItems.IdItem, valueItem); + } + return dto; + } } #nullable disable }