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 00000000..52e91ccc Binary files /dev/null and b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportTemplate.xlsx differ diff --git a/AsbCloudWebApi/Controllers/ProcessMapController.cs b/AsbCloudWebApi/Controllers/ProcessMapController.cs index a547fae4..02f83516 100644 --- a/AsbCloudWebApi/Controllers/ProcessMapController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMapController.cs @@ -20,12 +20,14 @@ namespace AsbCloudWebApi.Controllers public class ProcessMapController : CrudWellRelatedController { 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(); } ///