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);
+ }
+
///
/// Возвращает диапазон дат сохраненных данных.
///