diff --git a/AsbCloudApp/Services/ITelemetryService.cs b/AsbCloudApp/Services/ITelemetryService.cs index 2e6592b4..c46a32ec 100644 --- a/AsbCloudApp/Services/ITelemetryService.cs +++ b/AsbCloudApp/Services/ITelemetryService.cs @@ -16,11 +16,6 @@ namespace AsbCloudApp.Services /// ITimezoneService TimeZoneService { get; } - /// - /// трекер запросов - /// - ITelemetryTracker TelemetryTracker { get; } - /// /// получить idWell по uid телеметрии /// @@ -42,13 +37,6 @@ namespace AsbCloudApp.Services /// SimpleTimezoneDto GetTimezone(int idTelemetry); - /// - /// Получить дату получения последних данных - /// - /// - /// - DateTime GetLastTelemetryDate(int idTelemetry); - /// /// получить idTelemetry по IdWell /// diff --git a/AsbCloudApp/Services/ITelemetryTracker.cs b/AsbCloudApp/Services/ITelemetryTracker.cs deleted file mode 100644 index 5a6f255e..00000000 --- a/AsbCloudApp/Services/ITelemetryTracker.cs +++ /dev/null @@ -1,33 +0,0 @@ -using AsbCloudApp.Data; -using System; -using System.Collections.Generic; - -namespace AsbCloudApp.Services -{ - /// - /// Сервис статистики телеметрии - /// - public interface ITelemetryTracker - { - /// - /// получить дату последней отправки данных панелью - /// - /// - /// - DateTimeOffset GetLastTelemetryDateByUid(string uid); - - /// - /// получить диапазон дат за которые есть данные по телеметрии - /// - /// - /// - DatesRangeDto GetTelemetryDateRangeByUid(string uid); - - /// - /// обновить статистику по телеметрии - /// - /// - /// - void SaveRequestDate(string uid, DateTimeOffset remoteDate); - } -} diff --git a/AsbCloudApp/Services/IWellService.cs b/AsbCloudApp/Services/IWellService.cs index 057b3444..eb8d9f37 100644 --- a/AsbCloudApp/Services/IWellService.cs +++ b/AsbCloudApp/Services/IWellService.cs @@ -63,7 +63,7 @@ namespace AsbCloudApp.Services /// /// /// - DateTimeOffset GetLastTelemetryDate(int idWell); + DateTime GetLastTelemetryDate(int idWell); //TODO: выяснить и удалить отсюда /// diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 41151953..7ee76fe2 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -102,7 +102,6 @@ namespace AsbCloudInfrastructure services.AddSingleton(new WitsInfoService()); services.AddSingleton(provider => TelemetryDataCache.GetInstance(provider)); services.AddSingleton(provider => TelemetryDataCache.GetInstance(provider)); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(provider => ReduceSamplingService.GetInstance(configuration)); diff --git a/AsbCloudInfrastructure/Repository/DepositRepository.cs b/AsbCloudInfrastructure/Repository/DepositRepository.cs index 4944f79d..7f19f1d7 100644 --- a/AsbCloudInfrastructure/Repository/DepositRepository.cs +++ b/AsbCloudInfrastructure/Repository/DepositRepository.cs @@ -111,7 +111,7 @@ namespace AsbCloudInfrastructure.Repository { var dto = well.Adapt(); dto.WellType = well.WellType.Caption; - dto.LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id).DateTime; + dto.LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id); dto.Cluster = gCluster.Key.Caption; dto.Deposit = gDeposit.Key.Caption; return dto; diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs index 54ab56c5..359efd18 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs @@ -64,7 +64,6 @@ namespace AsbCloudInfrastructure.Services.SAUB }); var entityMaxDate = entities.Max(e => e.DateTime); - telemetryService.TelemetryTracker.SaveRequestDate(uid, entityMaxDate); var dbset = db.Set(); var stopwatch = Stopwatch.StartNew(); diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs index 593bf981..1f841aad 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs @@ -19,21 +19,20 @@ namespace AsbCloudInfrastructure.Services.SAUB { private readonly IAsbCloudDbContext db; private readonly IMemoryCache memoryCache; - private readonly ITelemetryTracker telemetryTracker; + private readonly TelemetryDataCache dataSaubCache; private readonly ITimezoneService timezoneService; public ITimezoneService TimeZoneService => timezoneService; - public ITelemetryTracker TelemetryTracker => telemetryTracker; public TelemetryService( IAsbCloudDbContext db, IMemoryCache memoryCache, - ITelemetryTracker telemetryTracker, + TelemetryDataCache dataSaubCache, ITimezoneService timezoneService) { this.db = db; this.memoryCache = memoryCache; - this.telemetryTracker = telemetryTracker; + this.dataSaubCache = dataSaubCache; this.timezoneService = timezoneService; } @@ -47,34 +46,11 @@ namespace AsbCloudInfrastructure.Services.SAUB memoryCache.DropBasic(); } - public DateTime GetLastTelemetryDate(int idTelemetry) - { - var telemetry = GetTelemetryCache().FirstOrDefault(t => t.Id == idTelemetry); - - if (telemetry is null) - throw new Exception($"Telemetry id:{idTelemetry} does not exist"); - - var uid = telemetry.RemoteUid; - var timzone = GetTimezone(idTelemetry); - var lastTelemetryDate = telemetryTracker.GetLastTelemetryDateByUid(uid); - return lastTelemetryDate.ToRemoteDateTime(timzone.Hours); - } - public DatesRangeDto GetDatesRange(int idTelemetry) { - var telemetry = GetTelemetryCache().FirstOrDefault(t => t.Id == idTelemetry); - if (telemetry is null) - throw new Exception($"Telemetry id:{idTelemetry} does not exist"); - - var dto = TelemetryTracker.GetTelemetryDateRangeByUid(telemetry.RemoteUid); - if (dto is null) - throw new Exception($"Telemetry id:{idTelemetry} has no data"); - - var timezone = GetTimezone(idTelemetry); - dto.From = dto.From.ToTimeZoneOffsetHours(timezone.Hours); - dto.To = dto.To.ToTimeZoneOffsetHours(timezone.Hours); - - return dto; + var cacheDataRange = dataSaubCache.GetOrDefaultDataDateRange(idTelemetry) + ?? new (); + return cacheDataRange; } public int GetOrCreateTelemetryIdByUid(string uid) diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryTracker.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryTracker.cs deleted file mode 100644 index 588a4b87..00000000 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryTracker.cs +++ /dev/null @@ -1,154 +0,0 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Services; -using AsbCloudDb.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Caching.Memory; -using Microsoft.Extensions.Configuration; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace AsbCloudInfrastructure.Services.SAUB -{ - - public class TelemetryTracker : ITelemetryTracker - { - class TrackerStat - { - //public int Id { get; set; } - - public string RemoteUid { get; set; } = null!; - - /// - /// Время последнего запроса (по времени сервера) - /// - public DateTimeOffset LastTimeServer { get; set; } - - /// - /// Дата первых данных в БД - /// - public DateTimeOffset TelemetryDateUtcMin { get; set; } - - /// - /// Дата последних данных в БД - /// - public DateTimeOffset TelemetryDateUtcMax { get; set; } - - } - - private readonly ConcurrentDictionary telemetriesStats; - - public TelemetryTracker(IConfiguration configuration, IMemoryCache memoryCache) - { - // TODO: make this background work - var contextOptions = new DbContextOptionsBuilder() - .UseNpgsql(configuration.GetConnectionString("DefaultConnection")) - .Options; - var db = new AsbCloudDbContext(contextOptions); - - var cacheTelemetry = memoryCache.GetOrCreateBasic(db.Set().Include(t=>t.Well)); - var keyValuePairs = new Dictionary(cacheTelemetry.Count()); - foreach (var telemetry in cacheTelemetry) - { - var date = telemetry.Info?.DrillingStartDate - ?? ParseDateFromUidOrDefault(telemetry.RemoteUid, DateTimeOffset.MinValue); - - keyValuePairs[telemetry.RemoteUid] = new TrackerStat - { - RemoteUid = telemetry.RemoteUid, - TelemetryDateUtcMin = date, - TelemetryDateUtcMax = date, - LastTimeServer = date, - }; - } - telemetriesStats = new ConcurrentDictionary(keyValuePairs); - - Task.Run(async () => - { - db.Database.SetCommandTimeout(2 * 60); - var dates = await db.TelemetryDataSaub - .GroupBy(d => d.IdTelemetry) - .Select(g => new - { - IdTelemetry = g.Key, - DateMax = g.Max(d => d.DateTime), - DateMin = g.Min(d => d.DateTime), - }) - .AsNoTracking() - .ToListAsync() - .ConfigureAwait(false); - - var oldRequests = dates.Select(t => new - { - Uid = cacheTelemetry.FirstOrDefault(c => c.Id == t.IdTelemetry)?.RemoteUid, - t.DateMax, - t.DateMin, - }).Where(s => !string.IsNullOrEmpty(s.Uid)); - - foreach (var oldReq in oldRequests) - { - if (oldReq.Uid is not null) - { - var telemetryStat = telemetriesStats.GetOrAdd(oldReq.Uid, (uid) => new TrackerStat { RemoteUid = uid }); - telemetryStat.TelemetryDateUtcMin = oldReq.DateMin; - telemetryStat.TelemetryDateUtcMax = oldReq.DateMax; - telemetryStat.LastTimeServer = oldReq.DateMax; - } - - } - }).ContinueWith((t) => - { - db.Dispose(); - return t; - }); - } - - private static DateTimeOffset ParseDateFromUidOrDefault(string remoteUid, DateTimeOffset defaultValue = default) - { - //example: uid = 20211102_173407926 - if (string.IsNullOrEmpty(remoteUid) || remoteUid.Length != 18) - return defaultValue; - - if (DateTime.TryParseExact(remoteUid, "yyyyMMdd_HHmmssfff", - System.Globalization.CultureInfo.InvariantCulture, - System.Globalization.DateTimeStyles.AssumeUniversal, - out DateTime parsedDate)) - return parsedDate; - - return defaultValue; - } - - public void SaveRequestDate(string uid, DateTimeOffset remoteDate) - { - var stat = telemetriesStats.GetOrAdd(uid, _ => new TrackerStat - { - RemoteUid = uid, - TelemetryDateUtcMin = remoteDate - } - ); - - stat.LastTimeServer = DateTime.Now; - - if (stat.TelemetryDateUtcMax.ToUniversalTime() < remoteDate.ToUniversalTime()) - stat.TelemetryDateUtcMax = remoteDate; - } - - public DateTimeOffset GetLastTelemetryDateByUid(string uid) => - telemetriesStats.GetValueOrDefault(uid)?.TelemetryDateUtcMax ?? default; - - public DatesRangeDto GetTelemetryDateRangeByUid(string uid) - { - var stat = telemetriesStats.GetValueOrDefault(uid); - var range = new DatesRangeDto - { - From = stat?.TelemetryDateUtcMin.UtcDateTime ?? default, - To = stat?.TelemetryDateUtcMax.UtcDateTime ?? default, - }; - return range; - } - - } - -} diff --git a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs index 408c895c..c32956d8 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs @@ -151,7 +151,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService WellType = wellType?.Caption ?? "", IdState = well.IdState, State = wellService.GetStateText(well.IdState), - LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id).DateTime, + LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id), Companies = await wellService.GetCompaniesAsync(well.Id, token) }; diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 2d2599b8..711b495e 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -57,15 +57,15 @@ namespace AsbCloudInfrastructure.Services private void DropCacheRelationCompanyWell() => memoryCache.DropBasic(); - public DateTimeOffset GetLastTelemetryDate(int idWell) + public DateTime GetLastTelemetryDate(int idWell) { var well = GetOrDefault(idWell); if (well?.IdTelemetry is null) - return DateTimeOffset.MinValue; + return DateTime.MinValue; - var lastTelemetryDate = telemetryService.GetLastTelemetryDate((int)well.IdTelemetry); - return lastTelemetryDate; + var datesRange = telemetryService.GetDatesRange(well.IdTelemetry.Value); + return datesRange.To; } /// @@ -97,7 +97,7 @@ namespace AsbCloudInfrastructure.Services dto.Latitude ??= gCluster.Key.Latitude ?? gDeposit.Key.Latitude; dto.Longitude ??= gCluster.Key.Longitude ?? gDeposit.Key.Longitude; if (well.IdTelemetry is not null) - dto.LastTelemetryDate = telemetryService.GetLastTelemetryDate(well.IdTelemetry.Value); + dto.LastTelemetryDate = telemetryService.GetDatesRange(well.IdTelemetry.Value).To; return dto; }), @@ -256,7 +256,7 @@ namespace AsbCloudInfrastructure.Services dto.Cluster = entity.Cluster.Caption; dto.Deposit = entity.Cluster.Deposit.Caption; if (entity.IdTelemetry is not null) - dto.LastTelemetryDate = telemetryService.GetLastTelemetryDate((int)entity.IdTelemetry); + dto.LastTelemetryDate = telemetryService.GetDatesRange(entity.IdTelemetry.Value).To; dto.Companies = entity.RelationCompaniesWells .Select(r => Convert(r.Company)) .ToList();