diff --git a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanDrillingDto.cs b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanDrillingDto.cs index 67d6c74b..ea2555a8 100644 --- a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanDrillingDto.cs +++ b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanDrillingDto.cs @@ -17,7 +17,7 @@ public class ProcessMapPlanDrillingDto : ProcessMapPlanBaseDto /// Название режима бурения /// public string? Mode { get; set; } - + /// /// Осевая нагрузка, т план /// diff --git a/AsbCloudApp/Requests/ExportOptions/IExportOptionsRequest.cs b/AsbCloudApp/Requests/ExportOptions/IExportOptionsRequest.cs new file mode 100644 index 00000000..8d65572b --- /dev/null +++ b/AsbCloudApp/Requests/ExportOptions/IExportOptionsRequest.cs @@ -0,0 +1,8 @@ +namespace AsbCloudApp.Requests.ExportOptions; + +/// +/// Параметры экспорта +/// +public interface IExportOptionsRequest +{ +} \ No newline at end of file diff --git a/AsbCloudApp/Requests/ExportOptions/WellRelatedExportRequest.cs b/AsbCloudApp/Requests/ExportOptions/WellRelatedExportRequest.cs new file mode 100644 index 00000000..63b185cd --- /dev/null +++ b/AsbCloudApp/Requests/ExportOptions/WellRelatedExportRequest.cs @@ -0,0 +1,21 @@ +namespace AsbCloudApp.Requests.ExportOptions; + +/// +/// Параметры экспорта +/// +public class WellRelatedExportRequest : IExportOptionsRequest +{ + /// + /// Конструктор + /// + /// Id скважины + public WellRelatedExportRequest(int idWell) + { + IdWell = idWell; + } + + /// + /// Id скважины + /// + public int IdWell { get; } +} \ No newline at end of file diff --git a/AsbCloudApp/Services/IExportService.cs b/AsbCloudApp/Services/IExportService.cs new file mode 100644 index 00000000..b921fec5 --- /dev/null +++ b/AsbCloudApp/Services/IExportService.cs @@ -0,0 +1,21 @@ +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Requests.ExportOptions; + +namespace AsbCloudApp.Services; + +/// +/// Экспорт данных +/// +public interface IExportService + where TOptions : IExportOptionsRequest +{ + /// + /// Экспортировать данные + /// + /// + /// + /// + Task<(string FileName, Stream File)> ExportAsync(TOptions options, CancellationToken token); +} \ No newline at end of file diff --git a/AsbCloudApp/Services/IParserService.cs b/AsbCloudApp/Services/IParserService.cs index 6fa095cd..89212ba7 100644 --- a/AsbCloudApp/Services/IParserService.cs +++ b/AsbCloudApp/Services/IParserService.cs @@ -9,7 +9,7 @@ namespace AsbCloudApp.Services; /// /// /// -public interface IParserService : IParserService +public interface IParserService where TDto : class, IId where TOptions : IParserOptionsRequest { @@ -26,11 +26,4 @@ public interface IParserService : IParserService /// /// Stream GetTemplateFile(); -} - -/// -/// Сервис парсинга(интерфейс маркер) -/// -public interface IParserService -{ } \ No newline at end of file diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 6250112f..5ee77197 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -45,6 +45,7 @@ using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; +using AsbCloudInfrastructure.Services.ProcessMapPlan.Export; namespace AsbCloudInfrastructure { @@ -161,9 +162,6 @@ namespace AsbCloudInfrastructure services.AddScoped(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -295,7 +293,14 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); + + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + return services; } } diff --git a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs index bfea0fe6..789da211 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs @@ -28,6 +28,7 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb .Include(e => e.Author) .Include(e => e.Editor) .Include(e => e.Well) + .Include(e => e.WellSectionType) .Where(e => e.IdWell == request.IdWell); if (request.IdWellSectionType.HasValue) @@ -56,4 +57,11 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb var offset = TimeSpan.FromHours(timezone.Hours); return offset; } + + protected override TDto Convert(TEntity entity, TimeSpan offset) + { + var dto = base.Convert(entity, offset); + dto.Section = entity.WellSectionType.Caption; + return dto; + } } diff --git a/AsbCloudInfrastructure/Services/Parser/Cell.cs b/AsbCloudInfrastructure/Services/ExcelServices/Cell.cs similarity index 97% rename from AsbCloudInfrastructure/Services/Parser/Cell.cs rename to AsbCloudInfrastructure/Services/ExcelServices/Cell.cs index 381ca57b..a18fb167 100644 --- a/AsbCloudInfrastructure/Services/Parser/Cell.cs +++ b/AsbCloudInfrastructure/Services/ExcelServices/Cell.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.IO; using ClosedXML.Excel; -namespace AsbCloudInfrastructure.Services.Parser; +namespace AsbCloudInfrastructure.Services.ExcelServices; public class Cell { diff --git a/AsbCloudInfrastructure/Services/ExcelServices/ExportExcelService.cs b/AsbCloudInfrastructure/Services/ExcelServices/ExportExcelService.cs new file mode 100644 index 00000000..086eba97 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/ExportExcelService.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Requests.ExportOptions; +using AsbCloudApp.Services; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using ClosedXML.Excel; +using Mapster; + +namespace AsbCloudInfrastructure.Services.ExcelServices; + +public abstract class ExportExcelService : IExportService + where TOptions : IExportOptionsRequest +{ + protected abstract ITemplateParameters TemplateParameters { get; } + + protected abstract Task BuildFileNameAsync(TOptions options, CancellationToken token); + + protected abstract Task> GetDtosAsync(TOptions options, CancellationToken token); + + public async Task<(string FileName, Stream File)> ExportAsync(TOptions options, CancellationToken token) + { + var dtos = await GetDtosAsync(options, token); + + var fileName = await BuildFileNameAsync(options, token); + var file = BuildFile(dtos); + return (fileName, file); + } + + private Stream BuildFile(IEnumerable dtos) + { + using var template = GetTemplateFile(); + using var workbook = new XLWorkbook(template); + AddDtosToWorkbook(workbook, dtos); + + var memoryStream = new MemoryStream(); + workbook.SaveAs(memoryStream, new SaveOptions { }); + memoryStream.Seek(0, SeekOrigin.Begin); + return memoryStream; + } + + private void AddDtosToWorkbook(XLWorkbook workbook, IEnumerable dtos) + { + var dtosToArray = dtos.ToArray(); + + if (!dtosToArray.Any()) + return; + + var sheet = workbook.GetWorksheet(TemplateParameters.SheetName); + for (var i = 0; i < dtosToArray.Length; i++) + { + var row = sheet.Row(1 + i + TemplateParameters.HeaderRowsCount); + AddRow(row, dtosToArray[i]); + } + } + + private void AddRow(IXLRow xlRow, TDto dto) + { + var properties = dto.Adapt>(); + + foreach (var (name, cellValue) in properties) + { + if (TemplateParameters.Cells.TryGetValue(name, out var cell)) + xlRow.Cell(cell.ColumnNumber).SetCellValue(cellValue); + } + } + + private Stream GetTemplateFile() => + Assembly.GetExecutingAssembly().GetTemplateCopyStream(TemplateParameters.FileName) + ?? throw new ArgumentNullException($"Файл '{TemplateParameters.FileName}' не найден"); +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Parser/ParserExcelService.cs b/AsbCloudInfrastructure/Services/ExcelServices/ParserExcelService.cs similarity index 77% rename from AsbCloudInfrastructure/Services/Parser/ParserExcelService.cs rename to AsbCloudInfrastructure/Services/ExcelServices/ParserExcelService.cs index 13c621af..64e0259c 100644 --- a/AsbCloudInfrastructure/Services/Parser/ParserExcelService.cs +++ b/AsbCloudInfrastructure/Services/ExcelServices/ParserExcelService.cs @@ -7,39 +7,34 @@ using System.Reflection; using AsbCloudApp.Data; using AsbCloudApp.Requests.ParserOptions; using AsbCloudApp.Services; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; using ClosedXML.Excel; using Mapster; -namespace AsbCloudInfrastructure.Services.Parser; +namespace AsbCloudInfrastructure.Services.ExcelServices; public abstract class ParserExcelService : IParserService where TDto : class, IValidatableObject, IId where TOptions : IParserOptionsRequest { - protected abstract string SheetName { get; } + protected abstract ITemplateParameters TemplateParameters { get; } - protected virtual int HeaderRowsCount => 0; - - protected abstract string TemplateFileName { get; } - - protected abstract IDictionary Cells { get; } - public virtual ParserResultDto Parse(Stream file, TOptions options) { using var workbook = new XLWorkbook(file); - var sheet = workbook.GetWorksheet(SheetName); + var sheet = workbook.GetWorksheet(TemplateParameters.SheetName); var dtos = ParseExcelSheet(sheet); return dtos; } public virtual Stream GetTemplateFile() => - Assembly.GetExecutingAssembly().GetTemplateCopyStream(TemplateFileName) - ?? throw new ArgumentNullException($"Файл '{TemplateFileName}' не найден"); + Assembly.GetExecutingAssembly().GetTemplateCopyStream(TemplateParameters.FileName) + ?? throw new ArgumentNullException($"Файл '{TemplateParameters.FileName}' не найден"); protected virtual IDictionary ParseRow(IXLRow xlRow) { - var cells = Cells.ToDictionary(x => x.Key, x => + var cells = TemplateParameters.Cells.ToDictionary(x => x.Key, x => { var columnNumber = x.Value.ColumnNumber; var xlCell = xlRow.Cell(columnNumber); @@ -72,7 +67,7 @@ public abstract class ParserExcelService : IParserService x.Key, x => x.Value.ColumnNumber); + var columnsDict = TemplateParameters.Cells.ToDictionary(x => x.Key, x => x.Value.ColumnNumber); var invalidDto = new ValidationResultDto { @@ -84,7 +79,10 @@ public abstract class ParserExcelService : IParserService : IParserService ParseExcelSheet(IXLWorksheet sheet) { - var count = sheet.RowsUsed().Count() - HeaderRowsCount; + var count = sheet.RowsUsed().Count() - TemplateParameters.HeaderRowsCount; if (count <= 0) return new ParserResultDto(); @@ -105,7 +103,7 @@ public abstract class ParserExcelService : IParserService Cells { get; } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanDrillingTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanDrillingTemplate.cs new file mode 100644 index 00000000..dff24dcf --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanDrillingTemplate.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using AsbCloudApp.Data.ProcessMaps; + +namespace AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates; + +public class ProcessMapPlanDrillingTemplate : ITemplateParameters +{ + public string SheetName => "План"; + + public int HeaderRowsCount => 2; + + public string FileName => "ProcessMapPlanDrillingTemplate.xlsx"; + + public IDictionary Cells => new Dictionary + { + { nameof(ProcessMapPlanDrillingDto.Section), new Cell(1, typeof(string)) }, + { nameof(ProcessMapPlanDrillingDto.Mode), new Cell(2, typeof(string)) }, + { nameof(ProcessMapPlanDrillingDto.DepthStart), new Cell(3, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.DepthEnd), new Cell(4, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.DeltaPressurePlan), new Cell(5, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.DeltaPressureLimitMax), new Cell(6, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.AxialLoadPlan), new Cell(7, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.AxialLoadLimitMax), new Cell(8, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.TopDriveTorquePlan), new Cell(9, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.TopDriveTorqueLimitMax), new Cell(10, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.TopDriveSpeedPlan), new Cell(11, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.TopDriveSpeedLimitMax), new Cell(12, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.FlowPlan), new Cell(13, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.FlowLimitMax), new Cell(14, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.RopPlan), new Cell(15, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.UsageSaub), new Cell(16, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.UsageSpin), new Cell(17, typeof(double)) }, + { nameof(ProcessMapPlanDrillingDto.Comment), new Cell(18, typeof(string)) } + }; +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanReamTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanReamTemplate.cs new file mode 100644 index 00000000..5c454d7b --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanReamTemplate.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using AsbCloudApp.Data.ProcessMaps; + +namespace AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates; + +public class ProcessMapPlanReamTemplate : ITemplateParameters +{ + public string SheetName => "План"; + + public int HeaderRowsCount => 1; + + public string FileName => "ProcessMapPlanReamTemplate.xlsx"; + + public IDictionary Cells => new Dictionary + { + { nameof(ProcessMapPlanReamDto.Section), new Cell(1, typeof(string)) }, + { nameof(ProcessMapPlanReamDto.DepthStart), new Cell(2, typeof(double)) }, + { nameof(ProcessMapPlanReamDto.DepthEnd), new Cell(3, typeof(double)) }, + { nameof(ProcessMapPlanReamDto.Repeats), new Cell(4, typeof(double)) }, + { nameof(ProcessMapPlanReamDto.SpinUpward), new Cell(5, typeof(double)) }, + { nameof(ProcessMapPlanReamDto.SpinDownward), new Cell(6, typeof(double)) }, + { nameof(ProcessMapPlanReamDto.SpeedUpward), new Cell(7, typeof(double)) }, + { nameof(ProcessMapPlanReamDto.SpeedDownward), new Cell(8, typeof(double)) }, + { nameof(ProcessMapPlanReamDto.SetpointDrag), new Cell(9, typeof(double)) }, + { nameof(ProcessMapPlanReamDto.SetpointTight), new Cell(10, typeof(double)) }, + { nameof(ProcessMapPlanReamDto.Pressure), new Cell(11, typeof(double)) }, + { nameof(ProcessMapPlanReamDto.Torque), new Cell(12, typeof(double)) }, + }; +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryFactManualTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryFactManualTemplate.cs new file mode 100644 index 00000000..8e604e1e --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryFactManualTemplate.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using AsbCloudApp.Data.Trajectory; + +namespace AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates; + +public class TrajectoryFactManualTemplate : ITemplateParameters +{ + public string SheetName => "Фактическая траектория"; + + public int HeaderRowsCount => 2; + + public string FileName => "TrajectoryFactManualTemplate.xlsx"; + + public IDictionary Cells => new Dictionary + { + { nameof(TrajectoryGeoFactDto.WellboreDepth), new Cell(1, typeof(double)) }, + { nameof(TrajectoryGeoFactDto.ZenithAngle), new Cell(2, typeof(double)) }, + { nameof(TrajectoryGeoFactDto.AzimuthGeo), new Cell(3, typeof(double)) }, + { nameof(TrajectoryGeoFactDto.AzimuthMagnetic), new Cell(4, typeof(double)) }, + { nameof(TrajectoryGeoFactDto.VerticalDepth), new Cell(5, typeof(double)) }, + { nameof(TrajectoryGeoFactDto.Comment), new Cell(6, typeof(string)) } + }; +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryFactNnbTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryFactNnbTemplate.cs new file mode 100644 index 00000000..87489d7c --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryFactNnbTemplate.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using AsbCloudApp.Data.Trajectory; + +namespace AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates; + +public class TrajectoryFactNnbTemplate : ITemplateParameters +{ + public string SheetName => "Фактическая ннб-траектория"; + + public int HeaderRowsCount => 2; + + public string FileName => "TrajectoryFactNnbTemplate.xlsx"; + + public IDictionary Cells => new Dictionary + { + { nameof(TrajectoryGeoFactDto.WellboreDepth), new Cell(1, typeof(double)) }, + { nameof(TrajectoryGeoFactDto.ZenithAngle), new Cell(2, typeof(double)) }, + { nameof(TrajectoryGeoFactDto.AzimuthGeo), new Cell(3, typeof(double)) }, + { nameof(TrajectoryGeoFactDto.AzimuthMagnetic), new Cell(4, typeof(double)) }, + { nameof(TrajectoryGeoFactDto.VerticalDepth), new Cell(5, typeof(double)) }, + { nameof(TrajectoryGeoFactDto.Comment), new Cell(6, typeof(string)) } + }; +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryPlanTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryPlanTemplate.cs new file mode 100644 index 00000000..d98c1d89 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryPlanTemplate.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using AsbCloudApp.Data.Trajectory; + +namespace AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates; + +public class TrajectoryPlanTemplate : ITemplateParameters +{ + public string SheetName => "Плановая траектория"; + public int HeaderRowsCount => 2; + public string FileName => "TrajectoryPlanTemplate.xlsx"; + public IDictionary Cells => new Dictionary + { + { nameof(TrajectoryGeoPlanDto.WellboreDepth), new Cell(1, typeof(double)) }, + { nameof(TrajectoryGeoPlanDto.ZenithAngle), new Cell(2, typeof(double)) }, + { nameof(TrajectoryGeoPlanDto.AzimuthGeo), new Cell(3, typeof(double)) }, + { nameof(TrajectoryGeoPlanDto.AzimuthMagnetic), new Cell(4, typeof(double)) }, + { nameof(TrajectoryGeoPlanDto.VerticalDepth), new Cell(5, typeof(double)) }, + { nameof(TrajectoryGeoPlanDto.Radius), new Cell(6, typeof(double)) }, + { nameof(TrajectoryGeoPlanDto.Comment), new Cell(7, typeof(string)) } + }; +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs new file mode 100644 index 00000000..5b0935d2 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.ProcessMaps; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Requests.ExportOptions; +using AsbCloudApp.Services; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates; + +namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export; + +public class ProcessMapPlanDrillingExportService : ProcessMapPlanExportService +{ + public ProcessMapPlanDrillingExportService( + IChangeLogRepository processMapPlanRepository, + IWellService wellService) + : base(processMapPlanRepository, wellService) + { + } + + protected override ITemplateParameters TemplateParameters => new ProcessMapPlanDrillingTemplate(); + + protected override async Task BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token) + { + var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token); + + return $"{caption}_РТК_План_бурение.xlsx"; + } + + protected override async Task> GetDtosAsync(WellRelatedExportRequest options, + CancellationToken token) + { + var dtos = await base.GetDtosAsync(options, token); + var dtosWithMode = dtos.Select(dto => + { + dto.Mode = dto.IdMode switch + { + 1 => "Ротор", + 2 => "Слайд", + _ => throw new ArgumentOutOfRangeException() + }; + + return dto; + }); + + return dtosWithMode; + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs new file mode 100644 index 00000000..458877d1 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Requests.ExportOptions; +using AsbCloudApp.Services; +using AsbCloudInfrastructure.Services.ExcelServices; + +namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export; + +public abstract class ProcessMapPlanExportService : ExportExcelService + where TDto : ChangeLogAbstract +{ + protected readonly IWellService wellService; + + private readonly IChangeLogRepository processMapPlanRepository; + + protected ProcessMapPlanExportService(IChangeLogRepository processMapPlanRepository, + IWellService wellService) + { + this.processMapPlanRepository = processMapPlanRepository; + this.wellService = wellService; + } + + protected override async Task> GetDtosAsync(WellRelatedExportRequest options, CancellationToken token) + { + var request = new ProcessMapPlanBaseRequestWithWell(options.IdWell); + var dtos = await processMapPlanRepository.Get(request, token); + return dtos; + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs new file mode 100644 index 00000000..c3dc5d69 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs @@ -0,0 +1,30 @@ +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.ProcessMaps; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Requests.ExportOptions; +using AsbCloudApp.Services; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates; + +namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export; + +public class ProcessMapPlanReamExportService : ProcessMapPlanExportService +{ + protected override ITemplateParameters TemplateParameters => new ProcessMapPlanReamTemplate(); + + public ProcessMapPlanReamExportService( + IChangeLogRepository processMapPlanRepository, + IWellService wellService) + : base(processMapPlanRepository, wellService) + { + } + + protected override async Task BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token) + { + var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token); + + return $"{caption}_РТК_План_проработка.xlsx"; + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanDrillingParser.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanDrillingParser.cs index f4e829fc..fccffe3e 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanDrillingParser.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanDrillingParser.cs @@ -2,49 +2,21 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using AsbCloudApp.Data; using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Repositories; -using AsbCloudInfrastructure.Services.Parser; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates; namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Parser; public class ProcessMapPlanDrillingParser : ProcessMapPlanParser { - private readonly IEnumerable sections; - public ProcessMapPlanDrillingParser(IWellOperationRepository wellOperationRepository) + : base(wellOperationRepository) { - sections = wellOperationRepository.GetSectionTypes(); } - - protected override string SheetName => "План"; - protected override string TemplateFileName => "ProcessMapPlanDrillingTemplate.xlsx"; - private const int ColumnSection = 1; - private const int ColumnMode = 2; - - protected override IDictionary Cells => new Dictionary - { - { nameof(ProcessMapPlanDrillingDto.Section), new Cell(ColumnSection, typeof(string)) }, - { nameof(ProcessMapPlanDrillingDto.Mode), new Cell(ColumnMode, typeof(string)) }, - { nameof(ProcessMapPlanDrillingDto.DepthStart), new Cell(3, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.DepthEnd), new Cell(4, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.DeltaPressurePlan), new Cell(5, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.DeltaPressureLimitMax), new Cell(6, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.AxialLoadPlan), new Cell(7, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.AxialLoadLimitMax), new Cell(8, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.TopDriveTorquePlan), new Cell(9, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.TopDriveTorqueLimitMax), new Cell(10, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.TopDriveSpeedPlan), new Cell(11, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.TopDriveSpeedLimitMax), new Cell(12, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.FlowPlan), new Cell(13, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.FlowLimitMax), new Cell(14, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.RopPlan), new Cell(15, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.UsageSaub), new Cell(16, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.UsageSpin), new Cell(17, typeof(double)) }, - { nameof(ProcessMapPlanDrillingDto.Comment), new Cell(18, typeof(string)) } - }; + protected override ITemplateParameters TemplateParameters => new ProcessMapPlanDrillingTemplate(); protected override ProcessMapPlanDrillingDto BuildDto(IDictionary row, int rowNumber) { @@ -55,7 +27,10 @@ public class ProcessMapPlanDrillingParser : ProcessMapPlanParser : ParserExcelService where TDto : ProcessMapPlanBaseDto { - protected override int HeaderRowsCount => 2; - + protected readonly IEnumerable sections; + + protected ProcessMapPlanParser(IWellOperationRepository wellOperationRepository) + { + sections = wellOperationRepository.GetSectionTypes(); + } + public override ParserResultDto Parse(Stream file, WellRelatedParserRequest options) { var result = base.Parse(file, options); diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanReamParser.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanReamParser.cs index 6ca31714..7bfaa880 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanReamParser.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanReamParser.cs @@ -2,42 +2,21 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using AsbCloudApp.Data; using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Repositories; -using AsbCloudInfrastructure.Services.Parser; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates; namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Parser; public class ProcessMapPlanReamParser : ProcessMapPlanParser { - private readonly IEnumerable sections; - public ProcessMapPlanReamParser(IWellOperationRepository wellOperationRepository) + : base(wellOperationRepository) { - sections = wellOperationRepository.GetSectionTypes(); } - - protected override string SheetName => "План"; - protected override string TemplateFileName => "ProcessMapPlanReamTemplate.xlsx"; - private const int ColumnSection = 1; - - protected override IDictionary Cells => new Dictionary - { - { nameof(ProcessMapPlanReamDto.Section), new Cell(ColumnSection, typeof(string)) }, - { nameof(ProcessMapPlanReamDto.DepthStart), new Cell(2, typeof(double)) }, - { nameof(ProcessMapPlanReamDto.DepthEnd), new Cell(3, typeof(double)) }, - { nameof(ProcessMapPlanReamDto.Repeats), new Cell(4, typeof(double)) }, - { nameof(ProcessMapPlanReamDto.SpinUpward), new Cell(5, typeof(double)) }, - { nameof(ProcessMapPlanReamDto.SpinUpward), new Cell(6, typeof(double)) }, - { nameof(ProcessMapPlanReamDto.SpeedDownward), new Cell(7, typeof(double)) }, - { nameof(ProcessMapPlanReamDto.SpeedUpward), new Cell(8, typeof(double)) }, - { nameof(ProcessMapPlanReamDto.SetpointDrag), new Cell(9, typeof(double)) }, - { nameof(ProcessMapPlanReamDto.SetpointTight), new Cell(10, typeof(double)) }, - { nameof(ProcessMapPlanReamDto.Pressure), new Cell(11, typeof(double)) }, - { nameof(ProcessMapPlanReamDto.Torque), new Cell(12, typeof(double)) }, - }; + protected override ITemplateParameters TemplateParameters => new ProcessMapPlanReamTemplate(); protected override ProcessMapPlanReamDto BuildDto(IDictionary row, int rowNumber) { @@ -48,7 +27,9 @@ public class ProcessMapPlanReamParser : ProcessMapPlanParser : ExportExcelService + where TDto : TrajectoryGeoDto { - public abstract class TrajectoryExportService where T : TrajectoryGeoDto - { - private readonly IWellService wellService; + protected readonly IWellService wellService; - private readonly ITrajectoryRepository trajectoryRepository; - public abstract string templateFileName { get; } - public abstract string usingTemplateFile { get; } - public abstract string sheetName { get; } - public abstract int headerRowsCount { get; } + private readonly ITrajectoryRepository trajectoryRepository; - public TrajectoryExportService(IWellService wellService, ITrajectoryRepository trajectoryRepository) - { - this.wellService = wellService; - this.trajectoryRepository = trajectoryRepository; - } + protected TrajectoryExportService(IWellService wellService, ITrajectoryRepository trajectoryRepository) + { + this.wellService = wellService; + this.trajectoryRepository = trajectoryRepository; + } - protected abstract void AddCoordinatesToRow(IXLRow row, T trajectory); - - public async Task ExportAsync(int idWell, CancellationToken token) - { - var trajectorys = await trajectoryRepository.GetAsync(idWell, token); - return MakeExelFileStream(trajectorys); - } - - public async Task GetFileNameAsync(int idWell, CancellationToken token) - { - var caption = await wellService.GetWellCaptionByIdAsync(idWell, token); - return string.Format("{0}_{1}", caption, templateFileName); - } - - public Stream GetTemplateFile() - { - var stream = System.Reflection.Assembly.GetExecutingAssembly() - .GetManifestResourceStream($"{usingTemplateFile}.{templateFileName}"); - if (stream is null) - throw new Exception($"Область {usingTemplateFile} не содержит файла с названием {templateFileName}"); - return stream; - } - - private Stream MakeExelFileStream(IEnumerable trajectories) - { - using Stream ecxelTemplateStream = GetTemplateFile(); - using var workbook = new XLWorkbook(ecxelTemplateStream); - AddTrajecoryToWorkbook(workbook, trajectories); - MemoryStream memoryStream = new MemoryStream(); - workbook.SaveAs(memoryStream, new SaveOptions { }); - memoryStream.Seek(0, SeekOrigin.Begin); - return memoryStream; - } - - private void AddTrajecoryToWorkbook(XLWorkbook workbook, IEnumerable trajectories) - { - if (trajectories.Any()) - { - var sheet = workbook.GetWorksheet(sheetName); - AddTrajecoryToSheet(sheet, trajectories); - } - } - - private void AddTrajecoryToSheet(IXLWorksheet sheet, IEnumerable trajectories) - { - var rowList = trajectories.ToList(); - for (int i = 0; i < rowList.Count; i++) - { - var row = sheet.Row(1 + i + headerRowsCount); - AddCoordinatesToRow(row, rowList[i]); - } - } - } -} + protected override Task> GetDtosAsync(WellRelatedExportRequest options, CancellationToken token) => + trajectoryRepository.GetAsync(options.IdWell, token); +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs index 2662d62a..40b7d1c8 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs @@ -1,35 +1,28 @@ -using AsbCloudApp.Data.Trajectory; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; +using AsbCloudApp.Requests.ExportOptions; using AsbCloudApp.Services; -using ClosedXML.Excel; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates; -namespace AsbCloudInfrastructure.Services.Trajectory.Export +namespace AsbCloudInfrastructure.Services.Trajectory.Export; + +public class TrajectoryFactManualExportService : TrajectoryExportService { + public TrajectoryFactManualExportService(IWellService wellService, + ITrajectoryEditableRepository trajectoryRepository) + : base(wellService, trajectoryRepository) + { + } - public class TrajectoryFactManualExportService : TrajectoryExportService - { - public override string templateFileName { get; } = "TrajectoryFactManualTemplate.xlsx"; - public override string usingTemplateFile { get; } = "AsbCloudInfrastructure.Services.Trajectory.Templates"; - public override string sheetName { get; } = "Фактическая траектория"; - public override int headerRowsCount { get; } = 2; - - public TrajectoryFactManualExportService( - IWellService wellService, - ITrajectoryEditableRepository factTrajectoryService) - : base(wellService, factTrajectoryService) - { - - } - - protected override void AddCoordinatesToRow(IXLRow row, TrajectoryGeoFactDto trajectory) - { - row.Cell(1).SetCellValue(trajectory.WellboreDepth); - row.Cell(2).SetCellValue(trajectory.ZenithAngle); - row.Cell(3).SetCellValue(trajectory.AzimuthGeo); - row.Cell(4).SetCellValue(trajectory.AzimuthMagnetic); - row.Cell(5).SetCellValue(trajectory.VerticalDepth); - row.Cell(6).SetCellValue(trajectory.Comment); - } - } -} + protected override ITemplateParameters TemplateParameters => new TrajectoryFactManualTemplate(); + + protected override async Task BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token) + { + var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token); + return $"{caption}_Фактическая_траектория.xlsx"; + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs index c32e6cff..3b3206f5 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs @@ -1,35 +1,28 @@ -using AsbCloudApp.Data.Trajectory; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; +using AsbCloudApp.Requests.ExportOptions; using AsbCloudApp.Services; -using ClosedXML.Excel; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates; -namespace AsbCloudInfrastructure.Services.Trajectory.Export +namespace AsbCloudInfrastructure.Services.Trajectory.Export; + +public class TrajectoryFactNnbExportService : TrajectoryExportService { + public TrajectoryFactNnbExportService(IWellService wellService, + ITrajectoryNnbRepository trajectoryRepository) + : base(wellService, trajectoryRepository) + { + } - public class TrajectoryFactNnbExportService : TrajectoryExportService - { - public override string templateFileName { get; } = "TrajectoryFactNnbTemplate.xlsx"; - public override string usingTemplateFile { get; } = "AsbCloudInfrastructure.Services.Trajectory.Templates"; - public override string sheetName { get; } = "Фактическая ннб-траектория"; - public override int headerRowsCount { get; } = 2; + protected override ITemplateParameters TemplateParameters => new TrajectoryFactNnbTemplate(); - public TrajectoryFactNnbExportService( - IWellService wellService, - ITrajectoryNnbRepository nnbTrajectoryService) - : base(wellService, nnbTrajectoryService) - { - - } - - protected override void AddCoordinatesToRow(IXLRow row, TrajectoryGeoFactDto trajectory) - { - row.Cell(1).SetCellValue(trajectory.WellboreDepth); - row.Cell(2).SetCellValue(trajectory.ZenithAngle); - row.Cell(3).SetCellValue(trajectory.AzimuthGeo); - row.Cell(4).SetCellValue(trajectory.AzimuthMagnetic); - row.Cell(5).SetCellValue(trajectory.VerticalDepth); - row.Cell(6).SetCellValue(trajectory.Comment); - } - } -} + protected override async Task BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token) + { + var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token); + return $"{caption}_Траектория_ННБ.xlsx"; + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryPlanExportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryPlanExportService.cs index 403ceccc..37bce068 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryPlanExportService.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryPlanExportService.cs @@ -1,38 +1,28 @@ -using AsbCloudApp.Data.Trajectory; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; +using AsbCloudApp.Requests.ExportOptions; using AsbCloudApp.Services; -using ClosedXML.Excel; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates; -namespace AsbCloudInfrastructure.Services.Trajectory.Export +namespace AsbCloudInfrastructure.Services.Trajectory.Export; + +public class TrajectoryPlanExportService : TrajectoryExportService { - public class TrajectoryPlanExportService : TrajectoryExportService - { - /* - * password for PlannedTrajectoryTemplate.xlsx is Drill2022 - */ - public override string templateFileName { get; } = "TrajectoryPlanTemplate.xlsx"; - public override string usingTemplateFile { get; } = "AsbCloudInfrastructure.Services.Trajectory.Templates"; - public override string sheetName { get; } = "Плановая траектория"; - public override int headerRowsCount { get; } = 2; + public TrajectoryPlanExportService(IWellService wellService, + ITrajectoryEditableRepository trajectoryRepository) + : base(wellService, trajectoryRepository) + { + } - public TrajectoryPlanExportService( - IWellService wellService, - ITrajectoryEditableRepository trajectoryPlanService) - : base(wellService, trajectoryPlanService) - { - } + protected override ITemplateParameters TemplateParameters => new TrajectoryPlanTemplate(); - protected override void AddCoordinatesToRow(IXLRow row, TrajectoryGeoPlanDto trajectory) - { - row.Cell(1).SetCellValue(trajectory.WellboreDepth); - row.Cell(2).SetCellValue(trajectory.ZenithAngle); - row.Cell(3).SetCellValue(trajectory.AzimuthGeo); - row.Cell(4).SetCellValue(trajectory.AzimuthMagnetic); - row.Cell(5).SetCellValue(trajectory.VerticalDepth); - row.Cell(6).SetCellValue(trajectory.Radius); - row.Cell(7).SetCellValue(trajectory.Comment); - } - } - -} + protected override async Task BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token) + { + var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token); + return $"{caption}_Плановая_Траектория.xlsx"; + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryFactManualParser.cs b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryFactManualParser.cs index cf4b7118..19b2ebed 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryFactManualParser.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryFactManualParser.cs @@ -1,22 +1,10 @@ -using System.Collections.Generic; -using AsbCloudApp.Data.Trajectory; -using AsbCloudInfrastructure.Services.Parser; +using AsbCloudApp.Data.Trajectory; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates; namespace AsbCloudInfrastructure.Services.Trajectory.Parser; public class TrajectoryFactManualParser : TrajectoryParser { - protected override string SheetName => "Фактическая траектория"; - - protected override string TemplateFileName => "TrajectoryFactManualTemplate.xlsx"; - - protected override IDictionary Cells => new Dictionary - { - { nameof(TrajectoryGeoFactDto.WellboreDepth), new Cell(1, typeof(double)) }, - { nameof(TrajectoryGeoFactDto.ZenithAngle), new Cell(2, typeof(double)) }, - { nameof(TrajectoryGeoFactDto.AzimuthGeo), new Cell(3, typeof(double)) }, - { nameof(TrajectoryGeoFactDto.AzimuthMagnetic), new Cell(4, typeof(double)) }, - { nameof(TrajectoryGeoFactDto.VerticalDepth), new Cell(5, typeof(double)) }, - { nameof(TrajectoryGeoFactDto.Comment), new Cell(6, typeof(string)) } - }; + protected override ITemplateParameters TemplateParameters => new TrajectoryFactManualTemplate(); } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryParser.cs b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryParser.cs index ce579fa6..f2aca93d 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryParser.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryParser.cs @@ -2,15 +2,13 @@ using System.IO; using AsbCloudApp.Data; using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Requests.ParserOptions; -using AsbCloudInfrastructure.Services.Parser; +using AsbCloudInfrastructure.Services.ExcelServices; namespace AsbCloudInfrastructure.Services.Trajectory.Parser; public abstract class TrajectoryParser : ParserExcelService where TDto : TrajectoryGeoDto { - protected override int HeaderRowsCount => 2; - public override ParserResultDto Parse(Stream file, WellRelatedParserRequest options) { var result = base.Parse(file, options); diff --git a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryPlanParser.cs b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryPlanParser.cs index 568bfa35..d99f0b9f 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryPlanParser.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryPlanParser.cs @@ -1,23 +1,10 @@ -using System.Collections.Generic; -using AsbCloudApp.Data.Trajectory; -using AsbCloudInfrastructure.Services.Parser; +using AsbCloudApp.Data.Trajectory; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates; namespace AsbCloudInfrastructure.Services.Trajectory.Parser; public class TrajectoryPlanParser : TrajectoryParser { - protected override string SheetName => "Плановая траектория"; - - protected override string TemplateFileName => "TrajectoryPlanTemplate.xlsx"; - - protected override IDictionary Cells => new Dictionary - { - { nameof(TrajectoryGeoPlanDto.WellboreDepth), new Cell(1, typeof(double)) }, - { nameof(TrajectoryGeoPlanDto.ZenithAngle), new Cell(2, typeof(double)) }, - { nameof(TrajectoryGeoPlanDto.AzimuthGeo), new Cell(3, typeof(double)) }, - { nameof(TrajectoryGeoPlanDto.AzimuthMagnetic), new Cell(4, typeof(double)) }, - { nameof(TrajectoryGeoPlanDto.VerticalDepth), new Cell(5, typeof(double)) }, - { nameof(TrajectoryGeoPlanDto.Radius), new Cell(6, typeof(double)) }, - { nameof(TrajectoryGeoPlanDto.Comment), new Cell(7, typeof(string)) } - }; + protected override ITemplateParameters TemplateParameters => new TrajectoryPlanTemplate(); } \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs index 6f21bd0b..8efca7be 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs @@ -31,7 +31,6 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest DepthEnd = 1.5, IdMode = 1, - Mode = "Ротор", AxialLoadPlan = 2.718281, AxialLoadLimitMax = 3.1415926, DeltaPressurePlan = 4, @@ -117,7 +116,6 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest nameof(ProcessMapPlanDrillingDto.IdState), nameof(ProcessMapPlanDrillingDto.Author), nameof(ProcessMapPlanDrillingDto.Creation), - nameof(ProcessMapPlanDrillingDto.Mode), nameof(ProcessMapPlanDrillingDto.Section) }; MatchHelper.Match(expected, actual, excludeProps); diff --git a/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs b/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs index 79b63ac6..34d2077c 100644 --- a/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs +++ b/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs @@ -6,12 +6,15 @@ using NSubstitute; using System; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Requests.ExportOptions; using Xunit; namespace AsbCloudWebApi.Tests.Services.Trajectory { public class TrajectoryExportTest { + private const int idWell = 4; + private IWellService wellService; private readonly ITrajectoryEditableRepository trajectoryPlanRepository; private readonly TrajectoryPlanExportService trajectoryPlanExportService; @@ -22,8 +25,6 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory private readonly ITrajectoryNnbRepository trajectoryFactNnbRepository; private readonly TrajectoryFactNnbExportService trajectoryFactNnbExportService; - private readonly int idWell = 4; - private readonly TrajectoryGeoPlanDto[] trajectoryPlanRows = new TrajectoryGeoPlanDto[2] { new TrajectoryGeoPlanDto() { Id = 1, @@ -80,6 +81,8 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory }, }; + private readonly WellRelatedExportRequest exportOptions = new(idWell); + public TrajectoryExportTest() { wellService = Substitute.For(); @@ -98,10 +101,9 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory { trajectoryPlanRepository.GetAsync(idWell, CancellationToken.None) .Returns(trajectoryPlanRows); - - var stream = await trajectoryPlanExportService.ExportAsync(idWell, CancellationToken.None); - Assert.True(stream.Length > 0); - + + var stream = await trajectoryPlanExportService.ExportAsync(exportOptions, CancellationToken.None); + Assert.True(stream.File.Length > 0); } [Fact] @@ -109,9 +111,9 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory { trajectoryFactManualReposirory.GetAsync(idWell, CancellationToken.None) .Returns(trajectoryFactRows); - - var stream = await trajectoryFactManualExportService.ExportAsync(idWell, CancellationToken.None); - Assert.True(stream.Length > 0); + + var stream = await trajectoryFactManualExportService.ExportAsync(exportOptions, CancellationToken.None); + Assert.True(stream.File.Length > 0); } [Fact] @@ -119,9 +121,9 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory { trajectoryFactNnbRepository.GetAsync(idWell, CancellationToken.None) .Returns(trajectoryFactRows); - - var stream = await trajectoryFactNnbExportService.ExportAsync(idWell, CancellationToken.None); - Assert.True(stream.Length > 0); + + var stream = await trajectoryFactNnbExportService.ExportAsync(exportOptions, CancellationToken.None); + Assert.True(stream.File.Length > 0); } } } diff --git a/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryParserTest.cs b/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryParserTest.cs index 8b9bd3e9..1acd0ad7 100644 --- a/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryParserTest.cs +++ b/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryParserTest.cs @@ -1,7 +1,6 @@ using System.Linq; using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Requests.ParserOptions; -using AsbCloudInfrastructure.Services.Parser; using AsbCloudInfrastructure.Services.Trajectory.Parser; using Xunit; diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index 49513f2c..a7d1763e 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -13,9 +13,9 @@ using AsbCloudApp.Services; using System.Linq; using AsbCloudApp.Data; using AsbCloudApp.Requests.ParserOptions; -using AsbCloudInfrastructure.Services.Parser; using AsbCloudApp.Data.ProcessMaps; using System.ComponentModel.DataAnnotations; +using AsbCloudApp.Requests.ExportOptions; namespace AsbCloudWebApi.Controllers.ProcessMaps; @@ -30,15 +30,18 @@ public abstract class ProcessMapPlanBaseController : ControllerBase { private readonly IChangeLogRepository repository; private readonly IWellService wellService; - private readonly ParserExcelService parserService; + private readonly IParserService parserService; + private readonly IExportService processMapPlanExportService; protected ProcessMapPlanBaseController(IChangeLogRepository repository, IWellService wellService, - ParserExcelService parserService) + IParserService parserService, + IExportService processMapPlanExportService) { this.repository = repository; this.wellService = wellService; this.parserService = parserService; + this.processMapPlanExportService = processMapPlanExportService; } protected abstract string TemplateFileName { get; } @@ -266,6 +269,22 @@ public abstract class ProcessMapPlanBaseController : ControllerBase throw new ForbidException("Нет доступа к скважине"); return idUser; } + + /// + /// Формируем excel файл с текущими строками РТК + /// + /// id скважины + /// + /// Запрашиваемый файл + [HttpGet("export")] + [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK, "application/octet-stream")] + [ProducesResponseType(StatusCodes.Status204NoContent)] + public async Task ExportAsync([FromRoute] int idWell, CancellationToken token) + { + var exportOptions = new WellRelatedExportRequest(idWell); + var (fileName, file) = await processMapPlanExportService.ExportAsync(exportOptions, token); + return File(file, "application/octet-stream", fileName); + } /// /// returns user id or throw diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs index 5c038496..241be301 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs @@ -2,6 +2,7 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; +using AsbCloudInfrastructure.Services.ProcessMapPlan.Export; using AsbCloudInfrastructure.Services.ProcessMapPlan.Parser; namespace AsbCloudWebApi.Controllers.ProcessMaps; @@ -13,8 +14,9 @@ public class ProcessMapPlanDrillingController : ProcessMapPlanBaseController repository, IWellService wellService, - ProcessMapPlanDrillingParser parserService) - : base(repository, wellService, parserService) + ProcessMapPlanDrillingParser parserService, + ProcessMapPlanDrillingExportService processMapPlanExportService) + : base(repository, wellService, parserService, processMapPlanExportService) { } diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs index b785d480..9c103f06 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs @@ -2,6 +2,7 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; +using AsbCloudInfrastructure.Services.ProcessMapPlan.Export; using AsbCloudInfrastructure.Services.ProcessMapPlan.Parser; namespace AsbCloudWebApi.Controllers.ProcessMaps; @@ -13,8 +14,9 @@ public class ProcessMapPlanReamController : ProcessMapPlanBaseController repository, IWellService wellService, - ProcessMapPlanReamParser parserService) - : base(repository, wellService, parserService) + ProcessMapPlanReamParser parserService, + ProcessMapPlanReamExportService processMapPlanExportService) + : base(repository, wellService, parserService, processMapPlanExportService) { } diff --git a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryController.cs b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryController.cs index 789b9252..a4521ef8 100644 --- a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryController.cs +++ b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryController.cs @@ -1,14 +1,14 @@ using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; -using AsbCloudApp.Requests; using AsbCloudApp.Services; -using AsbCloudInfrastructure.Services.Trajectory.Export; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Requests.ExportOptions; +using AsbCloudInfrastructure.Services.Trajectory.Export; namespace AsbCloudWebApi.Controllers.Trajectory { @@ -21,13 +21,13 @@ namespace AsbCloudWebApi.Controllers.Trajectory public abstract class TrajectoryController : ControllerBase where TDto : TrajectoryGeoDto { - protected abstract string fileName { get; } + protected abstract string TemplateFileName { get; } private readonly IWellService wellService; private readonly TrajectoryExportService trajectoryExportService; private readonly ITrajectoryRepository trajectoryRepository; - public TrajectoryController(IWellService wellService, + protected TrajectoryController(IWellService wellService, TrajectoryExportService trajectoryExportService, ITrajectoryRepository trajectoryRepository) { @@ -50,9 +50,10 @@ namespace AsbCloudWebApi.Controllers.Trajectory if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - var stream = await trajectoryExportService.ExportAsync(idWell, token); - var fileName = await trajectoryExportService.GetFileNameAsync(idWell, token); - return File(stream, "application/octet-stream", fileName); + + var exportOptions = new WellRelatedExportRequest(idWell); + var (fileName, file) = await trajectoryExportService.ExportAsync(exportOptions, token); + return File(file, "application/octet-stream", fileName); } /// diff --git a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs index 814bcdcf..56a08c1e 100644 --- a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs +++ b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs @@ -1,8 +1,6 @@ -using System; -using AsbCloudApp.Data.Trajectory; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; using AsbCloudApp.Services; -using AsbCloudInfrastructure.Services.Trajectory.Export; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -12,8 +10,7 @@ using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data; using AsbCloudApp.Requests.ParserOptions; -using AsbCloudInfrastructure.Services.Parser; -using AsbCloudInfrastructure.Services.Trajectory.Parser; +using AsbCloudInfrastructure.Services.Trajectory.Export; namespace AsbCloudWebApi.Controllers.Trajectory { @@ -26,11 +23,11 @@ namespace AsbCloudWebApi.Controllers.Trajectory public abstract class TrajectoryEditableController : TrajectoryController where TDto : TrajectoryGeoDto { - private readonly TrajectoryParser parserService; + private readonly IParserService parserService; private readonly ITrajectoryEditableRepository trajectoryRepository; protected TrajectoryEditableController(IWellService wellService, - TrajectoryParser parserService, + IParserService parserService, TrajectoryExportService trajectoryExportService, ITrajectoryEditableRepository trajectoryRepository) : base(wellService, trajectoryExportService, trajectoryRepository) @@ -50,7 +47,7 @@ namespace AsbCloudWebApi.Controllers.Trajectory public IActionResult GetTemplate() { var stream = parserService.GetTemplateFile(); - return File(stream, "application/octet-stream", fileName); + return File(stream, "application/octet-stream", TemplateFileName); } /// diff --git a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactManualController.cs b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactManualController.cs index aa1a60dc..d0bd33b5 100644 --- a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactManualController.cs +++ b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactManualController.cs @@ -14,7 +14,7 @@ namespace AsbCloudWebApi.Controllers.Trajectory; [Route("api/well/{idWell}/[controller]")] public class TrajectoryFactManualController : TrajectoryEditableController { - protected override string fileName => "ЕЦП_шаблон_файла_фактическая_траектория.xlsx"; + protected override string TemplateFileName => "ЕЦП_шаблон_файла_фактическая_траектория.xlsx"; public TrajectoryFactManualController(IWellService wellService, TrajectoryFactManualExportService trajectoryExportService, diff --git a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactNnbController.cs b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactNnbController.cs index 4e2b4661..6dd84898 100644 --- a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactNnbController.cs +++ b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactNnbController.cs @@ -15,7 +15,7 @@ namespace AsbCloudWebApi.Controllers.Trajectory; [Route("api/well/{idWell}/[controller]")] public class TrajectoryFactNnbController : TrajectoryController { - protected override string fileName => "ЕЦП_шаблон_файла_фактическая_ннб_траектория.xlsx"; + protected override string TemplateFileName => "ЕЦП_шаблон_файла_фактическая_ннб_траектория.xlsx"; public TrajectoryFactNnbController( ITrajectoryNnbRepository trajectoryNnbRepository, TrajectoryFactNnbExportService trajectoryExportService, diff --git a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryPlanController.cs b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryPlanController.cs index bffd7d15..67a54007 100644 --- a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryPlanController.cs +++ b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryPlanController.cs @@ -20,7 +20,7 @@ namespace AsbCloudWebApi.Controllers.Trajectory { private readonly TrajectoryService trajectoryVisualizationService; - protected override string fileName => "ЕЦП_шаблон_файла_плановая_траектория.xlsx"; + protected override string TemplateFileName => "ЕЦП_шаблон_файла_плановая_траектория.xlsx"; public TrajectoryPlanController(IWellService wellService, TrajectoryPlanParser parserService, diff --git a/AsbCloudWebApi/Extensions.cs b/AsbCloudWebApi/Extensions.cs index 26cea7ba..a19dcc6e 100644 --- a/AsbCloudWebApi/Extensions.cs +++ b/AsbCloudWebApi/Extensions.cs @@ -7,10 +7,7 @@ using System.IO; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Security.Claims; -using AsbCloudApp.Data; using AsbCloudApp.Exceptions; -using AsbCloudApp.Requests.ParserOptions; -using AsbCloudInfrastructure.Services.Parser; using Microsoft.AspNetCore.Http; namespace Microsoft.AspNetCore.Mvc;