2024-07-04 11:02:45 +05:00
|
|
|
using AsbCloudApp.Data;
|
2024-04-17 11:10:56 +05:00
|
|
|
using AsbCloudApp.Data.WellOperation;
|
2024-03-11 14:11:13 +05:00
|
|
|
using AsbCloudApp.Repositories;
|
|
|
|
using AsbCloudApp.Requests;
|
2024-03-07 13:38:40 +05:00
|
|
|
using AsbCloudApp.Services;
|
|
|
|
using AsbCloudDb.Model;
|
2024-04-17 11:10:56 +05:00
|
|
|
using Mapster;
|
2024-03-07 13:38:40 +05:00
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
|
|
|
using System.Threading;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
namespace AsbCloudInfrastructure.Services;
|
|
|
|
|
|
|
|
public class WellCompositeOperationService : IWellCompositeOperationService
|
2024-03-07 13:38:40 +05:00
|
|
|
{
|
2024-04-17 16:23:36 +05:00
|
|
|
private readonly ICrudRepository<WellSectionTypeDto> wellSectionTypeRepository;
|
|
|
|
private readonly IWellOperationCategoryRepository wellOperationCategoryRepository;
|
|
|
|
private readonly IWellService wellService;
|
2024-08-14 12:24:54 +05:00
|
|
|
private readonly IWellOperationService wellOperationService;
|
2024-04-17 16:23:36 +05:00
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Тип секции "Транспортный стол"
|
|
|
|
/// </summary>
|
|
|
|
private const int wellSectionTransportTable = 5;
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Тип секции "Эксплуатационная колонна"
|
|
|
|
/// </summary>
|
|
|
|
private const int wellSectionProductionString = 4;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// набор настроек для замены одной категории секции на другую
|
|
|
|
/// </summary>
|
|
|
|
private static Dictionary<(int, int), int> SettingsForSectionCategoryChange = new Dictionary<(int, int), int>() {
|
|
|
|
{ (2, 5096), 5013 },
|
|
|
|
{ (2, 5008), 5013 },
|
2024-04-22 09:38:00 +05:00
|
|
|
{ (2, 5002), 5113 },
|
|
|
|
{ (2, 5003), 5113 },
|
2024-04-17 16:23:36 +05:00
|
|
|
{ (3, 5096), 5084 },
|
|
|
|
{ (3, 5008), 5084 },
|
|
|
|
{ (3, 5085), 5015 },
|
|
|
|
{ (3, 5014), 5015 },
|
2024-04-22 09:38:00 +05:00
|
|
|
{ (3, 5002), 5113 },
|
|
|
|
{ (3, 5003), 5113 },
|
2024-04-17 16:23:36 +05:00
|
|
|
{ (31, 5014), 5015 },
|
|
|
|
{ (31, 5012), 5013 },
|
|
|
|
{ (31, 5083), 5013 },
|
2024-04-22 09:38:00 +05:00
|
|
|
{ (31, 5002), 5113 },
|
|
|
|
{ (31, 5003), 5113 },
|
2024-04-17 16:23:36 +05:00
|
|
|
{ (4, 5085), 5015 },
|
|
|
|
{ (4, 5087), 5015 },
|
|
|
|
{ (4, 5014), 5015 },
|
|
|
|
{ (4, 5053), 5037 },
|
|
|
|
{ (4, 5084), 5096 },
|
|
|
|
{ (4, 5086), 5013 },
|
2024-04-22 09:38:00 +05:00
|
|
|
{ (4, 5002), 5113 },
|
|
|
|
{ (4, 5003), 5113 },
|
2024-04-17 16:23:36 +05:00
|
|
|
{ (6, 5085), 5015 },
|
|
|
|
{ (6, 5036), 5034 },
|
2024-04-22 09:38:00 +05:00
|
|
|
{ (6, 5035), 5097 },
|
|
|
|
{ (6, 5002), 5113 },
|
|
|
|
{ (6, 5003), 5113 },
|
|
|
|
{ (6, 5021), 5095 },
|
|
|
|
{ (6, 5086), 5012 }
|
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
};
|
|
|
|
|
|
|
|
private HashSet<(int IdSectionType, int IdCategory)> WellSectionTypesWithCategories = new HashSet<(int IdSectionType, int IdCategory)>()
|
2024-03-07 13:38:40 +05:00
|
|
|
{
|
2024-04-17 16:23:36 +05:00
|
|
|
{ (2, 5001) },
|
2024-04-22 09:38:00 +05:00
|
|
|
{ (2, 5113) },
|
2024-04-17 16:23:36 +05:00
|
|
|
{ (2, 5013) },
|
|
|
|
{ (2, 5000) },
|
|
|
|
{ (2, 5022) },
|
|
|
|
{ (2, 5017) },
|
|
|
|
{ (2, 5023) },
|
|
|
|
{ (2, 4007) },
|
|
|
|
{ (2, 5090) },
|
|
|
|
{ (3, 5001) },
|
|
|
|
{ (3, 5015) },
|
|
|
|
{ (3, 5037) },
|
|
|
|
{ (3, 5057) },
|
2024-04-22 09:38:00 +05:00
|
|
|
{ (3, 5113) },
|
2024-04-17 16:23:36 +05:00
|
|
|
{ (3, 5036) },
|
|
|
|
{ (3, 5084) },
|
|
|
|
{ (3, 5013) },
|
|
|
|
{ (3, 5000) },
|
|
|
|
{ (3, 5022) },
|
|
|
|
{ (3, 5017) },
|
|
|
|
{ (3, 4007) },
|
|
|
|
{ (3, 5090) },
|
|
|
|
{ (3, 5045) },
|
|
|
|
{ (3, 5042) },
|
|
|
|
{ (3, 5046) },
|
|
|
|
{ (31, 5001) },
|
|
|
|
{ (31, 5015) },
|
|
|
|
{ (31, 5037) },
|
|
|
|
{ (31, 5057) },
|
2024-04-22 09:38:00 +05:00
|
|
|
{ (31, 5113) },
|
2024-04-17 16:23:36 +05:00
|
|
|
{ (31, 5036) },
|
|
|
|
{ (31, 5013) },
|
|
|
|
{ (31, 5022) },
|
|
|
|
{ (31, 5017) },
|
|
|
|
{ (31, 5023) },
|
|
|
|
{ (31, 4007) },
|
|
|
|
{ (31, 5045) },
|
|
|
|
{ (31, 5042) },
|
|
|
|
{ (31, 5046) },
|
|
|
|
{ (4, 5001) },
|
|
|
|
{ (4, 5015) },
|
|
|
|
{ (4, 5046) },
|
|
|
|
{ (4, 5037) },
|
|
|
|
{ (4, 5097) },
|
|
|
|
{ (4, 5057) },
|
2024-04-22 09:38:00 +05:00
|
|
|
{ (4, 5113) },
|
2024-04-17 16:23:36 +05:00
|
|
|
{ (4, 5036) },
|
|
|
|
{ (4, 5008) },
|
|
|
|
{ (4, 5003) },
|
|
|
|
{ (4, 5036) },
|
|
|
|
{ (4, 5013) },
|
|
|
|
{ (4, 5000) },
|
|
|
|
{ (4, 5029) },
|
|
|
|
{ (4, 5022) },
|
|
|
|
{ (4, 5017) },
|
|
|
|
{ (4, 5019) },
|
|
|
|
{ (4, 5042) },
|
|
|
|
{ (4, 5046) },
|
|
|
|
{ (6, 5001) },
|
|
|
|
{ (6, 5015) },
|
|
|
|
{ (6, 5034) },
|
|
|
|
{ (6, 5037) },
|
|
|
|
{ (6, 5097) },
|
|
|
|
{ (6, 5057) },
|
2024-04-22 09:38:00 +05:00
|
|
|
{ (6, 5113) },
|
|
|
|
{ (6, 5036) },
|
|
|
|
{ (6, 5013) },
|
|
|
|
{ (6, 5000) },
|
|
|
|
{ (6, 5022) },
|
|
|
|
{ (6, 5093) },
|
|
|
|
{ (6, 5017) },
|
|
|
|
{ (6, 5095) },
|
|
|
|
{ (6, 5012) },
|
|
|
|
{ (6, 5040) },
|
2024-05-14 09:33:25 +05:00
|
|
|
{ (6, 5092) },
|
|
|
|
|
|
|
|
{ (5, 5001) },
|
|
|
|
{ (5, 5015) },
|
|
|
|
{ (5, 5046) },
|
|
|
|
{ (5, 5037) },
|
|
|
|
{ (5, 5097) },
|
|
|
|
{ (5, 5057) },
|
|
|
|
{ (5, 5113) },
|
|
|
|
{ (5, 5036) },
|
|
|
|
{ (5, 5008) },
|
|
|
|
{ (5, 5003) },
|
|
|
|
{ (5, 5036) },
|
|
|
|
{ (5, 5013) },
|
|
|
|
{ (5, 5000) },
|
|
|
|
{ (5, 5029) },
|
|
|
|
{ (5, 5022) },
|
|
|
|
{ (5, 5017) },
|
|
|
|
{ (5, 5019) },
|
|
|
|
{ (5, 5042) },
|
|
|
|
{ (5, 5046) },
|
|
|
|
|
|
|
|
{ (2, 5096) },
|
|
|
|
{ (2, 5008) },
|
|
|
|
{ (2, 5002) },
|
|
|
|
{ (2, 5003) },
|
|
|
|
|
|
|
|
{ (3, 5096) },
|
|
|
|
{ (3, 5008) },
|
|
|
|
{ (3, 5002) },
|
|
|
|
{ (3, 5003) },
|
|
|
|
{ (3, 5085) },
|
|
|
|
{ (3, 5014) },
|
|
|
|
|
|
|
|
{ (31, 5002) },
|
|
|
|
{ (31, 5003) },
|
|
|
|
{ (31, 5014) },
|
|
|
|
{ (31, 5012) },
|
|
|
|
{ (31, 5083) },
|
|
|
|
|
|
|
|
{ (4, 5002) },
|
|
|
|
{ (4, 5003) },
|
|
|
|
{ (4, 5085) },
|
|
|
|
{ (4, 5087) },
|
|
|
|
{ (4, 5014) },
|
|
|
|
{ (4, 5053) },
|
|
|
|
{ (4, 5084) },
|
|
|
|
{ (4, 5086) },
|
|
|
|
|
|
|
|
{ (6, 5002) },
|
|
|
|
{ (6, 5003) },
|
|
|
|
{ (6, 5085) },
|
|
|
|
{ (6, 5036) },
|
|
|
|
{ (6, 5035) },
|
|
|
|
{ (6, 5021) },
|
|
|
|
{ (6, 5086) },
|
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
};
|
|
|
|
|
|
|
|
public WellCompositeOperationService(
|
|
|
|
ICrudRepository<WellSectionTypeDto> wellSectionTypeRepository,
|
|
|
|
IWellOperationCategoryRepository wellOperationCategoryRepository,
|
2024-08-14 12:35:21 +05:00
|
|
|
IWellService wellService,
|
|
|
|
IWellOperationService wellOperationService)
|
2024-04-17 16:23:36 +05:00
|
|
|
{
|
|
|
|
this.wellSectionTypeRepository = wellSectionTypeRepository;
|
|
|
|
this.wellOperationCategoryRepository = wellOperationCategoryRepository;
|
|
|
|
this.wellService = wellService;
|
2024-08-14 12:35:21 +05:00
|
|
|
this.wellOperationService = wellOperationService;
|
2024-04-17 16:23:36 +05:00
|
|
|
}
|
|
|
|
|
|
|
|
public async Task<WellCompositeOperationDto> GetAsync(IEnumerable<int> idsWells, CancellationToken token)
|
|
|
|
{
|
|
|
|
var sections = await wellSectionTypeRepository.GetAllAsync(token);
|
|
|
|
var sectionsDict = sections.ToDictionary(s => s.Id, s => s.Caption);
|
|
|
|
|
|
|
|
var categories = wellOperationCategoryRepository.Get(true);
|
|
|
|
var categoriesDict = categories.ToDictionary(s => s.Id, s => s.Name);
|
2024-03-07 13:38:40 +05:00
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
var wells = await wellService.GetAsync(new WellRequest { Ids = idsWells }, token);
|
|
|
|
var wellsDict = wells.ToDictionary(w => w.Id);
|
|
|
|
|
|
|
|
var idsWellSectionTypes = WellSectionTypesWithCategories.Select(t => t.IdSectionType).Distinct();
|
|
|
|
var usedCategories = WellSectionTypesWithCategories.Select(c => c.IdCategory).Distinct();
|
|
|
|
|
|
|
|
var wellOperationRequest = new WellOperationRequest(idsWells)
|
2024-03-07 13:38:40 +05:00
|
|
|
{
|
2024-04-17 16:23:36 +05:00
|
|
|
OperationCategoryIds = usedCategories,
|
|
|
|
SectionTypeIds = idsWellSectionTypes,
|
|
|
|
OperationType = WellOperation.IdOperationTypeFact
|
2024-03-07 13:38:40 +05:00
|
|
|
};
|
2024-08-14 12:24:54 +05:00
|
|
|
var operations = await wellOperationService.GetAsync(wellOperationRequest, token);
|
2024-03-07 13:38:40 +05:00
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
var operationsForComposite = operations.Select(o => CreateCompositeOperation(o, sectionsDict, categoriesDict));
|
2024-03-07 13:38:40 +05:00
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
var wellOperationsWithComposite = new List<Dictionary<int, WellOperationDto>>();
|
|
|
|
var compositeDepth = 0d;
|
|
|
|
var compositeDay = 0d;
|
|
|
|
var result = new WellCompositeOperationDto();
|
2024-03-07 13:38:40 +05:00
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
var compositeOperations = new List<WellOperationDto>();
|
|
|
|
foreach ((int IdSection, int IdCategory) in WellSectionTypesWithCategories)
|
2024-03-07 13:38:40 +05:00
|
|
|
{
|
2024-04-17 16:23:36 +05:00
|
|
|
var filteredByTemplate = operationsForComposite
|
|
|
|
.Where(o => o.IdWellSectionType == IdSection)
|
|
|
|
.Where(o => o.IdCategory == IdCategory);
|
2024-03-07 13:38:40 +05:00
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
if (!filteredByTemplate.Any())
|
|
|
|
continue;
|
2024-03-07 13:38:40 +05:00
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
var groupedByWell = filteredByTemplate.GroupBy(o => o.IdWell);
|
2024-03-07 13:38:40 +05:00
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
var aggreagtedByWell = groupedByWell.Select(g => new WellOperationDto
|
|
|
|
{
|
|
|
|
IdCategory = IdCategory,
|
|
|
|
IdWell = g.Key,
|
|
|
|
IdWellSectionType = IdSection,
|
|
|
|
DepthStart = g.Min(o => o.DepthStart),
|
|
|
|
DurationHours = g.Sum(o => o.DurationHours),
|
|
|
|
OperationCategoryName = g.First().OperationCategoryName,
|
|
|
|
WellSectionTypeCaption = g.First().WellSectionTypeCaption,
|
|
|
|
});
|
2024-04-17 11:10:56 +05:00
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
var compositeOperation = aggreagtedByWell.OrderBy(o => o.DurationHours).
|
|
|
|
ThenByDescending(o => o.DepthStart)
|
|
|
|
.First();
|
2024-03-11 14:11:13 +05:00
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
compositeOperation.IdWell = 0;
|
2024-03-11 14:11:13 +05:00
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
if (compositeDepth > compositeOperation.DepthStart)
|
|
|
|
compositeOperation.DepthStart = compositeDepth;
|
|
|
|
compositeDepth = compositeOperation.DepthStart;
|
2024-03-07 13:38:40 +05:00
|
|
|
|
2024-04-19 12:35:32 +05:00
|
|
|
compositeOperation.Day = compositeDay / 24;
|
2024-05-02 09:41:37 +05:00
|
|
|
compositeDay += compositeOperation.DurationHours;
|
2024-04-17 09:44:30 +05:00
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
compositeOperations.Add(compositeOperation);
|
2024-03-07 13:38:40 +05:00
|
|
|
}
|
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
var groupedByWellOperations = operations
|
|
|
|
.GroupBy(o => o.IdWell)
|
|
|
|
.ToDictionary(o => o.Key, o => o.ToArray())
|
|
|
|
.Select(o => new WellCompositeOperationSourceDto()
|
|
|
|
{
|
|
|
|
Operations = o.Value,
|
|
|
|
Well = wellsDict[o.Key],
|
|
|
|
});
|
2024-03-11 14:11:13 +05:00
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
result.WellOperationsComposite = compositeOperations;
|
|
|
|
result.WellCompositeSourceOperations = groupedByWellOperations;
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
2024-03-07 13:38:40 +05:00
|
|
|
|
2024-04-17 16:23:36 +05:00
|
|
|
private static WellOperationDto CreateCompositeOperation(
|
|
|
|
WellOperationDto dto,
|
|
|
|
IDictionary<int, string> sectionTypes,
|
|
|
|
IDictionary<int, string> operationCategories)
|
|
|
|
{
|
|
|
|
var newDto = dto.Adapt<WellOperationDto>();
|
|
|
|
if (newDto.IdWellSectionType == wellSectionTransportTable)
|
|
|
|
{
|
|
|
|
newDto.IdWellSectionType = wellSectionProductionString;
|
|
|
|
newDto.WellSectionTypeCaption = sectionTypes[newDto.IdWellSectionType];
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((SettingsForSectionCategoryChange.TryGetValue((newDto.IdWellSectionType, newDto.IdCategory), out int newIdCategory)))
|
|
|
|
{
|
|
|
|
newDto.IdCategory = newIdCategory;
|
|
|
|
newDto.OperationCategoryName = operationCategories[newDto.IdCategory] ?? string.Empty;
|
2024-03-07 13:38:40 +05:00
|
|
|
}
|
2024-04-17 16:23:36 +05:00
|
|
|
|
|
|
|
return newDto;
|
2024-03-07 13:38:40 +05:00
|
|
|
}
|
|
|
|
}
|