diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs
index bdcdd301..2b62f171 100644
--- a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs
+++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs
@@ -10,7 +10,7 @@ namespace AsbCloudApp.Data.Subsystems
///
/// Активная скважина
///
- public WellDto ActiveWell { get; set; }
+ public WellDto Well { get; set; }
///
/// Наработки подсистемы АКБ
///
diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs
index cb14cc9c..8418557c 100644
--- a/AsbCloudApp/Services/IDetectedOperationService.cs
+++ b/AsbCloudApp/Services/IDetectedOperationService.cs
@@ -48,7 +48,7 @@ namespace AsbCloudApp.Services
///
///
/// кортеж - ид телеметрии, интервалы глубины забоя (ротор,слайд)
- Task?> GetDepthIntervalAllOperationsAsync(IEnumerable telemetryIds,DateTimeOffset gtDate, DateTimeOffset ltDate, CancellationToken token);
+ Task> GetDepthIntervalAllOperationsAsync(IEnumerable telemetryIds,DateTimeOffset gtDate, DateTimeOffset ltDate, CancellationToken token);
///
/// Удалить операции
diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs
index b4032552..91b78023 100644
--- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs
+++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs
@@ -55,7 +55,7 @@ namespace AsbCloudApp.Services.Subsystems
///
///
///
- Task?> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token);
+ Task> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token);
}
#nullable disable
}
diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs
index 35970bca..87decac8 100644
--- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs
+++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs
@@ -84,7 +84,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations
return dtos;
}
- public async Task?> GetDepthIntervalAllOperationsAsync(IEnumerable telemetryIds, DateTimeOffset gtDate, DateTimeOffset ltDate, CancellationToken token)
+ public async Task> GetDepthIntervalAllOperationsAsync(IEnumerable telemetryIds, DateTimeOffset gtDate, DateTimeOffset ltDate, CancellationToken token)
{
var query = db.Set()
.Include(o => o.OperationCategory)
@@ -98,18 +98,14 @@ namespace AsbCloudInfrastructure.Services.DetectOperations
RotorDepthInterval = g.Where(o => o.IdCategory == IdOperationRotor).Sum(o => o.DepthEnd - o.DepthStart),
SlideDepthInterval = g.Where(o => o.IdCategory == IdOperationSlide).Sum(o => o.DepthEnd - o.DepthStart)
});
- var data = await query.ToListAsync(token);
- if (data.Any())
- {
- var result = data.Select(g =>
- (
- g.IdTelemetry,
- g.RotorDepthInterval,
- g.SlideDepthInterval
- ));
- return result;
- }
- return null;
+ var data = await query.ToArrayAsync(token);
+ var result = data.Select(g =>
+ (
+ g.IdTelemetry,
+ g.RotorDepthInterval,
+ g.SlideDepthInterval
+ ));
+ return result;
}
private static IEnumerable GetOperationsDrillersStat(IEnumerable operations)
diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs
index 3cf1fb28..ada2ab42 100644
--- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs
+++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs
@@ -79,7 +79,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems
data = Trim(data, begin, end);
}
- var dtos = data.Select(o => Convert(o, well));
+ var dtos = data.Select(o => Convert(o, well.Timezone.Hours));
return dtos;
}
@@ -156,7 +156,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems
return result;
}
- private (double depthIntervalRotor, double depthIntervalSlide) GetDepthInterval (IEnumerable detectedOperations)
+ private static (double depthIntervalRotor, double depthIntervalSlide) GetDepthInterval (IEnumerable detectedOperations)
{
var depthIntervalRotor = detectedOperations.Where(o => o.IdCategory == 1)
.Sum(o => o.DepthEnd - o.DepthStart);
@@ -166,7 +166,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems
return depthInterval;
}
- private double GetDepthIntervalSubsystem(int idSubsystem, (double depthIntervalRotor, double depthIntervalSlide) depthInterval)
+ private static double GetDepthIntervalSubsystem(int idSubsystem, (double depthIntervalRotor, double depthIntervalSlide) depthInterval)
{
var depthIntervalSubsystem = 0d;
//AKB - MSE
@@ -193,59 +193,67 @@ namespace AsbCloudInfrastructure.Services.Subsystems
var listWell = await wellService.GetWellsByCompanyAsync(idCompany, token);
var active = listWell.Where(w => w.IdState == 1);
return active;
- }
+ }
-
- public async Task?> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token)
+ ///
+ public async Task> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token)
{
- var activeWell = await GetActiveWellsByCompany(idCompany, token);
- var telemetryIds = activeWell.Select(w => w.IdTelemetry).Distinct();
- var firstWell = activeWell.FirstOrDefault();
- if (firstWell == null)
+ var wells = await GetActiveWellsByCompany(idCompany, token);
+ if (!wells.Any())
return Enumerable.Empty();
- var result =activeWell.Select( t => new SubsystemActiveWellStatDto
- {
- ActiveWell = t
- }).ToList();
+
+ var hoursOffset = wells
+ .FirstOrDefault(well => well.Timezone is not null)
+ ?.Timezone.Hours
+ ?? 5d;
+
+ var beginUTC = gtDate.HasValue
+ ? gtDate.Value.ToUtcDateTimeOffset(hoursOffset)
+ :DateTime.Today.AddDays(-1).ToUtcDateTimeOffset(hoursOffset);
+
+ var endUTC = ltDate.HasValue
+ ? ltDate.Value.ToUtcDateTimeOffset(hoursOffset)
+ : DateTime.Today.ToUtcDateTimeOffset(hoursOffset);
+
+ var telemetryIds = wells
+ .Where(w => w.IdTelemetry is not null)
+ .Select(w => w.IdTelemetry)
+ .Distinct();
var query = db.SubsystemOperationTimes
- .Where(o => telemetryIds.Contains(o.IdTelemetry))
+ .Where(o => telemetryIds.Contains(o.IdTelemetry) &&
+ o.DateStart >= beginUTC &&
+ o.DateEnd <= endUTC)
.AsNoTracking();
- var beginUTC = DateTime.Today.AddDays(-1).ToUtcDateTimeOffset(firstWell.Timezone.Hours);
- var endUTC = DateTime.Today.ToUtcDateTimeOffset(firstWell.Timezone.Hours);
- if (gtDate is not null)
- {
- beginUTC = gtDate.Value.ToUtcDateTimeOffset(firstWell.Timezone.Hours);
- }
- if (ltDate is not null)
- {
- endUTC = ltDate.Value.ToUtcDateTimeOffset(firstWell.Timezone.Hours);
- }
- query = query.Where(d => d.DateStart >= beginUTC);
- query = query.Where(o => o.DateEnd <= endUTC);
-
- var depthIntervals = await detectedOperationService.GetDepthIntervalAllOperationsAsync(telemetryIds, beginUTC, endUTC, token);
- if (depthIntervals is null)
- {
- return result;
- }
var subsystemsOperationTime = await query.ToListAsync(token);
- var groupingSubsystemsOperationTime = subsystemsOperationTime.GroupBy(g => g.IdTelemetry);
- foreach (var group in groupingSubsystemsOperationTime)
- {
- var well = result.Where(w => w.ActiveWell.IdTelemetry == group.Key).FirstOrDefault();
- if (well is not null)
- {
- var depthInterval = depthIntervals.Where(o => o.idTelemetry == well.ActiveWell.IdTelemetry).Select(o => (o.depthIntervalRotor, o.depthIntervalSlide)).FirstOrDefault();
- var dto = group.Select(s => s.Adapt());
- var subsystemStat = CalcStat(dto, depthInterval);
- well.SubsystemAKB = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemAKB);
- well.SubsystemMSE = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemMSE);
- well.SubsystemSpinMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemSpin);
- well.SubsystemTorqueMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemTorque);
- }
- }
+
+ var depthIntervals = await detectedOperationService
+ .GetDepthIntervalAllOperationsAsync(telemetryIds, beginUTC, endUTC, token);
+
+ var result = wells
+ .Select(well => {
+ var dtos = subsystemsOperationTime
+ .Where(s => s.IdTelemetry == well.IdTelemetry)
+ .Select(s => Convert(s, well.Timezone.Hours));
+
+ var (idTelemetry, depthIntervalRotor, depthIntervalSlide) = depthIntervals
+ .FirstOrDefault(i => i.idTelemetry == well.IdTelemetry);
+
+ var subsystemStat = idTelemetry > 0 && dtos.Any()
+ ? CalcStat(dtos, (depthIntervalRotor, depthIntervalSlide))
+ : Enumerable.Empty();
+
+ return new SubsystemActiveWellStatDto
+ {
+ Well = well,
+ SubsystemAKB = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemAKB),
+ SubsystemMSE = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemMSE),
+ SubsystemSpinMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemSpin),
+ SubsystemTorqueMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemTorque),
+ };
+ });
+
return result;
}
@@ -325,11 +333,12 @@ namespace AsbCloudInfrastructure.Services.Subsystems
return query;
}
- private static SubsystemOperationTimeDto Convert(SubsystemOperationTime operationTime, WellDto well)
+ private static SubsystemOperationTimeDto Convert(SubsystemOperationTime operationTime, double? timezoneHours = null)
{
var dto = operationTime.Adapt();
- dto.DateStart = operationTime.DateStart.ToRemoteDateTime(well.Timezone.Hours);
- dto.DateEnd = operationTime.DateEnd.ToRemoteDateTime(well.Timezone.Hours);
+ var hours = timezoneHours ?? operationTime.Telemetry.TimeZone.Hours;
+ dto.DateStart = operationTime.DateStart.ToRemoteDateTime(hours);
+ dto.DateEnd = operationTime.DateEnd.ToRemoteDateTime(hours);
return dto;
}
diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs
index 0d832667..e2b1a945 100644
--- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs
+++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs
@@ -54,7 +54,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems
/// Токен
///
[HttpGet("statByActiveWell")]
- [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)]
+ [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)]
public async Task GetStatByWellAsync(DateTime? GtDate, DateTime? LtDate, CancellationToken token = default)
{
var idCompany = User.GetCompanyId();