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));