-correction sql parameter on Background service

-revision TRIM function on SubsystemOperationTimeService
This commit is contained in:
eugeniy_ivanov 2022-08-19 00:00:30 +05:00
parent e62d9907cd
commit 74901407c0
2 changed files with 40 additions and 27 deletions

View File

@ -3,6 +3,7 @@ using AsbCloudDb.Model.Subsystems;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Npgsql;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
@ -111,9 +112,9 @@ namespace AsbCloudInfrastructure.Services.Subsystems
$" where tt.mode != tt.mode_prev and tt.date >= @begin order by tt.date;"; $" where tt.mode != tt.mode_prev and tt.date >= @begin order by tt.date;";
using var command = db.Database.GetDbConnection().CreateCommand(); using var command = db.Database.GetDbConnection().CreateCommand();
command.CommandText = operationTimeSaub; command.CommandText = operationTimeSaub;
SqlParameter telemetry = new SqlParameter("@idTelemetry", idTelemetry); var telemetry = new NpgsqlParameter("@idTelemetry", idTelemetry);
command.Parameters.Add(telemetry); command.Parameters.Add(telemetry);
SqlParameter dateStart = new SqlParameter("@begin", begin); var dateStart = new NpgsqlParameter("@begin", begin);
command.Parameters.Add(dateStart); command.Parameters.Add(dateStart);
db.Database.OpenConnection(); db.Database.OpenConnection();
using var result = await command.ExecuteReaderAsync(token); using var result = await command.ExecuteReaderAsync(token);
@ -169,15 +170,15 @@ namespace AsbCloudInfrastructure.Services.Subsystems
var operationTimeSpinWithDepth = var operationTimeSpinWithDepth =
$"select tspin.\"date\", tspin.\"mode\", tspin.\"state\", tsaub.\"well_depth\"" + $"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 , " + $" 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 " + $"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 " + $"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) " + $"on EXTRACT(EPOCH from tspin.date) = EXTRACT(EPOCH from tsaub.date) " +
$"where mode!=mode_pre or state != state_pre order by \"date\";"; $"where mode!=mode_pre or state != state_pre order by \"date\";";
using var command = db.Database.GetDbConnection().CreateCommand(); using var command = db.Database.GetDbConnection().CreateCommand();
command.CommandText = operationTimeSpinWithDepth; command.CommandText = operationTimeSpinWithDepth;
SqlParameter telemetry = new SqlParameter("@idTelemetry", idTelemetry); var telemetry = new NpgsqlParameter("@idTelemetry", idTelemetry);
command.Parameters.Add(telemetry); command.Parameters.Add(telemetry);
SqlParameter dateStart = new SqlParameter("@begin", begin); var dateStart = new NpgsqlParameter("@begin", begin);
command.Parameters.Add(dateStart); command.Parameters.Add(dateStart);
db.Database.OpenConnection(); db.Database.OpenConnection();
using var result = await command.ExecuteReaderAsync(token); using var result = await command.ExecuteReaderAsync(token);

View File

@ -59,8 +59,12 @@ namespace AsbCloudInfrastructure.Services.Subsystems
} }
if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeTrim) if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeTrim)
{ {
var begin = request.GtDate ?? query.Min(d => d.DateStart).UtcDateTime; if (!request.GtDate.HasValue)
var end = request.LtDate ?? query.Max(d => d.DateEnd).UtcDateTime; 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(); var data = query.ToList();
data = Trim(data, begin, end); data = Trim(data, begin, end);
return data.Select(o => Convert(o, well)); return data.Select(o => Convert(o, well));
@ -77,25 +81,29 @@ namespace AsbCloudInfrastructure.Services.Subsystems
var statList = CalcStat(data, request); var statList = CalcStat(data, request);
return statList; return statList;
} }
private List<SubsystemOperationTime> Trim(List<SubsystemOperationTime> data, DateTime gtDate, DateTime ltDate) private List<SubsystemOperationTime> Trim(List<SubsystemOperationTime> data, DateTimeOffset gtDate, DateTimeOffset ltDate)
{ {
var ItemsNormal = data.Where(q =>
(q.DateStart >= gtDate) && (q.DateEnd <= ltDate)).ToList();
var itemsToTrim = data.Where(q => var itemsToTrim = data.Where(q =>
(q.DateStart >= gtDate && q.DateStart <= ltDate)|| (q.DateStart < gtDate && q.DateEnd <= ltDate && q.DateEnd > gtDate) ||
(q.DateEnd >= gtDate && q.DateEnd <= ltDate)) (q.DateStart >= gtDate && q.DateEnd > ltDate && q.DateStart < ltDate) ||
(q.DateStart < gtDate && q.DateEnd > ltDate))
.Select(o => new SubsystemOperationTime .Select(o => new SubsystemOperationTime
{ {
Id = o.Id, Id = o.Id,
DateStart = gtDate < o.DateStart ? gtDate : o.DateStart, DateStart = (o.DateStart >= gtDate) && (o.DateStart <= ltDate) ? o.DateStart : gtDate,
DateEnd = ltDate > o.DateEnd ? ltDate : o.DateEnd, DateEnd = (o.DateEnd >= gtDate) && (o.DateEnd <= ltDate) ? o.DateEnd : ltDate,
IdSubsystem = o.IdSubsystem, IdSubsystem = o.IdSubsystem,
IdTelemetry = o.IdTelemetry, IdTelemetry = o.IdTelemetry,
DepthEnd = ltDate>o.DateEnd ? null : o.DepthEnd, DepthEnd = (o.DateEnd >= gtDate) && (o.DateEnd <= ltDate) ? o.DepthEnd : null ,
DepthStart = gtDate < o.DateStart ? null : o.DepthStart, DepthStart = (o.DateStart >= gtDate) && (o.DateStart <= ltDate) ? o.DepthStart : null,
Subsystem = o.Subsystem, Subsystem = o.Subsystem,
Telemetry = o.Telemetry Telemetry = o.Telemetry
}) })
.ToList(); .ToList();
return itemsToTrim; ItemsNormal.AddRange(itemsToTrim);
return ItemsNormal.OrderBy(o => o.DateStart).ToList();
} }
private IEnumerable<SubsystemStatDto> CalcStat(IEnumerable<SubsystemOperationTimeDto> listOperationTimeSubsystems, SubsystemOperationTimeRequest request) private IEnumerable<SubsystemStatDto> CalcStat(IEnumerable<SubsystemOperationTimeDto> listOperationTimeSubsystems, SubsystemOperationTimeRequest request)
{ {
@ -137,11 +145,15 @@ namespace AsbCloudInfrastructure.Services.Subsystems
query = query.Where(o => request.IdsSubsystems.Contains(o.IdSubsystem)); 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)); 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)); query = query.Where(o => o.DateEnd <= request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours));