forked from ddrilling/AsbCloudServer
102 lines
3.6 KiB
C#
102 lines
3.6 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// Класс для создания отчета
|
|
/// </summary>
|
|
internal class WorkToCreateReport : Work
|
|
{
|
|
private int idWell;
|
|
private DateTime begin;
|
|
private DateTime end;
|
|
private int stepSeconds;
|
|
private int format;
|
|
private int idUser;
|
|
private Action<object, string> progressHandler;
|
|
|
|
public WorkToCreateReport(int idWell, int idUser, ReportParametersRequest request, Action<object, string> 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<string, double?> onProgress, CancellationToken token)
|
|
{
|
|
var wellService = services.GetRequiredService<IWellService>();
|
|
using var context = services.GetRequiredService<IAsbCloudDbContext>();
|
|
var fileService = services.GetRequiredService<FileService>();
|
|
|
|
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<ReportProgressDto>();
|
|
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();
|
|
}
|
|
}
|
|
}
|