diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index da9e63a3..b1f92eae 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -215,7 +215,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems private static async Task?> OperationTimeSpinAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) { - static int? GetSubsytemId(short mode, int state) + static int? GetSubsytemId(short? mode, int? state) { if (state == 7 && (mode & 2) > 0) return idSubsytemTorqueMaster; @@ -225,13 +225,22 @@ namespace AsbCloudInfrastructure.Services.Subsystems return null; } + static float GetDepthFromSaub(List rowsSaub, DateTimeOffset date) + { + float depth = 0; + for (int i = 0; i < rowsSaub.Count; i++) + { + if (date <= rowsSaub[i].Date) + depth = (float)rowsSaub[i].Depth; + } + return depth; + } - var query = + var querySpin = $"select " + $" tspin.date, " + $" tspin.mode, " + - $" tspin.state, " + - $" tsaub.well_depth " + + $" tspin.state " + $"from ( " + $" select " + $" date, " + @@ -241,42 +250,50 @@ namespace AsbCloudInfrastructure.Services.Subsystems $" lag(state, 1) over (order by date) as state_pre " + $" from t_telemetry_data_spin " + $" where id_telemetry = @idTelemetry and date >= @begin" + - $" order by date ) as tspin " + - $"left outer 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) " + + $" order by date ) as tspin " + $"where mode_pre is null or state_pre is null or mode != mode_pre or state != state_pre " + $"order by date;"; - + var saubDepthAndDate = await db.TelemetryDataSaub.Where(s => s.IdTelemetry == idTelemetry & s.DateTime >= begin) + .Select(s => new DataRow() + { + Date = s.DateTime, + Depth = s.WellDepth + }) + .OrderBy(s => s.Date) + .ToListAsync(token); var idTelemetryParam = new NpgsqlParameter("@idTelemetry", idTelemetry); var beginParam = new NpgsqlParameter("@begin", begin); await db.Database.OpenConnectionAsync(token); using var command = db.Database.GetDbConnection().CreateCommand(); - command.CommandText = query; + command.CommandText = querySpin; command.Parameters.Add(idTelemetryParam); command.Parameters.Add(beginParam); - using var result = await command.ExecuteReaderAsync(token); - var subsystemOperationTime = new List(32); - - if (result.Read()) + var dataRowList = new List(); + while (result.Read()) { - var mode = result.GetFieldValue(1); - var state = result.GetFieldValue(2); - var idSubsystem = GetSubsytemId(mode, state); - var dateStart = result.GetFieldValue(0); - var depthStart = result.GetFieldValue(3); - - while (result.Read()) + var dateRowItem = new DataRow() { - var dateEnd = result.GetFieldValue(0); - var depthEnd = result.GetFieldValue(3); + Date = result.GetFieldValue(0), + Mode = result.GetFieldValue(1), + State = result.GetFieldValue(2) + }; + dateRowItem.Depth = GetDepthFromSaub(saubDepthAndDate, dateRowItem.Date); + dataRowList.Add(dateRowItem); + } + if (dataRowList.Any()==true) + { + var mode = dataRowList[0].Mode; + var state = dataRowList[0].State; + var idSubsystem = GetSubsytemId(mode, state); + var dateStart = dataRowList[0].Date; + var depthStart = dataRowList[0].Depth; + for (int i = 1; i(1); - state = result.GetFieldValue(2); + mode = dataRowList[i].Mode; + state = dataRowList[i].State; idSubsystem = GetSubsytemId(mode, state); dateStart = dateEnd; depthStart = depthEnd; - } + } } return subsystemOperationTime; }