using System; using System.Linq; using AsbCloudApp.Data; using AsbCloudApp.Services; using AsbCloudInfrastructure.Services.Cache; using AsbCloudDb.Model; using System.Collections.Generic; namespace AsbCloudInfrastructure.Services { public class AnalyticsService : IAnalyticsService { private readonly IAsbCloudDbContext db; private readonly ITelemetryService telemetryService; private readonly CacheTable cacheTelemetry; public AnalyticsService(IAsbCloudDbContext db, ITelemetryService telemetryService, CacheDb cacheDb) { this.db = db; this.telemetryService = telemetryService; cacheTelemetry = cacheDb.GetCachedTable((AsbCloudDbContext)db); } public IEnumerable GetWellDepthToDay(int wellId) { var telemetry = telemetryService.GetTelemetryByWellId(wellId); if (telemetry is null) return null; var depthToTimeData = (from d in db.DataSaubBases where d.IdTelemetry == telemetry.Id select new { d.Id, d.WellDepth, d.BitDepth, d.Date }); var m = (int)Math.Round(1d * depthToTimeData.Count() / 2048); if (m > 1) depthToTimeData = depthToTimeData.Where(d => d.Id % m == 0); return depthToTimeData.Select(d => new WellDepthToDayDto { WellDepth = d.WellDepth, BitDepth = d.BitDepth, Date = d.Date }).ToList(); } public IEnumerable GetWellDepthToInterval(int wellId, int intervalHours = 24, int intervalMinutes = 0, int workBeginHour = 8, int workBeginMinutes = 0) { var intervalTime = new TimeSpan(intervalHours, intervalMinutes, 0) == default ? new TimeSpan(24, 0, 0) : new TimeSpan(intervalHours, intervalMinutes, 0); var workDayBeginTime = new TimeSpan(workBeginHour, workBeginMinutes, 0) == default ? new TimeSpan(8, 0, 0) : new TimeSpan(intervalHours, intervalMinutes, 0); ; var telemetry = telemetryService.GetTelemetryByWellId(wellId); if (telemetry is null) return null; var timezoneOffset = cacheTelemetry.FirstOrDefault(t => t.Id == telemetry.Id).Info.TimeZoneOffsetTotalHours; var drillingPeriodsInfo = db.GetDepthToInterval(telemetry.Id, (int)intervalTime.TotalSeconds, (int)workDayBeginTime.TotalSeconds, timezoneOffset); var wellDepthToIntervalData = drillingPeriodsInfo.Select(d => new WellDepthToIntervalDto { IntervalStartDate = d.Item3, IntervalDepthProgress = (d.Item2 - d.Item1) ?? 0.0 / intervalHours }).OrderBy(d => d.IntervalStartDate).ToList(); return wellDepthToIntervalData; } public IEnumerable GetOperationsSummary(int wellId, DateTime begin = default, DateTime end = default) { return new List { new OperationPercentageDto { ProcessName = "Роторное бурение", Percentage = 19.7 }, new OperationPercentageDto { ProcessName = "Подъем с проработкой", Percentage = 6.2 }, new OperationPercentageDto { ProcessName = "Спуск с проработкой", Percentage = 9.4 }, new OperationPercentageDto { ProcessName = "Подъем с промывкой", Percentage = 18.4 }, new OperationPercentageDto { ProcessName = "Неподвижное состояние", Percentage = 12.1 }, new OperationPercentageDto { ProcessName = "Вращение без циркуляции", Percentage = 7.4 }, new OperationPercentageDto { ProcessName = "Спуск в скважину", Percentage = 16.7 }, new OperationPercentageDto { ProcessName = "На поверхности", Percentage = 10.1 } }; } public IEnumerable GetOperationsToTime(int wellId, DateTime begin = default, DateTime end = default) { return new List { new OperationInfoDto { IntervalBegin = new DateTime(2021, 06, 01, 08, 00, 00), IntervalEnd = new DateTime(2021, 06, 02, 08, 00, 00), OperationData = new List { new OperationDetailsDto { OperationName = "Роторное бурение", OperationStartTime = new DateTime(2021, 06, 01, 10, 00, 00), DurationHours = 1.2 }, new OperationDetailsDto { OperationName = "Подъем с проработкой", OperationStartTime = new DateTime(2021, 06, 01, 11, 00, 00), DurationHours = 3.2 }, new OperationDetailsDto { OperationName = "Роторное бурение", OperationStartTime = new DateTime(2021, 06, 01, 12, 00, 00), DurationHours = 1.5 }, new OperationDetailsDto { OperationName = "Неподвижное состояние", OperationStartTime = new DateTime(2021, 06, 01, 13, 00, 00), DurationHours = 0.2 }, new OperationDetailsDto { OperationName = "Роторное бурение", OperationStartTime = new DateTime(2021, 06, 01, 14, 00, 00), DurationHours = 3.2 } } }, new OperationInfoDto { IntervalBegin = new DateTime(2021, 06, 02, 08, 00, 00), IntervalEnd = new DateTime(2021, 06, 03, 08, 00, 00), OperationData = new List { new OperationDetailsDto { OperationName = "На поверхности", OperationStartTime = new DateTime(2021, 06, 13, 10, 01, 00), DurationHours = 2.2 }, new OperationDetailsDto { OperationName = "Спуск в скважину", OperationStartTime = new DateTime(2021, 06, 13, 11, 10, 00), DurationHours = 0.4 }, new OperationDetailsDto { OperationName = "На поверхности", OperationStartTime = new DateTime(2021, 06, 13, 12, 20, 00), DurationHours = 2.5 }, new OperationDetailsDto { OperationName = "Вращение без циркуляции", OperationStartTime = new DateTime(2021, 06, 13, 13, 00, 00), DurationHours = 1.2 }, new OperationDetailsDto { OperationName = "Роторное бурение", OperationStartTime = new DateTime(2021, 06, 13, 14, 00, 00), DurationHours = 5.2 } } }, new OperationInfoDto { IntervalBegin = new DateTime(2021, 06, 03, 08, 00, 00), IntervalEnd = new DateTime(2021, 06, 04, 08, 00, 00), OperationData = new List { new OperationDetailsDto { OperationName = "Подъем с проработкой", OperationStartTime = new DateTime(2021, 06, 12, 10, 00, 00), DurationHours = 3.2 }, new OperationDetailsDto { OperationName = "Спуск с проработкой", OperationStartTime = new DateTime(2021, 06, 12, 11, 00, 00), DurationHours = 1.4 }, new OperationDetailsDto { OperationName = "Подъем с проработкой", OperationStartTime = new DateTime(2021, 06, 12, 12, 00, 00), DurationHours = 0.5 }, new OperationDetailsDto { OperationName = "На поверхности", OperationStartTime = new DateTime(2021, 06, 12, 13, 00, 00), DurationHours = 3.2 }, new OperationDetailsDto { OperationName = "Роторное бурение", OperationStartTime = new DateTime(2021, 06, 13, 14, 00, 00), DurationHours = 1.2 } } } }; } } }