From 74901407c08a3a361e04813eaeb286ee6ae973d3 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Fri, 19 Aug 2022 00:00:30 +0500 Subject: [PATCH] -correction sql parameter on Background service -revision TRIM function on SubsystemOperationTimeService --- ...SubsystemOperationTimeBackgroundService.cs | 17 ++++--- .../SubsystemOperationTimeService.cs | 50 ++++++++++++------- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index bc8ae683..5885f8a1 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -3,6 +3,7 @@ using AsbCloudDb.Model.Subsystems; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; +using Npgsql; using System; using System.Collections.Generic; using System.Data; @@ -108,12 +109,12 @@ namespace AsbCloudInfrastructure.Services.Subsystems $"select tt.date, tt.mode, tt.well_depth" + $" from (select date, mode, well_depth, lag(mode,1) over (order by date) as mode_prev" + $" from t_telemetry_data_saub where id_telemetry = @idTelemetry) as tt" + - $" where tt.mode != tt.mode_prev and tt.date >=@begin order by tt.date;"; - using var command = db.Database.GetDbConnection().CreateCommand(); + $" where tt.mode != tt.mode_prev and tt.date >= @begin order by tt.date;"; + using var command = db.Database.GetDbConnection().CreateCommand(); command.CommandText = operationTimeSaub; - SqlParameter telemetry = new SqlParameter("@idTelemetry", idTelemetry); + var telemetry = new NpgsqlParameter("@idTelemetry", idTelemetry); command.Parameters.Add(telemetry); - SqlParameter dateStart = new SqlParameter("@begin", begin); + var dateStart = new NpgsqlParameter("@begin", begin); command.Parameters.Add(dateStart); db.Database.OpenConnection(); using var result = await command.ExecuteReaderAsync(token); @@ -169,15 +170,15 @@ namespace AsbCloudInfrastructure.Services.Subsystems var operationTimeSpinWithDepth = $"select tspin.\"date\", tspin.\"mode\", tspin.\"state\", tsaub.\"well_depth\"" + $" from (select \"date\" ,\"mode\" ,lag(mode, 1) over (order by \"date\") as mode_pre, state , " + - $"lag(state, 1) over (order by \"date\") as state_pre from t_telemetry_data_spin where id_telemetry = {idTelemetry} and date >= '{begin}') as tspin " + - $"join (select \"date\", well_depth from t_telemetry_data_saub where id_telemetry = {idTelemetry} and date >= '{begin}') as tsaub " + + $"lag(state, 1) over (order by \"date\") as state_pre from t_telemetry_data_spin where id_telemetry = @idTelemetry and date >= @begin) as tspin " + + $"join (select \"date\", well_depth from t_telemetry_data_saub where id_telemetry = @idTelemetry and date >= @begin) as tsaub " + $"on EXTRACT(EPOCH from tspin.date) = EXTRACT(EPOCH from tsaub.date) " + $"where mode!=mode_pre or state != state_pre order by \"date\";"; using var command = db.Database.GetDbConnection().CreateCommand(); command.CommandText = operationTimeSpinWithDepth; - SqlParameter telemetry = new SqlParameter("@idTelemetry", idTelemetry); + var telemetry = new NpgsqlParameter("@idTelemetry", idTelemetry); command.Parameters.Add(telemetry); - SqlParameter dateStart = new SqlParameter("@begin", begin); + var dateStart = new NpgsqlParameter("@begin", begin); command.Parameters.Add(dateStart); db.Database.OpenConnection(); using var result = await command.ExecuteReaderAsync(token); diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index c252a21a..22de29ac 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -28,7 +28,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems this.db = db; this.wellService = wellService; this.subsystemService = subsystemService; - } + } public async Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token) { var well = await wellService.GetOrDefaultAsync(request.IdWell, token); @@ -48,8 +48,8 @@ namespace AsbCloudInfrastructure.Services.Subsystems return null; var query = BuildQuery(request); if (query is null) - return null; - if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeInner) + return null; + if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeInner) { if (request.GtDate is not null) query = query.Where(o => o.DateStart >= request.GtDate.Value || o.DateEnd >= request.GtDate.Value); @@ -59,13 +59,17 @@ namespace AsbCloudInfrastructure.Services.Subsystems } if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeTrim) { - var begin = request.GtDate ?? query.Min(d => d.DateStart).UtcDateTime; - var end = request.LtDate ?? query.Max(d => d.DateEnd).UtcDateTime; + if (!request.GtDate.HasValue) + throw new ArgumentNullException(nameof(request.GtDate)); + var begin = request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); + if (!request.LtDate.HasValue) + throw new ArgumentNullException(nameof(request.LtDate)); + var end = request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); var data = query.ToList(); data = Trim(data, begin, end); return data.Select(o => Convert(o, well)); } - var dtos = query.Select(o => Convert(o,well)); + var dtos = query.Select(o => Convert(o, well)); return dtos; } public async Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token) @@ -77,25 +81,29 @@ namespace AsbCloudInfrastructure.Services.Subsystems var statList = CalcStat(data, request); return statList; } - private List Trim(List data, DateTime gtDate, DateTime ltDate) - { - var itemsToTrim = data.Where(q => - (q.DateStart >= gtDate && q.DateStart <= ltDate)|| - (q.DateEnd >= gtDate && q.DateEnd <= ltDate)) + private List Trim(List data, DateTimeOffset gtDate, DateTimeOffset ltDate) + { + var ItemsNormal = data.Where(q => + (q.DateStart >= gtDate) && (q.DateEnd <= ltDate)).ToList(); + var itemsToTrim = data.Where(q => + (q.DateStart < gtDate && q.DateEnd <= ltDate && q.DateEnd > gtDate) || + (q.DateStart >= gtDate && q.DateEnd > ltDate && q.DateStart < ltDate) || + (q.DateStart < gtDate && q.DateEnd > ltDate)) .Select(o => new SubsystemOperationTime { Id = o.Id, - DateStart = gtDate < o.DateStart ? gtDate : o.DateStart, - DateEnd = ltDate > o.DateEnd ? ltDate : o.DateEnd, + DateStart = (o.DateStart >= gtDate) && (o.DateStart <= ltDate) ? o.DateStart : gtDate, + DateEnd = (o.DateEnd >= gtDate) && (o.DateEnd <= ltDate) ? o.DateEnd : ltDate, IdSubsystem = o.IdSubsystem, IdTelemetry = o.IdTelemetry, - DepthEnd = ltDate>o.DateEnd ? null : o.DepthEnd, - DepthStart = gtDate < o.DateStart ? null : o.DepthStart, + DepthEnd = (o.DateEnd >= gtDate) && (o.DateEnd <= ltDate) ? o.DepthEnd : null , + DepthStart = (o.DateStart >= gtDate) && (o.DateStart <= ltDate) ? o.DepthStart : null, Subsystem = o.Subsystem, Telemetry = o.Telemetry }) .ToList(); - return itemsToTrim; + ItemsNormal.AddRange(itemsToTrim); + return ItemsNormal.OrderBy(o => o.DateStart).ToList(); } private IEnumerable CalcStat(IEnumerable listOperationTimeSubsystems, SubsystemOperationTimeRequest request) { @@ -137,11 +145,15 @@ namespace AsbCloudInfrastructure.Services.Subsystems query = query.Where(o => request.IdsSubsystems.Contains(o.IdSubsystem)); - if (request.GtDate is not null) - + if (request.GtDate is not null && request.LtDate is not null) + { + query = query.Where(o => (o.DateStart >= request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours)) + ||(o.DateEnd <= request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours))); + } + else if (request.GtDate is not null) query = query.Where(o => o.DateStart >= request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours)); - if (request.LtDate is not null) + else if (request.LtDate is not null) query = query.Where(o => o.DateEnd <= request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours));