This commit is contained in:
Фролов 2021-10-18 09:07:59 +05:00
commit 11cf5ee8cf
13 changed files with 103 additions and 64 deletions

View File

@ -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; }
}
}

View File

@ -1,11 +1,15 @@
using AsbCloudApp.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
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);
@ -13,5 +17,7 @@ namespace AsbCloudApp.Services
int? GetIdTelemetryByIdWell(int idWell);
int Merge(IEnumerable<int> telemetryIds);
IEnumerable<(string Key, int[] Ids)> GetRedundentRemoteUids();
Task<IEnumerable<WellDto>> GetTransmittingWellsAsync(int idCompany,
CancellationToken token);
}
}

View File

@ -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<string> GetTransmittingTelemetryUids();
}
}

View File

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

View File

@ -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<IEnumerable<DepositDto>> 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,
}),

View File

@ -5,10 +5,11 @@ using AsbCloudInfrastructure.Services.Cache;
using Mapster;
using System.Collections.Generic;
using System.Linq;
using System;
using Microsoft.EntityFrameworkCore;
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;
using System;
using System.Diagnostics;
using Microsoft.EntityFrameworkCore;
namespace AsbCloudInfrastructure.Services
{
@ -17,12 +18,56 @@ namespace AsbCloudInfrastructure.Services
private readonly CacheTable<Telemetry> cacheTelemetry;
private readonly CacheTable<Well> 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<Telemetry>((AsbCloudDbContext)db);
cacheWells = cacheDb.GetCachedTable<Well>((AsbCloudDbContext)db);
this.db = db;
this.telemetryTracker = telemetryTracker;
}
public async Task<IEnumerable<WellDto>> GetTransmittingWellsAsync(int idCompany, CancellationToken token)
{
var wells = new List<Well>();
IEnumerable<string> 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 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)

View File

@ -10,21 +10,25 @@ namespace AsbCloudInfrastructure.Services
private IDictionary<string, DateTime> requests = new Dictionary<string, DateTime>();
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<string> GetTransmittingTelemetryUids()
{
DeleteOldRequestDates();
return requests.Keys;
}
private void DeleteOldRequestDates()
{
requests = requests.Where(dValue => (DateTime.Now - dValue.Value) < timeout)
.ToDictionary(dValue => dValue.Key, dValue => dValue.Value);
}
}
}

View File

@ -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<RelationCompanyWell> cacheRelationCompaniesWells;
private readonly CacheTable<Well> 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<RelationCompanyWell>((AsbCloudDbContext)db);
cacheWells = cacheDb.GetCachedTable<Well>((AsbCloudDbContext)db);
}
public async Task<IEnumerable<WellDto>> GetTransmittingWellsAsync(int idCompany, CancellationToken token)
{
var wells = new List<Well>();
IEnumerable<string> 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<IEnumerable<WellDto>> GetTransmittingWellsAsync(int idCompany,
CancellationToken token) =>
await telemetryService.GetTransmittingWellsAsync(idCompany, token);
public async Task<IEnumerable<WellDto>> 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<WellDto> GetAsync(int idWell, CancellationToken token)
{
var entity = await db.Wells

View File

@ -23,22 +23,19 @@ namespace AsbCloudWebApi.Controllers
private readonly IEventService eventService;
private readonly ITelemetryUserService telemetryUserService;
private readonly IHubContext<TelemetryHub> telemetryHubContext;
private readonly ITelemetryTracker telemetryTracker;
public TelemetryController(
ITelemetryService telemetryService,
IMessageService messageService,
IEventService eventService,
ITelemetryUserService telemetryUserService,
IHubContext<TelemetryHub> telemetryHubContext,
ITelemetryTracker telemetryTracker)
IHubContext<TelemetryHub> telemetryHubContext)
{
this.telemetryService = telemetryService;
this.messageService = messageService;
this.eventService = eventService;
this.telemetryUserService = telemetryUserService;
this.telemetryHubContext = telemetryHubContext;
this.telemetryTracker = telemetryTracker;
}
/// <summary>
@ -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<TelemetryUserDto> users)
{
telemetryUserService.Upsert(uid, users);
telemetryTracker.SaveRequestDate(uid);
telemetryService.SaveRequestDate(uid);
return Ok();
}

View File

@ -18,7 +18,6 @@ namespace AsbCloudWebApi.Controllers
public abstract class TelemetryDataBaseController<TDto> : ControllerBase
where TDto: ITelemetryData
{
private readonly ITelemetryTracker telemetryTracker;
private readonly ITelemetryService telemetryService;
private readonly ITelemetryDataService<TDto> 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<TDto> telemetryDataService,
IWellService wellService,
IHubContext<TelemetryHub> 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();
}

View File

@ -11,13 +11,11 @@ namespace AsbCloudWebApi.Controllers
public class TelemetryDataSaubController : TelemetryDataBaseController<TelemetryDataSaubDto>
{
public TelemetryDataSaubController(
ITelemetryTracker telemetryTracker,
ITelemetryService telemetryService,
ITelemetryDataService<TelemetryDataSaubDto> telemetryDataService,
IWellService wellService,
IHubContext<TelemetryHub> telemetryHubContext)
: base(
telemetryTracker,
telemetryService,
telemetryDataService,
wellService,

View File

@ -11,13 +11,11 @@ namespace AsbCloudWebApi.Controllers
public class TelemetryDataSpinController : TelemetryDataBaseController<TelemetryDataSpinDto>
{
public TelemetryDataSpinController(
ITelemetryTracker telemetryTracker,
ITelemetryService telemetryService,
ITelemetryDataService<TelemetryDataSpinDto> telemetryDataService,
IWellService wellService,
IHubContext<TelemetryHub> telemetryHubContext)
: base(
telemetryTracker,
telemetryService,
telemetryDataService,
wellService,

View File

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