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();
}
///