CS2-119: Added dates change to well timezone if requested

This commit is contained in:
KharchenkoVladimir 2021-11-18 11:24:21 +05:00
parent c273a9eb5c
commit 4bed0623f1
6 changed files with 71 additions and 12 deletions

View File

@ -9,9 +9,10 @@ namespace AsbCloudApp.Services
public interface IMessageService
{
Task<PaginationContainer<MessageDto>> GetMessagesAsync(int idWell,
IEnumerable<int> categoryids = null, DateTime begin = default,
IEnumerable<int> 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<DatesRangeDto> GetMessagesDatesRangeAsync(int idWell,
CancellationToken token = default);
Task InsertAsync(string uid, IEnumerable<TelemetryMessageDto> dtos,

View File

@ -8,8 +8,11 @@ namespace AsbCloudApp.Services
{
public interface ITelemetryDataService<TDto> where TDto : ITelemetryData
{
Task<IEnumerable<TDto>> GetAsync(int idWell, DateTime dateBegin = default, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default);
Task<DatesRangeDto> GetDataDatesRangeAsync(int idWell, CancellationToken token = default);
Task<IEnumerable<TDto>> GetAsync(int idWell,
DateTime dateBegin = default, double intervalSec = 600d,
int approxPointsCount = 1024, bool isUtc = false, CancellationToken token = default);
Task<DatesRangeDto> GetDataDatesRangeAsync(int idWell, bool isUtc,
CancellationToken token = default);
Task<int> UpdateDataAsync(string uid, IEnumerable<TDto> dtos, CancellationToken token = default);
}
}

View File

@ -16,6 +16,7 @@ namespace AsbCloudInfrastructure.Services
{
private readonly IAsbCloudDbContext db;
private readonly ITelemetryService telemetryService;
private readonly CacheTable<Telemetry> cacheTelemetry;
private readonly CacheTable<TelemetryEvent> cacheEvents;
private readonly CacheTable<TelemetryUser> cacheTUsers;
@ -23,6 +24,7 @@ namespace AsbCloudInfrastructure.Services
{
this.db = db;
this.telemetryService = telemetryService;
cacheTelemetry = cacheDb.GetCachedTable<Telemetry>((AsbCloudDbContext)db);
cacheEvents = cacheDb.GetCachedTable<TelemetryEvent>((AsbCloudDbContext)db);
cacheTUsers = cacheDb.GetCachedTable<TelemetryUser>((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;
}

View File

@ -84,7 +84,7 @@ namespace AsbCloudInfrastructure.Services
public virtual async Task<IEnumerable<TDto>> 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<DatesRangeDto> GetDataDatesRangeAsync(int idWell,
public virtual async Task<DatesRangeDto> 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<TModel>((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);

View File

@ -31,6 +31,7 @@ namespace AsbCloudWebApi.Controllers
/// <param name="skip">для пагинации кол-во записей пропустить</param>
/// <param name="take">для пагинации кол-во записей </param>
/// <param name="searchString"> Строка поиска </param>
/// <param name="isUtc">Даты в формате UTC или часового пояса скважины</param>
/// <param name="token">Токен для отмены задачи</param>
/// <returns>список сообщений по скважине</returns>
[HttpGet]
@ -39,6 +40,7 @@ namespace AsbCloudWebApi.Controllers
[FromQuery] IEnumerable<int> 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();

View File

@ -68,11 +68,12 @@ namespace AsbCloudWebApi.Controllers
/// <param name="begin">дата начала выборки. По умолчанию: текущее время - intervalSec</param>
/// <param name="intervalSec">интервал времени даты начала выборки, секунды</param>
/// <param name="approxPointsCount">желаемое количество точек. Если в выборке точек будет больше, то выборка будет прорежена.</param>
/// <param name="isUtc">Даты в формате UTC или часового пояса скважины</param>
/// <param name="token">Токен завершения задачи</param>
/// <returns></returns>
[HttpGet("{idWell}")]
public virtual async Task<ActionResult<TDto>> 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
/// Возвращает диапазон дат сохраненных данных.
/// </summary>
/// <param name="idWell">id скважины</param>
/// <param name="isUtc">Даты в формате UTC или часового пояса скважины</param>
/// <param name="token">Токен завершения задачи</param>
/// <returns></returns>
[HttpGet]
[Route("{idWell}/datesRange")]
[ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)]
public virtual async Task<IActionResult> GetDataDatesRangeAsync(int idWell,
public virtual async Task<IActionResult> 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);