diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs index fd3c1054..f940bfb1 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs @@ -14,7 +14,7 @@ namespace AsbCloudApp.Data.Subsystems /// /// Наработки подсистем /// - public IEnumerable listSubsystemStat { get; set; } + public List listSubsystemStat { get; set; } } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 9aa1dd77..9add54b0 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -184,71 +184,79 @@ namespace AsbCloudInfrastructure.Services.Subsystems } - + //TODO: + // скорее всего нужно доработать wellService - первое это метод + // GetWellsByCompanyAsync (получать сразу активные скважины ,а не вытягивать сначала все) + // второе - метод GetOperationsAsync - по умолчанию если не указан + // ИД скважины он заполняется как 0 , в нашем случае нужно получить опред операции по ВСЕМ + // скважинам + private async Task> GetSubsystemOperationTimeAll(int idCompany, CancellationToken token) - { + { var listWell = await wellService.GetWellsByCompanyAsync(idCompany, token); var active = listWell.Where(w => w.IdState == 1); return active; } - - public async Task?> GetStatByActiveWell(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token) { var activeWell = await GetSubsystemOperationTimeAll(idCompany, token); - var telemetryIds = activeWell.Select(w => w.IdTelemetry); + var telemetryIds = activeWell.Select(w => w.IdTelemetry).Distinct(); var query = db.SubsystemOperationTimes - .Include(o => o.Subsystem) .Where(o => telemetryIds.Contains(o.IdTelemetry)) - .AsNoTracking(); - + .AsNoTracking(); + if (query is null) { return null; } DateTime today = DateTime.Today; - if (gtDate.HasValue) - { - query = query.Where(o => o.DateEnd >= gtDate); - } - else + if (!gtDate.HasValue) { - gtDate = today; - query = query.Where(o => o.DateEnd == gtDate); - } + gtDate = today; + } + query = query.Where(o => o.DateStart >= gtDate.Value.ToUniversalTime()); - if (ltDate.HasValue) - { - query = query.Where(o => o.DateStart <= ltDate); - } - else + if (!ltDate.HasValue) { ltDate = today.AddDays(-1); - query = query.Where(o => o.DateStart == ltDate ); - } - var detectedOperationsRequest = new DetectedOperationRequest() - { - IdsCategories = new List() { - 1,3 - }, - LtDate = ltDate, - GtDate = gtDate, - }; - var detectedOperations = await detectedOperationService.GetOperationsAsync(detectedOperationsRequest, token); - var groupData = query.GroupBy(g => g.IdTelemetry); - var result = new List(); - foreach (var group in groupData) - { - var wellStat = new SubsystemActiveWellStatDto(); - wellStat.IdWell = activeWell.Where(w => w.IdTelemetry == group.Key).Select(w => w.Id).FirstOrDefault(); - var groupSubsystem = (IEnumerable>)group.GroupBy(g => g.IdSubsystem); - var detectedOperationsById = detectedOperations.Where(d => d.IdWell == wellStat.IdWell).ToList(); - var depthInterval = GetDepthInterval(detectedOperationsById); - wellStat.listSubsystemStat = CalcStat((IEnumerable)groupSubsystem, depthInterval); - result.Add(wellStat); - } + } + query = query.Where(o => o.DateEnd <= ltDate.Value.ToUniversalTime()); + var result = new List(); + var subsystemsOperationTime = query.ToList(); + var groupingSubsystemsOperationTime = subsystemsOperationTime.GroupBy(g => g.IdTelemetry).ToList(); + foreach (var group in groupingSubsystemsOperationTime) + { + var idWell = activeWell.Where(w => w.IdTelemetry == group.Key).Select(w => w.Id).FirstOrDefault(); + var wellStat = new SubsystemActiveWellStatDto() + { + IdWell = idWell, + listSubsystemStat = new List() + + }; + var detectedOperationsRequest = new DetectedOperationRequest() + { + IdWell = idWell, + IdsCategories = new List() {1,3}, + LtDate = ltDate, + GtDate = gtDate, + }; + var detectedOperations = await detectedOperationService.GetOperationsAsync(detectedOperationsRequest, token); + if (detectedOperations is not null && detectedOperations.Any()) + { + var depthInterval = GetDepthInterval(detectedOperations); + var groupSubsystem = group.GroupBy(g => g.IdSubsystem).ToList(); + + foreach (var subsystem in groupSubsystem) + { + var dto = subsystem.Select(s => s.Adapt()); + var subsystemStat = CalcStat(dto, depthInterval); + wellStat.listSubsystemStat.AddRange(subsystemStat); + } + result.Add(wellStat); + } + } return result; }