From e9bd1e478941818293f4b0662db2ef216d7801a6 Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Wed, 14 Dec 2022 08:41:19 +0500 Subject: [PATCH] #7987467 report --- .../Services/IProcessMapReportService.cs | 20 +++++++ .../AsbCloudInfrastructure.csproj | 2 + AsbCloudInfrastructure/DependencyInjection.cs | 2 + .../ProcessMap/ProcessMapReportService.cs | 55 ++++++++++++++++++ .../ProcessMap/ProcessMapReportTemplate.xlsx | Bin 0 -> 9885 bytes .../Controllers/ProcessMapController.cs | 24 ++++++-- 6 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 AsbCloudApp/Services/IProcessMapReportService.cs create mode 100644 AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs create mode 100644 AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportTemplate.xlsx diff --git a/AsbCloudApp/Services/IProcessMapReportService.cs b/AsbCloudApp/Services/IProcessMapReportService.cs new file mode 100644 index 00000000..a4bf783b --- /dev/null +++ b/AsbCloudApp/Services/IProcessMapReportService.cs @@ -0,0 +1,20 @@ +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services +{ + /// + /// Сервис формирования РТК. + /// + public interface IProcessMapReportService + { + /// + /// Сформировать. + /// + /// + /// + /// + Task MakeReportAsync(int idWell, CancellationToken token = default); + } +} diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index 622173cc..4b79f7df 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -12,6 +12,7 @@ + @@ -28,6 +29,7 @@ + diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 34311da8..905dbb0e 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -12,6 +12,7 @@ using AsbCloudInfrastructure.Services; using AsbCloudInfrastructure.Services.DailyReport; using AsbCloudInfrastructure.Services.DetectOperations; using AsbCloudInfrastructure.Services.DrillingProgram; +using AsbCloudInfrastructure.Services.ProcessMap; using AsbCloudInfrastructure.Services.SAUB; using AsbCloudInfrastructure.Services.Subsystems; using AsbCloudInfrastructure.Services.WellOperationService; @@ -134,6 +135,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); // admin crud services: services.AddTransient, CrudCacheRepositoryBase>(s => diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs new file mode 100644 index 00000000..4f371642 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs @@ -0,0 +1,55 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using ClosedXML.Excel; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services.ProcessMap +{ + public class ProcessMapReportService : IProcessMapReportService + { + private readonly IAsbCloudDbContext context; + private readonly IProcessMapRepository processMapRepository; + + public ProcessMapReportService(IAsbCloudDbContext context, IProcessMapRepository processMapRepository) + { + this.context = context; + this.processMapRepository = processMapRepository; + } + + public async Task MakeReportAsync(int idWell, CancellationToken token) + { + var dtos = (await processMapRepository.GetByIdWellAsync(idWell, token)) + .GroupBy(x => x.IdWellSectionType); + var stream = GetExcelTemplateStream(); + using var workbook = new XLWorkbook(stream, XLEventTracking.Disabled); + + FillProcessMapToWorkbook(workbook, dtos); + + MemoryStream memoryStream = new MemoryStream(); + workbook.SaveAs(memoryStream, new SaveOptions { }); + memoryStream.Seek(0, SeekOrigin.Begin); + return memoryStream; + } + + private static void FillProcessMapToWorkbook(XLWorkbook workbook, IEnumerable> dto) + { + var sheet = workbook.Worksheets.FirstOrDefault(); + if (sheet is null) + return; + + + } + + private Stream GetExcelTemplateStream() + { + var stream = System.Reflection.Assembly.GetExecutingAssembly() + .GetManifestResourceStream("AsbCloudInfrastructure.Services.ProcessMap.ProcessMapReportTemplate.xlsx"); + return stream; + } + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportTemplate.xlsx b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..52e91ccc430913b57a85bdb42eaadb9bfa7227d4 GIT binary patch literal 9885 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 q0N@`k@>lrZ4b5NStJHsi|890v6_8-N3jm { private readonly ITelemetryService telemetryService; + private readonly IProcessMapReportService processMapReportService; - public ProcessMapController(IWellService wellService, IProcessMapRepository service, + public ProcessMapController(IWellService wellService, IProcessMapRepository repository, IProcessMapReportService processMapReportService, ITelemetryService telemetryService) - : base(wellService, service) + : base(wellService, repository) { this.telemetryService = telemetryService; + this.processMapReportService = processMapReportService; } /// @@ -77,14 +79,28 @@ namespace AsbCloudWebApi.Controllers /// Выгрузка расширенной РТК /// /// + /// /// /// /// [HttpGet] [Route("getReportFile/{wellId}")] [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)] - public Task GetReportFileAsync(int wellId) + public async Task GetReportFileAsync(int wellId, CancellationToken token) { - throw new NotImplementedException(); + var stream = await processMapReportService.MakeReportAsync(wellId, token); + if (stream != null) + { + var well = await wellService.GetOrDefaultAsync(wellId, token); + if (well is null) + return NoContent(); + else + { + var fileName = $"РТК по скважине {well.Caption} куст {well.Cluster}.xlsx"; + return File(stream, "application/octet-stream", fileName); + } + } + else + return NoContent(); } ///