From 1e694216a9e77c80b7ae8eca4ff429300cd1a5ab Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Fri, 5 Aug 2022 17:10:56 +0500 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=20?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=20=D0=BD=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BE=D0=BA=20=20=D0=B8=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B8.=20=D0=B2=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=B5=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=20=D1=8D=D0=BA=D1=88?= =?UTF-8?q?=D0=BD=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=20=D0=B8=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=B4=D0=BE=D1=81=D1=82=D1=83?= =?UTF-8?q?=D0=BF=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8F=20=D0=BA=20=D1=81=D0=BA=D0=B2=D0=B0?= =?UTF-8?q?=D0=B6=D0=B8=D0=BD=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ISubsystemOperationTimeService.cs | 2 +- AsbCloudInfrastructure/DependencyInjection.cs | 6 +- ...SubsystemOperationTimeBackgroundService.cs | 22 +++--- .../SubsystemOperationTimeService.cs | 68 ++++++++++++------- .../SubsystemOperationTimeController.cs | 43 ++++++++---- 5 files changed, 92 insertions(+), 49 deletions(-) diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs index d03f8114..86b685e6 100644 --- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs +++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs @@ -11,7 +11,7 @@ namespace AsbCloudApp.Services.Subsystems { public interface ISubsystemOperationTimeService { - Task> GetSubsystemAsync(int idWell, CancellationToken token); + Task> GetSubsystemAsync(int? idWell, CancellationToken token); Task> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token); Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token); Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index b7a3cd8e..87fc1fa7 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -123,7 +123,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - //services.AddTransient(); + services.AddTransient(); // admin crud services: services.AddTransient, CrudServiceBase>(s => @@ -139,6 +139,10 @@ namespace AsbCloudInfrastructure new CrudCacheServiceBase( s.GetService(), dbSet => dbSet.Include(c => c.CompanyType))); + + + + services.AddTransient, CrudCacheServiceBase>(); services.AddTransient, CrudCacheServiceBase>(s => new CrudCacheServiceBase( diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index 809f63eb..4eb973d3 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -126,20 +126,20 @@ namespace AsbCloudInfrastructure.Services.Subsystems DateTimeOffset dateBegin = firstItem.DateTime; float? depthStart = firstItem.Depth; var resultSubsystemOperationTime = new List(); - - var data = await query - .Where(d => d.DateTime > startDate) - .Take(take) - .ToArrayAsync(token); - for(int i = 1;i<=data.Length ;i++) - { - if( data[i].Mode!= mode) + + var data = await query + .Where(d => d.DateTime > startDate) + .Take(take) + .ToArrayAsync(token); + for (int i = 1; i < data.Length; i++) + { + if (data[i].Mode != mode) { var operationTimeItem = new SubsystemOperationTime() { IdTelemetry = idTelemetry, DateStart = dateBegin, - IdSubsystem = (int)data[i - 1].Mode, + IdSubsystem = (int)data[i - 1].Mode, DateEnd = data[i - 1].DateTime, DepthStart = depthStart, DepthEnd = data[i - 1].Depth @@ -151,7 +151,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems depthStart = data[i].Depth; } } - startDate = data.Last().DateTime; + startDate = data.Last().DateTime; return resultSubsystemOperationTime; } @@ -187,7 +187,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems .Take(take) .ToArrayAsync(token); - for (int i = 1; i <= data.Length; i++) + for (int i = 1; i < data.Length; i++) { if (data[i].Mode != mode) { diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 5e37104c..c46a19ff 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -5,6 +5,7 @@ using AsbCloudApp.Services.Subsystems; using AsbCloudDb; using AsbCloudDb.Model; using AsbCloudDb.Model.Subsystems; +using AsbCloudInfrastructure.Repository; using Mapster; using Microsoft.EntityFrameworkCore; using System; @@ -21,35 +22,50 @@ namespace AsbCloudInfrastructure.Services.Subsystems private readonly IAsbCloudDbContext db; private readonly IWellService wellService; - private readonly SubsystemService subsystemService; + private readonly ICrudService subsystemService; + - public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService, SubsystemService subsystemService) + + public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService, ICrudService subsystemService) { this.db = db; this.wellService = wellService; this.subsystemService = subsystemService; } - public async Task > GetSubsystemAsync(int idWell, CancellationToken token) - { - var well = await wellService.GetOrDefaultAsync(idWell, token); - if (well?.IdTelemetry is null || well.Timezone is null) - return null; - var wellSubsystem = db.SubsystemOperationTimes - .Include(e=>e.Subsystem) - .AsNoTracking() - .Where(o => o.IdTelemetry == well.IdTelemetry) - .DistinctBy(o => o.IdSubsystem) - .Select(d => new SubsystemDto - { - Id = d.Subsystem.Id, - Name = d.Subsystem.Name, - Description = d.Subsystem.Description, + private async Task> GetSubsystemAsync(int idWell, CancellationToken token) + { + var well = await wellService.GetOrDefaultAsync(idWell, token); + if (well?.IdTelemetry is null || well.Timezone is null) + return null; + var wellSubsystem = await db.SubsystemOperationTimes + .Include(e => e.Subsystem) + .AsNoTracking() + .Where(o => o.IdTelemetry == well.IdTelemetry) + .DistinctBy(o => o.IdSubsystem) + .Select(d => new SubsystemDto + { + Id = d.Subsystem.Id, + Name = d.Subsystem.Name, + Description = d.Subsystem.Description, - }); - return wellSubsystem; + }) + .ToListAsync(token); + return wellSubsystem; } - + + public async Task> GetSubsystemAsync(int? idWell, CancellationToken token) + { + if (idWell is null) + { + var subsystem = await subsystemService.GetAllAsync(token); + return subsystem; + } + var subsystemWell = await GetSubsystemAsync(idWell, token); + return subsystemWell; + + } + public async Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token) { @@ -119,20 +135,24 @@ namespace AsbCloudInfrastructure.Services.Subsystems private IEnumerable CalcStat(IEnumerable groupedData, SubsystemOperationTimeRequest request) { var result = new List(); + var groupedDataSubsystems = groupedData + .GroupBy(x => x.IdSubsystem); var periodGroupTotal = groupedData .GroupBy(x => x.IdSubsystem) .Sum(g => g.Sum(o=> (o.DateEnd - o.DateStart).TotalHours)); - foreach (IEnumerable item in groupedData) - { - + foreach (var item in groupedDataSubsystems) + { var periodGroup = item.Sum(g => (g.DateEnd - g.DateStart).TotalHours); - var periodRequest = item.Where(o => o.DateStart==request.GtDate & o.DateEnd == request.LtDate) + var gtDate = request.GtDate ?? item.Min(d => d.DateStart); + var ltDate = request.LtDate ?? item.Max(d => d.DateEnd); + var periodRequest = item.Where(o => o.DateStart>=gtDate && o.DateEnd <= ltDate) .Sum(o => (o.DateEnd - o.DateStart).TotalHours); int idSubsystem = item.First().IdSubsystem; var subsystemStat = new SubsystemStatDto() { IdSubsystem = idSubsystem, Subsystem = subsystemService.GetOrDefault(idSubsystem)?.Name ?? "unknown", + //Subsystem = db.Subsystems.Where(n => n.Id == idSubsystem).FirstOrDefault()?.Name ?? "unknown", UsedTimeHours = TimeSpan.FromHours(periodGroup), KUsage = 1d*periodGroup / periodRequest, K2 = 1d*periodGroup / periodGroupTotal, diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs index f7763e58..ba75773a 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs @@ -20,9 +20,13 @@ namespace AsbCloudWebApi.Controllers.Subsystems public class SubsystemOperationTimeController : ControllerBase { private readonly ISubsystemOperationTimeService subsystemOperationTimeService; - public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService) + private readonly ICrudService subsystemService; + private readonly IWellService wellService; + public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService, ICrudService subsystemService, IWellService wellService) { - this.subsystemOperationTimeService = subsystemOperationTimeService; + this.subsystemOperationTimeService = subsystemOperationTimeService; + this.subsystemService = subsystemService; + this.wellService = wellService; } /// /// получить статистику @@ -31,6 +35,8 @@ namespace AsbCloudWebApi.Controllers.Subsystems [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public async Task GetStatAsync([FromQuery] SubsystemOperationTimeRequest request, CancellationToken token = default) { + if (!await UserHasAccesToWellAsync(request.IdWell, token)) + return Forbid(); var subsystemResult = await subsystemOperationTimeService.GetStatAsync(request, token); return Ok(subsystemResult); } @@ -40,16 +46,14 @@ namespace AsbCloudWebApi.Controllers.Subsystems /// [HttpGet("subsystem")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetSubsystemAsync([FromQuery] int idWell, CancellationToken token = default) + public async Task GetSubsystemAsync([FromQuery] int? idWell, CancellationToken token = default) { - if (idWell != null) - { - var resultIdWell = await subsystemOperationTimeService.GetSubsystemAsync(idWell, token); - return Ok(resultIdWell); - } - var result = await subsystemOperationTimeService.GetSubsystemAsync(idWell, token); - return Ok(result); - + if (idWell.HasValue) + if (!await UserHasAccesToWellAsync(idWell.Value, token)) + return Forbid(); + + var result = await subsystemOperationTimeService.GetSubsystemAsync(idWell, token); + return Ok(result); } /// @@ -57,10 +61,13 @@ namespace AsbCloudWebApi.Controllers.Subsystems /// [HttpGet("operationTime")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetOperationTimeAsync( [FromQuery] SubsystemOperationTimeRequest request, CancellationToken token = default) - { + { + if (!await UserHasAccesToWellAsync(request.IdWell, token)) + return Forbid(); var result = await subsystemOperationTimeService.GetOperationTimeAsync(request, token); return Ok(result); } @@ -78,8 +85,20 @@ namespace AsbCloudWebApi.Controllers.Subsystems [FromQuery] SubsystemOperationTimeRequest request, CancellationToken token) { + if (!await UserHasAccesToWellAsync(request.IdWell, token)) + return Forbid(); var result = await subsystemOperationTimeService.DeleteAsync(request, token); return Ok(result); } + + 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; + } } }