From 4bed0623f1e147c6b90d3dcfcc795735c036852c Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Thu, 18 Nov 2021 11:24:21 +0500 Subject: [PATCH] CS2-119: Added dates change to well timezone if requested --- AsbCloudApp/Services/IMessageService.cs | 5 ++- AsbCloudApp/Services/ITelemetryDataService.cs | 7 +++- .../Services/MessageService.cs | 18 +++++++++ .../Services/TelemetryDataBaseService.cs | 39 +++++++++++++++++-- .../Controllers/MessageController.cs | 4 +- .../TelemetryDataBaseController.cs | 10 +++-- 6 files changed, 71 insertions(+), 12 deletions(-) diff --git a/AsbCloudApp/Services/IMessageService.cs b/AsbCloudApp/Services/IMessageService.cs index e51b56df..5909a89a 100644 --- a/AsbCloudApp/Services/IMessageService.cs +++ b/AsbCloudApp/Services/IMessageService.cs @@ -9,9 +9,10 @@ namespace AsbCloudApp.Services public interface IMessageService { Task> GetMessagesAsync(int idWell, - IEnumerable categoryids = null, DateTime begin = default, + IEnumerable categoryids = default, DateTime begin = default, DateTime end = default, string searchString = default, - int skip = 0, int take = 32, CancellationToken token = default); + int skip = 0, int take = 32, bool isUtc = true, + CancellationToken token = default); Task GetMessagesDatesRangeAsync(int idWell, CancellationToken token = default); Task InsertAsync(string uid, IEnumerable dtos, diff --git a/AsbCloudApp/Services/ITelemetryDataService.cs b/AsbCloudApp/Services/ITelemetryDataService.cs index c9839126..c7530027 100644 --- a/AsbCloudApp/Services/ITelemetryDataService.cs +++ b/AsbCloudApp/Services/ITelemetryDataService.cs @@ -8,8 +8,11 @@ namespace AsbCloudApp.Services { public interface ITelemetryDataService where TDto : ITelemetryData { - Task> GetAsync(int idWell, DateTime dateBegin = default, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default); - Task GetDataDatesRangeAsync(int idWell, CancellationToken token = default); + Task> GetAsync(int idWell, + DateTime dateBegin = default, double intervalSec = 600d, + int approxPointsCount = 1024, bool isUtc = false, CancellationToken token = default); + Task GetDataDatesRangeAsync(int idWell, bool isUtc, + CancellationToken token = default); Task UpdateDataAsync(string uid, IEnumerable dtos, CancellationToken token = default); } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/MessageService.cs b/AsbCloudInfrastructure/Services/MessageService.cs index 07f08283..6b79043b 100644 --- a/AsbCloudInfrastructure/Services/MessageService.cs +++ b/AsbCloudInfrastructure/Services/MessageService.cs @@ -16,6 +16,7 @@ namespace AsbCloudInfrastructure.Services { private readonly IAsbCloudDbContext db; private readonly ITelemetryService telemetryService; + private readonly CacheTable cacheTelemetry; private readonly CacheTable cacheEvents; private readonly CacheTable cacheTUsers; @@ -23,6 +24,7 @@ namespace AsbCloudInfrastructure.Services { this.db = db; this.telemetryService = telemetryService; + cacheTelemetry = cacheDb.GetCachedTable((AsbCloudDbContext)db); cacheEvents = cacheDb.GetCachedTable((AsbCloudDbContext)db); cacheTUsers = cacheDb.GetCachedTable((AsbCloudDbContext)db); } @@ -35,6 +37,7 @@ namespace AsbCloudInfrastructure.Services string searchString = default, int skip = 0, int take = 32, + bool isUtc = true, CancellationToken token = default) { var telemetryId = telemetryService.GetIdTelemetryByIdWell(idWell); @@ -121,6 +124,21 @@ namespace AsbCloudInfrastructure.Services result.Items.Add(messageDto); } + if (isUtc) + return result; + + var telemetry = await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == telemetryId, + token).ConfigureAwait(false); + + if (telemetry?.TelemetryTimeZone is null) + return result; + + result.Items = result.Items.Select(m => + { + m.Date = m.Date.AddHours(telemetry.TelemetryTimeZone.Hours); + return m; + }).ToList(); + return result; } diff --git a/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs index f8258785..3f92febc 100644 --- a/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs @@ -84,7 +84,7 @@ namespace AsbCloudInfrastructure.Services public virtual async Task> GetAsync(int idWell, DateTime dateBegin = default, double intervalSec = 600d, - int approxPointsCount = 1024, CancellationToken token = default) + int approxPointsCount = 1024, bool isUtc = true, CancellationToken token = default) { var well = cacheWells.FirstOrDefault(w => w.Id == idWell); if (well?.IdTelemetry is null) @@ -132,10 +132,25 @@ namespace AsbCloudInfrastructure.Services var dtos = entities.Select(e => Convert(e)); + if (isUtc) + return dtos; + + var telemetry = await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == well.IdTelemetry, + token).ConfigureAwait(false); + + if (telemetry?.TelemetryTimeZone is null) + return dtos; + + dtos = dtos.Select(d => + { + d.Date = d.Date.AddHours(telemetry.TelemetryTimeZone.Hours); + return d; + }); + return dtos; } - public virtual async Task GetDataDatesRangeAsync(int idWell, + public virtual async Task GetDataDatesRangeAsync(int idWell, bool isUtc, CancellationToken token = default) { var telemetryId = telemetryService.GetIdTelemetryByIdWell(idWell); @@ -145,7 +160,25 @@ namespace AsbCloudInfrastructure.Services var (From, To) = await db.GetDatesRangeAsync((int)telemetryId, token) .ConfigureAwait(false); - return new DatesRangeDto { From = From, To = To }; + var result = new DatesRangeDto {From = From, To = To}; + + if (isUtc) + return result; + + var telemetry = await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == telemetryId, + token).ConfigureAwait(false); + + if (telemetry?.TelemetryTimeZone is null) + return result; + + result = new DatesRangeDto() + { + From = From.AddHours(telemetry.TelemetryTimeZone.Hours), + To = To.AddHours(telemetry.TelemetryTimeZone.Hours) + }; + + return result; + } public abstract TDto Convert(TModel src); diff --git a/AsbCloudWebApi/Controllers/MessageController.cs b/AsbCloudWebApi/Controllers/MessageController.cs index f63fcd1d..6dcc9321 100644 --- a/AsbCloudWebApi/Controllers/MessageController.cs +++ b/AsbCloudWebApi/Controllers/MessageController.cs @@ -31,6 +31,7 @@ namespace AsbCloudWebApi.Controllers /// для пагинации кол-во записей пропустить /// для пагинации кол-во записей /// Строка поиска + /// Даты в формате UTC или часового пояса скважины /// Токен для отмены задачи /// список сообщений по скважине [HttpGet] @@ -39,6 +40,7 @@ namespace AsbCloudWebApi.Controllers [FromQuery] IEnumerable categoryids = default, DateTime begin = default, DateTime end = default, string searchString = default, + bool isUtc = true, CancellationToken token = default) { if (take > 1024) @@ -49,7 +51,7 @@ namespace AsbCloudWebApi.Controllers var result = await messageService.GetMessagesAsync(idWell, categoryids, begin, end, searchString, - skip, take, token).ConfigureAwait(false); + skip, take, isUtc, token).ConfigureAwait(false); if (result is null || result.Count == 0) return NoContent(); diff --git a/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs b/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs index 04fdc659..1b201cd8 100644 --- a/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs +++ b/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs @@ -68,11 +68,12 @@ namespace AsbCloudWebApi.Controllers /// дата начала выборки. По умолчанию: текущее время - intervalSec /// интервал времени даты начала выборки, секунды /// желаемое количество точек. Если в выборке точек будет больше, то выборка будет прорежена. + /// Даты в формате UTC или часового пояса скважины /// Токен завершения задачи /// [HttpGet("{idWell}")] public virtual async Task> GetDataAsync(int idWell, DateTime begin = default, - int intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default) + int intervalSec = 600, int approxPointsCount = 1024, bool isUtc = true, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); @@ -86,7 +87,7 @@ namespace AsbCloudWebApi.Controllers return Forbid(); var content = await telemetryDataService.GetAsync(idWell, begin, - intervalSec, approxPointsCount, token).ConfigureAwait(false); + intervalSec, approxPointsCount, isUtc, token).ConfigureAwait(false); return Ok(content); } @@ -95,12 +96,13 @@ namespace AsbCloudWebApi.Controllers /// Возвращает диапазон дат сохраненных данных. /// /// id скважины + /// Даты в формате UTC или часового пояса скважины /// Токен завершения задачи /// [HttpGet] [Route("{idWell}/datesRange")] [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] - public virtual async Task GetDataDatesRangeAsync(int idWell, + public virtual async Task GetDataDatesRangeAsync(int idWell, bool isUtc = true, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); @@ -114,7 +116,7 @@ namespace AsbCloudWebApi.Controllers if (!isCompanyOwnsWell) return Forbid(); - var dataDatesRange = await telemetryDataService.GetDataDatesRangeAsync(idWell, + var dataDatesRange = await telemetryDataService.GetDataDatesRangeAsync(idWell, isUtc, token).ConfigureAwait(false); return Ok(dataDatesRange);