From 02f344569e7c3df526eb333618a2e981ec59cb16 Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Fri, 15 Oct 2021 12:24:04 +0500 Subject: [PATCH 1/2] CS2-91: Moved TelemetryTracker from WellService to TelemetryService --- AsbCloudApp/Services/ITelemetryService.cs | 6 ++- AsbCloudApp/Services/ITelemetryTracker.cs | 4 +- .../TelemetryAnalyticsBackgroundService.cs | 7 ++- .../Services/TelemetryService.cs | 35 ++++++++++++-- .../Services/TelemetryTracker.cs | 14 ++++-- .../Services/WellService.cs | 46 ++++++------------- .../Controllers/TelemetryController.cs | 13 ++---- .../TelemetryDataBaseController.cs | 5 +- .../TelemetryDataSaubController.cs | 2 - .../TelemetryDataSpinController.cs | 2 - ConsoleApp1/DebugWellOperationsStatService.cs | 3 +- 11 files changed, 75 insertions(+), 62 deletions(-) diff --git a/AsbCloudApp/Services/ITelemetryService.cs b/AsbCloudApp/Services/ITelemetryService.cs index 57b7674d..d0210861 100644 --- a/AsbCloudApp/Services/ITelemetryService.cs +++ b/AsbCloudApp/Services/ITelemetryService.cs @@ -1,6 +1,7 @@ using AsbCloudApp.Data; using System.Collections.Generic; -using System.Linq; +using System.Threading; +using System.Threading.Tasks; namespace AsbCloudApp.Services { @@ -13,5 +14,8 @@ namespace AsbCloudApp.Services int? GetIdTelemetryByIdWell(int idWell); int Merge(IEnumerable telemetryIds); IEnumerable<(string Key, int[] Ids)> GetRedundentRemoteUids(); + Task> GetTransmittingWellsAsync(int idCompany, + CancellationToken token); + void SaveRequestDate(string uid); } } diff --git a/AsbCloudApp/Services/ITelemetryTracker.cs b/AsbCloudApp/Services/ITelemetryTracker.cs index 36f21b8b..6a3aa555 100644 --- a/AsbCloudApp/Services/ITelemetryTracker.cs +++ b/AsbCloudApp/Services/ITelemetryTracker.cs @@ -1,10 +1,12 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace AsbCloudApp.Services { public interface ITelemetryTracker { void SaveRequestDate(string uid); + DateTime GetLastTelemetryDateByUid(string uid); IEnumerable GetTransmittingTelemetryUids(); } } diff --git a/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsBackgroundService.cs b/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsBackgroundService.cs index df5e9a10..9d41fbb5 100644 --- a/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsBackgroundService.cs @@ -5,6 +5,7 @@ using System.Diagnostics; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Hosting; using AsbCloudInfrastructure.Services.Cache; +using AsbCloudApp.Services; using AsbCloudDb.Model; namespace AsbCloudInfrastructure.Services.Analysis @@ -12,11 +13,13 @@ namespace AsbCloudInfrastructure.Services.Analysis public class TelemetryAnalyticsBackgroundService : BackgroundService { private readonly CacheDb cacheDb; + private readonly ITelemetryTracker telemetryTracker; private readonly TimeSpan period = TimeSpan.FromHours(1); - public TelemetryAnalyticsBackgroundService(CacheDb cacheDb) + public TelemetryAnalyticsBackgroundService(CacheDb cacheDb, ITelemetryTracker telemetryTracker) { this.cacheDb = cacheDb; + this.telemetryTracker = telemetryTracker; } protected override async Task ExecuteAsync(CancellationToken token = default) @@ -34,7 +37,7 @@ namespace AsbCloudInfrastructure.Services.Analysis try { using var context = new AsbCloudDbContext(options); - var telemetryService = new TelemetryService(context, cacheDb); + var telemetryService = new TelemetryService(context, telemetryTracker, cacheDb); var analyticsService = new TelemetryAnalyticsService(context, telemetryService, cacheDb); diff --git a/AsbCloudInfrastructure/Services/TelemetryService.cs b/AsbCloudInfrastructure/Services/TelemetryService.cs index 8a46b620..039c9958 100644 --- a/AsbCloudInfrastructure/Services/TelemetryService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryService.cs @@ -5,10 +5,10 @@ using AsbCloudInfrastructure.Services.Cache; using Mapster; using System.Collections.Generic; using System.Linq; +using System.Threading; +using System.Threading.Tasks; using System; using Microsoft.EntityFrameworkCore; -using System.Threading.Tasks; -using System.Threading; namespace AsbCloudInfrastructure.Services { @@ -17,16 +17,43 @@ namespace AsbCloudInfrastructure.Services private readonly CacheTable cacheTelemetry; private readonly CacheTable cacheWells; private readonly IAsbCloudDbContext db; + private readonly ITelemetryTracker telemetryTracker; - public TelemetryService(IAsbCloudDbContext db, CacheDb cacheDb) + public TelemetryService(IAsbCloudDbContext db, ITelemetryTracker telemetryTracker, + CacheDb cacheDb) { cacheTelemetry = cacheDb.GetCachedTable((AsbCloudDbContext)db); cacheWells = cacheDb.GetCachedTable((AsbCloudDbContext)db); this.db = db; + this.telemetryTracker = telemetryTracker; + } + + public async Task> GetTransmittingWellsAsync(int idCompany, CancellationToken token) + { + var wells = new List(); + IEnumerable activeTelemetriesUids = telemetryTracker.GetTransmittingTelemetryUids(); + if (activeTelemetriesUids.Any()) + { + wells = await db.GetWellsForCompany(idCompany) + .Where(w => activeTelemetriesUids.Contains(w.Telemetry.RemoteUid)) + .AsNoTracking() + .ToListAsync(token) + .ConfigureAwait(false); + } + return wells.Select(w => new WellDto + { + Id = w.Id, + Caption = w.Caption, + Cluster = w.Cluster.Caption, + Deposit = w.Cluster.Deposit.Caption, + }); } + public void SaveRequestDate(string uid) => + telemetryTracker.SaveRequestDate(uid); + public int GetOrCreateTemetryIdByUid(string uid) - => GetOrCreateTelemetryByUid(uid).Id; + => GetOrCreateTelemetryByUid(uid).Id; public int? GetidWellByTelemetryUid(string uid) => GetWellByTelemetryUid(uid)?.Id; diff --git a/AsbCloudInfrastructure/Services/TelemetryTracker.cs b/AsbCloudInfrastructure/Services/TelemetryTracker.cs index 158dcb46..fb34f968 100644 --- a/AsbCloudInfrastructure/Services/TelemetryTracker.cs +++ b/AsbCloudInfrastructure/Services/TelemetryTracker.cs @@ -10,21 +10,25 @@ namespace AsbCloudInfrastructure.Services private IDictionary requests = new Dictionary(); private readonly TimeSpan timeout = TimeSpan.FromMinutes(6); - private void DeleteOldRequestDates() - { - requests = requests.Where(dValue => (DateTime.Now - dValue.Value) < timeout).ToDictionary(dValue => dValue.Key, dValue => dValue.Value); - } - public void SaveRequestDate(string uid) { requests[uid] = DateTime.Now; DeleteOldRequestDates(); } + public DateTime GetLastTelemetryDateByUid(string uid) => + requests[uid]; + public IEnumerable GetTransmittingTelemetryUids() { DeleteOldRequestDates(); return requests.Keys; } + + private void DeleteOldRequestDates() + { + 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 c2419829..314423c0 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -15,37 +15,32 @@ namespace AsbCloudInfrastructure.Services public class WellService : IWellService { private readonly IAsbCloudDbContext db; - private readonly ITelemetryTracker telemetryTracker; + private readonly ITelemetryService telemetryService; private readonly CacheTable cacheRelationCompaniesWells; private readonly CacheTable cacheWells; - public WellService(IAsbCloudDbContext db, ITelemetryTracker telemetryTracker, CacheDb cacheDb) + public WellService(IAsbCloudDbContext db, ITelemetryService telemetryService, CacheDb cacheDb) { this.db = db; - this.telemetryTracker = telemetryTracker; + this.telemetryService = telemetryService; cacheRelationCompaniesWells = cacheDb.GetCachedTable((AsbCloudDbContext)db); cacheWells = cacheDb.GetCachedTable((AsbCloudDbContext)db); } - - public async Task> GetTransmittingWellsAsync(int idCompany, CancellationToken token) - { - var wells = new List(); - IEnumerable activeTelemetriesUids = telemetryTracker.GetTransmittingTelemetryUids(); - if (activeTelemetriesUids.Any()) - { - wells = await db.GetWellsForCompany(idCompany) - .Where(w => activeTelemetriesUids.Contains(w.Telemetry.RemoteUid)) - .AsNoTracking() - .ToListAsync(token) - .ConfigureAwait(false); - } - return wells.Select(w => From(w)); - } + + public async Task> GetTransmittingWellsAsync(int idCompany, + CancellationToken token) => + await telemetryService.GetTransmittingWellsAsync(idCompany, token); public async Task> GetWellsByCompanyAsync(int idCompany, CancellationToken token) { var wells = await db.GetWellsForCompany(idCompany).ToListAsync(token); - return wells.Select(w => From(w)); + return wells.Select(w => new WellDto + { + Id = w.Id, + Caption = w.Caption, + Cluster = w.Cluster.Caption, + Deposit = w.Cluster.Deposit.Caption, + }); } public bool IsCompanyInvolvedInWell(int idCompany, int idWell) @@ -55,19 +50,6 @@ namespace AsbCloudInfrastructure.Services => await cacheRelationCompaniesWells.ContainsAsync(r => r.IdWell == idWell && r.IdCompany == idCompany, token).ConfigureAwait(false); - private static WellDto From(Well well) - { - var wellDto = new WellDto - { - Id = well.Id, - Caption = well.Caption, - Cluster = well.Cluster.Caption, - Deposit = well.Cluster.Deposit.Caption, - }; - - return wellDto; - } - public async Task GetAsync(int idWell, CancellationToken token) { var entity = await db.Wells diff --git a/AsbCloudWebApi/Controllers/TelemetryController.cs b/AsbCloudWebApi/Controllers/TelemetryController.cs index bc160429..5a5455ae 100644 --- a/AsbCloudWebApi/Controllers/TelemetryController.cs +++ b/AsbCloudWebApi/Controllers/TelemetryController.cs @@ -23,22 +23,19 @@ namespace AsbCloudWebApi.Controllers private readonly IEventService eventService; private readonly ITelemetryUserService telemetryUserService; private readonly IHubContext telemetryHubContext; - private readonly ITelemetryTracker telemetryTracker; public TelemetryController( ITelemetryService telemetryService, IMessageService messageService, IEventService eventService, ITelemetryUserService telemetryUserService, - IHubContext telemetryHubContext, - ITelemetryTracker telemetryTracker) + IHubContext telemetryHubContext) { this.telemetryService = telemetryService; this.messageService = messageService; this.eventService = eventService; this.telemetryUserService = telemetryUserService; this.telemetryHubContext = telemetryHubContext; - this.telemetryTracker = telemetryTracker; } /// @@ -52,7 +49,7 @@ namespace AsbCloudWebApi.Controllers public IActionResult PostInfo(string uid, [FromBody] TelemetryInfoDto info) { telemetryService.UpdateInfo(uid, info); - telemetryTracker.SaveRequestDate(uid); + telemetryService.SaveRequestDate(uid); return Ok(); } @@ -75,7 +72,7 @@ namespace AsbCloudWebApi.Controllers await Task.Run(() => telemetryHubContext.Clients.Group($"well_{idWell}") .SendAsync("ReceiveMessages", dtos), token).ConfigureAwait(false); - telemetryTracker.SaveRequestDate(uid); + telemetryService.SaveRequestDate(uid); return Ok(); } @@ -93,7 +90,7 @@ namespace AsbCloudWebApi.Controllers { await eventService.UpsertAsync(uid, events, token) .ConfigureAwait(false); - telemetryTracker.SaveRequestDate(uid); + telemetryService.SaveRequestDate(uid); return Ok(); } @@ -108,7 +105,7 @@ namespace AsbCloudWebApi.Controllers public IActionResult PostUsers(string uid, [FromBody] List users) { telemetryUserService.Upsert(uid, users); - telemetryTracker.SaveRequestDate(uid); + telemetryService.SaveRequestDate(uid); return Ok(); } diff --git a/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs b/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs index 93bf0658..531f5eee 100644 --- a/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs +++ b/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs @@ -18,7 +18,6 @@ namespace AsbCloudWebApi.Controllers public abstract class TelemetryDataBaseController : ControllerBase where TDto: ITelemetryData { - private readonly ITelemetryTracker telemetryTracker; private readonly ITelemetryService telemetryService; private readonly ITelemetryDataService telemetryDataService; private readonly IWellService wellService; @@ -27,13 +26,11 @@ namespace AsbCloudWebApi.Controllers public string SirnalRMethodGetDataName { get; protected set; } = "ReceiveData"; public TelemetryDataBaseController( - ITelemetryTracker telemetryTracker, ITelemetryService telemetryService, ITelemetryDataService telemetryDataService, IWellService wellService, IHubContext telemetryHubContext) { - this.telemetryTracker = telemetryTracker; this.telemetryService = telemetryService; this.telemetryDataService = telemetryDataService; this.wellService = wellService; @@ -60,7 +57,7 @@ namespace AsbCloudWebApi.Controllers await Task.Run(() => telemetryHubContext.Clients.Group($"well_{idWell}") .SendAsync(SirnalRMethodGetDataName, dtos), token).ConfigureAwait(false); - telemetryTracker.SaveRequestDate(uid); + telemetryService.SaveRequestDate(uid); return Ok(); } diff --git a/AsbCloudWebApi/Controllers/TelemetryDataSaubController.cs b/AsbCloudWebApi/Controllers/TelemetryDataSaubController.cs index bd704681..c24fd103 100644 --- a/AsbCloudWebApi/Controllers/TelemetryDataSaubController.cs +++ b/AsbCloudWebApi/Controllers/TelemetryDataSaubController.cs @@ -11,13 +11,11 @@ namespace AsbCloudWebApi.Controllers public class TelemetryDataSaubController : TelemetryDataBaseController { public TelemetryDataSaubController( - ITelemetryTracker telemetryTracker, ITelemetryService telemetryService, ITelemetryDataService telemetryDataService, IWellService wellService, IHubContext telemetryHubContext) : base( - telemetryTracker, telemetryService, telemetryDataService, wellService, diff --git a/AsbCloudWebApi/Controllers/TelemetryDataSpinController.cs b/AsbCloudWebApi/Controllers/TelemetryDataSpinController.cs index a1c132e4..286efdf2 100644 --- a/AsbCloudWebApi/Controllers/TelemetryDataSpinController.cs +++ b/AsbCloudWebApi/Controllers/TelemetryDataSpinController.cs @@ -11,13 +11,11 @@ namespace AsbCloudWebApi.Controllers public class TelemetryDataSpinController : TelemetryDataBaseController { public TelemetryDataSpinController( - ITelemetryTracker telemetryTracker, ITelemetryService telemetryService, ITelemetryDataService telemetryDataService, IWellService wellService, IHubContext telemetryHubContext) : base( - telemetryTracker, telemetryService, telemetryDataService, wellService, diff --git a/ConsoleApp1/DebugWellOperationsStatService.cs b/ConsoleApp1/DebugWellOperationsStatService.cs index bd938666..80d88522 100644 --- a/ConsoleApp1/DebugWellOperationsStatService.cs +++ b/ConsoleApp1/DebugWellOperationsStatService.cs @@ -21,7 +21,8 @@ namespace ConsoleApp1 .Options; using var db = new AsbCloudDbContext(options); var cacheDb = new CacheDb(); - var wellService = new WellService(db, new TelemetryTracker(), cacheDb); + var telemetryService = new TelemetryService(db, new TelemetryTracker(), cacheDb); + var wellService = new WellService(db, telemetryService, cacheDb); var wellOptsStat = new WellOperationsStatService(db, cacheDb, wellService); var tvd = wellOptsStat.GetTvdAsync(1, default).Result; Print(tvd); From 3a6f5e7f5e001fa60e718efe7c716f4d4ca55367 Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Fri, 15 Oct 2021 15:35:18 +0500 Subject: [PATCH 2/2] Added last received telemetry date in WellDto --- AsbCloudApp/Data/WellDto.cs | 5 ++++- AsbCloudApp/Services/ITelemetryService.cs | 4 +++- .../Services/ClusterService.cs | 5 ++++- .../Services/TelemetryService.cs | 20 ++++++++++++++++++- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/AsbCloudApp/Data/WellDto.cs b/AsbCloudApp/Data/WellDto.cs index ad156b45..5b03df56 100644 --- a/AsbCloudApp/Data/WellDto.cs +++ b/AsbCloudApp/Data/WellDto.cs @@ -1,4 +1,6 @@ -namespace AsbCloudApp.Data +using System; + +namespace AsbCloudApp.Data { public class WellDto : WellInfoDto, IMapPoint, IId @@ -7,6 +9,7 @@ public double? Latitude { get; set; } public double? Longitude { get; set; } public string WellType { get; set; } + public DateTime LastTelemetryDate { get; set; } public TelemetryDto Telemetry { get; set; } } } diff --git a/AsbCloudApp/Services/ITelemetryService.cs b/AsbCloudApp/Services/ITelemetryService.cs index d0210861..8cd7bf4c 100644 --- a/AsbCloudApp/Services/ITelemetryService.cs +++ b/AsbCloudApp/Services/ITelemetryService.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -7,6 +8,8 @@ namespace AsbCloudApp.Services { public interface ITelemetryService { + void SaveRequestDate(string uid); + DateTime GetLastTelemetryDateByWellId(int idWell); int? GetidWellByTelemetryUid(string uid); int GetOrCreateTemetryIdByUid(string uid); double GetTimezoneOffsetByTelemetryId(int idTelemetry); @@ -16,6 +19,5 @@ namespace AsbCloudApp.Services IEnumerable<(string Key, int[] Ids)> GetRedundentRemoteUids(); Task> GetTransmittingWellsAsync(int idCompany, CancellationToken token); - void SaveRequestDate(string uid); } } diff --git a/AsbCloudInfrastructure/Services/ClusterService.cs b/AsbCloudInfrastructure/Services/ClusterService.cs index 88e8515e..10901010 100644 --- a/AsbCloudInfrastructure/Services/ClusterService.cs +++ b/AsbCloudInfrastructure/Services/ClusterService.cs @@ -13,10 +13,12 @@ namespace AsbCloudInfrastructure.Services public class ClusterService : IClusterService { private readonly IAsbCloudDbContext db; + private readonly ITelemetryService telemetryService; - public ClusterService(IAsbCloudDbContext db) + public ClusterService(IAsbCloudDbContext db, ITelemetryService telemetryService) { this.db = db; + this.telemetryService = telemetryService; } public async Task> GetDepositsAsync(int idCompany, @@ -142,6 +144,7 @@ namespace AsbCloudInfrastructure.Services Latitude = well.Latitude, Longitude = well.Longitude, WellType = well.WellType?.Caption, + LastTelemetryDate = telemetryService.GetLastTelemetryDateByWellId(well.Id), Cluster = gCluster.Key.Caption, Deposit = gDeposit.Key.Caption, }), diff --git a/AsbCloudInfrastructure/Services/TelemetryService.cs b/AsbCloudInfrastructure/Services/TelemetryService.cs index 039c9958..e6e1e140 100644 --- a/AsbCloudInfrastructure/Services/TelemetryService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryService.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using System; +using System.Diagnostics; using Microsoft.EntityFrameworkCore; namespace AsbCloudInfrastructure.Services @@ -52,8 +53,25 @@ namespace AsbCloudInfrastructure.Services public void SaveRequestDate(string uid) => telemetryTracker.SaveRequestDate(uid); + public DateTime GetLastTelemetryDateByWellId(int idWell) + { + try + { + var telemetryId = GetIdTelemetryByIdWell(idWell); + var uid = cacheTelemetry.FirstOrDefault(t => t.Id == telemetryId).RemoteUid; + var lastTelemetryDate = telemetryTracker.GetLastTelemetryDateByUid(uid); + return lastTelemetryDate; + } + catch(Exception ex) + { + Trace.TraceError(ex.Message); + Console.WriteLine(ex.Message); + return DateTime.MinValue; + } + } + public int GetOrCreateTemetryIdByUid(string uid) - => GetOrCreateTelemetryByUid(uid).Id; + => GetOrCreateTelemetryByUid(uid).Id; public int? GetidWellByTelemetryUid(string uid) => GetWellByTelemetryUid(uid)?.Id;