From 3a1779de947ca95bf470b9347dc0f83561387f48 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Tue, 15 Aug 2023 17:08:33 +0500 Subject: [PATCH] TelemetryDataBaseController add GetRangeAsync method. for witsml --- AsbCloudApp/Services/ITelemetryDataService.cs | 10 +++++ .../Services/SAUB/TelemetryDataBaseService.cs | 43 ++++++++++++++++++- .../SAUB/TelemetryDataBaseController.cs | 32 ++++++++++++++ 3 files changed, 83 insertions(+), 2 deletions(-) diff --git a/AsbCloudApp/Services/ITelemetryDataService.cs b/AsbCloudApp/Services/ITelemetryDataService.cs index 20ac7f90..c1704509 100644 --- a/AsbCloudApp/Services/ITelemetryDataService.cs +++ b/AsbCloudApp/Services/ITelemetryDataService.cs @@ -26,6 +26,16 @@ namespace AsbCloudApp.Services DateTime dateBegin = default, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default); + /// + /// Получение статистики за период + /// + /// + /// + /// + /// + /// + Task GetRangeAsync(int idWell, DateTimeOffset start, DateTimeOffset end, CancellationToken token); + /// /// добавить/изменить данные тех. процесса (используется панелью) /// diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs index ffd6416c..8d76ee70 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs @@ -1,4 +1,5 @@ -using AsbCloudApp.Services; +using AsbCloudApp.Data; +using AsbCloudApp.Services; using AsbCloudDb; using AsbCloudDb.Model; using Microsoft.EntityFrameworkCore; @@ -13,7 +14,7 @@ namespace AsbCloudInfrastructure.Services.SAUB { public abstract class TelemetryDataBaseService : ITelemetryDataService where TDto : AsbCloudApp.Data.ITelemetryData - where TEntity : class, ITelemetryData + where TEntity : class, AsbCloudDb.Model.ITelemetryData { protected readonly IAsbCloudDbContext db; protected readonly ITelemetryService telemetryService; @@ -146,6 +147,44 @@ namespace AsbCloudInfrastructure.Services.SAUB return dtos; } + /// + public virtual async Task GetRangeAsync( + int idWell, + DateTimeOffset start, + DateTimeOffset end, + CancellationToken token) + { + var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell); + if (telemetry is null) + return default; + + var timezone = telemetryService.GetTimezone(telemetry.Id); + var startUtc = start.ToOffset(TimeSpan.Zero); + var endUtc = end.ToOffset(TimeSpan.Zero); + + var dbSet = db.Set(); + var query = dbSet + .Where(i => i.IdTelemetry == telemetry.Id) + .Where(i => i.DateTime >= startUtc) + .Where(i => i.DateTime <= endUtc) + .GroupBy(i => i.IdTelemetry) + .Select(g => new + { + DateStart = g.Min(i => i.DateTime), + DateEnd = g.Max(i => i.DateTime), + }); + + var data = await query.FirstOrDefaultAsync(token); + if (data is null) + return default; + + return new DatesRangeDto + { + From = data.DateStart.ToRemoteDateTime(timezone.Hours), + To = data.DateEnd.ToRemoteDateTime(timezone.Hours), + }; + } + public abstract TDto Convert(TEntity src, double timezoneOffset); public abstract TEntity Convert(TDto src, double timezoneOffset); diff --git a/AsbCloudWebApi/Controllers/SAUB/TelemetryDataBaseController.cs b/AsbCloudWebApi/Controllers/SAUB/TelemetryDataBaseController.cs index 05af2b9a..f80693a1 100644 --- a/AsbCloudWebApi/Controllers/SAUB/TelemetryDataBaseController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/TelemetryDataBaseController.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -95,6 +96,37 @@ namespace AsbCloudWebApi.Controllers.SAUB return Ok(content); } + /// + /// Возвращает диапазон дат за которые есть телеметрия за период времени + /// + /// + /// + /// + /// + /// + [HttpGet("{idWell}/dateRange")] + public virtual async Task> GetRangeAsync( + [FromRoute] int idWell, + [Required] DateTimeOffset start, + [Required] DateTimeOffset end, + CancellationToken token) + { + int? idCompany = User.GetCompanyId(); + + if (idCompany is null) + return Forbid(); + + bool isCompanyOwnsWell = await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, + idWell, token).ConfigureAwait(false); + + if (!isCompanyOwnsWell) + return Forbid(); + + var content = await telemetryDataService.GetRangeAsync(idWell, start, end, token); + + return Ok(content); + } + /// /// Возвращает диапазон дат сохраненных данных. ///