From 4d8780dabcc5b51a6a0cbf7b7fc50adcec0b1da0 Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Mon, 25 Oct 2021 16:32:55 +0500 Subject: [PATCH] Changed way of retrieving last telemetry date for wells --- .../Services/TelemetryTracker.cs | 35 +++++++++++++++++-- .../Services/WellService.cs | 8 ++--- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/AsbCloudInfrastructure/Services/TelemetryTracker.cs b/AsbCloudInfrastructure/Services/TelemetryTracker.cs index 7f7fa4ba..324bc0d0 100644 --- a/AsbCloudInfrastructure/Services/TelemetryTracker.cs +++ b/AsbCloudInfrastructure/Services/TelemetryTracker.cs @@ -2,13 +2,42 @@ using System; using System.Collections.Generic; using System.Linq; +using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services.Cache; +using Microsoft.EntityFrameworkCore; namespace AsbCloudInfrastructure.Services { public class TelemetryTracker : ITelemetryTracker { - private Dictionary requests = new Dictionary(); - private readonly TimeSpan timeout = TimeSpan.FromDays(7); + private Dictionary requests; + private readonly TimeSpan timeout; + + public TelemetryTracker(CacheDb cacheDb) + { + timeout = TimeSpan.FromDays(7); + + var options = new DbContextOptionsBuilder() + .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True") + .Options; + using var db = new AsbCloudDbContext(options); + + var cacheTelemetry = cacheDb.GetCachedTable(db); + + var lastTelemetriesDates = (from d in db.TelemetryDataSaub + group d by d.IdTelemetry into g + select new + { + IdTelemetry = g.Max(t => t.IdTelemetry), + Date = g.Max(t => t.Date) + }).ToList(); + + requests = lastTelemetriesDates.Select(t => new + { + Uid = cacheTelemetry.FirstOrDefault(c => c.Id == t.IdTelemetry).RemoteUid, + t.Date + }).ToDictionary(t => t.Uid, u => u.Date); + } public void SaveRequestDate(string uid) { @@ -25,7 +54,7 @@ namespace AsbCloudInfrastructure.Services return requests.Keys; } - private void DeleteOldRequestDates() + private void DeleteOldRequestDates() // TODO: удалить этот метод { requests = requests.Where(dValue => (DateTime.Now - dValue.Value) < timeout) .ToDictionary(dValue => dValue.Key, dValue => dValue.Value); diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 71c2e0ba..1b49d0b2 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -29,15 +29,13 @@ namespace AsbCloudInfrastructure.Services public DateTime GetLastTelemetryDate(int idWell) { - var defaultDate = DateTime.MinValue; var well = cacheWells.FirstOrDefault(w => w.Id == idWell); if (well?.IdTelemetry is null) - return defaultDate; + return DateTime.MinValue; - var lastTelemetry = db.TelemetryDataSaub - .FirstOrDefault(t => t.Id == well.IdTelemetry); - return lastTelemetry?.Date ?? defaultDate; + var lastTelemetryDate = telemetryService.GetLastTelemetryDate((int)well.IdTelemetry); + return lastTelemetryDate; } public async Task> GetTransmittingWellsAsync(int idCompany,