From e6329b76da04b4ff6ee65b6ab3470461c2ac2e50 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 28 Nov 2023 15:54:47 +0500 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D0=BB=D0=B5=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/PlanFactDto.cs | 9 +- .../TrajectoryCartesianFactDto.cs | 2 +- .../TrajectoryCartesianPlanDto.cs | 4 +- .../Data/{ => Trajectory}/TrajectoryGeoDto.cs | 6 +- .../{ => Trajectory}/TrajectoryGeoFactDto.cs | 9 +- .../{ => Trajectory}/TrajectoryGeoPlanDto.cs | 5 +- .../Data/Trajectory/TrajectoryPlanFactDto.cs | 25 + .../ITrajectoryEditableRepository.cs | 2 +- .../Repositories/ITrajectoryNnbRepository.cs | 2 +- .../Repositories/ITrajectoryRepository.cs | 2 +- ...303_Add_Permissions_For_Trajectory_Fact.cs | 14 +- ...0948_Add_Fact_Trajectory_Table.Designer.cs | 2 +- ...0231115120948_Add_Fact_Trajectory_Table.cs | 21 +- ...4844_Add_Permissions_For_Trajectory_Nnb.cs | 35 -- ...7_Update_t_planned_trajectory.Designer.cs} | 486 ++++++++++-------- ...31127114017_Update_t_planned_trajectory.cs | 109 ++++ .../AsbCloudDbContextModelSnapshot.cs | 373 +++++++------- AsbCloudDb/Model/AsbCloudDbContext.cs | 4 +- .../DefaultData/EntityFillerPermission.cs | 4 +- AsbCloudDb/Model/IAsbCloudDbContext.cs | 4 +- .../Model/Trajectory/PlannedTrajectory.cs | 13 - AsbCloudDb/Model/Trajectory/Trajectory.cs | 5 +- .../{FactTrajectory.cs => TrajectoryFact.cs} | 4 +- .../Model/Trajectory/TrajectoryPlanned.cs | 12 + .../AsbCloudInfrastructure.csproj | 7 +- AsbCloudInfrastructure/DependencyInjection.cs | 16 +- .../TrajectoryEditableRepository.cs | 2 +- .../Repository/TrajectoryNnbRepository.cs | 2 +- .../TrajectoryExportService.cs} | 106 +--- .../TrajectoryFactManualExportService.cs | 41 ++ .../Export/TrajectoryFactNnbExportService.cs | 41 ++ .../TrajectoryPlannedExportService.cs} | 42 +- .../TrajectoryFactManualImportService.cs} | 28 +- .../Import/TrajectoryImportService.cs | 92 ++++ .../TrajectoryPlannedImportService.cs} | 27 +- .../Templates/FactTrajectoryTemplate.xlsx | Bin 6885 -> 0 bytes .../Templates/NnbTrajectoryTemplate.xlsx | Bin 11600 -> 0 bytes .../TrajectoryFactManualTemplate.xlsx | Bin 0 -> 6875 bytes .../Templates/TrajectoryFactNnbTemplate.xlsx | Bin 0 -> 6881 bytes ...te.xlsx => TrajectoryPlannedTemplate.xlsx} | Bin .../Services/Trajectory/TrajectoryService.cs | 10 +- .../AsbCloudWebApi.Tests.csproj | 10 + .../TrajectoryFactManualTemplate.xlsx | Bin 0 -> 6962 bytes .../Templates/TrajectoryPlannedTemplate.xlsx | Bin 0 -> 7118 bytes .../Trajectory/TrajectoryExportTest.cs | 128 +++++ .../Trajectory/TrajectoryImportTest.cs | 53 ++ .../TrajectoryVisualizationServiceTest.cs | 8 +- .../Trajectory/NnbTrajectoryController.cs | 80 --- .../Trajectory/TrajectoryController.cs | 178 +------ .../TrajectoryEditableController.cs | 206 ++++++++ ...r.cs => TrajectoryFactManualController.cs} | 14 +- .../Trajectory/TrajectoryFactNnbController.cs | 30 ++ ...ller.cs => TrajectoryPlannedController.cs} | 16 +- 53 files changed, 1325 insertions(+), 964 deletions(-) rename AsbCloudApp/Data/{ => Trajectory}/TrajectoryCartesianFactDto.cs (95%) rename AsbCloudApp/Data/{ => Trajectory}/TrajectoryCartesianPlanDto.cs (83%) rename AsbCloudApp/Data/{ => Trajectory}/TrajectoryGeoDto.cs (91%) rename AsbCloudApp/Data/{ => Trajectory}/TrajectoryGeoFactDto.cs (67%) rename AsbCloudApp/Data/{ => Trajectory}/TrajectoryGeoPlanDto.cs (82%) create mode 100644 AsbCloudApp/Data/Trajectory/TrajectoryPlanFactDto.cs delete mode 100644 AsbCloudDb/Migrations/20231116094844_Add_Permissions_For_Trajectory_Nnb.cs rename AsbCloudDb/Migrations/{20231116094844_Add_Permissions_For_Trajectory_Nnb.Designer.cs => 20231127114017_Update_t_planned_trajectory.Designer.cs} (98%) create mode 100644 AsbCloudDb/Migrations/20231127114017_Update_t_planned_trajectory.cs delete mode 100644 AsbCloudDb/Model/Trajectory/PlannedTrajectory.cs rename AsbCloudDb/Model/Trajectory/{FactTrajectory.cs => TrajectoryFact.cs} (63%) create mode 100644 AsbCloudDb/Model/Trajectory/TrajectoryPlanned.cs rename AsbCloudInfrastructure/Services/Trajectory/{TrajectoryImportService.cs => Export/TrajectoryExportService.cs} (51%) create mode 100644 AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs create mode 100644 AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs rename AsbCloudInfrastructure/Services/Trajectory/{NnbTrajectoryImportService.cs => Export/TrajectoryPlannedExportService.cs} (50%) rename AsbCloudInfrastructure/Services/Trajectory/{FactTrajectoryImportService.cs => Import/TrajectoryFactManualImportService.cs} (55%) create mode 100644 AsbCloudInfrastructure/Services/Trajectory/Import/TrajectoryImportService.cs rename AsbCloudInfrastructure/Services/Trajectory/{PlannedTrajectoryImportService.cs => Import/TrajectoryPlannedImportService.cs} (60%) delete mode 100644 AsbCloudInfrastructure/Services/Trajectory/Templates/FactTrajectoryTemplate.xlsx delete mode 100644 AsbCloudInfrastructure/Services/Trajectory/Templates/NnbTrajectoryTemplate.xlsx create mode 100644 AsbCloudInfrastructure/Services/Trajectory/Templates/TrajectoryFactManualTemplate.xlsx create mode 100644 AsbCloudInfrastructure/Services/Trajectory/Templates/TrajectoryFactNnbTemplate.xlsx rename AsbCloudInfrastructure/Services/Trajectory/Templates/{PlannedTrajectoryTemplate.xlsx => TrajectoryPlannedTemplate.xlsx} (100%) create mode 100644 AsbCloudWebApi.Tests/Services/Trajectory/Templates/TrajectoryFactManualTemplate.xlsx create mode 100644 AsbCloudWebApi.Tests/Services/Trajectory/Templates/TrajectoryPlannedTemplate.xlsx create mode 100644 AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs create mode 100644 AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryImportTest.cs delete mode 100644 AsbCloudWebApi/Controllers/Trajectory/NnbTrajectoryController.cs create mode 100644 AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs rename AsbCloudWebApi/Controllers/Trajectory/{FactTrajectoryController.cs => TrajectoryFactManualController.cs} (52%) create mode 100644 AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactNnbController.cs rename AsbCloudWebApi/Controllers/Trajectory/{PlannedTrajectoryController.cs => TrajectoryPlannedController.cs} (70%) diff --git a/AsbCloudApp/Data/PlanFactDto.cs b/AsbCloudApp/Data/PlanFactDto.cs index 02765309..74c0281b 100644 --- a/AsbCloudApp/Data/PlanFactDto.cs +++ b/AsbCloudApp/Data/PlanFactDto.cs @@ -4,7 +4,7 @@ /// DTO объединяющее плановые и фактические значения /// /// - public class PlanFactDto : PlanFactBase + public class PlanFactDto : PlanFactBase { } @@ -15,7 +15,7 @@ /// /// /// - public class PlanFactBase + public class PlanFactBase { /// /// Плановое значение @@ -26,10 +26,5 @@ /// Фактическое значение /// public V? Fact { get; set; } - - /// - /// Фактическое ннб-значение - /// - public V? Nnb { get; set; } } } diff --git a/AsbCloudApp/Data/TrajectoryCartesianFactDto.cs b/AsbCloudApp/Data/Trajectory/TrajectoryCartesianFactDto.cs similarity index 95% rename from AsbCloudApp/Data/TrajectoryCartesianFactDto.cs rename to AsbCloudApp/Data/Trajectory/TrajectoryCartesianFactDto.cs index 64f3291b..c9df8dfd 100644 --- a/AsbCloudApp/Data/TrajectoryCartesianFactDto.cs +++ b/AsbCloudApp/Data/Trajectory/TrajectoryCartesianFactDto.cs @@ -1,4 +1,4 @@ -namespace AsbCloudApp.Data +namespace AsbCloudApp.Data.Trajectory { diff --git a/AsbCloudApp/Data/TrajectoryCartesianPlanDto.cs b/AsbCloudApp/Data/Trajectory/TrajectoryCartesianPlanDto.cs similarity index 83% rename from AsbCloudApp/Data/TrajectoryCartesianPlanDto.cs rename to AsbCloudApp/Data/Trajectory/TrajectoryCartesianPlanDto.cs index ed7755df..923498eb 100644 --- a/AsbCloudApp/Data/TrajectoryCartesianPlanDto.cs +++ b/AsbCloudApp/Data/Trajectory/TrajectoryCartesianPlanDto.cs @@ -1,7 +1,7 @@ -namespace AsbCloudApp.Data +namespace AsbCloudApp.Data.Trajectory { /// - /// Визуализация траектории 3D для посторения радиуса цели + /// Визуализация траектории 3D для построения радиуса цели /// public class TrajectoryCartesianPlanDto : TrajectoryCartesianFactDto { diff --git a/AsbCloudApp/Data/TrajectoryGeoDto.cs b/AsbCloudApp/Data/Trajectory/TrajectoryGeoDto.cs similarity index 91% rename from AsbCloudApp/Data/TrajectoryGeoDto.cs rename to AsbCloudApp/Data/Trajectory/TrajectoryGeoDto.cs index 3f36aad6..47563011 100644 --- a/AsbCloudApp/Data/TrajectoryGeoDto.cs +++ b/AsbCloudApp/Data/Trajectory/TrajectoryGeoDto.cs @@ -1,10 +1,6 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -namespace AsbCloudApp.Data +namespace AsbCloudApp.Data.Trajectory { /// /// Базовая географическая траектория diff --git a/AsbCloudApp/Data/TrajectoryGeoFactDto.cs b/AsbCloudApp/Data/Trajectory/TrajectoryGeoFactDto.cs similarity index 67% rename from AsbCloudApp/Data/TrajectoryGeoFactDto.cs rename to AsbCloudApp/Data/Trajectory/TrajectoryGeoFactDto.cs index a78811e4..8ab23fc6 100644 --- a/AsbCloudApp/Data/TrajectoryGeoFactDto.cs +++ b/AsbCloudApp/Data/Trajectory/TrajectoryGeoFactDto.cs @@ -1,17 +1,10 @@ -using System; - -namespace AsbCloudApp.Data; +namespace AsbCloudApp.Data.Trajectory; /// /// Формирование данных по фактической географической траектории /// public class TrajectoryGeoFactDto : TrajectoryGeoDto { - /// - /// Радиус цели - /// - public double? Radius { get; set; } - /// /// Комментарии /// diff --git a/AsbCloudApp/Data/TrajectoryGeoPlanDto.cs b/AsbCloudApp/Data/Trajectory/TrajectoryGeoPlanDto.cs similarity index 82% rename from AsbCloudApp/Data/TrajectoryGeoPlanDto.cs rename to AsbCloudApp/Data/Trajectory/TrajectoryGeoPlanDto.cs index ba9ffb86..292add96 100644 --- a/AsbCloudApp/Data/TrajectoryGeoPlanDto.cs +++ b/AsbCloudApp/Data/Trajectory/TrajectoryGeoPlanDto.cs @@ -1,10 +1,11 @@ using System; -namespace AsbCloudApp.Data + +namespace AsbCloudApp.Data.Trajectory { /// /// Формирование данных по плановой географической траектории /// - public class TrajectoryGeoPlanDto: TrajectoryGeoDto + public class TrajectoryGeoPlanDto : TrajectoryGeoDto { /// /// Радиус цели diff --git a/AsbCloudApp/Data/Trajectory/TrajectoryPlanFactDto.cs b/AsbCloudApp/Data/Trajectory/TrajectoryPlanFactDto.cs new file mode 100644 index 00000000..7176f36f --- /dev/null +++ b/AsbCloudApp/Data/Trajectory/TrajectoryPlanFactDto.cs @@ -0,0 +1,25 @@ +namespace AsbCloudApp.Data.Trajectory +{ + /// + /// DTO объединяющее плановые и фактические значения траекторий + /// + /// + /// + public class TrajectoryPlanFactDto + { + /// + /// Плановое значение + /// + public T? Plan { get; set; } + + /// + /// Фактическое значение + /// + public V? FactManual { get; set; } + + /// + /// Фактическое ннб-значение + /// + public V? FactNnb { get; set; } + } +} diff --git a/AsbCloudApp/Repositories/ITrajectoryEditableRepository.cs b/AsbCloudApp/Repositories/ITrajectoryEditableRepository.cs index 58738f83..f1bf0671 100644 --- a/AsbCloudApp/Repositories/ITrajectoryEditableRepository.cs +++ b/AsbCloudApp/Repositories/ITrajectoryEditableRepository.cs @@ -1,4 +1,4 @@ -using AsbCloudApp.Data; +using AsbCloudApp.Data.Trajectory; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; diff --git a/AsbCloudApp/Repositories/ITrajectoryNnbRepository.cs b/AsbCloudApp/Repositories/ITrajectoryNnbRepository.cs index 65a3efcc..6f383fea 100644 --- a/AsbCloudApp/Repositories/ITrajectoryNnbRepository.cs +++ b/AsbCloudApp/Repositories/ITrajectoryNnbRepository.cs @@ -1,4 +1,4 @@ -using AsbCloudApp.Data; +using AsbCloudApp.Data.Trajectory; namespace AsbCloudApp.Repositories { diff --git a/AsbCloudApp/Repositories/ITrajectoryRepository.cs b/AsbCloudApp/Repositories/ITrajectoryRepository.cs index 4202bd0a..ee5df79d 100644 --- a/AsbCloudApp/Repositories/ITrajectoryRepository.cs +++ b/AsbCloudApp/Repositories/ITrajectoryRepository.cs @@ -1,4 +1,4 @@ -using AsbCloudApp.Data; +using AsbCloudApp.Data.Trajectory; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; diff --git a/AsbCloudDb/Migrations/20231115102303_Add_Permissions_For_Trajectory_Fact.cs b/AsbCloudDb/Migrations/20231115102303_Add_Permissions_For_Trajectory_Fact.cs index 27d98155..c3e87ce6 100644 --- a/AsbCloudDb/Migrations/20231115102303_Add_Permissions_For_Trajectory_Fact.cs +++ b/AsbCloudDb/Migrations/20231115102303_Add_Permissions_For_Trajectory_Fact.cs @@ -13,8 +13,7 @@ namespace AsbCloudDb.Migrations columns: new[] { "id", "description", "name" }, values: new object[,] { - { 529, "Разрешение просматривать фактические траектории", "FactTrajectory.get" }, - { 530, "Разрешение редактировать фактические траектории", "FactTrajectory.edit" } + { 529, "Разрешение просматривать фактические траектории", "FactTrajectory.edit" }, }); migrationBuilder.InsertData( @@ -23,7 +22,6 @@ namespace AsbCloudDb.Migrations values: new object[,] { { 529, 1 }, - { 530, 1 } }); } @@ -34,20 +32,10 @@ namespace AsbCloudDb.Migrations keyColumns: new[] { "id_permission", "id_user_role" }, keyValues: new object[] { 529, 1 }); - migrationBuilder.DeleteData( - table: "t_relation_user_role_permission", - keyColumns: new[] { "id_permission", "id_user_role" }, - keyValues: new object[] { 530, 1 }); - migrationBuilder.DeleteData( table: "t_permission", keyColumn: "id", keyValue: 529); - - migrationBuilder.DeleteData( - table: "t_permission", - keyColumn: "id", - keyValue: 530); } } } diff --git a/AsbCloudDb/Migrations/20231115120948_Add_Fact_Trajectory_Table.Designer.cs b/AsbCloudDb/Migrations/20231115120948_Add_Fact_Trajectory_Table.Designer.cs index 138f115b..ed795ae6 100644 --- a/AsbCloudDb/Migrations/20231115120948_Add_Fact_Trajectory_Table.Designer.cs +++ b/AsbCloudDb/Migrations/20231115120948_Add_Fact_Trajectory_Table.Designer.cs @@ -567,7 +567,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_fact_trajectory"); + b.ToTable("t_trajectory_fact"); b.HasComment("Загрузка фактической траектории"); }); diff --git a/AsbCloudDb/Migrations/20231115120948_Add_Fact_Trajectory_Table.cs b/AsbCloudDb/Migrations/20231115120948_Add_Fact_Trajectory_Table.cs index 653c38a5..e61f52c8 100644 --- a/AsbCloudDb/Migrations/20231115120948_Add_Fact_Trajectory_Table.cs +++ b/AsbCloudDb/Migrations/20231115120948_Add_Fact_Trajectory_Table.cs @@ -11,7 +11,7 @@ namespace AsbCloudDb.Migrations protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( - name: "t_fact_trajectory", + name: "t_trajectory_fact", columns: table => new { id = table.Column(type: "integer", nullable: false) @@ -24,20 +24,19 @@ namespace AsbCloudDb.Migrations azimuth_geo = table.Column(type: "double precision", nullable: false, comment: "Азимут Географ."), azimuth_magnetic = table.Column(type: "double precision", nullable: false, comment: "Азимут Магнитный"), vertical_depth = table.Column(type: "double precision", nullable: false, comment: "Глубина вертикальная"), - comment = table.Column(type: "text", nullable: true, comment: "Комментарии"), - radius = table.Column(type: "double precision", nullable: true, comment: "Радиус цели") + comment = table.Column(type: "text", nullable: true, comment: "Комментарии") }, constraints: table => { - table.PrimaryKey("PK_t_fact_trajectory", x => x.id); + table.PrimaryKey("PK_t_trajectory_fact", x => x.id); table.ForeignKey( - name: "FK_t_fact_trajectory_t_user_id_user", + name: "FK_t_trajectory_fact_t_user_id_user", column: x => x.id_user, principalTable: "t_user", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_t_fact_trajectory_t_well_id_well", + name: "FK_t_trajectory_fact_t_well_id_well", column: x => x.id_well, principalTable: "t_well", principalColumn: "id", @@ -46,20 +45,20 @@ namespace AsbCloudDb.Migrations comment: "Загрузка фактической траектории"); migrationBuilder.CreateIndex( - name: "IX_t_fact_trajectory_id_user", - table: "t_fact_trajectory", + name: "IX_t_trajectory_fact_id_user", + table: "t_trajectory_fact", column: "id_user"); migrationBuilder.CreateIndex( - name: "IX_t_fact_trajectory_id_well", - table: "t_fact_trajectory", + name: "IX_t_trajectory_fact_id_well", + table: "t_trajectory_fact", column: "id_well"); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( - name: "t_fact_trajectory"); + name: "t_trajectory_fact"); } } } diff --git a/AsbCloudDb/Migrations/20231116094844_Add_Permissions_For_Trajectory_Nnb.cs b/AsbCloudDb/Migrations/20231116094844_Add_Permissions_For_Trajectory_Nnb.cs deleted file mode 100644 index 506bc8f4..00000000 --- a/AsbCloudDb/Migrations/20231116094844_Add_Permissions_For_Trajectory_Nnb.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace AsbCloudDb.Migrations -{ - public partial class Add_Permissions_For_Trajectory_Nnb : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.InsertData( - table: "t_permission", - columns: new[] { "id", "description", "name" }, - values: new object[] { 531, "Разрешение просматривать фактические ннб-траектории", "NnbTrajectory.get" }); - - migrationBuilder.InsertData( - table: "t_relation_user_role_permission", - columns: new[] { "id_permission", "id_user_role" }, - values: new object[] { 531, 1 }); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DeleteData( - table: "t_relation_user_role_permission", - keyColumns: new[] { "id_permission", "id_user_role" }, - keyValues: new object[] { 531, 1 }); - - migrationBuilder.DeleteData( - table: "t_permission", - keyColumn: "id", - keyValue: 531); - } - } -} diff --git a/AsbCloudDb/Migrations/20231116094844_Add_Permissions_For_Trajectory_Nnb.Designer.cs b/AsbCloudDb/Migrations/20231127114017_Update_t_planned_trajectory.Designer.cs similarity index 98% rename from AsbCloudDb/Migrations/20231116094844_Add_Permissions_For_Trajectory_Nnb.Designer.cs rename to AsbCloudDb/Migrations/20231127114017_Update_t_planned_trajectory.Designer.cs index ae6055cb..52768caa 100644 --- a/AsbCloudDb/Migrations/20231116094844_Add_Permissions_For_Trajectory_Nnb.Designer.cs +++ b/AsbCloudDb/Migrations/20231127114017_Update_t_planned_trajectory.Designer.cs @@ -13,8 +13,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace AsbCloudDb.Migrations { [DbContext(typeof(AsbCloudDbContext))] - [Migration("20231116094844_Add_Permissions_For_Trajectory_Nnb")] - partial class Add_Permissions_For_Trajectory_Nnb + [Migration("20231127114017_Update_t_planned_trajectory")] + partial class Update_t_planned_trajectory { protected override void BuildTargetModel(ModelBuilder modelBuilder) { @@ -223,7 +223,6 @@ namespace AsbCloudDb.Migrations .HasComment("компания"); b.Property("Email") - .IsRequired() .HasMaxLength(255) .HasColumnType("character varying(255)") .HasColumnName("email") @@ -249,7 +248,6 @@ namespace AsbCloudDb.Migrations .HasComment("ключ скважины"); b.Property("Phone") - .IsRequired() .HasMaxLength(50) .HasColumnType("character varying(50)") .HasColumnName("phone") @@ -502,76 +500,6 @@ namespace AsbCloudDb.Migrations b.HasComment("Drill_test"); }); - modelBuilder.Entity("AsbCloudDb.Model.FactTrajectory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AzimuthGeo") - .HasColumnType("double precision") - .HasColumnName("azimuth_geo") - .HasComment("Азимут Географ."); - - b.Property("AzimuthMagnetic") - .HasColumnType("double precision") - .HasColumnName("azimuth_magnetic") - .HasComment("Азимут Магнитный"); - - b.Property("Comment") - .HasColumnType("text") - .HasColumnName("comment") - .HasComment("Комментарии"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("ID пользователя который внес/изменил запись"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("ID скважины"); - - b.Property("Radius") - .HasColumnType("double precision") - .HasColumnName("radius") - .HasComment("Радиус цели"); - - b.Property("UpdateDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("update_date") - .HasComment("Дата загрузки траектории"); - - b.Property("VerticalDepth") - .HasColumnType("double precision") - .HasColumnName("vertical_depth") - .HasComment("Глубина вертикальная"); - - b.Property("WellboreDepth") - .HasColumnType("double precision") - .HasColumnName("wellbore_depth") - .HasComment("Глубина по стволу"); - - b.Property("ZenithAngle") - .HasColumnType("double precision") - .HasColumnName("zenith_angle") - .HasComment("Угол зенитный"); - - b.HasKey("Id"); - - b.HasIndex("IdUser"); - - b.HasIndex("IdWell"); - - b.ToTable("t_fact_trajectory"); - - b.HasComment("Загрузка фактической траектории"); - }); - modelBuilder.Entity("AsbCloudDb.Model.Faq", b => { b.Property("Id") @@ -2498,99 +2426,11 @@ namespace AsbCloudDb.Migrations new { Id = 529, - Description = "Разрешение на получение отчетов drill test", - Name = "DrillTestReport.get" - }, - new - { - Id = 530, - Description = "Разрешение просматривать фактические траектории", - Name = "FactTrajectory.get" - }, - new - { - Id = 531, Description = "Разрешение редактировать фактические траектории", Name = "FactTrajectory.edit" - }, - new - { - Id = 532, - Description = "Разрешение просматривать фактические ннб-траектории", - Name = "NnbTrajectory.get" }); }); - modelBuilder.Entity("AsbCloudDb.Model.PlannedTrajectory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AzimuthGeo") - .HasColumnType("double precision") - .HasColumnName("azimuth_geo") - .HasComment("Азимут Географ."); - - b.Property("AzimuthMagnetic") - .HasColumnType("double precision") - .HasColumnName("azimuth_magnetic") - .HasComment("Азимут Магнитный"); - - b.Property("Comment") - .HasColumnType("text") - .HasColumnName("comment") - .HasComment("Комментарии"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("ID пользователя который внес/изменил запись"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("ID скважины"); - - b.Property("Radius") - .HasColumnType("double precision") - .HasColumnName("radius") - .HasComment("Радиус цели"); - - b.Property("UpdateDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("update_date") - .HasComment("Дата загрузки траектории"); - - b.Property("VerticalDepth") - .HasColumnType("double precision") - .HasColumnName("vertical_depth") - .HasComment("Глубина вертикальная"); - - b.Property("WellboreDepth") - .HasColumnType("double precision") - .HasColumnName("wellbore_depth") - .HasComment("Глубина по стволу"); - - b.Property("ZenithAngle") - .HasColumnType("double precision") - .HasColumnName("zenith_angle") - .HasComment("Угол зенитный"); - - b.HasKey("Id"); - - b.HasIndex("IdUser"); - - b.HasIndex("IdWell"); - - b.ToTable("t_planned_trajectory"); - - b.HasComment("Загрузка плановой траектории"); - }); - modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapWellDrilling", b => { b.Property("Id") @@ -4189,21 +4029,6 @@ namespace AsbCloudDb.Migrations { IdUserRole = 1, IdPermission = 529 - }, - new - { - IdUserRole = 1, - IdPermission = 530 - }, - new - { - IdUserRole = 1, - IdPermission = 531 - }, - new - { - IdUserRole = 1, - IdPermission = 532 }); }); @@ -5310,6 +5135,141 @@ namespace AsbCloudDb.Migrations b.HasComment("Наработка талевого каната"); }); + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); + + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("UpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("update_date") + .HasComment("Дата загрузки траектории"); + + b.Property("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); + + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); + + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); + + b.HasKey("Id"); + + b.HasIndex("IdUser"); + + b.HasIndex("IdWell"); + + b.ToTable("t_trajectory_fact"); + + b.HasComment("Загрузка фактической траектории"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlanned", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); + + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("Radius") + .HasColumnType("double precision") + .HasColumnName("radius") + .HasComment("Радиус цели"); + + b.Property("UpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("update_date") + .HasComment("Дата загрузки траектории"); + + b.Property("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); + + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); + + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); + + b.HasKey("Id"); + + b.HasIndex("IdUser"); + + b.HasIndex("IdWell"); + + b.ToTable("t_trajectory_planned"); + + b.HasComment("Загрузка плановой траектории"); + }); + modelBuilder.Entity("AsbCloudDb.Model.User", b => { b.Property("Id") @@ -6111,6 +6071,14 @@ namespace AsbCloudDb.Migrations Name = "Спуск обсадной колонны" }, new + { + Id = 4018, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Крепление" + }, + new { Id = 4007, IdParent = 3002, @@ -6997,6 +6965,94 @@ namespace AsbCloudDb.Migrations KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ремонт" + }, + new + { + Id = 5102, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск пакера" + }, + new + { + Id = 5103, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Запись гамма-каратожа" + }, + new + { + Id = 5104, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонирование спуск БИ" + }, + new + { + Id = 5105, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка клин-отклонителя" + }, + new + { + Id = 5106, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ориентирование и посадка клина-отклонителя" + }, + new + { + Id = 5107, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Протяжка подъемного патрубка подвески" + }, + new + { + Id = 5108, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем клина-отклонителя" + }, + new + { + Id = 5109, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Стыковка стингера с хвостовиком основного ствола" + }, + new + { + Id = 5110, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ориентирование и установка стыковочного узла хвостовика" + }, + new + { + Id = 5111, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Бурение с отбором керна" + }, + new + { + Id = 5112, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Работа пакером в обсадной колонне" }); }); @@ -8090,25 +8146,6 @@ namespace AsbCloudDb.Migrations b.Navigation("Telemetry"); }); - modelBuilder.Entity("AsbCloudDb.Model.FactTrajectory", b => - { - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany() - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - - b.Navigation("Well"); - }); - modelBuilder.Entity("AsbCloudDb.Model.Faq", b => { b.HasOne("AsbCloudDb.Model.User", "AuthorAnswer") @@ -8321,25 +8358,6 @@ namespace AsbCloudDb.Migrations b.Navigation("Well"); }); - modelBuilder.Entity("AsbCloudDb.Model.PlannedTrajectory", b => - { - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany() - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - - b.Navigation("Well"); - }); - modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapWellDrilling", b => { b.HasOne("AsbCloudDb.Model.User", "User") @@ -8647,6 +8665,44 @@ namespace AsbCloudDb.Migrations b.Navigation("Telemetry"); }); + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlanned", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + modelBuilder.Entity("AsbCloudDb.Model.User", b => { b.HasOne("AsbCloudDb.Model.Company", "Company") diff --git a/AsbCloudDb/Migrations/20231127114017_Update_t_planned_trajectory.cs b/AsbCloudDb/Migrations/20231127114017_Update_t_planned_trajectory.cs new file mode 100644 index 00000000..3175bb9e --- /dev/null +++ b/AsbCloudDb/Migrations/20231127114017_Update_t_planned_trajectory.cs @@ -0,0 +1,109 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + public partial class Update_t_planned_trajectory : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_t_planned_trajectory_t_user_id_user", + table: "t_planned_trajectory"); + + migrationBuilder.DropForeignKey( + name: "FK_t_planned_trajectory_t_well_id_well", + table: "t_planned_trajectory"); + + migrationBuilder.DropPrimaryKey( + name: "PK_t_planned_trajectory", + table: "t_planned_trajectory"); + + migrationBuilder.RenameTable( + name: "t_planned_trajectory", + newName: "t_trajectory_planned"); + + migrationBuilder.RenameIndex( + name: "IX_t_planned_trajectory_id_well", + table: "t_trajectory_planned", + newName: "IX_t_trajectory_planned_id_well"); + + migrationBuilder.RenameIndex( + name: "IX_t_planned_trajectory_id_user", + table: "t_trajectory_planned", + newName: "IX_t_trajectory_planned_id_user"); + + migrationBuilder.AddPrimaryKey( + name: "PK_t_trajectory_planned", + table: "t_trajectory_planned", + column: "id"); + + migrationBuilder.AddForeignKey( + name: "FK_t_trajectory_planned_t_user_id_user", + table: "t_trajectory_planned", + column: "id_user", + principalTable: "t_user", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_t_trajectory_planned_t_well_id_well", + table: "t_trajectory_planned", + column: "id_well", + principalTable: "t_well", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_t_trajectory_planned_t_user_id_user", + table: "t_trajectory_planned"); + + migrationBuilder.DropForeignKey( + name: "FK_t_trajectory_planned_t_well_id_well", + table: "t_trajectory_planned"); + + migrationBuilder.DropPrimaryKey( + name: "PK_t_trajectory_planned", + table: "t_trajectory_planned"); + + migrationBuilder.RenameTable( + name: "t_trajectory_planned", + newName: "t_planned_trajectory"); + + migrationBuilder.RenameIndex( + name: "IX_t_trajectory_planned_id_well", + table: "t_planned_trajectory", + newName: "IX_t_planned_trajectory_id_well"); + + migrationBuilder.RenameIndex( + name: "IX_t_trajectory_planned_id_user", + table: "t_planned_trajectory", + newName: "IX_t_planned_trajectory_id_user"); + + migrationBuilder.AddPrimaryKey( + name: "PK_t_planned_trajectory", + table: "t_planned_trajectory", + column: "id"); + + migrationBuilder.AddForeignKey( + name: "FK_t_planned_trajectory_t_user_id_user", + table: "t_planned_trajectory", + column: "id_user", + principalTable: "t_user", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_t_planned_trajectory_t_well_id_well", + table: "t_planned_trajectory", + column: "id_well", + principalTable: "t_well", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 71f6087c..ff169691 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -491,76 +491,6 @@ namespace AsbCloudDb.Migrations b.HasComment("Drill_test"); }); - modelBuilder.Entity("AsbCloudDb.Model.FactTrajectory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AzimuthGeo") - .HasColumnType("double precision") - .HasColumnName("azimuth_geo") - .HasComment("Азимут Географ."); - - b.Property("AzimuthMagnetic") - .HasColumnType("double precision") - .HasColumnName("azimuth_magnetic") - .HasComment("Азимут Магнитный"); - - b.Property("Comment") - .HasColumnType("text") - .HasColumnName("comment") - .HasComment("Комментарии"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("ID пользователя который внес/изменил запись"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("ID скважины"); - - b.Property("Radius") - .HasColumnType("double precision") - .HasColumnName("radius") - .HasComment("Радиус цели"); - - b.Property("UpdateDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("update_date") - .HasComment("Дата загрузки траектории"); - - b.Property("VerticalDepth") - .HasColumnType("double precision") - .HasColumnName("vertical_depth") - .HasComment("Глубина вертикальная"); - - b.Property("WellboreDepth") - .HasColumnType("double precision") - .HasColumnName("wellbore_depth") - .HasComment("Глубина по стволу"); - - b.Property("ZenithAngle") - .HasColumnType("double precision") - .HasColumnName("zenith_angle") - .HasComment("Угол зенитный"); - - b.HasKey("Id"); - - b.HasIndex("IdUser"); - - b.HasIndex("IdWell"); - - b.ToTable("t_fact_trajectory"); - - b.HasComment("Загрузка фактической траектории"); - }); - modelBuilder.Entity("AsbCloudDb.Model.Faq", b => { b.Property("Id") @@ -2487,93 +2417,11 @@ namespace AsbCloudDb.Migrations new { Id = 529, - Description = "Разрешение просматривать фактические траектории", - Name = "FactTrajectory.get" - }, - new - { - Id = 530, Description = "Разрешение редактировать фактические траектории", Name = "FactTrajectory.edit" - }, - new - { - Id = 531, - Description = "Разрешение просматривать фактические ннб-траектории", - Name = "NnbTrajectory.get" }); }); - modelBuilder.Entity("AsbCloudDb.Model.PlannedTrajectory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AzimuthGeo") - .HasColumnType("double precision") - .HasColumnName("azimuth_geo") - .HasComment("Азимут Географ."); - - b.Property("AzimuthMagnetic") - .HasColumnType("double precision") - .HasColumnName("azimuth_magnetic") - .HasComment("Азимут Магнитный"); - - b.Property("Comment") - .HasColumnType("text") - .HasColumnName("comment") - .HasComment("Комментарии"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("ID пользователя который внес/изменил запись"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("ID скважины"); - - b.Property("Radius") - .HasColumnType("double precision") - .HasColumnName("radius") - .HasComment("Радиус цели"); - - b.Property("UpdateDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("update_date") - .HasComment("Дата загрузки траектории"); - - b.Property("VerticalDepth") - .HasColumnType("double precision") - .HasColumnName("vertical_depth") - .HasComment("Глубина вертикальная"); - - b.Property("WellboreDepth") - .HasColumnType("double precision") - .HasColumnName("wellbore_depth") - .HasComment("Глубина по стволу"); - - b.Property("ZenithAngle") - .HasColumnType("double precision") - .HasColumnName("zenith_angle") - .HasComment("Угол зенитный"); - - b.HasKey("Id"); - - b.HasIndex("IdUser"); - - b.HasIndex("IdWell"); - - b.ToTable("t_planned_trajectory"); - - b.HasComment("Загрузка плановой траектории"); - }); - modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapWellDrilling", b => { b.Property("Id") @@ -4172,16 +4020,6 @@ namespace AsbCloudDb.Migrations { IdUserRole = 1, IdPermission = 529 - }, - new - { - IdUserRole = 1, - IdPermission = 530 - }, - new - { - IdUserRole = 1, - IdPermission = 531 }); }); @@ -5288,6 +5126,141 @@ namespace AsbCloudDb.Migrations b.HasComment("Наработка талевого каната"); }); + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); + + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("UpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("update_date") + .HasComment("Дата загрузки траектории"); + + b.Property("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); + + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); + + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); + + b.HasKey("Id"); + + b.HasIndex("IdUser"); + + b.HasIndex("IdWell"); + + b.ToTable("t_trajectory_fact"); + + b.HasComment("Загрузка фактической траектории"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlanned", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); + + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("Radius") + .HasColumnType("double precision") + .HasColumnName("radius") + .HasComment("Радиус цели"); + + b.Property("UpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("update_date") + .HasComment("Дата загрузки траектории"); + + b.Property("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); + + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); + + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); + + b.HasKey("Id"); + + b.HasIndex("IdUser"); + + b.HasIndex("IdWell"); + + b.ToTable("t_trajectory_planned"); + + b.HasComment("Загрузка плановой траектории"); + }); + modelBuilder.Entity("AsbCloudDb.Model.User", b => { b.Property("Id") @@ -8164,25 +8137,6 @@ namespace AsbCloudDb.Migrations b.Navigation("Telemetry"); }); - modelBuilder.Entity("AsbCloudDb.Model.FactTrajectory", b => - { - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany() - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - - b.Navigation("Well"); - }); - modelBuilder.Entity("AsbCloudDb.Model.Faq", b => { b.HasOne("AsbCloudDb.Model.User", "AuthorAnswer") @@ -8395,25 +8349,6 @@ namespace AsbCloudDb.Migrations b.Navigation("Well"); }); - modelBuilder.Entity("AsbCloudDb.Model.PlannedTrajectory", b => - { - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany() - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - - b.Navigation("Well"); - }); - modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapWellDrilling", b => { b.HasOne("AsbCloudDb.Model.User", "User") @@ -8721,6 +8656,44 @@ namespace AsbCloudDb.Migrations b.Navigation("Telemetry"); }); + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlanned", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + modelBuilder.Entity("AsbCloudDb.Model.User", b => { b.HasOne("AsbCloudDb.Model.Company", "Company") diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index 6b111c96..e6b4b362 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -17,7 +17,7 @@ namespace AsbCloudDb.Model public virtual DbSet DailyReports => Set (); public virtual DbSet Deposits => Set(); public virtual DbSet DetectedOperations => Set(); - public virtual DbSet PlannedTrajectories => Set(); + public virtual DbSet PlannedTrajectories => Set(); public virtual DbSet ProcessMapWellDrillings => Set(); public virtual DbSet ProcessMapWellReams => Set(); public virtual DbSet DrillingProgramParts => Set(); @@ -60,7 +60,7 @@ namespace AsbCloudDb.Model public virtual DbSet LimitingParameter => Set(); public virtual DbSet TelemetryWirelineRunOut => Set(); - public virtual DbSet FactTrajectories => Set(); + public virtual DbSet FactTrajectories => Set(); // GTR WITS public DbSet WitsItemFloat => Set(); diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs index c21b05c1..4b6bc2c8 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs @@ -162,9 +162,7 @@ new() { Id = 527, Name = "Manual.delete", Description = "Разрешение на удаление инструкций"}, new (){ Id = 528, Name="WellContact.delete", Description="Разрешение на удаление контакта"}, - new (){ Id = 529, Name="FactTrajectory.get", Description="Разрешение просматривать фактические траектории"}, - new (){ Id = 530, Name="FactTrajectory.edit", Description="Разрешение редактировать фактические траектории"}, - new (){ Id = 531, Name="NnbTrajectory.get", Description="Разрешение просматривать фактические ннб-траектории"}, + new (){ Id = 529, Name="FactTrajectory.edit", Description="Разрешение редактировать фактические траектории"} }; } } diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index e985dcbc..f30adffa 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -21,7 +21,7 @@ namespace AsbCloudDb.Model DbSet DailyReports { get; } DbSet Deposits { get; } DbSet DetectedOperations { get; } - DbSet PlannedTrajectories { get; } + DbSet PlannedTrajectories { get; } DbSet ProcessMapWellDrillings { get; } DbSet ProcessMapWellReams { get; } DbSet DrillingProgramParts { get; } @@ -78,7 +78,7 @@ namespace AsbCloudDb.Model DbSet ManualDirectories { get; } DbSet Contacts { get; } DbSet DrillTests { get; } - DbSet FactTrajectories { get; } + DbSet FactTrajectories { get; } DatabaseFacade Database { get; } Task RefreshMaterializedViewAsync(string mwName, CancellationToken token); diff --git a/AsbCloudDb/Model/Trajectory/PlannedTrajectory.cs b/AsbCloudDb/Model/Trajectory/PlannedTrajectory.cs deleted file mode 100644 index 6f66d977..00000000 --- a/AsbCloudDb/Model/Trajectory/PlannedTrajectory.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace AsbCloudDb.Model.Trajectory -{ - [Table("t_planned_trajectory"), Comment("Загрузка плановой траектории")] - public class PlannedTrajectory : Trajectory - { - - } -} diff --git a/AsbCloudDb/Model/Trajectory/Trajectory.cs b/AsbCloudDb/Model/Trajectory/Trajectory.cs index 21276e07..7d62ba41 100644 --- a/AsbCloudDb/Model/Trajectory/Trajectory.cs +++ b/AsbCloudDb/Model/Trajectory/Trajectory.cs @@ -5,7 +5,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace AsbCloudDb.Model.Trajectory { - public class Trajectory : IId, IWellRelated + public abstract class Trajectory : IId, IWellRelated { [Column("id"), Key] public int Id { get; set; } @@ -37,9 +37,6 @@ namespace AsbCloudDb.Model.Trajectory [Column("comment"), Comment("Комментарии")] public string? Comment { get; set; } - [Column("radius"), Comment("Радиус цели")] - public double? Radius { get; set; } - [ForeignKey(nameof(IdWell))] public virtual Well Well { get; set; } = null!; diff --git a/AsbCloudDb/Model/Trajectory/FactTrajectory.cs b/AsbCloudDb/Model/Trajectory/TrajectoryFact.cs similarity index 63% rename from AsbCloudDb/Model/Trajectory/FactTrajectory.cs rename to AsbCloudDb/Model/Trajectory/TrajectoryFact.cs index 793c9fd9..26165da9 100644 --- a/AsbCloudDb/Model/Trajectory/FactTrajectory.cs +++ b/AsbCloudDb/Model/Trajectory/TrajectoryFact.cs @@ -3,8 +3,8 @@ using System.ComponentModel.DataAnnotations.Schema; namespace AsbCloudDb.Model.Trajectory { - [Table("t_fact_trajectory"), Comment("Загрузка фактической траектории")] - public class FactTrajectory : Trajectory + [Table("t_trajectory_fact"), Comment("Загрузка фактической траектории")] + public class TrajectoryFact : Trajectory { } } diff --git a/AsbCloudDb/Model/Trajectory/TrajectoryPlanned.cs b/AsbCloudDb/Model/Trajectory/TrajectoryPlanned.cs new file mode 100644 index 00000000..20f54025 --- /dev/null +++ b/AsbCloudDb/Model/Trajectory/TrajectoryPlanned.cs @@ -0,0 +1,12 @@ +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations.Schema; + +namespace AsbCloudDb.Model.Trajectory +{ + [Table("t_trajectory_planned"), Comment("Загрузка плановой траектории")] + public class TrajectoryPlanned : Trajectory + { + [Column("radius"), Comment("Радиус цели")] + public double? Radius { get; set; } + } +} diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index 500a98cd..3c1998a9 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -17,6 +17,7 @@ + @@ -35,9 +36,9 @@ - - - + + + diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 167139af..f5e42563 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -6,6 +6,7 @@ using AsbCloudApp.Data.Manuals; using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Data.SAUB; using AsbCloudApp.Data.Subsystems; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Data.WellOperationImport.Options; using AsbCloudApp.Repositories; using AsbCloudApp.Services; @@ -33,6 +34,8 @@ using AsbCloudInfrastructure.Services.ProcessMaps.WellDrilling; using AsbCloudInfrastructure.Services.SAUB; using AsbCloudInfrastructure.Services.Subsystems; using AsbCloudInfrastructure.Services.Trajectory; +using AsbCloudInfrastructure.Services.Trajectory.Export; +using AsbCloudInfrastructure.Services.Trajectory.Import; using AsbCloudInfrastructure.Services.WellOperationImport; using AsbCloudInfrastructure.Services.WellOperationImport.FileParser; using AsbCloudInfrastructure.Services.WellOperationService; @@ -182,10 +185,11 @@ namespace AsbCloudInfrastructure 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(); @@ -248,8 +252,8 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient, TrajectoryEditableRepository>(); - services.AddTransient, TrajectoryEditableRepository>(); + services.AddTransient, TrajectoryEditableRepository>(); + services.AddTransient, TrajectoryEditableRepository>(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs b/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs index a48312ba..8656039f 100644 --- a/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs +++ b/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs @@ -1,4 +1,4 @@ -using AsbCloudApp.Data; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Services; diff --git a/AsbCloudInfrastructure/Repository/TrajectoryNnbRepository.cs b/AsbCloudInfrastructure/Repository/TrajectoryNnbRepository.cs index 57095d4e..b131fa19 100644 --- a/AsbCloudInfrastructure/Repository/TrajectoryNnbRepository.cs +++ b/AsbCloudInfrastructure/Repository/TrajectoryNnbRepository.cs @@ -1,4 +1,4 @@ -using AsbCloudApp.Data; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; using AsbCloudApp.Services; using AsbCloudDb.Model; diff --git a/AsbCloudInfrastructure/Services/Trajectory/TrajectoryImportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryExportService.cs similarity index 51% rename from AsbCloudInfrastructure/Services/Trajectory/TrajectoryImportService.cs rename to AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryExportService.cs index 5587789e..5f8b8fdd 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/TrajectoryImportService.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryExportService.cs @@ -1,4 +1,4 @@ -using AsbCloudApp.Data; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; using AsbCloudApp.Services; using ClosedXML.Excel; @@ -9,31 +9,41 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; -namespace AsbCloudInfrastructure.Services.Trajectory +namespace AsbCloudInfrastructure.Services.Trajectory.Export { - public abstract class TrajectoryImportService where T : TrajectoryGeoDto + public abstract class TrajectoryExportService where T : TrajectoryGeoDto { private readonly IWellService wellService; private readonly ITrajectoryRepository trajectoryService; protected abstract void AddCoordinatesToRow(IXLRow row, T trajectory); - protected abstract T ParseRow(IXLRow row); public abstract string templateFileName { get; set; } public abstract string usingTemplateFile { get; set; } - public abstract string sheetNamePlannedTrajectory { get; set; } + public abstract string sheetTrajectory { get; set; } public abstract int headerRowsCount { get; set; } public abstract int ColumnWellboreDepth { get; set; } public abstract int ColumnZenithAngle { get; set; } public abstract int ColumnAzimuthGeo { get; set; } public abstract int ColumnAzimuthMagnetic { get; set; } public abstract int ColumnVerticalDepth { get; set; } - public abstract int ColumnRadius { get; set; } public abstract int ColumnComment { get; set; } - public TrajectoryImportService(ITrajectoryRepository trajectoryService, IWellService wellService) + public TrajectoryExportService(IWellService wellService, ITrajectoryRepository trajectoryService) { - this.trajectoryService = trajectoryService; this.wellService = wellService; + this.trajectoryService = trajectoryService; + } + + public async Task ExportAsync(int idWell, CancellationToken token) + { + var trajectorys = await trajectoryService.GetAsync(idWell, token); + return MakeExelFileStream(trajectorys); + } + + public async Task GetFileNameAsync(int idWell, CancellationToken token) + { + var caption = await wellService.GetWellCaptionByIdAsync(idWell, token); + return string.Format("{0}_{1}", caption, templateFileName); } public Stream GetTemplateFile() @@ -45,12 +55,6 @@ namespace AsbCloudInfrastructure.Services.Trajectory return stream; } - public async Task ExportAsync(int idWell, CancellationToken token) - { - var trajectorys = await trajectoryService.GetAsync(idWell, token); - return MakeExelFileStream(trajectorys); - } - private Stream MakeExelFileStream(IEnumerable trajectories) { using Stream ecxelTemplateStream = GetTemplateFile(); @@ -66,9 +70,9 @@ namespace AsbCloudInfrastructure.Services.Trajectory { if (trajectories.Any()) { - var sheet = workbook.Worksheets.FirstOrDefault(ws => ws.Name == sheetNamePlannedTrajectory); + var sheet = workbook.Worksheets.FirstOrDefault(ws => ws.Name == sheetTrajectory); if (sheet is null) - throw new FileFormatException($"Лист с именем {sheetNamePlannedTrajectory} отсутствует, либо имеет некорректное название"); + throw new FileFormatException($"Лист с именем {sheetTrajectory} отсутствует, либо имеет некорректное название"); AddTrajecoryToSheet(sheet, trajectories); } } @@ -82,75 +86,5 @@ namespace AsbCloudInfrastructure.Services.Trajectory AddCoordinatesToRow(row, rowList[i]); } } - - public async Task GetFileNameAsync(int idWell, CancellationToken token) - { - var caption = await wellService.GetWellCaptionByIdAsync(idWell, token); - return string.Format("{0}_{1}", caption, templateFileName); - } - - public async Task> ImportAsync(int idWell, int idUser, Stream stream, CancellationToken token) - { - using var workbook = new XLWorkbook(stream, XLEventTracking.Disabled); - var trajectoryRows = ParseFileStream(stream); - foreach (var row in trajectoryRows) - { - row.IdWell = idWell; - row.IdUser = idUser; - } - - return trajectoryRows; - } - - - private IEnumerable ParseFileStream(Stream stream) - { - using var workbook = new XLWorkbook(stream, XLEventTracking.Disabled); - return ParseWorkbook(workbook); - } - - private IEnumerable ParseWorkbook(IXLWorkbook workbook) - { - var sheetTrajectory = workbook.Worksheets.FirstOrDefault(ws => ws.Name == sheetNamePlannedTrajectory); - if (sheetTrajectory is null) - throw new FileFormatException($"Книга excel не содержит листа {sheetNamePlannedTrajectory}."); - var trajectoryRows = ParseSheet(sheetTrajectory); - return trajectoryRows; - } - - private IEnumerable ParseSheet(IXLWorksheet sheet) - { - if (sheet.RangeUsed().RangeAddress.LastAddress.ColumnNumber < 7) - throw new FileFormatException($"Лист {sheet.Name} содержит меньшее количество столбцов."); - - var count = sheet.RowsUsed().Count() - headerRowsCount; - - if (count > 1024) - throw new FileFormatException($"Лист {sheet.Name} содержит слишком большое количество строк."); - - if (count <= 0) - throw new FileFormatException($"Лист {sheet.Name} некорректного формата либо пустой"); - - var trajectoryRows = new List(count); - var parseErrors = new List(); - for (int i = 0; i < count; i++) - { - var row = sheet.Row(1 + i + headerRowsCount); - try - { - var trajectoryRow = ParseRow(row); - trajectoryRows.Add(trajectoryRow); - } - catch (FileFormatException ex) - { - parseErrors.Add(ex.Message); - } - } - - if (parseErrors.Any()) - throw new FileFormatException(string.Join("\r\n", parseErrors)); - - return trajectoryRows; - } } } diff --git a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs new file mode 100644 index 00000000..3a7ebf12 --- /dev/null +++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs @@ -0,0 +1,41 @@ +using AsbCloudApp.Data.Trajectory; +using AsbCloudApp.Repositories; +using AsbCloudApp.Services; +using ClosedXML.Excel; + +namespace AsbCloudInfrastructure.Services.Trajectory.Export +{ + + public class TrajectoryFactManualExportService : TrajectoryExportService + { + public override string templateFileName { get; set; } = "TrajectoryFactManualTemplate.xlsx"; + public override string usingTemplateFile { get; set; } = "AsbCloudInfrastructure.Services.Trajectory.Templates"; + public override string sheetTrajectory { get; set; } = "Фактическая траектория"; + public override int headerRowsCount { get; set; } = 2; + public override int ColumnWellboreDepth { get; set; } = 1; + public override int ColumnZenithAngle { get; set; } = 2; + public override int ColumnAzimuthGeo { get; set; } = 3; + public override int ColumnAzimuthMagnetic { get; set; } = 4; + public override int ColumnVerticalDepth { get; set; } = 5; + public override int ColumnComment { get; set; } = 6; + + public TrajectoryFactManualExportService( + IWellService wellService, + ITrajectoryEditableRepository factTrajectoryService) + : base(wellService, factTrajectoryService) + { + + } + + protected override void AddCoordinatesToRow(IXLRow row, TrajectoryGeoFactDto trajectory) + { + row.Cell(ColumnWellboreDepth).Value = trajectory.WellboreDepth; + row.Cell(ColumnZenithAngle).Value = trajectory.ZenithAngle; + row.Cell(ColumnAzimuthGeo).Value = trajectory.AzimuthGeo; + row.Cell(ColumnAzimuthMagnetic).Value = trajectory.AzimuthMagnetic; + row.Cell(ColumnVerticalDepth).Value = trajectory.VerticalDepth; + row.Cell(ColumnComment).Value = trajectory.Comment; + } + } +} + diff --git a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs new file mode 100644 index 00000000..5c34fc21 --- /dev/null +++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs @@ -0,0 +1,41 @@ +using AsbCloudApp.Data.Trajectory; +using AsbCloudApp.Repositories; +using AsbCloudApp.Services; +using ClosedXML.Excel; + +namespace AsbCloudInfrastructure.Services.Trajectory.Export +{ + + public class TrajectoryFactNnbExportService : TrajectoryExportService + { + public override string templateFileName { get; set; } = "TrajectoryFactNnbTemplate.xlsx"; + public override string usingTemplateFile { get; set; } = "AsbCloudInfrastructure.Services.Trajectory.Templates"; + public override string sheetTrajectory { get; set; } = "Фактическая ннб-траектория"; + public override int headerRowsCount { get; set; } = 2; + public override int ColumnWellboreDepth { get; set; } = 1; + public override int ColumnZenithAngle { get; set; } = 2; + public override int ColumnAzimuthGeo { get; set; } = 3; + public override int ColumnAzimuthMagnetic { get; set; } = 4; + public override int ColumnVerticalDepth { get; set; } = 5; + public override int ColumnComment { get; set; } = 6; + + public TrajectoryFactNnbExportService( + IWellService wellService, + ITrajectoryNnbRepository nnbTrajectoryService) + : base(wellService, nnbTrajectoryService) + { + + } + + protected override void AddCoordinatesToRow(IXLRow row, TrajectoryGeoFactDto trajectory) + { + row.Cell(ColumnWellboreDepth).Value = trajectory.WellboreDepth; + row.Cell(ColumnZenithAngle).Value = trajectory.ZenithAngle; + row.Cell(ColumnAzimuthGeo).Value = trajectory.AzimuthGeo; + row.Cell(ColumnAzimuthMagnetic).Value = trajectory.AzimuthMagnetic; + row.Cell(ColumnVerticalDepth).Value = trajectory.VerticalDepth; + row.Cell(ColumnComment).Value = trajectory.Comment; + } + } +} + diff --git a/AsbCloudInfrastructure/Services/Trajectory/NnbTrajectoryImportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryPlannedExportService.cs similarity index 50% rename from AsbCloudInfrastructure/Services/Trajectory/NnbTrajectoryImportService.cs rename to AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryPlannedExportService.cs index 869de4d7..26160885 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/NnbTrajectoryImportService.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryPlannedExportService.cs @@ -1,34 +1,35 @@ -using AsbCloudApp.Data; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; using AsbCloudApp.Services; using ClosedXML.Excel; -namespace AsbCloudInfrastructure.Services.Trajectory +namespace AsbCloudInfrastructure.Services.Trajectory.Export { - - public class NnbTrajectoryImportService : TrajectoryImportService + public class TrajectoryPlannedExportService : TrajectoryExportService { - public override string templateFileName { get; set; } = "NnbTrajectoryTemplate.xlsx"; + /* + * password for PlannedTrajectoryTemplate.xlsx is Drill2022 + */ + public override string templateFileName { get; set; } = "TrajectoryPlannedTemplate.xlsx"; public override string usingTemplateFile { get; set; } = "AsbCloudInfrastructure.Services.Trajectory.Templates"; - public override string sheetNamePlannedTrajectory { get; set; } = "Фактическая ннб-траектория"; + public override string sheetTrajectory { get; set; } = "Плановая траектория"; public override int headerRowsCount { get; set; } = 2; public override int ColumnWellboreDepth { get; set; } = 1; public override int ColumnZenithAngle { get; set; } = 2; public override int ColumnAzimuthGeo { get; set; } = 3; public override int ColumnAzimuthMagnetic { get; set; } = 4; public override int ColumnVerticalDepth { get; set; } = 5; - public override int ColumnRadius { get; set; } = 6; + public int ColumnRadius { get; set; } = 6; public override int ColumnComment { get; set; } = 7; - public NnbTrajectoryImportService( + public TrajectoryPlannedExportService( IWellService wellService, - ITrajectoryNnbRepository nnbTrajectoryService) - : base(nnbTrajectoryService, wellService) + ITrajectoryEditableRepository plannedTrajectoryService) + : base(wellService, plannedTrajectoryService) { - } - protected override void AddCoordinatesToRow(IXLRow row, TrajectoryGeoFactDto trajectory) + protected override void AddCoordinatesToRow(IXLRow row, TrajectoryGeoPlanDto trajectory) { row.Cell(ColumnWellboreDepth).Value = trajectory.WellboreDepth; row.Cell(ColumnZenithAngle).Value = trajectory.ZenithAngle; @@ -38,22 +39,7 @@ namespace AsbCloudInfrastructure.Services.Trajectory row.Cell(ColumnRadius).Value = trajectory.Radius; row.Cell(ColumnComment).Value = trajectory.Comment; } - - protected override TrajectoryGeoFactDto ParseRow(IXLRow row) - { - var trajectoryRow = new TrajectoryGeoFactDto - { - WellboreDepth = row.Cell(ColumnWellboreDepth).GetCellValue(), - ZenithAngle = row.Cell(ColumnZenithAngle).GetCellValue(), - AzimuthGeo = row.Cell(ColumnAzimuthGeo).GetCellValue(), - AzimuthMagnetic = row.Cell(ColumnAzimuthMagnetic).GetCellValue(), - VerticalDepth = row.Cell(ColumnVerticalDepth).GetCellValue(), - Radius = row.Cell(ColumnRadius).GetCellValue(), - Comment = row.Cell(ColumnComment).GetCellValue() - }; - - return trajectoryRow; - } } + } diff --git a/AsbCloudInfrastructure/Services/Trajectory/FactTrajectoryImportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Import/TrajectoryFactManualImportService.cs similarity index 55% rename from AsbCloudInfrastructure/Services/Trajectory/FactTrajectoryImportService.cs rename to AsbCloudInfrastructure/Services/Trajectory/Import/TrajectoryFactManualImportService.cs index defc5207..fb22794e 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/FactTrajectoryImportService.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Import/TrajectoryFactManualImportService.cs @@ -1,14 +1,14 @@ -using AsbCloudApp.Data; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; using AsbCloudApp.Services; using ClosedXML.Excel; -namespace AsbCloudInfrastructure.Services.Trajectory +namespace AsbCloudInfrastructure.Services.Trajectory.Import { - public class FactTrajectoryImportService : TrajectoryImportService + public class TrajectoryFactManualImportService : TrajectoryImportService { - public override string templateFileName { get; set; } = "FactTrajectoryTemplate.xlsx"; + public override string templateFileName { get; set; } = "TrajectoryFactManualTemplate.xlsx"; public override string usingTemplateFile { get; set; } = "AsbCloudInfrastructure.Services.Trajectory.Templates"; public override string sheetNamePlannedTrajectory { get; set; } = "Фактическая траектория"; public override int headerRowsCount { get; set; } = 2; @@ -17,28 +17,13 @@ namespace AsbCloudInfrastructure.Services.Trajectory public override int ColumnAzimuthGeo { get; set; } = 3; public override int ColumnAzimuthMagnetic { get; set; } = 4; public override int ColumnVerticalDepth { get; set; } = 5; - public override int ColumnRadius { get; set; } = 6; - public override int ColumnComment { get; set; } = 7; + public override int ColumnComment { get; set; } = 6; - public FactTrajectoryImportService( - IWellService wellService, - ITrajectoryEditableRepository factTrajectoryService) - : base(factTrajectoryService, wellService) + public TrajectoryFactManualImportService() : base() { } - protected override void AddCoordinatesToRow(IXLRow row, TrajectoryGeoFactDto trajectory) - { - row.Cell(ColumnWellboreDepth).Value = trajectory.WellboreDepth; - row.Cell(ColumnZenithAngle).Value = trajectory.ZenithAngle; - row.Cell(ColumnAzimuthGeo).Value = trajectory.AzimuthGeo; - row.Cell(ColumnAzimuthMagnetic).Value = trajectory.AzimuthMagnetic; - row.Cell(ColumnVerticalDepth).Value = trajectory.VerticalDepth; - row.Cell(ColumnRadius).Value = trajectory.Radius; - row.Cell(ColumnComment).Value = trajectory.Comment; - } - protected override TrajectoryGeoFactDto ParseRow(IXLRow row) { var trajectoryRow = new TrajectoryGeoFactDto @@ -48,7 +33,6 @@ namespace AsbCloudInfrastructure.Services.Trajectory AzimuthGeo = row.Cell(ColumnAzimuthGeo).GetCellValue(), AzimuthMagnetic = row.Cell(ColumnAzimuthMagnetic).GetCellValue(), VerticalDepth = row.Cell(ColumnVerticalDepth).GetCellValue(), - Radius = row.Cell(ColumnRadius).GetCellValue(), Comment = row.Cell(ColumnComment).GetCellValue() }; diff --git a/AsbCloudInfrastructure/Services/Trajectory/Import/TrajectoryImportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Import/TrajectoryImportService.cs new file mode 100644 index 00000000..9c357dcb --- /dev/null +++ b/AsbCloudInfrastructure/Services/Trajectory/Import/TrajectoryImportService.cs @@ -0,0 +1,92 @@ +using AsbCloudApp.Data.Trajectory; +using AsbCloudApp.Repositories; +using AsbCloudApp.Services; +using ClosedXML.Excel; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services.Trajectory.Import +{ + public abstract class TrajectoryImportService where T : TrajectoryGeoDto + { + private readonly IWellService wellService; + + protected abstract T ParseRow(IXLRow row); + public abstract string templateFileName { get; set; } + public abstract string usingTemplateFile { get; set; } + public abstract string sheetNamePlannedTrajectory { get; set; } + public abstract int headerRowsCount { get; set; } + public abstract int ColumnWellboreDepth { get; set; } + public abstract int ColumnZenithAngle { get; set; } + public abstract int ColumnAzimuthGeo { get; set; } + public abstract int ColumnAzimuthMagnetic { get; set; } + public abstract int ColumnVerticalDepth { get; set; } + public abstract int ColumnComment { get; set; } + + public TrajectoryImportService() + { + } + + public async Task> ImportAsync(Stream stream, CancellationToken token) + { + using var workbook = new XLWorkbook(stream, XLEventTracking.Disabled); + var trajectoryRows = ParseFileStream(stream); + + return trajectoryRows; + } + + + private IEnumerable ParseFileStream(Stream stream) + { + using var workbook = new XLWorkbook(stream, XLEventTracking.Disabled); + return ParseWorkbook(workbook); + } + + private IEnumerable ParseWorkbook(IXLWorkbook workbook) + { + var sheetTrajectory = workbook.Worksheets.FirstOrDefault(ws => ws.Name == sheetNamePlannedTrajectory); + if (sheetTrajectory is null) + throw new FileFormatException($"Книга excel не содержит листа {sheetNamePlannedTrajectory}."); + var trajectoryRows = ParseSheet(sheetTrajectory); + return trajectoryRows; + } + + private IEnumerable ParseSheet(IXLWorksheet sheet) + { + if (sheet.RangeUsed().RangeAddress.LastAddress.ColumnNumber < 6) + throw new FileFormatException($"Лист {sheet.Name} содержит меньшее количество столбцов."); + + var count = sheet.RowsUsed().Count() - headerRowsCount; + + if (count > 1024) + throw new FileFormatException($"Лист {sheet.Name} содержит слишком большое количество строк."); + + if (count <= 0) + throw new FileFormatException($"Лист {sheet.Name} некорректного формата либо пустой"); + + var trajectoryRows = new List(count); + var parseErrors = new List(); + for (int i = 0; i < count; i++) + { + var row = sheet.Row(1 + i + headerRowsCount); + try + { + var trajectoryRow = ParseRow(row); + trajectoryRows.Add(trajectoryRow); + } + catch (FileFormatException ex) + { + parseErrors.Add(ex.Message); + } + } + + if (parseErrors.Any()) + throw new FileFormatException(string.Join("\r\n", parseErrors)); + + return trajectoryRows; + } + } +} diff --git a/AsbCloudInfrastructure/Services/Trajectory/PlannedTrajectoryImportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Import/TrajectoryPlannedImportService.cs similarity index 60% rename from AsbCloudInfrastructure/Services/Trajectory/PlannedTrajectoryImportService.cs rename to AsbCloudInfrastructure/Services/Trajectory/Import/TrajectoryPlannedImportService.cs index 296a4002..386a9b41 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/PlannedTrajectoryImportService.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/Import/TrajectoryPlannedImportService.cs @@ -1,17 +1,16 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Repositories; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Services; using ClosedXML.Excel; -namespace AsbCloudInfrastructure.Services.Trajectory +namespace AsbCloudInfrastructure.Services.Trajectory.Import { - public class PlannedTrajectoryImportService : TrajectoryImportService + public class TrajectoryPlannedImportService : TrajectoryImportService { /* * password for PlannedTrajectoryTemplate.xlsx is Drill2022 */ - public override string templateFileName { get; set; } = "PlannedTrajectoryTemplate.xlsx"; + public override string templateFileName { get; set; } = "TrajectoryPlannedTemplate.xlsx"; public override string usingTemplateFile { get; set; } = "AsbCloudInfrastructure.Services.Trajectory.Templates"; public override string sheetNamePlannedTrajectory { get; set; } = "Плановая траектория"; public override int headerRowsCount { get; set; } = 2; @@ -20,13 +19,10 @@ namespace AsbCloudInfrastructure.Services.Trajectory public override int ColumnAzimuthGeo { get; set; } = 3; public override int ColumnAzimuthMagnetic { get; set; } = 4; public override int ColumnVerticalDepth { get; set; } = 5; - public override int ColumnRadius { get; set; } = 6; + public int ColumnRadius { get; set; } = 6; public override int ColumnComment { get; set; } = 7; - public PlannedTrajectoryImportService( - IWellService wellService, - ITrajectoryEditableRepository plannedTrajectoryService) - : base(plannedTrajectoryService, wellService) + public TrajectoryPlannedImportService() : base() { } @@ -45,17 +41,6 @@ namespace AsbCloudInfrastructure.Services.Trajectory return trajectoryRow; } - - protected override void AddCoordinatesToRow(IXLRow row, TrajectoryGeoPlanDto trajectory) - { - row.Cell(ColumnWellboreDepth).Value = trajectory.WellboreDepth; - row.Cell(ColumnZenithAngle).Value = trajectory.ZenithAngle; - row.Cell(ColumnAzimuthGeo).Value = trajectory.AzimuthGeo; - row.Cell(ColumnAzimuthMagnetic).Value = trajectory.AzimuthMagnetic; - row.Cell(ColumnVerticalDepth).Value = trajectory.VerticalDepth; - row.Cell(ColumnRadius).Value = trajectory.Radius; - row.Cell(ColumnComment).Value = trajectory.Comment; - } } } diff --git a/AsbCloudInfrastructure/Services/Trajectory/Templates/FactTrajectoryTemplate.xlsx b/AsbCloudInfrastructure/Services/Trajectory/Templates/FactTrajectoryTemplate.xlsx deleted file mode 100644 index 219043d6cf2b5e7a3ed2a7da4b7060e78cb53691..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6885 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 Pw7bjiuD~e&^5OpgT_E7< diff --git a/AsbCloudInfrastructure/Services/Trajectory/Templates/NnbTrajectoryTemplate.xlsx b/AsbCloudInfrastructure/Services/Trajectory/Templates/NnbTrajectoryTemplate.xlsx deleted file mode 100644 index b6bc4bbf778127584baf9acdf27bfe3b6f93a6df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11600 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 literal 0 HcmV?d00001 diff --git a/AsbCloudInfrastructure/Services/Trajectory/Templates/TrajectoryFactNnbTemplate.xlsx b/AsbCloudInfrastructure/Services/Trajectory/Templates/TrajectoryFactNnbTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..54bd69aef6bb1865d6224c7092ec44dde59f15fd GIT binary patch literal 6881 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ключ скважины /// /// - public async Task, IEnumerable, IEnumerable>> GetTrajectoryCartesianAsync(int idWell, CancellationToken token) + public async Task, IEnumerable>> GetTrajectoryCartesianAsync(int idWell, CancellationToken token) { - var result = new PlanFactBase, IEnumerable, IEnumerable>(); + var result = new TrajectoryPlanFactDto, IEnumerable>(); result.Plan = await trajectoryPlanService.GetAsync(idWell, token); - result.Fact = await trajectoryFactService.GetAsync(idWell, token); - result.Nnb = await trajectoryNnbService.GetAsync(idWell, token); + result.FactManual = await trajectoryFactService.GetAsync(idWell, token); + result.FactNnb = await trajectoryNnbService.GetAsync(idWell, token); return result; } diff --git a/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj b/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj index 4cf2783e..4cb7f7b1 100644 --- a/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj +++ b/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj @@ -8,6 +8,16 @@ enable + + + + + + + + + + diff --git a/AsbCloudWebApi.Tests/Services/Trajectory/Templates/TrajectoryFactManualTemplate.xlsx b/AsbCloudWebApi.Tests/Services/Trajectory/Templates/TrajectoryFactManualTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bc7aef584e0010b6429c1cd2a336f61e12d96c4a GIT binary patch literal 6962 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 F{2xi8>Bay6 literal 0 HcmV?d00001 diff --git a/AsbCloudWebApi.Tests/Services/Trajectory/Templates/TrajectoryPlannedTemplate.xlsx b/AsbCloudWebApi.Tests/Services/Trajectory/Templates/TrajectoryPlannedTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..42185e1ff573e375d8684c8457c1db7d0490488d GIT binary patch literal 7118 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 DiattY literal 0 HcmV?d00001 diff --git a/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs b/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs new file mode 100644 index 00000000..ae8c1840 --- /dev/null +++ b/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs @@ -0,0 +1,128 @@ +using AsbCloudApp.Data.Trajectory; +using AsbCloudApp.Repositories; +using AsbCloudApp.Services; +using AsbCloudInfrastructure.Services.Trajectory.Export; +using NSubstitute; +using System; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace AsbCloudWebApi.Tests.Services.Trajectory +{ + public class TrajectoryExportTest + { + private IWellService wellService; + private readonly ITrajectoryEditableRepository trajectoryPlannedRepository; + private readonly TrajectoryPlannedExportService trajectoryPlannedExportService; + + private readonly ITrajectoryEditableRepository trajectoryFactManualReposirory; + private readonly TrajectoryFactManualExportService trajectoryFactManualExportService; + + private readonly ITrajectoryNnbRepository trajectoryFactNnbRepository; + private readonly TrajectoryFactNnbExportService trajectoryFactNnbExportService; + + private readonly int idWell = 4; + + private readonly TrajectoryGeoPlanDto[] trajectoryPlannedRows = new TrajectoryGeoPlanDto[2] { + new TrajectoryGeoPlanDto() { + Id = 1, + AzimuthGeo = 1, + AzimuthMagnetic = 2, + Comment = "комментарий", + IdUser = 1, + IdWell = 4, + Radius = 3, + UpdateDate = DateTime.Now, + VerticalDepth = 100, + WellboreDepth = 100, + ZenithAngle = 10 + }, + new TrajectoryGeoPlanDto() { + Id = 2, + AzimuthGeo = 1, + AzimuthMagnetic = 2, + Comment = "комментарий", + IdUser = 1, + IdWell = 4, + Radius = 3, + UpdateDate = DateTime.Now, + VerticalDepth = 100, + WellboreDepth = 100, + ZenithAngle = 10 + }, + }; + + private readonly TrajectoryGeoFactDto[] trajectoryFactRows = new TrajectoryGeoFactDto[2] { + new TrajectoryGeoFactDto() { + Id = 1, + AzimuthGeo = 1, + AzimuthMagnetic = 2, + Comment = "комментарий", + IdUser = 1, + IdWell = 4, + UpdateDate = DateTime.Now, + VerticalDepth = 100, + WellboreDepth = 100, + ZenithAngle = 10 + }, + new TrajectoryGeoFactDto() { + Id = 2, + AzimuthGeo = 1, + AzimuthMagnetic = 2, + Comment = "комментарий", + IdUser = 1, + IdWell = 4, + UpdateDate = DateTime.Now, + VerticalDepth = 100, + WellboreDepth = 100, + ZenithAngle = 10 + }, + }; + + + public TrajectoryExportTest() + { + wellService = Substitute.For(); + trajectoryPlannedRepository = Substitute.For>(); + trajectoryPlannedExportService = new TrajectoryPlannedExportService(wellService, trajectoryPlannedRepository); + + trajectoryFactManualReposirory = Substitute.For>(); + trajectoryFactManualExportService = new TrajectoryFactManualExportService(wellService, trajectoryFactManualReposirory); + + trajectoryFactNnbRepository = Substitute.For(); + trajectoryFactNnbExportService = new TrajectoryFactNnbExportService(wellService, trajectoryFactNnbRepository); + } + + [Fact] + public async Task Export_trajectory_planned() + { + trajectoryPlannedRepository.GetAsync(idWell, CancellationToken.None) + .Returns(trajectoryPlannedRows); + + var stream = await trajectoryPlannedExportService.ExportAsync(idWell, CancellationToken.None); + Assert.True(stream.Length > 0); + + } + + [Fact] + public async Task Export_trajectory_fact_manual() + { + trajectoryFactManualReposirory.GetAsync(idWell, CancellationToken.None) + .Returns(trajectoryFactRows); + + var stream = await trajectoryFactManualExportService.ExportAsync(idWell, CancellationToken.None); + Assert.True(stream.Length > 0); + } + + [Fact] + public async Task Export_trajectory_fact_nnb() + { + trajectoryFactNnbRepository.GetAsync(idWell, CancellationToken.None) + .Returns(trajectoryFactRows); + + var stream = await trajectoryFactNnbExportService.ExportAsync(idWell, CancellationToken.None); + Assert.True(stream.Length > 0); + } + } +} diff --git a/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryImportTest.cs b/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryImportTest.cs new file mode 100644 index 00000000..0250cefd --- /dev/null +++ b/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryImportTest.cs @@ -0,0 +1,53 @@ +using AsbCloudApp.Services; +using AsbCloudInfrastructure.Services.Trajectory; +using AsbCloudInfrastructure.Services.Trajectory.Import; +using NSubstitute; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace AsbCloudWebApi.Tests.Services.Trajectory +{ + public class TrajectoryImportTest + { + private readonly TrajectoryPlannedImportService trajectoryPlannedImportService; + private readonly TrajectoryFactManualImportService trajectoryFactManualImportService; + + private string usingTemplateFile = "AsbCloudWebApi.Tests.Services.Trajectory.Templates"; + + public TrajectoryImportTest() + { + trajectoryPlannedImportService = new TrajectoryPlannedImportService(); + trajectoryFactManualImportService = new TrajectoryFactManualImportService(); + } + + [Fact] + public async Task Import_trajectory_planned() + { + var stream = System.Reflection.Assembly.GetExecutingAssembly() + .GetManifestResourceStream($"{usingTemplateFile}.TrajectoryPlannedTemplate.xlsx"); + + if (stream is null) + Assert.Fail("Файла для импорта не существует"); + + var trajectoryRows = await trajectoryPlannedImportService.ImportAsync(stream, CancellationToken.None); + + Assert.Equal(3, trajectoryRows.Count()); + } + + [Fact] + public async Task Import_trajectory_fact_manual() + { + var stream = System.Reflection.Assembly.GetExecutingAssembly() + .GetManifestResourceStream($"{usingTemplateFile}.TrajectoryFactManualTemplate.xlsx"); + + if (stream is null) + Assert.Fail("Файла для импорта не существует"); + + var trajectoryRows = await trajectoryFactManualImportService.ImportAsync(stream, CancellationToken.None); + + Assert.Equal(4, trajectoryRows.Count()); + } + } +} diff --git a/AsbCloudWebApi.Tests/Services/TrajectoryVisualizationServiceTest.cs b/AsbCloudWebApi.Tests/Services/TrajectoryVisualizationServiceTest.cs index c256e4ab..9a346a3d 100644 --- a/AsbCloudWebApi.Tests/Services/TrajectoryVisualizationServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/TrajectoryVisualizationServiceTest.cs @@ -1,4 +1,4 @@ -using AsbCloudApp.Data; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; using AsbCloudInfrastructure.Services.Trajectory; using Moq; @@ -50,7 +50,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests var service = new TrajectoryService(mockPlan.Object, mockFact.Object, mockNnb.Object); var result = await service.GetTrajectoryCartesianAsync(1, CancellationToken.None); Assert.Equal(plannedTrajectory.Length, result.Plan?.Count()); - Assert.Equal(actualTrajectory.Length, result.Fact?.Count()); + Assert.Equal(actualTrajectory.Length, result.FactManual?.Count()); } [Fact] @@ -82,7 +82,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests var service = new TrajectoryService(mockPlan.Object, mockFact.Object, mockNnb.Object); var result = await service.GetTrajectoryCartesianAsync(1, CancellationToken.None); var lastPointPlan = result.Plan!.Last(); - var lastPointFact = result.Fact!.Last(); + var lastPointFact = result.FactManual!.Last(); Assert.Equal(0d, lastPointPlan.X, 0.1d); Assert.Equal(-50d, lastPointPlan.Y, 0.1d); @@ -116,7 +116,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests var service = new TrajectoryService(mockPlanned.Object, mockFactual.Object, mockNnb.Object); var result = await service.GetTrajectoryCartesianAsync(1, CancellationToken.None); var lastPointPlan = result.Plan!.Last(); - var lastPointFact = result.Fact!.Last(); + var lastPointFact = result.FactManual!.Last(); var tolerancePlan = 0.001d; var toleranceFact = 0.001d; diff --git a/AsbCloudWebApi/Controllers/Trajectory/NnbTrajectoryController.cs b/AsbCloudWebApi/Controllers/Trajectory/NnbTrajectoryController.cs deleted file mode 100644 index 72dea0ef..00000000 --- a/AsbCloudWebApi/Controllers/Trajectory/NnbTrajectoryController.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using AsbCloudApp.Data; -using AsbCloudApp.Repositories; -using AsbCloudApp.Services; -using AsbCloudInfrastructure.Services; -using AsbCloudInfrastructure.Services.Trajectory; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; - -namespace AsbCloudWebApi.Controllers.Trajectory; - -/// -/// Фактическая траектория из ННБ -/// -[Authorize] -[ApiController] -[Route("api/well/{idWell}/[controller]")] -public class NnbTrajectoryController : ControllerBase -{ - private readonly ITrajectoryNnbRepository trajectoryNnbRepository; - private readonly NnbTrajectoryImportService factNnbTrajectoryImportService; - private readonly IWellService wellService; - - public NnbTrajectoryController( - ITrajectoryNnbRepository trajectoryNnbRepository, - NnbTrajectoryImportService factNnbTrajectoryImportService, - IWellService wellService) - { - this.trajectoryNnbRepository = trajectoryNnbRepository; - this.factNnbTrajectoryImportService = factNnbTrajectoryImportService; - this.wellService = wellService; - this.wellService = wellService; - } - - /// - /// Метод получения всех строк фактических траекторий по id скважины из ННБ - /// - /// Id скважины - /// Токен отмены операции - /// - [HttpGet] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetRowsAsync([FromRoute] int idWell, - CancellationToken cancellationToken) - { - var nnbFactTrajectories = await trajectoryNnbRepository.GetAsync(idWell, - cancellationToken); - - return Ok(nnbFactTrajectories); - } - - /// - /// Формируем excel файл с текущими строками фактической ннб-траектории - /// - /// id скважины - /// Токен отмены задачи - /// Запрашиваемый файл - [HttpGet("export")] - [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK, "application/octet-stream")] - [ProducesResponseType(StatusCodes.Status204NoContent)] - public async Task ExportAsync([FromRoute] int idWell, CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, - token).ConfigureAwait(false)) - return Forbid(); - var stream = await factNnbTrajectoryImportService.ExportAsync(idWell, token); - var fileName = await factNnbTrajectoryImportService.GetFileNameAsync(idWell, token); - return File(stream, "application/octet-stream", fileName); - } - - private async Task CanUserAccessToWellAsync(int idWell, CancellationToken token) - { - int? idCompany = User.GetCompanyId(); - return idCompany is not null && await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, - idWell, token).ConfigureAwait(false); - } -} \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryController.cs b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryController.cs index 8bd2cca6..e37f02b2 100644 --- a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryController.cs +++ b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryController.cs @@ -1,12 +1,10 @@ -using AsbCloudApp.Data; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; using AsbCloudApp.Services; -using AsbCloudInfrastructure.Services.Trajectory; +using AsbCloudInfrastructure.Services.Trajectory.Export; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using System.Collections.Generic; -using System.IO; using System.Threading; using System.Threading.Tasks; @@ -21,35 +19,21 @@ namespace AsbCloudWebApi.Controllers.Trajectory public abstract class TrajectoryController : ControllerBase where Tdto : TrajectoryGeoDto { - protected string fileName; + protected abstract string fileName { get; set; } private readonly IWellService wellService; - private readonly TrajectoryImportService trajectoryImportService; - private readonly ITrajectoryEditableRepository trajectoryRepository; + private readonly TrajectoryExportService trajectoryExportService; + private readonly ITrajectoryRepository trajectoryRepository; public TrajectoryController(IWellService wellService, - TrajectoryImportService trajectoryImportService, - ITrajectoryEditableRepository trajectoryRepository) + TrajectoryExportService trajectoryExportService, + ITrajectoryRepository trajectoryRepository) { - this.trajectoryImportService = trajectoryImportService; + this.trajectoryExportService = trajectoryExportService; this.wellService = wellService; this.trajectoryRepository = trajectoryRepository; } - /// - /// Возвращает excel шаблон для заполнения строк траектории - /// - /// Запрашиваемый файл - [HttpGet("template")] - [AllowAnonymous] - [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK, "application/octet-stream")] - [ProducesResponseType(StatusCodes.Status204NoContent)] - public IActionResult GetTemplate() - { - var stream = trajectoryImportService.GetTemplateFile(); - return File(stream, "application/octet-stream", fileName); - } - /// /// Формируем excel файл с текущими строками траектории /// @@ -64,57 +48,11 @@ namespace AsbCloudWebApi.Controllers.Trajectory if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - var stream = await trajectoryImportService.ExportAsync(idWell, token); - var fileName = await trajectoryImportService.GetFileNameAsync(idWell, token); + var stream = await trajectoryExportService.ExportAsync(idWell, token); + var fileName = await trajectoryExportService.GetFileNameAsync(idWell, token); return File(stream, "application/octet-stream", fileName); } - /// - /// Импортирует координаты из excel (xlsx) файла - /// - /// id скважины - /// Коллекция из одного файла xlsx - /// Удалить операции перед импортом, если фал валидный - /// Токен отмены задачи - /// количество успешно записанных строк в БД - [HttpPost("import/{deleteBeforeImport}")] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] - public async Task ImportAsync(int idWell, - [FromForm] IFormFileCollection files, - bool deleteBeforeImport, - CancellationToken token) - { - int? idUser = User.GetUserId(); - if (!idUser.HasValue) - return Forbid(); - if (!await CanUserAccessToWellAsync(idWell, - token).ConfigureAwait(false)) - return Forbid(); - if (files.Count < 1) - return this.ValidationBadRequest(nameof(files), "нет файла"); - var file = files[0]; - if (Path.GetExtension(file.FileName).ToLower() != ".xlsx") - return this.ValidationBadRequest(nameof(files), "Требуется xlsx файл."); - using Stream stream = file.OpenReadStream(); - - try - { - var trajectoryRows = await trajectoryImportService.ImportAsync(idWell, idUser.Value, stream, token); - - if (deleteBeforeImport) - await trajectoryRepository.DeleteByIdWellAsync(idWell, token); - - var rowsCount = await trajectoryRepository.AddRangeAsync(trajectoryRows, token); - - return Ok(rowsCount); - } - catch (FileFormatException ex) - { - return this.ValidationBadRequest(nameof(files), ex.Message); - } - } - /// /// Получаем список всех строк координат траектории (для клиента) /// @@ -123,7 +61,7 @@ namespace AsbCloudWebApi.Controllers.Trajectory /// Список добавленных координат траектории [HttpGet] //[ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public virtual async Task GetAsync([FromRoute] int idWell, CancellationToken token) + public async Task GetAsync([FromRoute] int idWell, CancellationToken token) { if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) @@ -132,100 +70,6 @@ namespace AsbCloudWebApi.Controllers.Trajectory return Ok(result); } - /// - /// Добавить одну новую строчку координат для плановой траектории - /// - /// - /// - /// - /// количество успешно записанных строк в БД - [HttpPost] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task AddAsync(int idWell, [FromBody] Tdto row, - CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) - return Forbid(); - var idUser = User.GetUserId(); - if (!idUser.HasValue) - return Forbid(); - row.IdUser = idUser.Value; - row.IdWell = idWell; - var result = await trajectoryRepository.AddAsync(row, token); - return Ok(result); - } - - /// - /// Добавить массив строчек координат для плановой траектории - /// - /// - /// - /// - /// количество успешно записанных строк в БД - [HttpPost("range")] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task AddRangeAsync(int idWell, [FromBody] IEnumerable rows, - CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) - return Forbid(); - int? idUser = User.GetUserId(); - if (!idUser.HasValue) - return Forbid(); - foreach (var item in rows) - { - item.IdUser = idUser.Value; - item.IdWell = idWell; - } - var result = await trajectoryRepository.AddRangeAsync(rows, token); - return Ok(result); - } - - /// - /// Изменить выбранную строку с координатами - /// - /// - /// - /// - /// - /// количество успешно обновленных строк в БД - [HttpPut("{idRow}")] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task UpdateAsync(int idWell, int idRow, - [FromBody] Tdto row, CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) - return Forbid(); - int? idUser = User.GetUserId(); - if (!idUser.HasValue) - return Forbid(); - row.Id = idRow; - row.IdUser = idUser.Value; - row.IdWell = idWell; - var result = await trajectoryRepository.UpdateAsync(row, token); - return Ok(result); - } - - /// - /// Удалить выбранную строку с координатами - /// - /// - /// - /// - /// количество успешно удаленных строк из БД - [HttpDelete("{idRow}")] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task DeleteAsync(int idWell, int idRow, CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, - token).ConfigureAwait(false)) - return Forbid(); - - var result = await trajectoryRepository.DeleteRangeAsync(new int[] { idRow }, token); - - return Ok(result); - } - protected async Task CanUserAccessToWellAsync(int idWell, CancellationToken token) { int? idCompany = User.GetCompanyId(); diff --git a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs new file mode 100644 index 00000000..a5e8660e --- /dev/null +++ b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs @@ -0,0 +1,206 @@ +using AsbCloudApp.Data.Trajectory; +using AsbCloudApp.Repositories; +using AsbCloudApp.Services; +using AsbCloudInfrastructure.Services.Trajectory.Export; +using AsbCloudInfrastructure.Services.Trajectory.Import; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudWebApi.Controllers.Trajectory +{ + + /// + /// Плановые и фактические траектории (загрузка и хранение) + /// + [ApiController] + [Authorize] + public abstract class TrajectoryEditableController : TrajectoryController + where Tdto : TrajectoryGeoDto + { + protected override string fileName { get; set; } + + private readonly TrajectoryImportService trajectoryImportService; + private readonly TrajectoryExportService trajectoryExportService; + private readonly ITrajectoryEditableRepository trajectoryRepository; + + public TrajectoryEditableController(IWellService wellService, + TrajectoryImportService trajectoryImportService, + TrajectoryExportService trajectoryExportService, + ITrajectoryEditableRepository trajectoryRepository) + : base( + wellService, + trajectoryExportService, + trajectoryRepository) + { + this.trajectoryImportService = trajectoryImportService; + this.trajectoryExportService = trajectoryExportService; + this.trajectoryRepository = trajectoryRepository; + + } + + /// + /// Возвращает excel шаблон для заполнения строк траектории + /// + /// Запрашиваемый файл + [HttpGet("template")] + [AllowAnonymous] + [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK, "application/octet-stream")] + [ProducesResponseType(StatusCodes.Status204NoContent)] + public IActionResult GetTemplate() + { + var stream = trajectoryExportService.GetTemplateFile(); + return File(stream, "application/octet-stream", fileName); + } + + /// + /// Импортирует координаты из excel (xlsx) файла + /// + /// id скважины + /// Коллекция из одного файла xlsx + /// Удалить операции перед импортом, если фал валидный + /// Токен отмены задачи + /// количество успешно записанных строк в БД + [HttpPost("import/{deleteBeforeImport}")] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] + public async Task ImportAsync(int idWell, + [FromForm] IFormFileCollection files, + bool deleteBeforeImport, + CancellationToken token) + { + int? idUser = User.GetUserId(); + if (!idUser.HasValue) + return Forbid(); + if (!await CanUserAccessToWellAsync(idWell, + token).ConfigureAwait(false)) + return Forbid(); + if (files.Count < 1) + return this.ValidationBadRequest(nameof(files), "нет файла"); + var file = files[0]; + if (Path.GetExtension(file.FileName).ToLower() != ".xlsx") + return this.ValidationBadRequest(nameof(files), "Требуется xlsx файл."); + using Stream stream = file.OpenReadStream(); + + try + { + var trajectoryRows = await trajectoryImportService.ImportAsync(stream, token); + foreach (var row in trajectoryRows) + { + row.IdWell = idWell; + row.IdUser = idUser.Value; + } + + if (deleteBeforeImport) + await trajectoryRepository.DeleteByIdWellAsync(idWell, token); + + var rowsCount = await trajectoryRepository.AddRangeAsync(trajectoryRows, token); + + return Ok(rowsCount); + } + catch (FileFormatException ex) + { + return this.ValidationBadRequest(nameof(files), ex.Message); + } + } + + + /// + /// Добавить одну новую строчку координат для плановой траектории + /// + /// + /// + /// + /// количество успешно записанных строк в БД + [HttpPost] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task AddAsync(int idWell, [FromBody] Tdto row, + CancellationToken token) + { + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) + return Forbid(); + var idUser = User.GetUserId(); + if (!idUser.HasValue) + return Forbid(); + row.IdUser = idUser.Value; + row.IdWell = idWell; + var result = await trajectoryRepository.AddAsync(row, token); + return Ok(result); + } + + /// + /// Добавить массив строчек координат для плановой траектории + /// + /// + /// + /// + /// количество успешно записанных строк в БД + [HttpPost("range")] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task AddRangeAsync(int idWell, [FromBody] IEnumerable rows, + CancellationToken token) + { + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) + return Forbid(); + int? idUser = User.GetUserId(); + if (!idUser.HasValue) + return Forbid(); + foreach (var item in rows) + { + item.IdUser = idUser.Value; + item.IdWell = idWell; + } + var result = await trajectoryRepository.AddRangeAsync(rows, token); + return Ok(result); + } + + /// + /// Изменить выбранную строку с координатами + /// + /// + /// + /// + /// + /// количество успешно обновленных строк в БД + [HttpPut("{idRow}")] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task UpdateAsync(int idWell, int idRow, + [FromBody] Tdto row, CancellationToken token) + { + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) + return Forbid(); + int? idUser = User.GetUserId(); + if (!idUser.HasValue) + return Forbid(); + row.Id = idRow; + row.IdUser = idUser.Value; + row.IdWell = idWell; + var result = await trajectoryRepository.UpdateAsync(row, token); + return Ok(result); + } + + /// + /// Удалить выбранную строку с координатами + /// + /// + /// + /// + /// количество успешно удаленных строк из БД + [HttpDelete("{idRow}")] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task DeleteAsync(int idWell, int idRow, CancellationToken token) + { + if (!await CanUserAccessToWellAsync(idWell, + token).ConfigureAwait(false)) + return Forbid(); + + var result = await trajectoryRepository.DeleteRangeAsync(new int[] { idRow }, token); + + return Ok(result); + } + } +} diff --git a/AsbCloudWebApi/Controllers/Trajectory/FactTrajectoryController.cs b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactManualController.cs similarity index 52% rename from AsbCloudWebApi/Controllers/Trajectory/FactTrajectoryController.cs rename to AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactManualController.cs index 6504da73..c9e408a2 100644 --- a/AsbCloudWebApi/Controllers/Trajectory/FactTrajectoryController.cs +++ b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactManualController.cs @@ -1,7 +1,8 @@ -using AsbCloudApp.Data; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; using AsbCloudApp.Services; -using AsbCloudInfrastructure.Services.Trajectory; +using AsbCloudInfrastructure.Services.Trajectory.Export; +using AsbCloudInfrastructure.Services.Trajectory.Import; using Microsoft.AspNetCore.Mvc; namespace AsbCloudWebApi.Controllers.Trajectory; @@ -11,14 +12,17 @@ namespace AsbCloudWebApi.Controllers.Trajectory; /// [ApiController] [Route("api/well/{idWell}/[controller]")] -public class FactTrajectoryController : TrajectoryController +public class TrajectoryFactManualController : TrajectoryEditableController { - public FactTrajectoryController(IWellService wellService, - FactTrajectoryImportService factTrajectoryImportService, + protected override string fileName { get; set; } + public TrajectoryFactManualController(IWellService wellService, + TrajectoryFactManualImportService factTrajectoryImportService, + TrajectoryFactManualExportService factTrajectoryExportService, ITrajectoryEditableRepository trajectoryFactRepository) : base( wellService, factTrajectoryImportService, + factTrajectoryExportService, trajectoryFactRepository) { fileName = "ЕЦП_шаблон_файла_фактическая_траектория.xlsx"; diff --git a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactNnbController.cs b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactNnbController.cs new file mode 100644 index 00000000..6bd1c658 --- /dev/null +++ b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryFactNnbController.cs @@ -0,0 +1,30 @@ +using AsbCloudApp.Data.Trajectory; +using AsbCloudApp.Repositories; +using AsbCloudApp.Services; +using AsbCloudInfrastructure.Services.Trajectory.Export; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace AsbCloudWebApi.Controllers.Trajectory; + +/// +/// Фактическая траектория из ННБ +/// +[Authorize] +[ApiController] +[Route("api/well/{idWell}/[controller]")] +public class TrajectoryFactNnbController : TrajectoryController +{ + protected override string fileName { get; set; } + public TrajectoryFactNnbController( + ITrajectoryNnbRepository trajectoryNnbRepository, + TrajectoryFactNnbExportService trajectoryExportService, + IWellService wellService) + : base( + wellService, + trajectoryExportService, + trajectoryNnbRepository) + { + fileName = "ЕЦП_шаблон_файла_фактическая_ннб_траектория.xlsx"; + } +} \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/Trajectory/PlannedTrajectoryController.cs b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryPlannedController.cs similarity index 70% rename from AsbCloudWebApi/Controllers/Trajectory/PlannedTrajectoryController.cs rename to AsbCloudWebApi/Controllers/Trajectory/TrajectoryPlannedController.cs index 01b87365..669b1600 100644 --- a/AsbCloudWebApi/Controllers/Trajectory/PlannedTrajectoryController.cs +++ b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryPlannedController.cs @@ -1,7 +1,9 @@ -using AsbCloudApp.Data; +using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Repositories; using AsbCloudApp.Services; using AsbCloudInfrastructure.Services.Trajectory; +using AsbCloudInfrastructure.Services.Trajectory.Import; +using AsbCloudInfrastructure.Services.Trajectory.Export; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading; @@ -15,17 +17,19 @@ namespace AsbCloudWebApi.Controllers.Trajectory /// [Route("api/well/{idWell}/plannedTrajectory")] [ApiController] - public class PlannedTrajectoryController : TrajectoryController + public class TrajectoryPlannedController : TrajectoryEditableController { private readonly TrajectoryService trajectoryVisualizationService; - public PlannedTrajectoryController(IWellService wellService, - PlannedTrajectoryImportService plannedTrajectoryImportService, + public TrajectoryPlannedController(IWellService wellService, + TrajectoryPlannedImportService plannedTrajectoryImportService, + TrajectoryPlannedExportService plannedTrajectoryExportService, ITrajectoryEditableRepository plannedTrajectoryRepository, TrajectoryService trajectoryVisualizationService) : base( wellService, plannedTrajectoryImportService, + plannedTrajectoryExportService, plannedTrajectoryRepository) { fileName = "ЕЦП_шаблон_файла_плановая_траектория.xlsx"; @@ -39,10 +43,10 @@ namespace AsbCloudWebApi.Controllers.Trajectory /// /// [HttpGet("trajectoryCartesianPlanFact")] - [ProducesResponseType(typeof(PlanFactBase, IEnumerable, IEnumerable>), (int)System.Net.HttpStatusCode.OK)] + [ProducesResponseType(typeof(TrajectoryPlanFactDto, IEnumerable>), (int)System.Net.HttpStatusCode.OK)] public async Task GetTrajectoryCartesianPlanFactAsync(int idWell, CancellationToken token) { - if (!await base.CanUserAccessToWellAsync(idWell, + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid();