Правка по результатам ревью

This commit is contained in:
Olga Nemt 2024-04-17 11:10:56 +05:00
parent 9ead473975
commit cb54d40774
3 changed files with 51 additions and 36 deletions

View File

@ -16,11 +16,11 @@ namespace AsbCloudApp.Data
/// <summary> /// <summary>
/// Список операций композитной скважины /// Список операций композитной скважины
/// </summary> /// </summary>
public List<WellOperationDto> WellOperationsComposite { get; set; } = new(); public IEnumerable<WellOperationDto> WellOperationsComposite { get; set; } = null!;
/// <summary> /// <summary>
/// Список операций, сгруппированный по скважинам /// Список операций, на основе которых были рассчитаны операции по композитной скважине
/// </summary> /// </summary>
public Dictionary<int, WellOperationDto[]> WellOperationsGroupedByWell { get; set; } = new(); public IEnumerable<WellCompositeOperationSourceDto> WellCompositeSourceOperations { get; set; } = null!;
} }
} }

View File

@ -1,23 +1,24 @@
using AsbCloudApp.Data; using AsbCloudApp.Data;
using AsbCloudApp.Data.WellOperation;
using AsbCloudApp.Repositories; using AsbCloudApp.Repositories;
using AsbCloudApp.Requests; using AsbCloudApp.Requests;
using AsbCloudApp.Services; using AsbCloudApp.Services;
using AsbCloudDb.Model; using AsbCloudDb.Model;
using Mapster;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using AsbCloudApp.Data.WellOperation;
using Mapster;
namespace AsbCloudInfrastructure.Services namespace AsbCloudInfrastructure.Services
{ {
public class WellCompositeOperationService : IWellCompositeOperationService public class WellCompositeOperationService : IWellCompositeOperationService
{ {
private ICrudRepository<WellSectionTypeDto> wellSectionTypeRepository; private readonly ICrudRepository<WellSectionTypeDto> wellSectionTypeRepository;
private IWellOperationCategoryRepository wellOperationCategoryRepository; private readonly IWellOperationCategoryRepository wellOperationCategoryRepository;
private IWellOperationRepository wellOperationRepository; private readonly IWellOperationRepository wellOperationRepository;
private readonly IWellService wellService;
/// <summary> /// <summary>
/// Тип секции "Транспортный стол" /// Тип секции "Транспортный стол"
@ -128,11 +129,13 @@ namespace AsbCloudInfrastructure.Services
public WellCompositeOperationService( public WellCompositeOperationService(
ICrudRepository<WellSectionTypeDto> wellSectionTypeRepository, ICrudRepository<WellSectionTypeDto> wellSectionTypeRepository,
IWellOperationCategoryRepository wellOperationCategoryRepository, IWellOperationCategoryRepository wellOperationCategoryRepository,
IWellOperationRepository wellOperationRepository) IWellOperationRepository wellOperationRepository,
IWellService wellService)
{ {
this.wellSectionTypeRepository = wellSectionTypeRepository; this.wellSectionTypeRepository = wellSectionTypeRepository;
this.wellOperationCategoryRepository = wellOperationCategoryRepository; this.wellOperationCategoryRepository = wellOperationCategoryRepository;
this.wellOperationRepository = wellOperationRepository; this.wellOperationRepository = wellOperationRepository;
this.wellService = wellService;
} }
public async Task<WellCompositeOperationDto> GetAsync(IEnumerable<int> idsWells, CancellationToken token) public async Task<WellCompositeOperationDto> GetAsync(IEnumerable<int> idsWells, CancellationToken token)
@ -143,6 +146,9 @@ namespace AsbCloudInfrastructure.Services
var categories = wellOperationCategoryRepository.Get(true); var categories = wellOperationCategoryRepository.Get(true);
var categoriesDict = categories.ToDictionary(s => s.Id, s => s.Name); 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 idsWellSectionTypes = WellSectionTypesWithCategories.Select(t => t.IdSectionType).Distinct();
var usedCategories = WellSectionTypesWithCategories.Select(c => c.IdCategory).Distinct(); var usedCategories = WellSectionTypesWithCategories.Select(c => c.IdCategory).Distinct();
@ -158,9 +164,10 @@ namespace AsbCloudInfrastructure.Services
var wellOperationsWithComposite = new List<Dictionary<int, WellOperationDto>>(); var wellOperationsWithComposite = new List<Dictionary<int, WellOperationDto>>();
var compositeDepth = 0d; var compositeDepth = 0d;
var compositeDay = 0d;
var result = new WellCompositeOperationDto(); var result = new WellCompositeOperationDto();
var prevDay = 0.0; var compositeOperations = new List<WellOperationDto>();
foreach ((int IdSection, int IdCategory) in WellSectionTypesWithCategories) foreach ((int IdSection, int IdCategory) in WellSectionTypesWithCategories)
{ {
var filteredByTemplate = operationsForComposite var filteredByTemplate = operationsForComposite
@ -188,22 +195,32 @@ namespace AsbCloudInfrastructure.Services
.First(); .First();
compositeOperation.IdWell = 0; compositeOperation.IdWell = 0;
compositeOperation.Day = prevDay + compositeOperation.DurationHours; compositeOperation.Day = compositeDay + compositeOperation.DurationHours;
if (compositeDepth > compositeOperation.DepthStart) if (compositeDepth > compositeOperation.DepthStart)
compositeOperation.DepthStart = compositeDepth; compositeOperation.DepthStart = compositeDepth;
compositeOperations.Add(compositeOperation);
compositeDepth = compositeOperation.DepthStart; compositeDepth = compositeOperation.DepthStart;
compositeDay = compositeOperation.Day;
result.WellOperationsComposite.Add(compositeOperation);
prevDay = compositeOperation.Day;
} }
var groupedByWellOperations = operations var groupedByWellOperations = operations
.GroupBy(o => o.IdWell) .GroupBy(o => o.IdWell)
.ToDictionary(o => o.Key, o => o.ToArray()); .ToDictionary(o => o.Key, o => o.ToArray())
result.WellOperationsGroupedByWell = groupedByWellOperations; .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; return result;
} }

View File

@ -1,22 +1,16 @@
using AsbCloudApp.Requests; using AsbCloudApp.Data;
using AsbCloudDb.Model; using AsbCloudApp.Data.WellOperation;
using AsbCloudInfrastructure.Repository; using AsbCloudApp.Repositories;
using AsbCloudInfrastructure.Services.ProcessMaps.Report; using AsbCloudApp.Requests;
using AsbCloudApp.Services;
using AsbCloudInfrastructure.Services; using AsbCloudInfrastructure.Services;
using NSubstitute; using NSubstitute;
using ProtoBuf.Meta;
using SignalRSwaggerGen.Enums;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Xunit; using Xunit;
using AsbCloudApp.Repositories;
using AsbCloudApp.Data;
using AsbCloudApp.Data.WellOperation;
using AsbCloudApp.Services;
namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation
{ {
@ -30,6 +24,8 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation
= Substitute.For<IWellOperationCategoryRepository>(); = Substitute.For<IWellOperationCategoryRepository>();
private IWellOperationRepository wellOperationRepository private IWellOperationRepository wellOperationRepository
= Substitute.For<IWellOperationRepository>(); = Substitute.For<IWellOperationRepository>();
private IWellService wellService
= Substitute.For<IWellService>();
@ -169,7 +165,8 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation
service = new WellCompositeOperationService( service = new WellCompositeOperationService(
wellSectionTypeRepository, wellSectionTypeRepository,
wellOperationCategoryRepository, wellOperationCategoryRepository,
wellOperationRepository); wellOperationRepository,
wellService);
} }
/// <summary> /// <summary>
@ -221,7 +218,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation
// assert // assert
var compositeWellOperations = result.WellOperationsComposite; var compositeWellOperations = result.WellOperationsComposite;
Assert.Single (compositeWellOperations); Assert.Single(compositeWellOperations);
Assert.Equal(5003, compositeWellOperations.FirstOrDefault()!.IdCategory); Assert.Equal(5003, compositeWellOperations.FirstOrDefault()!.IdCategory);
Assert.Equal(1.5, compositeWellOperations.FirstOrDefault()!.DurationHours); Assert.Equal(1.5, compositeWellOperations.FirstOrDefault()!.DurationHours);
Assert.Equal(10, compositeWellOperations.FirstOrDefault()!.DepthStart); Assert.Equal(10, compositeWellOperations.FirstOrDefault()!.DepthStart);
@ -306,7 +303,8 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation
var result = await service.GetAsync(idsWell, CancellationToken.None); var result = await service.GetAsync(idsWell, CancellationToken.None);
// assert // assert
var wellOperationsCount = result.WellOperationsGroupedByWell.SelectMany(v => v.Value).Count(); var wellOperationsCount = result.WellCompositeSourceOperations
.SelectMany(o => o.Operations).Count();
Assert.Equal(wellOperations.Count(), wellOperationsCount); Assert.Equal(wellOperations.Count(), wellOperationsCount);
var lastOperationComposite = result.WellOperationsComposite.Last(); var lastOperationComposite = result.WellOperationsComposite.Last();