diff --git a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanDrillingDto.cs b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanDrillingDto.cs index 67d6c74b..78567c2d 100644 --- a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanDrillingDto.cs +++ b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanDrillingDto.cs @@ -1,4 +1,5 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; namespace AsbCloudApp.Data.ProcessMaps; @@ -16,7 +17,12 @@ public class ProcessMapPlanDrillingDto : ProcessMapPlanBaseDto /// /// Название режима бурения /// - public string? Mode { get; set; } + public string Mode => IdMode switch + { + 1 => "Ротор", + 2 => "Слайд", + _ => throw new ArgumentOutOfRangeException() + }; /// /// Осевая нагрузка, т план diff --git a/AsbCloudApp/Services/IProcessMapPlanExportService.cs b/AsbCloudApp/Services/IProcessMapPlanExportService.cs new file mode 100644 index 00000000..6c226a55 --- /dev/null +++ b/AsbCloudApp/Services/IProcessMapPlanExportService.cs @@ -0,0 +1,19 @@ +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services; + +/// +/// Экспорт РТК +/// +public interface IProcessMapPlanExportService +{ + /// + /// Экспортировать РТК по скважине + /// + /// + /// + /// + Task<(string FileName, Stream File)> ExportAsync(int idWell, CancellationToken token); +} \ No newline at end of file diff --git a/AsbCloudApp/Services/ITrajectoryExportService.cs b/AsbCloudApp/Services/ITrajectoryExportService.cs new file mode 100644 index 00000000..610ccf9f --- /dev/null +++ b/AsbCloudApp/Services/ITrajectoryExportService.cs @@ -0,0 +1,19 @@ +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services; + +/// +/// Экспорт траекторий +/// +public interface ITrajectoryExportService +{ + /// + /// Экспортировать траектории по скважине + /// + /// + /// + /// + Task<(string FileName, Stream File)> ExportAsync(int idWell, CancellationToken token); +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 2111356b..b1e9f17e 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(); @@ -294,7 +292,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/ExcelServices/ExportExcelService.cs b/AsbCloudInfrastructure/Services/ExcelServices/ExportExcelService.cs new file mode 100644 index 00000000..9e189411 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/ExportExcelService.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using ClosedXML.Excel; +using Mapster; + +namespace AsbCloudInfrastructure.Services.ExcelServices; + +public abstract class ExportExcelService +{ + protected abstract ITemplateParameters TemplateParameters { get; } + + protected Stream Export(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/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanReamTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanReamTemplate.cs index 4df80a7e..5c454d7b 100644 --- a/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanReamTemplate.cs +++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanReamTemplate.cs @@ -7,7 +7,7 @@ public class ProcessMapPlanReamTemplate : ITemplateParameters { public string SheetName => "План"; - public int HeaderRowsCount => 2; + public int HeaderRowsCount => 1; public string FileName => "ProcessMapPlanReamTemplate.xlsx"; diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs new file mode 100644 index 00000000..671a34ee --- /dev/null +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs @@ -0,0 +1,29 @@ +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.ProcessMaps; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +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(int idWell, CancellationToken token) + { + var caption = await wellService.GetWellCaptionByIdAsync(idWell, token); + + return $"{caption}_РТК_План_бурение.xlsx"; + } +} \ 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..60491ca8 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs @@ -0,0 +1,38 @@ +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using AsbCloudInfrastructure.Services.ExcelServices; + +namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export; + +public abstract class ProcessMapPlanExportService : ExportExcelService, + IProcessMapPlanExportService + where TDto : ChangeLogAbstract +{ + protected readonly IWellService wellService; + + private readonly IChangeLogRepository processMapPlanRepository; + + protected ProcessMapPlanExportService(IChangeLogRepository processMapPlanRepository, + IWellService wellService) + { + this.processMapPlanRepository = processMapPlanRepository; + this.wellService = wellService; + } + + public async Task<(string FileName, Stream File)> ExportAsync(int idWell, CancellationToken token) + { + var request = new ProcessMapPlanBaseRequestWithWell(idWell); + var dtos = await processMapPlanRepository.Get(request, token); + + var fileName = await BuildFileNameAsync(idWell, token); + var file = Export(dtos); + return (fileName, file); + } + + protected abstract Task BuildFileNameAsync(int idWell, CancellationToken token); +} \ 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..b2452172 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs @@ -0,0 +1,29 @@ +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.ProcessMaps; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +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(int idWell, CancellationToken token) + { + var caption = await wellService.GetWellCaptionByIdAsync(idWell, token); + + return $"{caption}_РТК_План_проработка.xlsx"; + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryExportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryExportService.cs index 6ac2bf15..489b15f4 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryExportService.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryExportService.cs @@ -1,83 +1,35 @@ using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; using AsbCloudApp.Services; -using ClosedXML.Excel; -using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudInfrastructure.Services.ExcelServices; -namespace AsbCloudInfrastructure.Services.Trajectory.Export +namespace AsbCloudInfrastructure.Services.Trajectory.Export; + +public abstract class TrajectoryExportService : ExportExcelService, + ITrajectoryExportService + 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<(string FileName, Stream File)> ExportAsync(int idWell, CancellationToken token) + { + var dtos = await trajectoryRepository.GetAsync(idWell, token); - public async Task ExportAsync(int idWell, CancellationToken token) - { - var trajectorys = await trajectoryRepository.GetAsync(idWell, token); - return MakeExelFileStream(trajectorys); - } + var fileName = await BuildFileNameAsync(idWell, token); + var file = Export(dtos); + return (fileName, file); + } - 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 abstract Task BuildFileNameAsync(int idWell, CancellationToken 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..f1ccbc89 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs @@ -1,35 +1,27 @@ -using AsbCloudApp.Data.Trajectory; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; 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; + protected override ITemplateParameters TemplateParameters => new TrajectoryFactManualTemplate(); - 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 async Task BuildFileNameAsync(int idWell, CancellationToken token) + { + var caption = await wellService.GetWellCaptionByIdAsync(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..2bab0783 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs @@ -1,35 +1,27 @@ -using AsbCloudApp.Data.Trajectory; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; 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(int idWell, CancellationToken token) + { + var caption = await wellService.GetWellCaptionByIdAsync(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..5a931939 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryPlanExportService.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryPlanExportService.cs @@ -1,38 +1,27 @@ -using AsbCloudApp.Data.Trajectory; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; 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 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 ITemplateParameters TemplateParameters => new TrajectoryPlanTemplate(); + + protected override async Task BuildFileNameAsync(int idWell, CancellationToken token) + { + var caption = await wellService.GetWellCaptionByIdAsync(idWell, token); + return $"{caption}_Плановая_Траектория.xlsx"; + } +} \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs index 3a5815e9..40a0c3c1 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs @@ -29,7 +29,6 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest DepthEnd = 1.5, IdMode = 1, - Mode = "Ротор", AxialLoadPlan = 2.718281, AxialLoadLimitMax = 3.1415926, DeltaPressurePlan = 4, @@ -115,7 +114,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..1c026185 100644 --- a/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs +++ b/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs @@ -100,7 +100,7 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory .Returns(trajectoryPlanRows); var stream = await trajectoryPlanExportService.ExportAsync(idWell, CancellationToken.None); - Assert.True(stream.Length > 0); + Assert.True(stream.File.Length > 0); } @@ -111,7 +111,7 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory .Returns(trajectoryFactRows); var stream = await trajectoryFactManualExportService.ExportAsync(idWell, CancellationToken.None); - Assert.True(stream.Length > 0); + Assert.True(stream.File.Length > 0); } [Fact] @@ -121,7 +121,7 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory .Returns(trajectoryFactRows); var stream = await trajectoryFactNnbExportService.ExportAsync(idWell, CancellationToken.None); - Assert.True(stream.Length > 0); + Assert.True(stream.File.Length > 0); } } } diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index 49513f2c..c3afebb3 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -13,7 +13,6 @@ 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; @@ -30,15 +29,18 @@ public abstract class ProcessMapPlanBaseController : ControllerBase { private readonly IChangeLogRepository repository; private readonly IWellService wellService; - private readonly ParserExcelService parserService; + private readonly IParserService parserService; + private readonly IProcessMapPlanExportService processMapPlanExportService; protected ProcessMapPlanBaseController(IChangeLogRepository repository, IWellService wellService, - ParserExcelService parserService) + IParserService parserService, + IProcessMapPlanExportService processMapPlanExportService) { this.repository = repository; this.wellService = wellService; this.parserService = parserService; + this.processMapPlanExportService = processMapPlanExportService; } protected abstract string TemplateFileName { get; } @@ -266,6 +268,21 @@ 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 (fileName, file) = await processMapPlanExportService.ExportAsync(idWell, 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..6311d34a 100644 --- a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryController.cs +++ b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryController.cs @@ -1,8 +1,6 @@ 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; @@ -21,14 +19,14 @@ 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 ITrajectoryExportService trajectoryExportService; private readonly ITrajectoryRepository trajectoryRepository; - public TrajectoryController(IWellService wellService, - TrajectoryExportService trajectoryExportService, + protected TrajectoryController(IWellService wellService, + ITrajectoryExportService trajectoryExportService, ITrajectoryRepository trajectoryRepository) { this.trajectoryExportService = trajectoryExportService; @@ -50,9 +48,9 @@ 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 (fileName, file) = await trajectoryExportService.ExportAsync(idWell, token); + return File(file, "application/octet-stream", fileName); } /// diff --git a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs index 814bcdcf..a014e1bc 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,6 @@ using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data; using AsbCloudApp.Requests.ParserOptions; -using AsbCloudInfrastructure.Services.Parser; -using AsbCloudInfrastructure.Services.Trajectory.Parser; namespace AsbCloudWebApi.Controllers.Trajectory { @@ -26,12 +22,12 @@ 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, - TrajectoryExportService trajectoryExportService, + IParserService parserService, + ITrajectoryExportService trajectoryExportService, ITrajectoryEditableRepository trajectoryRepository) : base(wellService, trajectoryExportService, trajectoryRepository) { @@ -50,7 +46,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;