From b7ce104e4e50aefa5f6d902e4c837c1d79a1a83a Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 20 Oct 2023 11:24:04 +0500 Subject: [PATCH] =?UTF-8?q?-=20=D0=AD=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82?= =?UTF-8?q?=20=D0=BE=D1=82=D1=87=D0=B5=D1=82=D0=B0=20Drill=20test=20-=20?= =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D1=8B=D0=B9=20extension=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4?= =?UTF-8?q?=20AssemblyExtensions.GetTemplateCopyStreamAsync=20-=20IAutoGen?= =?UTF-8?q?eratedDailyReportMakerService=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=20=D0=B2=20IReportMa?= =?UTF-8?q?kerService=20=D0=B8=20=D1=81=D1=82=D0=B0=D0=BB=20=D0=B1=D0=BE?= =?UTF-8?q?=D0=BB=D0=B5=D0=B5=20=D1=83=D0=BD=D0=B8=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AutoGeneratedDailyReportInfoDto.cs | 21 +- .../DrillTestReport/DrillTestReportDataDto.cs | 26 ++ .../DrillTestReport/DrillTestReportInfoDto.cs | 25 + AsbCloudApp/Data/ReportInfoDto.cs | 18 + .../Repositories/IDrillTestRepository.cs | 19 + .../AutoGeneratedDailyReportRequest.cs | 22 +- .../IAutoGeneratedDailyReportMakerService.cs | 19 +- .../IAutoGeneratedDailyReportService.cs | 2 +- .../Services/IDrillTestReportService.cs | 35 ++ .../AsbCloudInfrastructure.csproj | 2 + AsbCloudInfrastructure/AssemblyExtensions.cs | 30 ++ AsbCloudInfrastructure/DependencyInjection.cs | 442 +++++++++--------- .../Repository/DrillTestRepository.cs | 43 ++ .../AutoGeneratedDailyReportMakerService.cs | 28 +- .../AutoGeneratedDailyReportService.cs | 18 +- .../DrillTestReportMakerService.cs | 89 ++++ .../DrillTestReport/DrillTestReportService.cs | 103 ++++ .../DrillTestReportTemplate.xlsx | Bin 0 -> 7284 bytes AsbCloudInfrastructure/XLExtentions.cs | 12 +- .../AutoGeneratedDailyReportController.cs | 5 +- .../Controllers/DrillTestsReportController.cs | 84 ++++ 21 files changed, 751 insertions(+), 292 deletions(-) create mode 100644 AsbCloudApp/Data/DrillTestReport/DrillTestReportDataDto.cs create mode 100644 AsbCloudApp/Data/DrillTestReport/DrillTestReportInfoDto.cs create mode 100644 AsbCloudApp/Data/ReportInfoDto.cs create mode 100644 AsbCloudApp/Services/IDrillTestReportService.cs create mode 100644 AsbCloudInfrastructure/AssemblyExtensions.cs create mode 100644 AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportMakerService.cs create mode 100644 AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportService.cs create mode 100644 AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportTemplate.xlsx create mode 100644 AsbCloudWebApi/Controllers/DrillTestsReportController.cs diff --git a/AsbCloudApp/Data/AutogeneratedDailyReport/AutoGeneratedDailyReportInfoDto.cs b/AsbCloudApp/Data/AutogeneratedDailyReport/AutoGeneratedDailyReportInfoDto.cs index 0034879a..22e34cf2 100644 --- a/AsbCloudApp/Data/AutogeneratedDailyReport/AutoGeneratedDailyReportInfoDto.cs +++ b/AsbCloudApp/Data/AutogeneratedDailyReport/AutoGeneratedDailyReportInfoDto.cs @@ -5,21 +5,10 @@ namespace AsbCloudApp.Data.AutogeneratedDailyReport; /// /// Базовая информация о суточном отчёте /// -public class AutoGeneratedDailyReportInfoDto +public class AutoGeneratedDailyReportInfoDto : ReportInfoDto { - /// - /// Дата формирования отчёта - /// - public DateOnly ReportDate { get; set; } - - /// - /// Название файла - /// - public string FileName { get; set; } = null!; - - /// - /// Размер файла - /// - public int FileSize { get; set; } - + /// + /// Дата формирования отчёта + /// + public DateOnly ReportDate { get; set; } } \ No newline at end of file diff --git a/AsbCloudApp/Data/DrillTestReport/DrillTestReportDataDto.cs b/AsbCloudApp/Data/DrillTestReport/DrillTestReportDataDto.cs new file mode 100644 index 00000000..ee63bf9b --- /dev/null +++ b/AsbCloudApp/Data/DrillTestReport/DrillTestReportDataDto.cs @@ -0,0 +1,26 @@ +using AsbCloudApp.Data.SAUB; +using System; + +namespace AsbCloudApp.Data.DrillTestReport +{ + /// + /// Информация о drill test, выгружаемая в отчете + /// + public class DrillTestReportDataDto + { + /// + /// Данные для отчета + /// + public DrillTestDto Data { get; set; } = null!; + + /// + /// Заголовок отчета + /// + public string Caption { get; set; } = null!; + + /// + /// Дата отчета + /// + public DateTime Date { get; set; } = DateTime.Now; + } +} diff --git a/AsbCloudApp/Data/DrillTestReport/DrillTestReportInfoDto.cs b/AsbCloudApp/Data/DrillTestReport/DrillTestReportInfoDto.cs new file mode 100644 index 00000000..8d3a9244 --- /dev/null +++ b/AsbCloudApp/Data/DrillTestReport/DrillTestReportInfoDto.cs @@ -0,0 +1,25 @@ +using System; + +namespace AsbCloudApp.Data.DrillTestReport +{ + /// + /// Базовая информация о drill_test отчёте + /// + public class DrillTestReportInfoDto : ReportInfoDto + { + /// + /// Идентификатор отчета + /// + public int Id { get; set; } + + /// + /// Проходка + /// + public float DrillDepth { get; set; } + + /// + /// Дата и время + /// + public DateTime DateTime { get; set; } + } +} diff --git a/AsbCloudApp/Data/ReportInfoDto.cs b/AsbCloudApp/Data/ReportInfoDto.cs new file mode 100644 index 00000000..bd55d33c --- /dev/null +++ b/AsbCloudApp/Data/ReportInfoDto.cs @@ -0,0 +1,18 @@ +namespace AsbCloudApp.Data +{ + /// + /// Справочная информация об отчете + /// + public class ReportInfoDto + { + /// + /// Название файла + /// + public string FileName { get; set; } = null!; + + /// + /// Размер файла + /// + public int FileSize { get; set; } = 0; + } +} diff --git a/AsbCloudApp/Repositories/IDrillTestRepository.cs b/AsbCloudApp/Repositories/IDrillTestRepository.cs index 45552871..18ff0e9b 100644 --- a/AsbCloudApp/Repositories/IDrillTestRepository.cs +++ b/AsbCloudApp/Repositories/IDrillTestRepository.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Requests; using System.Threading; using System.Threading.Tasks; @@ -9,6 +10,24 @@ namespace AsbCloudApp.Repositories /// public interface IDrillTestRepository { + /// + /// Получить данные drill_test в соответствии с параметрами запроса + /// + /// ключ телеметрии + /// запрос + /// + /// + Task GetAllAsync(int idTelemetry, FileReportRequest request, CancellationToken cancellationToken); + + /// + /// Получить запись drill_test + /// + /// ключ телеметрии + /// ключ записи drill_test + /// + /// + Task GetAsync(int idTelemetry, int id, CancellationToken cancellationToken); + /// /// Сохранить данные drill_test /// diff --git a/AsbCloudApp/Requests/AutoGeneratedDailyReportRequest.cs b/AsbCloudApp/Requests/AutoGeneratedDailyReportRequest.cs index 5e7dae7c..a9984016 100644 --- a/AsbCloudApp/Requests/AutoGeneratedDailyReportRequest.cs +++ b/AsbCloudApp/Requests/AutoGeneratedDailyReportRequest.cs @@ -3,17 +3,17 @@ using System; namespace AsbCloudApp.Requests; /// -/// Параметры запроса для получения авто-генерируемых суточных отчётов +/// Параметры запроса для получения отчетов (файлов) /// -public class AutoGeneratedDailyReportRequest : RequestBase +public class FileReportRequest : RequestBase { - /// - /// Дата начала периода - /// - public DateOnly? StartDate { get; set; } - - /// - /// Дата конца периода - /// - public DateOnly? FinishDate { get; set; } + /// + /// Дата начала периода + /// + public DateOnly? GeDate { get; set; } + + /// + /// Дата конца периода + /// + public DateOnly? LeDate { get; set; } } \ No newline at end of file diff --git a/AsbCloudApp/Services/AutoGeneratedDailyReports/IAutoGeneratedDailyReportMakerService.cs b/AsbCloudApp/Services/AutoGeneratedDailyReports/IAutoGeneratedDailyReportMakerService.cs index 8571e356..8c2e9a46 100644 --- a/AsbCloudApp/Services/AutoGeneratedDailyReports/IAutoGeneratedDailyReportMakerService.cs +++ b/AsbCloudApp/Services/AutoGeneratedDailyReports/IAutoGeneratedDailyReportMakerService.cs @@ -1,20 +1,19 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -using AsbCloudApp.Data.AutogeneratedDailyReport; namespace AsbCloudApp.Services.AutoGeneratedDailyReports; /// -/// Сервис для генерации файлов авто-генерируемых суточный отчётов +/// Сервис для генерации файлов отчётов /// -public interface IAutoGeneratedDailyReportMakerService +public interface IReportMakerService { - /// - /// Генерация файла - /// - /// - /// - /// - Task MakeReportAsync(AutoGeneratedDailyReportDto report, CancellationToken cancellationToken); + /// + /// Генерация файла + /// + /// модель с данными для построения отчета + /// + /// + Task MakeReportAsync(T report, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/AsbCloudApp/Services/AutoGeneratedDailyReports/IAutoGeneratedDailyReportService.cs b/AsbCloudApp/Services/AutoGeneratedDailyReports/IAutoGeneratedDailyReportService.cs index 13bdb1ea..979f948c 100644 --- a/AsbCloudApp/Services/AutoGeneratedDailyReports/IAutoGeneratedDailyReportService.cs +++ b/AsbCloudApp/Services/AutoGeneratedDailyReports/IAutoGeneratedDailyReportService.cs @@ -21,7 +21,7 @@ public interface IAutoGeneratedDailyReportService /// /// Task> GetListAsync(int idWell, - AutoGeneratedDailyReportRequest request, + FileReportRequest request, CancellationToken cancellationToken); /// diff --git a/AsbCloudApp/Services/IDrillTestReportService.cs b/AsbCloudApp/Services/IDrillTestReportService.cs new file mode 100644 index 00000000..6dd97b83 --- /dev/null +++ b/AsbCloudApp/Services/IDrillTestReportService.cs @@ -0,0 +1,35 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.DrillTestReport; +using AsbCloudApp.Requests; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services +{ + /// + /// сервис по работе с отчетами drill test + /// + public interface IDrillTestReportService + { + /// + /// Список файлов drill test + /// + /// ключ скважины + /// параметры запроса + /// + /// + Task> GetListAsync(int idWell, + FileReportRequest request, + CancellationToken cancellationToken); + + /// + /// Генерация файла с отчётом + /// + /// ключ скважины + /// ключ drill test записи + /// + /// + Task<(string fileName, Stream stream)> GenerateAsync(int idWell, int id, CancellationToken cancellationToken); + } +} diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index bc825b4b..2c2bd528 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -13,6 +13,7 @@ + @@ -30,6 +31,7 @@ + diff --git a/AsbCloudInfrastructure/AssemblyExtensions.cs b/AsbCloudInfrastructure/AssemblyExtensions.cs new file mode 100644 index 00000000..9594261b --- /dev/null +++ b/AsbCloudInfrastructure/AssemblyExtensions.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure +{ + public static class AssemblyExtensions + { + public static async Task GetTemplateCopyStreamAsync(this Assembly assembly, string templateName, CancellationToken cancellationToken) + { + var resourceName = assembly + .GetManifestResourceNames() + .FirstOrDefault(n => n.EndsWith(templateName))!; + + using var stream = Assembly.GetExecutingAssembly() + .GetManifestResourceStream(resourceName)!; + + var memoryStream = new MemoryStream(); + await stream.CopyToAsync(memoryStream, cancellationToken); + memoryStream.Position = 0; + + return memoryStream; + } + } +} diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 85caf0b2..0ce35409 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -1,5 +1,6 @@ -using System; -using AsbCloudApp.Data; +using AsbCloudApp.Data; +using AsbCloudApp.Data.AutogeneratedDailyReport; +using AsbCloudApp.Data.DrillTestReport; using AsbCloudApp.Data.Manuals; using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Data.SAUB; @@ -24,6 +25,7 @@ using AsbCloudInfrastructure.Services.AutoGeneratedDailyReports; using AsbCloudInfrastructure.Services.DailyReport; using AsbCloudInfrastructure.Services.DetectOperations; using AsbCloudInfrastructure.Services.DrillingProgram; +using AsbCloudInfrastructure.Services.DrillTestReport; using AsbCloudInfrastructure.Services.ProcessMaps.Report; using AsbCloudInfrastructure.Services.ProcessMaps.WellDrilling; using AsbCloudInfrastructure.Services.SAUB; @@ -37,273 +39,275 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using System; namespace AsbCloudInfrastructure { public static class DependencyInjection { - public static IAsbCloudDbContext MakeContext(string connectionString) - { - var options = new DbContextOptionsBuilder() - .UseNpgsql(connectionString) - .Options; - var context = new AsbCloudDbContext(options); - return context; - } + public static IAsbCloudDbContext MakeContext(string connectionString) + { + var options = new DbContextOptionsBuilder() + .UseNpgsql(connectionString) + .Options; + var context = new AsbCloudDbContext(options); + return context; + } - public static void MapsterSetup() - { - TypeAdapterConfig.GlobalSettings.Default.Config - .ForType() - .MapWith((source) => source.DateTime); + public static void MapsterSetup() + { + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .MapWith((source) => source.DateTime); - TypeAdapterConfig.GlobalSettings.Default.Config - .ForType() - .MapWith((source) => source == default ? new DateTime(0, DateTimeKind.Utc) : source); + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .MapWith((source) => source == default ? new DateTime(0, DateTimeKind.Utc) : source); - TypeAdapterConfig.GlobalSettings.Default.Config - .ForType() - .MapWith((source) => source.MakeTimeOnly()); + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .MapWith((source) => source.MakeTimeOnly()); - TypeAdapterConfig.GlobalSettings.Default.Config - .ForType() - .MapWith((source) => new(source)); + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .MapWith((source) => new(source)); - TypeAdapterConfig.GlobalSettings.Default.Config - .ForType() - .MapWith((source) => new(source)); + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .MapWith((source) => new(source)); #pragma warning disable CS8603 // Possible null reference return. - TypeAdapterConfig.GlobalSettings.Default.Config - .ForType() - .Ignore(dst => dst.Cluster, - dst => dst.RelationCompaniesWells, - dst => dst.Telemetry, - dst => dst.WellComposites, - dst => dst.WellCompositeSrcs, - dst => dst.WellOperations, - dst => dst.WellType); + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .Ignore(dst => dst.Cluster, + dst => dst.RelationCompaniesWells, + dst => dst.Telemetry, + dst => dst.WellComposites, + dst => dst.WellCompositeSrcs, + dst => dst.WellOperations, + dst => dst.WellType); #pragma warning restore CS8603 // Possible null reference return. - TypeAdapterConfig.GlobalSettings.Default.Config - .ForType() - .Ignore(dst => dst.Deposit, - dst => dst.Wells); + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .Ignore(dst => dst.Deposit, + dst => dst.Wells); - TypeAdapterConfig.GlobalSettings.Default.Config - .ForType(); + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType(); - TypeAdapterConfig.GlobalSettings.Default.Config - .ForType(); + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType(); - TypeAdapterConfig.GlobalSettings.Default.Config - .ForType() - .Ignore(dst => dst.NotificationCategory, - dst => dst.User); + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .Ignore(dst => dst.NotificationCategory, + dst => dst.User); - TypeAdapterConfig.GlobalSettings.Default.Config - .ForType() - .Map(dest => dest.AxialLoad, src => new PlanLimitDto - { - LimitMax = src.AxialLoadLimitMax, - Plan = src.AxialLoadPlan - }) - .Map(dest => dest.Flow, src => new PlanLimitDto - { - LimitMax = src.FlowLimitMax, - Plan = src.FlowPlan - }) - .Map(dest => dest.Pressure, src => new PlanLimitDto - { - LimitMax = src.PressureLimitMax, - Plan = src.PressurePlan - }) - .Map(dest => dest.TopDriveSpeed, src => new PlanLimitDto - { - LimitMax = src.TopDriveSpeedLimitMax, - Plan = src.TopDriveSpeedPlan - }) - .Map(dest => dest.TopDriveTorque, src => new PlanLimitDto - { - LimitMax = src.TopDriveTorqueLimitMax, - Plan = src.TopDriveTorquePlan - }); + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .Map(dest => dest.AxialLoad, src => new PlanLimitDto + { + LimitMax = src.AxialLoadLimitMax, + Plan = src.AxialLoadPlan + }) + .Map(dest => dest.Flow, src => new PlanLimitDto + { + LimitMax = src.FlowLimitMax, + Plan = src.FlowPlan + }) + .Map(dest => dest.Pressure, src => new PlanLimitDto + { + LimitMax = src.PressureLimitMax, + Plan = src.PressurePlan + }) + .Map(dest => dest.TopDriveSpeed, src => new PlanLimitDto + { + LimitMax = src.TopDriveSpeedLimitMax, + Plan = src.TopDriveSpeedPlan + }) + .Map(dest => dest.TopDriveTorque, src => new PlanLimitDto + { + LimitMax = src.TopDriveTorqueLimitMax, + Plan = src.TopDriveTorquePlan + }); - TypeAdapterConfig.GlobalSettings.Default.Config - .ForType() - .Map(dest => dest.AxialLoadPlan, src => src.AxialLoad.Plan) - .Map(dest => dest.AxialLoadLimitMax, src => src.AxialLoad.LimitMax) - .Map(dest => dest.FlowPlan, src => src.Flow.Plan) - .Map(dest => dest.FlowLimitMax, src => src.Flow.LimitMax) - .Map(dest => dest.PressurePlan, src => src.Pressure.Plan) - .Map(dest => dest.PressureLimitMax, src => src.Pressure.LimitMax) - .Map(dest => dest.TopDriveSpeedPlan, src => src.TopDriveSpeed.Plan) - .Map(dest => dest.TopDriveSpeedLimitMax, src => src.TopDriveSpeed.LimitMax) - .Map(dest => dest.TopDriveTorquePlan, src => src.TopDriveTorque.Plan) - .Map(dest => dest.TopDriveTorqueLimitMax, src => src.TopDriveTorque.LimitMax); - } + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .Map(dest => dest.AxialLoadPlan, src => src.AxialLoad.Plan) + .Map(dest => dest.AxialLoadLimitMax, src => src.AxialLoad.LimitMax) + .Map(dest => dest.FlowPlan, src => src.Flow.Plan) + .Map(dest => dest.FlowLimitMax, src => src.Flow.LimitMax) + .Map(dest => dest.PressurePlan, src => src.Pressure.Plan) + .Map(dest => dest.PressureLimitMax, src => src.Pressure.LimitMax) + .Map(dest => dest.TopDriveSpeedPlan, src => src.TopDriveSpeed.Plan) + .Map(dest => dest.TopDriveSpeedLimitMax, src => src.TopDriveSpeed.LimitMax) + .Map(dest => dest.TopDriveTorquePlan, src => src.TopDriveTorque.Plan) + .Map(dest => dest.TopDriveTorqueLimitMax, src => src.TopDriveTorque.LimitMax); + } - public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration) - { - MapsterSetup(); - string connectionStringName = "DefaultConnection"; + public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration) + { + MapsterSetup(); + string connectionStringName = "DefaultConnection"; #if DEBUG - connectionStringName = "DebugConnection"; + connectionStringName = "DebugConnection"; #endif - services.AddDbContext(options => - options.UseNpgsql(configuration.GetConnectionString(connectionStringName))); + services.AddDbContext(options => + options.UseNpgsql(configuration.GetConnectionString(connectionStringName))); - services.AddMemoryCache(); - services.AddScoped(provider => provider.GetRequiredService()); + services.AddMemoryCache(); + services.AddScoped(provider => provider.GetRequiredService()); - services.AddSingleton(new WitsInfoService()); - services.AddSingleton(provider => TelemetryDataCache.GetInstance(provider)); - services.AddSingleton(provider => TelemetryDataCache.GetInstance(provider)); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(provider => ReduceSamplingService.GetInstance(configuration)); + services.AddSingleton(new WitsInfoService()); + services.AddSingleton(provider => TelemetryDataCache.GetInstance(provider)); + services.AddSingleton(provider => TelemetryDataCache.GetInstance(provider)); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(provider => ReduceSamplingService.GetInstance(configuration)); - services.AddTransient(); - services.AddTransient, ProcessMapPlanRepository>(); - services.AddTransient, ProcessMapPlanRepository>(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient, CrudWellRelatedRepositoryBase>(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient, ProcessMapPlanRepository>(); + services.AddTransient, ProcessMapPlanRepository>(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient, CrudWellRelatedRepositoryBase>(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); - services.AddTransient(); + services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient, CrudCacheRepositoryBase, CrudCacheRepositoryBase>(); services.AddTransient(); - // admin crud services: - services.AddTransient, CrudCacheRepositoryBase>(s => - new CrudCacheRepositoryBase( - s.GetRequiredService(), - s.GetRequiredService(), - dbSet => dbSet.Include(t => t.Well))); // может быть включен в сервис TelemetryService - services.AddTransient, CrudCacheRepositoryBase>(s => - new CrudCacheRepositoryBase( - s.GetRequiredService(), - s.GetRequiredService(), - dbSet => dbSet.Include(d => d.Clusters))); - services.AddTransient, CrudCacheRepositoryBase>(s => - new CrudCacheRepositoryBase( - s.GetRequiredService(), - s.GetRequiredService(), - dbSet => dbSet.Include(c => c.CompanyType))); + // admin crud services: + services.AddTransient, CrudCacheRepositoryBase>(s => + new CrudCacheRepositoryBase( + s.GetRequiredService(), + s.GetRequiredService(), + dbSet => dbSet.Include(t => t.Well))); // может быть включен в сервис TelemetryService + services.AddTransient, CrudCacheRepositoryBase>(s => + new CrudCacheRepositoryBase( + s.GetRequiredService(), + s.GetRequiredService(), + dbSet => dbSet.Include(d => d.Clusters))); + services.AddTransient, CrudCacheRepositoryBase>(s => + new CrudCacheRepositoryBase( + s.GetRequiredService(), + s.GetRequiredService(), + dbSet => dbSet.Include(c => c.CompanyType))); - services.AddTransient, CrudCacheRepositoryBase>(); - services.AddTransient, CrudCacheRepositoryBase>(s => - new CrudCacheRepositoryBase( - s.GetRequiredService(), - s.GetRequiredService(), - dbSet => dbSet - .Include(c => c.Wells) - .Include(c => c.Deposit))); // может быть включен в сервис ClusterService + services.AddTransient, CrudCacheRepositoryBase>(); + services.AddTransient, CrudCacheRepositoryBase>(s => + new CrudCacheRepositoryBase( + s.GetRequiredService(), + s.GetRequiredService(), + dbSet => dbSet + .Include(c => c.Wells) + .Include(c => c.Deposit))); // может быть включен в сервис ClusterService - services.AddTransient, CrudCacheRepositoryBase>(); + services.AddTransient, CrudCacheRepositoryBase>(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient, CrudCacheRepositoryBase>(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient, CrudCacheRepositoryBase>(); - // Subsystem service - services.AddTransient, CrudCacheRepositoryBase>(); - services.AddTransient(); + // Subsystem service + services.AddTransient, CrudCacheRepositoryBase>(); + services.AddTransient(); - services.AddTransient, CrudCacheRepositoryBase>(); + services.AddTransient, CrudCacheRepositoryBase>(); - // TelemetryData services - services.AddTransient(); - services.AddTransient, TelemetryDataSpinService>(); + // TelemetryData services + services.AddTransient(); + services.AddTransient, TelemetryDataSpinService>(); - // Wits - services.AddTransient, WitsRecordRepository>(); - services.AddTransient, WitsRecordRepository>(); - services.AddTransient, WitsRecordRepository>(); - services.AddTransient, WitsRecordRepository>(); - services.AddTransient, WitsRecordRepository>(); - services.AddTransient, WitsRecordRepository>(); + // Wits + services.AddTransient, WitsRecordRepository>(); + services.AddTransient, WitsRecordRepository>(); + services.AddTransient, WitsRecordRepository>(); + services.AddTransient, WitsRecordRepository>(); + services.AddTransient, WitsRecordRepository>(); + services.AddTransient, WitsRecordRepository>(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient, AutoGeneratedDailyReportMakerService>(); + services.AddTransient(); + services.AddTransient, DrillTestReportMakerService>(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient, CrudRepositoryBase>(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient, CrudRepositoryBase>(); - services.AddTransient(); + services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); - services.AddTransient, WellOperationDefaultExcelParser>(); - services.AddTransient, WellOperationGazpromKhantosExcelParser>(); + services.AddTransient, WellOperationDefaultExcelParser>(); + services.AddTransient, WellOperationGazpromKhantosExcelParser>(); - return services; - } + return services; + } - public static IServiceCollection AddTransientLazy(this IServiceCollection services) - where TService : class - where TImplementation : class, TService - => services.AddTransient() - .AddTransient(provider => new Lazy(provider.GetRequiredService)); + public static IServiceCollection AddTransientLazy(this IServiceCollection services) + where TService : class + where TImplementation : class, TService + => services.AddTransient() + .AddTransient(provider => new Lazy(provider.GetRequiredService)); - public static IServiceCollection AddTransientLazy(this IServiceCollection services, Func implementationFactory) - where TService : class - where TImplementation : class, TService - => services.AddTransient(implementationFactory) - .AddTransient(provider => new Lazy(() => implementationFactory(provider))); + public static IServiceCollection AddTransientLazy(this IServiceCollection services, Func implementationFactory) + where TService : class + where TImplementation : class, TService + => services.AddTransient(implementationFactory) + .AddTransient(provider => new Lazy(() => implementationFactory(provider))); } diff --git a/AsbCloudInfrastructure/Repository/DrillTestRepository.cs b/AsbCloudInfrastructure/Repository/DrillTestRepository.cs index a308cb0b..e349db2c 100644 --- a/AsbCloudInfrastructure/Repository/DrillTestRepository.cs +++ b/AsbCloudInfrastructure/Repository/DrillTestRepository.cs @@ -1,7 +1,12 @@ using AsbCloudApp.Data.SAUB; using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; using AsbCloudDb.Model; using Mapster; +using Microsoft.EntityFrameworkCore; +using System; +using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -16,6 +21,44 @@ namespace AsbCloudInfrastructure.Repository this.db = db; } + public async Task GetAllAsync(int idTelemetry, FileReportRequest request, CancellationToken cancellationToken) + { + var query = db.DrillTests + .Where(d => d.IdTelemetry == idTelemetry) + .AsNoTracking(); + + if (request.GeDate.HasValue) + { + var startDate = new DateTime(request.GeDate.Value.Year, request.GeDate.Value.Month, request.GeDate.Value.Day); + query = query.Where(q => q.TimeStampStart >= startDate); + } + if (request.LeDate.HasValue) + { + var finishDate = new DateTime(request.LeDate.Value.Year, request.LeDate.Value.Month, request.LeDate.Value.Day); + query = query.Where(q => q.TimeStampStart <= finishDate); + } + + var entities = await query.ToListAsync(cancellationToken); + var dtos = entities.Select(e => e.Adapt()).ToArray(); + + return dtos; + } + + + public async Task GetAsync(int idTelemetry, int id, CancellationToken cancellationToken) + { + var drillTest = await db.DrillTests + .Where(d => d.IdTelemetry == idTelemetry) + .Where(d => d.Id == id) + .FirstOrDefaultAsync(cancellationToken); + + if (drillTest is null) + throw new Exception($"Drill test with id: {id} and idTelemetry: {idTelemetry} does not exist."); + + var dto = drillTest.Adapt(); + return dto; + } + public async Task SaveDataAsync(int idTelemetry, DrillTestDto dto, CancellationToken token) { var entity = dto.Adapt(); diff --git a/AsbCloudInfrastructure/Services/AutoGeneratedDailyReports/AutoGeneratedDailyReportMakerService.cs b/AsbCloudInfrastructure/Services/AutoGeneratedDailyReports/AutoGeneratedDailyReportMakerService.cs index 0f1c7076..8fee9b2c 100644 --- a/AsbCloudInfrastructure/Services/AutoGeneratedDailyReports/AutoGeneratedDailyReportMakerService.cs +++ b/AsbCloudInfrastructure/Services/AutoGeneratedDailyReports/AutoGeneratedDailyReportMakerService.cs @@ -11,8 +11,10 @@ using ClosedXML.Excel; namespace AsbCloudInfrastructure.Services.AutoGeneratedDailyReports; -public class AutoGeneratedDailyReportMakerService : IAutoGeneratedDailyReportMakerService +public class AutoGeneratedDailyReportMakerService : IReportMakerService { + private readonly string templateName = "AutogeneratedDailyReportTemplate.xlsx"; + private readonly IEnumerable blockWriters = new List() { new HeadExcelBlockWriter(), @@ -20,10 +22,12 @@ public class AutoGeneratedDailyReportMakerService : IAutoGeneratedDailyReportMak new LimitingParameterExcelBlockWriter(), new TimeBalanceExcelBlockWriter() }; - - public async Task MakeReportAsync(AutoGeneratedDailyReportDto report, CancellationToken cancellationToken) + + public async Task MakeReportAsync(AutoGeneratedDailyReportDto report, CancellationToken cancellationToken) { - using var excelTemplateStream = await GetExcelTemplateStreamAsync(cancellationToken); + using var excelTemplateStream = await Assembly + .GetExecutingAssembly() + .GetTemplateCopyStreamAsync(templateName, cancellationToken); using var workbook = new XLWorkbook(excelTemplateStream, XLEventTracking.Disabled); @@ -35,22 +39,6 @@ public class AutoGeneratedDailyReportMakerService : IAutoGeneratedDailyReportMak return memoryStream; } - - private async Task GetExcelTemplateStreamAsync(CancellationToken cancellationToken) - { - var resourceName = Assembly.GetExecutingAssembly() - .GetManifestResourceNames() - .FirstOrDefault(n => n.EndsWith("AutogeneratedDailyReportTemplate.xlsx"))!; - - using var stream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream(resourceName)!; - - var memoryStream = new MemoryStream(); - await stream.CopyToAsync(memoryStream, cancellationToken); - memoryStream.Position = 0; - - return memoryStream; - } private void AddToWorkbook(XLWorkbook workbook, AutoGeneratedDailyReportDto report) { diff --git a/AsbCloudInfrastructure/Services/AutoGeneratedDailyReports/AutoGeneratedDailyReportService.cs b/AsbCloudInfrastructure/Services/AutoGeneratedDailyReports/AutoGeneratedDailyReportService.cs index 03ed6e07..1ada2676 100644 --- a/AsbCloudInfrastructure/Services/AutoGeneratedDailyReports/AutoGeneratedDailyReportService.cs +++ b/AsbCloudInfrastructure/Services/AutoGeneratedDailyReports/AutoGeneratedDailyReportService.cs @@ -26,14 +26,14 @@ public class AutoGeneratedDailyReportService : IAutoGeneratedDailyReportService private readonly ISubsystemOperationTimeService subsystemOperationTimeService; private readonly ICrudRepository subsystemRepository; private readonly ILimitingParameterService limitingParameterService; - private readonly IAutoGeneratedDailyReportMakerService autoGeneratedDailyReportMakerService; + private readonly IReportMakerService autoGeneratedDailyReportMakerService; public AutoGeneratedDailyReportService(IWellService wellService, IWellOperationRepository wellOperationRepository, ISubsystemOperationTimeService subsystemOperationTimeService, ICrudRepository subsystemRepository, ILimitingParameterService limitingParameterService, - IAutoGeneratedDailyReportMakerService autoGeneratedDailyReportMakerService) + IReportMakerService autoGeneratedDailyReportMakerService) { this.wellOperationRepository = wellOperationRepository; this.wellService = wellService; @@ -44,7 +44,7 @@ public class AutoGeneratedDailyReportService : IAutoGeneratedDailyReportService } public async Task> GetListAsync(int idWell, - AutoGeneratedDailyReportRequest request, + FileReportRequest request, CancellationToken cancellationToken) { var result = new PaginationContainer @@ -67,19 +67,19 @@ public class AutoGeneratedDailyReportService : IAutoGeneratedDailyReportService if (datesRange is null) return result; - if (request.StartDate.HasValue) + if (request.GeDate.HasValue) { - var startDate = new DateTime(request.StartDate.Value.Year, request.StartDate.Value.Month, - request.StartDate.Value.Day); + var startDate = new DateTime(request.GeDate.Value.Year, request.GeDate.Value.Month, + request.GeDate.Value.Day); if(startDate.Date >= datesRange.From.Date) datesRange.From = startDate; } - if (request.FinishDate.HasValue) + if (request.LeDate.HasValue) { - var finishDate = new DateTime(request.FinishDate.Value.Year, request.FinishDate.Value.Month, - request.FinishDate.Value.Day); + var finishDate = new DateTime(request.LeDate.Value.Year, request.LeDate.Value.Month, + request.LeDate.Value.Day); if (finishDate.Date <= datesRange.To.Date) datesRange.To = finishDate; diff --git a/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportMakerService.cs b/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportMakerService.cs new file mode 100644 index 00000000..68ad690f --- /dev/null +++ b/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportMakerService.cs @@ -0,0 +1,89 @@ +using AsbCloudApp.Data.DrillTestReport; +using AsbCloudApp.Services.AutoGeneratedDailyReports; +using ClosedXML.Excel; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services.DrillTestReport +{ + public class DrillTestReportMakerService : IReportMakerService + { + private readonly string templateName = "DrillTestReportTemplate.xlsx"; + private readonly string sheetName = "Лист1"; + private readonly int startRowNumber = 8; + + public async Task MakeReportAsync(DrillTestReportDataDto report, CancellationToken cancellationToken) + { + using var excelTemplateStream = await Assembly.GetExecutingAssembly().GetTemplateCopyStreamAsync(templateName, cancellationToken); + + using var workbook = new XLWorkbook(excelTemplateStream, XLEventTracking.Disabled); + + AddToWorkbook(workbook, report); + + MemoryStream memoryStream = new MemoryStream(); + workbook.SaveAs(memoryStream, new SaveOptions { }); + memoryStream.Seek(0, SeekOrigin.Begin); + + return memoryStream; + } + + + private void AddToWorkbook(XLWorkbook workbook, DrillTestReportDataDto report) + { + var drillTestEntities = report.Data.Params; + if (!drillTestEntities.Any()) + return; + + var sheet = workbook.Worksheets.FirstOrDefault(ws => ws.Name == sheetName) + ?? throw new FileFormatException($"Книга excel не содержит листа {sheetName}."); + + sheet.Cell(4, 2).Value = report.Caption; + sheet.Cell(5, 2)._SetValue(report.Date, setAllBorders: false); + + var rowNumber = startRowNumber; + + var stepWithMaxDepthSpeed = drillTestEntities.OrderByDescending(p => p.DepthSpeed).FirstOrDefault()!.Step; + var startDepth = report.Data.DepthStart; + var startDate = report.Data.TimeStampStart; + + foreach (var drillTestEntity in drillTestEntities) + { + var endDepth = startDepth + (drillTestEntity.DepthDrillStep ?? 0); + var endDateTime = startDate.AddSeconds(drillTestEntity.TimeDrillStep ?? 0); + + sheet.Cell(rowNumber, 2).Value = startDepth; + + sheet.Cell(rowNumber, 3).Value = endDepth; + + sheet.Cell(rowNumber, 4).Value = drillTestEntity.DepthDrillStep; + + sheet.Cell(rowNumber, 5).Value = drillTestEntity.Workload; + + sheet.Cell(rowNumber, 6).Value = drillTestEntity.Speed; + + var cell = sheet.Cell(rowNumber, 7); + cell._SetValue(startDate.DateTime); + + cell = sheet.Cell(rowNumber, 8); + cell._SetValue(endDateTime.DateTime); + + sheet.Cell(rowNumber, 9).Value = drillTestEntity.TimeDrillStep; + + sheet.Cell(rowNumber, 10).Value = drillTestEntity.DepthSpeed; + + if (drillTestEntity.Step == stepWithMaxDepthSpeed) + { + var currentCells = sheet.Row(rowNumber).Cells(1, 10); + currentCells.Style.Fill.BackgroundColor = XLColor.Yellow; + } + + startDepth = endDepth; + startDate = endDateTime; + rowNumber++; + } + } + } +} diff --git a/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportService.cs b/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportService.cs new file mode 100644 index 00000000..a3d6074e --- /dev/null +++ b/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportService.cs @@ -0,0 +1,103 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.DrillTestReport; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using AsbCloudApp.Services.AutoGeneratedDailyReports; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services.DrillTestReport +{ + public class DrillTestReportService : IDrillTestReportService + { + private readonly IWellService wellService; + private readonly IDrillTestRepository drillTestRepository; + private readonly ITelemetryService telemetryService; + private readonly IReportMakerService drillTestReportMakerService; + + public DrillTestReportService( + IWellService wellService, + IDrillTestRepository drillTestRepository, + ITelemetryService telemetryService, + IReportMakerService drillTestReportMakerService) + { + this.wellService = wellService; + this.drillTestRepository = drillTestRepository; + this.telemetryService = telemetryService; + this.drillTestReportMakerService = drillTestReportMakerService; + } + + public async Task<(string fileName, Stream stream)> GenerateAsync(int idWell, int id, CancellationToken cancellationToken) + { + var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell); + if (telemetry is null) + throw new Exception($"Telemetry with idWell: {idWell} does not exist."); + + var dto = await drillTestRepository.GetAsync(telemetry.Id, id, cancellationToken); + + var timezone = telemetryService.GetTimezone(telemetry.Id); + var remoteDateTime = dto.TimeStampStart.ToRemoteDateTime(timezone.Hours); + dto.TimeStampStart = remoteDateTime; + + var cluster = telemetry.Info?.Cluster ?? "-"; + var deposit = telemetry.Info?.Deposit ?? "-"; + var wellCaption = wellService.GetOrDefault(idWell)!.Caption ?? "-"; + + + var report = new DrillTestReportDataDto() + { + Data = dto, + Caption = string.Format("Месторождение: {0}, куст: {1}, скважина: {2}", deposit, cluster, wellCaption), + Date = DateTime.Now, + }; + + var fileName = string.Format("Drill_test_{0}.xlsx", remoteDateTime.ToString("dd.mm.yyyy_HH_MM_ss")); + var stream = await drillTestReportMakerService.MakeReportAsync(report, cancellationToken); + + return (fileName, stream); + } + + + public async Task> GetListAsync(int idWell, FileReportRequest request, CancellationToken cancellationToken) + { + var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell); + if (telemetry is null) + throw new Exception($"Telemetry with idWell: {idWell} does not exist."); + + var result = new PaginationContainer + { + Skip = request.Skip ?? 0, + Take = request.Take ?? 10, + Items = Enumerable.Empty() + }; + + var reports = new List(); + var timezone = telemetryService.GetTimezone(telemetry.Id); + + var dtos = await drillTestRepository.GetAllAsync(telemetry.Id, request, cancellationToken); + foreach (var dto in dtos) + { + var remoteDateTime = dto.TimeStampStart.ToRemoteDateTime(timezone.Hours); + + reports.Add(new DrillTestReportInfoDto + { + FileName = string.Format("Drill_test_{0}", remoteDateTime), + DrillDepth = (dto.Params + .Where(p => p.DepthDrillStep.HasValue) + .Sum(x => x.DepthDrillStep) ?? 0) + dto.DepthStart, + DateTime = remoteDateTime, + Id = dto.Id, + }); + } + + result.Items = reports; + + return result; + } + } +} diff --git a/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportTemplate.xlsx b/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5b9e8ec1c720e867771050303bf2431eb91d03a9 GIT binary patch literal 7284 zcmaJ`1z40@^QRkRVQC3Lx>H)Za{=iF0f{A+mImn(q#H>=I+X5`&IRc%DJiKx-1|L` zT)+Q!XPRGbX6F1xMIIgj2!n!x0wcnvt_kyq(C_aJ9nEc=SXmyvOW(IC zb+BQ)JMau+IOm=hLCMZ

^YO#zofp+>WFsG`BP0_)G#92P3kwBg(P|?wyhi6?tTopcJl@ANNWaf`frk`JZZfa{q*z z4XZ2I(b@zIwq|j&wTV>gvzueXZaQZ~STJWccter^uUQ)dGjCMTm;7D|-#QE^;~_sP zenoN<>n(LGO{)4TB}eEdMQGLGpeJW8bh2n=2sZvTNaFd{WhZQGUs|ZGgz!Agk0jn% zl~^?vM2R(w6um*i!6?u^h~5=zfq+$uKh?72C zQkZAL?3=GfrfI`2nVNU1TxRXKq*dMhNoa<8me??Rj37&TO)ow6rk^d#?s&xCMW&Fq1HcB4c4GR4pqJ9p zlAdm%@9DEC(FnK1h)q=eJ!*ULSgYaln=H|HaqgcYZw$^t6s# zmr?w-op@M7t=D8Ubzu3C-6_*s^ao$6Pi;@c-sZn1B0{6U5!d-08uS_H|XG zQ+ctyTMYf&TEu+KJ3>`z_SPY+1;z7nv>IOat+FbSkrCrGH>Vb>BECyDGLESq{bkU< zxxE(lAtMQReN(p!v|4;Ni0e=LYb&zI8e96g(xFL?k9Wqc@KjA2>{ECNwzMshq+M{p z;&qxW_H}h&jMaDeA=+Q>EB2mr^yX44h~B<4!*&`>8v(L;%M(atsG_Xs5$5%lD~xl4 zVvK|ij~LSPnWiZ#+ao#(B~k=$NS(5Gw^ASk?~}wY(M@Dv$0A!_)MCN;DA^B2=gG@1 zZN98IfN_YWpOr=c6pwb<8D+#=zepn^#kHcri};*1qW`kov$S=p2Cl_mDg$rZ zo*+C<3jsH@VVqRSBI1Np^euF@2-w?~)hIegmK*fVYtd62 zdb+))b&@zTx*qiEFW}b%JwC&%-Gz8b)$b!_0ssE7boR3TE1l$&t1IRKJ&kEs<8>nu1F8Mq7RKN(qu zNGuxZ`RmcJzbLKYnmWN(+lVR{EfTbKs0}R+-&Od)=kU^~1U3ThTc49P45u$qD~1sg zTY;~`o~{RoKQ~ou^*fMwH(|t06UlUxO;#~gi2g|FP zg+Stud^a)z-YM7ZX+jujryJi$d3Oh)tI#z4A00}ah%pQNrmKDx84>OR-6i~{xevG6 z@TNjURmk1Ih{$h#mFU#ToNQBZ6~XsIBzMck(DPGAqrId&pR7IJeyq1Eo;QgDS4$DU1ZOtOq-9t+gQdTq2+6`J%K3jNH>0A?WBR>mvP<$QJ4!_^}fIpXZ8295Z@BeqbAs(7T< zwOxC3F*>g{TxC10!Ok$CbdDX!u%I{1)zGwGtb6Xc^R<|l67=%(WNztDOow|G@whlq z4zZduO|eJuhR2J@29F*0`P|a5Dn^b4>8yUzqTR8Ow4K@tTlQiGn_{ApDYpzcD#r=| zX?@MMC`Rx3)!Y>7+Cf}htMSOzS`A`$l1XAbI6u+6itx?SQJt1ZNBtKrclE$)bwhqsTGN* zPaWCE)q`WQZ_j2wJwVdFrb4i`SNiVPhwGryX=9IC9LG^xGSaB11u7zP-pv-lgOxU_ z!Q&8W0`Ywt!KWi;gY9(g^@O+H7I%W=SdL`Rjj^i&4KNHXg|F9-$v2gmt`flX>+s7I zeXQ?vhsM_}B+Z8iPHoaAoAx=qLM zl#OQ4yH9!%`038V7HfAW9|t=@FYeL!^7jo z!#iD`8430RC;@)hbFe>efe8~P*%tG9OFX^64EMc9)ZmISD^7CRIbKE7y|!#g^Q_vWg0U0(s#@sK zkU{;ED87)5WXLq6gCtR~z9o-c--)<((Y0!`B5Cc++;w=RTU6#noA3q)0z2uzn_D`{ zW0 z;t$fh85Lk0*%s5}JQF<7B3DdLd6)?=3WC>1b1t6I*{rt*6n9lJp-*i%K+s!8N-B$Af#0|}tOIeZ9EyPY5yTd_?1%bmxl$TPTJ)#fULPym!~v?Q zp+x<7QT(ua8R*(4D~9y;Pd|Q9FkXi=4fD-u#D0*Sl`@uzTd)e}b8V|aQM)Fm?z-di zp@08;jb)w?lwOx^r=$2{KUpa?ooIGWneS76+NokuII#I9UWz+!fs-2W>1{Cm=4AXy zGd+RD8fl=ux*Cg8ot&*6c-n!JzD-toU6%f3H5{2l?DCZO5i@iN$JEETna{h~~& za2a{j@KXIuBvftk8S;M%QC}K1P*r%DKa-lt+Z57n*~huv@1&vgO&4EHvh`jPcKXm) zaD`mBpk3MfJ%9lY;c!I^JWz!wTCWy?9bOhMU z!G;<f;ew^WANKc_MR$qA`E%vak$>0LG#lpN-!=2Yj<>seHwX;J5GBiOn zvWt;t#T-^%Jh1G3S|TJRj**5#su|Btx-4v+(WLhc6QuKOx(#yxhEWo zcM99OCCn%*v7sSPC0Hn*#4d{JlSbq5ALLSrl3El;Avh!a*QmzJgWOdF=Lro`+CnM{ z+}MALuD0|bAT21&&EDaaB!x{5VUpmXM2-#b6<>2z(d^01n`qeL6(`*+j^dmE#Dw;W znNc}ne+dzk@J4oa7Su6n3XkI7saJ8HP?Z*;p+t|3>=j+3JjT8xotQkbtT|!fCl*p( zH`S1V5BhUr&y)@3ExpzwbrvnPmMAy?+95U)Sd;{@!Mz7rpJQlQZK^Z+k>1#2T9Zip zQ}9jk^%^ziHoesZE5m1$cwEMRjIT|myi04$e&(NIsKs`3={Y>@ zUlRN(mym7cs|%a$;a~O5dfP(ZCld2VJD9z!P91a&XT83UCMuD;p61Q<2zhOvIv5)M z^3qGY&J*nNq6*K`=DCT)N(p;j{yf5LR|h*WHCVb&eE!46aAGsf4@kSsi8J{)tdHz= zmp${`^zkyqAZ3E&b>7yz5&a+>%hfR%2eEz1yluc5P1Wu9f#$}g452aQ=yr)(x_+Kl zeRE404i!}4^2=6==EYsk_|F%^(3LU~iLlx?73W>*=skg~EpLAf2WMWdE8q5qp?VLioypRd=9E8_^ZG)!LX93q9!Iiey6IRXkRc5Cp2Z zpttRNtcTQ%^M!b^*g8u_+Gj(aCmVy`x*LYW(?~<)%=7jnTwQelxRttR9A6eg$zFQY z-%yyy6;vi}cKB9BE(4af;;aNO+YZ+YV{ev4*Md$HPB!IIb=UQ(vu`-F%}G zT3zrRU9T&MJ^QHGPK!j3PV*eceHuF68Z!u5(OR3o8NSXLKvjKwiPGIU2o0@W-3 z9X>=u(cEa%KA)-e-o7dlbh)$vpy7cFw1s5oVKI!m=Cgw;E`x7 zVewhr6G3bLI|i~h#KibEu({OF--C`B3{{r1^ z@TAVWWRXoHc$*?b%Wf`UyH!_4I(gnt)!ccrkm#bB?~TNbOrJE%obGT%?u2xTV;~jh zAOy8_xu7)p-Tc^JCVDlPv#?}I9bHb2^QjSc#+N{rRj2BNSDVG8Jw`zPW1pN-(RAO} zfPGcgfn(Y6G}u8rwNhR9YCA@i2B-GBa?@!{EW=#SOtxN3)ImqGSk6&Uw8;`9D+lsV z+sk#K^_P^SGgSR$0hu5kSJX+v*JKAC=wQ^jQWfvL>*puOb;**YWef9f;T|-je0b?G zcE4`we+AY6_fMFCO;sGh_D-y(U`O+ZGnOv(F6Kd=Y9uT?lxr;3N#~j>ES%(4@vE2*nqFbcANJgps@p zopLEL_&PLdC;2oBC)IW?ZO2!nA~n?w#}S)9L;ECg zz{Ir$1Iv6#>PeCw%ubA=O*u1?WgFq`=MbYyDAB71%@1=~r7%J3!F16fK~+}requzG z9~e(~1}K5!J|dvt$0caEFf4RD<~7u+LC$nbt6{q^kXXVnoS%{$t$Ph4th_DXO4f7` z31rs~Y)Kjh7%1b^_gnA{7Mxp~ez-!Nm)3V#XKJw89>X!Dpvss6iV&oXRZ@N(tI8=f zXD$N8gJM3Y1Pan+6E))rFq93IEp-Xf_95Fn=h=4^f1hrShURGn>=3Gw!S4JvcRl$B&G(JX+0{$kUrROCJJl50^pmx znV}`jL_Sj%DoHRX!vVw=4qSj zZ81miu&(7P7~jPESs&eB|Gq9=aj+f4+zw)>?rv}Hr2p5kK7Qc7dw?x@eiPQK3v4j= z!V$mWAd5nD0O zjRHUP15J-Pd}PY{ARN6LB*@R&^l-aBMvTt0;Y*;VAip6cj98npCOaA@_~uZtgjhbX zd>DpmO_`L`JsY4WDs(Ln^u_*2pe@=fQrx%biQeSb1CPvpUkFE|vXT5sYa%72mXv(*Sd zm}1J!2%q^yo+{EO)VsNLlyWK@qJKc;T-{@LE_mGo=xn!G`0C3V5Io*+w=uahkqx*g z#Jc;%3@9BYdokgv?=Sd)IpLX(7f*A|B`UdDiF+Px=7XJv7bu%8?tO3Kue<{b2ZZ_E z-+A29c{|a6z;kb$|7Y8)$Ri>>yanz4<9nZ67Kk4H{U4DwoaX=l literal 0 HcmV?d00001 diff --git a/AsbCloudInfrastructure/XLExtentions.cs b/AsbCloudInfrastructure/XLExtentions.cs index c1a463d0..f7b1654b 100644 --- a/AsbCloudInfrastructure/XLExtentions.cs +++ b/AsbCloudInfrastructure/XLExtentions.cs @@ -92,12 +92,16 @@ internal static class XLExtentions } - internal static IXLCell _SetValue(this IXLCell cell, DateTime value, string dateFormat = "DD.MM.YYYY HH:MM:SS") + internal static IXLCell _SetValue(this IXLCell cell, DateTime value, string dateFormat = "DD.MM.YYYY HH:MM:SS", bool? setAllBorders = true) { cell.Value = value; - cell.Style - .SetAllBorders() - .Alignment.WrapText = true; + if (setAllBorders == true) + { + cell.Style + .SetAllBorders() + .Alignment.WrapText = true; + } + cell.Value = value; diff --git a/AsbCloudWebApi/Controllers/AutoGeneratedDailyReportController.cs b/AsbCloudWebApi/Controllers/AutoGeneratedDailyReportController.cs index de26e843..a392bf51 100644 --- a/AsbCloudWebApi/Controllers/AutoGeneratedDailyReportController.cs +++ b/AsbCloudWebApi/Controllers/AutoGeneratedDailyReportController.cs @@ -25,7 +25,8 @@ public class AutoGeneratedDailyReportController : ControllerBase private readonly IAutoGeneratedDailyReportService autoGeneratedDailyReportService; private readonly IWellService wellService; - public AutoGeneratedDailyReportController(IAutoGeneratedDailyReportService autoGeneratedDailyReportService, + public AutoGeneratedDailyReportController( + IAutoGeneratedDailyReportService autoGeneratedDailyReportService, IWellService wellService) { this.autoGeneratedDailyReportService = autoGeneratedDailyReportService; @@ -66,7 +67,7 @@ public class AutoGeneratedDailyReportController : ControllerBase [HttpGet("all")] [ProducesResponseType(typeof(PaginationContainer), (int)HttpStatusCode.OK)] public async Task GetListAsync([FromRoute][Required] int idWell, - [FromQuery] AutoGeneratedDailyReportRequest request, + [FromQuery] FileReportRequest request, CancellationToken cancellationToken) { if (!await CanUserAccessToWellAsync(idWell, cancellationToken)) diff --git a/AsbCloudWebApi/Controllers/DrillTestsReportController.cs b/AsbCloudWebApi/Controllers/DrillTestsReportController.cs new file mode 100644 index 00000000..5f5f6b20 --- /dev/null +++ b/AsbCloudWebApi/Controllers/DrillTestsReportController.cs @@ -0,0 +1,84 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.AutogeneratedDailyReport; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; +using System.Net; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudWebApi.Controllers; + +///

+/// Контроллер для drill_test отчётов +/// +[ApiController] +[Route("api/well/{idWell}/[controller]")] +[Authorize] +public class DrillTestsReportController : ControllerBase +{ + private readonly IDrillTestReportService drillTestReportService; + private readonly IWellService wellService; + + public DrillTestsReportController(IDrillTestReportService drillTestReportService, + IWellService wellService) + { + this.drillTestReportService = drillTestReportService; + this.wellService = wellService; + } + + /// + /// Формирование отчёта + /// + /// Id скважины + /// Ключ entity test записи + /// + /// + [HttpGet] + [ProducesResponseType(typeof(PhysicalFileResult), (int)HttpStatusCode.OK, "application/octet-stream")] + [ProducesResponseType(StatusCodes.Status204NoContent)] + public async Task GenerateReportAsync([FromRoute] int idWell, + [FromQuery] int id, + CancellationToken cancellationToken) + { + if (!await CanUserAccessToWellAsync(idWell, cancellationToken)) + return Forbid(); + + var reportFile = await drillTestReportService.GenerateAsync(idWell, id, cancellationToken); + + return File(reportFile.stream, "application/octet-stream", reportFile.fileName); + } + + /// + /// Список файлов drill test отчётов + /// + /// Id скважины + /// Параметры запроса + /// + /// + [HttpGet("all")] + [ProducesResponseType(typeof(PaginationContainer), (int)HttpStatusCode.OK)] + public async Task GetListAsync([FromRoute][Required] int idWell, + [FromQuery] FileReportRequest request, + CancellationToken cancellationToken) + { + if (!await CanUserAccessToWellAsync(idWell, cancellationToken)) + return Forbid(); + + var reports = await drillTestReportService.GetListAsync(idWell, + request, + cancellationToken); + + return Ok(reports); + } + + private async Task CanUserAccessToWellAsync(int idWell, CancellationToken cancellationToken) + { + int? idCompany = User.GetCompanyId(); + return idCompany is not null && await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, + idWell, cancellationToken).ConfigureAwait(false); + } +} \ No newline at end of file