From 3702cf2e8c71a5b403ac13998eec2a72bf0187a6 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 12:28:39 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20+=20=D0=B4=D0=BE=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Переделал логику получения стволов скважин. 2. Поправил контроллер. 3. Рефакторинг DTO ствола. --- AsbCloudApp/Data/WellboreDto.cs | 12 +-- .../Repositories/IWellOperationRepository.cs | 7 +- AsbCloudApp/Requests/WellboreRequest.cs | 2 +- .../Repository/WellOperationRepository.cs | 96 +++++++++++-------- .../Controllers/WellboreController.cs | 19 ++-- 5 files changed, 77 insertions(+), 59 deletions(-) diff --git a/AsbCloudApp/Data/WellboreDto.cs b/AsbCloudApp/Data/WellboreDto.cs index ea542bf8..091f5b07 100644 --- a/AsbCloudApp/Data/WellboreDto.cs +++ b/AsbCloudApp/Data/WellboreDto.cs @@ -10,12 +10,12 @@ public class WellboreDto /// /// Идентификатор /// - public int? Id { get; set; } + public int Id { get; set; } /// /// Название /// - public string? Name { get; set; } + public string Name { get; set; } = null!; /// /// Идентификатор скважины @@ -45,20 +45,20 @@ public class WellboreDto /// /// Начальная глубина ствола /// - public double? DepthFrom { get; set; } + public double DepthFrom { get; set; } /// /// Конечная глубина скважины /// - public double? DepthTo { get; set; } + public double DepthTo { get; set; } /// /// Дата начала первой операции /// - public DateTimeOffset? DateFrom { get; set; } + public DateTimeOffset DateFrom { get; set; } /// /// Дата завершения последней операции /// - public DateTimeOffset? DateTo { get; set; } + public DateTimeOffset DateTo { get; set; } } \ No newline at end of file diff --git a/AsbCloudApp/Repositories/IWellOperationRepository.cs b/AsbCloudApp/Repositories/IWellOperationRepository.cs index 60ddfd80..634bc56f 100644 --- a/AsbCloudApp/Repositories/IWellOperationRepository.cs +++ b/AsbCloudApp/Repositories/IWellOperationRepository.cs @@ -78,10 +78,10 @@ namespace AsbCloudApp.Repositories /// Получение ствола скважины /// /// - /// + /// /// /// - Task GetWellboreAsync(int idWell, int? idWellSectionType, CancellationToken cancellationToken); + Task GetWellboreAsync(int idWell, int idSection, CancellationToken cancellationToken); /// /// Получение стволов скважин @@ -89,8 +89,7 @@ namespace AsbCloudApp.Repositories /// /// /// - Task> GetWellboresAsync(WellboreRequest request, - CancellationToken cancellationToken); + Task> GetWellboresAsync(WellboreRequest request, CancellationToken cancellationToken); /// /// Добавить несколько операций за один раз diff --git a/AsbCloudApp/Requests/WellboreRequest.cs b/AsbCloudApp/Requests/WellboreRequest.cs index dadcc7cc..32b4cbe2 100644 --- a/AsbCloudApp/Requests/WellboreRequest.cs +++ b/AsbCloudApp/Requests/WellboreRequest.cs @@ -10,5 +10,5 @@ public class WellboreRequest : RequestBase /// /// Пары идентификаторов скважины и секции /// - public IEnumerable<(int idWell, int? idWellSectionType)> Ids { get; set; } = null!; + public IEnumerable<(int idWell, int? idSection)> Ids { get; set; } = null!; } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 458b93ab..ce0b68af 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -255,77 +255,89 @@ namespace AsbCloudInfrastructure.Repository return dtos; } - public async Task GetWellboreAsync(int idWell, int? idWellSectionType, - CancellationToken cancellationToken) + public async Task GetWellboreAsync(int idWell, int idSection, CancellationToken cancellationToken) { var well = await db.Wells.Include(w => w.WellOperations) .FirstOrDefaultAsync(w => w.Id == idWell, cancellationToken); - if (well is null) + var section = await db.WellSectionTypes + .FirstOrDefaultAsync(w => w.Id == idSection, cancellationToken); + + if (well is null || section is null) return null; - var factOperations = well.WellOperations.AsQueryable(); + var factOperations = well.WellOperations + .Where(o => o.IdType == WellOperation.IdOperationTypeFact && + o.IdWellSectionType == section.Id) + .OrderBy(o => o.DateStart); - var section = await db.WellSectionTypes - .FirstOrDefaultAsync(w => w.Id == idWellSectionType, cancellationToken); - - if (section is not null) - factOperations = factOperations.Where(w => w.IdWellSectionType == section.Id); - - factOperations = factOperations.OrderBy(f => f.DateStart); - - var firstOperation = factOperations.FirstOrDefault(); - var lastOperation = factOperations.LastOrDefault(); + if (!factOperations.Any()) + return null; + + var firstOperation = factOperations.First(); + var lastOperation = factOperations.Last(); return new WellboreDto { - Id = section?.Id, - Name = section?.Caption, + Id = section.Id, + Name = section.Caption, IdWell = well.Id, WellName = well.Caption, IdWellState = well.IdState, IdWellTelemetry = well.IdTelemetry, WellTimezone = well.Timezone.Adapt(), - DepthFrom = firstOperation?.DepthStart, - DepthTo = lastOperation?.DepthEnd, - DateFrom = firstOperation?.DateStart, - DateTo = lastOperation?.DateStart.AddHours(lastOperation.DurationHours), + DepthFrom = firstOperation.DepthStart, + DepthTo = lastOperation.DepthEnd, + DateFrom = firstOperation.DateStart, + DateTo = lastOperation.DateStart.AddHours(lastOperation.DurationHours), }; } - public async Task> GetWellboresAsync(WellboreRequest request, - CancellationToken cancellationToken) + public async Task> GetWellboresAsync(WellboreRequest request, CancellationToken cancellationToken) { var wellbores = new List(); - var skip = request.Skip ?? 0; var take = request.Take ?? 10; + + var sections = GetSectionTypes() + .ToDictionary(w => w.Id, w => w); - foreach (var id in request.Ids) + foreach (var (idWell, idSection) in request.Ids) { - var wellbore = await GetWellboreAsync(id.idWell, - id.idWellSectionType, - cancellationToken); + var well = await db.Wells.Include(w => w.WellOperations) + .FirstOrDefaultAsync(w => w.Id == idWell, cancellationToken); - if (wellbore is null) + if (well is null) continue; + + var factOperations = well.WellOperations + .Where(o => o.IdType == WellOperation.IdOperationTypeFact) + .OrderBy(o => o.DateStart) + .GroupBy(o => o.IdWellSectionType); - wellbores.Add(wellbore); + if(idSection.HasValue) + factOperations = factOperations.Where(w => w.Key == idSection); + + wellbores.AddRange(from factOperation in factOperations + let firstOperation = factOperation.First() + let lastOperation = factOperation.Last() + select new WellboreDto + { + Id = sections[factOperation.Key].Id, + Name = sections[factOperation.Key].Caption, + IdWell = well.Id, + WellName = well.Caption, + IdWellState = well.IdState, + IdWellTelemetry = well.IdTelemetry, + WellTimezone = well.Timezone.Adapt(), + DepthFrom = firstOperation.DepthStart, + DepthTo = lastOperation.DepthEnd, + DateFrom = firstOperation.DateStart, + DateTo = lastOperation.DateStart.AddHours(lastOperation.DurationHours), + }); } - var result = new PaginationContainer - { - Skip = skip, - Take = take, - Count = wellbores.Count - }; - - if (result.Count < skip) - return result; - - result.Items = wellbores.Skip(skip).Take(take).ToList(); - - return result; + return wellbores.Skip(skip).Take(take); } /// diff --git a/AsbCloudWebApi/Controllers/WellboreController.cs b/AsbCloudWebApi/Controllers/WellboreController.cs index be562213..aeca9e8d 100644 --- a/AsbCloudWebApi/Controllers/WellboreController.cs +++ b/AsbCloudWebApi/Controllers/WellboreController.cs @@ -6,6 +6,7 @@ using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace AsbCloudWebApi.Controllers; @@ -29,15 +30,21 @@ public class WellboreController : ControllerBase /// Получение ствола скважины /// /// Id скважины - /// Опциональный параметр. Id типа секции + /// Id типа секции скважины /// /// - [HttpGet("{idWell:int}")] - [ProducesResponseType(typeof(WellboreDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetAsync(int idWell, int? idSectionType, CancellationToken cancellationToken) + [HttpGet("{idWell:int}/{idSection:int}")] + [ProducesResponseType(typeof(WellboreDto), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status204NoContent)] + public async Task GetAsync(int idWell, int idSection, CancellationToken cancellationToken) { - return Ok(await wellOperationRepository.GetWellboreAsync(idWell, idSectionType, cancellationToken)); + var wellbore = await wellOperationRepository.GetWellboreAsync(idWell, idSection, cancellationToken); + + if (wellbore is null) + return NoContent(); + + return Ok(wellbore); } /// @@ -49,7 +56,7 @@ public class WellboreController : ControllerBase /// /// [HttpGet] - [ProducesResponseType(typeof(PaginationContainer), (int)System.Net.HttpStatusCode.OK)] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task GetAllAsync([FromQuery] IEnumerable ids, int? skip, int? take,