diff --git a/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs similarity index 96% rename from AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs rename to AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs index 5f2c7e77..4ef6d98d 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs @@ -9,7 +9,7 @@ namespace AsbCloudApp.Data.Subsystems /// /// Статистика подсистемы /// - public class SubsystemStatisticsDto + public class SubsystemStatDto { /// diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs index f6ff4b0e..d03f8114 100644 --- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs +++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs @@ -12,7 +12,7 @@ namespace AsbCloudApp.Services.Subsystems public interface ISubsystemOperationTimeService { Task> GetSubsystemAsync(int idWell, CancellationToken token); - Task> GetStatAsync(SubsystemOperationTimeRequest request, 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 3e98c630..b7a3cd8e 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -2,6 +2,7 @@ using AsbCloudApp.Data.SAUB; using AsbCloudApp.Data.Subsystems; using AsbCloudApp.Services; +using AsbCloudApp.Services.Subsystems; using AsbCloudDb.Model; using AsbCloudDb.Model.Subsystems; using AsbCloudInfrastructure.Repository; @@ -87,7 +88,7 @@ namespace AsbCloudInfrastructure services.AddScoped(); services.AddHostedService(); - //services.AddHostedService(); + services.AddHostedService(); services.AddSingleton(new WitsInfoService()); services.AddSingleton(new CacheDb()); services.AddSingleton(new InstantDataRepository()); @@ -118,10 +119,11 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); + //services.AddTransient(); // admin crud services: services.AddTransient, CrudServiceBase>(s => diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index ae97e8b7..809f63eb 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -87,11 +87,17 @@ namespace AsbCloudInfrastructure.Services.Subsystems foreach (var item in JounedlastDetectedDates) { var stopwatch = Stopwatch.StartNew(); - var newOperations = await OperationTimeSaubAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); + var newOperationsSaub = await OperationTimeSaubAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); + var newOperationsSpin = await OperationTimeSpinAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); stopwatch.Stop(); - if (newOperations.Any()) + if (newOperationsSaub.Any()) { - db.SubsystemOperationTimes.AddRange(newOperations); + db.SubsystemOperationTimes.AddRange(newOperationsSaub); + affected += await db.SaveChangesAsync(token); + } + if (newOperationsSpin.Any()) + { + db.SubsystemOperationTimes.AddRange(newOperationsSpin); affected += await db.SaveChangesAsync(token); } } @@ -109,19 +115,18 @@ namespace AsbCloudInfrastructure.Services.Subsystems Mode = d.Mode, Depth = d.WellDepth }) - .OrderBy(d => d.DateTime); + .OrderBy(d => d.DateTime); var take = 4 * 86_400; // 4 дня - var startDate = begin; - var resultSubsystemOperationTime = new List(); + var startDate = begin; var firstItem = query.FirstOrDefault(); if (firstItem is null) return null; short? mode = firstItem.Mode; DateTimeOffset dateBegin = firstItem.DateTime; float? depthStart = firstItem.Depth; - while (true) - { + var resultSubsystemOperationTime = new List(); + var data = await query .Where(d => d.DateTime > startDate) .Take(take) @@ -134,6 +139,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems { IdTelemetry = idTelemetry, DateStart = dateBegin, + IdSubsystem = (int)data[i - 1].Mode, DateEnd = data[i - 1].DateTime, DepthStart = depthStart, DepthEnd = data[i - 1].Depth @@ -146,67 +152,64 @@ namespace AsbCloudInfrastructure.Services.Subsystems } } startDate = data.Last().DateTime; - } + return resultSubsystemOperationTime; } - //private static async Task> OperationTimeSpinAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) - //{ - // var query = db.TelemetryDataSpin - // .AsNoTracking() - // .Where(d => d.IdTelemetry == idTelemetry) - // .Select(d => new OperationTimeData - // { - // DateTime = d.DateTime, - // Mode = d.Mode - // // Depth = d.d - // }) - // .OrderBy(d => d.DateTime); - // var take = 4 * 86_400; // 4 дня - // var startDate = begin; - // var operationTime = new List(); - // const int minOperationLength = 5; - // const int maxDetectorsInterpolationFrameLength = 30; - // const int gap = maxDetectorsInterpolationFrameLength + minOperationLength; + private static async Task> OperationTimeSpinAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) + { + var query = db.TelemetryDataSpin + .AsNoTracking() + .Where(d => d.IdTelemetry == idTelemetry) + .Select(d => new OperationTimeData + { + DateTime = d.DateTime, + Mode = d.Mode, + Depth = db.TelemetryDataSaub.Where(t => t.DateTime == d.DateTime & t.IdTelemetry ==idTelemetry) + .GroupBy(t => t.IdTelemetry) + .Select(group => group.Min(t => t.WellDepth)) + .FirstOrDefault() + }) + .OrderBy(d => d.DateTime); - // while (true) - // { - // var data = await query - // .Where(d => d.DateTime > startDate) - // .Take(take) - // .ToArrayAsync(token); + var take = 4 * 86_400; // 4 дня + var startDate = begin; + var firstItem = query.FirstOrDefault(); + if (firstItem is null) + return null; + short? mode = firstItem.Mode; + 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 operationTimeItem = new SubsystemOperationTime() + { + IdTelemetry = idTelemetry, + DateStart = dateBegin, + IdSubsystem = (int)data[i - 1].Mode, + DateEnd = data[i - 1].DateTime, + DepthStart = depthStart, + DepthEnd = data[i - 1].Depth - // if (data.Length < gap) - // break; + }; + resultSubsystemOperationTime.Add(operationTimeItem); + mode = data[i].Mode; + dateBegin = data[i].DateTime; + depthStart = data[i].Depth; + } + } + startDate = data.Last().DateTime; - // short? modeCount = data[0].Mode; - // DateTimeOffset dateBegin = data[0].DateTime; - // float? depthStart = data[0].Depth; - // for (int i = 1; i <= data.Length; i++) - // { - // if (data[i].Mode != modeCount) - // { - // var operationTimeItem = new SubsystemOperationTime() - // { - // IdTelemetry = idTelemetry, - // DateStart = dateBegin, - // DateEnd = data[i - 1].DateTime, - // DepthStart = depthStart, - // DepthEnd = data[i - 1].Depth - - // }; - // operationTime.Add(operationTimeItem); - // modeCount = data[i].Mode; - // dateBegin = data[i].DateTime; - // depthStart = data[i].Depth; - // } - // } - // } - // var depths = db.TelemetryDataSaub.Where(t => true/*by date*/) - // .GroupBy(t => t.IdTelemetry) - // .Select(group => group.Min(t => t.WellDepth)); - // return operationTime; - //} + return resultSubsystemOperationTime; + } } } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index fb39fded..5e37104c 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -90,7 +90,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems - public async Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token) + public async Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token) { var data = await GetOperationTimeAsync(request, token); var statList = CalcStat(data, request); @@ -116,9 +116,9 @@ namespace AsbCloudInfrastructure.Services.Subsystems return itemsToTrim; } - private IEnumerable CalcStat(IEnumerable groupedData, SubsystemOperationTimeRequest request) + private IEnumerable CalcStat(IEnumerable groupedData, SubsystemOperationTimeRequest request) { - var result = new List(); + var result = new List(); var periodGroupTotal = groupedData .GroupBy(x => x.IdSubsystem) .Sum(g => g.Sum(o=> (o.DateEnd - o.DateStart).TotalHours)); @@ -129,7 +129,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems var periodRequest = item.Where(o => o.DateStart==request.GtDate & o.DateEnd == request.LtDate) .Sum(o => (o.DateEnd - o.DateStart).TotalHours); int idSubsystem = item.First().IdSubsystem; - var subsystemStat = new SubsystemStatisticsDto() + var subsystemStat = new SubsystemStatDto() { IdSubsystem = idSubsystem, Subsystem = subsystemService.GetOrDefault(idSubsystem)?.Name ?? "unknown", diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs index b10b21d2..f7763e58 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs @@ -10,38 +10,28 @@ using System.Threading; using System.Threading.Tasks; namespace AsbCloudWebApi.Controllers.Subsystems -{ - - +{ /// /// Наработка подсистем /// [Route("api/[controller]")] [ApiController] [Authorize] - public class SubsystemOperationTimeController : ControllerBase { private readonly ISubsystemOperationTimeService subsystemOperationTimeService; - private readonly IWellService wellService; - - public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService, IWellService wellService) + public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService) { - this.subsystemOperationTimeService = subsystemOperationTimeService; - this.wellService = wellService; + this.subsystemOperationTimeService = subsystemOperationTimeService; } /// /// получить статистику /// [HttpGet("stat")] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetStatisticsAsync(CancellationToken token = default) + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetStatAsync([FromQuery] SubsystemOperationTimeRequest request, CancellationToken token = default) { - var subsystemResult = new List() - { - - }; - + var subsystemResult = await subsystemOperationTimeService.GetStatAsync(request, token); return Ok(subsystemResult); } @@ -52,8 +42,14 @@ namespace AsbCloudWebApi.Controllers.Subsystems [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] 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); + } /// @@ -64,8 +60,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems public async Task GetOperationTimeAsync( [FromQuery] SubsystemOperationTimeRequest request, CancellationToken token = default) - { - + { var result = await subsystemOperationTimeService.GetOperationTimeAsync(request, token); return Ok(result); }