Рефакторинг сервисов

This commit is contained in:
Степанов Дмитрий 2024-03-14 13:18:02 +03:00
parent e3a7767a41
commit bc4d52200d
12 changed files with 80 additions and 68 deletions

View File

@ -3,17 +3,35 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using AsbCloudApp.Requests.ExportOptions;
using AsbCloudApp.Services;
using AsbCloudInfrastructure.Services.ExcelServices.Templates; using AsbCloudInfrastructure.Services.ExcelServices.Templates;
using ClosedXML.Excel; using ClosedXML.Excel;
using Mapster; using Mapster;
namespace AsbCloudInfrastructure.Services.ExcelServices; namespace AsbCloudInfrastructure.Services.ExcelServices;
public abstract class ExportExcelService<TDto> public abstract class ExportExcelService<TDto, TOptions> : IExportService<TOptions>
where TOptions : IExportOptionsRequest
{ {
protected abstract ITemplateParameters TemplateParameters { get; } protected abstract ITemplateParameters TemplateParameters { get; }
protected Stream Export(IEnumerable<TDto> dtos) protected abstract Task<string> BuildFileNameAsync(TOptions options, CancellationToken token);
protected abstract Task<IEnumerable<TDto>> GetDtosAsync(TOptions options, CancellationToken token);
public async Task<(string FileName, Stream File)> ExportAsync(TOptions options, CancellationToken token)
{
var dtos = await GetDtosAsync(options, token);
var fileName = await BuildFileNameAsync(options, token);
var file = BuildFile(dtos);
return (fileName, file);
}
private Stream BuildFile(IEnumerable<TDto> dtos)
{ {
using var template = GetTemplateFile(); using var template = GetTemplateFile();
using var workbook = new XLWorkbook(template); using var workbook = new XLWorkbook(template);

View File

@ -6,6 +6,7 @@ using System.Threading.Tasks;
using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Data.ProcessMaps;
using AsbCloudApp.Repositories; using AsbCloudApp.Repositories;
using AsbCloudApp.Requests; using AsbCloudApp.Requests;
using AsbCloudApp.Requests.ExportOptions;
using AsbCloudApp.Services; using AsbCloudApp.Services;
using AsbCloudInfrastructure.Services.ExcelServices.Templates; using AsbCloudInfrastructure.Services.ExcelServices.Templates;
using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates; using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates;
@ -23,16 +24,17 @@ public class ProcessMapPlanDrillingExportService : ProcessMapPlanExportService<P
protected override ITemplateParameters TemplateParameters => new ProcessMapPlanDrillingTemplate(); protected override ITemplateParameters TemplateParameters => new ProcessMapPlanDrillingTemplate();
protected override async Task<string> BuildFileNameAsync(int idWell, CancellationToken token) protected override async Task<string> BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token)
{ {
var caption = await wellService.GetWellCaptionByIdAsync(idWell, token); var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token);
return $"{caption}_РТК_План_бурение.xlsx"; return $"{caption}_РТК_План_бурение.xlsx";
} }
protected override async Task<IEnumerable<ProcessMapPlanDrillingDto>> GetProcessMapPlanAsync(int idWell, CancellationToken token) protected override async Task<IEnumerable<ProcessMapPlanDrillingDto>> GetDtosAsync(WellRelatedExportRequest options,
CancellationToken token)
{ {
var dtos = await base.GetProcessMapPlanAsync(idWell, token); var dtos = await base.GetDtosAsync(options, token);
var dtosWithMode = dtos.Select(dto => var dtosWithMode = dtos.Select(dto =>
{ {
dto.Mode = dto.IdMode switch dto.Mode = dto.IdMode switch

View File

@ -1,17 +1,16 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using AsbCloudApp.Data; using AsbCloudApp.Data;
using AsbCloudApp.Repositories; using AsbCloudApp.Repositories;
using AsbCloudApp.Requests; using AsbCloudApp.Requests;
using AsbCloudApp.Requests.ExportOptions;
using AsbCloudApp.Services; using AsbCloudApp.Services;
using AsbCloudInfrastructure.Services.ExcelServices; using AsbCloudInfrastructure.Services.ExcelServices;
namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export; namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export;
public abstract class ProcessMapPlanExportService<TDto> : ExportExcelService<TDto>, public abstract class ProcessMapPlanExportService<TDto> : ExportExcelService<TDto, WellRelatedExportRequest>
IProcessMapPlanExportService
where TDto : ChangeLogAbstract where TDto : ChangeLogAbstract
{ {
protected readonly IWellService wellService; protected readonly IWellService wellService;
@ -25,20 +24,9 @@ public abstract class ProcessMapPlanExportService<TDto> : ExportExcelService<TDt
this.wellService = wellService; this.wellService = wellService;
} }
public async Task<(string FileName, Stream File)> ExportAsync(int idWell, CancellationToken token) protected override async Task<IEnumerable<TDto>> GetDtosAsync(WellRelatedExportRequest options, CancellationToken token)
{ {
var dtos = await GetProcessMapPlanAsync(idWell, token); var request = new ProcessMapPlanBaseRequestWithWell(options.IdWell);
var fileName = await BuildFileNameAsync(idWell, token);
var file = Export(dtos);
return (fileName, file);
}
protected abstract Task<string> BuildFileNameAsync(int idWell, CancellationToken token);
protected virtual async Task<IEnumerable<TDto>> GetProcessMapPlanAsync(int idWell, CancellationToken token)
{
var request = new ProcessMapPlanBaseRequestWithWell(idWell);
var dtos = await processMapPlanRepository.Get(request, token); var dtos = await processMapPlanRepository.Get(request, token);
return dtos; return dtos;
} }

View File

@ -3,6 +3,7 @@ using System.Threading.Tasks;
using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Data.ProcessMaps;
using AsbCloudApp.Repositories; using AsbCloudApp.Repositories;
using AsbCloudApp.Requests; using AsbCloudApp.Requests;
using AsbCloudApp.Requests.ExportOptions;
using AsbCloudApp.Services; using AsbCloudApp.Services;
using AsbCloudInfrastructure.Services.ExcelServices.Templates; using AsbCloudInfrastructure.Services.ExcelServices.Templates;
using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates; using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates;
@ -20,9 +21,9 @@ public class ProcessMapPlanReamExportService : ProcessMapPlanExportService<Proce
{ {
} }
protected override async Task<string> BuildFileNameAsync(int idWell, CancellationToken token) protected override async Task<string> BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token)
{ {
var caption = await wellService.GetWellCaptionByIdAsync(idWell, token); var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token);
return $"{caption}_РТК_План_проработка.xlsx"; return $"{caption}_РТК_План_проработка.xlsx";
} }

View File

@ -1,15 +1,15 @@
using AsbCloudApp.Data.Trajectory; using System.Collections.Generic;
using AsbCloudApp.Data.Trajectory;
using AsbCloudApp.Repositories; using AsbCloudApp.Repositories;
using AsbCloudApp.Services; using AsbCloudApp.Services;
using System.IO;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using AsbCloudApp.Requests.ExportOptions;
using AsbCloudInfrastructure.Services.ExcelServices; using AsbCloudInfrastructure.Services.ExcelServices;
namespace AsbCloudInfrastructure.Services.Trajectory.Export; namespace AsbCloudInfrastructure.Services.Trajectory.Export;
public abstract class TrajectoryExportService<TDto> : ExportExcelService<TDto>, public abstract class TrajectoryExportService<TDto> : ExportExcelService<TDto, WellRelatedExportRequest>
ITrajectoryExportService
where TDto : TrajectoryGeoDto where TDto : TrajectoryGeoDto
{ {
protected readonly IWellService wellService; protected readonly IWellService wellService;
@ -22,14 +22,6 @@ public abstract class TrajectoryExportService<TDto> : ExportExcelService<TDto>,
this.trajectoryRepository = trajectoryRepository; this.trajectoryRepository = trajectoryRepository;
} }
public async Task<(string FileName, Stream File)> ExportAsync(int idWell, CancellationToken token) protected override Task<IEnumerable<TDto>> GetDtosAsync(WellRelatedExportRequest options, CancellationToken token) =>
{ trajectoryRepository.GetAsync(options.IdWell, token);
var dtos = await trajectoryRepository.GetAsync(idWell, token);
var fileName = await BuildFileNameAsync(idWell, token);
var file = Export(dtos);
return (fileName, file);
}
protected abstract Task<string> BuildFileNameAsync(int idWell, CancellationToken token);
} }

View File

@ -2,6 +2,7 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Data.Trajectory;
using AsbCloudApp.Repositories; using AsbCloudApp.Repositories;
using AsbCloudApp.Requests.ExportOptions;
using AsbCloudApp.Services; using AsbCloudApp.Services;
using AsbCloudInfrastructure.Services.ExcelServices.Templates; using AsbCloudInfrastructure.Services.ExcelServices.Templates;
using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates; using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates;
@ -18,9 +19,9 @@ public class TrajectoryFactManualExportService : TrajectoryExportService<Traject
protected override ITemplateParameters TemplateParameters => new TrajectoryFactManualTemplate(); protected override ITemplateParameters TemplateParameters => new TrajectoryFactManualTemplate();
protected override async Task<string> BuildFileNameAsync(int idWell, CancellationToken token) protected override async Task<string> BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token)
{ {
var caption = await wellService.GetWellCaptionByIdAsync(idWell, token); var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token);
return $"{caption}_Фактическая_траектория.xlsx"; return $"{caption}_Фактическая_траектория.xlsx";
} }

View File

@ -2,6 +2,7 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Data.Trajectory;
using AsbCloudApp.Repositories; using AsbCloudApp.Repositories;
using AsbCloudApp.Requests.ExportOptions;
using AsbCloudApp.Services; using AsbCloudApp.Services;
using AsbCloudInfrastructure.Services.ExcelServices.Templates; using AsbCloudInfrastructure.Services.ExcelServices.Templates;
using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates; using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates;
@ -18,9 +19,9 @@ public class TrajectoryFactNnbExportService : TrajectoryExportService<Trajectory
protected override ITemplateParameters TemplateParameters => new TrajectoryFactNnbTemplate(); protected override ITemplateParameters TemplateParameters => new TrajectoryFactNnbTemplate();
protected override async Task<string> BuildFileNameAsync(int idWell, CancellationToken token) protected override async Task<string> BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token)
{ {
var caption = await wellService.GetWellCaptionByIdAsync(idWell, token); var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token);
return $"{caption}_Траектория_ННБ.xlsx"; return $"{caption}_Траектория_ННБ.xlsx";
} }

View File

@ -2,6 +2,7 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Data.Trajectory;
using AsbCloudApp.Repositories; using AsbCloudApp.Repositories;
using AsbCloudApp.Requests.ExportOptions;
using AsbCloudApp.Services; using AsbCloudApp.Services;
using AsbCloudInfrastructure.Services.ExcelServices.Templates; using AsbCloudInfrastructure.Services.ExcelServices.Templates;
using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates; using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates;
@ -18,9 +19,9 @@ public class TrajectoryPlanExportService : TrajectoryExportService<TrajectoryGeo
protected override ITemplateParameters TemplateParameters => new TrajectoryPlanTemplate(); protected override ITemplateParameters TemplateParameters => new TrajectoryPlanTemplate();
protected override async Task<string> BuildFileNameAsync(int idWell, CancellationToken token) protected override async Task<string> BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token)
{ {
var caption = await wellService.GetWellCaptionByIdAsync(idWell, token); var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token);
return $"{caption}_Плановая_Траектория.xlsx"; return $"{caption}_Плановая_Траектория.xlsx";
} }

View File

@ -6,12 +6,15 @@ using NSubstitute;
using System; using System;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using AsbCloudApp.Requests.ExportOptions;
using Xunit; using Xunit;
namespace AsbCloudWebApi.Tests.Services.Trajectory namespace AsbCloudWebApi.Tests.Services.Trajectory
{ {
public class TrajectoryExportTest public class TrajectoryExportTest
{ {
private const int idWell = 4;
private IWellService wellService; private IWellService wellService;
private readonly ITrajectoryEditableRepository<TrajectoryGeoPlanDto> trajectoryPlanRepository; private readonly ITrajectoryEditableRepository<TrajectoryGeoPlanDto> trajectoryPlanRepository;
private readonly TrajectoryPlanExportService trajectoryPlanExportService; private readonly TrajectoryPlanExportService trajectoryPlanExportService;
@ -22,8 +25,6 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory
private readonly ITrajectoryNnbRepository trajectoryFactNnbRepository; private readonly ITrajectoryNnbRepository trajectoryFactNnbRepository;
private readonly TrajectoryFactNnbExportService trajectoryFactNnbExportService; private readonly TrajectoryFactNnbExportService trajectoryFactNnbExportService;
private readonly int idWell = 4;
private readonly TrajectoryGeoPlanDto[] trajectoryPlanRows = new TrajectoryGeoPlanDto[2] { private readonly TrajectoryGeoPlanDto[] trajectoryPlanRows = new TrajectoryGeoPlanDto[2] {
new TrajectoryGeoPlanDto() { new TrajectoryGeoPlanDto() {
Id = 1, Id = 1,
@ -80,6 +81,8 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory
}, },
}; };
private readonly WellRelatedExportRequest exportOptions = new(idWell);
public TrajectoryExportTest() public TrajectoryExportTest()
{ {
wellService = Substitute.For<IWellService>(); wellService = Substitute.For<IWellService>();
@ -99,9 +102,8 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory
trajectoryPlanRepository.GetAsync(idWell, CancellationToken.None) trajectoryPlanRepository.GetAsync(idWell, CancellationToken.None)
.Returns(trajectoryPlanRows); .Returns(trajectoryPlanRows);
var stream = await trajectoryPlanExportService.ExportAsync(idWell, CancellationToken.None); var stream = await trajectoryPlanExportService.ExportAsync(exportOptions, CancellationToken.None);
Assert.True(stream.File.Length > 0); Assert.True(stream.File.Length > 0);
} }
[Fact] [Fact]
@ -110,7 +112,7 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory
trajectoryFactManualReposirory.GetAsync(idWell, CancellationToken.None) trajectoryFactManualReposirory.GetAsync(idWell, CancellationToken.None)
.Returns(trajectoryFactRows); .Returns(trajectoryFactRows);
var stream = await trajectoryFactManualExportService.ExportAsync(idWell, CancellationToken.None); var stream = await trajectoryFactManualExportService.ExportAsync(exportOptions, CancellationToken.None);
Assert.True(stream.File.Length > 0); Assert.True(stream.File.Length > 0);
} }
@ -120,7 +122,7 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory
trajectoryFactNnbRepository.GetAsync(idWell, CancellationToken.None) trajectoryFactNnbRepository.GetAsync(idWell, CancellationToken.None)
.Returns(trajectoryFactRows); .Returns(trajectoryFactRows);
var stream = await trajectoryFactNnbExportService.ExportAsync(idWell, CancellationToken.None); var stream = await trajectoryFactNnbExportService.ExportAsync(exportOptions, CancellationToken.None);
Assert.True(stream.File.Length > 0); Assert.True(stream.File.Length > 0);
} }
} }

View File

@ -15,6 +15,7 @@ using AsbCloudApp.Data;
using AsbCloudApp.Requests.ParserOptions; using AsbCloudApp.Requests.ParserOptions;
using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Data.ProcessMaps;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using AsbCloudApp.Requests.ExportOptions;
namespace AsbCloudWebApi.Controllers.ProcessMaps; namespace AsbCloudWebApi.Controllers.ProcessMaps;
@ -30,12 +31,12 @@ public abstract class ProcessMapPlanBaseController<TDto> : ControllerBase
private readonly IChangeLogRepository<TDto, ProcessMapPlanBaseRequestWithWell> repository; private readonly IChangeLogRepository<TDto, ProcessMapPlanBaseRequestWithWell> repository;
private readonly IWellService wellService; private readonly IWellService wellService;
private readonly IParserService<TDto, WellRelatedParserRequest> parserService; private readonly IParserService<TDto, WellRelatedParserRequest> parserService;
private readonly IProcessMapPlanExportService processMapPlanExportService; private readonly IExportService<WellRelatedExportRequest> processMapPlanExportService;
protected ProcessMapPlanBaseController(IChangeLogRepository<TDto, ProcessMapPlanBaseRequestWithWell> repository, protected ProcessMapPlanBaseController(IChangeLogRepository<TDto, ProcessMapPlanBaseRequestWithWell> repository,
IWellService wellService, IWellService wellService,
IParserService<TDto, WellRelatedParserRequest> parserService, IParserService<TDto, WellRelatedParserRequest> parserService,
IProcessMapPlanExportService processMapPlanExportService) IExportService<WellRelatedExportRequest> processMapPlanExportService)
{ {
this.repository = repository; this.repository = repository;
this.wellService = wellService; this.wellService = wellService;
@ -280,7 +281,8 @@ public abstract class ProcessMapPlanBaseController<TDto> : ControllerBase
[ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status204NoContent)]
public async Task<IActionResult> ExportAsync([FromRoute] int idWell, CancellationToken token) public async Task<IActionResult> ExportAsync([FromRoute] int idWell, CancellationToken token)
{ {
var (fileName, file) = await processMapPlanExportService.ExportAsync(idWell, token); var exportOptions = new WellRelatedExportRequest(idWell);
var (fileName, file) = await processMapPlanExportService.ExportAsync(exportOptions, token);
return File(file, "application/octet-stream", fileName); return File(file, "application/octet-stream", fileName);
} }

View File

@ -7,6 +7,8 @@ using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using AsbCloudApp.Requests.ExportOptions;
using AsbCloudInfrastructure.Services.Trajectory.Export;
namespace AsbCloudWebApi.Controllers.Trajectory namespace AsbCloudWebApi.Controllers.Trajectory
{ {
@ -22,11 +24,11 @@ namespace AsbCloudWebApi.Controllers.Trajectory
protected abstract string TemplateFileName { get; } protected abstract string TemplateFileName { get; }
private readonly IWellService wellService; private readonly IWellService wellService;
private readonly ITrajectoryExportService trajectoryExportService; private readonly TrajectoryExportService<TDto> trajectoryExportService;
private readonly ITrajectoryRepository<TDto> trajectoryRepository; private readonly ITrajectoryRepository<TDto> trajectoryRepository;
protected TrajectoryController(IWellService wellService, protected TrajectoryController(IWellService wellService,
ITrajectoryExportService trajectoryExportService, TrajectoryExportService<TDto> trajectoryExportService,
ITrajectoryRepository<TDto> trajectoryRepository) ITrajectoryRepository<TDto> trajectoryRepository)
{ {
this.trajectoryExportService = trajectoryExportService; this.trajectoryExportService = trajectoryExportService;
@ -49,7 +51,8 @@ namespace AsbCloudWebApi.Controllers.Trajectory
token).ConfigureAwait(false)) token).ConfigureAwait(false))
return Forbid(); return Forbid();
var (fileName, file) = await trajectoryExportService.ExportAsync(idWell, token); var exportOptions = new WellRelatedExportRequest(idWell);
var (fileName, file) = await trajectoryExportService.ExportAsync(exportOptions, token);
return File(file, "application/octet-stream", fileName); return File(file, "application/octet-stream", fileName);
} }

View File

@ -10,6 +10,7 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using AsbCloudApp.Data; using AsbCloudApp.Data;
using AsbCloudApp.Requests.ParserOptions; using AsbCloudApp.Requests.ParserOptions;
using AsbCloudInfrastructure.Services.Trajectory.Export;
namespace AsbCloudWebApi.Controllers.Trajectory namespace AsbCloudWebApi.Controllers.Trajectory
{ {
@ -27,7 +28,7 @@ namespace AsbCloudWebApi.Controllers.Trajectory
protected TrajectoryEditableController(IWellService wellService, protected TrajectoryEditableController(IWellService wellService,
IParserService<TDto, WellRelatedParserRequest> parserService, IParserService<TDto, WellRelatedParserRequest> parserService,
ITrajectoryExportService trajectoryExportService, TrajectoryExportService<TDto> trajectoryExportService,
ITrajectoryEditableRepository<TDto> trajectoryRepository) ITrajectoryEditableRepository<TDto> trajectoryRepository)
: base(wellService, trajectoryExportService, trajectoryRepository) : base(wellService, trajectoryExportService, trajectoryRepository)
{ {