From 6eb118e9f62c5cedb8d4b3e501ff559a45a332cf Mon Sep 17 00:00:00 2001 From: Frolov-Nikita Date: Wed, 4 Oct 2023 09:15:28 +0500 Subject: [PATCH] =?UTF-8?q?#15287262=20=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D0=BB=20OperationStatRequest.DurationMinutes*=20double?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/OperationStatRequest.cs | 10 +- .../Services/SlipsStatService.cs | 253 +++++++++--------- 2 files changed, 130 insertions(+), 133 deletions(-) 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