using AsbCloudApp.Services; using AsbCloudApp.Data; using AsbCloudDb.Model; using System; using System.Collections.Generic; using System.Linq; using System.IO; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using AsbSaubReport; namespace AsbCloudInfrastructure.Services { public class ReportService : IReportService { private readonly IAsbCloudDbContext db; private readonly IConfiguration configuration; private readonly ITelemetryService telemetryService; private readonly IBackgroundQueue queue; public ReportService(IAsbCloudDbContext db, IConfiguration configuration, ITelemetryService telemetryService, IBackgroundQueue queue) { this.db = db; this.configuration = configuration; this.telemetryService = telemetryService; this.queue = queue; RootPath = "reports"; } public string RootPath { get ; private set; } public int CreateReport(int wellId, int stepSeconds, int format, DateTime begin, DateTime end, Action progressHandler) { var newReportId = queue.EnqueueTask((id) => { var optionsBuilder = new DbContextOptionsBuilder(); optionsBuilder.UseNpgsql(configuration.GetConnectionString("DefaultConnection")); using (var context = new AsbCloudDbContext(optionsBuilder.Options)) { var generator = GetReportGenerator(wellId, begin, end, stepSeconds, format, context); generator.OnProgress += (s,e) => progressHandler.Invoke(e.progress, e.operation, id); var newReportName = generator.Make(); if(newReportName is not null) { var newReportProperties = new Report { Name = newReportName, WellId = wellId, Date = DateTime.Now, Begin = begin, End = end, Step = stepSeconds, Format = format }; context.Reports.Add(newReportProperties); db.SaveChanges(); } } }); return newReportId; } public int GetReportPagesCount(int wellId, DateTime begin, DateTime end, int stepSeconds, int format) { var generator = GetReportGenerator(wellId, begin, end, stepSeconds, format, (AsbCloudDbContext)db); return generator.GetPagesCount(); } public IEnumerable GetExistingReportNames(int wellId, DateTime begin, DateTime end, int stepSeconds, int format) { var suitableReportsFromDb = GetSuitableReportNamesFromDb(wellId, begin, end, stepSeconds, format); var reportsFolder = Path.Combine(RootPath, $"{wellId}"); var suitableReportNames = Directory.GetFiles(reportsFolder) .Select(Path.GetFileName) .Where(name => suitableReportsFromDb.Contains(name)); return suitableReportNames; } public DatesRangeDto GetReportsDatesRange(int wellId) { var telemetry = telemetryService.GetTelemetryByWellId(wellId); if (telemetry is null) return null; // Убран общий с другими сущностями интерфейс IIdTelemetryDate, // т.к. у Report нет IdTelemetry. GetDatesRange() уже не работает для Report. // Будет исправлено следом за этим коммитом //var (From, To) = db.GetDatesRange(telemetry.Id); return new DatesRangeDto { From = DateTime.MinValue, To = DateTime.MaxValue }; } private IEnumerable GetSuitableReportNamesFromDb(int wellId, DateTime begin, DateTime end, int stepSeconds, int format) { var suitableReportsNames = (from r in db.Reports where r.WellId == wellId && r.Begin == begin && r.End == end && r.Step == stepSeconds && r.Format == format select r.Name).ToList(); return suitableReportsNames; } private IReportGenerator GetReportGenerator(int wellId, DateTime begin, DateTime end, int stepSeconds, int format, AsbCloudDbContext context) { var dataSource = new ReportDataSourcePgCloud(context, wellId); var generator = new PdfGenerator(dataSource) { ReportDirectory = Path.Combine(RootPath, $"{wellId}"), Begin = begin, End = end, Step = TimeSpan.FromSeconds(stepSeconds), WithCharts = true, WithEvents = true }; switch(format) { case 0: return generator; case 1: return generator; default: return generator; } } } }