From edd5ca695f4b29dfd751c5ed4b2fef4d67f28df8 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 3 May 2024 14:37:46 +0500 Subject: [PATCH 01/19] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D0=B0=20ChangeLogAbstract=20=D0=B2=20ChangeLogDto=20+=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F,=20?= =?UTF-8?q?=D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=81?= =?UTF-8?q?=20=D1=8D=D1=82=D0=B8=D0=BC.=20=D0=9D=D0=B0=D1=87=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/ChangeLogAbstract.cs | 59 - .../Data/ProcessMaps/ProcessMapPlanBaseDto.cs | 7 +- AsbCloudApp/Extensions/ChangeLogExtensions.cs | 5 +- .../Repositories/IChangeLogRepository.cs | 5 +- AsbCloudInfrastructure/DependencyInjection.cs | 11 + .../Repository/ChangeLogRepositoryAbstract.cs | 16 +- .../ProcessMapPlanBaseRepository.cs | 5 +- .../Export/ProcessMapPlanExportService.cs | 3 +- .../Report/ProcessMapReportDrillingService.cs | 5 + .../ProcessMapPlanDrillingControllerTest.cs | 1006 ++++++++--------- 10 files changed, 545 insertions(+), 577 deletions(-) delete mode 100644 AsbCloudApp/Data/ChangeLogAbstract.cs diff --git a/AsbCloudApp/Data/ChangeLogAbstract.cs b/AsbCloudApp/Data/ChangeLogAbstract.cs deleted file mode 100644 index 9e34c948..00000000 --- a/AsbCloudApp/Data/ChangeLogAbstract.cs +++ /dev/null @@ -1,59 +0,0 @@ -using AsbCloudApp.Data.User; -using System; - -namespace AsbCloudApp.Data; - -/// -/// Часть записи описывающая изменение -/// -public abstract class ChangeLogAbstract -{ - /// - /// ИД записи - /// - public int Id { get; set; } - - /// - /// Автор - /// - public UserDto? Author { get; set; } - - /// - /// Автор - /// - public UserDto? Editor { get; set; } - - /// - /// Дата создания записи - /// - public DateTimeOffset Creation { get; set; } - - /// - /// Дата устаревания (например при удалении) - /// - public DateTimeOffset? Obsolete { get; set; } - - /// - /// ИД состояния записи: - /// - /// - /// 0 - /// актуальная запись - /// - /// - /// 1 - /// замененная запись - /// - /// - /// 2 - /// удаленная запись - /// - /// - /// - public int IdState { get; set; } - - /// - /// Id заменяемой записи - /// - public int? IdPrevious { get; set; } -} diff --git a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs index c2ce713a..13eb6583 100644 --- a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs +++ b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs @@ -5,13 +5,18 @@ using System.ComponentModel.DataAnnotations; namespace AsbCloudApp.Data.ProcessMaps; /// -public abstract class ProcessMapPlanBaseDto : ChangeLogAbstract, IId, IWellRelated, IValidatableObject +public abstract class ProcessMapPlanBaseDto : IId, IWellRelated, IValidatableObject { /// /// Id скважины /// public int IdWell { get; set; } + /// + /// Id записи + /// + public int Id { get; set; } + /// /// Тип секции /// diff --git a/AsbCloudApp/Extensions/ChangeLogExtensions.cs b/AsbCloudApp/Extensions/ChangeLogExtensions.cs index 83f28fbe..628c2661 100644 --- a/AsbCloudApp/Extensions/ChangeLogExtensions.cs +++ b/AsbCloudApp/Extensions/ChangeLogExtensions.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.ProcessMaps; using System; using System.Collections.Generic; using System.Linq; @@ -19,8 +20,8 @@ namespace AsbCloudApp.Extensions /// /// /// - public static IEnumerable WhereActualAtMoment(this IEnumerable items, DateTimeOffset moment) - where T : ChangeLogAbstract + public static IEnumerable> WhereActualAtMoment(this IEnumerable> items, DateTimeOffset moment) + where T : ProcessMapPlanBaseDto { var actualItems = items .Where(item => item.Creation <= moment) diff --git a/AsbCloudApp/Repositories/IChangeLogRepository.cs b/AsbCloudApp/Repositories/IChangeLogRepository.cs index a8a5e635..7509a15d 100644 --- a/AsbCloudApp/Repositories/IChangeLogRepository.cs +++ b/AsbCloudApp/Repositories/IChangeLogRepository.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data; +using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Requests; namespace AsbCloudApp.Repositories; @@ -11,7 +12,7 @@ namespace AsbCloudApp.Repositories; /// Репозиторий для записей с историей /// public interface IChangeLogRepository - where TDto : ChangeLogAbstract + where TDto : ProcessMapPlanBaseDto where TRequest : ChangeLogBaseRequest { /// @@ -84,7 +85,7 @@ public interface IChangeLogRepository /// Фильтр по дате. Если null - вернет все /// /// - Task> GetChangeLog(TRequest request, DateOnly? date, CancellationToken token); + Task>> GetChangeLog(TRequest request, DateOnly? date, CancellationToken token); /// /// Получение записей по параметрам diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 713f5614..9f802e2e 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -45,6 +45,10 @@ using System; using AsbCloudApp.Data.DetectedOperation; using AsbCloudInfrastructure.Services.ProcessMapPlan.Export; using AsbCloudInfrastructure.Services.WellOperations.Factories; +using AsbCloudDb.Model.ProcessMapPlan; +using static Org.BouncyCastle.Math.EC.ECCurve; +using AsbCloudApp.Data.User; +using DocumentFormat.OpenXml.Drawing; namespace AsbCloudInfrastructure { @@ -127,6 +131,13 @@ namespace AsbCloudInfrastructure { Plan = src.WellDepthPlan }); + + TypeAdapterConfig>.NewConfig() + .Include>() + .Map(dest => dest, src => new ChangeLogDto() + { + Item = src.Adapt() + }); } public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration) diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index 7a01f7df..1c83500d 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -1,4 +1,6 @@ -using AsbCloudApp.Exceptions; +using AsbCloudApp.Data; +using AsbCloudApp.Data.ProcessMaps; +using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudDb.Model; @@ -14,7 +16,7 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository; public abstract class ChangeLogRepositoryAbstract : IChangeLogRepository - where TDto : AsbCloudApp.Data.ChangeLogAbstract + where TDto : ProcessMapPlanBaseDto where TEntity : ChangeLogAbstract where TRequest : ChangeLogBaseRequest { @@ -217,7 +219,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh return datesOnly; } - public async Task> GetChangeLog(TRequest request, DateOnly? date, CancellationToken token) + public async Task>> GetChangeLog(TRequest request, DateOnly? date, CancellationToken token) { var query = BuildQuery(request); TimeSpan offset = GetTimezoneOffset(request); @@ -238,7 +240,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh .ThenBy(e => e.Obsolete) .ThenBy(e => e.Id) .ToListAsync(token); - var dtos = entities.Select(e => Convert(e, offset)); + var dtos = entities.Select(e => Convert2(e, offset)); return dtos; } @@ -253,7 +255,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh .ToArrayAsync(token); TimeSpan offset = GetTimezoneOffset(request); - var dtos = entities.Select(e => Convert(e, offset)); + var dtos = entities.Select(e => e.Adapt()); return dtos; } @@ -272,9 +274,9 @@ public abstract class ChangeLogRepositoryAbstract : ICh return entity; } - protected virtual TDto Convert(TEntity entity, TimeSpan offset) + protected ChangeLogDto Convert2(TEntity entity, TimeSpan offset) { - var dto = entity.Adapt(); + var dto = entity.Adapt>(); dto.Creation = entity.Creation.ToOffset(offset); if (entity.Obsolete.HasValue) diff --git a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs index b8662d35..5e351db7 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs @@ -3,6 +3,7 @@ using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudDb.Model.ProcessMapPlan; +using Mapster; using Microsoft.EntityFrameworkCore; using System; using System.Linq; @@ -58,9 +59,9 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb return offset; } - protected override TDto Convert(TEntity entity, TimeSpan offset) + protected TDto Convert(TEntity entity, TimeSpan offset) { - var dto = base.Convert(entity, offset); + var dto = entity.Adapt(); dto.Section = entity.WellSectionType.Caption; return dto; } diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs index 07cc6a13..f512c2f1 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data; +using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Requests.ExportOptions; @@ -12,7 +13,7 @@ using AsbCloudInfrastructure.Services.ExcelServices; namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export; public abstract class ProcessMapPlanExportService : ExportExcelService - where TDto : ChangeLogAbstract + where TDto : ProcessMapPlanBaseDto { protected readonly IWellService wellService; diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs index 313f76e7..f78d30dc 100644 --- a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs @@ -131,7 +131,12 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService .Where(p => p.DepthStart <= data.DepthStart) .Where(p => p.DepthEnd >= data.DepthStart) .Where(p => IsModeMatchOperationCategory(p.IdMode, data.IdCategory)) + .Select(p => new ChangeLogDto() + { + Item = p, + }) .WhereActualAtMoment(data.DateStart) + .Select(p => p.Item) .FirstOrDefault(); var idWellSectionType = GetSection(firstElemInInterval); diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs index 8199e785..18bda7f0 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs @@ -1,618 +1,618 @@ -using AsbCloudApp.Requests; -using AsbCloudDb.Model.ProcessMapPlan; -using AsbCloudWebApi.IntegrationTests.Clients; -using Mapster; -using Microsoft.EntityFrameworkCore; -using System.Net; -using System.Reflection; -using AsbCloudDb.Model.ProcessMaps; -using AsbCloudWebApi.IntegrationTests.Data; -using Refit; -using Xunit; -using AsbCloudApp.Data.ProcessMaps; -using AsbCloudDb.Model; -using AsbCloudApp.Data.User; +//using AsbCloudApp.Requests; +//using AsbCloudDb.Model.ProcessMapPlan; +//using AsbCloudWebApi.IntegrationTests.Clients; +//using Mapster; +//using Microsoft.EntityFrameworkCore; +//using System.Net; +//using System.Reflection; +//using AsbCloudDb.Model.ProcessMaps; +//using AsbCloudWebApi.IntegrationTests.Data; +//using Refit; +//using Xunit; +//using AsbCloudApp.Data.ProcessMaps; +//using AsbCloudDb.Model; +//using AsbCloudApp.Data.User; -namespace AsbCloudWebApi.IntegrationTests.Controllers.ProcessMapPlan; +//namespace AsbCloudWebApi.IntegrationTests.Controllers.ProcessMapPlan; -public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest -{ - private const int IdWell = 1; +//public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest +//{ +// private const int IdWell = 1; - private readonly ProcessMapPlanDrillingDto dto = new (){ - Id = 0, - Creation = new(), - Obsolete = null, - IdState = 0, - IdPrevious = null, +// private readonly ProcessMapPlanDrillingDto dto = new (){ +// Id = 0, +// Creation = new(), +// Obsolete = null, +// IdState = 0, +// IdPrevious = null, - IdWell = IdWell, - Section = "Кондуктор", - IdWellSectionType = 3, - DepthStart = 0.5, - DepthEnd = 1.5, +// IdWell = IdWell, +// Section = "Кондуктор", +// IdWellSectionType = 3, +// DepthStart = 0.5, +// DepthEnd = 1.5, - IdMode = 1, - AxialLoadPlan = 2.718281, - AxialLoadLimitMax = 3.1415926, - DeltaPressurePlan = 4, - DeltaPressureLimitMax = 5, - TopDriveTorquePlan = 6, - TopDriveTorqueLimitMax = 7, - TopDriveSpeedPlan = 8, - TopDriveSpeedLimitMax = 9, - FlowPlan = 10, - FlowLimitMax = 11, - RopPlan = 12, - UsageSaub = 13, - UsageSpin = 14, - Comment = "это тестовая запись", - }; - private readonly ProcessMapPlanDrilling entity = new () - { - Id = 0, - IdAuthor = 1, - IdEditor = null, - Creation = DateTimeOffset.UtcNow, - Obsolete = null, - IdState = AsbCloudDb.Model.ChangeLogAbstract.IdStateActual, - IdPrevious = null, +// IdMode = 1, +// AxialLoadPlan = 2.718281, +// AxialLoadLimitMax = 3.1415926, +// DeltaPressurePlan = 4, +// DeltaPressureLimitMax = 5, +// TopDriveTorquePlan = 6, +// TopDriveTorqueLimitMax = 7, +// TopDriveSpeedPlan = 8, +// TopDriveSpeedLimitMax = 9, +// FlowPlan = 10, +// FlowLimitMax = 11, +// RopPlan = 12, +// UsageSaub = 13, +// UsageSpin = 14, +// Comment = "это тестовая запись", +// }; +// private readonly ProcessMapPlanDrilling entity = new () +// { +// Id = 0, +// IdAuthor = 1, +// IdEditor = null, +// Creation = DateTimeOffset.UtcNow, +// Obsolete = null, +// IdState = AsbCloudDb.Model.ChangeLogAbstract.IdStateActual, +// IdPrevious = null, - IdWell = IdWell, - IdWellSectionType = 1, - DepthStart = 0.5, - DepthEnd = 1.5, +// IdWell = IdWell, +// IdWellSectionType = 1, +// DepthStart = 0.5, +// DepthEnd = 1.5, - IdMode = 1, - AxialLoadPlan = 2.718281, - AxialLoadLimitMax = 3.1415926, - DeltaPressurePlan = 4, - DeltaPressureLimitMax = 5, - TopDriveTorquePlan = 6, - TopDriveTorqueLimitMax = 7, - TopDriveSpeedPlan = 8, - TopDriveSpeedLimitMax = 9, - FlowPlan = 10, - FlowLimitMax = 11, - RopPlan = 12, - UsageSaub = 13, - UsageSpin = 14, - Comment = "это тестовая запись", - }; +// IdMode = 1, +// AxialLoadPlan = 2.718281, +// AxialLoadLimitMax = 3.1415926, +// DeltaPressurePlan = 4, +// DeltaPressureLimitMax = 5, +// TopDriveTorquePlan = 6, +// TopDriveTorqueLimitMax = 7, +// TopDriveSpeedPlan = 8, +// TopDriveSpeedLimitMax = 9, +// FlowPlan = 10, +// FlowLimitMax = 11, +// RopPlan = 12, +// UsageSaub = 13, +// UsageSpin = 14, +// Comment = "это тестовая запись", +// }; - private IProcessMapPlanDrillingClient client; +// private IProcessMapPlanDrillingClient client; - public ProcessMapPlanDrillingControllerTest(WebAppFactoryFixture factory) : base(factory) - { - dbContext.CleanupDbSet(); - client = factory.GetAuthorizedHttpClient(string.Empty); - } +// public ProcessMapPlanDrillingControllerTest(WebAppFactoryFixture factory) : base(factory) +// { +// dbContext.CleanupDbSet(); +// client = factory.GetAuthorizedHttpClient(string.Empty); +// } - [Fact] - public async Task InsertRange_returns_success() - { - //arrange - var expected = dto.Adapt(); +// [Fact] +// public async Task InsertRange_returns_success() +// { +// //arrange +// var expected = dto.Adapt(); - //act - var response = await client.InsertRange(dto.IdWell, new[] { expected }); +// //act +// var response = await client.InsertRange(dto.IdWell, new[] { expected }); - //assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal(1, response.Content); +// //assert +// Assert.Equal(HttpStatusCode.OK, response.StatusCode); +// Assert.Equal(1, response.Content); - var entity = dbContext - .Set() - .Where(p => p.AxialLoadPlan == dto.AxialLoadPlan) - .Where(p => p.AxialLoadLimitMax == dto.AxialLoadLimitMax) - .Where(p => p.Comment == dto.Comment) - .FirstOrDefault(p => p.IdWell == dto.IdWell); +// var entity = dbContext +// .Set() +// .Where(p => p.AxialLoadPlan == dto.AxialLoadPlan) +// .Where(p => p.AxialLoadLimitMax == dto.AxialLoadLimitMax) +// .Where(p => p.Comment == dto.Comment) +// .FirstOrDefault(p => p.IdWell == dto.IdWell); - Assert.NotNull(entity); +// Assert.NotNull(entity); - var actual = entity.Adapt(); - Assert.Equal(ProcessMapPlanBase.IdStateActual, actual.IdState); +// var actual = entity.Adapt(); +// Assert.Equal(ProcessMapPlanBase.IdStateActual, actual.IdState); - var excludeProps = new[] { - nameof(ProcessMapPlanDrillingDto.Id), - nameof(ProcessMapPlanDrillingDto.IdState), - nameof(ProcessMapPlanDrillingDto.Author), - nameof(ProcessMapPlanDrillingDto.Creation), - nameof(ProcessMapPlanDrillingDto.Section) - }; - MatchHelper.Match(expected, actual, excludeProps); - } +// var excludeProps = new[] { +// nameof(ProcessMapPlanDrillingDto.Id), +// nameof(ProcessMapPlanDrillingDto.IdState), +// nameof(ProcessMapPlanDrillingDto.Author), +// nameof(ProcessMapPlanDrillingDto.Creation), +// nameof(ProcessMapPlanDrillingDto.Section) +// }; +// MatchHelper.Match(expected, actual, excludeProps); +// } - [Fact] - public async Task InsertRange_returns_BadRequest_for_IdWellSectionType() - { - //arrange - var badDto = dto.Adapt(); - badDto.IdWellSectionType = int.MaxValue; +// [Fact] +// public async Task InsertRange_returns_BadRequest_for_IdWellSectionType() +// { +// //arrange +// var badDto = dto.Adapt(); +// badDto.IdWellSectionType = int.MaxValue; - //act - var response = await client.InsertRange(dto.IdWell, new[] { badDto }); +// //act +// var response = await client.InsertRange(dto.IdWell, new[] { badDto }); - //assert - Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); - } +// //assert +// Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); +// } - [Fact] - public async Task InsertRange_returns_BadRequest_for_IdMode() - { - //arrange - var badDto = dto.Adapt(); - badDto.IdMode = int.MaxValue; +// [Fact] +// public async Task InsertRange_returns_BadRequest_for_IdMode() +// { +// //arrange +// var badDto = dto.Adapt(); +// badDto.IdMode = int.MaxValue; - //act - var response = await client.InsertRange(dto.IdWell, new[] { badDto }); +// //act +// var response = await client.InsertRange(dto.IdWell, new[] { badDto }); - //assert - Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); - } +// //assert +// Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); +// } - [Fact] - public async Task ClearAndInsertRange_returns_success() - { - // arrange - var dbset = dbContext.Set(); +// [Fact] +// public async Task ClearAndInsertRange_returns_success() +// { +// // arrange +// var dbset = dbContext.Set(); - var entry = dbset.Add(entity); - dbContext.SaveChanges(); - entry.State = EntityState.Detached; +// var entry = dbset.Add(entity); +// dbContext.SaveChanges(); +// entry.State = EntityState.Detached; - var startTime = DateTimeOffset.UtcNow; +// var startTime = DateTimeOffset.UtcNow; - // act - var result = await client.ClearAndInsertRange(entity.IdWell, new ProcessMapPlanDrillingDto[] { dto }); +// // act +// var result = await client.ClearAndInsertRange(entity.IdWell, new ProcessMapPlanDrillingDto[] { dto }); - // assert - var doneTime = DateTimeOffset.UtcNow; - Assert.Equal(HttpStatusCode.OK, result.StatusCode); - Assert.Equal(2, result.Content); +// // assert +// var doneTime = DateTimeOffset.UtcNow; +// Assert.Equal(HttpStatusCode.OK, result.StatusCode); +// Assert.Equal(2, result.Content); - var count = dbset.Count(); - Assert.Equal(2, count); +// var count = dbset.Count(); +// Assert.Equal(2, count); - var oldEntity = dbset.First(p => p.Id == entry.Entity.Id); - Assert.Equal(ProcessMapPlanBase.IdCleared, oldEntity.IdState); - Assert.Equal(1, oldEntity.IdEditor); - Assert.NotNull(oldEntity.Obsolete); - Assert.InRange(oldEntity.Obsolete.Value, startTime, doneTime); +// var oldEntity = dbset.First(p => p.Id == entry.Entity.Id); +// Assert.Equal(ProcessMapPlanBase.IdCleared, oldEntity.IdState); +// Assert.Equal(1, oldEntity.IdEditor); +// Assert.NotNull(oldEntity.Obsolete); +// Assert.InRange(oldEntity.Obsolete.Value, startTime, doneTime); - var newEntity = dbset.First(p => p.Id != entry.Entity.Id); - Assert.Equal(ProcessMapPlanBase.IdStateActual, newEntity.IdState); - Assert.Equal(1, newEntity.IdAuthor); - Assert.Null(newEntity.IdEditor); - Assert.Null(newEntity.Obsolete); - Assert.Null(newEntity.IdPrevious); - Assert.InRange(newEntity.Creation, startTime, doneTime); - } +// var newEntity = dbset.First(p => p.Id != entry.Entity.Id); +// Assert.Equal(ProcessMapPlanBase.IdStateActual, newEntity.IdState); +// Assert.Equal(1, newEntity.IdAuthor); +// Assert.Null(newEntity.IdEditor); +// Assert.Null(newEntity.Obsolete); +// Assert.Null(newEntity.IdPrevious); +// Assert.InRange(newEntity.Creation, startTime, doneTime); +// } - [Fact] - public async Task UpdateOrInsertRange_returns_success() - { - // arrange - var startTime = DateTimeOffset.UtcNow; +// [Fact] +// public async Task UpdateOrInsertRange_returns_success() +// { +// // arrange +// var startTime = DateTimeOffset.UtcNow; - var dbset = dbContext.Set(); - var user = dbContext.Set().First().Adapt(); - user.Surname = "userSurname"; - user.Email = "user@mail.domain"; +// var dbset = dbContext.Set(); +// var user = dbContext.Set().First().Adapt(); +// user.Surname = "userSurname"; +// user.Email = "user@mail.domain"; - var entry = dbset.Add(entity); - dbContext.SaveChanges(); - entry.State = EntityState.Detached; +// var entry = dbset.Add(entity); +// dbContext.SaveChanges(); +// entry.State = EntityState.Detached; - var dtoUpdate = dto.Adapt(); - dtoUpdate.IdWell = 0; - dtoUpdate.Id = entry.Entity.Id; - dtoUpdate.Comment = "nebuchadnezzar"; - dtoUpdate.DeltaPressureLimitMax++; - dtoUpdate.DeltaPressurePlan++; - dtoUpdate.FlowPlan++; - dtoUpdate.FlowLimitMax++; - dtoUpdate.RopPlan++; - dtoUpdate.AxialLoadPlan++; - dtoUpdate.AxialLoadLimitMax++; - dtoUpdate.DepthStart++; - dtoUpdate.DepthEnd++; - dtoUpdate.TopDriveSpeedPlan++; - dtoUpdate.TopDriveSpeedLimitMax++; - dtoUpdate.TopDriveTorquePlan++; - dtoUpdate.TopDriveTorqueLimitMax++; - dtoUpdate.Author = user; +// var dtoUpdate = dto.Adapt(); +// dtoUpdate.IdWell = 0; +// dtoUpdate.Id = entry.Entity.Id; +// dtoUpdate.Comment = "nebuchadnezzar"; +// dtoUpdate.DeltaPressureLimitMax++; +// dtoUpdate.DeltaPressurePlan++; +// dtoUpdate.FlowPlan++; +// dtoUpdate.FlowLimitMax++; +// dtoUpdate.RopPlan++; +// dtoUpdate.AxialLoadPlan++; +// dtoUpdate.AxialLoadLimitMax++; +// dtoUpdate.DepthStart++; +// dtoUpdate.DepthEnd++; +// dtoUpdate.TopDriveSpeedPlan++; +// dtoUpdate.TopDriveSpeedLimitMax++; +// dtoUpdate.TopDriveTorquePlan++; +// dtoUpdate.TopDriveTorqueLimitMax++; +// dtoUpdate.Author = user; - var dtoInsert = dtoUpdate.Adapt(); - dtoInsert.Id = 0; - dtoInsert.Comment = "nebuchad"; - dtoInsert.DeltaPressureLimitMax++; - dtoInsert.DeltaPressurePlan++; - dtoInsert.FlowPlan++; - dtoInsert.FlowLimitMax++; - dtoInsert.RopPlan++; - dtoInsert.AxialLoadPlan++; - dtoInsert.AxialLoadLimitMax++; - dtoInsert.DepthStart++; - dtoInsert.DepthEnd++; - dtoInsert.TopDriveSpeedPlan++; - dtoInsert.TopDriveSpeedLimitMax++; - dtoInsert.TopDriveTorquePlan++; - dtoInsert.TopDriveTorqueLimitMax++; - dtoInsert.Author = user; +// var dtoInsert = dtoUpdate.Adapt(); +// dtoInsert.Id = 0; +// dtoInsert.Comment = "nebuchad"; +// dtoInsert.DeltaPressureLimitMax++; +// dtoInsert.DeltaPressurePlan++; +// dtoInsert.FlowPlan++; +// dtoInsert.FlowLimitMax++; +// dtoInsert.RopPlan++; +// dtoInsert.AxialLoadPlan++; +// dtoInsert.AxialLoadLimitMax++; +// dtoInsert.DepthStart++; +// dtoInsert.DepthEnd++; +// dtoInsert.TopDriveSpeedPlan++; +// dtoInsert.TopDriveSpeedLimitMax++; +// dtoInsert.TopDriveTorquePlan++; +// dtoInsert.TopDriveTorqueLimitMax++; +// dtoInsert.Author = user; - // act - var result = await client.UpdateOrInsertRange(entity.IdWell, new ProcessMapPlanDrillingDto[] { dtoUpdate, dtoInsert }); +// // act +// var result = await client.UpdateOrInsertRange(entity.IdWell, new ProcessMapPlanDrillingDto[] { dtoUpdate, dtoInsert }); - // assert - var doneTime = DateTimeOffset.UtcNow; - Assert.Equal(HttpStatusCode.OK, result.StatusCode); - Assert.Equal(3, result.Content); +// // assert +// var doneTime = DateTimeOffset.UtcNow; +// Assert.Equal(HttpStatusCode.OK, result.StatusCode); +// Assert.Equal(3, result.Content); - var count = dbset.Count(); - Assert.Equal(3, count); +// var count = dbset.Count(); +// Assert.Equal(3, count); - var oldEntity = dbset.First(p => p.Id == entry.Entity.Id); - Assert.Equal(ProcessMapPlanBase.IdStateReplaced, oldEntity.IdState); - Assert.Equal(1, oldEntity.IdEditor); - Assert.NotNull(oldEntity.Obsolete); - Assert.InRange(oldEntity.Obsolete.Value, startTime, doneTime); +// var oldEntity = dbset.First(p => p.Id == entry.Entity.Id); +// Assert.Equal(ProcessMapPlanBase.IdStateReplaced, oldEntity.IdState); +// Assert.Equal(1, oldEntity.IdEditor); +// Assert.NotNull(oldEntity.Obsolete); +// Assert.InRange(oldEntity.Obsolete.Value, startTime, doneTime); - var newEntity = dbset.First(p => p.Comment == dtoUpdate.Comment); - Assert.Equal(ProcessMapPlanBase.IdStateActual, newEntity.IdState); - Assert.Equal(1, newEntity.IdAuthor); - Assert.Null(newEntity.IdEditor); - Assert.Null(newEntity.Obsolete); - Assert.Equal(oldEntity.Id, newEntity.IdPrevious); - Assert.InRange(newEntity.Creation, startTime, doneTime); +// var newEntity = dbset.First(p => p.Comment == dtoUpdate.Comment); +// Assert.Equal(ProcessMapPlanBase.IdStateActual, newEntity.IdState); +// Assert.Equal(1, newEntity.IdAuthor); +// Assert.Null(newEntity.IdEditor); +// Assert.Null(newEntity.Obsolete); +// Assert.Equal(oldEntity.Id, newEntity.IdPrevious); +// Assert.InRange(newEntity.Creation, startTime, doneTime); - var expected = dtoUpdate.Adapt(); - var excludeProps = new[] { - nameof(ProcessMapPlanDrilling.Id), - nameof(ProcessMapPlanDrilling.IdWell), - nameof(ProcessMapPlanDrilling.Author), - nameof(ProcessMapPlanDrilling.IdAuthor), - nameof(ProcessMapPlanDrilling.Editor), - nameof(ProcessMapPlanDrilling.Creation), - }; - MatchHelper.Match(expected, newEntity!, excludeProps); - } +// var expected = dtoUpdate.Adapt(); +// var excludeProps = new[] { +// nameof(ProcessMapPlanDrilling.Id), +// nameof(ProcessMapPlanDrilling.IdWell), +// nameof(ProcessMapPlanDrilling.Author), +// nameof(ProcessMapPlanDrilling.IdAuthor), +// nameof(ProcessMapPlanDrilling.Editor), +// nameof(ProcessMapPlanDrilling.Creation), +// }; +// MatchHelper.Match(expected, newEntity!, excludeProps); +// } - [Fact] - public async Task DeleteRange_returns_success() - { - //arrange - var dbset = dbContext.Set(); +// [Fact] +// public async Task DeleteRange_returns_success() +// { +// //arrange +// var dbset = dbContext.Set(); - var entry = dbset.Add(entity); - dbContext.SaveChanges(); - entry.State = EntityState.Detached; +// var entry = dbset.Add(entity); +// dbContext.SaveChanges(); +// entry.State = EntityState.Detached; - var startTime = DateTimeOffset.UtcNow; +// var startTime = DateTimeOffset.UtcNow; - //act - var response = await client.DeleteRange(dto.IdWell, new[] { entry.Entity.Id }); +// //act +// var response = await client.DeleteRange(dto.IdWell, new[] { entry.Entity.Id }); - //assert - var doneTime = DateTimeOffset.UtcNow; - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal(1, response.Content); +// //assert +// var doneTime = DateTimeOffset.UtcNow; +// Assert.Equal(HttpStatusCode.OK, response.StatusCode); +// Assert.Equal(1, response.Content); - var actual = dbContext - .Set() - .FirstOrDefault(p => p.Id == entry.Entity.Id); +// var actual = dbContext +// .Set() +// .FirstOrDefault(p => p.Id == entry.Entity.Id); - Assert.NotNull(actual); - Assert.Equal(ProcessMapPlanBase.IdStateDeleted, actual.IdState); - Assert.Equal(1, actual.IdEditor); - Assert.NotNull(actual.Obsolete); - Assert.InRange(actual.Obsolete.Value, startTime, doneTime); - } +// Assert.NotNull(actual); +// Assert.Equal(ProcessMapPlanBase.IdStateDeleted, actual.IdState); +// Assert.Equal(1, actual.IdEditor); +// Assert.NotNull(actual.Obsolete); +// Assert.InRange(actual.Obsolete.Value, startTime, doneTime); +// } - [Fact] - public async Task Clear_returns_success() - { - //arrange - var dbset = dbContext.Set(); +// [Fact] +// public async Task Clear_returns_success() +// { +// //arrange +// var dbset = dbContext.Set(); - var entry = dbset.Add(entity); - dbContext.SaveChanges(); - entry.State = EntityState.Detached; +// var entry = dbset.Add(entity); +// dbContext.SaveChanges(); +// entry.State = EntityState.Detached; - var startTime = DateTimeOffset.UtcNow; +// var startTime = DateTimeOffset.UtcNow; - //act - var response = await client.Clear(dto.IdWell); +// //act +// var response = await client.Clear(dto.IdWell); - //assert - var doneTime = DateTimeOffset.UtcNow; - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal(1, response.Content); +// //assert +// var doneTime = DateTimeOffset.UtcNow; +// Assert.Equal(HttpStatusCode.OK, response.StatusCode); +// Assert.Equal(1, response.Content); - var actual = dbContext - .Set() - .FirstOrDefault(p => p.Id == entry.Entity.Id); +// var actual = dbContext +// .Set() +// .FirstOrDefault(p => p.Id == entry.Entity.Id); - Assert.NotNull(actual); - Assert.Equal(ProcessMapPlanBase.IdCleared, actual.IdState); - Assert.Equal(1, actual.IdEditor); - Assert.NotNull(actual.Obsolete); - Assert.InRange(actual.Obsolete.Value, startTime, doneTime); - } +// Assert.NotNull(actual); +// Assert.Equal(ProcessMapPlanBase.IdCleared, actual.IdState); +// Assert.Equal(1, actual.IdEditor); +// Assert.NotNull(actual.Obsolete); +// Assert.InRange(actual.Obsolete.Value, startTime, doneTime); +// } - [Fact] - public async Task GetDatesChange_returns_success() - { - //arrange - var dbset = dbContext.Set(); +// [Fact] +// public async Task GetDatesChange_returns_success() +// { +// //arrange +// var dbset = dbContext.Set(); - var entity2 = entity.Adapt(); - entity2.Creation = entity.Creation.AddDays(1); - dbset.Add(entity); - dbset.Add(entity2); - dbContext.SaveChanges(); - var timezoneHours = Defaults.Timezone.Hours; - var offset = TimeSpan.FromHours(timezoneHours); - var dates = new[] { entity.Creation, entity2.Creation } - .Select(d => d.ToOffset(offset)) - .Select(d => new DateOnly(d.Year, d.Month, d.Day)); +// var entity2 = entity.Adapt(); +// entity2.Creation = entity.Creation.AddDays(1); +// dbset.Add(entity); +// dbset.Add(entity2); +// dbContext.SaveChanges(); +// var timezoneHours = Defaults.Timezone.Hours; +// var offset = TimeSpan.FromHours(timezoneHours); +// var dates = new[] { entity.Creation, entity2.Creation } +// .Select(d => d.ToOffset(offset)) +// .Select(d => new DateOnly(d.Year, d.Month, d.Day)); - //act - var response = await client.GetDatesChange(dto.IdWell); +// //act +// var response = await client.GetDatesChange(dto.IdWell); - //assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.NotNull(response.Content); - Assert.Equal(2, response.Content.Count()); - Assert.All(response.Content, d => dates.Contains(d)); - } +// //assert +// Assert.Equal(HttpStatusCode.OK, response.StatusCode); +// Assert.NotNull(response.Content); +// Assert.Equal(2, response.Content.Count()); +// Assert.All(response.Content, d => dates.Contains(d)); +// } - [Fact] - public async Task Get_all_returns_success() - { - //arrange - var dbset = dbContext.Set(); +// [Fact] +// public async Task Get_all_returns_success() +// { +// //arrange +// var dbset = dbContext.Set(); - dbset.Add(entity); +// dbset.Add(entity); - var entityDeleted = entity.Adapt(); - entityDeleted.Creation = entity.Creation.AddDays(-1); - entityDeleted.Obsolete = entity.Creation; - entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; - entityDeleted.IdEditor = 1; - dbset.Add(entityDeleted); +// var entityDeleted = entity.Adapt(); +// entityDeleted.Creation = entity.Creation.AddDays(-1); +// entityDeleted.Obsolete = entity.Creation; +// entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; +// entityDeleted.IdEditor = 1; +// dbset.Add(entityDeleted); - dbContext.SaveChanges(); +// dbContext.SaveChanges(); - //act - var request = new ProcessMapPlanBaseRequest(); - var response = await client.Get(dto.IdWell, request); +// //act +// var request = new ProcessMapPlanBaseRequest(); +// var response = await client.Get(dto.IdWell, request); - //assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.NotNull(response.Content); - Assert.Equal(2, response.Content.Count()); - } +// //assert +// Assert.Equal(HttpStatusCode.OK, response.StatusCode); +// Assert.NotNull(response.Content); +// Assert.Equal(2, response.Content.Count()); +// } - [Fact] - public async Task Get_actual_returns_success() - { - //arrange - var dbset = dbContext.Set(); +// [Fact] +// public async Task Get_actual_returns_success() +// { +// //arrange +// var dbset = dbContext.Set(); - dbset.Add(entity); +// dbset.Add(entity); - var entityDeleted = entity.Adapt(); - entityDeleted.Creation = entity.Creation.AddDays(-1); - entityDeleted.Obsolete = entity.Creation; - entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; - entityDeleted.IdEditor = 1; - entityDeleted.Comment = "nothing"; - dbset.Add(entityDeleted); +// var entityDeleted = entity.Adapt(); +// entityDeleted.Creation = entity.Creation.AddDays(-1); +// entityDeleted.Obsolete = entity.Creation; +// entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; +// entityDeleted.IdEditor = 1; +// entityDeleted.Comment = "nothing"; +// dbset.Add(entityDeleted); - dbContext.SaveChanges(); +// dbContext.SaveChanges(); - //act - var request = new ProcessMapPlanBaseRequest { - Moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, 0, TimeSpan.Zero) - }; - var response = await client.Get(dto.IdWell, request); +// //act +// var request = new ProcessMapPlanBaseRequest { +// Moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, 0, TimeSpan.Zero) +// }; +// var response = await client.Get(dto.IdWell, request); - //assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.NotNull(response.Content); - Assert.Single(response.Content); +// //assert +// Assert.Equal(HttpStatusCode.OK, response.StatusCode); +// Assert.NotNull(response.Content); +// Assert.Single(response.Content); - var actual = response.Content.First()!; +// var actual = response.Content.First()!; - var expected = entity.Adapt()!; - var excludeProps = new[] { - nameof(ProcessMapPlanDrillingDto.Id), - nameof(ProcessMapPlanDrillingDto.Author), - nameof(ProcessMapPlanDrillingDto.Creation), - }; - MatchHelper.Match(expected, actual, excludeProps); - } +// var expected = entity.Adapt()!; +// var excludeProps = new[] { +// nameof(ProcessMapPlanDrillingDto.Id), +// nameof(ProcessMapPlanDrillingDto.Author), +// nameof(ProcessMapPlanDrillingDto.Creation), +// }; +// MatchHelper.Match(expected, actual, excludeProps); +// } - [Fact] - public async Task Get_at_moment_returns_success() - { - //arrange - var dbset = dbContext.Set(); +// [Fact] +// public async Task Get_at_moment_returns_success() +// { +// //arrange +// var dbset = dbContext.Set(); - var now = DateTimeOffset.UtcNow; - var entityDeleted = entity.Adapt(); - entityDeleted.Creation = now; - entityDeleted.Obsolete = now.AddMinutes(1); - entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; - entityDeleted.IdEditor = 1; - entityDeleted.Comment = "nothing"; - dbset.Add(entityDeleted); +// var now = DateTimeOffset.UtcNow; +// var entityDeleted = entity.Adapt(); +// entityDeleted.Creation = now; +// entityDeleted.Obsolete = now.AddMinutes(1); +// entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; +// entityDeleted.IdEditor = 1; +// entityDeleted.Comment = "nothing"; +// dbset.Add(entityDeleted); - var entityDeleted2 = entity.Adapt(); - entityDeleted2.Creation = now.AddMinutes(1); - entityDeleted2.Obsolete = now.AddMinutes(2); - entityDeleted2.IdState = ProcessMapPlanBase.IdStateDeleted; - entityDeleted2.IdEditor = 1; - entityDeleted2.Comment = "nothing"; - dbset.Add(entityDeleted2); +// var entityDeleted2 = entity.Adapt(); +// entityDeleted2.Creation = now.AddMinutes(1); +// entityDeleted2.Obsolete = now.AddMinutes(2); +// entityDeleted2.IdState = ProcessMapPlanBase.IdStateDeleted; +// entityDeleted2.IdEditor = 1; +// entityDeleted2.Comment = "nothing"; +// dbset.Add(entityDeleted2); - dbContext.SaveChanges(); +// dbContext.SaveChanges(); - //act - var request = new ProcessMapPlanBaseRequest - { - Moment = now.AddMinutes(0.5), - }; - var response = await client.Get(dto.IdWell, request); +// //act +// var request = new ProcessMapPlanBaseRequest +// { +// Moment = now.AddMinutes(0.5), +// }; +// var response = await client.Get(dto.IdWell, request); - //assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.NotNull(response.Content); - Assert.Single(response.Content); - } +// //assert +// Assert.Equal(HttpStatusCode.OK, response.StatusCode); +// Assert.NotNull(response.Content); +// Assert.Single(response.Content); +// } - [Fact] - public async Task Get_section_returns_success() - { - //arrange - var dbset = dbContext.Set(); +// [Fact] +// public async Task Get_section_returns_success() +// { +// //arrange +// var dbset = dbContext.Set(); - dbset.Add(entity); +// dbset.Add(entity); - var entity2 = entity.Adapt(); - entity2.IdWellSectionType = 2; - entity2.Comment = "IdWellSectionType = 2"; - dbset.Add(entity2); +// var entity2 = entity.Adapt(); +// entity2.IdWellSectionType = 2; +// entity2.Comment = "IdWellSectionType = 2"; +// dbset.Add(entity2); - dbContext.SaveChanges(); +// dbContext.SaveChanges(); - //act - var request = new ProcessMapPlanBaseRequest - { - IdWellSectionType = 2, - }; - var response = await client.Get(dto.IdWell, request); +// //act +// var request = new ProcessMapPlanBaseRequest +// { +// IdWellSectionType = 2, +// }; +// var response = await client.Get(dto.IdWell, request); - //assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.NotNull(response.Content); - Assert.Single(response.Content); +// //assert +// Assert.Equal(HttpStatusCode.OK, response.StatusCode); +// Assert.NotNull(response.Content); +// Assert.Single(response.Content); - var actual = response.Content.First()!; +// var actual = response.Content.First()!; - var expected = entity2.Adapt()!; - var excludeProps = new[] { - nameof(ProcessMapPlanDrillingDto.Id), - nameof(ProcessMapPlanDrillingDto.Author), - nameof(ProcessMapPlanDrillingDto.Creation), - }; - MatchHelper.Match(expected, actual, excludeProps); - } +// var expected = entity2.Adapt()!; +// var excludeProps = new[] { +// nameof(ProcessMapPlanDrillingDto.Id), +// nameof(ProcessMapPlanDrillingDto.Author), +// nameof(ProcessMapPlanDrillingDto.Creation), +// }; +// MatchHelper.Match(expected, actual, excludeProps); +// } - [Fact] - public async Task Get_updated_returns_success() - { - //arrange - var dbset = dbContext.Set(); +// [Fact] +// public async Task Get_updated_returns_success() +// { +// //arrange +// var dbset = dbContext.Set(); - dbset.Add(entity); +// dbset.Add(entity); - var entity2 = entity.Adapt(); - entity2.Creation = entity.Creation.AddHours(1); - entity2.Comment = "IdWellSectionType = 2"; - dbset.Add(entity2); +// var entity2 = entity.Adapt(); +// entity2.Creation = entity.Creation.AddHours(1); +// entity2.Comment = "IdWellSectionType = 2"; +// dbset.Add(entity2); - var entity3 = entity.Adapt(); - entity3.Obsolete = entity.Creation.AddHours(1); - entity3.Comment = "IdWellSectionType = 3"; - dbset.Add(entity3); +// var entity3 = entity.Adapt(); +// entity3.Obsolete = entity.Creation.AddHours(1); +// entity3.Comment = "IdWellSectionType = 3"; +// dbset.Add(entity3); - dbContext.SaveChanges(); +// dbContext.SaveChanges(); - var timezoneHours = Defaults.Timezone.Hours; - var offset = TimeSpan.FromHours(timezoneHours); - var updateFrom = entity.Creation.ToOffset(offset).AddHours(0.5); +// var timezoneHours = Defaults.Timezone.Hours; +// var offset = TimeSpan.FromHours(timezoneHours); +// var updateFrom = entity.Creation.ToOffset(offset).AddHours(0.5); - //act - var request = new ProcessMapPlanBaseRequest - { - UpdateFrom = updateFrom, - }; - var response = await client.Get(dto.IdWell, request); +// //act +// var request = new ProcessMapPlanBaseRequest +// { +// UpdateFrom = updateFrom, +// }; +// var response = await client.Get(dto.IdWell, request); - //assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.NotNull(response.Content); - Assert.Equal(2, response.Content.Count()); +// //assert +// Assert.Equal(HttpStatusCode.OK, response.StatusCode); +// Assert.NotNull(response.Content); +// Assert.Equal(2, response.Content.Count()); - var actual = response.Content - .First(p => p.Comment == entity2.Comment); +// var actual = response.Content +// .First(p => p.Comment == entity2.Comment); - var expected = entity2.Adapt(); - var excludeProps = new[] { - nameof(ProcessMapPlanDrillingDto.Id), - nameof(ProcessMapPlanDrillingDto.Author), - nameof(ProcessMapPlanDrillingDto.Creation), - }; - MatchHelper.Match(expected, actual, excludeProps); - } +// var expected = entity2.Adapt(); +// var excludeProps = new[] { +// nameof(ProcessMapPlanDrillingDto.Id), +// nameof(ProcessMapPlanDrillingDto.Author), +// nameof(ProcessMapPlanDrillingDto.Creation), +// }; +// MatchHelper.Match(expected, actual, excludeProps); +// } - [Fact] - public async Task Parse_returns_success() - { - //arrange - const string fileName = "ProcessMapPlanDrillingValid.xlsx"; - var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); +// [Fact] +// public async Task Parse_returns_success() +// { +// //arrange +// const string fileName = "ProcessMapPlanDrillingValid.xlsx"; +// var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); - var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); +// var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); - //act - var response = await client.Parse(IdWell, streamPart); +// //act +// var response = await client.Parse(IdWell, streamPart); - //assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); +// //assert +// Assert.Equal(HttpStatusCode.OK, response.StatusCode); - var parserResult = response.Content; +// var parserResult = response.Content; - Assert.NotNull(parserResult); - Assert.Single(parserResult.Item); - Assert.True(parserResult.IsValid); +// Assert.NotNull(parserResult); +// Assert.Single(parserResult.Item); +// Assert.True(parserResult.IsValid); - var row = parserResult.Item.First(); - var dtoActual = row.Item; +// var row = parserResult.Item.First(); +// var dtoActual = row.Item; - Assert.True(row.IsValid); +// Assert.True(row.IsValid); - var excludeProps = new[] { nameof(ProcessMapPlanDrillingDto.IdWell) }; - MatchHelper.Match(dto, dtoActual, excludeProps); - } +// var excludeProps = new[] { nameof(ProcessMapPlanDrillingDto.IdWell) }; +// MatchHelper.Match(dto, dtoActual, excludeProps); +// } - [Fact] - public async Task Parse_returns_success_for_result_with_warnings() - { - //arrange - const string fileName = "ProcessMapPlanDrillingInvalid.xlsx"; - var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); +// [Fact] +// public async Task Parse_returns_success_for_result_with_warnings() +// { +// //arrange +// const string fileName = "ProcessMapPlanDrillingInvalid.xlsx"; +// var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); - var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); +// var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); - //act - var response = await client.Parse(IdWell, streamPart); +// //act +// var response = await client.Parse(IdWell, streamPart); - Assert.Equal(HttpStatusCode.OK, response.StatusCode); +// Assert.Equal(HttpStatusCode.OK, response.StatusCode); - var parserResult = response.Content; +// var parserResult = response.Content; - Assert.NotNull(parserResult); - Assert.False(parserResult.IsValid); - Assert.Single(parserResult.Warnings); - Assert.Single(parserResult.Item); +// Assert.NotNull(parserResult); +// Assert.False(parserResult.IsValid); +// Assert.Single(parserResult.Warnings); +// Assert.Single(parserResult.Item); - var row = parserResult.Item.First(); +// var row = parserResult.Item.First(); - Assert.False(row.IsValid); - Assert.Equal(2, row.Warnings.Count()); - } -} \ No newline at end of file +// Assert.False(row.IsValid); +// Assert.Equal(2, row.Warnings.Count()); +// } +//} \ No newline at end of file From 792790556cd1cfdc424f92510a88b92a228878eb Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 17 May 2024 16:40:31 +0500 Subject: [PATCH 02/19] =?UTF-8?q?3=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0?= =?UTF-8?q?=20get=20=D0=B4=D0=BB=D1=8F=20ProcessMapPlanBaseController?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/ChangeLogDto.cs | 64 +++++++++++ .../ProcessMapPlanBaseController.cs | 105 +++++++++++++----- .../ProcessMapPlanDrillingController.cs | 3 +- .../ProcessMapPlanReamController.cs | 3 +- 4 files changed, 147 insertions(+), 28 deletions(-) create mode 100644 AsbCloudApp/Data/ChangeLogDto.cs diff --git a/AsbCloudApp/Data/ChangeLogDto.cs b/AsbCloudApp/Data/ChangeLogDto.cs new file mode 100644 index 00000000..c9b94508 --- /dev/null +++ b/AsbCloudApp/Data/ChangeLogDto.cs @@ -0,0 +1,64 @@ +using AsbCloudApp.Data.User; +using System; + +namespace AsbCloudApp.Data; + +/// +/// Часть записи описывающая изменение +/// +public class ChangeLogDto +{ + /// + /// Запись + /// + public required T Item { get; set; } + + /// + /// ИД записи + /// + public int Id { get; set; } + + /// + /// Автор + /// + public UserDto? Author { get; set; } + + /// + /// Автор + /// + public UserDto? Editor { get; set; } + + /// + /// Дата создания записи + /// + public DateTimeOffset Creation { get; set; } + + /// + /// Дата устаревания (например при удалении) + /// + public DateTimeOffset? Obsolete { get; set; } + + /// + /// ИД состояния записи: + /// + /// + /// 0 + /// актуальная запись + /// + /// + /// 1 + /// замененная запись + /// + /// + /// 2 + /// удаленная запись + /// + /// + /// + public int IdState { get; set; } + + /// + /// Id заменяемой записи + /// + public int? IdPrevious { get; set; } +} diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index f4df65cc..f1c951bf 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -1,23 +1,23 @@ -using AsbCloudApp.Repositories; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using System.Collections.Generic; -using System.Threading.Tasks; -using System.Threading; -using Microsoft.AspNetCore.Http; -using AsbCloudApp.Exceptions; -using AsbCloudApp.Requests; -using System; -using System.IO; -using AsbCloudApp.Services; -using System.Linq; -using AsbCloudApp.Data; -using AsbCloudApp.Requests.ParserOptions; +using AsbCloudApp.Data; using AsbCloudApp.Data.ProcessMaps; -using System.ComponentModel.DataAnnotations; +using AsbCloudApp.Exceptions; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; using AsbCloudApp.Requests.ExportOptions; +using AsbCloudApp.Requests.ParserOptions; +using AsbCloudApp.Services; using AsbCloudApp.Services.Export; using AsbCloudApp.Services.Parsers; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; namespace AsbCloudWebApi.Controllers.ProcessMaps; @@ -33,16 +33,19 @@ public abstract class ProcessMapPlanBaseController : ControllerBase private readonly IChangeLogRepository repository; private readonly IWellService wellService; private readonly IParserService parserService; + private readonly ITelemetryService telemetryService; private readonly IExportService processMapPlanExportService; protected ProcessMapPlanBaseController(IChangeLogRepository repository, IWellService wellService, IParserService parserService, - IExportService processMapPlanExportService) + IExportService processMapPlanExportService, + ITelemetryService telemetryService) { this.repository = repository; this.wellService = wellService; this.parserService = parserService; + this.telemetryService = telemetryService; this.processMapPlanExportService = processMapPlanExportService; } @@ -58,7 +61,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase [HttpPost] [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - public async Task InsertRange([FromRoute][Range(0,int.MaxValue)] int idWell, IEnumerable dtos, CancellationToken token) + public async Task InsertRange([FromRoute][Range(0, int.MaxValue)] int idWell, IEnumerable dtos, CancellationToken token) { var idUser = await AssertUserHasAccessToWell(idWell, token); @@ -131,21 +134,71 @@ public abstract class ProcessMapPlanBaseController : ControllerBase /// Получение /// /// - /// /// /// [HttpGet] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - public async Task>> Get([FromRoute] int idWell, [FromQuery] ProcessMapPlanBaseRequest request, CancellationToken token) + public async Task>> Get([FromRoute] int idWell, CancellationToken token) { await AssertUserHasAccessToWell(idWell, token); - var serviceRequest = new ProcessMapPlanBaseRequestWithWell(request, idWell); + var serviceRequest = new ProcessMapPlanBaseRequestWithWell(idWell); var result = await repository.Get(serviceRequest, token); return Ok(result); } + /// + /// Получение + /// + /// + /// + /// + /// + [HttpGet("history")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] + public async Task>>> Get([FromRoute] int idWell, DateTimeOffset? moment, CancellationToken token) + { + await AssertUserHasAccessToWell(idWell, token); + + var serviceRequest = new ProcessMapPlanBaseRequestWithWell(new ProcessMapPlanBaseRequest() + { + Moment = moment, + }, idWell); + + var result = await repository.GetChangeLog(serviceRequest, null, token); + return Ok(result); + } + + /// + /// Получение + /// + /// + /// + /// + /// + [HttpGet("/api/telemetry/{uid}/[controller]")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] + public async Task>>> Get(string uid, DateTimeOffset? updateFrom, CancellationToken token) + { + var idWell = telemetryService.GetIdWellByTelemetryUid(uid) ?? -1; + + if (idWell < 0) + return this.ValidationBadRequest(nameof(uid), "Скважина по uid не найдена"); + + await AssertUserHasAccessToWell(idWell, token); + + var serviceRequest = new ProcessMapPlanBaseRequestWithWell(new ProcessMapPlanBaseRequest() + { + UpdateFrom = updateFrom, + }, idWell); + + var result = await repository.GetChangeLog(serviceRequest, null, token); + return Ok(result); + } + /// /// Изменения за определенную дату /// @@ -156,7 +209,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase [HttpGet("changeLog")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - public async Task>> GetChangeLog([FromRoute] int idWell, [FromQuery] DateOnly? date, CancellationToken token) + public async Task>>> GetChangeLog([FromRoute] int idWell, [FromQuery] DateOnly? date, CancellationToken token) { await AssertUserHasAccessToWell(idWell, token); @@ -197,7 +250,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase { if (!dtos.Any()) return NoContent(); - + var idUser = await AssertUserHasAccessToWell(idWell, token); foreach (var dto in dtos) @@ -218,7 +271,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] public async Task>> Parse(int idWell, - [Required] IFormFile file, + [Required] IFormFile file, CancellationToken token) { await AssertUserHasAccessToWell(idWell, token); @@ -229,7 +282,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase { var options = new WellRelatedParserRequest(idWell); var dto = parserService.Parse(stream, options); - + return Ok(dto); } catch (FileFormatException ex) @@ -271,7 +324,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase throw new ForbidException("Нет доступа к скважине"); return idUser; } - + /// /// Формируем excel файл с текущими строками РТК /// diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs index 241be301..e2193a58 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs @@ -15,8 +15,9 @@ public class ProcessMapPlanDrillingController : ProcessMapPlanBaseController repository, IWellService wellService, ProcessMapPlanDrillingParser parserService, + ITelemetryService telemetryService, ProcessMapPlanDrillingExportService processMapPlanExportService) - : base(repository, wellService, parserService, processMapPlanExportService) + : base(repository, wellService, parserService, processMapPlanExportService, telemetryService) { } diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs index 9c103f06..7482686a 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs @@ -15,8 +15,9 @@ public class ProcessMapPlanReamController : ProcessMapPlanBaseController repository, IWellService wellService, ProcessMapPlanReamParser parserService, + ITelemetryService telemetryService, ProcessMapPlanReamExportService processMapPlanExportService) - : base(repository, wellService, parserService, processMapPlanExportService) + : base(repository, wellService, parserService, processMapPlanExportService, telemetryService) { } From 832489b9ac57fe34e2e0514d8e477882ee168cc5 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 21 May 2024 07:12:22 +0300 Subject: [PATCH 03/19] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Requests/ProcessMapPlanBaseRequest.cs | 7 - AsbCloudInfrastructure/DependencyInjection.cs | 4 +- .../Repository/ChangeLogRepositoryAbstract.cs | 1 + .../ProcessMapPlanBaseRepository.cs | 3 - .../Clients/IProcessMapPlanDrillingClient.cs | 20 +- .../ProcessMapPlanDrillingControllerTest.cs | 1174 ++++++++--------- .../Data/Defaults.cs | 4 +- 7 files changed, 575 insertions(+), 638 deletions(-) diff --git a/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs b/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs index 006c26e5..98a2dc4f 100644 --- a/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs +++ b/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs @@ -8,12 +8,6 @@ namespace AsbCloudApp.Requests; /// public class ProcessMapPlanBaseRequest: ChangeLogBaseRequest { - /// - /// Тип секции - /// - [Range(1, int.MaxValue, ErrorMessage = "Id секции - положительное число")] - public int? IdWellSectionType { get; set; } - /// /// Вернуть данные, которые поменялись с указанной даты /// @@ -42,7 +36,6 @@ public class ProcessMapPlanBaseRequestWithWell: ProcessMapPlanBaseRequest public ProcessMapPlanBaseRequestWithWell(ProcessMapPlanBaseRequest request, int idWell) { IdWell=idWell; - IdWellSectionType=request.IdWellSectionType; UpdateFrom = request.UpdateFrom; Moment = request.Moment; } diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 9f802e2e..591c195c 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -134,9 +134,9 @@ namespace AsbCloudInfrastructure TypeAdapterConfig>.NewConfig() .Include>() - .Map(dest => dest, src => new ChangeLogDto() + .Map(dest => dest, src => new ChangeLogDto() { - Item = src.Adapt() + Item = src.Adapt() }); } diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index 1c83500d..088518e9 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -249,6 +249,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh { var query = BuildQuery(request); var entities = await query + .Where(e => e.Obsolete == null) .OrderBy(e => e.Creation) .ThenBy(e => e.Obsolete) .ThenBy(e => e.Id) diff --git a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs index 5e351db7..3d968ddc 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs @@ -32,9 +32,6 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb .Include(e => e.WellSectionType) .Where(e => e.IdWell == request.IdWell); - if (request.IdWellSectionType.HasValue) - query = query.Where(e => e.IdWellSectionType == request.IdWellSectionType); - if (request.UpdateFrom.HasValue) { var from = request.UpdateFrom.Value.ToUniversalTime(); diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs index 93ce768b..51655328 100644 --- a/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs +++ b/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs @@ -5,15 +5,15 @@ using Refit; namespace AsbCloudWebApi.IntegrationTests.Clients; -public interface IProcessMapPlanDrillingClient +public interface IProcessMapPlanDrillingClient where TDto : ProcessMapPlanBaseDto { private const string BaseRoute = "/api/well/{idWell}/ProcessMapPlanDrilling"; [Post(BaseRoute)] - Task> InsertRange(int idWell, [Body] IEnumerable dtos); + Task> InsertRange(int idWell, [Body] IEnumerable dtos); [Post($"{BaseRoute}/replace")] - Task> ClearAndInsertRange(int idWell, [Body] IEnumerable dtos); + Task> ClearAndInsertRange(int idWell, [Body] IEnumerable dtos); [Delete(BaseRoute)] Task> DeleteRange(int idWell, [Body] IEnumerable ids); @@ -22,18 +22,24 @@ public interface IProcessMapPlanDrillingClient Task> Clear(int idWell); [Get(BaseRoute)] - Task>> Get(int idWell, ProcessMapPlanBaseRequest request); + Task>> Get(int idWell); + + [Get($"{BaseRoute}/history")] + Task>>> Get(int idWell, DateTimeOffset? moment); + + [Get("/api/telemetry/{uid}/ProcessMapPlanDrilling")] + Task>>> Get(string uid, DateTimeOffset? updateFrom); [Get($"{BaseRoute}/changeLog")] - Task>> GetChangeLog(int idWell, DateOnly? date); + Task>> GetChangeLog(int idWell, DateOnly? date); [Get($"{BaseRoute}/dates")] Task>> GetDatesChange(int idWell); [Put(BaseRoute)] - Task> UpdateOrInsertRange(int idWell, IEnumerable dtos); + Task> UpdateOrInsertRange(int idWell, IEnumerable dtos); [Multipart] [Post(BaseRoute + "/parse")] - Task>> Parse(int idWell, [AliasAs("file")] StreamPart stream); + Task>> Parse(int idWell, [AliasAs("file")] StreamPart stream); } diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs index 18bda7f0..cddd7781 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs @@ -1,618 +1,556 @@ -//using AsbCloudApp.Requests; -//using AsbCloudDb.Model.ProcessMapPlan; -//using AsbCloudWebApi.IntegrationTests.Clients; -//using Mapster; -//using Microsoft.EntityFrameworkCore; -//using System.Net; -//using System.Reflection; -//using AsbCloudDb.Model.ProcessMaps; -//using AsbCloudWebApi.IntegrationTests.Data; -//using Refit; -//using Xunit; -//using AsbCloudApp.Data.ProcessMaps; -//using AsbCloudDb.Model; -//using AsbCloudApp.Data.User; - -//namespace AsbCloudWebApi.IntegrationTests.Controllers.ProcessMapPlan; - -//public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest -//{ -// private const int IdWell = 1; - -// private readonly ProcessMapPlanDrillingDto dto = new (){ -// Id = 0, -// Creation = new(), -// Obsolete = null, -// IdState = 0, -// IdPrevious = null, - -// IdWell = IdWell, -// Section = "Кондуктор", -// IdWellSectionType = 3, -// DepthStart = 0.5, -// DepthEnd = 1.5, - -// IdMode = 1, -// AxialLoadPlan = 2.718281, -// AxialLoadLimitMax = 3.1415926, -// DeltaPressurePlan = 4, -// DeltaPressureLimitMax = 5, -// TopDriveTorquePlan = 6, -// TopDriveTorqueLimitMax = 7, -// TopDriveSpeedPlan = 8, -// TopDriveSpeedLimitMax = 9, -// FlowPlan = 10, -// FlowLimitMax = 11, -// RopPlan = 12, -// UsageSaub = 13, -// UsageSpin = 14, -// Comment = "это тестовая запись", -// }; -// private readonly ProcessMapPlanDrilling entity = new () -// { -// Id = 0, -// IdAuthor = 1, -// IdEditor = null, -// Creation = DateTimeOffset.UtcNow, -// Obsolete = null, -// IdState = AsbCloudDb.Model.ChangeLogAbstract.IdStateActual, -// IdPrevious = null, - -// IdWell = IdWell, -// IdWellSectionType = 1, -// DepthStart = 0.5, -// DepthEnd = 1.5, - -// IdMode = 1, -// AxialLoadPlan = 2.718281, -// AxialLoadLimitMax = 3.1415926, -// DeltaPressurePlan = 4, -// DeltaPressureLimitMax = 5, -// TopDriveTorquePlan = 6, -// TopDriveTorqueLimitMax = 7, -// TopDriveSpeedPlan = 8, -// TopDriveSpeedLimitMax = 9, -// FlowPlan = 10, -// FlowLimitMax = 11, -// RopPlan = 12, -// UsageSaub = 13, -// UsageSpin = 14, -// Comment = "это тестовая запись", -// }; - -// private IProcessMapPlanDrillingClient client; - -// public ProcessMapPlanDrillingControllerTest(WebAppFactoryFixture factory) : base(factory) -// { -// dbContext.CleanupDbSet(); -// client = factory.GetAuthorizedHttpClient(string.Empty); -// } - -// [Fact] -// public async Task InsertRange_returns_success() -// { -// //arrange -// var expected = dto.Adapt(); - -// //act -// var response = await client.InsertRange(dto.IdWell, new[] { expected }); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.Equal(1, response.Content); - -// var entity = dbContext -// .Set() -// .Where(p => p.AxialLoadPlan == dto.AxialLoadPlan) -// .Where(p => p.AxialLoadLimitMax == dto.AxialLoadLimitMax) -// .Where(p => p.Comment == dto.Comment) -// .FirstOrDefault(p => p.IdWell == dto.IdWell); - -// Assert.NotNull(entity); - -// var actual = entity.Adapt(); -// Assert.Equal(ProcessMapPlanBase.IdStateActual, actual.IdState); - -// var excludeProps = new[] { -// nameof(ProcessMapPlanDrillingDto.Id), -// nameof(ProcessMapPlanDrillingDto.IdState), -// nameof(ProcessMapPlanDrillingDto.Author), -// nameof(ProcessMapPlanDrillingDto.Creation), -// nameof(ProcessMapPlanDrillingDto.Section) -// }; -// MatchHelper.Match(expected, actual, excludeProps); -// } - -// [Fact] -// public async Task InsertRange_returns_BadRequest_for_IdWellSectionType() -// { -// //arrange -// var badDto = dto.Adapt(); -// badDto.IdWellSectionType = int.MaxValue; - -// //act -// var response = await client.InsertRange(dto.IdWell, new[] { badDto }); - -// //assert -// Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); -// } - -// [Fact] -// public async Task InsertRange_returns_BadRequest_for_IdMode() -// { -// //arrange -// var badDto = dto.Adapt(); -// badDto.IdMode = int.MaxValue; - -// //act -// var response = await client.InsertRange(dto.IdWell, new[] { badDto }); - -// //assert -// Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); -// } - -// [Fact] -// public async Task ClearAndInsertRange_returns_success() -// { -// // arrange -// var dbset = dbContext.Set(); - -// var entry = dbset.Add(entity); -// dbContext.SaveChanges(); -// entry.State = EntityState.Detached; - -// var startTime = DateTimeOffset.UtcNow; - -// // act -// var result = await client.ClearAndInsertRange(entity.IdWell, new ProcessMapPlanDrillingDto[] { dto }); - -// // assert -// var doneTime = DateTimeOffset.UtcNow; -// Assert.Equal(HttpStatusCode.OK, result.StatusCode); -// Assert.Equal(2, result.Content); - -// var count = dbset.Count(); -// Assert.Equal(2, count); - -// var oldEntity = dbset.First(p => p.Id == entry.Entity.Id); -// Assert.Equal(ProcessMapPlanBase.IdCleared, oldEntity.IdState); -// Assert.Equal(1, oldEntity.IdEditor); -// Assert.NotNull(oldEntity.Obsolete); -// Assert.InRange(oldEntity.Obsolete.Value, startTime, doneTime); - -// var newEntity = dbset.First(p => p.Id != entry.Entity.Id); -// Assert.Equal(ProcessMapPlanBase.IdStateActual, newEntity.IdState); -// Assert.Equal(1, newEntity.IdAuthor); -// Assert.Null(newEntity.IdEditor); -// Assert.Null(newEntity.Obsolete); -// Assert.Null(newEntity.IdPrevious); -// Assert.InRange(newEntity.Creation, startTime, doneTime); -// } - -// [Fact] -// public async Task UpdateOrInsertRange_returns_success() -// { -// // arrange -// var startTime = DateTimeOffset.UtcNow; - -// var dbset = dbContext.Set(); -// var user = dbContext.Set().First().Adapt(); -// user.Surname = "userSurname"; -// user.Email = "user@mail.domain"; - -// var entry = dbset.Add(entity); -// dbContext.SaveChanges(); -// entry.State = EntityState.Detached; - -// var dtoUpdate = dto.Adapt(); -// dtoUpdate.IdWell = 0; -// dtoUpdate.Id = entry.Entity.Id; -// dtoUpdate.Comment = "nebuchadnezzar"; -// dtoUpdate.DeltaPressureLimitMax++; -// dtoUpdate.DeltaPressurePlan++; -// dtoUpdate.FlowPlan++; -// dtoUpdate.FlowLimitMax++; -// dtoUpdate.RopPlan++; -// dtoUpdate.AxialLoadPlan++; -// dtoUpdate.AxialLoadLimitMax++; -// dtoUpdate.DepthStart++; -// dtoUpdate.DepthEnd++; -// dtoUpdate.TopDriveSpeedPlan++; -// dtoUpdate.TopDriveSpeedLimitMax++; -// dtoUpdate.TopDriveTorquePlan++; -// dtoUpdate.TopDriveTorqueLimitMax++; -// dtoUpdate.Author = user; - -// var dtoInsert = dtoUpdate.Adapt(); -// dtoInsert.Id = 0; -// dtoInsert.Comment = "nebuchad"; -// dtoInsert.DeltaPressureLimitMax++; -// dtoInsert.DeltaPressurePlan++; -// dtoInsert.FlowPlan++; -// dtoInsert.FlowLimitMax++; -// dtoInsert.RopPlan++; -// dtoInsert.AxialLoadPlan++; -// dtoInsert.AxialLoadLimitMax++; -// dtoInsert.DepthStart++; -// dtoInsert.DepthEnd++; -// dtoInsert.TopDriveSpeedPlan++; -// dtoInsert.TopDriveSpeedLimitMax++; -// dtoInsert.TopDriveTorquePlan++; -// dtoInsert.TopDriveTorqueLimitMax++; -// dtoInsert.Author = user; - -// // act -// var result = await client.UpdateOrInsertRange(entity.IdWell, new ProcessMapPlanDrillingDto[] { dtoUpdate, dtoInsert }); - -// // assert -// var doneTime = DateTimeOffset.UtcNow; -// Assert.Equal(HttpStatusCode.OK, result.StatusCode); -// Assert.Equal(3, result.Content); - -// var count = dbset.Count(); -// Assert.Equal(3, count); - -// var oldEntity = dbset.First(p => p.Id == entry.Entity.Id); -// Assert.Equal(ProcessMapPlanBase.IdStateReplaced, oldEntity.IdState); -// Assert.Equal(1, oldEntity.IdEditor); -// Assert.NotNull(oldEntity.Obsolete); -// Assert.InRange(oldEntity.Obsolete.Value, startTime, doneTime); - -// var newEntity = dbset.First(p => p.Comment == dtoUpdate.Comment); -// Assert.Equal(ProcessMapPlanBase.IdStateActual, newEntity.IdState); -// Assert.Equal(1, newEntity.IdAuthor); -// Assert.Null(newEntity.IdEditor); -// Assert.Null(newEntity.Obsolete); -// Assert.Equal(oldEntity.Id, newEntity.IdPrevious); -// Assert.InRange(newEntity.Creation, startTime, doneTime); - -// var expected = dtoUpdate.Adapt(); -// var excludeProps = new[] { -// nameof(ProcessMapPlanDrilling.Id), -// nameof(ProcessMapPlanDrilling.IdWell), -// nameof(ProcessMapPlanDrilling.Author), -// nameof(ProcessMapPlanDrilling.IdAuthor), -// nameof(ProcessMapPlanDrilling.Editor), -// nameof(ProcessMapPlanDrilling.Creation), -// }; -// MatchHelper.Match(expected, newEntity!, excludeProps); -// } - -// [Fact] -// public async Task DeleteRange_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// var entry = dbset.Add(entity); -// dbContext.SaveChanges(); -// entry.State = EntityState.Detached; - -// var startTime = DateTimeOffset.UtcNow; - -// //act -// var response = await client.DeleteRange(dto.IdWell, new[] { entry.Entity.Id }); - -// //assert -// var doneTime = DateTimeOffset.UtcNow; -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.Equal(1, response.Content); - -// var actual = dbContext -// .Set() -// .FirstOrDefault(p => p.Id == entry.Entity.Id); - -// Assert.NotNull(actual); -// Assert.Equal(ProcessMapPlanBase.IdStateDeleted, actual.IdState); -// Assert.Equal(1, actual.IdEditor); -// Assert.NotNull(actual.Obsolete); -// Assert.InRange(actual.Obsolete.Value, startTime, doneTime); -// } - - -// [Fact] -// public async Task Clear_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// var entry = dbset.Add(entity); -// dbContext.SaveChanges(); -// entry.State = EntityState.Detached; - -// var startTime = DateTimeOffset.UtcNow; - -// //act -// var response = await client.Clear(dto.IdWell); - -// //assert -// var doneTime = DateTimeOffset.UtcNow; -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.Equal(1, response.Content); - -// var actual = dbContext -// .Set() -// .FirstOrDefault(p => p.Id == entry.Entity.Id); - -// Assert.NotNull(actual); -// Assert.Equal(ProcessMapPlanBase.IdCleared, actual.IdState); -// Assert.Equal(1, actual.IdEditor); -// Assert.NotNull(actual.Obsolete); -// Assert.InRange(actual.Obsolete.Value, startTime, doneTime); -// } - -// [Fact] -// public async Task GetDatesChange_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// var entity2 = entity.Adapt(); -// entity2.Creation = entity.Creation.AddDays(1); -// dbset.Add(entity); -// dbset.Add(entity2); -// dbContext.SaveChanges(); -// var timezoneHours = Defaults.Timezone.Hours; -// var offset = TimeSpan.FromHours(timezoneHours); -// var dates = new[] { entity.Creation, entity2.Creation } -// .Select(d => d.ToOffset(offset)) -// .Select(d => new DateOnly(d.Year, d.Month, d.Day)); - -// //act -// var response = await client.GetDatesChange(dto.IdWell); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.NotNull(response.Content); -// Assert.Equal(2, response.Content.Count()); -// Assert.All(response.Content, d => dates.Contains(d)); -// } - -// [Fact] -// public async Task Get_all_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// dbset.Add(entity); - -// var entityDeleted = entity.Adapt(); -// entityDeleted.Creation = entity.Creation.AddDays(-1); -// entityDeleted.Obsolete = entity.Creation; -// entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; -// entityDeleted.IdEditor = 1; -// dbset.Add(entityDeleted); - -// dbContext.SaveChanges(); - -// //act -// var request = new ProcessMapPlanBaseRequest(); -// var response = await client.Get(dto.IdWell, request); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.NotNull(response.Content); -// Assert.Equal(2, response.Content.Count()); -// } - -// [Fact] -// public async Task Get_actual_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// dbset.Add(entity); - -// var entityDeleted = entity.Adapt(); -// entityDeleted.Creation = entity.Creation.AddDays(-1); -// entityDeleted.Obsolete = entity.Creation; -// entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; -// entityDeleted.IdEditor = 1; -// entityDeleted.Comment = "nothing"; -// dbset.Add(entityDeleted); - -// dbContext.SaveChanges(); - -// //act -// var request = new ProcessMapPlanBaseRequest { -// Moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, 0, TimeSpan.Zero) -// }; -// var response = await client.Get(dto.IdWell, request); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.NotNull(response.Content); -// Assert.Single(response.Content); - -// var actual = response.Content.First()!; - -// var expected = entity.Adapt()!; -// var excludeProps = new[] { -// nameof(ProcessMapPlanDrillingDto.Id), -// nameof(ProcessMapPlanDrillingDto.Author), -// nameof(ProcessMapPlanDrillingDto.Creation), -// }; -// MatchHelper.Match(expected, actual, excludeProps); -// } - -// [Fact] -// public async Task Get_at_moment_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// var now = DateTimeOffset.UtcNow; -// var entityDeleted = entity.Adapt(); -// entityDeleted.Creation = now; -// entityDeleted.Obsolete = now.AddMinutes(1); -// entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; -// entityDeleted.IdEditor = 1; -// entityDeleted.Comment = "nothing"; -// dbset.Add(entityDeleted); - -// var entityDeleted2 = entity.Adapt(); -// entityDeleted2.Creation = now.AddMinutes(1); -// entityDeleted2.Obsolete = now.AddMinutes(2); -// entityDeleted2.IdState = ProcessMapPlanBase.IdStateDeleted; -// entityDeleted2.IdEditor = 1; -// entityDeleted2.Comment = "nothing"; -// dbset.Add(entityDeleted2); - -// dbContext.SaveChanges(); - -// //act -// var request = new ProcessMapPlanBaseRequest -// { -// Moment = now.AddMinutes(0.5), -// }; -// var response = await client.Get(dto.IdWell, request); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.NotNull(response.Content); -// Assert.Single(response.Content); -// } - -// [Fact] -// public async Task Get_section_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// dbset.Add(entity); - -// var entity2 = entity.Adapt(); -// entity2.IdWellSectionType = 2; -// entity2.Comment = "IdWellSectionType = 2"; -// dbset.Add(entity2); - -// dbContext.SaveChanges(); - -// //act -// var request = new ProcessMapPlanBaseRequest -// { -// IdWellSectionType = 2, -// }; -// var response = await client.Get(dto.IdWell, request); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.NotNull(response.Content); -// Assert.Single(response.Content); - -// var actual = response.Content.First()!; - -// var expected = entity2.Adapt()!; -// var excludeProps = new[] { -// nameof(ProcessMapPlanDrillingDto.Id), -// nameof(ProcessMapPlanDrillingDto.Author), -// nameof(ProcessMapPlanDrillingDto.Creation), -// }; -// MatchHelper.Match(expected, actual, excludeProps); -// } - -// [Fact] -// public async Task Get_updated_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// dbset.Add(entity); - -// var entity2 = entity.Adapt(); -// entity2.Creation = entity.Creation.AddHours(1); -// entity2.Comment = "IdWellSectionType = 2"; -// dbset.Add(entity2); - -// var entity3 = entity.Adapt(); -// entity3.Obsolete = entity.Creation.AddHours(1); -// entity3.Comment = "IdWellSectionType = 3"; -// dbset.Add(entity3); - -// dbContext.SaveChanges(); - -// var timezoneHours = Defaults.Timezone.Hours; -// var offset = TimeSpan.FromHours(timezoneHours); -// var updateFrom = entity.Creation.ToOffset(offset).AddHours(0.5); - -// //act -// var request = new ProcessMapPlanBaseRequest -// { -// UpdateFrom = updateFrom, -// }; -// var response = await client.Get(dto.IdWell, request); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.NotNull(response.Content); -// Assert.Equal(2, response.Content.Count()); - -// var actual = response.Content -// .First(p => p.Comment == entity2.Comment); - -// var expected = entity2.Adapt(); -// var excludeProps = new[] { -// nameof(ProcessMapPlanDrillingDto.Id), -// nameof(ProcessMapPlanDrillingDto.Author), -// nameof(ProcessMapPlanDrillingDto.Creation), -// }; -// MatchHelper.Match(expected, actual, excludeProps); -// } - -// [Fact] -// public async Task Parse_returns_success() -// { -// //arrange -// const string fileName = "ProcessMapPlanDrillingValid.xlsx"; -// var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); - -// var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); - -// //act -// var response = await client.Parse(IdWell, streamPart); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); - -// var parserResult = response.Content; - -// Assert.NotNull(parserResult); -// Assert.Single(parserResult.Item); -// Assert.True(parserResult.IsValid); - -// var row = parserResult.Item.First(); -// var dtoActual = row.Item; - -// Assert.True(row.IsValid); - -// var excludeProps = new[] { nameof(ProcessMapPlanDrillingDto.IdWell) }; -// MatchHelper.Match(dto, dtoActual, excludeProps); -// } - -// [Fact] -// public async Task Parse_returns_success_for_result_with_warnings() -// { -// //arrange -// const string fileName = "ProcessMapPlanDrillingInvalid.xlsx"; -// var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); - -// var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); - -// //act -// var response = await client.Parse(IdWell, streamPart); - -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); - -// var parserResult = response.Content; - -// Assert.NotNull(parserResult); -// Assert.False(parserResult.IsValid); -// Assert.Single(parserResult.Warnings); -// Assert.Single(parserResult.Item); - -// var row = parserResult.Item.First(); - -// Assert.False(row.IsValid); -// Assert.Equal(2, row.Warnings.Count()); -// } -//} \ No newline at end of file +using AsbCloudApp.Requests; +using AsbCloudDb.Model.ProcessMapPlan; +using AsbCloudWebApi.IntegrationTests.Clients; +using Mapster; +using Microsoft.EntityFrameworkCore; +using System.Net; +using System.Reflection; +using AsbCloudDb.Model.ProcessMaps; +using AsbCloudWebApi.IntegrationTests.Data; +using Refit; +using Xunit; +using AsbCloudApp.Data.ProcessMaps; +using AsbCloudDb.Model; +using AsbCloudApp.Data.User; +using AsbCloudApp.Data; + +namespace AsbCloudWebApi.IntegrationTests.Controllers.ProcessMapPlan; + +public class ProcessMapPlanDrillingControllerTest : BaseIntegrationTest +{ + private const int IdWell = 1; + + private readonly ProcessMapPlanDrillingDto dto = new() + { + Id = 0, + + IdWell = IdWell, + Section = "Кондуктор", + IdWellSectionType = 3, + DepthStart = 0.5, + DepthEnd = 1.5, + + IdMode = 1, + AxialLoadPlan = 2.718281, + AxialLoadLimitMax = 3.1415926, + DeltaPressurePlan = 4, + DeltaPressureLimitMax = 5, + TopDriveTorquePlan = 6, + TopDriveTorqueLimitMax = 7, + TopDriveSpeedPlan = 8, + TopDriveSpeedLimitMax = 9, + FlowPlan = 10, + FlowLimitMax = 11, + RopPlan = 12, + UsageSaub = 13, + UsageSpin = 14, + Comment = "это тестовая запись", + }; + private readonly ProcessMapPlanDrilling entity = new() + { + Id = 0, + IdAuthor = 1, + IdEditor = null, + Creation = DateTimeOffset.UtcNow, + Obsolete = null, + IdState = AsbCloudDb.Model.ChangeLogAbstract.IdStateActual, + IdPrevious = null, + + IdWell = IdWell, + IdWellSectionType = 1, + DepthStart = 0.5, + DepthEnd = 1.5, + + IdMode = 1, + AxialLoadPlan = 2.718281, + AxialLoadLimitMax = 3.1415926, + DeltaPressurePlan = 4, + DeltaPressureLimitMax = 5, + TopDriveTorquePlan = 6, + TopDriveTorqueLimitMax = 7, + TopDriveSpeedPlan = 8, + TopDriveSpeedLimitMax = 9, + FlowPlan = 10, + FlowLimitMax = 11, + RopPlan = 12, + UsageSaub = 13, + UsageSpin = 14, + Comment = "это тестовая запись", + }; + + private IProcessMapPlanDrillingClient client; + + public ProcessMapPlanDrillingControllerTest(WebAppFactoryFixture factory) : base(factory) + { + dbContext.CleanupDbSet(); + client = factory.GetAuthorizedHttpClient>(string.Empty); + } + + [Fact] + public async Task InsertRange_returns_success() + { + //arrange + var expected = dto.Adapt(); + + //act + var response = await client.InsertRange(dto.IdWell, new[] { expected }); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal(1, response.Content); + + var entity = dbContext + .Set() + .Where(p => p.AxialLoadPlan == dto.AxialLoadPlan) + .Where(p => p.AxialLoadLimitMax == dto.AxialLoadLimitMax) + .Where(p => p.Comment == dto.Comment) + .FirstOrDefault(p => p.IdWell == dto.IdWell); + + Assert.NotNull(entity); + + var actual = entity.Adapt>(); + Assert.Equal(ProcessMapPlanBase.IdStateActual, actual.IdState); + + var excludeProps = new[] { + nameof(ProcessMapPlanDrillingDto.Id), + nameof(ProcessMapPlanDrillingDto.Section) + }; + MatchHelper.Match(expected, actual.Item, excludeProps); + } + + [Fact] + public async Task InsertRange_returns_BadRequest_for_IdWellSectionType() + { + //arrange + var badDto = dto.Adapt(); + badDto.IdWellSectionType = int.MaxValue; + + //act + var response = await client.InsertRange(dto.IdWell, new[] { badDto }); + + //assert + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + } + + [Fact] + public async Task InsertRange_returns_BadRequest_for_IdMode() + { + //arrange + var badDto = dto.Adapt(); + badDto.IdMode = int.MaxValue; + + //act + var response = await client.InsertRange(dto.IdWell, new[] { badDto }); + + //assert + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + } + + [Fact] + public async Task ClearAndInsertRange_returns_success() + { + // arrange + var dbset = dbContext.Set(); + + var entry = dbset.Add(entity); + dbContext.SaveChanges(); + entry.State = EntityState.Detached; + + var startTime = DateTimeOffset.UtcNow; + + // act + var result = await client.ClearAndInsertRange(entity.IdWell, new ProcessMapPlanDrillingDto[] { dto }); + + // assert + var doneTime = DateTimeOffset.UtcNow; + Assert.Equal(HttpStatusCode.OK, result.StatusCode); + Assert.Equal(2, result.Content); + + var count = dbset.Count(); + Assert.Equal(2, count); + + var oldEntity = dbset.First(p => p.Id == entry.Entity.Id); + Assert.Equal(ProcessMapPlanBase.IdCleared, oldEntity.IdState); + Assert.Equal(1, oldEntity.IdEditor); + Assert.NotNull(oldEntity.Obsolete); + Assert.InRange(oldEntity.Obsolete.Value, startTime, doneTime); + + var newEntity = dbset.First(p => p.Id != entry.Entity.Id); + Assert.Equal(ProcessMapPlanBase.IdStateActual, newEntity.IdState); + Assert.Equal(1, newEntity.IdAuthor); + Assert.Null(newEntity.IdEditor); + Assert.Null(newEntity.Obsolete); + Assert.Null(newEntity.IdPrevious); + Assert.InRange(newEntity.Creation, startTime, doneTime); + } + + [Fact] + public async Task UpdateOrInsertRange_returns_success() + { + // arrange + var startTime = DateTimeOffset.UtcNow; + + var dbset = dbContext.Set(); + var user = dbContext.Set().First().Adapt(); + user.Surname = "userSurname"; + user.Email = "user@mail.domain"; + + var entry = dbset.Add(entity); + dbContext.SaveChanges(); + entry.State = EntityState.Detached; + + var dtoUpdate = dto.Adapt(); + dtoUpdate.IdWell = 0; + dtoUpdate.Id = entry.Entity.Id; + dtoUpdate.Comment = "nebuchadnezzar"; + dtoUpdate.DeltaPressureLimitMax++; + dtoUpdate.DeltaPressurePlan++; + dtoUpdate.FlowPlan++; + dtoUpdate.FlowLimitMax++; + dtoUpdate.RopPlan++; + dtoUpdate.AxialLoadPlan++; + dtoUpdate.AxialLoadLimitMax++; + dtoUpdate.DepthStart++; + dtoUpdate.DepthEnd++; + dtoUpdate.TopDriveSpeedPlan++; + dtoUpdate.TopDriveSpeedLimitMax++; + dtoUpdate.TopDriveTorquePlan++; + dtoUpdate.TopDriveTorqueLimitMax++; + + var dtoInsert = dtoUpdate.Adapt(); + dtoInsert.Id = 0; + dtoInsert.Comment = "nebuchad"; + dtoInsert.DeltaPressureLimitMax++; + dtoInsert.DeltaPressurePlan++; + dtoInsert.FlowPlan++; + dtoInsert.FlowLimitMax++; + dtoInsert.RopPlan++; + dtoInsert.AxialLoadPlan++; + dtoInsert.AxialLoadLimitMax++; + dtoInsert.DepthStart++; + dtoInsert.DepthEnd++; + dtoInsert.TopDriveSpeedPlan++; + dtoInsert.TopDriveSpeedLimitMax++; + dtoInsert.TopDriveTorquePlan++; + dtoInsert.TopDriveTorqueLimitMax++; + + // act + var result = await client.UpdateOrInsertRange(entity.IdWell, new ProcessMapPlanDrillingDto[] { dtoUpdate, dtoInsert }); + + // assert + var doneTime = DateTimeOffset.UtcNow; + Assert.Equal(HttpStatusCode.OK, result.StatusCode); + Assert.Equal(3, result.Content); + + var count = dbset.Count(); + Assert.Equal(3, count); + + var oldEntity = dbset.First(p => p.Id == entry.Entity.Id); + Assert.Equal(ProcessMapPlanBase.IdStateReplaced, oldEntity.IdState); + Assert.Equal(1, oldEntity.IdEditor); + Assert.NotNull(oldEntity.Obsolete); + Assert.InRange(oldEntity.Obsolete.Value, startTime, doneTime); + + var newEntity = dbset.First(p => p.Comment == dtoUpdate.Comment); + Assert.Equal(ProcessMapPlanBase.IdStateActual, newEntity.IdState); + Assert.Equal(1, newEntity.IdAuthor); + Assert.Null(newEntity.IdEditor); + Assert.Null(newEntity.Obsolete); + Assert.Equal(oldEntity.Id, newEntity.IdPrevious); + Assert.InRange(newEntity.Creation, startTime, doneTime); + + var expected = dtoUpdate.Adapt(); + var excludeProps = new[] { + nameof(ProcessMapPlanDrilling.Id), + nameof(ProcessMapPlanDrilling.IdWell), + nameof(ProcessMapPlanDrilling.Author), + nameof(ProcessMapPlanDrilling.IdAuthor), + nameof(ProcessMapPlanDrilling.Editor), + nameof(ProcessMapPlanDrilling.Creation), + }; + MatchHelper.Match(expected, newEntity!, excludeProps); + } + + [Fact] + public async Task DeleteRange_returns_success() + { + //arrange + var dbset = dbContext.Set(); + + var entry = dbset.Add(entity); + dbContext.SaveChanges(); + entry.State = EntityState.Detached; + + var startTime = DateTimeOffset.UtcNow; + + //act + var response = await client.DeleteRange(dto.IdWell, new[] { entry.Entity.Id }); + + //assert + var doneTime = DateTimeOffset.UtcNow; + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal(1, response.Content); + + var actual = dbContext + .Set() + .FirstOrDefault(p => p.Id == entry.Entity.Id); + + Assert.NotNull(actual); + Assert.Equal(ProcessMapPlanBase.IdStateDeleted, actual.IdState); + Assert.Equal(1, actual.IdEditor); + Assert.NotNull(actual.Obsolete); + Assert.InRange(actual.Obsolete.Value, startTime, doneTime); + } + + + [Fact] + public async Task Clear_returns_success() + { + //arrange + var dbset = dbContext.Set(); + + var entry = dbset.Add(entity); + dbContext.SaveChanges(); + entry.State = EntityState.Detached; + + var startTime = DateTimeOffset.UtcNow; + + //act + var response = await client.Clear(dto.IdWell); + + //assert + var doneTime = DateTimeOffset.UtcNow; + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal(1, response.Content); + + var actual = dbContext + .Set() + .FirstOrDefault(p => p.Id == entry.Entity.Id); + + Assert.NotNull(actual); + Assert.Equal(ProcessMapPlanBase.IdCleared, actual.IdState); + Assert.Equal(1, actual.IdEditor); + Assert.NotNull(actual.Obsolete); + Assert.InRange(actual.Obsolete.Value, startTime, doneTime); + } + + [Fact] + public async Task GetDatesChange_returns_success() + { + //arrange + var dbset = dbContext.Set(); + + var entity2 = entity.Adapt(); + entity2.Creation = entity.Creation.AddDays(1); + dbset.Add(entity); + dbset.Add(entity2); + dbContext.SaveChanges(); + var timezoneHours = Defaults.Timezone.Hours; + var offset = TimeSpan.FromHours(timezoneHours); + var dates = new[] { entity.Creation, entity2.Creation } + .Select(d => d.ToOffset(offset)) + .Select(d => new DateOnly(d.Year, d.Month, d.Day)); + + //act + var response = await client.GetDatesChange(dto.IdWell); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Equal(2, response.Content.Count()); + Assert.All(response.Content, d => dates.Contains(d)); + } + + [Fact] + public async Task Get_actual_returns_success() + { + //arrange + var dbset = dbContext.Set(); + + dbset.Add(entity); + + var entityDeleted = entity.Adapt(); + entityDeleted.Creation = entity.Creation.AddDays(-1); + entityDeleted.Obsolete = entity.Creation; + entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; + entityDeleted.IdEditor = 1; + entityDeleted.Comment = "nothing"; + dbset.Add(entityDeleted); + + dbContext.SaveChanges(); + + var response = await client.Get(dto.IdWell); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Single(response.Content); + + var actual = response.Content.First()!; + + var expected = entity.Adapt()!; + var excludeProps = new[] { + nameof(ProcessMapPlanDrillingDto.Id), + }; + MatchHelper.Match(expected, actual, excludeProps); + } + + [Fact] + public async Task Get_at_moment_returns_success() + { + //arrange + var dbset = dbContext.Set(); + + var now = DateTimeOffset.UtcNow; + var entityDeleted = entity.Adapt(); + entityDeleted.Creation = now; + entityDeleted.Obsolete = now.AddMinutes(1); + entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; + entityDeleted.IdEditor = 1; + entityDeleted.Comment = "nothing"; + dbset.Add(entityDeleted); + + var entityDeleted2 = entity.Adapt(); + entityDeleted2.Creation = now.AddMinutes(1); + entityDeleted2.Obsolete = now.AddMinutes(2); + entityDeleted2.IdState = ProcessMapPlanBase.IdStateDeleted; + entityDeleted2.IdEditor = 1; + entityDeleted2.Comment = "nothing"; + dbset.Add(entityDeleted2); + + dbContext.SaveChanges(); + + //act + var response = await client.Get(dto.IdWell, now.AddMinutes(0.5)); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Single(response.Content); + } + + [Fact] + public async Task Get_by_updated_from_returns_success() + { + //arrange + var dbset = dbContext.Set(); + dbset.Add(entity); + + var entity2 = entity.Adapt(); + entity2.Obsolete = DateTimeOffset.UtcNow; + dbset.Add(entity2); + + dbContext.SaveChanges(); + + //act + var response = await client.Get(Defaults.RemoteUid, DateTimeOffset.UtcNow.AddHours(-1)); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Equal(2, response.Content.Count()); + } + + [Fact] + public async Task Get_updated_returns_success() + { + //arrange + var dbset = dbContext.Set(); + + dbset.Add(entity); + + var entity2 = entity.Adapt(); + entity2.Creation = entity.Creation.AddHours(1); + entity2.Comment = "IdWellSectionType = 2"; + dbset.Add(entity2); + + var entity3 = entity.Adapt(); + entity3.Obsolete = entity.Creation.AddHours(1); + entity3.Comment = "IdWellSectionType = 3"; + dbset.Add(entity3); + + dbContext.SaveChanges(); + + var timezoneHours = Defaults.Timezone.Hours; + var offset = TimeSpan.FromHours(timezoneHours); + var updateFrom = entity.Creation.ToOffset(offset).AddHours(0.5); + + //act + var request = new ProcessMapPlanBaseRequest + { + UpdateFrom = updateFrom, + }; + var response = await client.Get(dto.IdWell); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Equal(2, response.Content.Count()); + + var actual = response.Content + .First(p => p.Comment == entity2.Comment); + + var expected = entity2.Adapt(); + var excludeProps = new[] { + nameof(ProcessMapPlanDrillingDto.Id), + }; + MatchHelper.Match(expected, actual, excludeProps); + } + + [Fact] + public async Task Parse_returns_success() + { + //arrange + const string fileName = "ProcessMapPlanDrillingValid.xlsx"; + var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); + + var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); + + //act + var response = await client.Parse(IdWell, streamPart); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + var parserResult = response.Content; + + Assert.NotNull(parserResult); + Assert.Single(parserResult.Item); + Assert.True(parserResult.IsValid); + + var row = parserResult.Item.First(); + var dtoActual = row.Item; + + Assert.True(row.IsValid); + + var excludeProps = new[] { nameof(ProcessMapPlanDrillingDto.IdWell) }; + MatchHelper.Match(dto, dtoActual, excludeProps); + } + + [Fact] + public async Task Parse_returns_success_for_result_with_warnings() + { + //arrange + const string fileName = "ProcessMapPlanDrillingInvalid.xlsx"; + var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); + + var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); + + //act + var response = await client.Parse(IdWell, streamPart); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + var parserResult = response.Content; + + Assert.NotNull(parserResult); + Assert.False(parserResult.IsValid); + Assert.Single(parserResult.Warnings); + Assert.Single(parserResult.Item); + + var row = parserResult.Item.First(); + + Assert.False(row.IsValid); + Assert.Equal(2, row.Warnings.Count()); + } +} \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs b/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs index a3667662..ed2d87a0 100644 --- a/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs +++ b/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs @@ -11,6 +11,8 @@ namespace AsbCloudWebApi.IntegrationTests.Data Hours = 1 }; + public static string RemoteUid = "555-555-555"; + public static Deposit[] Deposits => new Deposit[] { new() @@ -39,7 +41,7 @@ namespace AsbCloudWebApi.IntegrationTests.Data Timezone = Timezone, Telemetry = new Telemetry { - RemoteUid = "555-555-555", + RemoteUid = RemoteUid, TimeZone = Timezone }, RelationCompaniesWells = new RelationCompanyWell[] From 833c5063251586d89979e62362bbfa5915241f1f Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 21 May 2024 07:15:37 +0300 Subject: [PATCH 04/19] Convert2 rename to Convert --- .../Repository/ChangeLogRepositoryAbstract.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index 088518e9..2dd9a30d 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -240,7 +240,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh .ThenBy(e => e.Obsolete) .ThenBy(e => e.Id) .ToListAsync(token); - var dtos = entities.Select(e => Convert2(e, offset)); + var dtos = entities.Select(e => Convert(e, offset)); return dtos; } @@ -275,7 +275,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh return entity; } - protected ChangeLogDto Convert2(TEntity entity, TimeSpan offset) + protected ChangeLogDto Convert(TEntity entity, TimeSpan offset) { var dto = entity.Adapt>(); dto.Creation = entity.Creation.ToOffset(offset); From 7f683bc361cc00b56c0edd413820d216e1dca977 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 21 May 2024 07:25:19 +0300 Subject: [PATCH 05/19] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D0=B8=D0=B9=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/ChangeLogRepositoryAbstract.cs | 2 +- .../Repository/ProcessMapPlanBaseRepository.cs | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index 2dd9a30d..45ce103d 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -275,7 +275,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh return entity; } - protected ChangeLogDto Convert(TEntity entity, TimeSpan offset) + protected virtual ChangeLogDto Convert(TEntity entity, TimeSpan offset) { var dto = entity.Adapt>(); dto.Creation = entity.Creation.ToOffset(offset); diff --git a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs index 3d968ddc..f33b5dca 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs @@ -56,13 +56,6 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb return offset; } - protected TDto Convert(TEntity entity, TimeSpan offset) - { - var dto = entity.Adapt(); - dto.Section = entity.WellSectionType.Caption; - return dto; - } - protected override TEntity Convert(TDto dto) { var entity = base.Convert(dto); From 28d9e74e456e62ddace2abfb6e955d6e522003f3 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 23 May 2024 12:25:37 +0300 Subject: [PATCH 06/19] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=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/ChangeLogDto.cs | 7 +--- .../Repositories/IChangeLogRepository.cs | 41 +++++++++---------- AsbCloudApp/Requests/ProcessMapPlanRequest.cs | 24 ----------- .../Repository/WellCompositeRepository.cs | 10 +---- 4 files changed, 22 insertions(+), 60 deletions(-) delete mode 100644 AsbCloudApp/Requests/ProcessMapPlanRequest.cs diff --git a/AsbCloudApp/Data/ChangeLogDto.cs b/AsbCloudApp/Data/ChangeLogDto.cs index c9b94508..7d47be9c 100644 --- a/AsbCloudApp/Data/ChangeLogDto.cs +++ b/AsbCloudApp/Data/ChangeLogDto.cs @@ -6,18 +6,13 @@ namespace AsbCloudApp.Data; /// /// Часть записи описывающая изменение /// -public class ChangeLogDto +public class ChangeLogDto where T: IId { /// /// Запись /// public required T Item { get; set; } - /// - /// ИД записи - /// - public int Id { get; set; } - /// /// Автор /// diff --git a/AsbCloudApp/Repositories/IChangeLogRepository.cs b/AsbCloudApp/Repositories/IChangeLogRepository.cs index 7509a15d..bcadce47 100644 --- a/AsbCloudApp/Repositories/IChangeLogRepository.cs +++ b/AsbCloudApp/Repositories/IChangeLogRepository.cs @@ -1,10 +1,9 @@ -using System; +using AsbCloudApp.Data; +using AsbCloudApp.Requests; +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using AsbCloudApp.Data; -using AsbCloudApp.Data.ProcessMaps; -using AsbCloudApp.Requests; namespace AsbCloudApp.Repositories; @@ -12,26 +11,26 @@ namespace AsbCloudApp.Repositories; /// Репозиторий для записей с историей /// public interface IChangeLogRepository - where TDto : ProcessMapPlanBaseDto + where TDto : IId where TRequest : ChangeLogBaseRequest { - /// - /// Добавление записей - /// - /// - /// - /// - /// - Task InsertRange(int idUser, IEnumerable dtos, CancellationToken token); + /// + /// Добавление записей + /// + /// + /// + /// + /// + Task InsertRange(int idUser, IEnumerable dtos, CancellationToken token); - /// - /// Редактирование записей - /// - /// - /// - /// - /// - Task UpdateRange(int idUser, IEnumerable dtos, CancellationToken token); + /// + /// Редактирование записей + /// + /// + /// + /// + /// + Task UpdateRange(int idUser, IEnumerable dtos, CancellationToken token); /// /// Добавляет Dto у которых id == 0, изменяет dto у которых id != 0 diff --git a/AsbCloudApp/Requests/ProcessMapPlanRequest.cs b/AsbCloudApp/Requests/ProcessMapPlanRequest.cs deleted file mode 100644 index b3247ce2..00000000 --- a/AsbCloudApp/Requests/ProcessMapPlanRequest.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; - -namespace AsbCloudApp.Requests; - -/// -/// Запрос для получения РТК план -/// -public class ProcessMapPlanRequest -{ - /// - /// Идентификатор скважины - /// - public int IdWell { get; set; } - - /// - /// Тип секции - /// - public int? IdWellSectionType { get; set; } - - /// - /// Дата обновления - /// - public DateTimeOffset? UpdateFrom { get; set; } -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index b4c3bae9..2a06cf9c 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -53,15 +53,7 @@ public class WellCompositeRepository : IWellCompositeRepository /// public async Task> GetCompositeProcessMap(int idWell, CancellationToken token) { - var dtos = await GetAsync(idWell, token); - - var requests = dtos.Select(x => new ProcessMapPlanRequest { - IdWell = x.IdWellSrc, - IdWellSectionType = x.IdWellSectionType - }); - - //var result = await processMapPlanDrillingRepository.GetAsync(requests, token); - return Enumerable.Empty(); + return await Task.FromResult(Enumerable.Empty()); } private static WellComposite Convert(int idWell, WellCompositeDto dto) From 98b99a041aac4e1c5d273a6102c6acb4a140e1d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D1=8F=20=D0=91=D0=B8=D0=B7=D1=8E=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0?= Date: Tue, 28 May 2024 00:05:21 +0500 Subject: [PATCH 07/19] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=BC=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/Extensions/ChangeLogExtensions.cs | 2 +- .../Repositories/IChangeLogRepository.cs | 6 ++--- .../Repositories/IWellCompositeRepository.cs | 2 +- AsbCloudApp/Requests/ChangeLogBaseRequest.cs | 17 +++++++++++++ .../Requests/ProcessMapPlanBaseRequest.cs | 25 ++++++++++++++++--- AsbCloudInfrastructure/DependencyInjection.cs | 25 +++++++------------ .../Repository/ChangeLogRepositoryAbstract.cs | 2 +- .../ProcessMapPlanBaseRepository.cs | 2 +- .../Repository/WellCompositeRepository.cs | 5 ++-- .../Controllers/WellCompositeController.cs | 2 +- AsbCloudWebApi/DependencyInjection.cs | 17 ++++++------- 11 files changed, 66 insertions(+), 39 deletions(-) diff --git a/AsbCloudApp/Extensions/ChangeLogExtensions.cs b/AsbCloudApp/Extensions/ChangeLogExtensions.cs index 628c2661..c963201b 100644 --- a/AsbCloudApp/Extensions/ChangeLogExtensions.cs +++ b/AsbCloudApp/Extensions/ChangeLogExtensions.cs @@ -21,7 +21,7 @@ namespace AsbCloudApp.Extensions /// /// public static IEnumerable> WhereActualAtMoment(this IEnumerable> items, DateTimeOffset moment) - where T : ProcessMapPlanBaseDto + where T : IId { var actualItems = items .Where(item => item.Creation <= moment) diff --git a/AsbCloudApp/Repositories/IChangeLogRepository.cs b/AsbCloudApp/Repositories/IChangeLogRepository.cs index bcadce47..c17b2723 100644 --- a/AsbCloudApp/Repositories/IChangeLogRepository.cs +++ b/AsbCloudApp/Repositories/IChangeLogRepository.cs @@ -11,7 +11,7 @@ namespace AsbCloudApp.Repositories; /// Репозиторий для записей с историей /// public interface IChangeLogRepository - where TDto : IId + where TDto : AsbCloudApp.Data.IId where TRequest : ChangeLogBaseRequest { /// @@ -78,10 +78,10 @@ public interface IChangeLogRepository Task> GetDatesChange(TRequest request, CancellationToken token); /// - /// Получение журнала изменений + /// Получение измененных записей за определенную дату /// /// - /// Фильтр по дате. Если null - вернет все + /// Фильтр по дате. Если null - вернет все записи, без привязки к дате /// /// Task>> GetChangeLog(TRequest request, DateOnly? date, CancellationToken token); diff --git a/AsbCloudApp/Repositories/IWellCompositeRepository.cs b/AsbCloudApp/Repositories/IWellCompositeRepository.cs index f5a5101a..0f9a05f8 100644 --- a/AsbCloudApp/Repositories/IWellCompositeRepository.cs +++ b/AsbCloudApp/Repositories/IWellCompositeRepository.cs @@ -34,6 +34,6 @@ namespace AsbCloudApp.Repositories /// /// /// - Task> GetCompositeProcessMap(int idWell, CancellationToken token); + IEnumerable GetCompositeProcessMap(int idWell, CancellationToken token); } } diff --git a/AsbCloudApp/Requests/ChangeLogBaseRequest.cs b/AsbCloudApp/Requests/ChangeLogBaseRequest.cs index e70553b2..2beef7a5 100644 --- a/AsbCloudApp/Requests/ChangeLogBaseRequest.cs +++ b/AsbCloudApp/Requests/ChangeLogBaseRequest.cs @@ -11,4 +11,21 @@ public class ChangeLogBaseRequest /// Дата/время на которую записи были актуальны. Если не задано, то возвращаются все данные без учета их актуальности /// public DateTimeOffset? Moment { get; set; } + + /// + /// Конструктор + /// + public ChangeLogBaseRequest() + { + + } + + /// + /// Копирующий конструктор + /// + /// + public ChangeLogBaseRequest(ChangeLogBaseRequest request) + { + Moment = request.Moment; + } } diff --git a/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs b/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs index 98a2dc4f..6efe21a6 100644 --- a/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs +++ b/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs @@ -1,23 +1,39 @@ using System; -using System.ComponentModel.DataAnnotations; namespace AsbCloudApp.Requests; /// /// Запрос для получения РТК план /// -public class ProcessMapPlanBaseRequest: ChangeLogBaseRequest +public class ProcessMapPlanBaseRequest : ChangeLogBaseRequest { /// /// Вернуть данные, которые поменялись с указанной даты /// public DateTimeOffset? UpdateFrom { get; set; } + + /// + /// Конструктор + /// + public ProcessMapPlanBaseRequest() + { + + } + + /// + /// Копирующий конструктор + /// + /// Параметры запроса + public ProcessMapPlanBaseRequest(ProcessMapPlanBaseRequest request) : base(request) + { + UpdateFrom = request.UpdateFrom; + } } /// /// Запрос для получения РТК план по скважине /// -public class ProcessMapPlanBaseRequestWithWell: ProcessMapPlanBaseRequest +public class ProcessMapPlanBaseRequestWithWell : ProcessMapPlanBaseRequest { /// /// Запрос для получения РТК план по скважине @@ -34,8 +50,9 @@ public class ProcessMapPlanBaseRequestWithWell: ProcessMapPlanBaseRequest /// /// public ProcessMapPlanBaseRequestWithWell(ProcessMapPlanBaseRequest request, int idWell) + : base(request) { - IdWell=idWell; + IdWell = idWell; UpdateFrom = request.UpdateFrom; Moment = request.Moment; } diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 591c195c..6b36d358 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -1,18 +1,17 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.DailyReport.Blocks.TimeBalance; +using AsbCloudApp.Data.DetectedOperation; using AsbCloudApp.Data.DrillTestReport; 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.Requests; using AsbCloudApp.Services; using AsbCloudApp.Services.DailyReport; using AsbCloudApp.Services.Notifications; -using AsbCloudApp.Services.ProcessMaps; using AsbCloudApp.Services.ProcessMaps.WellDrilling; using AsbCloudDb.Model; using AsbCloudDb.Model.DailyReports.Blocks.TimeBalance; @@ -27,14 +26,15 @@ using AsbCloudInfrastructure.Services.DailyReport; using AsbCloudInfrastructure.Services.DetectOperations; using AsbCloudInfrastructure.Services.DrillingProgram; using AsbCloudInfrastructure.Services.DrillTestReport; +using AsbCloudInfrastructure.Services.ProcessMapPlan.Export; using AsbCloudInfrastructure.Services.ProcessMapPlan.Parser; -using AsbCloudInfrastructure.Services.ProcessMaps; using AsbCloudInfrastructure.Services.ProcessMaps.Report; using AsbCloudInfrastructure.Services.SAUB; using AsbCloudInfrastructure.Services.Subsystems; using AsbCloudInfrastructure.Services.Trajectory; using AsbCloudInfrastructure.Services.Trajectory.Export; using AsbCloudInfrastructure.Services.Trajectory.Parser; +using AsbCloudInfrastructure.Services.WellOperations.Factories; using AsbCloudInfrastructure.Services.WellOperationService; using Mapster; using Microsoft.EntityFrameworkCore; @@ -42,13 +42,6 @@ using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; -using AsbCloudApp.Data.DetectedOperation; -using AsbCloudInfrastructure.Services.ProcessMapPlan.Export; -using AsbCloudInfrastructure.Services.WellOperations.Factories; -using AsbCloudDb.Model.ProcessMapPlan; -using static Org.BouncyCastle.Math.EC.ECCurve; -using AsbCloudApp.Data.User; -using DocumentFormat.OpenXml.Drawing; namespace AsbCloudInfrastructure { @@ -60,15 +53,15 @@ namespace AsbCloudInfrastructure .ForType() .Ignore(source => source.Author) .Ignore(source => source.Well); - + TypeAdapterConfig.GlobalSettings.Default.Config .ForType() .Ignore(source => source.OperationCategory); - + TypeAdapterConfig.GlobalSettings.Default.Config .ForType() .Ignore(source => source.Driller); - + TypeAdapterConfig.GlobalSettings.Default.Config .ForType() .MapWith((source) => source.DateTime); @@ -136,7 +129,7 @@ namespace AsbCloudInfrastructure .Include>() .Map(dest => dest, src => new ChangeLogDto() { - Item = src.Adapt() + Item = src.Adapt() }); } @@ -304,7 +297,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - + services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -314,7 +307,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); - + return services; } } diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index 45ce103d..cff7f61e 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -16,7 +16,7 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository; public abstract class ChangeLogRepositoryAbstract : IChangeLogRepository - where TDto : ProcessMapPlanBaseDto + where TDto : AsbCloudApp.Data.IId where TEntity : ChangeLogAbstract where TRequest : ChangeLogBaseRequest { diff --git a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs index f33b5dca..a7807a62 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs @@ -11,7 +11,7 @@ using System.Linq; namespace AsbCloudInfrastructure.Repository; public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAbstract - where TDto : ProcessMapPlanBaseDto + where TDto : AsbCloudApp.Data.IId where TEntity : ProcessMapPlanBase { private readonly IWellService wellService; diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index 2a06cf9c..a3085e76 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -51,9 +51,10 @@ public class WellCompositeRepository : IWellCompositeRepository } /// - public async Task> GetCompositeProcessMap(int idWell, CancellationToken token) + public IEnumerable GetCompositeProcessMap(int idWell, CancellationToken token) { - return await Task.FromResult(Enumerable.Empty()); + throw new NotImplementedException(); + //return await Task.FromResult(Enumerable.Empty()); } private static WellComposite Convert(int idWell, WellCompositeDto dto) diff --git a/AsbCloudWebApi/Controllers/WellCompositeController.cs b/AsbCloudWebApi/Controllers/WellCompositeController.cs index 903966dd..d4a74ebf 100644 --- a/AsbCloudWebApi/Controllers/WellCompositeController.cs +++ b/AsbCloudWebApi/Controllers/WellCompositeController.cs @@ -79,7 +79,7 @@ namespace AsbCloudWebApi.Controllers if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - var result = await wellCompositeRepository.GetCompositeProcessMap(idWell, token).ConfigureAwait(false); + var result = wellCompositeRepository.GetCompositeProcessMap(idWell, token); return Ok(result); } diff --git a/AsbCloudWebApi/DependencyInjection.cs b/AsbCloudWebApi/DependencyInjection.cs index 8f25ee81..3551c3c5 100644 --- a/AsbCloudWebApi/DependencyInjection.cs +++ b/AsbCloudWebApi/DependencyInjection.cs @@ -1,25 +1,24 @@ using AsbCloudApp.Data.GTR; +using AsbCloudApp.IntegrationEvents; +using AsbCloudApp.IntegrationEvents.Interfaces; using AsbCloudApp.Repositories; +using AsbCloudApp.Services.Notifications; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services; +using AsbCloudInfrastructure.Services.Email; +using AsbCloudWebApi.SignalR; +using AsbCloudWebApi.SignalR.Services; using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; +using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Threading.Tasks; -using AsbCloudApp.IntegrationEvents; -using AsbCloudApp.IntegrationEvents.Interfaces; -using AsbCloudApp.Services.Notifications; -using AsbCloudInfrastructure.Services.Email; -using AsbCloudWebApi.SignalR; -using AsbCloudWebApi.SignalR.Services; -using Microsoft.AspNetCore.Mvc; -using Microsoft.OpenApi.Any; -using Swashbuckle.AspNetCore.SwaggerGen; namespace AsbCloudWebApi { From 28851e5c444c12149f532d3cac2335d37fcb840b Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 28 May 2024 16:34:42 +0500 Subject: [PATCH 08/19] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=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 --- .../ProcessMapPlan/ProcessMapPlanBase.cs | 2 +- AsbCloudInfrastructure/DependencyInjection.cs | 7 +++++ .../Repository/ChangeLogRepositoryAbstract.cs | 19 +++++++++----- .../ProcessMapPlanBaseRepository.cs | 16 ++++++++---- .../Report/ProcessMapReportDrillingService.cs | 26 ++++++++----------- 5 files changed, 43 insertions(+), 27 deletions(-) diff --git a/AsbCloudDb/Model/ProcessMapPlan/ProcessMapPlanBase.cs b/AsbCloudDb/Model/ProcessMapPlan/ProcessMapPlanBase.cs index 47c45dd1..39fba936 100644 --- a/AsbCloudDb/Model/ProcessMapPlan/ProcessMapPlanBase.cs +++ b/AsbCloudDb/Model/ProcessMapPlan/ProcessMapPlanBase.cs @@ -24,7 +24,7 @@ public abstract class ProcessMapPlanBase : ChangeLogAbstract, IId, IWellRelated public virtual User Author { get; set; } = null!; [ForeignKey(nameof(IdEditor))] - public virtual User? Editor { get; set; } = null!; + public virtual User? Editor { get; set; } [ForeignKey(nameof(IdWellSectionType))] public virtual WellSectionType WellSectionType { get; set; } = null!; diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 6b36d358..319b0bc2 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -16,6 +16,7 @@ using AsbCloudApp.Services.ProcessMaps.WellDrilling; using AsbCloudDb.Model; using AsbCloudDb.Model.DailyReports.Blocks.TimeBalance; using AsbCloudDb.Model.Manuals; +using AsbCloudDb.Model.ProcessMapPlan; using AsbCloudDb.Model.ProcessMaps; using AsbCloudDb.Model.Trajectory; using AsbCloudDb.Model.WellSections; @@ -62,6 +63,12 @@ namespace AsbCloudInfrastructure .ForType() .Ignore(source => source.Driller); +#pragma warning disable CS8603 // Possible null reference return. + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .Ignore(dst => dst.Author, dst => dst.Editor); +#pragma warning restore CS8603 // Possible null reference return. + TypeAdapterConfig.GlobalSettings.Default.Config .ForType() .MapWith((source) => source.DateTime); diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index cff7f61e..dddce26a 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -240,7 +240,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh .ThenBy(e => e.Obsolete) .ThenBy(e => e.Id) .ToListAsync(token); - var dtos = entities.Select(e => Convert(e, offset)); + var dtos = entities.Select(e => ConvertChangeLogDto(e, offset)); return dtos; } @@ -256,7 +256,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh .ToArrayAsync(token); TimeSpan offset = GetTimezoneOffset(request); - var dtos = entities.Select(e => e.Adapt()); + var dtos = entities.Select(e => Convert(e, offset)); return dtos; } @@ -275,14 +275,21 @@ public abstract class ChangeLogRepositoryAbstract : ICh return entity; } - protected virtual ChangeLogDto Convert(TEntity entity, TimeSpan offset) + protected virtual ChangeLogDto ConvertChangeLogDto(TEntity entity, TimeSpan offset) { - var dto = entity.Adapt>(); - dto.Creation = entity.Creation.ToOffset(offset); + var changeLogDto = entity.Adapt>(); + changeLogDto.Creation = entity.Creation.ToOffset(offset); if (entity.Obsolete.HasValue) - dto.Obsolete = entity.Obsolete.Value.ToOffset(offset); + changeLogDto.Obsolete = entity.Obsolete.Value.ToOffset(offset); + changeLogDto.Item = Convert(entity, offset); + return changeLogDto; + } + + protected virtual TDto Convert(TEntity entity, TimeSpan offset) + { + var dto = entity.Adapt(); return dto; } diff --git a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs index a7807a62..5fa6a3b6 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs @@ -3,7 +3,6 @@ using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudDb.Model.ProcessMapPlan; -using Mapster; using Microsoft.EntityFrameworkCore; using System; using System.Linq; @@ -11,12 +10,12 @@ using System.Linq; namespace AsbCloudInfrastructure.Repository; public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAbstract - where TDto : AsbCloudApp.Data.IId + where TDto : ProcessMapPlanBaseDto where TEntity : ProcessMapPlanBase { private readonly IWellService wellService; - public ProcessMapPlanBaseRepository(IAsbCloudDbContext context, IWellService wellService) + public ProcessMapPlanBaseRepository(IAsbCloudDbContext context, IWellService wellService) : base(context) { this.wellService = wellService; @@ -56,11 +55,18 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb return offset; } + protected override TDto Convert(TEntity entity, TimeSpan offset) + { + var dto = base.Convert(entity, offset); + dto.Section = entity.WellSectionType.Caption; + return dto; + } + protected override TEntity Convert(TDto dto) { var entity = base.Convert(dto); - entity.Author = null; - entity.Editor = null; + //entity.Author = null; + //entity.Editor = null; return entity; } } diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs index f78d30dc..8a9b9008 100644 --- a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs @@ -48,13 +48,13 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService return Enumerable.Empty(); var requestProcessMapPlan = new ProcessMapPlanBaseRequestWithWell(idWell); - var processMapPlanWellDrillings = await processMapPlanBaseRepository.Get(requestProcessMapPlan, token); + var changeLogProcessMaps = await processMapPlanBaseRepository.GetChangeLog(requestProcessMapPlan, null, token); - if (!processMapPlanWellDrillings.Any()) + if (!changeLogProcessMaps.Any()) return Enumerable.Empty(); - var geDepth = processMapPlanWellDrillings.Min(p => p.DepthStart); - var leDepth = processMapPlanWellDrillings.Max(p => p.DepthEnd); + var geDepth = changeLogProcessMaps.Min(p => p.Item.DepthStart); + var leDepth = changeLogProcessMaps.Max(p => p.Item.DepthEnd); var requestWellOperationFact = new WellOperationRequest(new[] { idWell }) { @@ -86,7 +86,7 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService var result = CalcByIntervals( request, - processMapPlanWellDrillings, + changeLogProcessMaps, dataSaubStats, orderedWellOperations, wellOperationCategories, @@ -97,7 +97,7 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService private static IEnumerable CalcByIntervals( DataSaubStatRequest request, - IEnumerable processMapPlanWellDrillings, + IEnumerable> changeLogProcessMaps, Span dataSaubStats, IEnumerable wellOperations, IEnumerable wellOperationCategories, @@ -126,15 +126,11 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService } ProcessMapPlanDrillingDto? GetProcessMapPlan(int idWellSectionType, DataSaubStatDto data) - => processMapPlanWellDrillings - .Where(p => p.IdWellSectionType == idWellSectionType) - .Where(p => p.DepthStart <= data.DepthStart) - .Where(p => p.DepthEnd >= data.DepthStart) - .Where(p => IsModeMatchOperationCategory(p.IdMode, data.IdCategory)) - .Select(p => new ChangeLogDto() - { - Item = p, - }) + => changeLogProcessMaps + .Where(p => p.Item.IdWellSectionType == idWellSectionType) + .Where(p => p.Item.DepthStart <= data.DepthStart) + .Where(p => p.Item.DepthEnd >= data.DepthStart) + .Where(p => IsModeMatchOperationCategory(p.Item.IdMode, data.IdCategory)) .WhereActualAtMoment(data.DateStart) .Select(p => p.Item) .FirstOrDefault(); From 8066f9a7c1ee494aebb821f19dcebcb417419553 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 28 May 2024 17:32:39 +0500 Subject: [PATCH 09/19] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Repository/WellCompositeRepository.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index a3085e76..181d8cff 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -54,7 +54,6 @@ public class WellCompositeRepository : IWellCompositeRepository public IEnumerable GetCompositeProcessMap(int idWell, CancellationToken token) { throw new NotImplementedException(); - //return await Task.FromResult(Enumerable.Empty()); } private static WellComposite Convert(int idWell, WellCompositeDto dto) From d5cfbf60aaf53f7c0f847cbd1a5677637f330beb Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 29 May 2024 14:42:07 +0500 Subject: [PATCH 10/19] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9?= =?UTF-8?q?=20=D1=80=D0=B0=D0=BD=D0=B5=D0=B5=20Task?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Repositories/IWellCompositeRepository.cs | 2 +- AsbCloudInfrastructure/Repository/WellCompositeRepository.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AsbCloudApp/Repositories/IWellCompositeRepository.cs b/AsbCloudApp/Repositories/IWellCompositeRepository.cs index 0f9a05f8..f5a5101a 100644 --- a/AsbCloudApp/Repositories/IWellCompositeRepository.cs +++ b/AsbCloudApp/Repositories/IWellCompositeRepository.cs @@ -34,6 +34,6 @@ namespace AsbCloudApp.Repositories /// /// /// - IEnumerable GetCompositeProcessMap(int idWell, CancellationToken token); + Task> GetCompositeProcessMap(int idWell, CancellationToken token); } } diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index 181d8cff..e5da1ba8 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -51,7 +51,7 @@ public class WellCompositeRepository : IWellCompositeRepository } /// - public IEnumerable GetCompositeProcessMap(int idWell, CancellationToken token) + public Task> GetCompositeProcessMap(int idWell, CancellationToken token) { throw new NotImplementedException(); } From 63280b60e21d9febf5e0ac41cd89c74810fc1a7e Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 29 May 2024 17:55:01 +0500 Subject: [PATCH 11/19] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=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/Requests/ProcessMapPlanBaseRequest.cs | 2 -- .../Repository/ChangeLogRepositoryAbstract.cs | 1 - AsbCloudWebApi.IntegrationTests/Data/Defaults.cs | 2 +- .../ProcessMaps/ProcessMapPlanBaseController.cs | 7 +++---- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs b/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs index 6efe21a6..04dda6e1 100644 --- a/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs +++ b/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs @@ -53,8 +53,6 @@ public class ProcessMapPlanBaseRequestWithWell : ProcessMapPlanBaseRequest : base(request) { IdWell = idWell; - UpdateFrom = request.UpdateFrom; - Moment = request.Moment; } /// diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index dddce26a..8b260c69 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -251,7 +251,6 @@ public abstract class ChangeLogRepositoryAbstract : ICh var entities = await query .Where(e => e.Obsolete == null) .OrderBy(e => e.Creation) - .ThenBy(e => e.Obsolete) .ThenBy(e => e.Id) .ToArrayAsync(token); diff --git a/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs b/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs index ed2d87a0..c7d75880 100644 --- a/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs +++ b/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs @@ -11,7 +11,7 @@ namespace AsbCloudWebApi.IntegrationTests.Data Hours = 1 }; - public static string RemoteUid = "555-555-555"; + public const string RemoteUid = "555-555-555"; public static Deposit[] Deposits => new Deposit[] { diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index f1c951bf..4afd97f3 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -158,7 +158,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase [HttpGet("history")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - public async Task>>> Get([FromRoute] int idWell, DateTimeOffset? moment, CancellationToken token) + public async Task>>> GetHistory([FromRoute] int idWell, DateTimeOffset? moment, CancellationToken token) { await AssertUserHasAccessToWell(idWell, token); @@ -178,18 +178,17 @@ public abstract class ProcessMapPlanBaseController : ControllerBase /// /// /// + [AllowAnonymous] [HttpGet("/api/telemetry/{uid}/[controller]")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - public async Task>>> Get(string uid, DateTimeOffset? updateFrom, CancellationToken token) + public async Task>>> GetByUid(string uid, DateTimeOffset? updateFrom, CancellationToken token) { var idWell = telemetryService.GetIdWellByTelemetryUid(uid) ?? -1; if (idWell < 0) return this.ValidationBadRequest(nameof(uid), "Скважина по uid не найдена"); - await AssertUserHasAccessToWell(idWell, token); - var serviceRequest = new ProcessMapPlanBaseRequestWithWell(new ProcessMapPlanBaseRequest() { UpdateFrom = updateFrom, From 0b7a3f740a9573aece5616c3fa8c1df68be7ec64 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 30 May 2024 13:40:10 +0500 Subject: [PATCH 12/19] Get_actual_returns_success Add Sections caption check --- .../ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs index cddd7781..a8c41977 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs @@ -387,7 +387,9 @@ public class ProcessMapPlanDrillingControllerTest : BaseIntegrationTest Assert.Single(response.Content); var actual = response.Content.First()!; - + Assert.NotNull(actual.Section); + Assert.NotEmpty(actual.Section); + var expected = entity.Adapt()!; var excludeProps = new[] { nameof(ProcessMapPlanDrillingDto.Id), From c129825eaa55f5d8f131726a1eddc502f9c96d73 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 31 May 2024 11:53:58 +0500 Subject: [PATCH 13/19] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=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 --- .../Repositories/IChangeLogRepository.cs | 17 ++++---- .../Repository/ChangeLogRepositoryAbstract.cs | 43 +++++++++++++------ .../ProcessMapPlanBaseRepository.cs | 8 +--- .../Export/ProcessMapPlanExportService.cs | 2 +- .../Services/WellInfoService.cs | 2 +- ...ProcessMapReportDataSaubStatServiceTest.cs | 37 +++++++--------- .../ProcessMapPlanBaseController.cs | 2 +- 7 files changed, 58 insertions(+), 53 deletions(-) diff --git a/AsbCloudApp/Repositories/IChangeLogRepository.cs b/AsbCloudApp/Repositories/IChangeLogRepository.cs index c17b2723..bf7cc6ef 100644 --- a/AsbCloudApp/Repositories/IChangeLogRepository.cs +++ b/AsbCloudApp/Repositories/IChangeLogRepository.cs @@ -12,12 +12,11 @@ namespace AsbCloudApp.Repositories; /// public interface IChangeLogRepository where TDto : AsbCloudApp.Data.IId - where TRequest : ChangeLogBaseRequest { /// /// Добавление записей /// - /// + /// пользователь, который добавляет /// /// /// @@ -26,7 +25,7 @@ public interface IChangeLogRepository /// /// Редактирование записей /// - /// + /// пользователь, который редактирует /// /// /// @@ -35,17 +34,17 @@ public interface IChangeLogRepository /// /// Добавляет Dto у которых id == 0, изменяет dto у которых id != 0 /// - /// + /// пользователь, который редактирует или добавляет /// /// /// Task UpdateOrInsertRange(int idUser, IEnumerable dtos, CancellationToken token); /// - /// Добавление записей с удалением старых (для импорта) + /// Помечает записи как удаленные /// - /// - /// + /// пользователь, который чистит + /// Фильтр по свойствам конкретной сущности /// /// Task Clear(int idUser, TRequest request, CancellationToken token); @@ -87,10 +86,10 @@ public interface IChangeLogRepository Task>> GetChangeLog(TRequest request, DateOnly? date, CancellationToken token); /// - /// Получение записей по параметрам + /// Получение текущих сейчас записей по параметрам /// /// /// /// - Task> Get(TRequest request, CancellationToken token); + Task> GetCurrent(TRequest request, CancellationToken token); } diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index 8b260c69..b768136a 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -1,5 +1,4 @@ using AsbCloudApp.Data; -using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; @@ -235,28 +234,46 @@ public abstract class ChangeLogRepositoryAbstract : ICh query = createdQuery.Union(editedQuery); } + var dtos = await CreateChangeLogDto(query, offset, token); + + return dtos; + } + + private async Task>> CreateChangeLogDto(IQueryable query, TimeSpan offset, CancellationToken token) + { var entities = await query .OrderBy(e => e.Creation) .ThenBy(e => e.Obsolete) .ThenBy(e => e.Id) .ToListAsync(token); + var dtos = entities.Select(e => ConvertChangeLogDto(e, offset)); + return dtos; + } + + public async Task>> Get(TRequest request, DateTimeOffset? moment, CancellationToken token) + { + var query = BuildQuery(request); + if (moment.HasValue) + { + var momentUtc = moment.Value.ToUniversalTime(); + query = query + .Where(e => e.Creation <= momentUtc) + .Where(e => e.Obsolete == null || e.Obsolete >= momentUtc); + } + + TimeSpan offset = GetTimezoneOffset(request); + var dtos = await CreateChangeLogDto(query, offset, token); return dtos; } - public async Task> Get(TRequest request, CancellationToken token) + public async Task> GetCurrent(TRequest request, CancellationToken token) { - var query = BuildQuery(request); - var entities = await query - .Where(e => e.Obsolete == null) - .OrderBy(e => e.Creation) - .ThenBy(e => e.Id) - .ToArrayAsync(token); - - TimeSpan offset = GetTimezoneOffset(request); - var dtos = entities.Select(e => Convert(e, offset)); - return dtos; + var moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, TimeSpan.Zero); + var entities = await Get(request, moment, token); + var result = entities.Select(e => e.Item); + return result; } protected abstract TimeSpan GetTimezoneOffset(TRequest request); @@ -268,7 +285,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh var entity = dto.Adapt(); entity.Creation = entity.Creation.ToUniversalTime(); - if(entity.Obsolete.HasValue) + if (entity.Obsolete.HasValue) entity.Obsolete = entity.Obsolete.Value.ToUniversalTime(); return entity; diff --git a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs index 5fa6a3b6..7f84a052 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs @@ -37,13 +37,7 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb query = query.Where(e => e.Creation >= from || e.Obsolete >= from); } - if (request.Moment.HasValue) - { - var moment = request.Moment.Value.ToUniversalTime(); - query = query - .Where(e => e.Creation <= moment) - .Where(e => e.Obsolete == null || e.Obsolete >= moment); - } + return query; } diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs index f512c2f1..8f8596ab 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs @@ -33,7 +33,7 @@ public abstract class ProcessMapPlanExportService : ExportExcelService(); foreach (var processMapPlanWellDrillingRequest in processMapPlanWellDrillingRequests) { - var processMaps = await processMapPlanWellDrillingRepository.Get(processMapPlanWellDrillingRequest, token); + var processMaps = await processMapPlanWellDrillingRepository.GetCurrent(processMapPlanWellDrillingRequest, token); processMapPlanWellDrillings.AddRange(processMaps); } diff --git a/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs b/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs index a5cba844..33f837bd 100644 --- a/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs @@ -1,21 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using AsbCloudApp.Data; +using AsbCloudApp.Data; using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; -using AsbCloudInfrastructure.Repository; -using AsbCloudInfrastructure.Services.ProcessMaps; using AsbCloudInfrastructure.Services.ProcessMaps.Report; -using DocumentFormat.OpenXml.Bibliography; -using DocumentFormat.OpenXml.Spreadsheet; using NSubstitute; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; using Xunit; namespace AsbCloudWebApi.Tests.Services.ProcessMaps; @@ -24,27 +19,27 @@ public class ProcessMapReportDataSaubStatServiceTest { - private IWellService wellService + private IWellService wellService = Substitute.For(); - private IChangeLogRepository processMapPlanBaseRepository + private IChangeLogRepository processMapPlanBaseRepository = Substitute.For>(); - private IWellOperationRepository wellOperationRepository + private IWellOperationRepository wellOperationRepository = Substitute.For(); - private IWellOperationCategoryRepository wellOperationCategoryRepository + private IWellOperationCategoryRepository wellOperationCategoryRepository = Substitute.For(); - private IDataSaubStatRepository dataSaubStatRepository + private IDataSaubStatRepository dataSaubStatRepository = Substitute.For(); private ProcessMapReportDrillingService service; private readonly static SimpleTimezoneDto timezone = new() { Hours = 2 }; - private static readonly DateTimeOffset dateStart = new (2024, 01, 01, 00, 11, 11, timezone.Offset); - private readonly static WellDto well = new() - { + private static readonly DateTimeOffset dateStart = new(2024, 01, 01, 00, 11, 11, timezone.Offset); + private readonly static WellDto well = new() + { Id = 1, IdTelemetry = 1, Timezone = timezone @@ -52,7 +47,7 @@ public class ProcessMapReportDataSaubStatServiceTest private readonly static IEnumerable processMapPlan = new List() { new() { - DepthStart = 0, + DepthStart = 0, DepthEnd = 100, IdMode = 1, IdWell = well.Id, @@ -253,13 +248,13 @@ public class ProcessMapReportDataSaubStatServiceTest HasOscillation = false, } }; - + public ProcessMapReportDataSaubStatServiceTest() { wellService.GetOrDefaultAsync(Arg.Any(), Arg.Any()) .Returns(well); - processMapPlanBaseRepository.Get(Arg.Any(), Arg.Any()) + processMapPlanBaseRepository.GetCurrent(Arg.Any(), Arg.Any()) .Returns(processMapPlan); wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index 4afd97f3..f701dd89 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -144,7 +144,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase await AssertUserHasAccessToWell(idWell, token); var serviceRequest = new ProcessMapPlanBaseRequestWithWell(idWell); - var result = await repository.Get(serviceRequest, token); + var result = await repository.GetCurrent(serviceRequest, token); return Ok(result); } From b41f25913e33c8acc4d3c384324bddaa1a120294 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 31 May 2024 13:37:48 +0500 Subject: [PATCH 14/19] =?UTF-8?q?=D0=9C=D0=B5=D1=82=D0=BE=D0=B4=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=BB=D0=B5=D1=80=D0=B0=20?= =?UTF-8?q?ProcessMapPlanBaseController=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=20=D1=81=20Get=20?= =?UTF-8?q?=D0=BD=D0=B0=20GetCurrent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/IChangeLogRepository.cs | 4 ++-- .../Repository/ChangeLogRepositoryAbstract.cs | 2 +- .../ProcessMapPlanBaseController.cs | 18 +++++++++--------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/AsbCloudApp/Repositories/IChangeLogRepository.cs b/AsbCloudApp/Repositories/IChangeLogRepository.cs index bf7cc6ef..70d0df99 100644 --- a/AsbCloudApp/Repositories/IChangeLogRepository.cs +++ b/AsbCloudApp/Repositories/IChangeLogRepository.cs @@ -60,13 +60,13 @@ public interface IChangeLogRepository Task ClearAndInsertRange(int idUser, TRequest request, IEnumerable dtos, CancellationToken token); /// - /// Удаление записей + /// Пометить записи как удаленные /// /// /// /// /// - Task DeleteRange(int idUser, IEnumerable ids, CancellationToken token); + Task MarkAsDeleted(int idUser, IEnumerable ids, CancellationToken token); /// /// Получение дат изменений записей diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index b768136a..9d764402 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -169,7 +169,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh } } - public async Task DeleteRange(int idUser, IEnumerable ids, CancellationToken token) + public async Task MarkAsDeleted(int idUser, IEnumerable ids, CancellationToken token) { var updateTime = DateTimeOffset.UtcNow; var query = db.Set() diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index f701dd89..0ed1a5af 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -95,7 +95,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase } /// - /// Удаление + /// Пометить записи как удаленные /// /// /// @@ -104,11 +104,11 @@ public abstract class ProcessMapPlanBaseController : ControllerBase [HttpDelete] [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - public async Task DeleteRange([FromRoute] int idWell, IEnumerable ids, CancellationToken token) + public async Task MarkAsDeleted([FromRoute] int idWell, IEnumerable ids, CancellationToken token) { var idUser = await AssertUserHasAccessToWell(idWell, token); - var result = await repository.DeleteRange(idUser, ids, token); + var result = await repository.MarkAsDeleted(idUser, ids, token); return Ok(result); } @@ -131,7 +131,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase } /// - /// Получение + /// Получение текущих записей по параметрам /// /// /// @@ -139,7 +139,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase [HttpGet] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - public async Task>> Get([FromRoute] int idWell, CancellationToken token) + public async Task>> GetCurrent([FromRoute] int idWell, CancellationToken token) { await AssertUserHasAccessToWell(idWell, token); @@ -149,7 +149,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase } /// - /// Получение + /// Получение измененных записей за определенную дату по ключу скважины /// /// /// @@ -162,17 +162,17 @@ public abstract class ProcessMapPlanBaseController : ControllerBase { await AssertUserHasAccessToWell(idWell, token); - var serviceRequest = new ProcessMapPlanBaseRequestWithWell(new ProcessMapPlanBaseRequest() + var serviceRequest = new ProcessMapPlanBaseRequestWithWell(idWell) { Moment = moment, - }, idWell); + }; var result = await repository.GetChangeLog(serviceRequest, null, token); return Ok(result); } /// - /// Получение + /// Получение записей за определенную дату по uid /// /// /// From d414fad58c561dcd3d32ac2250871ebd2b91234d Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 31 May 2024 13:40:39 +0500 Subject: [PATCH 15/19] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20request=20=D0=B2=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=20GetByUid=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D0=BB=D0=B5=D1=80=D0=B0=20ProcessMapPlanBaseContro?= =?UTF-8?q?ller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ProcessMaps/ProcessMapPlanBaseController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index 0ed1a5af..89b6c965 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -189,10 +189,10 @@ public abstract class ProcessMapPlanBaseController : ControllerBase if (idWell < 0) return this.ValidationBadRequest(nameof(uid), "Скважина по uid не найдена"); - var serviceRequest = new ProcessMapPlanBaseRequestWithWell(new ProcessMapPlanBaseRequest() + var serviceRequest = new ProcessMapPlanBaseRequestWithWell(idWell) { UpdateFrom = updateFrom, - }, idWell); + }; var result = await repository.GetChangeLog(serviceRequest, null, token); return Ok(result); From 459fc3acb86cb77e3b4dc0276ea9b7ac03fa054d Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 31 May 2024 15:58:28 +0500 Subject: [PATCH 16/19] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/IChangeLogRepository.cs | 13 ++++++++++-- ...eLogBaseRequest.cs => ChangeLogRequest.cs} | 8 +++---- .../Requests/ProcessMapPlanBaseRequest.cs | 2 +- .../Repository/ChangeLogRepositoryAbstract.cs | 21 +++++++++++-------- .../Report/ProcessMapReportDrillingService.cs | 2 +- .../ProcessMapPlanBaseController.cs | 19 ++++++++++------- 6 files changed, 41 insertions(+), 24 deletions(-) rename AsbCloudApp/Requests/{ChangeLogBaseRequest.cs => ChangeLogRequest.cs} (76%) diff --git a/AsbCloudApp/Repositories/IChangeLogRepository.cs b/AsbCloudApp/Repositories/IChangeLogRepository.cs index 70d0df99..92c747f7 100644 --- a/AsbCloudApp/Repositories/IChangeLogRepository.cs +++ b/AsbCloudApp/Repositories/IChangeLogRepository.cs @@ -11,7 +11,7 @@ namespace AsbCloudApp.Repositories; /// Репозиторий для записей с историей /// public interface IChangeLogRepository - where TDto : AsbCloudApp.Data.IId + where TDto : IId { /// /// Добавление записей @@ -83,7 +83,7 @@ public interface IChangeLogRepository /// Фильтр по дате. Если null - вернет все записи, без привязки к дате /// /// - Task>> GetChangeLog(TRequest request, DateOnly? date, CancellationToken token); + Task>> GetChangeLogForDate(TRequest request, DateOnly? date, CancellationToken token); /// /// Получение текущих сейчас записей по параметрам @@ -92,4 +92,13 @@ public interface IChangeLogRepository /// /// Task> GetCurrent(TRequest request, CancellationToken token); + + /// + /// Получение измененных записей за определенный момент времени + /// + /// фильтр по changeLog + /// фильтр по данным внутри changeLog + /// + /// + Task>> GetChangeLogByMoment(ChangeLogRequest changeLogRequest, TRequest dataRequest, CancellationToken token); } diff --git a/AsbCloudApp/Requests/ChangeLogBaseRequest.cs b/AsbCloudApp/Requests/ChangeLogRequest.cs similarity index 76% rename from AsbCloudApp/Requests/ChangeLogBaseRequest.cs rename to AsbCloudApp/Requests/ChangeLogRequest.cs index 2beef7a5..4af94018 100644 --- a/AsbCloudApp/Requests/ChangeLogBaseRequest.cs +++ b/AsbCloudApp/Requests/ChangeLogRequest.cs @@ -3,9 +3,9 @@ namespace AsbCloudApp.Requests; /// -/// Базовый запрос актуальных данных +/// Запрос изменений /// -public class ChangeLogBaseRequest +public class ChangeLogRequest { /// /// Дата/время на которую записи были актуальны. Если не задано, то возвращаются все данные без учета их актуальности @@ -15,7 +15,7 @@ public class ChangeLogBaseRequest /// /// Конструктор /// - public ChangeLogBaseRequest() + public ChangeLogRequest() { } @@ -24,7 +24,7 @@ public class ChangeLogBaseRequest /// Копирующий конструктор /// /// - public ChangeLogBaseRequest(ChangeLogBaseRequest request) + public ChangeLogRequest(ChangeLogRequest request) { Moment = request.Moment; } diff --git a/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs b/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs index 04dda6e1..62e3934d 100644 --- a/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs +++ b/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs @@ -5,7 +5,7 @@ namespace AsbCloudApp.Requests; /// /// Запрос для получения РТК план /// -public class ProcessMapPlanBaseRequest : ChangeLogBaseRequest +public class ProcessMapPlanBaseRequest : ChangeLogRequest { /// /// Вернуть данные, которые поменялись с указанной даты diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index 9d764402..bd10e36b 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -17,7 +17,7 @@ namespace AsbCloudInfrastructure.Repository; public abstract class ChangeLogRepositoryAbstract : IChangeLogRepository where TDto : AsbCloudApp.Data.IId where TEntity : ChangeLogAbstract - where TRequest : ChangeLogBaseRequest + where TRequest : ChangeLogRequest { protected readonly IAsbCloudDbContext db; @@ -218,7 +218,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh return datesOnly; } - public async Task>> GetChangeLog(TRequest request, DateOnly? date, CancellationToken token) + public async Task>> GetChangeLogForDate(TRequest request, DateOnly? date, CancellationToken token) { var query = BuildQuery(request); TimeSpan offset = GetTimezoneOffset(request); @@ -251,18 +251,18 @@ public abstract class ChangeLogRepositoryAbstract : ICh return dtos; } - public async Task>> Get(TRequest request, DateTimeOffset? moment, CancellationToken token) + public async Task>> GetChangeLogByMoment(ChangeLogRequest changeLogRequest, TRequest dataRequest, CancellationToken token) { - var query = BuildQuery(request); - if (moment.HasValue) + var query = BuildQuery(dataRequest); + if (changeLogRequest.Moment.HasValue) { - var momentUtc = moment.Value.ToUniversalTime(); + var momentUtc = changeLogRequest.Moment.Value.ToUniversalTime(); query = query .Where(e => e.Creation <= momentUtc) .Where(e => e.Obsolete == null || e.Obsolete >= momentUtc); } - TimeSpan offset = GetTimezoneOffset(request); + TimeSpan offset = GetTimezoneOffset(dataRequest); var dtos = await CreateChangeLogDto(query, offset, token); return dtos; @@ -270,8 +270,11 @@ public abstract class ChangeLogRepositoryAbstract : ICh public async Task> GetCurrent(TRequest request, CancellationToken token) { - var moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, TimeSpan.Zero); - var entities = await Get(request, moment, token); + var changeLogRequest = new ChangeLogRequest() + { + Moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, TimeSpan.Zero) + }; + var entities = await GetChangeLogByMoment(changeLogRequest, request, token); var result = entities.Select(e => e.Item); return result; } diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs index 8a9b9008..5b51ba62 100644 --- a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs @@ -48,7 +48,7 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService return Enumerable.Empty(); var requestProcessMapPlan = new ProcessMapPlanBaseRequestWithWell(idWell); - var changeLogProcessMaps = await processMapPlanBaseRepository.GetChangeLog(requestProcessMapPlan, null, token); + var changeLogProcessMaps = await processMapPlanBaseRepository.GetChangeLogForDate(requestProcessMapPlan, null, token); if (!changeLogProcessMaps.Any()) return Enumerable.Empty(); diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index 89b6c965..bac90f07 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -155,10 +155,10 @@ public abstract class ProcessMapPlanBaseController : ControllerBase /// /// /// - [HttpGet("history")] + [HttpGet("changelogByMoment")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - public async Task>>> GetHistory([FromRoute] int idWell, DateTimeOffset? moment, CancellationToken token) + public async Task>>> GetChangeLogByMoment([FromRoute] int idWell, DateTimeOffset? moment, CancellationToken token) { await AssertUserHasAccessToWell(idWell, token); @@ -167,7 +167,12 @@ public abstract class ProcessMapPlanBaseController : ControllerBase Moment = moment, }; - var result = await repository.GetChangeLog(serviceRequest, null, token); + var changeLogRequest = new ChangeLogRequest() + { + Moment = moment + }; + + var result = await repository.GetChangeLogByMoment(changeLogRequest, serviceRequest, token); return Ok(result); } @@ -194,7 +199,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase UpdateFrom = updateFrom, }; - var result = await repository.GetChangeLog(serviceRequest, null, token); + var result = await repository.GetChangeLogForDate(serviceRequest, null, token); return Ok(result); } @@ -205,15 +210,15 @@ public abstract class ProcessMapPlanBaseController : ControllerBase /// /// /// - [HttpGet("changeLog")] + [HttpGet("changeLogForDate")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - public async Task>>> GetChangeLog([FromRoute] int idWell, [FromQuery] DateOnly? date, CancellationToken token) + public async Task>>> GetChangeLogForDate([FromRoute] int idWell, [FromQuery] DateOnly? date, CancellationToken token) { await AssertUserHasAccessToWell(idWell, token); var serviceRequest = new ProcessMapPlanBaseRequestWithWell(idWell); - var result = await repository.GetChangeLog(serviceRequest, date, token); + var result = await repository.GetChangeLogForDate(serviceRequest, date, token); return Ok(result); } From 46271f2bc2e79fd2b6f8d0ec9059140cf5c776a4 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 4 Jun 2024 16:55:44 +0500 Subject: [PATCH 17/19] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20+=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20ChangeLogRep?= =?UTF-8?q?osiroryBuilder=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B7=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D0=BE=D0=B2=20=D0=BA=20=D0=B4=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D0=BC=20=D0=B8=20=D0=BA=20=D0=B8=D1=81=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/IChangeLogRepository.cs | 12 +-- .../IChangeLogRepositoryBuilder.cs | 40 ++++++++ .../Requests/ProcessMapPlanBaseRequest.cs | 4 +- AsbCloudInfrastructure/DependencyInjection.cs | 8 +- .../Repository/ChangeLogRepositoryAbstract.cs | 91 ++++++++++++++----- .../Repository/IChangeLogReposiroryBuilder.cs | 5 + .../ProcessMapPlanBaseRepository.cs | 23 ++--- .../Repository/WellCompositeRepository.cs | 5 +- .../WorkOperationDetection.cs | 6 +- .../ProcessMapPlanDrillingExportService.cs | 5 +- .../Export/ProcessMapPlanExportService.cs | 11 +-- .../Export/ProcessMapPlanReamExportService.cs | 5 +- .../Report/ProcessMapReportDrillingService.cs | 5 +- .../Services/WellInfoService.cs | 8 +- AsbCloudInfrastructure/Startup.cs | 10 +- .../Clients/IProcessMapPlanDrillingClient.cs | 4 +- ...ProcessMapReportDataSaubStatServiceTest.cs | 15 ++- .../ProcessMapPlanBaseController.cs | 25 +++-- .../ProcessMapPlanDrillingController.cs | 5 +- .../ProcessMapPlanReamController.cs | 5 +- 20 files changed, 202 insertions(+), 90 deletions(-) create mode 100644 AsbCloudApp/Repositories/IChangeLogRepositoryBuilder.cs create mode 100644 AsbCloudInfrastructure/Repository/IChangeLogReposiroryBuilder.cs diff --git a/AsbCloudApp/Repositories/IChangeLogRepository.cs b/AsbCloudApp/Repositories/IChangeLogRepository.cs index 92c747f7..b63edda2 100644 --- a/AsbCloudApp/Repositories/IChangeLogRepository.cs +++ b/AsbCloudApp/Repositories/IChangeLogRepository.cs @@ -2,6 +2,7 @@ using AsbCloudApp.Requests; using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -10,7 +11,7 @@ namespace AsbCloudApp.Repositories; /// /// Репозиторий для записей с историей /// -public interface IChangeLogRepository +public interface IChangeLogRepository where TDto : IId { /// @@ -92,13 +93,12 @@ public interface IChangeLogRepository /// /// Task> GetCurrent(TRequest request, CancellationToken token); + /// - /// Получение измененных записей за определенный момент времени + /// Получение объекта, реализующего интерфейс IChangeLogRepositoryBuilder + /// для последующих вызовов методов фильтрации по запросам /// - /// фильтр по changeLog - /// фильтр по данным внутри changeLog - /// /// - Task>> GetChangeLogByMoment(ChangeLogRequest changeLogRequest, TRequest dataRequest, CancellationToken token); + IChangeLogRepositoryBuilder GetRequestBuilder(ChangeLogRequest request); } diff --git a/AsbCloudApp/Repositories/IChangeLogRepositoryBuilder.cs b/AsbCloudApp/Repositories/IChangeLogRepositoryBuilder.cs new file mode 100644 index 00000000..9d51774d --- /dev/null +++ b/AsbCloudApp/Repositories/IChangeLogRepositoryBuilder.cs @@ -0,0 +1,40 @@ +using AsbCloudApp.Data; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Repositories; + +/// +/// Интерфейс для работы с объектами, содержащими историю изменений +/// +/// +/// +public interface IChangeLogRepositoryBuilder + where TDto : IId +{ + /// + /// Применение запроса + /// + /// Запрос + /// + /// + IChangeLogRepositoryBuilder ApplyRequest(TRequest request, CancellationToken token); + + /// + /// Материализация записей + /// + /// + /// + /// + Task> GetData(TimeSpan offset, CancellationToken token); + + /// + /// Материализация записей с историей + /// + /// + /// + /// + Task>> GetChangeLogData(TimeSpan offset, CancellationToken token); +} diff --git a/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs b/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs index 62e3934d..2b4cd30d 100644 --- a/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs +++ b/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs @@ -5,7 +5,7 @@ namespace AsbCloudApp.Requests; /// /// Запрос для получения РТК план /// -public class ProcessMapPlanBaseRequest : ChangeLogRequest +public class ProcessMapPlanBaseRequest { /// /// Вернуть данные, которые поменялись с указанной даты @@ -24,7 +24,7 @@ public class ProcessMapPlanBaseRequest : ChangeLogRequest /// Копирующий конструктор /// /// Параметры запроса - public ProcessMapPlanBaseRequest(ProcessMapPlanBaseRequest request) : base(request) + public ProcessMapPlanBaseRequest(ProcessMapPlanBaseRequest request) { UpdateFrom = request.UpdateFrom; } diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 319b0bc2..e692200d 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -196,12 +196,12 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient< - IChangeLogRepository, - ProcessMapPlanBaseRepository>(); + IChangeLogRepository, + ProcessMapPlanBaseRepository>(); services.AddTransient< - IChangeLogRepository, - ProcessMapPlanBaseRepository>(); + IChangeLogRepository, + ProcessMapPlanBaseRepository>(); services.AddTransient(); diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index bd10e36b..767534df 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -3,9 +3,12 @@ using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudDb.Model; +using iText.Signatures; +using iText.StyledXmlParser.Jsoup.Nodes; using Mapster; using Microsoft.EntityFrameworkCore; using Npgsql; +using Org.BouncyCastle.Asn1.Ocsp; using System; using System.Collections.Generic; using System.Linq; @@ -14,10 +17,9 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository; -public abstract class ChangeLogRepositoryAbstract : IChangeLogRepository +public abstract class ChangeLogRepositoryAbstract : IChangeLogRepository where TDto : AsbCloudApp.Data.IId where TEntity : ChangeLogAbstract - where TRequest : ChangeLogRequest { protected readonly IAsbCloudDbContext db; @@ -26,6 +28,57 @@ public abstract class ChangeLogRepositoryAbstract : ICh this.db = db; } + private class ChangeLogRepositoryBuilder : IChangeLogRepositoryBuilder + { + private readonly ChangeLogRepositoryAbstract Repository; + private IQueryable Query; + + public ChangeLogRepositoryBuilder( + ChangeLogRepositoryAbstract repository, + ChangeLogRequest request) + { + this.Repository = repository; + this.Query = repository.db.Set(); + + if (request.Moment.HasValue) + { + var momentUtc = request.Moment.Value.ToUniversalTime(); + + this.Query = this.Query + .Where(e => e.Creation <= momentUtc) + .Where(e => e.Obsolete == null || e.Obsolete >= momentUtc); + } + } + + public IChangeLogRepositoryBuilder ApplyRequest(TRequest request, CancellationToken token) + { + this.Query = Repository.BuildQuery(request, Query); + return this; + } + + public async Task> GetData(TimeSpan offset, CancellationToken token) + { + + var dtos = await this.Query.Select(e => Repository.Convert(e, offset)) + .ToArrayAsync(token); + return dtos; + } + + public async Task>> GetChangeLogData(TimeSpan offset, CancellationToken token) + { + var dtos = await this.Query.Select(e => Repository.ConvertChangeLogDto(e, offset)) + .ToArrayAsync(token); + return dtos; + } + } + + public IChangeLogRepositoryBuilder GetRequestBuilder(ChangeLogRequest request) + { + var builder = new ChangeLogRepositoryBuilder(this, request); + + return builder; + } + public async Task InsertRange(int idUser, IEnumerable dtos, CancellationToken token) { var result = 0; @@ -134,6 +187,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh public async Task Clear(int idUser, TRequest request, CancellationToken token) { var updateTime = DateTimeOffset.UtcNow; + var query = BuildQuery(request); query = query.Where(e => e.Obsolete == null); @@ -239,7 +293,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh return dtos; } - private async Task>> CreateChangeLogDto(IQueryable query, TimeSpan offset, CancellationToken token) + public async Task>> CreateChangeLogDto(IQueryable query, TimeSpan offset, CancellationToken token) { var entities = await query .OrderBy(e => e.Creation) @@ -251,37 +305,25 @@ public abstract class ChangeLogRepositoryAbstract : ICh return dtos; } - public async Task>> GetChangeLogByMoment(ChangeLogRequest changeLogRequest, TRequest dataRequest, CancellationToken token) - { - var query = BuildQuery(dataRequest); - if (changeLogRequest.Moment.HasValue) - { - var momentUtc = changeLogRequest.Moment.Value.ToUniversalTime(); - query = query - .Where(e => e.Creation <= momentUtc) - .Where(e => e.Obsolete == null || e.Obsolete >= momentUtc); - } - - TimeSpan offset = GetTimezoneOffset(dataRequest); - var dtos = await CreateChangeLogDto(query, offset, token); - - return dtos; - } - public async Task> GetCurrent(TRequest request, CancellationToken token) { var changeLogRequest = new ChangeLogRequest() { Moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, TimeSpan.Zero) }; - var entities = await GetChangeLogByMoment(changeLogRequest, request, token); - var result = entities.Select(e => e.Item); - return result; + + var builder = new ChangeLogRepositoryBuilder(this, changeLogRequest); + builder.ApplyRequest(request, token); + + var offset = GetTimezoneOffset(request); + var dtos = await builder.GetData(offset, token); + + return dtos; } protected abstract TimeSpan GetTimezoneOffset(TRequest request); - protected abstract IQueryable BuildQuery(TRequest request); + protected abstract IQueryable BuildQuery(TRequest request, IQueryable? query = null); protected virtual TEntity Convert(TDto dto) { @@ -332,4 +374,5 @@ public abstract class ChangeLogRepositoryAbstract : ICh if (pgException.SqlState == PostgresErrorCodes.ForeignKeyViolation) throw new ArgumentInvalidException("dtos", pgException.Message + "\r\n" + pgException.Detail); } + } diff --git a/AsbCloudInfrastructure/Repository/IChangeLogReposiroryBuilder.cs b/AsbCloudInfrastructure/Repository/IChangeLogReposiroryBuilder.cs new file mode 100644 index 00000000..c0327135 --- /dev/null +++ b/AsbCloudInfrastructure/Repository/IChangeLogReposiroryBuilder.cs @@ -0,0 +1,5 @@ +namespace AsbCloudInfrastructure.Repository; + +internal interface IChangeLogReposiroryBuilder +{ +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs index 7f84a052..5343cd00 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs @@ -9,7 +9,7 @@ using System.Linq; namespace AsbCloudInfrastructure.Repository; -public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAbstract +public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAbstract where TDto : ProcessMapPlanBaseDto where TEntity : ProcessMapPlanBase { @@ -21,15 +21,18 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb this.wellService = wellService; } - protected override IQueryable BuildQuery(ProcessMapPlanBaseRequestWithWell request) + protected override IQueryable BuildQuery(ProcessMapPlanBaseRequestWithWell request, IQueryable? query = null) { - var query = db - .Set() - .Include(e => e.Author) - .Include(e => e.Editor) - .Include(e => e.Well) - .Include(e => e.WellSectionType) - .Where(e => e.IdWell == request.IdWell); + if(query is null) + { + query = db.Set(); + } + + query = query.Include(e => e.Author) + .Include(e => e.Editor) + .Include(e => e.Well) + .Include(e => e.WellSectionType) + .Where(e => e.IdWell == request.IdWell); if (request.UpdateFrom.HasValue) { @@ -37,8 +40,6 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb query = query.Where(e => e.Creation >= from || e.Obsolete >= from); } - - return query; } diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index e5da1ba8..3c4c22e2 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -3,6 +3,7 @@ using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudDb.Model; +using AsbCloudDb.Model.ProcessMaps; using Mapster; using Microsoft.EntityFrameworkCore; using System; @@ -16,11 +17,11 @@ namespace AsbCloudInfrastructure.Repository; public class WellCompositeRepository : IWellCompositeRepository { private readonly IAsbCloudDbContext db; - private readonly IChangeLogRepository processMapPlanDrillingRepository; + private readonly IChangeLogRepository processMapPlanDrillingRepository; public WellCompositeRepository( IAsbCloudDbContext db, - IChangeLogRepository processMapPlanDrillingRepository) + IChangeLogRepository processMapPlanDrillingRepository) { this.db = db; this.processMapPlanDrillingRepository = processMapPlanDrillingRepository; diff --git a/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs b/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs index d001471e..42291195 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs @@ -43,7 +43,11 @@ public class WorkOperationDetection: Work var telemetryId = telemetryIds[i]; var beginDate = lastDetectedDates.TryGetValue(telemetryId, out var date) ? date : (DateTimeOffset?)null; - + if(telemetryId == 939) + { + ; + } + onProgressCallback($"Start detecting telemetry: {telemetryId} from {beginDate}", i / telemetryIds.Length); var detectedOperations = await detectedOperationService.DetectOperationsAsync(telemetryId, beginDate, token); diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs index 5b0935d2..97d17fcf 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs @@ -8,15 +8,16 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Requests.ExportOptions; using AsbCloudApp.Services; +using AsbCloudDb.Model.ProcessMaps; using AsbCloudInfrastructure.Services.ExcelServices.Templates; using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates; namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export; -public class ProcessMapPlanDrillingExportService : ProcessMapPlanExportService +public class ProcessMapPlanDrillingExportService : ProcessMapPlanExportService { public ProcessMapPlanDrillingExportService( - IChangeLogRepository processMapPlanRepository, + IChangeLogRepository processMapPlanRepository, IWellService wellService) : base(processMapPlanRepository, wellService) { diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs index 8f8596ab..5ea43b18 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs @@ -12,14 +12,14 @@ using AsbCloudInfrastructure.Services.ExcelServices; namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export; -public abstract class ProcessMapPlanExportService : ExportExcelService +public abstract class ProcessMapPlanExportService : ExportExcelService where TDto : ProcessMapPlanBaseDto { protected readonly IWellService wellService; - private readonly IChangeLogRepository processMapPlanRepository; + private readonly IChangeLogRepository processMapPlanRepository; - protected ProcessMapPlanExportService(IChangeLogRepository processMapPlanRepository, + protected ProcessMapPlanExportService(IChangeLogRepository processMapPlanRepository, IWellService wellService) { this.processMapPlanRepository = processMapPlanRepository; @@ -28,10 +28,7 @@ public abstract class ProcessMapPlanExportService : ExportExcelService> GetDtosAsync(WellRelatedExportRequest options, CancellationToken token) { - var request = new ProcessMapPlanBaseRequestWithWell(options.IdWell) - { - Moment = DateTimeOffset.UtcNow - }; + var request = new ProcessMapPlanBaseRequestWithWell(options.IdWell); var dtos = await processMapPlanRepository.GetCurrent(request, token); return dtos; diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs index c3dc5d69..12e9ac7c 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs @@ -5,17 +5,18 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Requests.ExportOptions; using AsbCloudApp.Services; +using AsbCloudDb.Model.ProcessMaps; using AsbCloudInfrastructure.Services.ExcelServices.Templates; using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates; namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export; -public class ProcessMapPlanReamExportService : ProcessMapPlanExportService +public class ProcessMapPlanReamExportService : ProcessMapPlanExportService { protected override ITemplateParameters TemplateParameters => new ProcessMapPlanReamTemplate(); public ProcessMapPlanReamExportService( - IChangeLogRepository processMapPlanRepository, + IChangeLogRepository processMapPlanRepository, IWellService wellService) : base(processMapPlanRepository, wellService) { diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs index 5b51ba62..c550ef2b 100644 --- a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs @@ -14,19 +14,20 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data.WellOperation; +using AsbCloudDb.Model.ProcessMaps; namespace AsbCloudInfrastructure.Services.ProcessMaps.Report; public class ProcessMapReportDrillingService : IProcessMapReportDrillingService { private readonly IWellService wellService; - private readonly IChangeLogRepository processMapPlanBaseRepository; + private readonly IChangeLogRepository processMapPlanBaseRepository; private readonly IDataSaubStatRepository dataSaubStatRepository; private readonly IWellOperationRepository wellOperationRepository; private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; public ProcessMapReportDrillingService(IWellService wellService, - IChangeLogRepository processMapPlanBaseRepository, + IChangeLogRepository processMapPlanBaseRepository, IDataSaubStatRepository dataSaubStatRepository, IWellOperationRepository wellOperationRepository, IWellOperationCategoryRepository wellOperationCategoryRepository diff --git a/AsbCloudInfrastructure/Services/WellInfoService.cs b/AsbCloudInfrastructure/Services/WellInfoService.cs index 2f395d01..f1528df6 100644 --- a/AsbCloudInfrastructure/Services/WellInfoService.cs +++ b/AsbCloudInfrastructure/Services/WellInfoService.cs @@ -7,6 +7,7 @@ using AsbCloudApp.IntegrationEvents.Interfaces; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; +using AsbCloudDb.Model.ProcessMaps; using AsbCloudInfrastructure.Background; using Mapster; using Microsoft.Extensions.DependencyInjection; @@ -32,7 +33,7 @@ public class WellInfoService { var wellService = services.GetRequiredService(); var operationsStatService = services.GetRequiredService(); - var processMapPlanWellDrillingRepository = services.GetRequiredService>(); + var processMapPlanWellDrillingRepository = services.GetRequiredService>(); var subsystemService = services.GetRequiredService(); var telemetryDataSaubCache = services.GetRequiredService>(); var messageHub = services.GetRequiredService>(); @@ -43,10 +44,7 @@ public class WellInfoService var wellsIds = activeWells.Select(w => w.Id); - var processMapPlanWellDrillingRequests = wellsIds.Select(id => new ProcessMapPlanBaseRequestWithWell(id) - { - Moment = DateTimeOffset.UtcNow.AddDays(1) - }); + var processMapPlanWellDrillingRequests = wellsIds.Select(id => new ProcessMapPlanBaseRequestWithWell(id)); var processMapPlanWellDrillings = new List(); foreach (var processMapPlanWellDrillingRequest in processMapPlanWellDrillingRequests) { diff --git a/AsbCloudInfrastructure/Startup.cs b/AsbCloudInfrastructure/Startup.cs index 68c0d5b7..25f4ba61 100644 --- a/AsbCloudInfrastructure/Startup.cs +++ b/AsbCloudInfrastructure/Startup.cs @@ -30,11 +30,11 @@ namespace AsbCloudInfrastructure var backgroundWorker = provider.GetRequiredService(); backgroundWorker.Add(TimeSpan.FromDays(1)); - backgroundWorker.Add(TimeSpan.FromMinutes(30)); - backgroundWorker.Add(TimeSpan.FromMinutes(15)); - backgroundWorker.Add(TimeSpan.FromMinutes(15)); - backgroundWorker.Add(TimeSpan.FromMinutes(30)); - backgroundWorker.Add(MakeMemoryMonitoringWork(), TimeSpan.FromMinutes(1)); + backgroundWorker.Add(TimeSpan.FromMinutes(0)); + backgroundWorker.Add(TimeSpan.FromMinutes(0)); + backgroundWorker.Add(TimeSpan.FromMinutes(0)); + backgroundWorker.Add(TimeSpan.FromMinutes(0)); + backgroundWorker.Add(MakeMemoryMonitoringWork(), TimeSpan.FromMinutes(0)); var notificationBackgroundWorker = provider.GetRequiredService(); } diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs index 51655328..59e32900 100644 --- a/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs +++ b/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs @@ -24,13 +24,13 @@ public interface IProcessMapPlanDrillingClient where TDto : ProcessMapPlan [Get(BaseRoute)] Task>> Get(int idWell); - [Get($"{BaseRoute}/history")] + [Get($"{BaseRoute}/changelogByMoment")] Task>>> Get(int idWell, DateTimeOffset? moment); [Get("/api/telemetry/{uid}/ProcessMapPlanDrilling")] Task>>> Get(string uid, DateTimeOffset? updateFrom); - [Get($"{BaseRoute}/changeLog")] + [Get($"{BaseRoute}/changeLogForDate")] Task>> GetChangeLog(int idWell, DateOnly? date); [Get($"{BaseRoute}/dates")] diff --git a/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs b/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs index 33f837bd..8cbcdbf8 100644 --- a/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs @@ -5,10 +5,12 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; +using AsbCloudDb.Model.ProcessMaps; using AsbCloudInfrastructure.Services.ProcessMaps.Report; using NSubstitute; using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; using Xunit; @@ -22,8 +24,8 @@ public class ProcessMapReportDataSaubStatServiceTest private IWellService wellService = Substitute.For(); - private IChangeLogRepository processMapPlanBaseRepository - = Substitute.For>(); + private IChangeLogRepository processMapPlanBaseRepository + = Substitute.For>(); private IWellOperationRepository wellOperationRepository = Substitute.For(); @@ -131,6 +133,12 @@ public class ProcessMapReportDataSaubStatServiceTest Comment = "s", }, }; + + private readonly static IEnumerable> processMapPlanChangeLog = processMapPlan.Select(p => new ChangeLogDto() + { + Item = p, + }); + private readonly static IEnumerable operations = new List() { new() @@ -257,6 +265,9 @@ public class ProcessMapReportDataSaubStatServiceTest processMapPlanBaseRepository.GetCurrent(Arg.Any(), Arg.Any()) .Returns(processMapPlan); + processMapPlanBaseRepository.GetChangeLogForDate(Arg.Any(), null, Arg.Any()) + .Returns(processMapPlanChangeLog); + wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) .Returns(operations); diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index bac90f07..953c6c04 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -8,8 +8,11 @@ using AsbCloudApp.Requests.ParserOptions; using AsbCloudApp.Services; using AsbCloudApp.Services.Export; using AsbCloudApp.Services.Parsers; +using AsbCloudDb.Model.ProcessMapPlan; +using DocumentFormat.OpenXml.Drawing; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; @@ -27,16 +30,17 @@ namespace AsbCloudWebApi.Controllers.ProcessMaps; [ApiController] [Route("api/well/{idWell}/[controller]")] [Authorize] -public abstract class ProcessMapPlanBaseController : ControllerBase +public abstract class ProcessMapPlanBaseController : ControllerBase + where TEntity : ProcessMapPlanBase where TDto : ProcessMapPlanBaseDto { - private readonly IChangeLogRepository repository; + private readonly IChangeLogRepository repository; private readonly IWellService wellService; private readonly IParserService parserService; private readonly ITelemetryService telemetryService; private readonly IExportService processMapPlanExportService; - protected ProcessMapPlanBaseController(IChangeLogRepository repository, + protected ProcessMapPlanBaseController(IChangeLogRepository repository, IWellService wellService, IParserService parserService, IExportService processMapPlanExportService, @@ -144,6 +148,7 @@ public abstract class ProcessMapPlanBaseController : ControllerBase await AssertUserHasAccessToWell(idWell, token); var serviceRequest = new ProcessMapPlanBaseRequestWithWell(idWell); + var result = await repository.GetCurrent(serviceRequest, token); return Ok(result); } @@ -162,18 +167,20 @@ public abstract class ProcessMapPlanBaseController : ControllerBase { await AssertUserHasAccessToWell(idWell, token); - var serviceRequest = new ProcessMapPlanBaseRequestWithWell(idWell) - { - Moment = moment, - }; + var dataRequest = new ProcessMapPlanBaseRequestWithWell(idWell); var changeLogRequest = new ChangeLogRequest() { Moment = moment }; - var result = await repository.GetChangeLogByMoment(changeLogRequest, serviceRequest, token); - return Ok(result); + var builder = repository.GetRequestBuilder(changeLogRequest); + builder.ApplyRequest(dataRequest, token); + + var offset = wellService.GetTimezone(idWell).Offset; + var dtos = await builder.GetChangeLogData(offset, token); + + return Ok(dtos); } /// diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs index e2193a58..14a5d782 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs @@ -2,6 +2,7 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; +using AsbCloudDb.Model.ProcessMaps; using AsbCloudInfrastructure.Services.ProcessMapPlan.Export; using AsbCloudInfrastructure.Services.ProcessMapPlan.Parser; @@ -10,9 +11,9 @@ namespace AsbCloudWebApi.Controllers.ProcessMaps; /// /// РТК план бурения /// -public class ProcessMapPlanDrillingController : ProcessMapPlanBaseController +public class ProcessMapPlanDrillingController : ProcessMapPlanBaseController { - public ProcessMapPlanDrillingController(IChangeLogRepository repository, + public ProcessMapPlanDrillingController(IChangeLogRepository repository, IWellService wellService, ProcessMapPlanDrillingParser parserService, ITelemetryService telemetryService, diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs index 7482686a..349cf42d 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs @@ -2,6 +2,7 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; +using AsbCloudDb.Model.ProcessMaps; using AsbCloudInfrastructure.Services.ProcessMapPlan.Export; using AsbCloudInfrastructure.Services.ProcessMapPlan.Parser; @@ -10,9 +11,9 @@ namespace AsbCloudWebApi.Controllers.ProcessMaps; /// /// РТК план проработка /// -public class ProcessMapPlanReamController : ProcessMapPlanBaseController +public class ProcessMapPlanReamController : ProcessMapPlanBaseController { - public ProcessMapPlanReamController(IChangeLogRepository repository, + public ProcessMapPlanReamController(IChangeLogRepository repository, IWellService wellService, ProcessMapPlanReamParser parserService, ITelemetryService telemetryService, From 9322d2874b3db4b6a45d094ced82727566f6a26c Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 5 Jun 2024 12:08:38 +0500 Subject: [PATCH 18/19] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=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 --- .../Repositories/IChangeLogRepository.cs | 5 +-- AsbCloudDb/Model/ChangeLogAbstract.cs | 6 +++ .../ProcessMapPlan/ProcessMapPlanBase.cs | 6 --- AsbCloudInfrastructure/DependencyInjection.cs | 4 +- .../Repository/ChangeLogRepositoryAbstract.cs | 20 +++++---- .../Repository/IChangeLogReposiroryBuilder.cs | 5 --- .../ProcessMapPlanBaseRepository.cs | 18 +++----- .../Repository/WellCompositeRepository.cs | 7 ++- .../WorkOperationDetection.cs | 4 -- .../ProcessMapPlanDrillingExportService.cs | 5 +-- .../Export/ProcessMapPlanExportService.cs | 44 +++++++++---------- .../Export/ProcessMapPlanReamExportService.cs | 33 +++++++------- .../Report/ProcessMapReportDrillingService.cs | 25 +++++------ .../Services/WellInfoService.cs | 9 ++-- AsbCloudInfrastructure/Startup.cs | 2 +- ...ProcessMapReportDataSaubStatServiceTest.cs | 5 +-- .../ProcessMapPlanBaseController.cs | 6 +-- .../ProcessMapPlanDrillingController.cs | 2 +- .../ProcessMapPlanReamController.cs | 2 +- .../Controllers/WellCompositeController.cs | 2 +- 20 files changed, 93 insertions(+), 117 deletions(-) delete mode 100644 AsbCloudInfrastructure/Repository/IChangeLogReposiroryBuilder.cs diff --git a/AsbCloudApp/Repositories/IChangeLogRepository.cs b/AsbCloudApp/Repositories/IChangeLogRepository.cs index b63edda2..359629c6 100644 --- a/AsbCloudApp/Repositories/IChangeLogRepository.cs +++ b/AsbCloudApp/Repositories/IChangeLogRepository.cs @@ -2,7 +2,6 @@ using AsbCloudApp.Requests; using System; using System.Collections.Generic; -using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -11,7 +10,7 @@ namespace AsbCloudApp.Repositories; /// /// Репозиторий для записей с историей /// -public interface IChangeLogRepository +public interface IChangeLogRepository where TDto : IId { /// @@ -93,7 +92,7 @@ public interface IChangeLogRepository /// /// Task> GetCurrent(TRequest request, CancellationToken token); - + /// /// Получение объекта, реализующего интерфейс IChangeLogRepositoryBuilder diff --git a/AsbCloudDb/Model/ChangeLogAbstract.cs b/AsbCloudDb/Model/ChangeLogAbstract.cs index d9bc74e0..6320c3dc 100644 --- a/AsbCloudDb/Model/ChangeLogAbstract.cs +++ b/AsbCloudDb/Model/ChangeLogAbstract.cs @@ -86,4 +86,10 @@ public abstract class ChangeLogAbstract /// [Column("id_previous"), Comment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная")] public int? IdPrevious { get; set; } + + [ForeignKey(nameof(IdAuthor))] + public virtual User Author { get; set; } = null!; + + [ForeignKey(nameof(IdEditor))] + public virtual User? Editor { get; set; } } diff --git a/AsbCloudDb/Model/ProcessMapPlan/ProcessMapPlanBase.cs b/AsbCloudDb/Model/ProcessMapPlan/ProcessMapPlanBase.cs index 39fba936..912ce7c0 100644 --- a/AsbCloudDb/Model/ProcessMapPlan/ProcessMapPlanBase.cs +++ b/AsbCloudDb/Model/ProcessMapPlan/ProcessMapPlanBase.cs @@ -20,12 +20,6 @@ public abstract class ProcessMapPlanBase : ChangeLogAbstract, IId, IWellRelated [ForeignKey(nameof(IdWell))] public virtual Well Well { get; set; } = null!; - [ForeignKey(nameof(IdAuthor))] - public virtual User Author { get; set; } = null!; - - [ForeignKey(nameof(IdEditor))] - public virtual User? Editor { get; set; } - [ForeignKey(nameof(IdWellSectionType))] public virtual WellSectionType WellSectionType { get; set; } = null!; } \ No newline at end of file diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index e692200d..aa8b63dd 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -196,11 +196,11 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient< - IChangeLogRepository, + IChangeLogRepository, ProcessMapPlanBaseRepository>(); services.AddTransient< - IChangeLogRepository, + IChangeLogRepository, ProcessMapPlanBaseRepository>(); services.AddTransient(); diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index 767534df..962759bb 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -3,12 +3,9 @@ using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudDb.Model; -using iText.Signatures; -using iText.StyledXmlParser.Jsoup.Nodes; using Mapster; using Microsoft.EntityFrameworkCore; using Npgsql; -using Org.BouncyCastle.Asn1.Ocsp; using System; using System.Collections.Generic; using System.Linq; @@ -17,7 +14,7 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository; -public abstract class ChangeLogRepositoryAbstract : IChangeLogRepository +public abstract class ChangeLogRepositoryAbstract : IChangeLogRepository where TDto : AsbCloudApp.Data.IId where TEntity : ChangeLogAbstract { @@ -38,13 +35,15 @@ public abstract class ChangeLogRepositoryAbstract : ICh ChangeLogRequest request) { this.Repository = repository; - this.Query = repository.db.Set(); + this.Query = repository.db.Set() + .Include(e => e.Author) + .Include(e => e.Editor); if (request.Moment.HasValue) { var momentUtc = request.Moment.Value.ToUniversalTime(); - this.Query = this.Query + this.Query = this.Query .Where(e => e.Creation <= momentUtc) .Where(e => e.Obsolete == null || e.Obsolete >= momentUtc); } @@ -58,7 +57,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh public async Task> GetData(TimeSpan offset, CancellationToken token) { - + var dtos = await this.Query.Select(e => Repository.Convert(e, offset)) .ToArrayAsync(token); return dtos; @@ -323,7 +322,12 @@ public abstract class ChangeLogRepositoryAbstract : ICh protected abstract TimeSpan GetTimezoneOffset(TRequest request); - protected abstract IQueryable BuildQuery(TRequest request, IQueryable? query = null); + private IQueryable BuildQuery(TRequest request) => + BuildQuery(request, db.Set() + .Include(e => e.Author) + .Include(e => e.Editor)); + + protected abstract IQueryable BuildQuery(TRequest request, IQueryable query); protected virtual TEntity Convert(TDto dto) { diff --git a/AsbCloudInfrastructure/Repository/IChangeLogReposiroryBuilder.cs b/AsbCloudInfrastructure/Repository/IChangeLogReposiroryBuilder.cs deleted file mode 100644 index c0327135..00000000 --- a/AsbCloudInfrastructure/Repository/IChangeLogReposiroryBuilder.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace AsbCloudInfrastructure.Repository; - -internal interface IChangeLogReposiroryBuilder -{ -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs index 5343cd00..26d58c40 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs @@ -21,18 +21,12 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb this.wellService = wellService; } - protected override IQueryable BuildQuery(ProcessMapPlanBaseRequestWithWell request, IQueryable? query = null) + protected override IQueryable BuildQuery(ProcessMapPlanBaseRequestWithWell request, IQueryable query) { - if(query is null) - { - query = db.Set(); - } - - query = query.Include(e => e.Author) - .Include(e => e.Editor) - .Include(e => e.Well) - .Include(e => e.WellSectionType) - .Where(e => e.IdWell == request.IdWell); + query = query + .Include(e => e.Well) + .Include(e => e.WellSectionType) + .Where(e => e.IdWell == request.IdWell); if (request.UpdateFrom.HasValue) { @@ -60,8 +54,6 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb protected override TEntity Convert(TDto dto) { var entity = base.Convert(dto); - //entity.Author = null; - //entity.Editor = null; return entity; } } diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index 3c4c22e2..15ba5883 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -3,7 +3,6 @@ using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudDb.Model; -using AsbCloudDb.Model.ProcessMaps; using Mapster; using Microsoft.EntityFrameworkCore; using System; @@ -17,11 +16,11 @@ namespace AsbCloudInfrastructure.Repository; public class WellCompositeRepository : IWellCompositeRepository { private readonly IAsbCloudDbContext db; - private readonly IChangeLogRepository processMapPlanDrillingRepository; + private readonly IChangeLogRepository processMapPlanDrillingRepository; public WellCompositeRepository( - IAsbCloudDbContext db, - IChangeLogRepository processMapPlanDrillingRepository) + IAsbCloudDbContext db, + IChangeLogRepository processMapPlanDrillingRepository) { this.db = db; this.processMapPlanDrillingRepository = processMapPlanDrillingRepository; diff --git a/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs b/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs index 42291195..8a96f26c 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs @@ -43,10 +43,6 @@ public class WorkOperationDetection: Work var telemetryId = telemetryIds[i]; var beginDate = lastDetectedDates.TryGetValue(telemetryId, out var date) ? date : (DateTimeOffset?)null; - if(telemetryId == 939) - { - ; - } onProgressCallback($"Start detecting telemetry: {telemetryId} from {beginDate}", i / telemetryIds.Length); var detectedOperations = await detectedOperationService.DetectOperationsAsync(telemetryId, beginDate, token); diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs index 97d17fcf..5b0935d2 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs @@ -8,16 +8,15 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Requests.ExportOptions; using AsbCloudApp.Services; -using AsbCloudDb.Model.ProcessMaps; using AsbCloudInfrastructure.Services.ExcelServices.Templates; using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates; namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export; -public class ProcessMapPlanDrillingExportService : ProcessMapPlanExportService +public class ProcessMapPlanDrillingExportService : ProcessMapPlanExportService { public ProcessMapPlanDrillingExportService( - IChangeLogRepository processMapPlanRepository, + IChangeLogRepository processMapPlanRepository, IWellService wellService) : base(processMapPlanRepository, wellService) { diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs index 5ea43b18..2b4de002 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs @@ -1,36 +1,34 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using AsbCloudApp.Data; using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Requests.ExportOptions; using AsbCloudApp.Services; using AsbCloudInfrastructure.Services.ExcelServices; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export; -public abstract class ProcessMapPlanExportService : ExportExcelService - where TDto : ProcessMapPlanBaseDto +public abstract class ProcessMapPlanExportService : ExportExcelService + where TDto : ProcessMapPlanBaseDto { - protected readonly IWellService wellService; + protected readonly IWellService wellService; - private readonly IChangeLogRepository processMapPlanRepository; + private readonly IChangeLogRepository processMapPlanRepository; - protected ProcessMapPlanExportService(IChangeLogRepository processMapPlanRepository, - IWellService wellService) - { - this.processMapPlanRepository = processMapPlanRepository; - this.wellService = wellService; - } - - protected override async Task> GetDtosAsync(WellRelatedExportRequest options, CancellationToken token) - { - var request = new ProcessMapPlanBaseRequestWithWell(options.IdWell); - - var dtos = await processMapPlanRepository.GetCurrent(request, token); - return dtos; - } + protected ProcessMapPlanExportService(IChangeLogRepository processMapPlanRepository, + IWellService wellService) + { + this.processMapPlanRepository = processMapPlanRepository; + this.wellService = wellService; + } + + protected override async Task> GetDtosAsync(WellRelatedExportRequest options, CancellationToken token) + { + var request = new ProcessMapPlanBaseRequestWithWell(options.IdWell); + + var dtos = await processMapPlanRepository.GetCurrent(request, token); + return dtos; + } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs index 12e9ac7c..c6b8495e 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs @@ -1,31 +1,30 @@ -using System.Threading; -using System.Threading.Tasks; using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Requests.ExportOptions; using AsbCloudApp.Services; -using AsbCloudDb.Model.ProcessMaps; using AsbCloudInfrastructure.Services.ExcelServices.Templates; using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates; +using System.Threading; +using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export; -public class ProcessMapPlanReamExportService : ProcessMapPlanExportService +public class ProcessMapPlanReamExportService : ProcessMapPlanExportService { - protected override ITemplateParameters TemplateParameters => new ProcessMapPlanReamTemplate(); + protected override ITemplateParameters TemplateParameters => new ProcessMapPlanReamTemplate(); - public ProcessMapPlanReamExportService( - IChangeLogRepository processMapPlanRepository, - IWellService wellService) - : base(processMapPlanRepository, wellService) - { - } - - protected override async Task BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token) - { - var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token); + public ProcessMapPlanReamExportService( + IChangeLogRepository processMapPlanRepository, + IWellService wellService) + : base(processMapPlanRepository, wellService) + { + } - return $"{caption}_РТК_План_проработка.xlsx"; - } + protected override async Task BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token) + { + var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token); + + return $"{caption}_РТК_План_проработка.xlsx"; + } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs index c550ef2b..18345122 100644 --- a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs @@ -1,6 +1,7 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Data.ProcessMaps.Report; +using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Exceptions; using AsbCloudApp.Extensions; using AsbCloudApp.Repositories; @@ -13,21 +14,19 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using AsbCloudApp.Data.WellOperation; -using AsbCloudDb.Model.ProcessMaps; namespace AsbCloudInfrastructure.Services.ProcessMaps.Report; public class ProcessMapReportDrillingService : IProcessMapReportDrillingService { private readonly IWellService wellService; - private readonly IChangeLogRepository processMapPlanBaseRepository; + private readonly IChangeLogRepository processMapPlanBaseRepository; private readonly IDataSaubStatRepository dataSaubStatRepository; private readonly IWellOperationRepository wellOperationRepository; private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; public ProcessMapReportDrillingService(IWellService wellService, - IChangeLogRepository processMapPlanBaseRepository, + IChangeLogRepository processMapPlanBaseRepository, IDataSaubStatRepository dataSaubStatRepository, IWellOperationRepository wellOperationRepository, IWellOperationCategoryRepository wellOperationCategoryRepository @@ -86,10 +85,10 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService var wellSectionTypes = wellOperationRepository.GetSectionTypes(); var result = CalcByIntervals( - request, - changeLogProcessMaps, + request, + changeLogProcessMaps, dataSaubStats, - orderedWellOperations, + orderedWellOperations, wellOperationCategories, wellSectionTypes); @@ -116,17 +115,17 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService int GetSection(DataSaubStatDto data) { - if(lastFoundIndex < orderedWellOperations.Length - 1) + if (lastFoundIndex < orderedWellOperations.Length - 1) { lastFoundIndex = Array.FindIndex(orderedWellOperations, lastFoundIndex, o => o.DateStart > data.DateStart) - 1; lastFoundIndex = lastFoundIndex < 0 ? orderedWellOperations.Length - 1 : lastFoundIndex; } - + var operation = orderedWellOperations[lastFoundIndex]; return operation.IdWellSectionType; - } + } - ProcessMapPlanDrillingDto? GetProcessMapPlan(int idWellSectionType, DataSaubStatDto data) + ProcessMapPlanDrillingDto? GetProcessMapPlan(int idWellSectionType, DataSaubStatDto data) => changeLogProcessMaps .Where(p => p.Item.IdWellSectionType == idWellSectionType) .Where(p => p.Item.DepthStart <= data.DepthStart) @@ -170,7 +169,7 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService var elem = CalcStat(processMapPlan, span, wellOperationCategoryName, wellSectionType); if (elem is not null) - list.Add(elem); + list.Add(elem); } } return list; @@ -335,7 +334,7 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService SetpointUsagePressure: sumDiffDepthByPressure * 100 / diffDepthTotal, SetpointUsageAxialLoad: sumDiffDepthByAxialLoad * 100 / diffDepthTotal, SetpointUsageRotorTorque: sumDiffDepthByRotorTorque * 100 / diffDepthTotal, - SetpointUsageRopPlan: sumDiffDepthByRopPlan * 100/ diffDepthTotal, + SetpointUsageRopPlan: sumDiffDepthByRopPlan * 100 / diffDepthTotal, DrilledTime: drilledTime ); } diff --git a/AsbCloudInfrastructure/Services/WellInfoService.cs b/AsbCloudInfrastructure/Services/WellInfoService.cs index f1528df6..07bb6e39 100644 --- a/AsbCloudInfrastructure/Services/WellInfoService.cs +++ b/AsbCloudInfrastructure/Services/WellInfoService.cs @@ -7,7 +7,6 @@ using AsbCloudApp.IntegrationEvents.Interfaces; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; -using AsbCloudDb.Model.ProcessMaps; using AsbCloudInfrastructure.Background; using Mapster; using Microsoft.Extensions.DependencyInjection; @@ -33,7 +32,7 @@ public class WellInfoService { var wellService = services.GetRequiredService(); var operationsStatService = services.GetRequiredService(); - var processMapPlanWellDrillingRepository = services.GetRequiredService>(); + var processMapPlanWellDrillingRepository = services.GetRequiredService>(); var subsystemService = services.GetRequiredService(); var telemetryDataSaubCache = services.GetRequiredService>(); var messageHub = services.GetRequiredService>(); @@ -98,14 +97,14 @@ public class WellInfoService int? idSection = wellLastFactSection?.Id; ProcessMapPlanDrillingDto? processMapPlanWellDrilling = null; - if(idSection.HasValue && currentDepth.HasValue) + if (idSection.HasValue && currentDepth.HasValue) { processMapPlanWellDrilling = wellProcessMaps .Where(p => p.IdWellSectionType == idSection) .Where(p => p.DepthStart <= currentDepth.Value && p.DepthEnd >= currentDepth.Value) .FirstOrDefault(); - } - else if(currentDepth.HasValue) + } + else if (currentDepth.HasValue) { processMapPlanWellDrilling = wellProcessMaps.FirstOrDefault(p => p.DepthStart <= currentDepth.Value && p.DepthEnd >= currentDepth.Value); } diff --git a/AsbCloudInfrastructure/Startup.cs b/AsbCloudInfrastructure/Startup.cs index 25f4ba61..ab555c1c 100644 --- a/AsbCloudInfrastructure/Startup.cs +++ b/AsbCloudInfrastructure/Startup.cs @@ -30,7 +30,7 @@ namespace AsbCloudInfrastructure var backgroundWorker = provider.GetRequiredService(); backgroundWorker.Add(TimeSpan.FromDays(1)); - backgroundWorker.Add(TimeSpan.FromMinutes(0)); + backgroundWorker.Add(TimeSpan.FromMinutes(30)); backgroundWorker.Add(TimeSpan.FromMinutes(0)); backgroundWorker.Add(TimeSpan.FromMinutes(0)); backgroundWorker.Add(TimeSpan.FromMinutes(0)); diff --git a/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs b/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs index 8cbcdbf8..2e0f24c8 100644 --- a/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs @@ -5,7 +5,6 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; -using AsbCloudDb.Model.ProcessMaps; using AsbCloudInfrastructure.Services.ProcessMaps.Report; using NSubstitute; using System; @@ -24,8 +23,8 @@ public class ProcessMapReportDataSaubStatServiceTest private IWellService wellService = Substitute.For(); - private IChangeLogRepository processMapPlanBaseRepository - = Substitute.For>(); + private IChangeLogRepository processMapPlanBaseRepository + = Substitute.For>(); private IWellOperationRepository wellOperationRepository = Substitute.For(); diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index 953c6c04..1362266d 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -9,10 +9,8 @@ using AsbCloudApp.Services; using AsbCloudApp.Services.Export; using AsbCloudApp.Services.Parsers; using AsbCloudDb.Model.ProcessMapPlan; -using DocumentFormat.OpenXml.Drawing; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; @@ -34,13 +32,13 @@ public abstract class ProcessMapPlanBaseController : ControllerBa where TEntity : ProcessMapPlanBase where TDto : ProcessMapPlanBaseDto { - private readonly IChangeLogRepository repository; + private readonly IChangeLogRepository repository; private readonly IWellService wellService; private readonly IParserService parserService; private readonly ITelemetryService telemetryService; private readonly IExportService processMapPlanExportService; - protected ProcessMapPlanBaseController(IChangeLogRepository repository, + protected ProcessMapPlanBaseController(IChangeLogRepository repository, IWellService wellService, IParserService parserService, IExportService processMapPlanExportService, diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs index 14a5d782..60d68436 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanDrillingController.cs @@ -13,7 +13,7 @@ namespace AsbCloudWebApi.Controllers.ProcessMaps; /// public class ProcessMapPlanDrillingController : ProcessMapPlanBaseController { - public ProcessMapPlanDrillingController(IChangeLogRepository repository, + public ProcessMapPlanDrillingController(IChangeLogRepository repository, IWellService wellService, ProcessMapPlanDrillingParser parserService, ITelemetryService telemetryService, diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs index 349cf42d..2e9aeedf 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanReamController.cs @@ -13,7 +13,7 @@ namespace AsbCloudWebApi.Controllers.ProcessMaps; /// public class ProcessMapPlanReamController : ProcessMapPlanBaseController { - public ProcessMapPlanReamController(IChangeLogRepository repository, + public ProcessMapPlanReamController(IChangeLogRepository repository, IWellService wellService, ProcessMapPlanReamParser parserService, ITelemetryService telemetryService, diff --git a/AsbCloudWebApi/Controllers/WellCompositeController.cs b/AsbCloudWebApi/Controllers/WellCompositeController.cs index d4a74ebf..903966dd 100644 --- a/AsbCloudWebApi/Controllers/WellCompositeController.cs +++ b/AsbCloudWebApi/Controllers/WellCompositeController.cs @@ -79,7 +79,7 @@ namespace AsbCloudWebApi.Controllers if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - var result = wellCompositeRepository.GetCompositeProcessMap(idWell, token); + var result = await wellCompositeRepository.GetCompositeProcessMap(idWell, token).ConfigureAwait(false); return Ok(result); } From 96e9cd3f16858a1ceecf627bf4e6072adb752ce2 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 5 Jun 2024 15:52:40 +0500 Subject: [PATCH 19/19] Add IChangeLogQueryBuilderWithKnownTimezone --- .../Repositories/IChangeLogQueryBuilder.cs | 62 ++++++++++++++++++ .../Repositories/IChangeLogRepository.cs | 3 +- .../IChangeLogRepositoryBuilder.cs | 40 ------------ .../Repository/ChangeLogRepositoryAbstract.cs | 64 +++++++++++++++---- .../ProcessMapPlanBaseController.cs | 8 +-- 5 files changed, 117 insertions(+), 60 deletions(-) create mode 100644 AsbCloudApp/Repositories/IChangeLogQueryBuilder.cs delete mode 100644 AsbCloudApp/Repositories/IChangeLogRepositoryBuilder.cs diff --git a/AsbCloudApp/Repositories/IChangeLogQueryBuilder.cs b/AsbCloudApp/Repositories/IChangeLogQueryBuilder.cs new file mode 100644 index 00000000..b7952c1a --- /dev/null +++ b/AsbCloudApp/Repositories/IChangeLogQueryBuilder.cs @@ -0,0 +1,62 @@ +using AsbCloudApp.Data; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Repositories; + +/// +/// Интерфейс для работы с объектами, содержащими историю изменений +/// +/// +/// +public interface IChangeLogQueryBuilder + where TDto : IId +{ + /// + /// Применение запроса + /// + /// Запрос + /// + IChangeLogQueryBuilderWithKnownTimezone ApplyRequest(TRequest request); + + /// + /// Материализация записей + /// + /// + /// + /// + Task> GetData(TimeSpan offset, CancellationToken token); + + /// + /// Материализация записей с историей + /// + /// + /// + /// + Task>> GetChangeLogData(TimeSpan offset, CancellationToken token); +} + +/// +/// Интерфейс для работы с объектами, содержащими историю изменений. С известной временной зоной +/// +/// +/// +public interface IChangeLogQueryBuilderWithKnownTimezone: IChangeLogQueryBuilder + where TDto : IId +{ + /// + /// Материализация записей. Временная зона определяется по запросу из последнего ApplyRequest + /// + /// + /// + Task> GetData(CancellationToken token); + + /// + /// Материализация записей с историей. Временная зона определяется по запросу из последнего ApplyRequest + /// + /// + /// + Task>> GetChangeLogData(CancellationToken token); +} \ No newline at end of file diff --git a/AsbCloudApp/Repositories/IChangeLogRepository.cs b/AsbCloudApp/Repositories/IChangeLogRepository.cs index 359629c6..bd8cbe85 100644 --- a/AsbCloudApp/Repositories/IChangeLogRepository.cs +++ b/AsbCloudApp/Repositories/IChangeLogRepository.cs @@ -93,11 +93,10 @@ public interface IChangeLogRepository /// Task> GetCurrent(TRequest request, CancellationToken token); - /// /// Получение объекта, реализующего интерфейс IChangeLogRepositoryBuilder /// для последующих вызовов методов фильтрации по запросам /// /// - IChangeLogRepositoryBuilder GetRequestBuilder(ChangeLogRequest request); + IChangeLogQueryBuilder GetQueryBuilder(ChangeLogRequest request); } diff --git a/AsbCloudApp/Repositories/IChangeLogRepositoryBuilder.cs b/AsbCloudApp/Repositories/IChangeLogRepositoryBuilder.cs deleted file mode 100644 index 9d51774d..00000000 --- a/AsbCloudApp/Repositories/IChangeLogRepositoryBuilder.cs +++ /dev/null @@ -1,40 +0,0 @@ -using AsbCloudApp.Data; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudApp.Repositories; - -/// -/// Интерфейс для работы с объектами, содержащими историю изменений -/// -/// -/// -public interface IChangeLogRepositoryBuilder - where TDto : IId -{ - /// - /// Применение запроса - /// - /// Запрос - /// - /// - IChangeLogRepositoryBuilder ApplyRequest(TRequest request, CancellationToken token); - - /// - /// Материализация записей - /// - /// - /// - /// - Task> GetData(TimeSpan offset, CancellationToken token); - - /// - /// Материализация записей с историей - /// - /// - /// - /// - Task>> GetChangeLogData(TimeSpan offset, CancellationToken token); -} diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index 962759bb..054453e6 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -25,12 +25,12 @@ public abstract class ChangeLogRepositoryAbstract : ICh this.db = db; } - private class ChangeLogRepositoryBuilder : IChangeLogRepositoryBuilder + private class ChangeLogQueryBuilder: IChangeLogQueryBuilder { - private readonly ChangeLogRepositoryAbstract Repository; - private IQueryable Query; + protected readonly ChangeLogRepositoryAbstract Repository; + protected IQueryable Query; - public ChangeLogRepositoryBuilder( + public ChangeLogQueryBuilder( ChangeLogRepositoryAbstract repository, ChangeLogRequest request) { @@ -49,15 +49,20 @@ public abstract class ChangeLogRepositoryAbstract : ICh } } - public IChangeLogRepositoryBuilder ApplyRequest(TRequest request, CancellationToken token) + public ChangeLogQueryBuilder(ChangeLogQueryBuilder builder) + { + Repository = builder.Repository; + Query = builder.Query; + } + + public virtual IChangeLogQueryBuilderWithKnownTimezone ApplyRequest(TRequest request) { this.Query = Repository.BuildQuery(request, Query); - return this; + return new ChangeLogQueryBuilderWithKnownTimezone(this, request); } public async Task> GetData(TimeSpan offset, CancellationToken token) { - var dtos = await this.Query.Select(e => Repository.Convert(e, offset)) .ToArrayAsync(token); return dtos; @@ -71,10 +76,43 @@ public abstract class ChangeLogRepositoryAbstract : ICh } } - public IChangeLogRepositoryBuilder GetRequestBuilder(ChangeLogRequest request) + private class ChangeLogQueryBuilderWithKnownTimezone: ChangeLogQueryBuilder, IChangeLogQueryBuilderWithKnownTimezone { - var builder = new ChangeLogRepositoryBuilder(this, request); + TRequest request; + public ChangeLogQueryBuilderWithKnownTimezone( + ChangeLogQueryBuilder parentBuilder, + TRequest request) + :base(parentBuilder) + { + this.request = request; + } + + public override IChangeLogQueryBuilderWithKnownTimezone ApplyRequest(TRequest request) + { + Query = Repository.BuildQuery(request, Query); + this.request = request; + return this; + } + + public async Task> GetData(CancellationToken token) + { + TimeSpan timezoneOffset = Repository.GetTimezoneOffset(request); + var dtos = await this.GetData(timezoneOffset, token); + return dtos; + } + + public async Task>> GetChangeLogData(CancellationToken token) + { + TimeSpan timezoneOffset = Repository.GetTimezoneOffset(request); + var dtos = await this.GetChangeLogData(timezoneOffset, token); + return dtos; + } + } + + public IChangeLogQueryBuilder GetQueryBuilder(ChangeLogRequest request) + { + var builder = new ChangeLogQueryBuilder(this, request); return builder; } @@ -311,11 +349,9 @@ public abstract class ChangeLogRepositoryAbstract : ICh Moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, TimeSpan.Zero) }; - var builder = new ChangeLogRepositoryBuilder(this, changeLogRequest); - builder.ApplyRequest(request, token); - - var offset = GetTimezoneOffset(request); - var dtos = await builder.GetData(offset, token); + var builder = GetQueryBuilder(changeLogRequest) + .ApplyRequest(request); + var dtos = await builder.GetData(token); return dtos; } diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index 1362266d..66b75bc0 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -172,11 +172,11 @@ public abstract class ProcessMapPlanBaseController : ControllerBa Moment = moment }; - var builder = repository.GetRequestBuilder(changeLogRequest); - builder.ApplyRequest(dataRequest, token); + var builder = repository + .GetQueryBuilder(changeLogRequest) + .ApplyRequest(dataRequest); - var offset = wellService.GetTimezone(idWell).Offset; - var dtos = await builder.GetChangeLogData(offset, token); + var dtos = await builder.GetChangeLogData(token); return Ok(dtos); }