From 40a3d3ab50472c41045510d63635247be1658bcc Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 6 Apr 2023 10:25:51 +0500 Subject: [PATCH] Debugged --- .../Data/ProcessMap/ProcessMapReportDto.cs | 4 +- .../ProcessMap/ProcessMapReportParamsDto.cs | 10 +- AsbCloudApp/Services/IProcessMapService.cs | 2 +- .../ProcessMapReportMakerService.cs | 6 +- .../ProcessMap/ProcessMapReportService.cs | 137 ++++++++++++------ .../Controllers/ProcessMapController.cs | 2 +- AsbCloudWebApi/Rest/ProcessMap.http | 1 + 7 files changed, 99 insertions(+), 63 deletions(-) diff --git a/AsbCloudApp/Data/ProcessMap/ProcessMapReportDto.cs b/AsbCloudApp/Data/ProcessMap/ProcessMapReportDto.cs index 9e753c01..e9192d2c 100644 --- a/AsbCloudApp/Data/ProcessMap/ProcessMapReportDto.cs +++ b/AsbCloudApp/Data/ProcessMap/ProcessMapReportDto.cs @@ -79,7 +79,7 @@ namespace AsbCloudApp.Data.ProcessMap /// /// Ограничение скорости, м/ч /// - public ProcessMapReportParamsDto SpeedL​imit { get; set; } = new(); + public ProcessMapReportParamsDto SpeedLimit { get; set; } = new(); /// /// Процент использования системы АПД, % @@ -89,6 +89,6 @@ namespace AsbCloudApp.Data.ProcessMap /// /// Фактическая механическая скорость, м/ч /// - public double Rop { get; set; } + public double? Rop { get; set; } } } diff --git a/AsbCloudApp/Data/ProcessMap/ProcessMapReportParamsDto.cs b/AsbCloudApp/Data/ProcessMap/ProcessMapReportParamsDto.cs index da002d5c..175de955 100644 --- a/AsbCloudApp/Data/ProcessMap/ProcessMapReportParamsDto.cs +++ b/AsbCloudApp/Data/ProcessMap/ProcessMapReportParamsDto.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AsbCloudApp.Data.ProcessMap +namespace AsbCloudApp.Data.ProcessMap { /// /// Параметры РТК @@ -34,6 +28,6 @@ namespace AsbCloudApp.Data.ProcessMap /// /// Процент бурения по уставке, % /// - public double? PercDrillingBySetpoint { get; set; } + public double? SetpointUsage { get; set; } } } diff --git a/AsbCloudApp/Services/IProcessMapService.cs b/AsbCloudApp/Services/IProcessMapService.cs index 954d899a..d405869a 100644 --- a/AsbCloudApp/Services/IProcessMapService.cs +++ b/AsbCloudApp/Services/IProcessMapService.cs @@ -16,6 +16,6 @@ namespace AsbCloudApp.Services /// /// /// - Task> GetProcessMapAsync(int idWell, CancellationToken token); + Task> GetProcessMapReportAsync(int idWell, CancellationToken token); } } diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportMakerService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportMakerService.cs index 8e444a08..71faec0e 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportMakerService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportMakerService.cs @@ -29,7 +29,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap var stream = GetExcelTemplateStream(); using var workbook = new XLWorkbook(stream, XLEventTracking.Disabled); - var data = await processMapService.GetProcessMapAsync(idWell, token); + var data = await processMapService.GetProcessMapReportAsync(idWell, token); FillProcessMapToWorkbook(workbook, data); @@ -168,7 +168,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap .SetVal(dataParam.Limit); sheet.Cell(row, column + columnOffsetPercent) - .SetVal(dataParam.PercDrillingBySetpoint); + .SetVal(dataParam.SetpointUsage); } private static void FillIntervalModeDataSpeed(IXLWorksheet sheet, ProcessMapReportParamsDto dataParam, int column, int row) @@ -192,7 +192,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap .SetVal(dataParam.Limit); sheet.Cell(row, column + columnOffsetPercent) - .SetVal(dataParam.PercDrillingBySetpoint); + .SetVal(dataParam.SetpointUsage); } private static Stream GetExcelTemplateStream() diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs index 9cd788a8..1a444f32 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs @@ -32,7 +32,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap } /// - public async Task> GetProcessMapAsync(int idWell, CancellationToken token) + public async Task> GetProcessMapReportAsync(int idWell, CancellationToken token) { var well = wellService.GetOrDefault(idWell) ?? throw new ArgumentInvalidException("idWell not found", nameof(idWell)); @@ -56,10 +56,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap private IEnumerable CalcByIntervals(IEnumerable processMapPlan, TelemetryDataSaubStatDto[] telemetryDataStat) { - var processMapIntervals = processMapPlan - .Select(p => (p.DepthStart, p.DepthEnd)) - .Distinct() - .OrderBy(i => i.DepthStart); + var processMapIntervals = CalcDepthIntervals(processMapPlan); var result = new List(processMapIntervals.Count() * 4); @@ -75,6 +72,8 @@ namespace AsbCloudInfrastructure.Services.ProcessMap .Where(p => p.DepthStart >= interval.DepthStart && p.DepthEnd <= interval.DepthEnd); var telemetryIndexEnd = Array.FindIndex(telemetryDataStat, telemetryIndexStart, t => t.WellDepthMin >= interval.DepthEnd); + if (telemetryIndexEnd < 0) + telemetryIndexEnd = telemetryDataStat.Length - 1; var telemetryDataInterval = telemetryDataStat.AsSpan(telemetryIndexStart, telemetryIndexEnd - telemetryIndexStart); IEnumerable subIntervalsResult = CalcSubIntervals(interval, processMapPlanInterval, telemetryDataInterval, sectionTypes); @@ -86,7 +85,24 @@ namespace AsbCloudInfrastructure.Services.ProcessMap return result; } - private IEnumerable CalcSubIntervals( + private static IEnumerable<(double DepthStart, double DepthEnd)> CalcDepthIntervals(IEnumerable processMapPlan) + { + if(!processMapPlan.Any()) + yield break; + + var intervalStarts = processMapPlan + .OrderBy(i => i.DepthStart) + .Select(p => p.DepthStart) + .Distinct() + .ToArray(); + + for (var i = 1; i < intervalStarts.Length; i++) + yield return (intervalStarts[i - 1], intervalStarts[i]); + + yield return (intervalStarts[^1], processMapPlan.Max(p=>p.DepthEnd)); + } + + private static IEnumerable CalcSubIntervals( (double DepthStart, double DepthEnd) interval, IEnumerable processMapPlanInterval, Span telemetryDataInterval, @@ -100,14 +116,17 @@ namespace AsbCloudInfrastructure.Services.ProcessMap var telemetryIndexStart = 0; var subInterval = interval; - for (var i = telemetryIndexStart; i < telemetryDataIntervalLength; i++) + for (var i = telemetryIndexStart + 1; i < telemetryDataIntervalLength; i++) { - if (!IsSimilar(telemetryDataInterval[telemetryIndexStart], telemetryDataInterval[i])) + if (IsDifferent(telemetryDataInterval[telemetryIndexStart], telemetryDataInterval[i])) { - subInterval.DepthEnd = telemetryDataInterval[i].WellDepthMax; - - var intervalReportRow = CalcSubIntervalReportRow(subInterval, processMapPlanInterval, telemetryDataInterval[telemetryIndexStart..i], sectionTypes); - result.Add(intervalReportRow); + subInterval.DepthEnd = telemetryDataInterval[i - 1].WellDepthMax; + var telemetryRowSpan = telemetryDataInterval[telemetryIndexStart..(i - 1)]; + if (!telemetryRowSpan.IsEmpty) + { + var intervalReportRow = CalcSubIntervalReportRow(subInterval, processMapPlanInterval, telemetryRowSpan, sectionTypes); + result.Add(intervalReportRow); + } telemetryIndexStart = i; subInterval.DepthStart = subInterval.DepthEnd; } @@ -119,7 +138,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap return result; } - private ProcessMapReportDto CalcSubIntervalReportRow( + private static ProcessMapReportDto CalcSubIntervalReportRow( (double DepthStart, double DepthEnd) subInterval, IEnumerable processMap, Span telemetryRowSpan, @@ -149,10 +168,10 @@ namespace AsbCloudInfrastructure.Services.ProcessMap DeltaDepth = telemetryLast.WellDepthMax - telemetryFirst.WellDepthMin, - PressureDiff = telemetryStat.Pressure.MakeParams(processMapByMode?.Pressure.Plan), - AxialLoad = telemetryStat.AxialLoad.MakeParams(processMapByMode?.AxialLoad.Plan), - TopDriveTorque = telemetryStat.RotorTorque.MakeParams(processMapByMode?.TopDriveTorque.Plan), - SpeedL​imit = telemetryStat.BlockSpeed.MakeParams(processMapByMode?.RopPlan), + PressureDiff = telemetryStat.Pressure.MakeParams(processMapByMode?.Pressure.Plan, telemetryStat.SpUsageDepthTotal), + AxialLoad = telemetryStat.AxialLoad.MakeParams(processMapByMode?.AxialLoad.Plan, telemetryStat.SpUsageDepthTotal), + TopDriveTorque = telemetryStat.RotorTorque.MakeParams(processMapByMode?.TopDriveTorque.Plan, telemetryStat.SpUsageDepthTotal), + SpeedLimit = telemetryStat.BlockSpeed.MakeParams(processMapByMode?.RopPlan, telemetryStat.SpUsageDepthTotal), Rop = telemetryStat.Rop, Usage = telemetryStat.UsageSaub, @@ -194,32 +213,35 @@ namespace AsbCloudInfrastructure.Services.ProcessMap return (0, "Ручной"); } - private static bool IsSimilar(TelemetryDataSaubStatDto telemetry1, TelemetryDataSaubStatDto telemetry2) + private static bool IsDifferent(TelemetryDataSaubStatDto intervalStart, TelemetryDataSaubStatDto current) { - if (telemetry1.IdMode != telemetry2.IdMode) - return false; + if (intervalStart.WellDepthMin > current.WellDepthMin) + return true; - if (Math.Abs(telemetry1.PressureSp - telemetry2.PressureSp) > 5d) - return false; + if (intervalStart.IdMode != current.IdMode) + return true; - if (Math.Abs(telemetry1.AxialLoadSp - telemetry2.AxialLoadSp) > 1d) - return false; + if (Math.Abs(intervalStart.PressureSp - current.PressureSp) > 5d) + return true; - if (Math.Abs(telemetry1.RotorTorqueSp - telemetry2.RotorTorqueSp) > 5d) - return false; + if (Math.Abs(intervalStart.AxialLoadSp - current.AxialLoadSp) > 1d) + return true; - var blockSpeedSpDiff = Math.Abs(telemetry1.BlockSpeedSp - telemetry2.BlockSpeedSp); + if (Math.Abs(intervalStart.RotorTorqueSp - current.RotorTorqueSp) > 5d) + return true; + + var blockSpeedSpDiff = Math.Abs(intervalStart.BlockSpeedSp - current.BlockSpeedSp); if (blockSpeedSpDiff > 5d) { - if (telemetry1.BlockSpeedSp < 30) - return false; - else if (telemetry1.BlockSpeedSp > 30 && blockSpeedSpDiff > 15d) - return false; - else if (telemetry1.BlockSpeedSp > 80 && blockSpeedSpDiff > 20d) - return false; + if (intervalStart.BlockSpeedSp <= 30) + return true; + else if (intervalStart.BlockSpeedSp > 30 && blockSpeedSpDiff > 15d) + return true; + else if (intervalStart.BlockSpeedSp > 80 && blockSpeedSpDiff > 20d) + return true; } - return true; + return false; } } @@ -228,8 +250,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap { private double spWSum; private double pvWSum; - private double? limitMaxWSum; - private double spUsageDepth; + private double limitMaxWSum; private double deltaDepthSum; @@ -238,9 +259,11 @@ namespace AsbCloudInfrastructure.Services.ProcessMap private readonly Func? getterLimitMax; private readonly int idFeedRegulator; - + private TelemetryDataSaubStatDto? previous; + public double SpUsageDepth { get; private set; } + public ParamStat(Func getterSp, Func getterPv, Func? getterLimitMax, @@ -262,13 +285,22 @@ namespace AsbCloudInfrastructure.Services.ProcessMap var deltaDepthHalf = deltaDepth / 2; double CalculateWeight(Func getter) => (getter(previous!) + getter(current)) * deltaDepthHalf; - spWSum = CalculateWeight(getterSp); - pvWSum = CalculateWeight(getterPv); + spWSum += CalculateWeight(getterSp); + pvWSum += CalculateWeight(getterPv); if(getterLimitMax is not null) - limitMaxWSum = CalculateWeight(getterLimitMax!); + limitMaxWSum += CalculateWeight(getterLimitMax!); - if (current.IdFeedRegulator == idFeedRegulator) - spUsageDepth += deltaDepth; + if (current.IdFeedRegulator is not null) + { + if(current.IdFeedRegulator == idFeedRegulator) + SpUsageDepth += deltaDepth; + } + else + { + var pvErr = (getterSp(current) - getterPv(current)) / getterSp(current); + if (pvErr < 0.03d) //3% + SpUsageDepth += deltaDepth; + } deltaDepthSum += deltaDepth; } @@ -277,15 +309,22 @@ namespace AsbCloudInfrastructure.Services.ProcessMap previous = current; } - public ProcessMapReportParamsDto MakeParams(double? spPlan) + public ProcessMapReportParamsDto MakeParams(double? spPlan, double SpUsageDepthTotal) => new ProcessMapReportParamsDto { SetpointPlan = spPlan, - SetpointFact = spWSum / deltaDepthSum, - Fact = pvWSum / deltaDepthSum, - Limit = limitMaxWSum / deltaDepthSum, - PercDrillingBySetpoint = spUsageDepth / deltaDepthSum, + SetpointFact = DivideValByDepth(spWSum), + Fact = DivideValByDepth(pvWSum), + Limit = (getterLimitMax is not null) ? DivideValByDepth(limitMaxWSum) : null, + SetpointUsage = deltaDepthSum > 0d ? SpUsageDepth / SpUsageDepthTotal : null, }; + + private double? DivideValByDepth(double? val) + { + if(val is null || val == 0d || deltaDepthSum == 0d) + return null; + return val / deltaDepthSum; + } } class TelemetryStat { @@ -294,11 +333,13 @@ namespace AsbCloudInfrastructure.Services.ProcessMap public ParamStat RotorTorque {get; } public ParamStat BlockSpeed {get; } + public double SpUsageDepthTotal => Pressure.SpUsageDepth + AxialLoad.SpUsageDepth + RotorTorque.SpUsageDepth + BlockSpeed.SpUsageDepth; + private TelemetryDataSaubStatDto? previous; private double depthSum = 0d; private double hoursSum = 0d; - public double Rop => depthSum / hoursSum; + public double? Rop => hoursSum == 0d ? null : depthSum / hoursSum; private double depthWithSaub = 0d; public double UsageSaub => depthWithSaub / depthSum; diff --git a/AsbCloudWebApi/Controllers/ProcessMapController.cs b/AsbCloudWebApi/Controllers/ProcessMapController.cs index 3613f32c..e2a87c71 100644 --- a/AsbCloudWebApi/Controllers/ProcessMapController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMapController.cs @@ -122,7 +122,7 @@ namespace AsbCloudWebApi.Controllers [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public async Task GetDrillProcessMap(int wellId, CancellationToken token) { - var data = await processMapService.GetProcessMapAsync(wellId, token); + var data = await processMapService.GetProcessMapReportAsync(wellId, token); return Ok(data); } diff --git a/AsbCloudWebApi/Rest/ProcessMap.http b/AsbCloudWebApi/Rest/ProcessMap.http index 9a7d487e..48c0b582 100644 --- a/AsbCloudWebApi/Rest/ProcessMap.http +++ b/AsbCloudWebApi/Rest/ProcessMap.http @@ -11,3 +11,4 @@ GET {{baseUrl}}/api/processMap/getDrillProcessMap/{{wellId}} Content-Type: {{contentType}} accept: */* Authorization: {{auth}} +l \ No newline at end of file