diff --git a/AsbCloudApp/Requests/ParserOptions/WellRelatedParserRequest.cs b/AsbCloudApp/Requests/ParserOptions/WellRelatedParserRequest.cs new file mode 100644 index 00000000..3ffbf4d5 --- /dev/null +++ b/AsbCloudApp/Requests/ParserOptions/WellRelatedParserRequest.cs @@ -0,0 +1,21 @@ +namespace AsbCloudApp.Requests.ParserOptions; + +/// +/// Параметры парсинга +/// +public class WellRelatedParserRequest : IParserOptionsRequest +{ + /// + /// Конструктор + /// + /// Id скважины + public WellRelatedParserRequest(int idWell) + { + IdWell = idWell; + } + + /// + /// Id скважины + /// + public int IdWell { get; } +} \ No newline at end of file diff --git a/AsbCloudApp/Services/IParserService.cs b/AsbCloudApp/Services/IParserService.cs index 8c01af5a..6fa095cd 100644 --- a/AsbCloudApp/Services/IParserService.cs +++ b/AsbCloudApp/Services/IParserService.cs @@ -8,8 +8,10 @@ namespace AsbCloudApp.Services; /// Сервис парсинга /// /// -public interface IParserService : IParserService +/// +public interface IParserService : IParserService where TDto : class, IId + where TOptions : IParserOptionsRequest { /// /// Распарсить файл @@ -17,8 +19,7 @@ public interface IParserService : IParserService /// /// /// - ParserResultDto Parse(Stream file, TOptions options) - where TOptions : IParserOptionsRequest; + ParserResultDto Parse(Stream file, TOptions options); /// /// Получение шаблона для заполнения diff --git a/AsbCloudInfrastructure/Services/Parser/ParserExcelService.cs b/AsbCloudInfrastructure/Services/Parser/ParserExcelService.cs index 661c729f..13c621af 100644 --- a/AsbCloudInfrastructure/Services/Parser/ParserExcelService.cs +++ b/AsbCloudInfrastructure/Services/Parser/ParserExcelService.cs @@ -12,8 +12,9 @@ using Mapster; namespace AsbCloudInfrastructure.Services.Parser; -public abstract class ParserExcelService : IParserService +public abstract class ParserExcelService : IParserService where TDto : class, IValidatableObject, IId + where TOptions : IParserOptionsRequest { protected abstract string SheetName { get; } @@ -22,9 +23,8 @@ public abstract class ParserExcelService : IParserService protected abstract string TemplateFileName { get; } protected abstract IDictionary Cells { get; } - - public virtual ParserResultDto Parse(Stream file, TOptions options) - where TOptions : IParserOptionsRequest + + public virtual ParserResultDto Parse(Stream file, TOptions options) { using var workbook = new XLWorkbook(file); var sheet = workbook.GetWorksheet(SheetName); diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanDrillingParser.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanDrillingParser.cs index c1717db1..f4e829fc 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanDrillingParser.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanDrillingParser.cs @@ -6,7 +6,6 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Repositories; using AsbCloudInfrastructure.Services.Parser; -using Microsoft.Extensions.DependencyInjection; namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Parser; diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanParser.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanParser.cs index 1686779b..effe7ef6 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanParser.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanParser.cs @@ -1,14 +1,26 @@ -using System; +using System.IO; +using AsbCloudApp.Data; using AsbCloudApp.Data.ProcessMaps; +using AsbCloudApp.Requests.ParserOptions; using AsbCloudInfrastructure.Services.Parser; namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Parser; -public abstract class ProcessMapPlanParser : ParserExcelService +public abstract class ProcessMapPlanParser : ParserExcelService where TDto : ProcessMapPlanBaseDto { protected override int HeaderRowsCount => 2; + public override ParserResultDto Parse(Stream file, WellRelatedParserRequest options) + { + var result = base.Parse(file, options); + + foreach (var item in result.Item) + item.Item.IdWell = options.IdWell; + + return result; + } + protected static int? GetIdMode(string? modeName) => modeName?.Trim().ToLower() switch { diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanReamParser.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanReamParser.cs index 20aca5ed..6ca31714 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanReamParser.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanReamParser.cs @@ -22,14 +22,12 @@ public class ProcessMapPlanReamParser : ProcessMapPlanParser "ProcessMapPlanReamTemplate.xlsx"; private const int ColumnSection = 1; - private const int ColumnMode = 2; - + protected override IDictionary Cells => new Dictionary { { nameof(ProcessMapPlanReamDto.Section), new Cell(ColumnSection, typeof(string)) }, { nameof(ProcessMapPlanReamDto.DepthStart), new Cell(2, typeof(double)) }, { nameof(ProcessMapPlanReamDto.DepthEnd), new Cell(3, typeof(double)) }, - { nameof(ProcessMapPlanReamDto.Repeats), new Cell(4, typeof(double)) }, { nameof(ProcessMapPlanReamDto.SpinUpward), new Cell(5, typeof(double)) }, { nameof(ProcessMapPlanReamDto.SpinUpward), new Cell(6, typeof(double)) }, diff --git a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryFactManualParser.cs b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryFactManualParser.cs index 5de4e2c5..cf4b7118 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryFactManualParser.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryFactManualParser.cs @@ -4,12 +4,10 @@ using AsbCloudInfrastructure.Services.Parser; namespace AsbCloudInfrastructure.Services.Trajectory.Parser; -public class TrajectoryFactManualParser : ParserExcelService +public class TrajectoryFactManualParser : TrajectoryParser { protected override string SheetName => "Фактическая траектория"; - - protected override int HeaderRowsCount => 2; - + protected override string TemplateFileName => "TrajectoryFactManualTemplate.xlsx"; protected override IDictionary Cells => new Dictionary diff --git a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryParser.cs b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryParser.cs new file mode 100644 index 00000000..ce579fa6 --- /dev/null +++ b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryParser.cs @@ -0,0 +1,23 @@ +using System.IO; +using AsbCloudApp.Data; +using AsbCloudApp.Data.Trajectory; +using AsbCloudApp.Requests.ParserOptions; +using AsbCloudInfrastructure.Services.Parser; + +namespace AsbCloudInfrastructure.Services.Trajectory.Parser; + +public abstract class TrajectoryParser : ParserExcelService + where TDto : TrajectoryGeoDto +{ + protected override int HeaderRowsCount => 2; + + public override ParserResultDto Parse(Stream file, WellRelatedParserRequest options) + { + var result = base.Parse(file, options); + + foreach (var item in result.Item) + item.Item.IdWell = options.IdWell; + + return result; + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryPlanParser.cs b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryPlanParser.cs index 4c100766..568bfa35 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryPlanParser.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryPlanParser.cs @@ -4,12 +4,10 @@ using AsbCloudInfrastructure.Services.Parser; namespace AsbCloudInfrastructure.Services.Trajectory.Parser; -public class TrajectoryPlanParser : ParserExcelService +public class TrajectoryPlanParser : TrajectoryParser { protected override string SheetName => "Плановая траектория"; - - protected override int HeaderRowsCount => 2; - + protected override string TemplateFileName => "TrajectoryPlanTemplate.xlsx"; protected override IDictionary Cells => new Dictionary diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs index 2a151573..93ce768b 100644 --- a/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs +++ b/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs @@ -35,5 +35,5 @@ public interface IProcessMapPlanDrillingClient [Multipart] [Post(BaseRoute + "/parse")] - Task>> Parse(int idWell, [AliasAs("files")] IEnumerable streams); + Task>> Parse(int idWell, [AliasAs("file")] StreamPart stream); } diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs index 0ff8bb97..3a5815e9 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs @@ -571,10 +571,10 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest //arrange const string fileName = "ProcessMapPlanDrillingValid.xlsx"; var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); - - //act var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); - var response = await client.Parse(Defaults.Wells[0].Id, new[] { streamPart }); + + //act + var response = await client.Parse(Defaults.Wells[0].Id, streamPart); //assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -589,9 +589,8 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest var dtoActual = row.Item; Assert.True(row.IsValid); - - var excludeProps = new[] { nameof(ProcessMapPlanDrillingDto.IdWell) }; - MatchHelper.Match(dto, dtoActual, excludeProps); + + MatchHelper.Match(dto, dtoActual); } [Fact] @@ -600,11 +599,12 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest //arrange const string fileName = "ProcessMapPlanDrillingInvalid.xlsx"; var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); + var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); //act - var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); - var response = await client.Parse(Defaults.Wells[0].Id, new[] { streamPart }); + var response = await client.Parse(Defaults.Wells[0].Id, streamPart); + //assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var parserResult = response.Content; diff --git a/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryParserTest.cs b/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryParserTest.cs index 8921d982..8b9bd3e9 100644 --- a/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryParserTest.cs +++ b/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryParserTest.cs @@ -11,9 +11,11 @@ public class TrajectoryParserTest { private const string UsingTemplateFile = "AsbCloudWebApi.Tests.Services.Trajectory.Templates"; + private readonly WellRelatedParserRequest options = new(1); + private readonly TrajectoryPlanParser trajectoryPlanParser = new(); private readonly TrajectoryFactManualParser trajectoryFactManualParser = new(); - + [Fact] public void Parse_trajectory_plan() { @@ -22,8 +24,8 @@ public class TrajectoryParserTest if (stream is null) Assert.Fail("Файла для импорта не существует"); - - var trajectoryRows = trajectoryPlanParser.Parse(stream, IParserOptionsRequest.Empty()); + + var trajectoryRows = trajectoryPlanParser.Parse(stream, options); Assert.Equal(3, trajectoryRows.Item.Count()); } @@ -37,7 +39,7 @@ public class TrajectoryParserTest if (stream is null) Assert.Fail("Файла для импорта не существует"); - var trajectoryRows = trajectoryFactManualParser.Parse(stream, IParserOptionsRequest.Empty()); + var trajectoryRows = trajectoryFactManualParser.Parse(stream, options); Assert.Equal(4, trajectoryRows.Item.Count()); } diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index 45da7f11..49513f2c 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -30,11 +30,11 @@ public abstract class ProcessMapPlanBaseController : ControllerBase { private readonly IChangeLogRepository repository; private readonly IWellService wellService; - private readonly ParserExcelService parserService; + private readonly ParserExcelService parserService; protected ProcessMapPlanBaseController(IChangeLogRepository repository, IWellService wellService, - ParserExcelService parserService) + ParserExcelService parserService) { this.repository = repository; this.wellService = wellService; @@ -213,7 +213,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] public async Task>> Parse(int idWell, - [Required] IFormFile file, + [Required] IFormFile file, CancellationToken token) { await AssertUserHasAccessToWell(idWell, token); @@ -222,9 +222,8 @@ public abstract class ProcessMapPlanBaseController : ControllerBase try { - var dto = parserService.Parse(stream, IParserOptionsRequest.Empty()); - foreach (var item in dto.Item) - item.Item.IdWell = idWell; + var options = new WellRelatedParserRequest(idWell); + var dto = parserService.Parse(stream, options); return Ok(dto); } diff --git a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs index 344ed707..814bcdcf 100644 --- a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs +++ b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs @@ -13,6 +13,7 @@ using System.Threading.Tasks; using AsbCloudApp.Data; using AsbCloudApp.Requests.ParserOptions; using AsbCloudInfrastructure.Services.Parser; +using AsbCloudInfrastructure.Services.Trajectory.Parser; namespace AsbCloudWebApi.Controllers.Trajectory { @@ -25,11 +26,11 @@ namespace AsbCloudWebApi.Controllers.Trajectory public abstract class TrajectoryEditableController : TrajectoryController where TDto : TrajectoryGeoDto { - private readonly ParserExcelService parserService; + private readonly TrajectoryParser parserService; private readonly ITrajectoryEditableRepository trajectoryRepository; protected TrajectoryEditableController(IWellService wellService, - ParserExcelService parserService, + TrajectoryParser parserService, TrajectoryExportService trajectoryExportService, ITrajectoryEditableRepository trajectoryRepository) : base(wellService, trajectoryExportService, trajectoryRepository) @@ -78,7 +79,9 @@ namespace AsbCloudWebApi.Controllers.Trajectory try { - var dto = parserService.Parse(stream, IParserOptionsRequest.Empty()); + var options = new WellRelatedParserRequest(idWell); + var dto = parserService.Parse(stream, options); + return Ok(dto); } catch (FileFormatException ex)