From ccbc4997544007f920e93828bee2022ce9341362 Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Thu, 26 Jan 2023 10:59:24 +0500 Subject: [PATCH 01/17] =?UTF-8?q?#8103063=20=D0=9F=D0=BE=D0=B4=D1=82=D1=8F?= =?UTF-8?q?=D0=B3=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B5=D0=B6?= =?UTF-8?q?=D0=B8=D0=BC=D0=BE=D0=B2=20=D0=BF=D1=80=D0=B8=20=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BD=D0=BE?= =?UTF-8?q?=D0=B8=CC=86=20=D1=81=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Services/IProcessMapService.cs | 11 ++++- .../Services/ProcessMap/ProcessMapService.cs | 47 ++++++++++++++++++- .../Controllers/WellCompositeController.cs | 16 ++++++- 3 files changed, 71 insertions(+), 3 deletions(-) diff --git a/AsbCloudApp/Services/IProcessMapService.cs b/AsbCloudApp/Services/IProcessMapService.cs index 3d2eeff4..4a8be8e2 100644 --- a/AsbCloudApp/Services/IProcessMapService.cs +++ b/AsbCloudApp/Services/IProcessMapService.cs @@ -1,4 +1,5 @@ -using AsbCloudApp.Data.ProcessMap; +using AsbCloudApp.Data; +using AsbCloudApp.Data.ProcessMap; using System.Collections.Generic; using System.IO; using System.Threading; @@ -19,6 +20,14 @@ namespace AsbCloudApp.Services /// /// Task> GetProcessMapAsync(int idWell, CancellationToken token); + + /// + /// Получение РТК по композитной скважине + /// + /// + /// + /// + Task> GetCompositeData(int idWell, CancellationToken token); } #nullable disable } diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs index 2b932368..5269199d 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs @@ -26,6 +26,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap private readonly ITelemetryDataSaubService telemetryDataSaubService; private readonly ILimitingParameterRepository limitingParameterRepository; private readonly ISubsystemOperationTimeService subsystemOperationTimeService; + private readonly IWellCompositeRepository wellCompositeRepository; public ProcessMapService( IWellService wellService, @@ -33,7 +34,8 @@ namespace AsbCloudInfrastructure.Services.ProcessMap IProcessMapRepository processMapRepository, ITelemetryDataSaubService telemetryDataSaubService, ILimitingParameterRepository limitingParameterRepository, - ISubsystemOperationTimeService subsystemOperationTimeService) + ISubsystemOperationTimeService subsystemOperationTimeService, + IWellCompositeRepository wellCompositeRepository) { this.wellService = wellService; this.wellOperationRepository = wellOperationService; @@ -41,6 +43,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap this.telemetryDataSaubService = telemetryDataSaubService; this.limitingParameterRepository = limitingParameterRepository; this.subsystemOperationTimeService = subsystemOperationTimeService; + this.wellCompositeRepository = wellCompositeRepository; } public async Task> GetProcessMapAsync(int idWell, CancellationToken token) @@ -68,6 +71,48 @@ namespace AsbCloudInfrastructure.Services.ProcessMap return result; } + public async Task> GetCompositeData(int idWell, CancellationToken token) + { + var result = new List(); + + var dtos = await wellCompositeRepository.GetAsync(idWell, token); + foreach (var dto in dtos) + { + var processMaps = (await processMapRepository.GetByIdWellAsync(dto.IdWellSrc, token))!. + Where(x => x.IdWellSectionType == dto.IdWellSectionType). + Select(x => new ProcessMapDto { + IdWell = dto.IdWell, + IdWellSectionType = dto.IdWellSectionType, + RopPlan = x.RopPlan, + DepthStart = x.DepthStart, + DepthEnd = x.DepthEnd, + AxialLoad = new PlanFactDto + { + Plan = x.AxialLoad.Fact ?? 0 + }, + Flow = new PlanFactDto + { + Plan = x.Flow.Fact ?? 0 + }, + Pressure = new PlanFactDto + { + Plan = x.Pressure.Fact ?? 0 + }, + TopDriveSpeed = new PlanFactDto + { + Plan = x.TopDriveSpeed.Fact ?? 0 + }, + TopDriveTorque = new PlanFactDto + { + Plan = x.TopDriveTorque.Fact ?? 0 + }, + LastUpdate = DateTime.UtcNow + }); + result.AddRange(processMaps); + } + return result; + } + private Task?> GetOperationTimeAsync(int idWell, CancellationToken token) { var request = new SubsystemOperationTimeRequest diff --git a/AsbCloudWebApi/Controllers/WellCompositeController.cs b/AsbCloudWebApi/Controllers/WellCompositeController.cs index c6f5c9cf..dbdd12a7 100644 --- a/AsbCloudWebApi/Controllers/WellCompositeController.cs +++ b/AsbCloudWebApi/Controllers/WellCompositeController.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.ProcessMap; using AsbCloudApp.Repositories; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; @@ -20,11 +21,15 @@ namespace AsbCloudWebApi.Controllers { private readonly IWellCompositeRepository wellCompositeRepository; private readonly IWellService wellService; + private readonly IProcessMapService processMapService; - public WellCompositeController(IWellCompositeRepository wellCompositeRepository, IWellService wellService) + public WellCompositeController(IWellCompositeRepository wellCompositeRepository, + IWellService wellService, + IProcessMapService processMapService) { this.wellCompositeRepository = wellCompositeRepository; this.wellService = wellService; + this.processMapService = processMapService; } /// @@ -63,6 +68,15 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } + [HttpGet("getCompositeData")] + [Permission] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetCompositeData(int idWell, CancellationToken token = default) + { + var result = await processMapService.GetCompositeData(idWell, token).ConfigureAwait(false); + return Ok(result); + } + private async Task CanUserAccessToWellAsync(int idWell, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); From ecdade0913577e610f48287a7a5fdbc4e772d5f7 Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Thu, 26 Jan 2023 15:37:46 +0500 Subject: [PATCH 02/17] #8103063 fix --- .../Repositories/IWellCompositeRepository.cs | 9 +++ AsbCloudApp/Requests/WellCompositeRequest.cs | 20 +++++++ AsbCloudApp/Services/IProcessMapRepository.cs | 11 ++++ AsbCloudApp/Services/IProcessMapService.cs | 8 --- .../Repository/ProcessMapRepository.cs | 15 +++++ .../Repository/WellCompositeRepository.cs | 59 ++++++++++++++++++- .../Services/ProcessMap/ProcessMapService.cs | 43 +------------- .../Controllers/WellCompositeController.cs | 20 ++++--- 8 files changed, 127 insertions(+), 58 deletions(-) create mode 100644 AsbCloudApp/Requests/WellCompositeRequest.cs diff --git a/AsbCloudApp/Repositories/IWellCompositeRepository.cs b/AsbCloudApp/Repositories/IWellCompositeRepository.cs index c14fd11c..8b24d32f 100644 --- a/AsbCloudApp/Repositories/IWellCompositeRepository.cs +++ b/AsbCloudApp/Repositories/IWellCompositeRepository.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.ProcessMap; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -27,6 +28,14 @@ namespace AsbCloudApp.Repositories /// /// Task SaveAsync(int idWell, IEnumerable wellComposites, CancellationToken token); + + /// + /// Получение РТК по композитной скважине + /// + /// + /// + /// + Task> GetCompositeProcessMap(int idWell, CancellationToken token); } #nullable disable } diff --git a/AsbCloudApp/Requests/WellCompositeRequest.cs b/AsbCloudApp/Requests/WellCompositeRequest.cs new file mode 100644 index 00000000..893a88fd --- /dev/null +++ b/AsbCloudApp/Requests/WellCompositeRequest.cs @@ -0,0 +1,20 @@ +namespace AsbCloudApp.Requests +{ +#nullable enable + /// + /// Параметры для запроса получения РТК + /// + public class WellCompositeRequest + { + /// + /// Идентификатор скважины + /// + public int IdWell { get; set; } + + /// + /// Тип секции + /// + public int? IdWellSectionType { get; set; } + } +#nullable disable +} diff --git a/AsbCloudApp/Services/IProcessMapRepository.cs b/AsbCloudApp/Services/IProcessMapRepository.cs index 8c9ab6f0..680045c6 100644 --- a/AsbCloudApp/Services/IProcessMapRepository.cs +++ b/AsbCloudApp/Services/IProcessMapRepository.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data.ProcessMap; +using AsbCloudApp.Requests; using System; using System.Collections.Generic; using System.Threading; @@ -6,6 +7,7 @@ using System.Threading.Tasks; namespace AsbCloudApp.Services { +#nullable enable /// /// /// @@ -20,5 +22,14 @@ namespace AsbCloudApp.Services /// Task> GetAllAsync(int idWell, DateTime? updateFrom, CancellationToken token = default); + + /// + /// + /// + /// + /// + /// + Task?> GetByRequesProcessMaplAsync(WellCompositeRequest request, CancellationToken token); } +#nullable disable } \ No newline at end of file diff --git a/AsbCloudApp/Services/IProcessMapService.cs b/AsbCloudApp/Services/IProcessMapService.cs index 4a8be8e2..f45f8c36 100644 --- a/AsbCloudApp/Services/IProcessMapService.cs +++ b/AsbCloudApp/Services/IProcessMapService.cs @@ -20,14 +20,6 @@ namespace AsbCloudApp.Services /// /// Task> GetProcessMapAsync(int idWell, CancellationToken token); - - /// - /// Получение РТК по композитной скважине - /// - /// - /// - /// - Task> GetCompositeData(int idWell, CancellationToken token); } #nullable disable } diff --git a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs index f24ce61d..257791bc 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs @@ -1,5 +1,6 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.ProcessMap; +using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; using Mapster; @@ -40,6 +41,20 @@ namespace AsbCloudInfrastructure.Repository return dtos; } + public async Task?> GetByRequesProcessMaplAsync(WellCompositeRequest request, CancellationToken token) + { + var query = GetQuery().Where(e => e.IdWell == request.IdWell); + if (request.IdWellSectionType is not null) + { + query.Where(e => e.IdWellSectionType == request.IdWellSectionType); + } + + var entities = await query + .ToListAsync(token); + var dtos = entities.Select(Convert).ToList(); + return dtos; + } + public override async Task InsertAsync(ProcessMapDto dto, CancellationToken token) { diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index de56ee60..a56fa91f 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -1,8 +1,12 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.ProcessMap; using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; using AsbCloudDb.Model; using Mapster; using Microsoft.EntityFrameworkCore; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -14,10 +18,12 @@ namespace AsbCloudInfrastructure.Repository public class WellCompositeRepository : IWellCompositeRepository { private readonly IAsbCloudDbContext db; + private readonly IProcessMapRepository processMapRepository; - public WellCompositeRepository(IAsbCloudDbContext db) + public WellCompositeRepository(IAsbCloudDbContext db, IProcessMapRepository processMapRepository) { this.db = db; + this.processMapRepository = processMapRepository; } /// @@ -44,6 +50,57 @@ namespace AsbCloudInfrastructure.Repository return db.SaveChangesAsync(token); } + /// + public async Task> GetCompositeProcessMap(int idWell, CancellationToken token) + { + var result = new List(); + + var dtos = await GetAsync(idWell, token); + foreach (var dto in dtos) + { + var processMaps = (await processMapRepository.GetByRequesProcessMaplAsync(new WellCompositeRequest + { + IdWell = dto.IdWellSrc, + IdWellSectionType = dto.IdWellSectionType + } + , token))? + .Where(x => x.IdWellSectionType == dto.IdWellSectionType) + .Select(x => new ProcessMapDto + { + IdWell = dto.IdWell, + IdWellSectionType = dto.IdWellSectionType, + RopPlan = x.RopPlan, + DepthStart = x.DepthStart, + DepthEnd = x.DepthEnd, + AxialLoad = new PlanFactDto + { + Plan = x.AxialLoad.Fact ?? 0 + }, + Flow = new PlanFactDto + { + Plan = x.Flow.Fact ?? x.Flow.Plan + }, + Pressure = new PlanFactDto + { + Plan = x.Pressure.Fact ?? x.Pressure.Plan + }, + TopDriveSpeed = new PlanFactDto + { + Plan = x.TopDriveSpeed.Fact ?? x.TopDriveSpeed.Plan + }, + TopDriveTorque = new PlanFactDto + { + Plan = x.TopDriveTorque.Fact ?? x.TopDriveTorque.Plan + }, + LastUpdate = DateTime.UtcNow + }); + + if (processMaps is not null) + result.AddRange(processMaps); + } + return result; + } + private static WellComposite Convert(int idWell, WellCompositeDto dto) { var entity = dto.Adapt(); diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs index 5269199d..998f61fb 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs @@ -46,6 +46,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap this.wellCompositeRepository = wellCompositeRepository; } + /// public async Task> GetProcessMapAsync(int idWell, CancellationToken token) { var well = wellService.GetOrDefault(idWell) @@ -71,48 +72,6 @@ namespace AsbCloudInfrastructure.Services.ProcessMap return result; } - public async Task> GetCompositeData(int idWell, CancellationToken token) - { - var result = new List(); - - var dtos = await wellCompositeRepository.GetAsync(idWell, token); - foreach (var dto in dtos) - { - var processMaps = (await processMapRepository.GetByIdWellAsync(dto.IdWellSrc, token))!. - Where(x => x.IdWellSectionType == dto.IdWellSectionType). - Select(x => new ProcessMapDto { - IdWell = dto.IdWell, - IdWellSectionType = dto.IdWellSectionType, - RopPlan = x.RopPlan, - DepthStart = x.DepthStart, - DepthEnd = x.DepthEnd, - AxialLoad = new PlanFactDto - { - Plan = x.AxialLoad.Fact ?? 0 - }, - Flow = new PlanFactDto - { - Plan = x.Flow.Fact ?? 0 - }, - Pressure = new PlanFactDto - { - Plan = x.Pressure.Fact ?? 0 - }, - TopDriveSpeed = new PlanFactDto - { - Plan = x.TopDriveSpeed.Fact ?? 0 - }, - TopDriveTorque = new PlanFactDto - { - Plan = x.TopDriveTorque.Fact ?? 0 - }, - LastUpdate = DateTime.UtcNow - }); - result.AddRange(processMaps); - } - return result; - } - private Task?> GetOperationTimeAsync(int idWell, CancellationToken token) { var request = new SubsystemOperationTimeRequest diff --git a/AsbCloudWebApi/Controllers/WellCompositeController.cs b/AsbCloudWebApi/Controllers/WellCompositeController.cs index dbdd12a7..66a0d65b 100644 --- a/AsbCloudWebApi/Controllers/WellCompositeController.cs +++ b/AsbCloudWebApi/Controllers/WellCompositeController.cs @@ -21,15 +21,12 @@ namespace AsbCloudWebApi.Controllers { private readonly IWellCompositeRepository wellCompositeRepository; private readonly IWellService wellService; - private readonly IProcessMapService processMapService; public WellCompositeController(IWellCompositeRepository wellCompositeRepository, - IWellService wellService, - IProcessMapService processMapService) + IWellService wellService) { this.wellCompositeRepository = wellCompositeRepository; this.wellService = wellService; - this.processMapService = processMapService; } /// @@ -68,12 +65,21 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } - [HttpGet("getCompositeData")] + /// + /// Получение РТК по композитной скважине + /// + /// + /// + /// + [HttpGet("getCompositeProcessMap")] [Permission] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetCompositeData(int idWell, CancellationToken token = default) + public async Task GetCompositeProcessMap(int idWell, CancellationToken token = default) { - var result = await processMapService.GetCompositeData(idWell, token).ConfigureAwait(false); + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) + return Forbid(); + + var result = await wellCompositeRepository.GetCompositeProcessMap(idWell, token).ConfigureAwait(false); return Ok(result); } From 941050821392ac65c57da2287560f7b6db0b25dc Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Mon, 30 Jan 2023 10:52:12 +0500 Subject: [PATCH 03/17] #8103063 fix --- .../Repositories/IWellCompositeRepository.cs | 2 +- AsbCloudApp/Requests/WellCompositeRequest.cs | 8 +- AsbCloudApp/Services/IProcessMapService.cs | 4 +- .../Repository/ProcessMapRepository.cs | 6 +- .../Repository/WellCompositeRepository.cs | 84 +++++++++---------- .../Services/ProcessMap/ProcessMapService.cs | 5 +- 6 files changed, 51 insertions(+), 58 deletions(-) diff --git a/AsbCloudApp/Repositories/IWellCompositeRepository.cs b/AsbCloudApp/Repositories/IWellCompositeRepository.cs index 8b24d32f..8369a803 100644 --- a/AsbCloudApp/Repositories/IWellCompositeRepository.cs +++ b/AsbCloudApp/Repositories/IWellCompositeRepository.cs @@ -35,7 +35,7 @@ namespace AsbCloudApp.Repositories /// /// /// - Task> GetCompositeProcessMap(int idWell, CancellationToken token); + Task?> GetCompositeProcessMap(int idWell, CancellationToken token); } #nullable disable } diff --git a/AsbCloudApp/Requests/WellCompositeRequest.cs b/AsbCloudApp/Requests/WellCompositeRequest.cs index 893a88fd..f9f2246a 100644 --- a/AsbCloudApp/Requests/WellCompositeRequest.cs +++ b/AsbCloudApp/Requests/WellCompositeRequest.cs @@ -1,4 +1,6 @@ -namespace AsbCloudApp.Requests +using System.Collections.Generic; + +namespace AsbCloudApp.Requests { #nullable enable /// @@ -9,12 +11,12 @@ /// /// Идентификатор скважины /// - public int IdWell { get; set; } + public IEnumerable IdWells { get; set; } = null!; /// /// Тип секции /// - public int? IdWellSectionType { get; set; } + public IEnumerable? IdWellSectionTypes { get; set; } = null!; } #nullable disable } diff --git a/AsbCloudApp/Services/IProcessMapService.cs b/AsbCloudApp/Services/IProcessMapService.cs index f45f8c36..11bb2846 100644 --- a/AsbCloudApp/Services/IProcessMapService.cs +++ b/AsbCloudApp/Services/IProcessMapService.cs @@ -1,7 +1,5 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Data.ProcessMap; +using AsbCloudApp.Data.ProcessMap; using System.Collections.Generic; -using System.IO; using System.Threading; using System.Threading.Tasks; diff --git a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs index 257791bc..e631bcbb 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs @@ -43,10 +43,10 @@ namespace AsbCloudInfrastructure.Repository public async Task?> GetByRequesProcessMaplAsync(WellCompositeRequest request, CancellationToken token) { - var query = GetQuery().Where(e => e.IdWell == request.IdWell); - if (request.IdWellSectionType is not null) + var query = GetQuery().Where(e => request.IdWells.Contains(e.IdWell)); + if (request.IdWellSectionTypes is not null) { - query.Where(e => e.IdWellSectionType == request.IdWellSectionType); + query.Where(e => request.IdWellSectionTypes.Contains(e.IdWellSectionType)); } var entities = await query diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index a56fa91f..557132b5 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -51,53 +51,49 @@ namespace AsbCloudInfrastructure.Repository } /// - public async Task> GetCompositeProcessMap(int idWell, CancellationToken token) + public async Task?> GetCompositeProcessMap(int idWell, CancellationToken token) { - var result = new List(); - var dtos = await GetAsync(idWell, token); - foreach (var dto in dtos) - { - var processMaps = (await processMapRepository.GetByRequesProcessMaplAsync(new WellCompositeRequest - { - IdWell = dto.IdWellSrc, - IdWellSectionType = dto.IdWellSectionType - } - , token))? - .Where(x => x.IdWellSectionType == dto.IdWellSectionType) - .Select(x => new ProcessMapDto - { - IdWell = dto.IdWell, - IdWellSectionType = dto.IdWellSectionType, - RopPlan = x.RopPlan, - DepthStart = x.DepthStart, - DepthEnd = x.DepthEnd, - AxialLoad = new PlanFactDto - { - Plan = x.AxialLoad.Fact ?? 0 - }, - Flow = new PlanFactDto - { - Plan = x.Flow.Fact ?? x.Flow.Plan - }, - Pressure = new PlanFactDto - { - Plan = x.Pressure.Fact ?? x.Pressure.Plan - }, - TopDriveSpeed = new PlanFactDto - { - Plan = x.TopDriveSpeed.Fact ?? x.TopDriveSpeed.Plan - }, - TopDriveTorque = new PlanFactDto - { - Plan = x.TopDriveTorque.Fact ?? x.TopDriveTorque.Plan - }, - LastUpdate = DateTime.UtcNow - }); + var idWells = dtos.Select(c => c.IdWellSrc); + var idWellSectionTypes = dtos.Select(c => c.IdWellSectionType); - if (processMaps is not null) - result.AddRange(processMaps); - } + var processMap = (await processMapRepository.GetByRequesProcessMaplAsync(new WellCompositeRequest + { + IdWells = idWells, + IdWellSectionTypes = idWellSectionTypes + }, + token)); + + var result = processMap?.Select(x => new ProcessMapDto + { + IdWell = x.IdWell, + IdWellSectionType = x.IdWellSectionType, + RopPlan = x.RopPlan, + DepthStart = x.DepthStart, + DepthEnd = x.DepthEnd, + AxialLoad = new PlanFactDto + { + Plan = x.AxialLoad.Fact ?? x.AxialLoad.Plan, + }, + Flow = new PlanFactDto + { + Plan = x.Flow.Fact ?? x.Flow.Plan + }, + Pressure = new PlanFactDto + { + Plan = x.Pressure.Fact ?? x.Pressure.Plan + }, + TopDriveSpeed = new PlanFactDto + { + Plan = x.TopDriveSpeed.Fact ?? x.TopDriveSpeed.Plan + }, + TopDriveTorque = new PlanFactDto + { + Plan = x.TopDriveTorque.Fact ?? x.TopDriveTorque.Plan + }, + LastUpdate = DateTime.UtcNow + }); + return result; } diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs index 998f61fb..0ede2e82 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs @@ -26,7 +26,6 @@ namespace AsbCloudInfrastructure.Services.ProcessMap private readonly ITelemetryDataSaubService telemetryDataSaubService; private readonly ILimitingParameterRepository limitingParameterRepository; private readonly ISubsystemOperationTimeService subsystemOperationTimeService; - private readonly IWellCompositeRepository wellCompositeRepository; public ProcessMapService( IWellService wellService, @@ -34,8 +33,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap IProcessMapRepository processMapRepository, ITelemetryDataSaubService telemetryDataSaubService, ILimitingParameterRepository limitingParameterRepository, - ISubsystemOperationTimeService subsystemOperationTimeService, - IWellCompositeRepository wellCompositeRepository) + ISubsystemOperationTimeService subsystemOperationTimeService) { this.wellService = wellService; this.wellOperationRepository = wellOperationService; @@ -43,7 +41,6 @@ namespace AsbCloudInfrastructure.Services.ProcessMap this.telemetryDataSaubService = telemetryDataSaubService; this.limitingParameterRepository = limitingParameterRepository; this.subsystemOperationTimeService = subsystemOperationTimeService; - this.wellCompositeRepository = wellCompositeRepository; } /// From e2948782fa695215c3aebfe033d3f4ef576412ff Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Thu, 2 Feb 2023 10:32:53 +0500 Subject: [PATCH 04/17] #8103063 BuildQuery --- ...mpositeRequest.cs => ProcessMapRequest.cs} | 14 ++++-- AsbCloudApp/Services/IProcessMapRepository.cs | 2 +- .../Repository/ProcessMapRepository.cs | 44 ++++++++++++------- .../Repository/WellCompositeRepository.cs | 14 +++--- 4 files changed, 46 insertions(+), 28 deletions(-) rename AsbCloudApp/Requests/{WellCompositeRequest.cs => ProcessMapRequest.cs} (54%) diff --git a/AsbCloudApp/Requests/WellCompositeRequest.cs b/AsbCloudApp/Requests/ProcessMapRequest.cs similarity index 54% rename from AsbCloudApp/Requests/WellCompositeRequest.cs rename to AsbCloudApp/Requests/ProcessMapRequest.cs index f9f2246a..45b56cf5 100644 --- a/AsbCloudApp/Requests/WellCompositeRequest.cs +++ b/AsbCloudApp/Requests/ProcessMapRequest.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace AsbCloudApp.Requests { @@ -6,17 +7,22 @@ namespace AsbCloudApp.Requests /// /// Параметры для запроса получения РТК /// - public class WellCompositeRequest + public class ProcessMapRequest { /// /// Идентификатор скважины /// - public IEnumerable IdWells { get; set; } = null!; + public int IdWell { get; set; } /// /// Тип секции /// - public IEnumerable? IdWellSectionTypes { get; set; } = null!; + public int? IdWellSectionTypes { get; set; } + + /// + /// Дата обновления + /// + public DateTime? UpdateFrom { get; set; } } #nullable disable } diff --git a/AsbCloudApp/Services/IProcessMapRepository.cs b/AsbCloudApp/Services/IProcessMapRepository.cs index 680045c6..757171fc 100644 --- a/AsbCloudApp/Services/IProcessMapRepository.cs +++ b/AsbCloudApp/Services/IProcessMapRepository.cs @@ -29,7 +29,7 @@ namespace AsbCloudApp.Services /// /// /// - Task?> GetByRequesProcessMaplAsync(WellCompositeRequest request, CancellationToken token); + Task?> GetByRequesProcessMaplAsync(List request, CancellationToken token); } #nullable disable } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs index e631bcbb..c07cc275 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs @@ -31,7 +31,15 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetAllAsync(int idWell, DateTime? updateFrom, CancellationToken token) { - var entities = await BuildQuery(idWell, updateFrom) + var request = new List + { + new ProcessMapRequest { + IdWell = idWell, + UpdateFrom = updateFrom + } + }; + + var entities = await BuildQuery(request) .OrderBy(e => e.DepthStart) .ThenBy(e => e.Id) .ToListAsync(token) @@ -41,16 +49,11 @@ namespace AsbCloudInfrastructure.Repository return dtos; } - public async Task?> GetByRequesProcessMaplAsync(WellCompositeRequest request, CancellationToken token) + public async Task?> GetByRequesProcessMaplAsync(List request, CancellationToken token) { - var query = GetQuery().Where(e => request.IdWells.Contains(e.IdWell)); - if (request.IdWellSectionTypes is not null) - { - query.Where(e => request.IdWellSectionTypes.Contains(e.IdWellSectionType)); - } - - var entities = await query - .ToListAsync(token); + var entities = await BuildQuery(request) + .ToListAsync(token) + .ConfigureAwait(false); var dtos = entities.Select(Convert).ToList(); return dtos; } @@ -71,16 +74,23 @@ namespace AsbCloudInfrastructure.Repository return result; } - - private IQueryable BuildQuery(int idWell, DateTime? updateFrom) + private IQueryable BuildQuery(IEnumerable request) { - var query = GetQuery().Where(e => e.IdWell == idWell); + var query = GetQuery(); - if (updateFrom is not null) + foreach (var item in request) { - var timezone = wellService.GetTimezone(idWell); - var updateFromUtc = updateFrom?.ToUtcDateTimeOffset(timezone.Hours); - query.Where(e => e.LastUpdate >= updateFromUtc); + query.Where(w => w.IdWell == item.IdWell); + + if (item.IdWellSectionTypes is not null) + query.Where(w => w.IdWellSectionType == item.IdWellSectionTypes); + + if (item.UpdateFrom is not null) + { + var timezone = wellService.GetTimezone(item.IdWell); + var updateFromUtc = item.UpdateFrom?.ToUtcDateTimeOffset(timezone.Hours); + query.Where(e => e.LastUpdate >= updateFromUtc); + } } return query; diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index 557132b5..d2946247 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -57,12 +57,14 @@ namespace AsbCloudInfrastructure.Repository var idWells = dtos.Select(c => c.IdWellSrc); var idWellSectionTypes = dtos.Select(c => c.IdWellSectionType); - var processMap = (await processMapRepository.GetByRequesProcessMaplAsync(new WellCompositeRequest - { - IdWells = idWells, - IdWellSectionTypes = idWellSectionTypes - }, - token)); + var request = new List + { + new ProcessMapRequest { + IdWell = idWell + } + }; + + var processMap = (await processMapRepository.GetByRequesProcessMaplAsync(request, token)); var result = processMap?.Select(x => new ProcessMapDto { From 1f80e38c10b5059eeb6a790fb70102c8b208fff8 Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Thu, 2 Feb 2023 11:04:53 +0500 Subject: [PATCH 05/17] #8103063 BuildQuery --- AsbCloudApp/Services/IProcessMapRepository.cs | 2 +- .../Repository/ProcessMapRepository.cs | 2 +- .../Repository/WellCompositeRepository.cs | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/AsbCloudApp/Services/IProcessMapRepository.cs b/AsbCloudApp/Services/IProcessMapRepository.cs index 757171fc..0469b2df 100644 --- a/AsbCloudApp/Services/IProcessMapRepository.cs +++ b/AsbCloudApp/Services/IProcessMapRepository.cs @@ -29,7 +29,7 @@ namespace AsbCloudApp.Services /// /// /// - Task?> GetByRequesProcessMaplAsync(List request, CancellationToken token); + Task?> GetByRequesProcessMaplAsync(IEnumerable request, CancellationToken token); } #nullable disable } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs index c07cc275..fda7fbb0 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs @@ -49,7 +49,7 @@ namespace AsbCloudInfrastructure.Repository return dtos; } - public async Task?> GetByRequesProcessMaplAsync(List request, CancellationToken token) + public async Task?> GetByRequesProcessMaplAsync(IEnumerable request, CancellationToken token) { var entities = await BuildQuery(request) .ToListAsync(token) diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index d2946247..cbbf0e77 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -54,14 +54,14 @@ namespace AsbCloudInfrastructure.Repository public async Task?> GetCompositeProcessMap(int idWell, CancellationToken token) { var dtos = await GetAsync(idWell, token); - var idWells = dtos.Select(c => c.IdWellSrc); - var idWellSectionTypes = dtos.Select(c => c.IdWellSectionType); - - var request = new List + var request = new List(dtos.Count()); + foreach(var dto in dtos) { - new ProcessMapRequest { - IdWell = idWell - } + request.Add(new ProcessMapRequest + { + IdWell = dto.IdWellSrc, + IdWellSectionTypes = dto.IdWellSectionType + }); }; var processMap = (await processMapRepository.GetByRequesProcessMaplAsync(request, token)); From a4ff666b97fa383ba9e0ad52f0e8148bd03dd0ce Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 2 Feb 2023 11:08:25 +0500 Subject: [PATCH 06/17] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=B2=20MessageController?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/MessageRequest.cs | 63 ++++++++++++++++ AsbCloudApp/Services/IMessageService.cs | 15 +--- .../Services/SAUB/MessageService.cs | 74 ++++++++++++++----- .../Controllers/SAUB/MessageController.cs | 42 +++++++---- 4 files changed, 149 insertions(+), 45 deletions(-) create mode 100644 AsbCloudApp/Requests/MessageRequest.cs diff --git a/AsbCloudApp/Requests/MessageRequest.cs b/AsbCloudApp/Requests/MessageRequest.cs new file mode 100644 index 00000000..83906bfc --- /dev/null +++ b/AsbCloudApp/Requests/MessageRequest.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudApp.Requests +{ +#nullable enable + /// + /// параметры для запроса списка сообщений + /// + public class MessageRequestBase: RequestBase + { + /// + /// + /// + public IEnumerable? Categoryids { get; set; } + + + /// + /// + /// + public DateTime? Begin { get; set; } + + /// + /// + /// + public DateTime? End { get; set; } + + /// + /// + /// + public string? SearchString { get; set; } + + } + + /// + /// параметры для запроса списка сообщений (с id скважины) + /// + public class MessageRequest: MessageRequestBase { + + /// + /// id скважины + /// + public int IdWell { get; set; } + + /// + /// параметры для запроса списка сообщений (с id скважины) + /// + /// + /// + public MessageRequest(MessageRequestBase request, int idWell) + { + this.IdWell = idWell; + + this.Skip = request.Skip; + this.Take = request.Take; + this.SortFields = request.SortFields; + } + + } +} diff --git a/AsbCloudApp/Services/IMessageService.cs b/AsbCloudApp/Services/IMessageService.cs index 0b2261a4..b3abd842 100644 --- a/AsbCloudApp/Services/IMessageService.cs +++ b/AsbCloudApp/Services/IMessageService.cs @@ -1,5 +1,6 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Requests; using System; using System.Collections.Generic; using System.Threading; @@ -15,20 +16,10 @@ namespace AsbCloudApp.Services /// /// Получить сообщения по параметрам /// - /// - /// - /// - /// - /// - /// - /// + /// /// /// - Task> GetMessagesAsync(int idWell, - IEnumerable categoryids = default, DateTime begin = default, - DateTime end = default, string searchString = default, - int skip = 0, int take = 32, - CancellationToken token = default); + Task> GetMessagesAsync(MessageRequest request, CancellationToken token); /// /// Метод для сохранения сообщения от панели diff --git a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs index 1911029a..583eafaf 100644 --- a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs @@ -1,6 +1,8 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Requests; using AsbCloudApp.Services; +using AsbCloudDb; using AsbCloudDb.Model; using AsbCloudInfrastructure.EfCache; using Mapster; @@ -24,16 +26,17 @@ namespace AsbCloudInfrastructure.Services.SAUB this.telemetryService = telemetryService; } - public async Task> GetMessagesAsync( - int idWell, - IEnumerable categoryids = default, - DateTime begin = default, - DateTime end = default, - string searchString = default, - int skip = 0, - int take = 32, - CancellationToken token = default) + public async Task> GetMessagesAsync(MessageRequest request, CancellationToken token) { + var idWell = request.IdWell; + var categoryids = request.Categoryids; + var searchString = request.SearchString; + var begin = request.Begin; + var end = request.End; + var skip = request.Skip ?? 0; + var take = request.Take ?? 32; + var sortFields = request.SortFields; + var idTelemetry = telemetryService.GetOrDefaultIdTelemetryByIdWell(idWell); if (idTelemetry is null) return null; @@ -69,13 +72,13 @@ namespace AsbCloudInfrastructure.Services.SAUB if (begin != default) { - var beginUtc = begin.ToUtcDateTimeOffset(timezone.Hours); + var beginUtc = begin.Value.ToUtcDateTimeOffset(timezone.Hours); query = query.Where(m => m.DateTime >= beginUtc); } if (end != default) { - var endUtc = end.ToUtcDateTimeOffset(timezone.Hours); + var endUtc = end.Value.ToUtcDateTimeOffset(timezone.Hours); query = query.Where(m => m.DateTime <= endUtc); } @@ -86,10 +89,27 @@ namespace AsbCloudInfrastructure.Services.SAUB Count = query.Count() }; - if (skip > 0) - query = query.Skip(skip); + var hasAllSortedFieldsInDBOType = false; - var messagesList = await query.Take(take).AsNoTracking() + if (sortFields?.Any() == true) + { + hasAllSortedFieldsInDBOType = hasAllFieldsInType(sortFields); + if (hasAllSortedFieldsInDBOType) + { + query = query + .SortBy(request.SortFields) + .Skip(skip) + .Take(take); + } + } + else + { + query = query + .Skip(skip) + .Take(take); + } + + var messagesList = await query.AsNoTracking() .ToListAsync(token).ConfigureAwait(false); if (messagesList.Count == 0) @@ -98,6 +118,9 @@ namespace AsbCloudInfrastructure.Services.SAUB var allUsers = await db.TelemetryUsers.FromCacheAsync(token); var users = allUsers.Where(u => u.IdTelemetry == idTelemetry); + var eventsDict = events.GroupBy(x => x.IdEvent).ToDictionary(x => x.Key, x => x.FirstOrDefault()); + var usersDict = users.GroupBy(x => x.IdUser).ToDictionary(x => x.Key, x => x.FirstOrDefault()); + foreach (var message in messagesList) { var messageDto = new MessageDto @@ -110,17 +133,15 @@ namespace AsbCloudInfrastructure.Services.SAUB if (message.IdTelemetryUser is not null) { - if (users.Any()) + if (usersDict.TryGetValue((int)message.IdTelemetryUser, out TelemetryUser user)) { - var user = users.FirstOrDefault(u => u.IdUser == message.IdTelemetryUser); messageDto.User = user.MakeDisplayName(); } else messageDto.User = message.IdTelemetryUser.ToString(); } - var e = events.FirstOrDefault(e => e.IdEvent == message.IdEvent); - if (e != null) + if (eventsDict.TryGetValue(message.IdEvent, out TelemetryEvent e)) { messageDto.CategoryId = e.IdCategory; messageDto.Message = e.MakeMessageText(message); @@ -129,6 +150,14 @@ namespace AsbCloudInfrastructure.Services.SAUB result.Items.Add(messageDto); } + if (sortFields?.Any() == true && !hasAllSortedFieldsInDBOType) + { + result.Items = result.Items.AsQueryable() + .SortBy(request.SortFields) + .Skip(skip) + .Take(take) + .ToList(); + } return result; } @@ -152,5 +181,14 @@ namespace AsbCloudInfrastructure.Services.SAUB return db.SaveChangesAsync(token); } + + private bool hasAllFieldsInType(IEnumerable sortFields) + { + var type = typeof(T); + var properyNames = type.GetProperties().Select(x => x.Name.ToLower()); + sortFields = sortFields.Select(x => x.ToLower().Split(' ')[0]); + var result = sortFields.All(field => properyNames.Contains(field)); + return result; + } } } diff --git a/AsbCloudWebApi/Controllers/SAUB/MessageController.cs b/AsbCloudWebApi/Controllers/SAUB/MessageController.cs index 00f6fd6e..89c40692 100644 --- a/AsbCloudWebApi/Controllers/SAUB/MessageController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/MessageController.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using AsbCloudApp.Requests; using AsbCloudApp.Services; using Microsoft.AspNetCore.Mvc; using System; @@ -28,29 +29,30 @@ namespace AsbCloudWebApi.Controllers.SAUB /// Выдает список сообщений по скважине /// /// id скважины - /// список категорий - /// дата начала - /// окончание - /// для пагинации кол-во записей пропустить - /// для пагинации кол-во записей - /// Строка поиска + /// Параметры запроса /// Токен для отмены задачи /// список сообщений по скважине [HttpGet] [Permission] [ProducesResponseType(typeof(PaginationContainer), (int)System.Net.HttpStatusCode.OK)] - public async Task GetMessagesAsync(int idWell, int skip = 0, int take = 32, - [FromQuery] IEnumerable categoryids = default, - DateTime begin = default, DateTime end = default, - string searchString = default, - CancellationToken token = default) + public async Task GetMessagesAsync( + [FromRoute] int idWell, + [FromQuery] MessageRequestBase request, + CancellationToken token = default) { - if (take > 1024) + + if (!await UserHasAccesToWellAsync(idWell, token)) + return Forbid(); + + if (request.Take > 1024) return BadRequest("limit mast be less then 1024"); - var result = await messageService.GetMessagesAsync(idWell, - categoryids, begin, end, searchString, - skip, take, token).ConfigureAwait(false); + var requestToService = new MessageRequest(request, idWell); + + var result = await messageService.GetMessagesAsync( + requestToService, + token) + .ConfigureAwait(false); if (result is null || result.Count == 0) return NoContent(); @@ -85,5 +87,15 @@ namespace AsbCloudWebApi.Controllers.SAUB return Ok(wellMessagesDatesRange); } + + protected async Task UserHasAccesToWellAsync(int idWell, CancellationToken token) + { + var idCompany = User.GetCompanyId(); + if (idCompany is not null && + await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token) + .ConfigureAwait(false)) + return true; + return false; + } } } From 5644c06facf553c1b6276610499d6cd0e160d09b Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Thu, 2 Feb 2023 12:04:50 +0500 Subject: [PATCH 07/17] =?UTF-8?q?#8103063=20=D0=97=D0=B0=D0=BC=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IProcessMapRepository.cs | 7 ++++--- .../Repository/ProcessMapRepository.cs | 7 ++++--- .../Repository/WellCompositeRepository.cs | 17 ++++++----------- .../Controllers/ProcessMapController.cs | 1 + 4 files changed, 15 insertions(+), 17 deletions(-) rename AsbCloudApp/{Services => Repositories}/IProcessMapRepository.cs (79%) diff --git a/AsbCloudApp/Services/IProcessMapRepository.cs b/AsbCloudApp/Repositories/IProcessMapRepository.cs similarity index 79% rename from AsbCloudApp/Services/IProcessMapRepository.cs rename to AsbCloudApp/Repositories/IProcessMapRepository.cs index 0469b2df..01dac891 100644 --- a/AsbCloudApp/Services/IProcessMapRepository.cs +++ b/AsbCloudApp/Repositories/IProcessMapRepository.cs @@ -1,11 +1,12 @@ using AsbCloudApp.Data.ProcessMap; using AsbCloudApp.Requests; +using AsbCloudApp.Services; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -namespace AsbCloudApp.Services +namespace AsbCloudApp.Repositories { #nullable enable /// @@ -26,10 +27,10 @@ namespace AsbCloudApp.Services /// /// /// - /// + /// /// /// - Task?> GetByRequesProcessMaplAsync(IEnumerable request, CancellationToken token); + Task?> GetProcessMaplAsync(IEnumerable requests, CancellationToken token); } #nullable disable } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs index fda7fbb0..b138f068 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs @@ -1,5 +1,6 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.ProcessMap; +using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; @@ -31,7 +32,7 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetAllAsync(int idWell, DateTime? updateFrom, CancellationToken token) { - var request = new List + var request = new[] { new ProcessMapRequest { IdWell = idWell, @@ -49,9 +50,9 @@ namespace AsbCloudInfrastructure.Repository return dtos; } - public async Task?> GetByRequesProcessMaplAsync(IEnumerable request, CancellationToken token) + public async Task?> GetProcessMaplAsync(IEnumerable requests, CancellationToken token) { - var entities = await BuildQuery(request) + var entities = await BuildQuery(requests) .ToListAsync(token) .ConfigureAwait(false); var dtos = entities.Select(Convert).ToList(); diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index cbbf0e77..1951dd68 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -2,7 +2,6 @@ using AsbCloudApp.Data.ProcessMap; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; -using AsbCloudApp.Services; using AsbCloudDb.Model; using Mapster; using Microsoft.EntityFrameworkCore; @@ -54,17 +53,13 @@ namespace AsbCloudInfrastructure.Repository public async Task?> GetCompositeProcessMap(int idWell, CancellationToken token) { var dtos = await GetAsync(idWell, token); - var request = new List(dtos.Count()); - foreach(var dto in dtos) - { - request.Add(new ProcessMapRequest - { - IdWell = dto.IdWellSrc, - IdWellSectionTypes = dto.IdWellSectionType - }); - }; - var processMap = (await processMapRepository.GetByRequesProcessMaplAsync(request, token)); + var request = dtos.Select(x => new ProcessMapRequest { + IdWell = x.IdWellSrc, + IdWellSectionTypes = x.IdWellSectionType + }); + + var processMap = (await processMapRepository.GetProcessMaplAsync(request, token)); var result = processMap?.Select(x => new ProcessMapDto { diff --git a/AsbCloudWebApi/Controllers/ProcessMapController.cs b/AsbCloudWebApi/Controllers/ProcessMapController.cs index f5c955aa..3a1430b9 100644 --- a/AsbCloudWebApi/Controllers/ProcessMapController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMapController.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data.ProcessMap; +using AsbCloudApp.Repositories; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; From 5956f8238fac404364f1770ea300ca782944e040 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 2 Feb 2023 14:30:27 +0500 Subject: [PATCH 08/17] #8103063 nit prettify --- .../Repositories/IProcessMapRepository.cs | 2 +- .../Repositories/IWellCompositeRepository.cs | 2 +- AsbCloudApp/Requests/ProcessMapRequest.cs | 2 +- .../Repository/ProcessMapRepository.cs | 35 +++++++++++-------- .../Repository/WellCompositeRepository.cs | 10 +++--- 5 files changed, 29 insertions(+), 22 deletions(-) diff --git a/AsbCloudApp/Repositories/IProcessMapRepository.cs b/AsbCloudApp/Repositories/IProcessMapRepository.cs index 01dac891..0bc9ac7b 100644 --- a/AsbCloudApp/Repositories/IProcessMapRepository.cs +++ b/AsbCloudApp/Repositories/IProcessMapRepository.cs @@ -30,7 +30,7 @@ namespace AsbCloudApp.Repositories /// /// /// - Task?> GetProcessMaplAsync(IEnumerable requests, CancellationToken token); + Task> GetProcessMapAsync(IEnumerable requests, CancellationToken token); } #nullable disable } \ No newline at end of file diff --git a/AsbCloudApp/Repositories/IWellCompositeRepository.cs b/AsbCloudApp/Repositories/IWellCompositeRepository.cs index 8369a803..8b24d32f 100644 --- a/AsbCloudApp/Repositories/IWellCompositeRepository.cs +++ b/AsbCloudApp/Repositories/IWellCompositeRepository.cs @@ -35,7 +35,7 @@ namespace AsbCloudApp.Repositories /// /// /// - Task?> GetCompositeProcessMap(int idWell, CancellationToken token); + Task> GetCompositeProcessMap(int idWell, CancellationToken token); } #nullable disable } diff --git a/AsbCloudApp/Requests/ProcessMapRequest.cs b/AsbCloudApp/Requests/ProcessMapRequest.cs index 45b56cf5..55adb7fd 100644 --- a/AsbCloudApp/Requests/ProcessMapRequest.cs +++ b/AsbCloudApp/Requests/ProcessMapRequest.cs @@ -17,7 +17,7 @@ namespace AsbCloudApp.Requests /// /// Тип секции /// - public int? IdWellSectionTypes { get; set; } + public int? IdWellSectionType { get; set; } /// /// Дата обновления diff --git a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs index b138f068..95330293 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs @@ -4,8 +4,10 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; +using DocumentFormat.OpenXml.Spreadsheet; using Mapster; using Microsoft.EntityFrameworkCore; +using Org.BouncyCastle.Asn1.Ocsp; using System; using System.Collections.Generic; using System.Linq; @@ -32,7 +34,7 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetAllAsync(int idWell, DateTime? updateFrom, CancellationToken token) { - var request = new[] + var requests = new[] { new ProcessMapRequest { IdWell = idWell, @@ -40,7 +42,7 @@ namespace AsbCloudInfrastructure.Repository } }; - var entities = await BuildQuery(request) + var entities = await BuildQuery(requests) .OrderBy(e => e.DepthStart) .ThenBy(e => e.Id) .ToListAsync(token) @@ -50,7 +52,7 @@ namespace AsbCloudInfrastructure.Repository return dtos; } - public async Task?> GetProcessMaplAsync(IEnumerable requests, CancellationToken token) + public async Task> GetProcessMapAsync(IEnumerable requests, CancellationToken token) { var entities = await BuildQuery(requests) .ToListAsync(token) @@ -75,25 +77,30 @@ namespace AsbCloudInfrastructure.Repository return result; } - private IQueryable BuildQuery(IEnumerable request) + private IQueryable BuildQuery(IEnumerable requests) { var query = GetQuery(); - - foreach (var item in request) + Func? p = null; + foreach (var request in requests) { - query.Where(w => w.IdWell == item.IdWell); + var p2 = (ProcessMap map) => map.IdWell == request.IdWell; - if (item.IdWellSectionTypes is not null) - query.Where(w => w.IdWellSectionType == item.IdWellSectionTypes); + if (request.IdWellSectionType is not null) + p2 = (ProcessMap map) => p2(map) && map.IdWellSectionType == request.IdWellSectionType; - if (item.UpdateFrom is not null) + if (request.UpdateFrom is not null) { - var timezone = wellService.GetTimezone(item.IdWell); - var updateFromUtc = item.UpdateFrom?.ToUtcDateTimeOffset(timezone.Hours); - query.Where(e => e.LastUpdate >= updateFromUtc); + var timezone = wellService.GetTimezone(request.IdWell); + var updateFromUtc = request.UpdateFrom?.ToUtcDateTimeOffset(timezone.Hours); + p2 = (ProcessMap map) => p2(map) && map.LastUpdate >= updateFromUtc; } + + p = p is null + ? p2 + : (ProcessMap map) => p(map) || p2(map); } - + if(p is not null) + query.Where(p); return query; } protected override ProcessMapDto Convert(ProcessMap entity) diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index 1951dd68..d9b7b8ab 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -50,18 +50,18 @@ namespace AsbCloudInfrastructure.Repository } /// - public async Task?> GetCompositeProcessMap(int idWell, CancellationToken token) + public async Task> GetCompositeProcessMap(int idWell, CancellationToken token) { var dtos = await GetAsync(idWell, token); - var request = dtos.Select(x => new ProcessMapRequest { + var requests = dtos.Select(x => new ProcessMapRequest { IdWell = x.IdWellSrc, - IdWellSectionTypes = x.IdWellSectionType + IdWellSectionType = x.IdWellSectionType }); - var processMap = (await processMapRepository.GetProcessMaplAsync(request, token)); + var processMap = await processMapRepository.GetProcessMapAsync(requests, token); - var result = processMap?.Select(x => new ProcessMapDto + var result = processMap.Select(x => new ProcessMapDto { IdWell = x.IdWell, IdWellSectionType = x.IdWellSectionType, From e81abc86e66855b8f33231f2d7296ce1dd06bfaf Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 2 Feb 2023 15:58:07 +0500 Subject: [PATCH 09/17] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/SAUB/MessageService.cs | 31 +++---------------- 1 file changed, 4 insertions(+), 27 deletions(-) diff --git a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs index 583eafaf..ce7606ff 100644 --- a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs @@ -89,28 +89,13 @@ namespace AsbCloudInfrastructure.Services.SAUB Count = query.Count() }; - var hasAllSortedFieldsInDBOType = false; - if (sortFields?.Any() == true) { - hasAllSortedFieldsInDBOType = hasAllFieldsInType(sortFields); - if (hasAllSortedFieldsInDBOType) - { - query = query - .SortBy(request.SortFields) - .Skip(skip) - .Take(take); - } + query = query.SortBy(request.SortFields); } - else - { - query = query - .Skip(skip) - .Take(take); - } - - var messagesList = await query.AsNoTracking() - .ToListAsync(token).ConfigureAwait(false); + var messagesList = await query.Skip(skip) + .Take(take).AsNoTracking() + .ToListAsync(token).ConfigureAwait(false); if (messagesList.Count == 0) return result; @@ -150,14 +135,6 @@ namespace AsbCloudInfrastructure.Services.SAUB result.Items.Add(messageDto); } - if (sortFields?.Any() == true && !hasAllSortedFieldsInDBOType) - { - result.Items = result.Items.AsQueryable() - .SortBy(request.SortFields) - .Skip(skip) - .Take(take) - .ToList(); - } return result; } From 2746c9472933d90fb38e7280b616d4211d849b50 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 2 Feb 2023 16:07:41 +0500 Subject: [PATCH 10/17] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20GetMessag?= =?UTF-8?q?esAsync=20=D0=B2=20MessageService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/SAUB/MessageService.cs | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs index ce7606ff..d7540576 100644 --- a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs @@ -28,16 +28,8 @@ namespace AsbCloudInfrastructure.Services.SAUB public async Task> GetMessagesAsync(MessageRequest request, CancellationToken token) { - var idWell = request.IdWell; - var categoryids = request.Categoryids; - var searchString = request.SearchString; - var begin = request.Begin; - var end = request.End; - var skip = request.Skip ?? 0; - var take = request.Take ?? 32; - var sortFields = request.SortFields; - var idTelemetry = telemetryService.GetOrDefaultIdTelemetryByIdWell(idWell); + var idTelemetry = telemetryService.GetOrDefaultIdTelemetryByIdWell(request.IdWell); if (idTelemetry is null) return null; @@ -50,13 +42,13 @@ namespace AsbCloudInfrastructure.Services.SAUB var query = db.TelemetryMessages.Where(m => m.IdTelemetry == idTelemetry) .OrderBy(m => m.DateTime).AsNoTracking(); - if (categoryids?.Any() == true || !string.IsNullOrEmpty(searchString)) + if (request.Categoryids?.Any() == true || !string.IsNullOrEmpty(request.SearchString)) { - if (!string.IsNullOrEmpty(searchString)) - events = events.Where(e => e.MessageTemplate.Contains(searchString, StringComparison.OrdinalIgnoreCase)); + if (!string.IsNullOrEmpty(request.SearchString)) + events = events.Where(e => e.MessageTemplate.Contains(request.SearchString, StringComparison.OrdinalIgnoreCase)); - if (categoryids?.Any() == true) - events = events.Where(e => categoryids.ToList().Contains(e.IdCategory)); + if (request.Categoryids?.Any() == true) + events = events.Where(e => request.Categoryids.ToList().Contains(e.IdCategory)); var eventIds = events.Select(e => e.IdEvent); @@ -70,31 +62,31 @@ namespace AsbCloudInfrastructure.Services.SAUB var timezone = telemetryService.GetTimezone(idTelemetry ?? default); - if (begin != default) + if (request.Begin != default) { - var beginUtc = begin.Value.ToUtcDateTimeOffset(timezone.Hours); + var beginUtc = request.Begin.Value.ToUtcDateTimeOffset(timezone.Hours); query = query.Where(m => m.DateTime >= beginUtc); } - if (end != default) + if (request.End != default) { - var endUtc = end.Value.ToUtcDateTimeOffset(timezone.Hours); + var endUtc = request.End.Value.ToUtcDateTimeOffset(timezone.Hours); query = query.Where(m => m.DateTime <= endUtc); } var result = new PaginationContainer { - Skip = skip, - Take = take, + Skip = request.Skip ?? 0, + Take = request.Take ?? 32, Count = query.Count() }; - if (sortFields?.Any() == true) + if (request.SortFields?.Any() == true) { query = query.SortBy(request.SortFields); } - var messagesList = await query.Skip(skip) - .Take(take).AsNoTracking() + var messagesList = await query.Skip(request.Skip ?? 0) + .Take(request.Take ?? 32).AsNoTracking() .ToListAsync(token).ConfigureAwait(false); if (messagesList.Count == 0) From c62d3adb18bd857d5d490ffb38db7a8df574644e Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 2 Feb 2023 17:51:27 +0500 Subject: [PATCH 11/17] =?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/Services/SAUB/MessageService.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs index d7540576..fe195fea 100644 --- a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs @@ -150,14 +150,5 @@ namespace AsbCloudInfrastructure.Services.SAUB return db.SaveChangesAsync(token); } - - private bool hasAllFieldsInType(IEnumerable sortFields) - { - var type = typeof(T); - var properyNames = type.GetProperties().Select(x => x.Name.ToLower()); - sortFields = sortFields.Select(x => x.ToLower().Split(' ')[0]); - var result = sortFields.All(field => properyNames.Contains(field)); - return result; - } } } From 0b7f53997a5b00707a13af4d32204cfc3844d7de Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 3 Feb 2023 09:08:25 +0500 Subject: [PATCH 12/17] =?UTF-8?q?=D0=94=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B8=D1=80=D1=83=D1=8E=D1=89=D0=B8=D0=B5=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B2=20MessageRequestBase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/MessageRequest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AsbCloudApp/Requests/MessageRequest.cs b/AsbCloudApp/Requests/MessageRequest.cs index 83906bfc..9751f29e 100644 --- a/AsbCloudApp/Requests/MessageRequest.cs +++ b/AsbCloudApp/Requests/MessageRequest.cs @@ -13,23 +13,23 @@ namespace AsbCloudApp.Requests public class MessageRequestBase: RequestBase { /// - /// + /// Категория /// public IEnumerable? Categoryids { get; set; } /// - /// + /// Начальная дата /// public DateTime? Begin { get; set; } /// - /// + /// Конечная дата /// public DateTime? End { get; set; } /// - /// + /// Строка поиска /// public string? SearchString { get; set; } From 479cf72f0cdb85329d72ac77d602d3b52d4db720 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 3 Feb 2023 09:09:55 +0500 Subject: [PATCH 13/17] =?UTF-8?q?=D0=94=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B8=D1=80=D1=83=D1=8E=D1=89=D0=B8=D0=B5=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B2=20MessageRequestBase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/MessageRequest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AsbCloudApp/Requests/MessageRequest.cs b/AsbCloudApp/Requests/MessageRequest.cs index 9751f29e..cdfc83f1 100644 --- a/AsbCloudApp/Requests/MessageRequest.cs +++ b/AsbCloudApp/Requests/MessageRequest.cs @@ -13,23 +13,23 @@ namespace AsbCloudApp.Requests public class MessageRequestBase: RequestBase { /// - /// Категория + /// категория /// public IEnumerable? Categoryids { get; set; } /// - /// Начальная дата + /// начальная дата /// public DateTime? Begin { get; set; } /// - /// Конечная дата + /// конечная дата /// public DateTime? End { get; set; } /// - /// Строка поиска + /// строка поиска /// public string? SearchString { get; set; } From d9684f6985b55c1f6fcded3d5ddeafbcacb1eff2 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 3 Feb 2023 09:38:56 +0500 Subject: [PATCH 14/17] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B5=D0=BE=D0=B1=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=D0=B8=D0=BC=D1=8B=D1=85=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9?= =?UTF-8?q?=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=20MessageRequest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/MessageRequest.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/AsbCloudApp/Requests/MessageRequest.cs b/AsbCloudApp/Requests/MessageRequest.cs index cdfc83f1..d352f4f7 100644 --- a/AsbCloudApp/Requests/MessageRequest.cs +++ b/AsbCloudApp/Requests/MessageRequest.cs @@ -54,6 +54,11 @@ namespace AsbCloudApp.Requests { this.IdWell = idWell; + this.Categoryids = request.Categoryids; + this.Begin = request.Begin; + this.End = request.End; + this.SearchString = request.SearchString; + this.Skip = request.Skip; this.Take = request.Take; this.SortFields = request.SortFields; From 7396be4d6a472520703ec915df978839b2167c23 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 3 Feb 2023 10:27:16 +0500 Subject: [PATCH 15/17] fix permission default data. --- AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs index eaaad0fc..4772aa0a 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs @@ -141,9 +141,6 @@ new (){ Id = 510, Name="PlannedTrajectory.get", Description="Разрешение просматривать плановая траектория"}, new (){ Id = 511, Name="PlannedTrajectory.edit", Description="Разрешение редактировать плановая траектория"}, new (){ Id = 512, Name="PlannedTrajectory.delete", Description="Разрешение удалять плановая траектория"}, - new (){ Id = 510, Name="TelemetryWirelineRunOut.get", Description="Разрешение просматривать плановая траектория"}, - new (){ Id = 511, Name="TelemetryWirelineRunOut.edit", Description="Разрешение редактировать плановая траектория"}, - new (){ Id = 512, Name="TelemetryWirelineRunOut.delete", Description="Разрешение удалять плановая траектория"}, new (){ Id = 513, Name="ProcessMap.get", Description="Разрешение просматривать РТК"}, new (){ Id = 514, Name="ProcessMap.edit", Description="Разрешение редактировать РТК"}, From 2ba6a57975f65a6bfac4b15ec5df5119cb7e681c Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 3 Feb 2023 11:15:14 +0500 Subject: [PATCH 16/17] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20+=20=D1=83=D1=8C=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20using?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/MessageRequest.cs | 10 ++--- .../Services/SAUB/MessageService.cs | 38 ++++++++++--------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/AsbCloudApp/Requests/MessageRequest.cs b/AsbCloudApp/Requests/MessageRequest.cs index d352f4f7..8f7f06f6 100644 --- a/AsbCloudApp/Requests/MessageRequest.cs +++ b/AsbCloudApp/Requests/MessageRequest.cs @@ -1,8 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace AsbCloudApp.Requests { @@ -10,7 +7,7 @@ namespace AsbCloudApp.Requests /// /// параметры для запроса списка сообщений /// - public class MessageRequestBase: RequestBase + public class MessageRequestBase : RequestBase { /// /// категория @@ -26,7 +23,7 @@ namespace AsbCloudApp.Requests /// /// конечная дата /// - public DateTime? End { get; set; } + public DateTime? End { get; set; } /// /// строка поиска @@ -38,7 +35,8 @@ namespace AsbCloudApp.Requests /// /// параметры для запроса списка сообщений (с id скважины) /// - public class MessageRequest: MessageRequestBase { + public class MessageRequest : MessageRequestBase + { /// /// id скважины diff --git a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs index fe195fea..cd4a1749 100644 --- a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs @@ -13,6 +13,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +#nullable enable namespace AsbCloudInfrastructure.Services.SAUB { public class MessageService : IMessageService @@ -28,16 +29,21 @@ namespace AsbCloudInfrastructure.Services.SAUB public async Task> GetMessagesAsync(MessageRequest request, CancellationToken token) { + var result = new PaginationContainer + { + Skip = request.Skip ?? 0, + Take = request.Take ?? 32, + }; var idTelemetry = telemetryService.GetOrDefaultIdTelemetryByIdWell(request.IdWell); if (idTelemetry is null) - return null; + return result; var allEvents = await db.TelemetryEvents.FromCacheAsync(token); var events = allEvents.Where(e => e.IdTelemetry == idTelemetry); if (!events.Any()) - return null; + return result; var query = db.TelemetryMessages.Where(m => m.IdTelemetry == idTelemetry) .OrderBy(m => m.DateTime).AsNoTracking(); @@ -53,7 +59,7 @@ namespace AsbCloudInfrastructure.Services.SAUB var eventIds = events.Select(e => e.IdEvent); if (!eventIds.Any()) - return null; + return result; query = query.Where(m => eventIds.Contains(m.IdEvent)); } @@ -62,31 +68,26 @@ namespace AsbCloudInfrastructure.Services.SAUB var timezone = telemetryService.GetTimezone(idTelemetry ?? default); - if (request.Begin != default) + if (request.Begin is not null) { var beginUtc = request.Begin.Value.ToUtcDateTimeOffset(timezone.Hours); query = query.Where(m => m.DateTime >= beginUtc); } - if (request.End != default) + if (request.End is not null) { var endUtc = request.End.Value.ToUtcDateTimeOffset(timezone.Hours); query = query.Where(m => m.DateTime <= endUtc); } - var result = new PaginationContainer - { - Skip = request.Skip ?? 0, - Take = request.Take ?? 32, - Count = query.Count() - }; + result.Count = query.Count(); if (request.SortFields?.Any() == true) { query = query.SortBy(request.SortFields); } - var messagesList = await query.Skip(request.Skip ?? 0) - .Take(request.Take ?? 32).AsNoTracking() + var messagesList = await query.Skip(result.Skip) + .Take(result.Take).AsNoTracking() .ToListAsync(token).ConfigureAwait(false); if (messagesList.Count == 0) @@ -95,8 +96,8 @@ namespace AsbCloudInfrastructure.Services.SAUB var allUsers = await db.TelemetryUsers.FromCacheAsync(token); var users = allUsers.Where(u => u.IdTelemetry == idTelemetry); - var eventsDict = events.GroupBy(x => x.IdEvent).ToDictionary(x => x.Key, x => x.FirstOrDefault()); - var usersDict = users.GroupBy(x => x.IdUser).ToDictionary(x => x.Key, x => x.FirstOrDefault()); + var eventsDict = events.ToDictionary(x=>x.IdEvent, x => x); + var usersDict = users.ToDictionary(x => x.IdUser, x => x); foreach (var message in messagesList) { @@ -110,7 +111,7 @@ namespace AsbCloudInfrastructure.Services.SAUB if (message.IdTelemetryUser is not null) { - if (usersDict.TryGetValue((int)message.IdTelemetryUser, out TelemetryUser user)) + if (usersDict.TryGetValue((int)message.IdTelemetryUser, out TelemetryUser? user)) { messageDto.User = user.MakeDisplayName(); } @@ -118,7 +119,7 @@ namespace AsbCloudInfrastructure.Services.SAUB messageDto.User = message.IdTelemetryUser.ToString(); } - if (eventsDict.TryGetValue(message.IdEvent, out TelemetryEvent e)) + if (eventsDict.TryGetValue(message.IdEvent, out TelemetryEvent? e)) { messageDto.CategoryId = e.IdCategory; messageDto.Message = e.MakeMessageText(message); @@ -134,7 +135,7 @@ namespace AsbCloudInfrastructure.Services.SAUB CancellationToken token = default) { if (!dtos.Any()) - return null; + return Task.CompletedTask; var telemetryId = telemetryService.GetOrCreateTelemetryIdByUid(uid); var timezone = telemetryService.GetTimezone(telemetryId); @@ -152,3 +153,4 @@ namespace AsbCloudInfrastructure.Services.SAUB } } } +#nullable disable From e548425b188b4ef242f837b8a53b21ae12e2376a Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 3 Feb 2023 16:00:45 +0500 Subject: [PATCH 17/17] Add PredicateBuilder to build complex predicate expressions --- AsbCloudInfrastructure/PredicateBuilder.cs | 80 +++++++++++++++++++ .../Repository/ProcessMapRepository.cs | 36 +++++---- 2 files changed, 99 insertions(+), 17 deletions(-) create mode 100644 AsbCloudInfrastructure/PredicateBuilder.cs diff --git a/AsbCloudInfrastructure/PredicateBuilder.cs b/AsbCloudInfrastructure/PredicateBuilder.cs new file mode 100644 index 00000000..ff0bf720 --- /dev/null +++ b/AsbCloudInfrastructure/PredicateBuilder.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; + +namespace AsbCloudInfrastructure +{ +#nullable enable + /// + /// stolen from https://github.com/lotosbin/BinbinPredicateBuilder + /// + public static class PredicateBuilder + { + /// + /// Combines the first predicate with the second using the logical "and". + /// + public static Expression> And(this Expression> first, Expression> second) + { + return first.Compose(second, Expression.AndAlso); + } + + /// + /// Combines the first predicate with the second using the logical "or". + /// + public static Expression> Or(this Expression> first, Expression> second) + { + return first.Compose(second, Expression.OrElse); + } + + /// + /// Negates the predicate. + /// + public static Expression> Not(this Expression> expression) + { + var negated = Expression.Not(expression.Body); + return Expression.Lambda>(negated, expression.Parameters); + } + + private static Expression Compose(this Expression first, Expression second, Func merge) + { + var map = first.Parameters + .Select((f, i) => new { f, s = second.Parameters[i] }) + .ToDictionary(p => p.s, p => p.f); + + var tryReplaceParametr = (Expression node) => + { + if (node is ParameterExpression parameter) + if (map.TryGetValue(parameter, out ParameterExpression? replacement)) + return replacement; + return node; + }; + + var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body); + return Expression.Lambda(merge(first.Body, secondBody), first.Parameters); + } + + class ParameterRebinder : ExpressionVisitor + { + private readonly Dictionary map; + + private ParameterRebinder(Dictionary map) + { + this.map = map; + } + + public static Expression ReplaceParameters(Dictionary map, Expression exp) + { + return new ParameterRebinder(map).Visit(exp); + } + + protected override Expression VisitParameter(ParameterExpression parametr) + { + if (map.TryGetValue(parametr, out ParameterExpression? replacement)) + parametr = replacement; + return parametr; + } + } + } +} +#nullable disable \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs index 95330293..09f1f0a4 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs @@ -11,6 +11,7 @@ using Org.BouncyCastle.Asn1.Ocsp; using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; @@ -80,27 +81,28 @@ namespace AsbCloudInfrastructure.Repository private IQueryable BuildQuery(IEnumerable requests) { var query = GetQuery(); - Func? p = null; - foreach (var request in requests) + if (requests.Any()) { - var p2 = (ProcessMap map) => map.IdWell == request.IdWell; - - if (request.IdWellSectionType is not null) - p2 = (ProcessMap map) => p2(map) && map.IdWellSectionType == request.IdWellSectionType; - - if (request.UpdateFrom is not null) + Expression> predicate = map => false; + foreach (var request in requests) { - var timezone = wellService.GetTimezone(request.IdWell); - var updateFromUtc = request.UpdateFrom?.ToUtcDateTimeOffset(timezone.Hours); - p2 = (ProcessMap map) => p2(map) && map.LastUpdate >= updateFromUtc; + Expression> predicate2 = map => map.IdWell == request.IdWell; + + if (request.IdWellSectionType is not null) + predicate2 = predicate2.And(map => map.IdWellSectionType == request.IdWellSectionType); + + if (request.UpdateFrom is not null) + { + var timezone = wellService.GetTimezone(request.IdWell); + var updateFromUtc = request.UpdateFrom?.ToUtcDateTimeOffset(timezone.Hours); + predicate2 = predicate2.And(map => map.LastUpdate >= updateFromUtc); + } + + predicate = predicate.Or(predicate2); } - - p = p is null - ? p2 - : (ProcessMap map) => p(map) || p2(map); + query = query.Where(predicate); + } - if(p is not null) - query.Where(p); return query; } protected override ProcessMapDto Convert(ProcessMap entity)