using AsbCloudApp.Data; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services; using Mapster; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using System; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Background { /// /// Класс для создания отчета /// internal class WorkToCreateReport : Work { private int idWell; private DateTime begin; private DateTime end; private int stepSeconds; private int format; private int idUser; private Action progressHandler; public WorkToCreateReport(int idWell, int idUser, ReportParametersRequest request, Action progressHandler) : base("") { this.idWell = idWell; this.idUser = idUser; this.begin = request.Begin; this.end = request.End; this.stepSeconds = request.StepSeconds; this.format = request.Format; this.progressHandler = progressHandler; Id = $"create report by wellid:{idWell} for userid:{idUser} requested at {DateTime.Now}"; } protected override async Task Action(string id, IServiceProvider services, Action onProgress, CancellationToken token) { var wellService = services.GetRequiredService(); using var context = services.GetRequiredService(); var fileService = services.GetRequiredService(); var timezoneOffset = wellService.GetTimezone(idWell).Hours; var beginRemote = begin.ToTimeZoneOffsetHours(timezoneOffset); var endRemote = end.ToTimeZoneOffsetHours(timezoneOffset); var beginUtc = begin.ToUtcDateTimeOffset(timezoneOffset); var endUtc = end.ToUtcDateTimeOffset(timezoneOffset); var tempDir = Path.Combine(Path.GetTempPath(), "report"); var generator = ReportService.GetReportGenerator(idWell, beginRemote, endRemote, stepSeconds, format, context); var reportFileName = Path.Combine(tempDir, generator.GetReportDefaultFileName()); var totalPages = generator.GetPagesCount(); generator.OnProgress += (s, e) => { var arg = e.Adapt(); onProgress(arg.Operation ?? string.Empty, arg.Progress); progressHandler.Invoke(arg, id); }; generator.Make(reportFileName); var ReportCategoryId = context.FileCategories .AsNoTracking() .First(c => c.Name.Equals("Рапорт")) .Id; var fileInfo = (await fileService.MoveAsync(idWell, idUser, ReportCategoryId, reportFileName, reportFileName, token))!; progressHandler.Invoke(new { Operation = "done", Progress = 100f, TotalPages = totalPages, CurrentPage = totalPages, file = fileInfo, }, id); var newReportProperties = new ReportProperty { IdWell = idWell, IdFile = fileInfo.Id, Begin = beginUtc, End = endUtc, Step = stepSeconds, Format = format }; context.ReportProperties.Add(newReportProperties); context.SaveChanges(); } } }