forked from ddrilling/AsbCloudServer
CS2-88: Changed telemetry analysis interval (to 12 hours parts)
This commit is contained in:
parent
40b83826a4
commit
6730d64df1
@ -233,45 +233,52 @@ namespace AsbCloudInfrastructure.Services
|
||||
|
||||
public void SaveAnalytics()
|
||||
{
|
||||
var alltelemetryIds = db.TelemetryDataSaub.Select(t => t.IdTelemetry).Distinct().ToList();
|
||||
var allTelemetryIds = (from telemetry in db.TelemetryDataSaub
|
||||
select telemetry.Id)
|
||||
.Distinct()
|
||||
.ToList();
|
||||
|
||||
foreach(var idTelemetry in alltelemetryIds)
|
||||
foreach(var idTelemetry in allTelemetryIds)
|
||||
{
|
||||
var telemetries = db.TelemetryDataSaub.Where(t => t.IdTelemetry == idTelemetry &&
|
||||
t.Date.Hour == (DateTime.UtcNow.Hour - 1)).ToList();
|
||||
var analyzeStartDate = GetAnalyzeStartDate(idTelemetry);
|
||||
|
||||
foreach(var telemetry in telemetries)
|
||||
while (GetDataSaubsToAnalyze(idTelemetry, analyzeStartDate).Any())
|
||||
{
|
||||
var dataSaubDto = telemetry.Adapt<TelemetryDataSaubDto>();
|
||||
var dataSaubsToAnalyze = GetDataSaubsToAnalyze(idTelemetry, (long)analyzeStartDate);
|
||||
|
||||
saubDataCache.AddData(dataSaubDto);
|
||||
|
||||
if (saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry).Count() > 1)
|
||||
foreach (var dataSaub in dataSaubsToAnalyze)
|
||||
{
|
||||
var dataSaubs = saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry)
|
||||
.OrderBy(d => d.Date);
|
||||
var dataSaubDto = dataSaub.Adapt<TelemetryDataSaubDto>();
|
||||
|
||||
var telemetryAnalysisDto = GetDrillingAnalysis(dataSaubs);
|
||||
saubDataCache.AddData(dataSaubDto);
|
||||
|
||||
if (saubDataCache.CurrentAnalysis is null)
|
||||
saubDataCache.CurrentAnalysis = telemetryAnalysisDto;
|
||||
|
||||
if (saubDataCache.CurrentAnalysis.IdOperation == telemetryAnalysisDto.IdOperation)
|
||||
if (saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry).Count() > 1)
|
||||
{
|
||||
saubDataCache.CurrentAnalysis.DurationSec +=
|
||||
telemetryAnalysisDto.DurationSec;
|
||||
saubDataCache.CurrentAnalysis.OperationEndDepth = dataSaubDto.WellDepth;
|
||||
}
|
||||
else
|
||||
{
|
||||
db.TelemetryAnalysis.Add(saubDataCache.CurrentAnalysis.Adapt<TelemetryAnalysis>());
|
||||
saubDataCache.CurrentAnalysis = telemetryAnalysisDto;
|
||||
saubDataCache.CurrentAnalysis.OperationStartDepth = dataSaubDto.WellDepth;
|
||||
var dataSaubs = saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry)
|
||||
.OrderBy(d => d.Date);
|
||||
|
||||
var telemetryAnalysisDto = GetDrillingAnalysis(dataSaubs);
|
||||
|
||||
if (saubDataCache.CurrentAnalysis is null)
|
||||
saubDataCache.CurrentAnalysis = telemetryAnalysisDto;
|
||||
|
||||
if (saubDataCache.CurrentAnalysis.IdOperation == telemetryAnalysisDto.IdOperation)
|
||||
{
|
||||
saubDataCache.CurrentAnalysis.DurationSec +=
|
||||
telemetryAnalysisDto.DurationSec;
|
||||
saubDataCache.CurrentAnalysis.OperationEndDepth = dataSaubDto.WellDepth;
|
||||
}
|
||||
else
|
||||
{
|
||||
db.TelemetryAnalysis.Add(saubDataCache.CurrentAnalysis.Adapt<TelemetryAnalysis>());
|
||||
saubDataCache.CurrentAnalysis = telemetryAnalysisDto;
|
||||
saubDataCache.CurrentAnalysis.OperationStartDepth = dataSaubDto.WellDepth;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
db.SaveChanges();
|
||||
db.SaveChanges();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -305,6 +312,42 @@ namespace AsbCloudInfrastructure.Services
|
||||
};
|
||||
}
|
||||
|
||||
private long GetAnalyzeStartDate(int idTelemetry)
|
||||
{
|
||||
var lastAnalysisInDb = (from analysis in db.TelemetryAnalysis
|
||||
where analysis.Id == idTelemetry
|
||||
orderby analysis.UnixDate
|
||||
select analysis)
|
||||
.DefaultIfEmpty()
|
||||
.Last();
|
||||
|
||||
var analyzeStartDate = lastAnalysisInDb?.UnixDate;
|
||||
|
||||
if (analyzeStartDate is null)
|
||||
{
|
||||
var firstDataSaub = (from ds in db.TelemetryDataSaub
|
||||
where ds.IdTelemetry == idTelemetry
|
||||
select ds.Date).FirstOrDefault();
|
||||
|
||||
analyzeStartDate = (long)(firstDataSaub - new DateTime(1970, 1, 1)).TotalSeconds;
|
||||
}
|
||||
|
||||
return (long)analyzeStartDate;
|
||||
}
|
||||
|
||||
private IEnumerable<TelemetryDataSaub> GetDataSaubsToAnalyze(int idTelemetry, long analyzeStartDate)
|
||||
{
|
||||
return (from ds in db.TelemetryDataSaub
|
||||
let lowerBorder = DateTimeOffset
|
||||
.FromUnixTimeSeconds(analyzeStartDate)
|
||||
let upperBorder = DateTimeOffset
|
||||
.FromUnixTimeSeconds(analyzeStartDate).AddHours(12)
|
||||
where ds.Id == idTelemetry
|
||||
&& ds.Date > lowerBorder
|
||||
&& ds.Date < upperBorder
|
||||
select ds).ToList();
|
||||
}
|
||||
|
||||
private static IEnumerable<(long IntervalStart, string OperationName, int OperationDuration)> DivideOperationsByIntervalLength(
|
||||
IEnumerable<(long IntervalStart, string OperationName, int OperationDuration)> operations, int intervalSeconds)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user