diff --git a/AsbCloudApp/Services/ITelemetryService.cs b/AsbCloudApp/Services/ITelemetryService.cs index c46a32ec..5416baf7 100644 --- a/AsbCloudApp/Services/ITelemetryService.cs +++ b/AsbCloudApp/Services/ITelemetryService.cs @@ -1,6 +1,5 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.SAUB; -using System; using System.Threading; using System.Threading.Tasks; @@ -28,7 +27,7 @@ namespace AsbCloudApp.Services /// /// /// - int GetOrCreateTelemetryIdByUid(string uid); + TelemetryDto GetOrCreateTelemetryByUid(string uid); /// /// получить временную зону скважины по idTelemetry diff --git a/AsbCloudInfrastructure/ReportDataSourcePgCloud.cs b/AsbCloudInfrastructure/ReportDataSourcePgCloud.cs index cde86686..13a44914 100644 --- a/AsbCloudInfrastructure/ReportDataSourcePgCloud.cs +++ b/AsbCloudInfrastructure/ReportDataSourcePgCloud.cs @@ -8,9 +8,9 @@ using System.Linq; namespace AsbCloudInfrastructure { - public class ReportDataSourcePgCloud : IReportDataSource { + private const string DefaultTimezoneId = "Asia/Yekaterinburg"; private readonly IAsbCloudDbContext context; private readonly int? idTelemetry; @@ -36,14 +36,11 @@ namespace AsbCloudInfrastructure .Include(w => w.RelationCompaniesWells) .ThenInclude(r => r.Company) .Include(w => w.Telemetry) - .FirstOrDefault(w => w.Id == idWell); + .FirstOrDefault(w => w.Id == idWell) + ?? throw new ArgumentInvalidException("idWell doesn`t exist", nameof(idWell)); - if(well is null) - throw new ArgumentInvalidException("idWell doesn`t exist", nameof(idWell)); - - idTelemetry = well?.IdTelemetry; - if (idTelemetry is null) - throw new ArgumentInvalidException($"Well {idWell} doesn't contain telemetry", nameof(idWell)); + idTelemetry = well?.IdTelemetry + ?? throw new ArgumentInvalidException($"Well {idWell} doesn't contain telemetry", nameof(idWell)); events = context.TelemetryEvents .Where(e => e.IdTelemetry == idTelemetry) @@ -62,7 +59,7 @@ namespace AsbCloudInfrastructure Well = well.Caption, Customer = well.RelationCompaniesWells.FirstOrDefault(c => c.Company.IdCompanyType == 1)?.Company.Caption, DrillingStartDate = well.Telemetry?.Info?.DrillingStartDate.ToRemoteDateTime(timezoneOffset) ?? default, - TimeZoneId = well.Telemetry?.Info?.TimeZoneId ?? well.Timezone?.TimezoneId ?? default, + TimeZoneId = well.Telemetry?.Info?.TimeZoneId ?? well.Timezone?.TimezoneId ?? DefaultTimezoneId, TimeZoneOffsetTotalHours = timezoneOffset, }; } diff --git a/AsbCloudInfrastructure/Repository/TelemetryWirelineRunOutRepository.cs b/AsbCloudInfrastructure/Repository/TelemetryWirelineRunOutRepository.cs index 410ee78c..81427cf6 100644 --- a/AsbCloudInfrastructure/Repository/TelemetryWirelineRunOutRepository.cs +++ b/AsbCloudInfrastructure/Repository/TelemetryWirelineRunOutRepository.cs @@ -31,7 +31,7 @@ namespace AsbCloudInfrastructure.Repository /// public async Task AddOrUpdateAsync(string uid, TelemetryWirelineRunOutBaseDto dto, CancellationToken token) { - var idTelemetry = telemetryService.GetOrCreateTelemetryIdByUid(uid); + var idTelemetry = telemetryService.GetOrCreateTelemetryByUid(uid).Id; var timezoneOffset = telemetryService.GetTimezone(idTelemetry).Hours; var entity = Convert(idTelemetry, dto, timezoneOffset); diff --git a/AsbCloudInfrastructure/Services/SAUB/EventService.cs b/AsbCloudInfrastructure/Services/SAUB/EventService.cs index eb60b691..2d861562 100644 --- a/AsbCloudInfrastructure/Services/SAUB/EventService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/EventService.cs @@ -30,12 +30,12 @@ namespace AsbCloudInfrastructure.Services.SAUB if (!dtos.Any()) return; - var telemetryId = telemetryService.GetOrCreateTelemetryIdByUid(uid); + var telemetry = telemetryService.GetOrCreateTelemetryByUid(uid); var entities = dtos.Select(dto => new TelemetryEvent { IdEvent = dto.Id, - IdTelemetry = telemetryId, + IdTelemetry = telemetry.Id, IdCategory = dto.IdCategory, MessageTemplate = dto.Message }); @@ -43,5 +43,4 @@ namespace AsbCloudInfrastructure.Services.SAUB memoryCache.DropBasic(); } } - } diff --git a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs index a35e5886..7b49d5c8 100644 --- a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs @@ -139,14 +139,14 @@ namespace AsbCloudInfrastructure.Services.SAUB if (!dtos.Any()) return Task.CompletedTask; - var telemetryId = telemetryService.GetOrCreateTelemetryIdByUid(uid); - var timezone = telemetryService.GetTimezone(telemetryId); + var telemetry = telemetryService.GetOrCreateTelemetryByUid(uid); + var timezone = telemetryService.GetTimezone(telemetry.Id); foreach (var dto in dtos) { var entity = dto.Adapt(); entity.Id = 0; - entity.IdTelemetry = telemetryId; + entity.IdTelemetry = telemetry.Id; entity.DateTime = dto.Date.ToUtcDateTimeOffset(timezone.Hours); db.TelemetryMessages.Add(entity); } diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs index 359efd18..ffd6416c 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs @@ -9,7 +9,6 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; - namespace AsbCloudInfrastructure.Services.SAUB { public abstract class TelemetryDataBaseService : ITelemetryDataService @@ -51,15 +50,15 @@ namespace AsbCloudInfrastructure.Services.SAUB dtosList.Remove(duplicate); } - var idTelemetry = telemetryService.GetOrCreateTelemetryIdByUid(uid); - var timezone = telemetryService.GetTimezone(idTelemetry); + var telemetry = telemetryService.GetOrCreateTelemetryByUid(uid); + var timezone = telemetryService.GetTimezone(telemetry.Id); - telemetryDataCache.AddRange(idTelemetry, dtos); + telemetryDataCache.AddRange(telemetry.Id, dtos); var entities = dtosList.Select(dto => { var entity = Convert(dto, timezone.Hours); - entity.IdTelemetry = idTelemetry; + entity.IdTelemetry = telemetry.Id; return entity; }); @@ -76,7 +75,7 @@ namespace AsbCloudInfrastructure.Services.SAUB stopwatch.Stop(); Trace.WriteLine($"Fail to save data telemetry " + $"uid: {uid}, " + - $"idTelemetry {idTelemetry}, " + + $"idTelemetry {telemetry.Id}, " + $"count: {entities.Count()}, " + $"dataDate: {entities.FirstOrDefault()?.DateTime}, " + $"dbSaveDurationTime:{stopwatch.ElapsedMilliseconds}ms. " + diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs index 8728cdaf..1ec0b0cf 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs @@ -14,7 +14,6 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.SAUB { - public class TelemetryService : ITelemetryService { private readonly IAsbCloudDbContext db; @@ -53,16 +52,13 @@ namespace AsbCloudInfrastructure.Services.SAUB return cacheDataRange; } - public int GetOrCreateTelemetryIdByUid(string uid) - => GetOrCreateTelemetryByUid(uid).Id; - public int? GetIdWellByTelemetryUid(string uid) => GetWellByTelemetryUid(uid)?.Id; public async Task UpdateInfoAsync(string uid, TelemetryInfoDto info, CancellationToken token) { - var telemetry = GetOrCreateTelemetryByUid(uid); + var telemetry = GetOrCreateTelemetry(uid); telemetry.Info = info.Adapt(); if (!string.IsNullOrEmpty(info.TimeZoneId) && @@ -78,6 +74,7 @@ namespace AsbCloudInfrastructure.Services.SAUB DropTelemetryCache(); } + [Obsolete("This method will be private. Use TelemetryDto.TimeZone prop.")] public SimpleTimezoneDto GetTimezone(int idTelemetry) { var telemetry = GetTelemetryCache().FirstOrDefault(t => t.Id == idTelemetry); @@ -85,41 +82,37 @@ namespace AsbCloudInfrastructure.Services.SAUB if (telemetry is null) throw new Exception($"Telemetry id: {idTelemetry} does not exist."); - if (telemetry.Well?.Timezone is not null) - { - telemetry.TimeZone = telemetry.Well.Timezone; - db.Telemetries.Upsert(telemetry); - db.SaveChanges(); - DropTelemetryCache(); + if (telemetry.Well?.Timezone is not null) return telemetry.TimeZone.Adapt(); - } - - if (telemetry.TimeZone is not null) + + if (telemetry.TimeZone is not null) return telemetry.TimeZone.Adapt(); - - if (telemetry.Info is not null) - { - telemetry.TimeZone = new SimpleTimezone - { - Hours = telemetry.Info.TimeZoneOffsetTotalHours, - IsOverride = false, - TimezoneId = telemetry.Info.TimeZoneId, - }; - db.Telemetries.Upsert(telemetry); - db.SaveChanges(); - DropTelemetryCache(); - return telemetry.TimeZone.Adapt(); - } - - + throw new Exception($"Telemetry id: {idTelemetry} can't find timezone."); } public TelemetryBaseDto? GetOrDefaultTelemetryByIdWell(int idWell) { - var telemetry = GetTelemetryCache() + var entity = GetTelemetryCache() .FirstOrDefault(t => t.Well?.Id == idWell); - return telemetry?.Adapt(); + if (entity.Well?.Timezone is not null && entity.TimeZone.Hours != entity.Well.Timezone.Hours) + { + entity.TimeZone = entity.Well.Timezone; + //TODO: выдаем предупреждение! + } + return entity?.Adapt(); + } + + public TelemetryDto GetOrCreateTelemetryByUid(string uid) + { + var entity = GetOrCreateTelemetry(uid); + if(entity.Well?.Timezone is not null && entity.TimeZone.Hours != entity.Well.Timezone.Hours) + { + entity.TimeZone = entity.Well.Timezone; + //TODO: выдаем предупреждение! + } + var dto = entity.Adapt(); + return dto; } private Well? GetWellByTelemetryUid(string uid) @@ -134,7 +127,7 @@ namespace AsbCloudInfrastructure.Services.SAUB return telemetry; } - private Telemetry GetOrCreateTelemetryByUid(string uid) + private Telemetry GetOrCreateTelemetry(string uid) { var telemetry = GetOrDefaultTelemetryByUid(uid); if (telemetry is null) @@ -320,5 +313,4 @@ namespace AsbCloudInfrastructure.Services.SAUB return affected; } } - } diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryUserService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryUserService.cs index 70614a88..20b53c43 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryUserService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryUserService.cs @@ -63,12 +63,12 @@ namespace AsbCloudInfrastructure.Services.SAUB if (!dtos.Any()) return; - var telemetryId = telemetryService.GetOrCreateTelemetryIdByUid(uid); + var telemetry = telemetryService.GetOrCreateTelemetryByUid(uid); var entities = dtos.Distinct(new TelemetryUserDtoComparer()).Select(dto => { var entity = dto.Adapt(); entity.IdUser = dto.Id; - entity.IdTelemetry = telemetryId; + entity.IdTelemetry = telemetry.Id; return entity; }); var result = await db.Database.ExecInsertOrUpdateAsync(db.TelemetryUsers, entities, token); diff --git a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs index 547b53c0..1209ea65 100644 --- a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs @@ -109,8 +109,8 @@ namespace AsbCloudWebApi.Controllers.SAUB [FromBody] IEnumerable dtos, CancellationToken token = default) { - var idTelemetry = telemetryService.GetOrCreateTelemetryIdByUid(uid); - await gtrRepository.SaveDataAsync(idTelemetry, dtos, token).ConfigureAwait(false); + var telemetry = telemetryService.GetOrCreateTelemetryByUid(uid); + await gtrRepository.SaveDataAsync(telemetry.Id, dtos, token).ConfigureAwait(false); var idWell = telemetryService.GetIdWellByTelemetryUid(uid); if (idWell is not null && dtos is not null) _ = Task.Run(() => telemetryHubContext.Clients.Group($"well_{idWell}_gtr") diff --git a/AsbCloudWebApi/Controllers/WITS/WitsControllerAbstract.cs b/AsbCloudWebApi/Controllers/WITS/WitsControllerAbstract.cs index 778ee67b..3e6a46ef 100644 --- a/AsbCloudWebApi/Controllers/WITS/WitsControllerAbstract.cs +++ b/AsbCloudWebApi/Controllers/WITS/WitsControllerAbstract.cs @@ -49,8 +49,8 @@ namespace AsbCloudWebApi.Controllers.WITS [FromServices] IWitsRecordRepository witsRecordRepository, CancellationToken token = default) { - var idTelemetry = telemetryService.GetOrCreateTelemetryIdByUid(uid); - await witsRecordRepository.SaveDataAsync(idTelemetry, dtos, token).ConfigureAwait(false); + var telemetry = telemetryService.GetOrCreateTelemetryByUid(uid); + await witsRecordRepository.SaveDataAsync(telemetry.Id, dtos, token).ConfigureAwait(false); var idWell = telemetryService.GetIdWellByTelemetryUid(uid); if (idWell != null && dtos.Any()) _ = Task.Run(() => telemetryHubContext.Clients.Group($"well_{idWell}_wits")