From fa9095b2f0e9a4e21e83be9a4560dc7923789109 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 13 Mar 2024 14:30:54 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8=20=D0=BA=20=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=B0=D0=BC=20+=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=20BuildQuery?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/WellOperationRepository.cs | 61 ++++++++++++++----- .../WellCompositeOperationServiceTest.cs | 48 +++++++++++++-- 2 files changed, 88 insertions(+), 21 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index be039c86..aa0d28ce 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -209,24 +209,10 @@ public class WellOperationRepository : IWellOperationRepository WellsOperationRequest request, CancellationToken token) { - var query = db.WellOperations - .Where(o => request.IdsWell.Contains(o.IdWell)) - .Where(o => request.IdType == o.IdType) - .Where(o => request.SectionTypeIds != null ? request.SectionTypeIds.Contains(o.IdWellSectionType) : true) - .Where(o => request.OperationCategoryIds != null ? request.OperationCategoryIds.Contains(o.IdCategory) : true) - .Select(o => new WellOperationDataDto(){ - DepthStart = o.DepthStart, - DurationHours = o.DurationHours, - IdCategory = o.IdCategory, - IdWell = o.IdWell, - IdWellSectionType = o.IdWellSectionType, - OperationCategoryName = o.OperationCategory.Name, - WellSectionTypeCaption = o.WellSectionType.Caption, - }) - .AsNoTracking(); + var query = BuildQuery(request) + .AsNoTracking(); var dtos = await query.ToArrayAsync(token); - return dtos; } @@ -497,6 +483,49 @@ public class WellOperationRepository : IWellOperationRepository return dtos.AsNoTracking(); } + /// + /// Получение данных по запросу + /// + /// + /// + /// + private IQueryable BuildQuery(WellsOperationRequest request) + { + var query = db.WellOperations + .Where(o => request.IdsWell.Contains(o.IdWell)) + .Where(o => request.IdType == o.IdType); + + if (request.SectionTypeIds?.Any() == true) + query = query.Where(o => request.SectionTypeIds.Contains(o.IdWellSectionType)); + + if (request.OperationCategoryIds?.Any() == true) + query = query.Where(o => request.OperationCategoryIds.Contains(o.IdCategory)); + + var dtos = query.Select(o => new WellOperationDataDto + { + DepthStart = o.DepthStart, + DurationHours = o.DurationHours, + IdCategory = o.IdCategory, + IdWell = o.IdWell, + IdWellSectionType = o.IdWellSectionType, + OperationCategoryName = o.OperationCategory.Name, + WellSectionTypeCaption = o.WellSectionType.Caption, + }); + + if (request.SortFields?.Any() == true) + { + dtos = dtos.SortBy(request.SortFields); + } + + if (request.Skip.HasValue) + dtos = dtos.Skip(request.Skip.Value); + + if (request.Take.HasValue) + dtos = dtos.Take(request.Take.Value); + + return dtos.AsNoTracking(); + } + private WellOperationDto Convert(WellOperationDto dto) { var timezone = wellService.GetTimezone(dto.IdWell); diff --git a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs index eece10e8..d4659d8a 100644 --- a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs @@ -171,8 +171,14 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation wellOperationRepository); } + /// + /// На вход подаются 2 операции с одинаковыми секциями (id = 2), но разными категориями (ids = 5096, 5008) и ключами скважин (ids = 55, 64) + /// Метод возвращает список из одной операции в разрезе 3-х скважин: 2 текущие скважины и одна композитная + /// Операция должна иметь категорию 5013 для всех трех скважин + /// + /// [Fact] - public async Task GetAsync_return_data() + public async Task GetAsync_return_composite_and_others_with_category_5013() { // arrange wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) @@ -200,9 +206,14 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation Assert.Equal("Подъем КНБК", categoryName); } - + /// + /// На вход подаются 2 операции с одинаковыми секциями (id = 2) и категориями (id = 5003), но разными ключами скважин (ids = 55, 64) + /// Метод возвращает список из одной операции в разрезе 3-х скважин: 2 текущие скважины и одна композитная + /// Операция композитной скважины должна содержать данные той операции, которая содержит минимальный duration_hours + /// + /// [Fact] - public async Task GetAsync_return_data2() + public async Task GetAsync_return_composite_with_minimum_depth_start() { // arrange wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) @@ -221,6 +232,12 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation Assert.Equal(10, compositeWellOperation.DepthStart); } + /// + /// На вход подаются 2 операции с одинаковыми секциями (id = 3) и категориями (id = 5036), но разными ключами скважин (ids = 55, 64) + /// Метод возвращает список из одной операции в разрезе 3-х скважин: 2 текущие скважины и одна композитная + /// Операция композитной скважины должна содержать данные той операции, которая содержит минимальный duration_hours + /// + /// [Fact] public async Task GetAsync_return_data3() { @@ -241,6 +258,16 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation Assert.Equal(1372, compositeWellOperation.DepthStart); } + /// + /// На вход подаются 3 операции с одинаковыми секциями (id = 31), но разными категориями (ids = 5012, 5083) и ключами скважин (ids = 55, 64) + /// Метод возвращает список из одной операции в разрезе 3-х скважин: 2 текущие скважины и одна композитная + /// Операция композитной скважины должна содержать: + /// данные той операции, которая содержит минимальный duration_hours + /// категорию с ключом 5013 + /// Операции по скважине с ключом 55 должны объединиться в одну, + /// при этом их длительность складывается, а depth_start берется минимальный из двух + /// + /// [Fact] public async Task GetAsync_return_data4() { @@ -260,16 +287,27 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation Assert.Single(categories); Assert.Equal(5013, categories.First()); + var currentOperationByWell55 = currentWellOperations.Where(o => o.IdWell == 55).FirstOrDefault(); + Assert.NotNull(currentOperationByWell55); + Assert.Equal(15, currentOperationByWell55.DurationHours); + Assert.Equal(500, currentOperationByWell55.DepthStart); + var categoryName = currentWellOperations.Select(o => o.OperationCategoryName).First(); Assert.Equal("Подъем КНБК", categoryName); var compositeWellOperation = result.SelectMany(o => o.Values.Where(o => o.IdWell == 0)).FirstOrDefault(); Assert.NotNull(compositeWellOperation); Assert.Equal(5013, compositeWellOperation.IdCategory); - Assert.Equal(15, compositeWellOperation.DurationHours); - Assert.Equal(500, compositeWellOperation.DepthStart); + Assert.Equal(5, compositeWellOperation.DurationHours); + Assert.Equal(600, compositeWellOperation.DepthStart); } + /// + /// На вход подаются список разных операций с разными ключами скважин (ids = 55, 64) + /// Метод возвращает список из 4-х операций в разрезе 3-х скважин: 2 текущие скважины и одна композитная + /// Операция композитной скважины должна содержать глубину забоя = 1372 + /// + /// [Fact] public async Task GetAsync_return_data5() {