diff --git a/AsbCloudApp/Requests/OperationStatRequest.cs b/AsbCloudApp/Requests/OperationStatRequest.cs
index cda26690..d92d803d 100644
--- a/AsbCloudApp/Requests/OperationStatRequest.cs
+++ b/AsbCloudApp/Requests/OperationStatRequest.cs
@@ -5,9 +5,8 @@ namespace AsbCloudApp.Requests
///
/// Параметры фильтра операции
///
- public class OperationStatRequest : RequestBase
+ public class OperationStatRequest
{
-
///
/// Дата начала операции в UTC
///
@@ -18,17 +17,14 @@ namespace AsbCloudApp.Requests
///
public DateTime? DateEndUTC { get; set; }
-
///
/// Минимальная продолжительность операции, мин
///
- public int? DurationMinutesMin { get; set; }
+ public double? DurationMinutesMin { get; set; }
///
/// Максимальная продолжительность операции, мин
///
- public int? DurationMinutesMax { get; set; }
-
-
+ public double? DurationMinutesMax { get; set; }
}
}
diff --git a/AsbCloudInfrastructure/Services/SlipsStatService.cs b/AsbCloudInfrastructure/Services/SlipsStatService.cs
index 56e422dd..2458da93 100644
--- a/AsbCloudInfrastructure/Services/SlipsStatService.cs
+++ b/AsbCloudInfrastructure/Services/SlipsStatService.cs
@@ -9,154 +9,155 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-namespace AsbCloudInfrastructure.Services
+namespace AsbCloudInfrastructure.Services;
+
+public class SlipsStatService : ISlipsStatService
{
- public class SlipsStatService : ISlipsStatService
+ private readonly IAsbCloudDbContext db;
+
+ public SlipsStatService(IAsbCloudDbContext db)
{
- private readonly IAsbCloudDbContext db;
- public SlipsStatService(IAsbCloudDbContext db)
+ this.db = db;
+ }
+
+ public async Task> GetAllAsync(OperationStatRequest request, CancellationToken token)
+ {
+ if (request.DateStartUTC.HasValue)
+ request.DateStartUTC = DateTime.SpecifyKind(request.DateStartUTC.Value, DateTimeKind.Utc);
+
+ if (request.DateEndUTC.HasValue)
+ request.DateEndUTC = DateTime.SpecifyKind(request.DateEndUTC.Value, DateTimeKind.Utc);
+
+ var schedulesQuery = db.Schedule
+ .Include(s => s.Well)
+ .Include(s => s.Driller)
+ .AsNoTracking();
+
+ if (request.DateStartUTC.HasValue && request.DateEndUTC.HasValue)
+ schedulesQuery = schedulesQuery.
+ Where(s => s.DrillStart >= request.DateStartUTC && s.DrillEnd <= request.DateEndUTC);
+
+ var schedules = await schedulesQuery.ToArrayAsync(token);
+
+ var wells = schedules
+ .Select(d => d.Well)
+ .Where(well => well.IdTelemetry != null)
+ .GroupBy(w => w.Id)
+ .ToDictionary(g => g.Key, g => g.First().IdTelemetry!.Value);
+
+ var idsWells = wells.Keys;
+ var idsTelemetries = wells.Values;
+ var telemetries = wells.ToDictionary(wt => wt.Value, wt => wt.Key);
+
+ var factWellOperationsQuery = db.WellOperations
+ .Where(o => idsWells.Contains(o.IdWell))
+ .Where(o => o.IdType == 1)
+ .Where(o => WellOperationCategory.MechanicalDrillingSubIds.Contains(o.IdCategory))
+ .Include(o => o.WellSectionType)
+ .AsNoTracking();
+
+ if (request.DateStartUTC.HasValue && request.DateEndUTC.HasValue)
+ factWellOperationsQuery = factWellOperationsQuery
+ .Where(o => o.DateStart.AddHours(o.DurationHours) > request.DateStartUTC && o.DateStart < request.DateEndUTC);
+
+ var factWellOperations = await factWellOperationsQuery.ToArrayAsync(token);
+
+ var sections = factWellOperations
+ .GroupBy(o => new { o.IdWell, o.IdWellSectionType })
+ .Select(g => new
+ {
+ g.Key.IdWell,
+ g.Key.IdWellSectionType,
+ DepthStart = g.Min(o => o.DepthStart),
+ DepthEnd = g.Max(o => o.DepthEnd),
+ g.First().WellSectionType.Caption
+ });
+
+ var detectedOperationsQuery = db.DetectedOperations
+ .Where(o => idsTelemetries.Contains(o.IdTelemetry))
+ .Where(o => o.IdCategory == WellOperationCategory.IdSlipsTime)
+ .AsNoTracking();
+
+ if (request.DateStartUTC.HasValue && request.DateEndUTC.HasValue)
+ detectedOperationsQuery = detectedOperationsQuery
+ .Where(o => o.DateStart < request.DateEndUTC)
+ .Where(o => o.DateEnd > request.DateStartUTC);
+
+ if (request.DurationMinutesMin.HasValue)
{
- this.db = db;
+ var durationMinutesMin = TimeSpan.FromMinutes(request.DurationMinutesMin.Value);
+ detectedOperationsQuery = detectedOperationsQuery
+ .Where(o => o.DateEnd - o.DateStart >= durationMinutesMin);
}
- public async Task> GetAllAsync(OperationStatRequest request, CancellationToken token)
+ if (request.DurationMinutesMax.HasValue)
{
- if (request.DateStartUTC.HasValue)
- request.DateStartUTC = DateTime.SpecifyKind(request.DateStartUTC.Value, DateTimeKind.Utc);
+ var durationMinutesMax = TimeSpan.FromMinutes(request.DurationMinutesMax.Value);
+ detectedOperationsQuery = detectedOperationsQuery
+ .Where(o => o.DateEnd - o.DateStart <= durationMinutesMax);
+ }
- if (request.DateEndUTC.HasValue)
- request.DateEndUTC = DateTime.SpecifyKind(request.DateEndUTC.Value, DateTimeKind.Utc);
+ var detectedOperations = await detectedOperationsQuery
+ .ToArrayAsync(token);
- var schedulesQuery = db.Schedule
- .Include(s => s.Well)
- .Include(s => s.Driller)
- .AsNoTracking();
-
- if (request.DateStartUTC.HasValue && request.DateEndUTC.HasValue)
- schedulesQuery = schedulesQuery.
- Where(s => s.DrillStart >= request.DateStartUTC && s.DrillEnd <= request.DateEndUTC);
-
- var schedules = await schedulesQuery.ToArrayAsync(token);
-
- var wells = schedules
- .Select(d => d.Well)
- .Where(well => well.IdTelemetry != null)
- .GroupBy(w => w.Id)
- .ToDictionary(g => g.Key, g => g.First().IdTelemetry!.Value);
-
- var idsWells = wells.Keys;
- var idsTelemetries = wells.Values;
- var telemetries = wells.ToDictionary(wt => wt.Value, wt => wt.Key);
-
- var factWellOperationsQuery = db.WellOperations
- .Where(o => idsWells.Contains(o.IdWell))
- .Where(o => o.IdType == 1)
- .Where(o => WellOperationCategory.MechanicalDrillingSubIds.Contains(o.IdCategory))
- .Include(o => o.WellSectionType)
- .AsNoTracking();
-
- if (request.DateStartUTC.HasValue && request.DateEndUTC.HasValue)
- factWellOperationsQuery = factWellOperationsQuery
- .Where(o => o.DateStart.AddHours(o.DurationHours) > request.DateStartUTC && o.DateStart < request.DateEndUTC);
-
- var factWellOperations = await factWellOperationsQuery.ToArrayAsync(token);
-
- var sections = factWellOperations
- .GroupBy(o => new { o.IdWell, o.IdWellSectionType })
- .Select(g => new
- {
- g.Key.IdWell,
- g.Key.IdWellSectionType,
- DepthStart = g.Min(o => o.DepthStart),
- DepthEnd = g.Max(o => o.DepthEnd),
- g.First().WellSectionType.Caption
- });
-
- var detectedOperationsQuery = db.DetectedOperations
- .Where(o => idsTelemetries.Contains(o.IdTelemetry))
- .Where(o => o.IdCategory == WellOperationCategory.IdSlipsTime)
- .AsNoTracking();
-
- if (request.DateStartUTC.HasValue && request.DateEndUTC.HasValue)
- detectedOperationsQuery = detectedOperationsQuery
- .Where(o => o.DateStart < request.DateEndUTC)
- .Where(o => o.DateEnd > request.DateStartUTC);
-
- if (request.DurationMinutesMin.HasValue)
+ var detectedOperationsGroupedByDrillerAndSection = detectedOperations.Select(o => new
+ {
+ Operation = o,
+ IdWell = telemetries[o.IdTelemetry],
+ schedules.FirstOrDefault(s =>
+ s.IdWell == telemetries[o.IdTelemetry]
+ && s.DrillStart <= o.DateStart
+ && s.DrillEnd >= o.DateStart
+ && new TimeDto(s.ShiftStart) <= new TimeDto(o.DateStart.DateTime)
+ && new TimeDto(s.ShiftEnd) >= new TimeDto(o.DateStart.DateTime))
+ ?.Driller,
+ Section = sections.FirstOrDefault(s =>
+ s.IdWell == telemetries[o.IdTelemetry]
+ && s.DepthStart <= o.DepthStart
+ && s.DepthEnd >= o.DepthStart)
+ })
+ .Where(o => o.Driller != null)
+ .Where(o => o.Section != null)
+ .Select(o => new
{
- var durationMinutesMin = new TimeSpan(0, request.DurationMinutesMin.Value, 0);
- detectedOperationsQuery = detectedOperationsQuery
- .Where(o => o.DateEnd - o.DateStart >= durationMinutesMin);
- }
- if (request.DurationMinutesMax.HasValue)
- {
- var durationMinutesMax = new TimeSpan(0, request.DurationMinutesMax.Value, 0);
- detectedOperationsQuery = detectedOperationsQuery
- .Where(o => o.DateEnd - o.DateStart <= durationMinutesMax);
- }
+ o.Operation,
+ o.IdWell,
+ Driller = o.Driller!,
+ Section = o.Section!
+ })
+ .GroupBy(o => new { o.Driller.Id, o.Section.IdWellSectionType });
- var detectedOperations = await detectedOperationsQuery
- .ToArrayAsync(token);
- var detectedOperationsGroupedByDrillerAndSection = detectedOperations.Select(o => new
+ var factWellOperationsGroupedByDrillerAndSection = factWellOperations
+ .Select(o => new
{
Operation = o,
- IdWell = telemetries[o.IdTelemetry],
schedules.FirstOrDefault(s =>
- s.IdWell == telemetries[o.IdTelemetry]
+ s.IdWell == o.IdWell
&& s.DrillStart <= o.DateStart
&& s.DrillEnd >= o.DateStart
&& new TimeDto(s.ShiftStart) <= new TimeDto(o.DateStart.DateTime)
&& new TimeDto(s.ShiftEnd) >= new TimeDto(o.DateStart.DateTime))
?.Driller,
- Section = sections.FirstOrDefault(s =>
- s.IdWell == telemetries[o.IdTelemetry]
- && s.DepthStart <= o.DepthStart
- && s.DepthEnd >= o.DepthStart)
})
- .Where(o => o.Driller != null)
- .Where(o => o.Section != null)
- .Select(o => new
- {
- o.Operation,
- o.IdWell,
- Driller = o.Driller!,
- Section = o.Section!
- })
- .GroupBy(o => new { o.Driller.Id, o.Section.IdWellSectionType });
+ .Where(o => o.Driller != null)
+ .GroupBy(o => new { o.Driller!.Id, o.Operation.IdWellSectionType });
- var factWellOperationsGroupedByDrillerAndSection = factWellOperations
- .Select(o => new
- {
- Operation = o,
- schedules.FirstOrDefault(s =>
- s.IdWell == o.IdWell
- && s.DrillStart <= o.DateStart
- && s.DrillEnd >= o.DateStart
- && new TimeDto(s.ShiftStart) <= new TimeDto(o.DateStart.DateTime)
- && new TimeDto(s.ShiftEnd) >= new TimeDto(o.DateStart.DateTime))
- ?.Driller,
- })
- .Where(o => o.Driller != null)
- .GroupBy(o => new { o.Driller!.Id, o.Operation.IdWellSectionType });
+ var stats = detectedOperationsGroupedByDrillerAndSection.Select(group => new SlipsStatDto
+ {
+ DrillerName = $"{group.First().Driller!.Name} {group.First().Driller!.Patronymic} {group.First().Driller!.Surname}",
+ SlipsCount = group.Count(),
+ SlipsTimeInMinutes = group
+ .Sum(y => (y.Operation.DateEnd - y.Operation.DateStart).TotalMinutes),
+ SectionDepth = factWellOperationsGroupedByDrillerAndSection
+ .Where(o => o.Key.Id == group.Key.Id)
+ .Where(o => o.Key.IdWellSectionType == group.Key.IdWellSectionType)
+ .Sum(o => o.Max(op => op.Operation.DepthEnd) - o.Min(op => op.Operation.DepthStart)),
+ SectionCaption = group.First().Section.Caption,
+ WellCount = group.GroupBy(g => g.IdWell).Count(),
+ });
-
- var stats = detectedOperationsGroupedByDrillerAndSection.Select(group => new SlipsStatDto
- {
- DrillerName = $"{group.First().Driller!.Name} {group.First().Driller!.Patronymic} {group.First().Driller!.Surname}",
- SlipsCount = group.Count(),
- SlipsTimeInMinutes = group
- .Sum(y => (y.Operation.DateEnd - y.Operation.DateStart).TotalMinutes),
- SectionDepth = factWellOperationsGroupedByDrillerAndSection
- .Where(o => o.Key.Id == group.Key.Id)
- .Where(o => o.Key.IdWellSectionType == group.Key.IdWellSectionType)
- .Sum(o => o.Max(op => op.Operation.DepthEnd) - o.Min(op => op.Operation.DepthStart)),
- SectionCaption = group.First().Section.Caption,
- WellCount = group.GroupBy(g => g.IdWell).Count(),
- });
-
- return stats;
- }
+ return stats;
}
}
\ No newline at end of file