Move logic from AsbCloudDbContext.GetDepthToIntervalAsync() to TelemetryAnalyticsService.GetWellDepthToIntervalAsync()

This commit is contained in:
Фролов 2021-12-27 13:49:29 +05:00
parent ca969c99ad
commit e7d6aef6a6
5 changed files with 19 additions and 43 deletions

View File

@ -15,7 +15,7 @@ namespace AsbCloudApp.Services
Task<IEnumerable<WellDepthToDayDto>> GetWellDepthToDayAsync(int idWell,
CancellationToken token = default);
Task<IEnumerable<WellDepthToIntervalDto>> GetWellDepthToIntervalAsync(int idWell,
int intervalHoursTimestamp, int workBeginTimestamp,
int intervalHoursTimestamp, int shiftStartSec,
CancellationToken token = default);
Task<IEnumerable<TelemetryOperationDurationDto>> GetOperationsSummaryAsync(int idWell,
DateTime begin = default, DateTime end = default,

View File

@ -466,37 +466,5 @@ namespace AsbCloudDb.Model
});
}
public async Task<IEnumerable<(double? MinDepth, double? MaxDepth, DateTime BeginPeriodDate)>> GetDepthToIntervalAsync(int telemetryId,
int intervalHoursTimestamp, int workStartTimestamp, double timezoneOffset, CancellationToken token)
{
//TODO: Сменить на LINQ группирование
using var command = Database.GetDbConnection().CreateCommand();
command.CommandText = $@"SELECT Min(t.bit_depth) AS MinDepth, Max(t.bit_depth) AS MaxDepth, Min(t.Date) AS dateStart
FROM t_telemetry_data_saub AS t
WHERE id_telemetry = {telemetryId} AND t.Id % 10 = 0
GROUP BY floor((extract(epoch from t.date) - {workStartTimestamp} + {timezoneOffset}) / {intervalHoursTimestamp});";
Database.OpenConnection();
using var reader = await command.ExecuteReaderAsync(token);
var result = new List<(double? MinDepth, double? MaxDepth, DateTime BeginPeriodDate)>();
if (reader.HasRows)
{
while (reader.Read())
{
result.Add(
(
(double?)reader.GetValue(0),
(double?)reader.GetValue(1),
(DateTime)reader.GetValue(2)
));
}
}
return result;
}
}
}

View File

@ -50,7 +50,5 @@ namespace AsbCloudDb.Model
DbSet<TEntity> Set<TEntity>() where TEntity : class;
Task<IEnumerable<(double? MinDepth, double? MaxDepth, DateTime BeginPeriodDate)>> GetDepthToIntervalAsync(int telemetryId,
int intervalHoursTimestamp, int workStartTimestamp, double timezoneOffset, CancellationToken token);
}
}

View File

@ -61,7 +61,7 @@ namespace AsbCloudInfrastructure.Services.Analysis
}
public async Task<IEnumerable<WellDepthToIntervalDto>> GetWellDepthToIntervalAsync(int idWell,
int intervalSeconds, int workBeginSeconds, CancellationToken token = default)
int intervalSeconds, int shiftStartSec, CancellationToken token = default)
{
intervalSeconds = intervalSeconds == 0 ? 86400 : intervalSeconds;
@ -72,13 +72,23 @@ namespace AsbCloudInfrastructure.Services.Analysis
var timezoneOffset = telemetryService.GetTimezoneOffsetByTelemetryId((int)telemetryId);
var drillingPeriodsInfo = await db.GetDepthToIntervalAsync((int)telemetryId, intervalSeconds,
workBeginSeconds, timezoneOffset, token).ConfigureAwait(false);
var drillingPeriodsInfo = await db.TelemetryDataSaub
.Where(t => t.IdTelemetry == telemetryId)
.GroupBy(t => Math.Floor((((t.Date.DayOfYear * 24 + t.Date.Hour) * 60 + t.Date.Minute) * 60 + t.Date.Second + timezoneOffset - shiftStartSec) / intervalSeconds))
.Select(g => new {
WellDepthMin = g.Min(t => t.WellDepth),
WellDepthMax = g.Max(t => t.WellDepth),
DateMin = g.Min(t => t.Date),
DateMax = g.Max(t => t.Date),
})
.OrderBy(g=>g.DateMin)
.ToListAsync(token);
var wellDepthToIntervalData = drillingPeriodsInfo.Select(d => new WellDepthToIntervalDto
{
IntervalStartDate = d.BeginPeriodDate,
IntervalDepthProgress = (d.MaxDepth - d.MinDepth) ?? 0.0 / intervalSeconds
IntervalStartDate = d.DateMin,
IntervalDepthProgress = (d.WellDepthMax - d.WellDepthMin) ?? 0.0
// / (d.DateMax - d.DateMin).TotalHours,
}).OrderBy(d => d.IntervalStartDate).ToList();
return wellDepthToIntervalData;

View File

@ -89,14 +89,14 @@ namespace AsbCloudWebApi.Controllers
/// </summary>
/// <param name="idWell">id скважины</param>
/// <param name="intervalSeconds">количество секунд в необходимом интервале времени</param>
/// <param name="workBeginSeconds">количество секунд в времени начала смены</param>
/// <param name="shiftStartSec">количество секунд в времени начала смены</param>
/// <param name="token">Токен отмены задачи</param>
/// <returns>Коллекцию данных по глубине скважины за период</returns>
[HttpGet]
[Route("wellDepthToInterval")]
[ProducesResponseType(typeof(IEnumerable<WellDepthToIntervalDto>), (int)System.Net.HttpStatusCode.OK)]
public async Task<IActionResult> GetWellDepthToIntervalAsync(int idWell,
int intervalSeconds, int workBeginSeconds, CancellationToken token = default)
int intervalSeconds, int shiftStartSec, CancellationToken token = default)
{
int? idCompany = User.GetCompanyId();
@ -105,7 +105,7 @@ namespace AsbCloudWebApi.Controllers
return Forbid();
var wellDepthToIntervalData = await analyticsService.GetWellDepthToIntervalAsync(idWell,
intervalSeconds, workBeginSeconds, token).ConfigureAwait(false);
intervalSeconds, shiftStartSec, token).ConfigureAwait(false);
if (wellDepthToIntervalData is null || !wellDepthToIntervalData.Any())
return NoContent();