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()
{