From 3a1779de947ca95bf470b9347dc0f83561387f48 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Tue, 15 Aug 2023 17:08:33 +0500 Subject: [PATCH 1/5] 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); + } + /// /// Возвращает диапазон дат сохраненных данных. /// From a36736731b03c08ff2682aca92867c06d14ee907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=90=D0=BB=D0=B5=D0=BA?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= Date: Tue, 15 Aug 2023 17:36:47 +0500 Subject: [PATCH 2/5] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/ProcessMap/ProcessMapPlanDto.cs | 5 ----- .../Services/ProcessMap/ProcessMapPlanImportService.cs | 4 +++- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/AsbCloudApp/Data/ProcessMap/ProcessMapPlanDto.cs b/AsbCloudApp/Data/ProcessMap/ProcessMapPlanDto.cs index 8849e13d..0a4c1044 100644 --- a/AsbCloudApp/Data/ProcessMap/ProcessMapPlanDto.cs +++ b/AsbCloudApp/Data/ProcessMap/ProcessMapPlanDto.cs @@ -87,10 +87,5 @@ namespace AsbCloudApp.Data.ProcessMap /// Плановый процент использования spin master /// public double UsageSpin { get; set; } - - /// - /// DTO типа секции - /// - public WellSectionTypeDto WellSectionType { get; set; } = null!; } } diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapPlanImportService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapPlanImportService.cs index dc5d87b3..fd0ce38b 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapPlanImportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapPlanImportService.cs @@ -75,6 +75,8 @@ public class ProcessMapPlanImportService : IProcessMapPlanImportService public async Task ExportAsync(int idWell, CancellationToken cancellationToken) { + sections = (await wellSectionTypeRepository.GetAllAsync(cancellationToken)).ToArray(); + var processMapPlans = (await processMapPlanRepository.GetByIdWellAsync(idWell, cancellationToken)).ToArray(); @@ -120,7 +122,7 @@ public class ProcessMapPlanImportService : IProcessMapPlanImportService private void AddToRow(IXLRow row, ProcessMapPlanDto processMap) { - row.Cell(columnWellSectionType).Value = processMap.WellSectionType.Caption; + row.Cell(columnWellSectionType).Value = sections.FirstOrDefault(x => x.Id == processMap.IdWellSectionType)?.Caption; row.Cell(columnMode).Value = GetModeCaption(processMap.IdMode); row.Cell(columnDepthStart).Value = processMap.DepthStart; row.Cell(columnDepthEnd).Value = processMap.DepthEnd; From 5ff75e519fb5d68391eb519a3e586c0a6e76f1b8 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Tue, 15 Aug 2023 17:43:49 +0500 Subject: [PATCH 3/5] fix wellbore controller route --- AsbCloudWebApi/Controllers/WellboreController.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/AsbCloudWebApi/Controllers/WellboreController.cs b/AsbCloudWebApi/Controllers/WellboreController.cs index 7c8bdaf3..e9a590a0 100644 --- a/AsbCloudWebApi/Controllers/WellboreController.cs +++ b/AsbCloudWebApi/Controllers/WellboreController.cs @@ -6,7 +6,6 @@ using AsbCloudApp.Data; using AsbCloudApp.Exceptions; using AsbCloudApp.Requests; using AsbCloudApp.Services; -using AsbCloudDb.Model; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -18,7 +17,7 @@ namespace AsbCloudWebApi.Controllers; /// [Authorize] [ApiController] -[Route("api/well/[controller]")] +[Route("api/[controller]")] public class WellboreController : ControllerBase { private readonly IWellboreService wellboreService; From d62866919fe9e5111a7aa1a119615934ec204f54 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Tue, 15 Aug 2023 18:00:35 +0500 Subject: [PATCH 4/5] refactor WellboreDto --- AsbCloudApp/Data/WellDto.cs | 17 +++++++++ AsbCloudApp/Data/WellboreDto.cs | 35 ++++--------------- .../Services/WellboreService.cs | 10 ++---- 3 files changed, 26 insertions(+), 36 deletions(-) diff --git a/AsbCloudApp/Data/WellDto.cs b/AsbCloudApp/Data/WellDto.cs index 4ffd262e..b347bdd8 100644 --- a/AsbCloudApp/Data/WellDto.cs +++ b/AsbCloudApp/Data/WellDto.cs @@ -5,6 +5,23 @@ using System.Linq; namespace AsbCloudApp.Data { + /// + /// базовая информация о скважине + /// + public class WellWithTimezoneDto : WellInfoDto + { + /// + [Required] + public SimpleTimezoneDto Timezone { get; set; } = null!; + + /// + /// 0 - неизвестно, + /// 1 - в работе, + /// 2 - завершена + /// + public int IdState { get; set; } + } + /// /// Скважина /// diff --git a/AsbCloudApp/Data/WellboreDto.cs b/AsbCloudApp/Data/WellboreDto.cs index e64a188f..dbd9b697 100644 --- a/AsbCloudApp/Data/WellboreDto.cs +++ b/AsbCloudApp/Data/WellboreDto.cs @@ -7,41 +7,18 @@ namespace AsbCloudApp.Data; /// public class WellboreDto { - /// - /// Идентификатор - /// - public int Id { get; set; } + public WellWithTimezoneDto Well { get; set; } + + /// + /// Идентификатор + /// + public int Id { get; set; } /// /// Название /// public string Name { get; set; } = null!; - /// - /// Идентификатор скважины - /// - public int IdWell { get; set; } - - /// - /// Состояние скважины - /// - public int IdWellState { get; set; } - - /// - /// Идентификатор телеметрии - /// - public int? IdWellTelemetry { get; set; } - - /// - /// Временная зона скважины - /// - public SimpleTimezoneDto? WellTimezone { get; set; } - - /// - /// Название скважины - /// - public string WellName { get; set; } = null!; - /// /// Начальная глубина ствола /// diff --git a/AsbCloudInfrastructure/Services/WellboreService.cs b/AsbCloudInfrastructure/Services/WellboreService.cs index 727878dc..79ef8a3c 100644 --- a/AsbCloudInfrastructure/Services/WellboreService.cs +++ b/AsbCloudInfrastructure/Services/WellboreService.cs @@ -7,6 +7,7 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; +using Mapster; namespace AsbCloudInfrastructure.Services; @@ -55,13 +56,8 @@ public class WellboreService : IWellboreService var groupedOperations = wellOperations.GroupBy(o => o.IdWellSectionType); var wellWellbores = groupedOperations.Select(group => new WellboreDto { Id = group.Key, - IdWell = well.Id, - IdWellState = well.IdState, - IdWellTelemetry = well.IdTelemetry, Name = sections[group.Key].Caption, - WellName = well.Caption, - WellTimezone = well.Timezone, - + Well = well.Adapt(), DateStart = group.Min(operation => operation.DateStart), DateEnd = group.Max(operation => operation.DateStart.AddHours(operation.DurationHours)), DepthStart = group.Min(operation => operation.DepthStart), @@ -71,7 +67,7 @@ public class WellboreService : IWellboreService } return wellbores - .OrderBy(w =>w.IdWell).ThenBy(w=>w.Id) + .OrderBy(w => w.Well.Id).ThenBy(w => w.Id) .Skip(skip).Take(take); } From ab3ad0ae280c5a6c9917155bb91c638425a05a7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=90=D0=BB=D0=B5=D0=BA?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= Date: Wed, 16 Aug 2023 15:59:25 +0500 Subject: [PATCH 5/5] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B7=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D0=B5=D0=BA=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ProcessMap/ProcessMapPlanImportService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapPlanImportService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapPlanImportService.cs index fd0ce38b..21f118a8 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapPlanImportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapPlanImportService.cs @@ -122,7 +122,7 @@ public class ProcessMapPlanImportService : IProcessMapPlanImportService private void AddToRow(IXLRow row, ProcessMapPlanDto processMap) { - row.Cell(columnWellSectionType).Value = sections.FirstOrDefault(x => x.Id == processMap.IdWellSectionType)?.Caption; + row.Cell(columnWellSectionType).Value = sections.First(x => x.Id == processMap.IdWellSectionType).Caption; row.Cell(columnMode).Value = GetModeCaption(processMap.IdMode); row.Cell(columnDepthStart).Value = processMap.DepthStart; row.Cell(columnDepthEnd).Value = processMap.DepthEnd;