diff --git a/AsbCloudApp/Repositories/ITelemetryDataCache.cs b/AsbCloudApp/Repositories/ITelemetryDataCache.cs new file mode 100644 index 00000000..0bc73275 --- /dev/null +++ b/AsbCloudApp/Repositories/ITelemetryDataCache.cs @@ -0,0 +1,62 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Requests; +using System; +using System.Collections.Generic; + +namespace AsbCloudApp.Repositories +{ + /// + /// Хранилище кеша + /// + /// + public interface ITelemetryDataCache where TDto : ITelemetryData + { + /// + /// добавить в кеш чанк записей по телеметрии + /// + /// + /// + void AddRange(int idTelemetry, IEnumerable range); + + /// + /// вернуть последнюю записть + /// + /// + /// + TDto? GetLastOrDefault(int idTelemetry); + + /// + /// Получить кешированые записи + /// + /// + /// + /// + /// приблизительное кол-во возвращаемых записей после их прореживания + /// + IEnumerable? GetOrDefault(int idTelemetry, DateTime dateBegin, double intervalSec = 600, int approxPointsCount = 1024); + + /// + /// Получить кешированые записи + /// + /// + /// + /// + IEnumerable? GetOrDefault(int idTelemetry, TelemetryDataRequest request); + + /// + /// Получить диапазон дат телеметрии. + /// Дата первой записи телеметрии храниться отдельно и запоняется при инициализации + /// + /// + /// + DatesRangeDto? GetOrDefaultDataDateRange(int idTelemetry); + + /// + /// Получение первой и последней записи телеметрии. + /// Первая запись телеметрии храниться отдельно и запоняется при инициализации + /// + /// + /// + (TDto First, TDto Last)? GetOrDefaultFirstLast(int idTelemetry); + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 85caf0b2..33d81cba 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -159,8 +159,8 @@ namespace AsbCloudInfrastructure services.AddScoped(provider => provider.GetRequiredService()); services.AddSingleton(new WitsInfoService()); - services.AddSingleton(provider => TelemetryDataCache.GetInstance(provider)); - services.AddSingleton(provider => TelemetryDataCache.GetInstance(provider)); + services.AddSingleton>(provider => TelemetryDataCache.GetInstance(provider)); + services.AddSingleton>(provider => TelemetryDataCache.GetInstance(provider)); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs index 32fc88a2..649f03de 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using AsbCloudApp.Repositories; using AsbCloudApp.Services; using AsbCloudDb; using AsbCloudDb.Model; @@ -18,12 +19,12 @@ namespace AsbCloudInfrastructure.Services.SAUB { protected readonly IAsbCloudDbContext db; protected readonly ITelemetryService telemetryService; - protected readonly TelemetryDataCache telemetryDataCache; + protected readonly ITelemetryDataCache telemetryDataCache; public TelemetryDataBaseService( IAsbCloudDbContext db, ITelemetryService telemetryService, - TelemetryDataCache telemetryDataCache) + ITelemetryDataCache telemetryDataCache) { this.db = db; this.telemetryService = telemetryService; diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs index 531ab8d9..055d742c 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs @@ -12,11 +12,11 @@ using AsbCloudInfrastructure.Background; using System.Threading; using AsbCloudApp.Data; using AsbCloudApp.Requests; +using AsbCloudApp.Repositories; namespace AsbCloudInfrastructure.Services.SAUB { - public class TelemetryDataCache - where TDto : AsbCloudApp.Data.ITelemetryData + public class TelemetryDataCache : ITelemetryDataCache where TDto : AsbCloudApp.Data.ITelemetryData { class TelemetryDataCacheItem { @@ -48,7 +48,8 @@ namespace AsbCloudInfrastructure.Services.SAUB instance = new TelemetryDataCache(); var worker = provider.GetRequiredService(); var workId = $"Telemetry cache loading from DB {typeof(TEntity).Name}"; - var work = Work.CreateByDelegate(workId, async (workId, provider, onProgress, token) => { + var work = Work.CreateByDelegate(workId, async (workId, provider, onProgress, token) => + { var db = provider.GetRequiredService(); await instance.InitializeCacheFromDBAsync(db, onProgress, token); }); @@ -85,13 +86,13 @@ namespace AsbCloudInfrastructure.Services.SAUB } else { - cacheItem = caches.GetOrAdd(idTelemetry, _ => new TelemetryDataCacheItem() - { + cacheItem = caches.GetOrAdd(idTelemetry, _ => new TelemetryDataCacheItem() + { FirstByDate = newItems.ElementAt(0), - LastData = new CyclycArray(activeWellCapacity) + LastData = new CyclycArray(activeWellCapacity) }); } - + cacheItem.LastData.AddRange(newItems); } @@ -107,14 +108,14 @@ namespace AsbCloudInfrastructure.Services.SAUB /// public IEnumerable? GetOrDefault(int idTelemetry, DateTime dateBegin, double intervalSec = 600d, int approxPointsCount = 1024) { - if(!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem)) + if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem)) return null; var cacheLastData = cacheItem.LastData; if (!cacheLastData.Any() || cacheLastData[0].DateTime > dateBegin) return null; - + var dateEnd = dateBegin.AddSeconds(intervalSec); var items = cacheLastData .Where(i => i.DateTime >= dateBegin && i.DateTime <= dateEnd); @@ -141,7 +142,7 @@ namespace AsbCloudInfrastructure.Services.SAUB return null; var from = cacheItem.FirstByDate?.DateTime; - if(!cacheItem.LastData.Any()) + if (!cacheItem.LastData.Any()) return null; var to = cacheItem.LastData[^1].DateTime; @@ -190,10 +191,10 @@ namespace AsbCloudInfrastructure.Services.SAUB var idTelemetry = well.IdTelemetry!.Value; var hoursOffset = well.Timezone.Hours; - - onProgress($"Loading for well: {well.Cluster?.Caption}/{well.Caption} (capacity:{capacity}) idTelemetry:{idTelemetry}", i++/count); + + onProgress($"Loading for well: {well.Cluster?.Caption}/{well.Caption} (capacity:{capacity}) idTelemetry:{idTelemetry}", i++ / count); var cacheItem = await GetOrDefaultCacheDataFromDbAsync(db, idTelemetry, capacity, hoursOffset, token); - if(cacheItem is not null) + if (cacheItem is not null) caches.TryAdd(idTelemetry, cacheItem); } @@ -225,7 +226,8 @@ namespace AsbCloudInfrastructure.Services.SAUB var dtos = entities .AsEnumerable() .Reverse() - .Select(entity => { + .Select(entity => + { var dto = entity.Adapt(); dto.DateTime = entity.DateTime.ToRemoteDateTime(hoursOffset); return dto; @@ -247,12 +249,12 @@ namespace AsbCloudInfrastructure.Services.SAUB { if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem)) return null; - + IEnumerable data = cacheItem.LastData; if (!data.Any()) return null; - + if (request.GeDate.HasValue) { var geDate = request.GeDate.Value.ToRemoteDateTime(cacheItem.TimezoneHours); @@ -272,7 +274,7 @@ namespace AsbCloudInfrastructure.Services.SAUB var leDate = request.LeDate.Value.ToRemoteDateTime(cacheItem.TimezoneHours); data = data.Where(d => d.DateTime >= request.LeDate); } - + if (request.Divider > 1) data = data.Where((d) => (((d.DateTime.DayOfYear * 24 + d.DateTime.Hour) * 60 + d.DateTime.Minute) * 60 + d.DateTime.Second) % request.Divider == 0); diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs index afe89528..b9ce8d6c 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs @@ -1,6 +1,7 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.SAUB; using AsbCloudApp.Exceptions; +using AsbCloudApp.Repositories; using AsbCloudApp.Services; using AsbCloudDb.Model; using Mapster; @@ -26,7 +27,7 @@ namespace AsbCloudInfrastructure.Services.SAUB IAsbCloudDbContext db, ITelemetryService telemetryService, ITelemetryUserService telemetryUserService, - TelemetryDataCache telemetryDataCache) + ITelemetryDataCache telemetryDataCache) : base(db, telemetryService, telemetryDataCache) { this.telemetryUserService = telemetryUserService; diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSpinService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSpinService.cs index 78119d6b..dab1e851 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSpinService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSpinService.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Repositories; using AsbCloudApp.Services; using AsbCloudDb.Model; using Mapster; @@ -11,7 +12,7 @@ namespace AsbCloudInfrastructure.Services.SAUB public TelemetryDataSpinService( IAsbCloudDbContext db, ITelemetryService telemetryService, - TelemetryDataCache telemetryDataCache) + ITelemetryDataCache telemetryDataCache) : base(db, telemetryService, telemetryDataCache) { } diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs index 7aa4f6c5..a084e687 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs @@ -1,5 +1,6 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Repositories; using AsbCloudApp.Services; using AsbCloudDb; using AsbCloudDb.Model; @@ -18,7 +19,8 @@ namespace AsbCloudInfrastructure.Services.SAUB { private readonly IAsbCloudDbContext db; private readonly IMemoryCache memoryCache; - private readonly TelemetryDataCache dataSaubCache; + //TODO: методы использующие ITelemetryDataCache, скорее всего, тут не нужны + private readonly ITelemetryDataCache dataSaubCache; private readonly ITimezoneService timezoneService; public ITimezoneService TimeZoneService => timezoneService; @@ -26,7 +28,7 @@ namespace AsbCloudInfrastructure.Services.SAUB public TelemetryService( IAsbCloudDbContext db, IMemoryCache memoryCache, - TelemetryDataCache dataSaubCache, + ITelemetryDataCache dataSaubCache, ITimezoneService timezoneService) { this.db = db; diff --git a/AsbCloudInfrastructure/Services/WellInfoService.cs b/AsbCloudInfrastructure/Services/WellInfoService.cs index 70c6afdd..60693eeb 100644 --- a/AsbCloudInfrastructure/Services/WellInfoService.cs +++ b/AsbCloudInfrastructure/Services/WellInfoService.cs @@ -36,7 +36,7 @@ public class WellInfoService var operationsStatService = services.GetRequiredService(); var processMapPlanWellDrillingRepository = services.GetRequiredService>(); var subsystemOperationTimeService = services.GetRequiredService(); - var telemetryDataSaubCache = services.GetRequiredService>(); + var telemetryDataSaubCache = services.GetRequiredService>(); var messageHub = services.GetRequiredService>(); var wells = await wellService.GetAllAsync(token); @@ -180,16 +180,16 @@ public class WellInfoService public IEnumerable IdsCompanies { get; set; } = null!; } - private readonly TelemetryDataCache telemetryDataSaubCache; - private readonly TelemetryDataCache telemetryDataSpinCache; + private readonly ITelemetryDataCache telemetryDataSaubCache; + private readonly ITelemetryDataCache telemetryDataSpinCache; private readonly IWitsRecordRepository witsRecord7Repository; private readonly IWitsRecordRepository witsRecord1Repository; private readonly IGtrRepository gtrRepository; private static IEnumerable WellMapInfo = Enumerable.Empty(); public WellInfoService( - TelemetryDataCache telemetryDataSaubCache, - TelemetryDataCache telemetryDataSpinCache, + ITelemetryDataCache telemetryDataSaubCache, + ITelemetryDataCache telemetryDataSpinCache, IWitsRecordRepository witsRecord7Repository, IWitsRecordRepository witsRecord1Repository, IGtrRepository gtrRepository) diff --git a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs index 004ce863..a93dc50b 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs @@ -11,6 +11,7 @@ using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data.SAUB; using AsbCloudInfrastructure.Services.SAUB; +using AsbCloudApp.Repositories; namespace AsbCloudInfrastructure.Services.WellOperationService; @@ -19,10 +20,10 @@ public class OperationsStatService : IOperationsStatService private readonly IAsbCloudDbContext db; private readonly IMemoryCache memoryCache; private readonly IWellService wellService; - private readonly TelemetryDataCache telemetryDataCache; + private readonly ITelemetryDataCache telemetryDataCache; - public OperationsStatService(IAsbCloudDbContext db, IMemoryCache memoryCache, IWellService wellService, - TelemetryDataCache telemetryDataCache) + public OperationsStatService(IAsbCloudDbContext db, IMemoryCache memoryCache, IWellService wellService, + ITelemetryDataCache telemetryDataCache) { this.db = db; this.memoryCache = memoryCache; diff --git a/AsbCloudInfrastructure/Services/WellboreService.cs b/AsbCloudInfrastructure/Services/WellboreService.cs index 9fd4080d..9d38683e 100644 --- a/AsbCloudInfrastructure/Services/WellboreService.cs +++ b/AsbCloudInfrastructure/Services/WellboreService.cs @@ -16,12 +16,12 @@ public class WellboreService : IWellboreService const string WellboreNameFormat = " {0}"; private readonly IWellService wellService; private readonly IWellOperationRepository wellOperationRepository; - private readonly TelemetryDataCache telemetryDataCache; + private readonly ITelemetryDataCache telemetryDataCache; public WellboreService( IWellService wellService, IWellOperationRepository wellOperationRepository, - TelemetryDataCache telemetryDataCache) + ITelemetryDataCache telemetryDataCache) { this.wellService = wellService; this.wellOperationRepository = wellOperationRepository; diff --git a/AsbCloudInfrastructure/Startup.cs b/AsbCloudInfrastructure/Startup.cs index 240c8892..cef6745b 100644 --- a/AsbCloudInfrastructure/Startup.cs +++ b/AsbCloudInfrastructure/Startup.cs @@ -15,6 +15,7 @@ using AsbCloudInfrastructure.Services.Subsystems; using System.Linq; using DocumentFormat.OpenXml.InkML; using AsbCloudDb; +using AsbCloudApp.Repositories; namespace AsbCloudInfrastructure { @@ -29,8 +30,8 @@ namespace AsbCloudInfrastructure context.Database.EnshureCreatedAndMigrated(); // TODO: Сделать инициализацию кеша телеметрии более явной. - _ = provider.GetRequiredService>(); - _ = provider.GetRequiredService>(); + _ = provider.GetRequiredService>(); + _ = provider.GetRequiredService>(); var backgroundWorker = provider.GetRequiredService(); backgroundWorker.WorkStore.AddPeriodic(TimeSpan.FromMinutes(30));