diff --git a/AsbCloudApp/Data/WellCompositeOperationDto.cs b/AsbCloudApp/Data/WellCompositeOperationDto.cs
index f6b98b4d..ce8e44f9 100644
--- a/AsbCloudApp/Data/WellCompositeOperationDto.cs
+++ b/AsbCloudApp/Data/WellCompositeOperationDto.cs
@@ -16,11 +16,11 @@ namespace AsbCloudApp.Data
///
/// Список операций композитной скважины
///
- public List WellOperationsComposite { get; set; } = new();
+ public IEnumerable WellOperationsComposite { get; set; } = null!;
///
- /// Список операций, сгруппированный по скважинам
+ /// Список операций, на основе которых были рассчитаны операции по композитной скважине
///
- public Dictionary WellOperationsGroupedByWell { get; set; } = new();
+ public IEnumerable WellCompositeSourceOperations { get; set; } = null!;
}
}
diff --git a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs
index 79fb45ee..2a4d0330 100644
--- a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs
+++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs
@@ -1,23 +1,24 @@
using AsbCloudApp.Data;
+using AsbCloudApp.Data.WellOperation;
using AsbCloudApp.Repositories;
using AsbCloudApp.Requests;
using AsbCloudApp.Services;
using AsbCloudDb.Model;
+using Mapster;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using AsbCloudApp.Data.WellOperation;
-using Mapster;
namespace AsbCloudInfrastructure.Services
{
public class WellCompositeOperationService : IWellCompositeOperationService
{
- private ICrudRepository wellSectionTypeRepository;
- private IWellOperationCategoryRepository wellOperationCategoryRepository;
- private IWellOperationRepository wellOperationRepository;
+ private readonly ICrudRepository wellSectionTypeRepository;
+ private readonly IWellOperationCategoryRepository wellOperationCategoryRepository;
+ private readonly IWellOperationRepository wellOperationRepository;
+ private readonly IWellService wellService;
///
/// Тип секции "Транспортный стол"
@@ -128,11 +129,13 @@ namespace AsbCloudInfrastructure.Services
public WellCompositeOperationService(
ICrudRepository wellSectionTypeRepository,
IWellOperationCategoryRepository wellOperationCategoryRepository,
- IWellOperationRepository wellOperationRepository)
+ IWellOperationRepository wellOperationRepository,
+ IWellService wellService)
{
this.wellSectionTypeRepository = wellSectionTypeRepository;
this.wellOperationCategoryRepository = wellOperationCategoryRepository;
this.wellOperationRepository = wellOperationRepository;
+ this.wellService = wellService;
}
public async Task GetAsync(IEnumerable idsWells, CancellationToken token)
@@ -143,6 +146,9 @@ namespace AsbCloudInfrastructure.Services
var categories = wellOperationCategoryRepository.Get(true);
var categoriesDict = categories.ToDictionary(s => s.Id, s => s.Name);
+ var wells = await wellService.GetAsync(new WellRequest { Ids = idsWells }, token);
+ var wellsDict = wells.ToDictionary(w => w.Id, w => w.Caption);
+
var idsWellSectionTypes = WellSectionTypesWithCategories.Select(t => t.IdSectionType).Distinct();
var usedCategories = WellSectionTypesWithCategories.Select(c => c.IdCategory).Distinct();
@@ -158,9 +164,10 @@ namespace AsbCloudInfrastructure.Services
var wellOperationsWithComposite = new List>();
var compositeDepth = 0d;
+ var compositeDay = 0d;
var result = new WellCompositeOperationDto();
- var prevDay = 0.0;
+ var compositeOperations = new List();
foreach ((int IdSection, int IdCategory) in WellSectionTypesWithCategories)
{
var filteredByTemplate = operationsForComposite
@@ -188,22 +195,32 @@ namespace AsbCloudInfrastructure.Services
.First();
compositeOperation.IdWell = 0;
- compositeOperation.Day = prevDay + compositeOperation.DurationHours;
-
+ compositeOperation.Day = compositeDay + compositeOperation.DurationHours;
+
if (compositeDepth > compositeOperation.DepthStart)
compositeOperation.DepthStart = compositeDepth;
+ compositeOperations.Add(compositeOperation);
+
compositeDepth = compositeOperation.DepthStart;
-
- result.WellOperationsComposite.Add(compositeOperation);
-
- prevDay = compositeOperation.Day;
+ compositeDay = compositeOperation.Day;
}
var groupedByWellOperations = operations
.GroupBy(o => o.IdWell)
- .ToDictionary(o => o.Key, o => o.ToArray());
- result.WellOperationsGroupedByWell = groupedByWellOperations;
+ .ToDictionary(o => o.Key, o => o.ToArray())
+ .Select(o => new WellCompositeOperationSourceDto()
+ {
+ Operations = o.Value,
+ Well = new WellDto()
+ {
+ Id = o.Key,
+ Caption = wellsDict.TryGetValue(o.Key, out string? caption) ? caption : string.Empty,
+ }
+ });
+
+ result.WellOperationsComposite = compositeOperations;
+ result.WellCompositeSourceOperations = groupedByWellOperations;
return result;
}
diff --git a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs
index cf9904d0..14224abd 100644
--- a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs
+++ b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs
@@ -1,22 +1,16 @@
-using AsbCloudApp.Requests;
-using AsbCloudDb.Model;
-using AsbCloudInfrastructure.Repository;
-using AsbCloudInfrastructure.Services.ProcessMaps.Report;
+using AsbCloudApp.Data;
+using AsbCloudApp.Data.WellOperation;
+using AsbCloudApp.Repositories;
+using AsbCloudApp.Requests;
+using AsbCloudApp.Services;
using AsbCloudInfrastructure.Services;
using NSubstitute;
-using ProtoBuf.Meta;
-using SignalRSwaggerGen.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Xunit;
-using AsbCloudApp.Repositories;
-using AsbCloudApp.Data;
-using AsbCloudApp.Data.WellOperation;
-using AsbCloudApp.Services;
namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation
{
@@ -30,8 +24,10 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation
= Substitute.For();
private IWellOperationRepository wellOperationRepository
= Substitute.For();
+ private IWellService wellService
+ = Substitute.For();
+
-
private readonly static IEnumerable operationCategories = new List()
{
@@ -61,7 +57,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation
IdWell = 55,
IdWellSectionType = 2,
OperationCategoryName = "Шаблонирование перед спуском",
- WellSectionTypeCaption = "Направление"
+ WellSectionTypeCaption = "Направление"
},
new()
{
@@ -167,9 +163,10 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation
.Returns(operationCategories);
service = new WellCompositeOperationService(
- wellSectionTypeRepository,
+ wellSectionTypeRepository,
wellOperationCategoryRepository,
- wellOperationRepository);
+ wellOperationRepository,
+ wellService);
}
///
@@ -185,7 +182,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation
wellOperationRepository.GetAsync(Arg.Any(), Arg.Any())
.Returns(wellOperations1);
- var idsWell = new List() { 55, 64 };
+ var idsWell = new List() { 55, 64 };
// act
var result = await service.GetAsync(idsWell, CancellationToken.None);
@@ -221,7 +218,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation
// assert
var compositeWellOperations = result.WellOperationsComposite;
- Assert.Single (compositeWellOperations);
+ Assert.Single(compositeWellOperations);
Assert.Equal(5003, compositeWellOperations.FirstOrDefault()!.IdCategory);
Assert.Equal(1.5, compositeWellOperations.FirstOrDefault()!.DurationHours);
Assert.Equal(10, compositeWellOperations.FirstOrDefault()!.DepthStart);
@@ -306,7 +303,8 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation
var result = await service.GetAsync(idsWell, CancellationToken.None);
// assert
- var wellOperationsCount = result.WellOperationsGroupedByWell.SelectMany(v => v.Value).Count();
+ var wellOperationsCount = result.WellCompositeSourceOperations
+ .SelectMany(o => o.Operations).Count();
Assert.Equal(wellOperations.Count(), wellOperationsCount);
var lastOperationComposite = result.WellOperationsComposite.Last();