From cb54d40774f42f08de68398340bbf57009221165 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 17 Apr 2024 11:10:56 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82?= =?UTF-8?q?=D0=B0=D0=BC=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/WellCompositeOperationDto.cs | 6 +-- .../Services/WellCompositeOperationService.cs | 47 +++++++++++++------ .../WellCompositeOperationServiceTest.cs | 34 +++++++------- 3 files changed, 51 insertions(+), 36 deletions(-) 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();