From 39a1c874c03cae3fe4165961a8e409957fd0ebc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 22 Mar 2024 07:38:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D1=8B=D0=B5=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82=D0=B0/=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B0?= =?UTF-8?q?=20=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IWellOperationExcelParser.cs | 20 -- .../IWellOperationExportService.cs | 19 -- .../IWellOperationImportService.cs | 20 -- .../IWellOperationImportTemplateService.cs | 15 -- .../WellOperationFactTemplate.cs | 26 ++ .../Constants/DefaultTemplateInfo.cs | 17 -- .../Constants/OperationAttributes.cs | 10 - .../Constants/Templates.cs | 7 - .../StringSimilarity/CosineSimilarity.cs | 98 -------- .../WellOperationDefaultExcelParser.cs | 92 ------- .../WellOperationGazpromKhantosExcelParser.cs | 227 ------------------ .../Dictionaries/OperationAttributes.txt | 8 - .../Files/Dictionaries/Operations.txt | 201 ---------------- .../Files/Dictionaries/Sections.txt | 7 - .../Files/WellOperationImportTemplate.xlsx | Bin 98938 -> 0 bytes .../WellOperationExportService.cs | 102 -------- .../WellOperationImportService.cs | 119 --------- .../WellOperationImportTemplateService.cs | 21 -- .../Templates/WellOperationFactTemplate.xlsx | Bin 0 -> 45673 bytes 19 files changed, 26 insertions(+), 983 deletions(-) delete mode 100644 AsbCloudApp/Services/WellOperationImport/IWellOperationExcelParser.cs delete mode 100644 AsbCloudApp/Services/WellOperationImport/IWellOperationExportService.cs delete mode 100644 AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs delete mode 100644 AsbCloudApp/Services/WellOperationImport/IWellOperationImportTemplateService.cs create mode 100644 AsbCloudInfrastructure/Services/ExcelServices/Templates/WellOperations/WellOperationFactTemplate.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Constants/DefaultTemplateInfo.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Constants/OperationAttributes.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Constants/Templates.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/FileParser/StringSimilarity/CosineSimilarity.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationDefaultExcelParser.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationGazpromKhantosExcelParser.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/OperationAttributes.txt delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Operations.txt delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Sections.txt delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Files/WellOperationImportTemplate.xlsx delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/WellOperationExportService.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportTemplateService.cs create mode 100644 AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx diff --git a/AsbCloudApp/Services/WellOperationImport/IWellOperationExcelParser.cs b/AsbCloudApp/Services/WellOperationImport/IWellOperationExcelParser.cs deleted file mode 100644 index 7a695beb..00000000 --- a/AsbCloudApp/Services/WellOperationImport/IWellOperationExcelParser.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.IO; -using AsbCloudApp.Data.WellOperationImport; -using AsbCloudApp.Data.WellOperationImport.Options; - -namespace AsbCloudApp.Services.WellOperationImport; - -/// -/// Парсинг операций из excel файла -/// -public interface IWellOperationExcelParser - where TOptions : IWellOperationImportOptions -{ - /// - /// Метод парсинга документа - /// - /// - /// - /// - SheetDto Parse(Stream stream, TOptions options); -} \ No newline at end of file diff --git a/AsbCloudApp/Services/WellOperationImport/IWellOperationExportService.cs b/AsbCloudApp/Services/WellOperationImport/IWellOperationExportService.cs deleted file mode 100644 index 9b0a96ac..00000000 --- a/AsbCloudApp/Services/WellOperationImport/IWellOperationExportService.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.IO; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudApp.Services.WellOperationImport; - -/// -/// Экспорт ГГД -/// -public interface IWellOperationExportService -{ - /// - /// Скачать в excel - /// - /// - /// - /// - Task ExportAsync(int idWell, CancellationToken cancellationToken); -} \ No newline at end of file diff --git a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs b/AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs deleted file mode 100644 index f65d8888..00000000 --- a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Collections.Generic; -using AsbCloudApp.Data; -using AsbCloudApp.Data.WellOperationImport; - -namespace AsbCloudApp.Services.WellOperationImport; - -/// -/// Импорт ГГД -/// -public interface IWellOperationImportService -{ - /// - /// Загрузить из excel список операций - /// - /// - /// - /// - /// - IEnumerable Import(int idWell, int idUser, int idType, SheetDto sheet); -} \ No newline at end of file diff --git a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportTemplateService.cs b/AsbCloudApp/Services/WellOperationImport/IWellOperationImportTemplateService.cs deleted file mode 100644 index 817f3ae5..00000000 --- a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportTemplateService.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.IO; - -namespace AsbCloudApp.Services.WellOperationImport; - -/// -/// Сервис для получения шаблонов ГГД -/// -public interface IWellOperationImportTemplateService -{ - /// - /// Скачать шаблон для заполнения - /// - /// - Stream GetExcelTemplateStream(); -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/WellOperations/WellOperationFactTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/WellOperations/WellOperationFactTemplate.cs new file mode 100644 index 00000000..afb5fe19 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/WellOperations/WellOperationFactTemplate.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using AsbCloudApp.Data.WellOperation; + +namespace AsbCloudInfrastructure.Services.ExcelServices.Templates.WellOperations; + +public class WellOperationFactTemplate : ITemplateParameters +{ + public string SheetName => "Факт"; + + public int HeaderRowsCount => 1; + + public string FileName => "WellOperationFactTemplate.xlsx"; + + public IDictionary Cells => new Dictionary + { + { nameof(WellOperationDto.WellSectionTypeCaption), new Cell(1, typeof(string)) }, + { nameof(WellOperationDto.OperationCategoryName), new Cell(2, typeof(string)) }, + { nameof(WellOperationDto.CategoryInfo), new Cell(3, typeof(string)) }, + { nameof(WellOperationDto.DepthStart), new Cell(4, typeof(double)) }, + { nameof(WellOperationDto.DepthEnd), new Cell(5, typeof(double)) }, + { nameof(WellOperationDto.DateStart), new Cell(6, typeof(DateTime)) }, + { nameof(WellOperationDto.DurationHours), new Cell(7, typeof(double)) }, + { nameof(WellOperationDto.Comment), new Cell(8, typeof(string)) } + }; +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Constants/DefaultTemplateInfo.cs b/AsbCloudInfrastructure/Services/WellOperationImport/Constants/DefaultTemplateInfo.cs deleted file mode 100644 index 96f3272b..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/Constants/DefaultTemplateInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace AsbCloudInfrastructure.Services.WellOperationImport.Constants; - -public static class DefaultTemplateInfo -{ - public const string SheetNamePlan = "План"; - public const string SheetNameFact = "Факт"; - - public const int HeaderRowsCount = 1; - public const int ColumnSection = 1; - public const int ColumnCategory = 2; - public const int ColumnCategoryInfo = 3; - public const int ColumnDepthStart = 4; - public const int ColumnDepthEnd = 5; - public const int ColumnDate = 6; - public const int ColumnDuration = 7; - public const int ColumnComment = 8; -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Constants/OperationAttributes.cs b/AsbCloudInfrastructure/Services/WellOperationImport/Constants/OperationAttributes.cs deleted file mode 100644 index c4049d03..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/Constants/OperationAttributes.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace AsbCloudInfrastructure.Services.WellOperationImport.Constants; - -public static class OperationAttributes -{ - public const string CategoryInfo = "Описание"; - public const string SectionDiameter = "ОК"; - public const string Depth = "Забой"; - public const string Duration = "Время операции"; - public const string Date = "Дата окончания операции"; -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Constants/Templates.cs b/AsbCloudInfrastructure/Services/WellOperationImport/Constants/Templates.cs deleted file mode 100644 index 631dc170..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/Constants/Templates.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace AsbCloudInfrastructure.Services.WellOperationImport.Constants; - -public static class Templates -{ - public const int IdDefaultTemplate = 0; - public const int IdGazpromKhantosTemplate = 1; -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/StringSimilarity/CosineSimilarity.cs b/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/StringSimilarity/CosineSimilarity.cs deleted file mode 100644 index ae69f7f9..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/StringSimilarity/CosineSimilarity.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; - -namespace AsbCloudInfrastructure.Services.WellOperationImport.FileParser.StringSimilarity; - -public class CosineSimilarity -{ - private const int DefaultK = 2; - - protected int K { get; } - - public CosineSimilarity(int k) - { - if (k <= 0) - { - throw new ArgumentOutOfRangeException(nameof(k), "k should be positive!"); - } - - K = k; - } - - public CosineSimilarity() : this(DefaultK) { } - - public double Similarity(IDictionary profile1, IDictionary profile2) - => DotProduct(profile1, profile2) - / (Norm(profile1) * Norm(profile2)); - - public Dictionary GetProfile(string s) - { - var shingles = new Dictionary(); - - if (string.IsNullOrWhiteSpace(s)) - return shingles; - - var cleanString = Stemming(s); - - for (int i = 0; i < (cleanString.Length - K + 1); i++) - { - var shingle = cleanString.Substring(i, K); - - if (shingles.TryGetValue(shingle, out var old)) - { - shingles[shingle] = old + 1; - } - else - { - shingles[shingle] = 1; - } - } - - return shingles; - } - - private static string Stemming(string s) - { - var cleaned = Regex.Replace(s.ToLower(), "[^a-zа-я0-9]", ""); - var words = cleaned.Split(' '); - var filteredWords = words.Where(word => word.Length > 1).ToArray(); - return string.Concat(filteredWords); - } - - private static double Norm(IDictionary profile) - { - double agg = 0; - - foreach (var entry in profile) - { - agg += 1.0 * entry.Value * entry.Value; - } - - return Math.Sqrt(agg); - } - - private static double DotProduct(IDictionary profile1, IDictionary profile2) - { - var smallProfile = profile2; - var largeProfile = profile1; - - if (profile1.Count < profile2.Count) - { - smallProfile = profile1; - largeProfile = profile2; - } - - double agg = 0; - foreach (var entry in smallProfile) - { - if (!largeProfile.TryGetValue(entry.Key, out var i)) - continue; - - agg += 1.0 * entry.Value * i; - } - - return agg; - } -} diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationDefaultExcelParser.cs b/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationDefaultExcelParser.cs deleted file mode 100644 index 2996d642..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationDefaultExcelParser.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using AsbCloudApp.Data.WellOperationImport; -using AsbCloudApp.Data.WellOperationImport.Options; -using AsbCloudApp.Services.WellOperationImport; -using AsbCloudDb.Model; -using AsbCloudInfrastructure.Services.WellOperationImport.Constants; -using ClosedXML.Excel; - -namespace AsbCloudInfrastructure.Services.WellOperationImport.FileParser; - -public class WellOperationDefaultExcelParser : IWellOperationExcelParser -{ - public SheetDto Parse(Stream stream, WellOperationImportDefaultOptionsDto options) - { - using var workbook = new XLWorkbook(stream); - - return ParseWorkbook(workbook, options); - } - - private static SheetDto ParseWorkbook(IXLWorkbook workbook, WellOperationImportDefaultOptionsDto options) - { - var sheetName = options.IdType == WellOperation.IdOperationTypePlan - ? DefaultTemplateInfo.SheetNamePlan - : DefaultTemplateInfo.SheetNameFact; - - var sheet = workbook.GetWorksheet(sheetName); - - return ParseSheet(sheet); - } - - private static SheetDto ParseSheet(IXLWorksheet sheet) - { - if (sheet.RangeUsed().RangeAddress.LastAddress.ColumnNumber < 7) - throw new FileFormatException($"Лист {sheet.Name} содержит меньшее количество столбцов."); - - var count = sheet.RowsUsed().Count() - DefaultTemplateInfo.HeaderRowsCount; - - switch (count) - { - case > 1024: - throw new FileFormatException($"Лист {sheet.Name} содержит слишком большое количество операций."); - case <= 0: - return new SheetDto { Name = sheet.Name }; - } - - var rows = new RowDto[count]; - - var cellValuesErrors = new List(); - - for (int i = 0; i < rows.Length; i++) - { - try - { - var xlRow = sheet.Row(1 + i + DefaultTemplateInfo.HeaderRowsCount); - - rows[i] = ParseRow(xlRow); - } - catch (FileFormatException ex) - { - cellValuesErrors.Add(ex.Message); - } - } - - if (cellValuesErrors.Any()) - throw new FileFormatException(string.Join("\r\n", cellValuesErrors)); - - return new SheetDto - { - Name = sheet.Name, - Rows = rows - }; - } - - private static RowDto ParseRow(IXLRow xlRow) - { - return new RowDto - { - Number = xlRow.RowNumber(), - Section = xlRow.Cell(DefaultTemplateInfo.ColumnSection).GetCellValue(), - Category = xlRow.Cell(DefaultTemplateInfo.ColumnCategory).GetCellValue(), - CategoryInfo = xlRow.Cell(DefaultTemplateInfo.ColumnCategoryInfo).GetCellValue(), - DepthStart = xlRow.Cell(DefaultTemplateInfo.ColumnDepthStart).GetCellValue(), - DepthEnd = xlRow.Cell(DefaultTemplateInfo.ColumnDepthEnd).GetCellValue(), - Date = xlRow.Cell(DefaultTemplateInfo.ColumnDate).GetCellValue(), - Duration = xlRow.Cell(DefaultTemplateInfo.ColumnDuration).GetCellValue(), - Comment = xlRow.Cell(DefaultTemplateInfo.ColumnComment).GetCellValue() - }; - } -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationGazpromKhantosExcelParser.cs b/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationGazpromKhantosExcelParser.cs deleted file mode 100644 index 7eb62839..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationGazpromKhantosExcelParser.cs +++ /dev/null @@ -1,227 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using AsbCloudApp.Data.WellOperationImport; -using AsbCloudApp.Data.WellOperationImport.Options; -using AsbCloudApp.Exceptions; -using AsbCloudApp.Services.WellOperationImport; -using AsbCloudInfrastructure.Services.WellOperationImport.Constants; -using AsbCloudInfrastructure.Services.WellOperationImport.FileParser.StringSimilarity; -using ClosedXML.Excel; - -namespace AsbCloudInfrastructure.Services.WellOperationImport.FileParser; - -public class WellOperationGazpromKhantosExcelParser : IWellOperationExcelParser -{ - private class Operation - { - public int RowNumber { get; set; } - - public string? CategoryInfo { get; set; } - - public double SectionDiameter { get; set; } - - public double Depth { get; set; } - - public double Duration { get; set; } - - public DateTime Date { get; set; } - } - - private readonly CosineSimilarity cosineSimilarity = new(); - - private readonly Dictionary operationDict = InitDict("Operations.txt", '='); - private readonly Dictionary sectionDict = InitDict("Sections.txt", '='); - private readonly Dictionary operationAttributesDict = InitDict("OperationAttributes.txt", '='); - - public SheetDto Parse(Stream stream, WellOperationImportGazpromKhantosOptionsDto options) - { - using var workbook = new XLWorkbook(stream); - - return ParseWorkBook(workbook, options); - } - - private SheetDto ParseWorkBook(IXLWorkbook workbook, WellOperationImportGazpromKhantosOptionsDto options) - { - if (options.StartRow is < 1 or > 1048576) - throw new ArgumentInvalidException(nameof(options.StartRow), "Некорректное значение начальной строки"); - - if (options.EndRow is < 1 or > 1048576) - throw new ArgumentInvalidException(nameof(options.EndRow), "Некорректное значение конечной строки"); - - if (options.EndRow < options.StartRow) - throw new ArgumentInvalidException(nameof(options.EndRow), "Конечный номер строки не может быть больше начального"); - - var sheet = workbook.GetWorksheet(options.SheetName); - return ParseSheet(sheet, options.StartRow, options.EndRow); - } - - private SheetDto ParseSheet(IXLWorksheet sheet, int startRow, int endRow) - { - var operationAttributes = GetOperationAttributes(sheet.RowsUsed()); - - if (operationAttributes is null) - return new SheetDto { Name = sheet.Name }; - - var rowsCount = endRow - startRow + 1; - - var operations = new List(); - - var cellValuesErrors = new List(); - - for (int i = 0; i < rowsCount; i++) - { - var xlRow = sheet.Row(startRow + i); - - try - { - operations.Add(new Operation - { - RowNumber = xlRow.RowNumber(), - CategoryInfo = xlRow.Cell(operationAttributes[OperationAttributes.CategoryInfo]).GetCellValue(), - SectionDiameter =xlRow.Cell(operationAttributes[OperationAttributes.SectionDiameter]).GetCellValue(), - Depth = xlRow.Cell(operationAttributes[OperationAttributes.Depth]).GetCellValue(), - Duration = xlRow.Cell(operationAttributes[OperationAttributes.Duration]).GetCellValue(), - Date = xlRow.Cell(operationAttributes[OperationAttributes.Date]).GetCellValue() - }); - } - catch (FileFormatException ex) - { - cellValuesErrors.Add(ex.Message); - } - } - - if (cellValuesErrors.Any()) - throw new FileFormatException(string.Join("\r\n", cellValuesErrors)); - - return new SheetDto() - { - Name = sheet.Name, - Rows = BuildRows() - }; - - IEnumerable<(double Diameter, string Name)> BuildSections() - { - var groupedOperations = operations.GroupBy(o => o.SectionDiameter) - .Select(s => new - { - Diameter = s.Key, - CategoryInfo = string.Concat(s.Select(o => o.CategoryInfo)) - }); - - var repeatedSections = new[] { "xвостовик" }; - - var sections = new List<(double diameter, string section)>(); - - foreach (var groupedOperation in groupedOperations) - { - var sectionNamesSet = new HashSet(sections.Select(s => s.section)); - - sections.Add(new ValueTuple(groupedOperation.Diameter, sectionDict.FirstOrDefault(item => - groupedOperation.CategoryInfo.Contains(item.Key) && - (!sectionNamesSet.Contains(item.Value) || repeatedSections.Contains(item.Value.ToLowerInvariant()))).Value)); - } - - return sections; - } - - IEnumerable BuildRows() - { - if (!operations.Any()) - return Enumerable.Empty(); - - var rows = new List(); - - for (int i = 0; i < operations.Count; i++) - { - var currentOperation = operations[i]; - var nextOperation = i + 1 < operations.Count ? operations[i + 1] : currentOperation; - - rows.Add(new RowDto - { - Number = currentOperation.RowNumber, - Section = BuildSections().FirstOrDefault(s => Math.Abs(s.Diameter - currentOperation.SectionDiameter) < 0.1).Name, - Category = GetValueDictionary(operationDict, currentOperation.CategoryInfo, 0.3), - CategoryInfo = currentOperation.CategoryInfo, - DepthStart = currentOperation.Depth, - DepthEnd = nextOperation.Depth, - Duration = currentOperation.Duration, - Date = currentOperation.Date.AddHours(-currentOperation.Duration) - }); - } - - return rows; - } - } - - private IDictionary? GetOperationAttributes(IXLRows xlRows) - { - const int countOperationAttributes = 5; - - IDictionary? operationAttributes = null; - - foreach (var xlRow in xlRows) - { - operationAttributes = new Dictionary(); - - var cells = xlRow.CellsUsed().ToArray(); - - foreach (var cell in cells) - { - var operationAttribute = GetValueDictionary(operationAttributesDict, cell.GetCellValue(), 0.7); - - if (operationAttribute is null || operationAttributes.Any(a => a.Key == operationAttribute)) - continue; - - operationAttributes.Add(operationAttribute, cell.Address.ColumnNumber); - } - - if (operationAttributes.Count >= countOperationAttributes) - break; - } - - return operationAttributes is not null && operationAttributes.Count == countOperationAttributes ? operationAttributes : null; - } - - private string? GetValueDictionary(IDictionary dict, string? cellValue, double? minSimilarity) - { - if (string.IsNullOrWhiteSpace(cellValue)) - return null; - - var similarValues = new List<(double similarity, string value)>(); - - var profile1 = cosineSimilarity.GetProfile(cellValue); - - foreach (var item in dict) - { - var profile2 = cosineSimilarity.GetProfile(item.Key); - - var similarity = cosineSimilarity.Similarity(profile1, profile2); - - similarValues.Add((similarity, item.Value)); - } - - var mostSimilarValue = similarValues.MaxBy(v => v.similarity); - - return minSimilarity.HasValue && mostSimilarValue.similarity >= minSimilarity ? mostSimilarValue.value : null; - } - - private static Dictionary InitDict(string fileName, char separator) - { - var resourceName = Assembly.GetExecutingAssembly() - .GetManifestResourceNames() - .FirstOrDefault(n => n.EndsWith(fileName))!; - - var stream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream(resourceName)!; - - using var reader = new StreamReader(stream); - - return reader.ReadToEnd().Split('\r') - .Where(s => !string.IsNullOrWhiteSpace(s)) - .Select(line => line.Split(separator)) - .ToDictionary(parts => parts[0].Trim(), parts => parts[1].Trim()); - } -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/OperationAttributes.txt b/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/OperationAttributes.txt deleted file mode 100644 index 7127ce99..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/OperationAttributes.txt +++ /dev/null @@ -1,8 +0,0 @@ -Описание=Описание -ОК=ОК -Секция=ОК -Забой, м=Забой -Время=Время операции -Плановое время бурения, сут=Время операции -Окончание=Дата окончания операции -Дата окончания План РГ=Дата окончания операции \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Operations.txt b/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Operations.txt deleted file mode 100644 index 68bc28c7..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Operations.txt +++ /dev/null @@ -1,201 +0,0 @@ -Сборка КНБК=Сборка КНБК -Сборка роторной КНБК=Сборка КНБК -Шаблонирование спуск КНБК=Шаблонирование перед спуском -Бурение под направлением=Бурение ротором -Шаблонирование перед спуском=Шаблонирование перед спуском -Шаблонировка пробуренного интервала + промывка на забое+ подъем КНБК=Шаблонирование перед спуском -Разборка КНБК=Разборка КНБК -ПР к спуску направления 324мм=ПЗР при спуске ОК -Спуск направления=Спуск ОК -Спуск направления 324мм=Спуск ОК -Цементаж направления 324мм=Цементирование -ОЗЦ. Оборудование устья.=ОЗЦ -ОЗЦ. Чистка забурочной ямы. Чистка ВШН. Отворот доп. патрубка. ЗГР=ОЗЦ -Перетяжка талевого каната / замена.=Перетяжка талевого каната -Шаблонирование подъём КНБК=Шаблонировка подъем БИ, продувка -Сборка СБТ 127мм-300м=Сборка БИ с мостков на подсвечник -Сборка КНБК для бурения кондуктора=Сборка КНБК -Сборка КНБК для бурения. Компоновка БК согласно собранного БИ в п.10=Сборка КНБК -Cпуск КНБК=Спуск КНБК -Cпуск КНБК со сборкой БИ с мостков=Спуск бурильного инструмента со сборкой с мостков -Разбурка оснастки (ЦКОД, цем.стакан, БК), замена раствора=Разбуривание тех.оснастки -Бурение под кондуктор. Наращивание св.=Бурение ротором -Промывка, ОБР, МBТ БР<70 кг/м3=Промывка -Промывка на забое=Промывка -Шаблонирование (подъем)=Шаблонировка во время бурения -Шаблонирование (спуск)=Шаблонировка во время бурения -Промывка на забое. Прокачка ВУС, ОБР, МBТ БР <70 кг/м3=Промывка -Подъем=Подъем КНБК -Разборка КНБК с телесистемой=Разборка КНБК -ПЗР к спуску ОК 245мм=ПЗР при спуске ОК -Спуск ОК 245мм с промежуточными промывками (500 м, 1000м). Вывоз БР с БДЕ=Спуск ОК -Промывка перед цементажем=Промывка при спуске ОК -Цементаж кондуктора 245мм=Цементирование -Монтаж ОУС. Вывоз БР, Чистка емкостей=Чистка ЦСГО/емкостного блока -Монтаж ОУС=Монтаж ПВО -Заготовка бурового раствора, чистка емкостей.=Опрессовка ПВО -Монтаж ПВО, монтаж разрезной воронки и устьевого желоба. Вывоз БР, заготовка БР=Монтаж ПВО -Опрессовка глухих плашек ППГ, БГ, БД , выкидных линий, крестовины с коренными задвижками. ЗБР=Опрессовка ПВО -Сборка КНБК на бурение=Сборка КНБК -Сборка СБТ 127мм-465м=Сборка БИ с мостков на подсвечник -Спуск КНБК со сборкой с мостков СБТ -127 (1700м)=Спуск КНБК -Сборка КНБК на бурение транспортного ствола=Сборка КНБК -Опрессовка трубных плашек, ПУГ=Опрессовка ПВО -Разбурка оснастки (ЦКОД, цем.стакан, БК, углубление на 2 метра ниже БК, опрессовка цементного кольца)=Разбуривание тех.оснастки -Разбурка БК, ЦКОДа и цем.стакана=Разбуривание тех.оснастки -Перевод скважины на новый раствор, чистка ЦСГО=Промывка - перевод скважины на новый раствор -Перевод скважины на новый буровой раствор=Промывка - перевод скважины на новый раствор -Бурение транспортного ствола наращ.св. (прокачка укрепляющих пачек ч/з каждые 150-200м)=Бурение ротором -Промывка после ХМ св TVD - 1660 м (ниже на 50 м)=Промывка -Чистка ЦСГО (опрессовка цем. кольца кондуктора во время чистки ЦСГО)=Чистка ЦСГО/емкостного блока -Промывка после Алымской св TVD - 2140 м (ниже на 50 м)=Промывка -Бурение транспортного ствола наращ. cв. (прокачка укрепляющих пачек ч/з каждые 150-200м).=Бурение ротором -Бурение транспортного ствола (1000м первые сутки бурения)=Бурение ротором -Подъем КНБК шаблонировка ствола скважины=Шаблонировка подъем БИ, продувка -Промывка (по согласованию с ЦУСС)=Промывка -Шаблонировка. Подъем КНБК (по согласованию с ЦУСС)=Шаблонировка во время бурения -Шаблонировка.Спуск КНБК со сборкой БИ 300м (по согласованию с ЦУСС)=Шаблонировка во время бурения -Промывка=Промывка -Шаблонировка. Подъем КНБК=Шаблонировка во время бурения -Шаблонировка.Спуск КНБК=Шаблонировка во время бурения -Разборка КНБК с т/с=Разборка КНБК -Промывка на забое, прокачка кольмат. пачки=Помывка -ПЗР к спуску ОК-178мм.=ПЗР при спуске ОК -Спуск ОК 178 мм (до устья, не потайная) с промежуточными промывками=Спуск ОК -Цементирование ОК-178мм=Цементирование -Отворот и выброс допускной трубы, демонтаж ПВО, замыв шурфа для выброса СБТ-127мм, чистка емкостей, приготовление БР=Демонтаж ПВО -Промывка, установка смазывающей пачки=Промывка -Выброс СБТ-127мм на мостки, чистка емкостей, приготовление БР=Подъем БИ с выбросом на мостки -Подъем КНБК с выбросом БИ - 500м (выброс согласовать с куратором ЦУСС)=Подъем КНБК -Монтаж ПВО, замена трубных плашек 127мм на 102мм, замена рабочего переводника на СВП, приготовление БР=Перетяжка талевого каната -ПЗР к спуску ОК 178мм=ПЗР при спуске ОК -Спуск ОК 178мм с промывками. Вывоз БР с БДЕ=Спуск ОК -Цементирование 178мм ОК. Вывоз БР с БДЕ=Цементирование -Частичный демонтаж ПВО=Демонтаж ПВО -Выброс БИ 127 на мостки - 1600м (Оставляем БИ 127 1400 м на бурение под кондуктор). Вывоз БР, чистка емкостей=Подъем БИ с выбросом на мостки -Частичный монтаж ПВО=Монтаж ПВО -Опрессовка (200 атм) глухих плашек ППГ, БГ, БД, выкидных линий, крестовины с коренными задвижками, ЗБР. Сборка БИ-102мм - 1000м для бурения ГС свечами.=Опрессовка ПВО -Сборка КНБК на бурение секции под хвостовик 114мм=Сборка КНБК -Спуск КНБК со сборкой БИ 102 и промежуточными промывками.=Промывка - перевод скважины на новый раствор -Опрессовка трубных плашек ППГ, ПУГ. Промывка, перезапись гаммы=Опрессовка ПВО -Разбурка оснастки (ЦКОД, цем.стакан, БК)=Разбуривание тех.оснастки -Перевод на новый раствор=Промывка - перевод скважины на новый раствор -Чистка ЦСГО=Чистка ЦСГО/емкостного блока -Бурение горизонтального участка скважины (прокачка укрепляющих пачек ч/з каждые 100 м)=Бурение ротором -Подъем БИ в БК Ø178мм.=Подъем КНБК -Спуск БИ со сборкой ТБТ 88,9мм на опрессовку (20м до БК 178)=Спуск КНБК -Опрессовка БИ, установка на подсвечник ТБТ=Опрессовка БИ -Проработка в 2 этапа:1 этап - прямая принудительная проработка; 2 этап - спуск на "сухую"(имитация спуска хвостовика)=Проработка принудительная -Cборка хвостовика=Сборка хвостовика 114мм (согласно схеме) -Промывка, прокачка ВУС=Промывка -Подъем КНБК=Подъем КНБК -ПЗР к спуску хвостовика=ПЗР при спуске ОК -Сборка хвостовика 114мм (согласно схеме)=Сборка хвостовика 114мм (согласно схеме) -Спуск хвостовика 114мм на БИ. В БК 178 перевод на тех.воду (по согл.с ЦУСС)=Спуск ОК -Активация подвески (4ч). Перевод на жидкость заканчивания (2ч).=Активация подвески, опрессовка -Подъем БИ с выбросом на мостки. Оставляем ТБТ 89 (800 м) на следующую скв=Подъем БИ с выбросом на мостки -Демонтаж ПВО=Демонтаж ПВО -Монтаж, опрессовка ФА=Монтаж, опрессовка ФА -5% времени на ТО БУ=Ремонт -Монтаж ФА=Монтаж, опрессовка ФА -Подъем разъединителя с выбросом СБТ-102мм на мостки=Подъем инструмента -Активация подвески. Перевод на жидкость заканчивания. Опрессовка пакера подвески хвостовика.=Активация подвески (потайной колонны, хвостовика) -ПР к спуску хвостовика=ПЗР при спуске ОК -Подъем КНБК с частичным выбросом СБТ-102мм на приемные мостки=Подъем БИ с выбросом на мостки -Бурение горизонтального участка скважины (прокачка укрепляющих пачек ч/з каждые 100м)=Бурение ротором -Промывка перезапись ГК=Промывка -Спуск КНБК со сборкой СБТ-102мм с приемных мостков, с промежуточными промывками каждые 500м=Спуск бурильного инструмента со сборкой с мостков -Сборка КНБК для бурения горизонтального участка скважины=Сборка БИ с мостков на подсвечник -Опрессовка глухих плашек ППГ, БГ, БД, выкидных линий, крестовины с коренными задвижками, приготовление бур.раствора=Опрессовка ПВО -ВМР=ВМР -Долив затруба при подъёме=Долив затруба при подъёме -Закачка/прокачка пачки=Закачка/прокачка пачки -Комплекс ГИС на жестком кабеле=Комплекс ГИС на жестком кабеле -Комплекс ГИС на кабеле=Комплекс ГИС на кабеле -Комплекс ГИС на трубах=Комплекс ГИС на трубах -Контролируемое ГНВП=Контролируемое ГНВП -Ловильные работы=Ловильные работы -Наработка жёлоба=Наработка жёлоба -Наращивание=Наращивание -НПВ / прочее=НПВ / прочее -Обвязка устья с циркуляционной системой=Обвязка устья с циркуляционной системой -Оборудование устья=Оборудование устья -Обработка БР=Обработка БР -Обработка раствора (несоответствие параметров)=Обработка раствора (несоответствие параметров) -Ожидание=Ожидание -Определение места прихвата и ЛМ=Определение места прихвата и ЛМ -Опрессовка ОК=Опрессовка ОК -Ориентирование ТС при бурении=Ориентирование ТС при бурении -Отворот допускной трубы=Отворот допускной трубы -Перезапись гаммы-каротажа=Перезапись гаммы-каротажа -Перемонтаж ПВО=Перемонтаж ПВО -ПЗР к спуску УЭЦН=ПЗР к спуску УЭЦН -ПЗР при сборке КНБК=ПЗР при сборке КНБК -ПЗР при цементировании=ПЗР при цементировании -Поглощение=Поглощение -Подготовка ствола скважины. Перезапись ГК в интервале установки КО.=Подготовка ствола скважины. Перезапись ГК в интервале установки КО. -Подъем БИ с выбросом на мостки=Подъем БИ с выбросом на мостки -подъем ОК=подъем ОК -Подъем приборов ГИС (на трубах)=Подъем приборов ГИС (на трубах) -Полная замена талевого каната=Полная замена талевого каната -ПР перед забуркой направления=ПР перед забуркой направления -Приготовление БР=Приготовление БР -Продувка манифольда=Продувка манифольда -Промывка перед наращиванием=Промывка перед наращиванием -Проработка во время бурения=Проработка во время бурения -Проработка перед наращиванием=Проработка перед наращиванием -Работа яссом=Работа яссом -Разборка комплекса приборов ГИС=Разборка комплекса приборов ГИС -Разбуривание тех.оснастк=Разбуривание тех.оснастки -Расхаживани=Расхаживание -Ревизия КНБК/инструмента/ЗТС=Ревизия КНБК/инструмента/ЗТС -Ремонт бурового оборудования=Ремонт бурового оборудования -Сальникообразование=Сальникообразование -Сборка и спуск ТБТ=Сборка и спуск ТБТ -Сборка комплекса приборов ГИС=Сборка комплекса приборов ГИС -Сборка устройства ориентирования КО=Сборка устройства ориентирования КО -Смена рабочего переводника ВСП=Смена рабочего переводника ВСП -СПО - колокол=СПО - колокол -СПО - метчик=СПО - метчик -СПО - овершот=СПО - овершот -СПО - труболовка=СПО - труболовка -Спуск БИ со сборкой с мостков=Спуск БИ со сборкой с мостков -Спуск инструмента=Спуск инструмента -Спуск инструмента с проработкой=Спуск инструмента с проработкой -Спуск КО на транспотрной колонне=Спуск КО на транспотрной колонне -Спуск приборов ГИС (на трубах)=Спуск приборов ГИС (на трубах) -Срезка=Срезка -Тайм-дриллинг=Тайм-дриллинг -Тех.отстой=Тех.отстой -Торпедирование (встряхивание)=Торпедирование (встряхивание) -Торпедирование (отстрел)=Торпедирование (отстрел) -Удержание в клиньях=Удержание в клиньях -Установка ванн=Установка ванн -Утяжеление БР=Утяжеление БР -Учебная тревога "Выброс"=Учебная тревога "Выброс" -Фрезеровка=Фрезеровка -Шаблонировка подъем БИ, продувка=Шаблонировка подъем БИ, продувка -Шаблонировка перед наращиванием=Шаблонировка перед наращиванием -Демонтаж ПВО ( переоборудование устья скважины). Вывоз БР=Демонтаж ПВО -Сборка БИ 127/147с мостков установкой на подсвечник=Сборка БИ с мостков на подсвечник -Спуск приборов комплекса АМАК.=Спуск приборов ГИС (на трубах) -Подъем с записью=Подъем приборов ГИС (на трубах) -ОЗЦ под давлением (по согласованию с ЦУСС)=ОЗЦ -"Демонтаж ПВО ( переоборудование устья скважины). Вывоз БР=Демонтаж ПВО -Сборка CБТ-127 (0м) с мостков установкой на подсвечник (оставлено СБТ-127 (1500м) с пердыдущей скв). Заготовка БР=Сборка БИ с мостков на подсвечник -ПЗР к спуску ОК=ПЗР при спуске ОК -Выброс СБТ 127 (2100м), оставляется СБТ-127 (700 м) на след скв. ЗБР, чистка емкостей, вывоз БР.=Подъем БИ с выбросом на мостки -Монтаж ПВО повторный (смена плашек ПВО). ЗБР, чистка емкостей, вывоз БР=Монтаж ПВО -Опрессовка ПВО (200 атм), глухие=Опрессовка ПВО -Сборка ТБТ на 2 этапе (кол-во по согласованию с ЦУСС). Подъем/спуск БИ со сборкой ТБТ 102 мм. Опрессовка БИ (1.5 ч)=Сборка и спуск ТБТ -Спуск пакера=Спуск пакера -Запись гамма-каратожа=Запись гамма-каратожа -Шаблонирование спуск БИ=Шаблонирование спуск БИ -Сборка клин-отклонителя=Сборка клин-отклонителя -Ориентирование и посадка клина-отклонителя=Ориентирование и посадка клина-отклонителя -Протяжка подъемного патрубка подвески=Протяжка подъемного патрубка подвески -Подъем клина-отклонителя=Подъем клина-отклонителя -Стыковка стингера с хвостовиком основного ствола=Стыковка стингера с хвостовиком основного ствола -Ориентирование и установка стыковочного узла хвостовика=Ориентирование и установка стыковочного узла хвостовика -Бурение с отбором керна=Бурение с отбором керна -Работа пакером в обсадной колонне=Работа пакером в обсадной колонне \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Sections.txt b/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Sections.txt deleted file mode 100644 index b0b2df54..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Sections.txt +++ /dev/null @@ -1,7 +0,0 @@ -направ=Направление -конд=Кондуктор -техн=Техническая колонна -экспл=Эксплуатационная колонна -транс=Транспортный ствол -пилот=Пилотный ствол -хвост=Хвостовик \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Files/WellOperationImportTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperationImport/Files/WellOperationImportTemplate.xlsx deleted file mode 100644 index 6f53ccfbeffaf2feaa69d38216b8b4f6a085a824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98938 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%0D<;;j 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

Y*%T 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 Ze%w9!T2PSTTblz8EP|WOGYI4=@E@*WtDpb? diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationExportService.cs b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationExportService.cs deleted file mode 100644 index 96e640b8..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationExportService.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using AsbCloudApp.Data; -using AsbCloudApp.Repositories; -using AsbCloudApp.Requests; -using AsbCloudApp.Services.WellOperationImport; -using AsbCloudInfrastructure.Services.WellOperationImport.Constants; -using ClosedXML.Excel; - -namespace AsbCloudInfrastructure.Services.WellOperationImport; - -public class WellOperationExportService : IWellOperationExportService -{ - private readonly IWellOperationRepository wellOperationRepository; - private readonly IWellOperationImportTemplateService wellOperationImportTemplateService; - private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; - - public WellOperationExportService( - IWellOperationRepository wellOperationRepository, - IWellOperationImportTemplateService wellOperationImportTemplateService, - IWellOperationCategoryRepository wellOperationCategoryRepository) - { - this.wellOperationRepository = wellOperationRepository; - this.wellOperationImportTemplateService = wellOperationImportTemplateService; - this.wellOperationCategoryRepository = wellOperationCategoryRepository; - } - - public async Task ExportAsync(int idWell, CancellationToken cancellationToken) - { - var operations = await wellOperationRepository.GetAsync(new WellOperationRequest() - { - IdWell = idWell - }, cancellationToken); - - return MakeExcelFileStream(operations); - } - - private Stream MakeExcelFileStream(IEnumerable operations) - { - using Stream ecxelTemplateStream = wellOperationImportTemplateService.GetExcelTemplateStream(); - - using var workbook = new XLWorkbook(ecxelTemplateStream); - AddOperationsToWorkbook(workbook, operations); - - var memoryStream = new MemoryStream(); - workbook.SaveAs(memoryStream, new SaveOptions { }); - memoryStream.Seek(0, SeekOrigin.Begin); - return memoryStream; - } - - private void AddOperationsToWorkbook(XLWorkbook workbook, IEnumerable operations) - { - var planOperations = operations.Where(o => o.IdType == 0); - if (planOperations.Any()) - { - var sheetPlan = workbook.GetWorksheet(DefaultTemplateInfo.SheetNamePlan); - - AddOperationsToSheet(sheetPlan, planOperations); - } - - var factOperations = operations.Where(o => o.IdType == 1); - if (factOperations.Any()) - { - var sheetFact = workbook.GetWorksheet(DefaultTemplateInfo.SheetNameFact); - - AddOperationsToSheet(sheetFact, factOperations); - } - } - - private void AddOperationsToSheet(IXLWorksheet sheet, IEnumerable operations) - { - var operationsToArray = operations.ToArray(); - - var sections = wellOperationRepository.GetSectionTypes(); - var categories = wellOperationCategoryRepository.Get(false); - - for (int i = 0; i < operationsToArray.Length; i++) - { - var row = sheet.Row(1 + i + DefaultTemplateInfo.HeaderRowsCount); - AddOperationToRow(row, operationsToArray[i], sections, categories); - } - } - - private static void AddOperationToRow(IXLRow row, WellOperationDto operation, IEnumerable sections, - IEnumerable categories) - { - var sectionCaption = sections.First(s => s.Id == operation.IdWellSectionType).Caption; - var categoryName = categories.First(o => o.Id == operation.IdCategory).Name; - - row.Cell(DefaultTemplateInfo.ColumnSection).SetCellValue(sectionCaption); - row.Cell(DefaultTemplateInfo.ColumnCategory).SetCellValue(categoryName); - row.Cell(DefaultTemplateInfo.ColumnCategoryInfo).SetCellValue(operation.CategoryInfo); - row.Cell(DefaultTemplateInfo.ColumnDepthStart).SetCellValue(operation.DepthStart); - row.Cell(DefaultTemplateInfo.ColumnDepthEnd).SetCellValue(operation.DepthEnd); - row.Cell(DefaultTemplateInfo.ColumnDate).SetCellValue(operation.DateStart.DateTime); - row.Cell(DefaultTemplateInfo.ColumnDuration).SetCellValue(operation.DurationHours); - row.Cell(DefaultTemplateInfo.ColumnComment).SetCellValue(operation.Comment); - } -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs deleted file mode 100644 index 6ad227a3..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using AsbCloudApp.Data; -using AsbCloudApp.Data.WellOperationImport; -using AsbCloudApp.Repositories; -using AsbCloudApp.Services; -using AsbCloudApp.Services.WellOperationImport; - -namespace AsbCloudInfrastructure.Services.WellOperationImport; - -public class WellOperationImportService : IWellOperationImportService -{ - private readonly IWellService wellService; - private readonly IWellOperationRepository wellOperationRepository; - private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; - private static readonly DateTime dateLimitMin = new(2001, 1, 1, 0, 0, 0); - private static readonly DateTime dateLimitMax = new(2099, 1, 1, 0, 0, 0); - private static readonly TimeSpan drillingDurationLimitMax = TimeSpan.FromDays(366); - - public WellOperationImportService( - IWellService wellService, - IWellOperationRepository wellOperationRepository, - IWellOperationCategoryRepository wellOperationCategoryRepository - ) - { - this.wellService = wellService; - this.wellOperationRepository = wellOperationRepository; - this.wellOperationCategoryRepository = wellOperationCategoryRepository; - } - - public IEnumerable Import(int idWell, int idUser, int idType, SheetDto sheet) - { - var validationErrors = new List(); - - var sections = wellOperationRepository.GetSectionTypes(); - var categories = wellOperationCategoryRepository.Get(false); - - var wellOperations = new List(); - - var rows = sheet.Rows.OrderBy(r => r.Date); - - var prevRow = new RowDto(); - - foreach (var row in rows) - { - try - { - var section = sections.FirstOrDefault(s => - string.Equals(s.Caption, row.Section, StringComparison.CurrentCultureIgnoreCase)); - - if (section is null) - throw new FileFormatException($"Лист '{sheet.Name}'. В строке '{row.Number}' не удалось определить секцию"); - - var category = categories.FirstOrDefault(c => - string.Equals(c.Name, row.Category, StringComparison.CurrentCultureIgnoreCase)); - - if (category is null) - throw new FileFormatException($"Лист '{sheet.Name}'. В строке '{row.Number}' не удалось определить операцию"); - - if (row.DepthStart is not (>= 0d and <= 20_000d)) - throw new FileFormatException( - $"Лист '{sheet.Name}'. Строка '{row.Number}' некорректная глубина на начало операции"); - - if (row.DepthEnd is not (>= 0d and <= 20_000d)) - throw new FileFormatException( - $"Лист '{sheet.Name}'. Строка '{row.Number}' некорректная глубина на конец операции"); - - if (row.Date < dateLimitMin && row.Date > dateLimitMax) - throw new FileFormatException( - $"Лист '{sheet.Name}'. Строка '{row.Number}' неправильно получена дата начала операции"); - - if (prevRow.Date > row.Date) - throw new FileFormatException( - $"Лист '{sheet.Name}' строка '{row.Number}' дата позднее даты предыдущей операции"); - - if (row.Duration is not (>= 0d and <= 240d)) - throw new FileFormatException($"Лист '{sheet.Name}'. Строка '{row.Number}' некорректная длительность операции"); - - var timezone = wellService.GetTimezone(idWell); - var timezoneOffset = TimeSpan.FromHours(timezone.Hours); - - var wellOperation = new WellOperationDto - { - IdWell = idWell, - IdUser = idUser, - IdType = idType, - IdWellSectionType = section.Id, - WellSectionTypeName = section.Caption, - IdCategory = category.Id, - CategoryName = category.Name, - CategoryInfo = row.CategoryInfo, - DepthStart = row.DepthStart, - DepthEnd = row.DepthEnd, - DateStart = new DateTimeOffset(row.Date, timezoneOffset), - DurationHours = row.Duration, - Comment = row.Comment - }; - - wellOperations.Add(wellOperation); - - prevRow = row; - } - catch (FileFormatException ex) - { - validationErrors.Add(ex.Message); - } - } - - if (wellOperations.Any() && wellOperations.Min(o => o.DateStart) - wellOperations.Max(o => o.DateStart) > drillingDurationLimitMax) - validationErrors.Add($"Лист {sheet.Name} содержит диапазон дат больше {drillingDurationLimitMax}"); - - if (validationErrors.Any()) - throw new FileFormatException(string.Join("\r\n", validationErrors)); - - return wellOperations; - } -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportTemplateService.cs b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportTemplateService.cs deleted file mode 100644 index edb71c14..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportTemplateService.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.IO; -using System.Linq; -using System.Reflection; -using AsbCloudApp.Services.WellOperationImport; - -namespace AsbCloudInfrastructure.Services.WellOperationImport; - -public class WellOperationImportTemplateService : IWellOperationImportTemplateService -{ - public Stream GetExcelTemplateStream() - { - var resourceName = Assembly.GetExecutingAssembly() - .GetManifestResourceNames() - .FirstOrDefault(n => n.EndsWith("WellOperationImportTemplate.xlsx"))!; - - var stream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream(resourceName)!; - - return stream; - } -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..065dc2070b20c533bc426b21237f4e4cf062c581 GIT binary patch literal 45673 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%0AtJkynKDVw^qTIomKcf7n`I8EN-u2v3O%o3olI5c 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 z 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