forked from ddrilling/AsbCloudServer
CS2-119: Added telemetry date fix method according to well timezone
This commit is contained in:
parent
53dbb2d959
commit
c273a9eb5c
@ -13,6 +13,8 @@ namespace AsbCloudApp.Services
|
|||||||
int GetOrCreateTemetryIdByUid(string uid);
|
int GetOrCreateTemetryIdByUid(string uid);
|
||||||
double GetTimezoneOffsetByTelemetryId(int idTelemetry);
|
double GetTimezoneOffsetByTelemetryId(int idTelemetry);
|
||||||
Task UpdateInfoAsync(string uid, TelemetryInfoDto info, CancellationToken token);
|
Task UpdateInfoAsync(string uid, TelemetryInfoDto info, CancellationToken token);
|
||||||
|
Task<DateTime> FixDateToTimeZoneAsync(int idTelemetry, DateTime date,
|
||||||
|
CancellationToken token);
|
||||||
Task<TimeZoneInfo> GetTimeZoneInfoAsync(int idWell, CancellationToken token);
|
Task<TimeZoneInfo> GetTimeZoneInfoAsync(int idWell, CancellationToken token);
|
||||||
Task UpdateTimeZoneAsync(string uid, TelemetryTimeZoneDto telemetryTimeZoneInfo, CancellationToken token);
|
Task UpdateTimeZoneAsync(string uid, TelemetryTimeZoneDto telemetryTimeZoneInfo, CancellationToken token);
|
||||||
int? GetIdTelemetryByIdWell(int idWell);
|
int? GetIdTelemetryByIdWell(int idWell);
|
||||||
|
@ -60,20 +60,24 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
dtosList.Remove(duplicate);
|
dtosList.Remove(duplicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
var enitties = dtosList.Select(d => {
|
var tasks = dtosList.Select(async d => {
|
||||||
var e = Convert(d);
|
var e = Convert(d);
|
||||||
e.IdTelemetry = idTelemetry;
|
e.IdTelemetry = idTelemetry;
|
||||||
return e;
|
e.Date = await telemetryService.FixDateToTimeZoneAsync(idTelemetry, d.Date, token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
return e;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var entities = await Task.WhenAll(tasks);
|
||||||
|
|
||||||
var dbset = db.Set<TModel>();
|
var dbset = db.Set<TModel>();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return await db.Database.ExecInsertOrUpdateAsync(dbset, enitties, token).ConfigureAwait(false);
|
return await db.Database.ExecInsertOrUpdateAsync(dbset, entities, token).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch(Exception ex)
|
catch(Exception ex)
|
||||||
{
|
{
|
||||||
Trace.WriteLine($"Fail to save data telemerty uid: {uid}, idTelemetry {idTelemetry} count: {enitties.Count()} dataDate: {enitties.FirstOrDefault()?.Date}. Message: {ex.Message}");
|
Trace.WriteLine($"Fail to save data telemerty uid: {uid}, idTelemetry {idTelemetry} count: {entities.Count()} dataDate: {entities.FirstOrDefault()?.Date}. Message: {ex.Message}");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,8 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
{
|
{
|
||||||
private readonly CacheTable<Telemetry> cacheTelemetry;
|
private readonly CacheTable<Telemetry> cacheTelemetry;
|
||||||
private readonly CacheTable<Well> cacheWells;
|
private readonly CacheTable<Well> cacheWells;
|
||||||
|
private readonly CacheTable<Cluster> cacheClusters;
|
||||||
|
private readonly CacheTable<Deposit> cacheDeposits;
|
||||||
private readonly IAsbCloudDbContext db;
|
private readonly IAsbCloudDbContext db;
|
||||||
private readonly ITelemetryTracker telemetryTracker;
|
private readonly ITelemetryTracker telemetryTracker;
|
||||||
private readonly string timeZoneApiUrl = "http://api.geonames.org/timezoneJSON";
|
private readonly string timeZoneApiUrl = "http://api.geonames.org/timezoneJSON";
|
||||||
@ -96,16 +98,60 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
await cacheTelemetry.UpsertAsync(telemetry, token)
|
await cacheTelemetry.UpsertAsync(telemetry, token)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<DateTime> FixDateToTimeZoneAsync(int idTelemetry, DateTime date,
|
||||||
|
CancellationToken token)
|
||||||
|
{
|
||||||
|
if(date.Kind == DateTimeKind.Utc)
|
||||||
|
return date;
|
||||||
|
|
||||||
|
if (date.Kind == DateTimeKind.Local)
|
||||||
|
return date.ToUniversalTime();
|
||||||
|
|
||||||
|
var telemetry =
|
||||||
|
await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == idTelemetry, token);
|
||||||
|
|
||||||
|
if (telemetry is null)
|
||||||
|
return date;
|
||||||
|
|
||||||
|
if (telemetry.TelemetryTimeZone is null)
|
||||||
|
{
|
||||||
|
var well = await cacheWells.FirstOrDefaultAsync(w => w.IdTelemetry == telemetry.Id, token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (well is null)
|
||||||
|
return date;
|
||||||
|
|
||||||
|
var requestedTimeZoneInfo = await GetTimeZoneInfoAsync(well.Id, token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (requestedTimeZoneInfo.TimezoneId is null)
|
||||||
|
return date;
|
||||||
|
|
||||||
|
telemetry.TelemetryTimeZone = new TelemetryTimeZone()
|
||||||
|
{
|
||||||
|
Hours = requestedTimeZoneInfo.GmtOffset,
|
||||||
|
TimeZoneId = requestedTimeZoneInfo.TimezoneId
|
||||||
|
};
|
||||||
|
|
||||||
|
await cacheTelemetry.UpsertAsync(telemetry, token).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var offsetHours = telemetry.TelemetryTimeZone.Hours;
|
||||||
|
return date.AddHours(offsetHours * -1);
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<TimeZoneInfo> GetTimeZoneInfoAsync(int idWell, CancellationToken token)
|
public async Task<TimeZoneInfo> GetTimeZoneInfoAsync(int idWell, CancellationToken token)
|
||||||
{
|
{
|
||||||
var well = await db.Wells.FirstOrDefaultAsync(w => w.Id == idWell, token)
|
var coordinates = await GetWellCoordinatesAsync(idWell, token);
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
if (coordinates is null)
|
||||||
|
return null;
|
||||||
|
|
||||||
using var client = new HttpClient();
|
using var client = new HttpClient();
|
||||||
|
|
||||||
var latitude = $"{well.Latitude}".Replace(',', '.');
|
var latitude = coordinates.Value.latitude.Replace(',', '.');
|
||||||
var longitude = $"{well.Longitude}".Replace(',', '.');
|
var longitude = coordinates.Value.longitude.Replace(',', '.');
|
||||||
|
|
||||||
var url =
|
var url =
|
||||||
$"{timeZoneApiUrl}?lat={latitude}&lng={longitude}&username={timezoneApiUserName}";
|
$"{timeZoneApiUrl}?lat={latitude}&lng={longitude}&username={timezoneApiUserName}";
|
||||||
@ -143,6 +189,33 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
return well.IdTelemetry;
|
return well.IdTelemetry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<(string latitude, string longitude)?> GetWellCoordinatesAsync(int idWell,
|
||||||
|
CancellationToken token)
|
||||||
|
{
|
||||||
|
var well = await cacheWells.FirstOrDefaultAsync(w => w.Id == idWell, token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (well is null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (well.Latitude is not null && well.Longitude is not null)
|
||||||
|
return ($"{well.Latitude}", $"{well.Longitude}");
|
||||||
|
|
||||||
|
var cluster = await cacheClusters.FirstOrDefaultAsync(c => c.Id == well.IdCluster, token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (cluster.Latitude is not null && cluster.Longitude is not null)
|
||||||
|
return ($"{cluster.Latitude}", $"{cluster.Longitude}");
|
||||||
|
|
||||||
|
var deposit = await cacheDeposits.FirstOrDefaultAsync(d => d.Id == cluster.IdDeposit, token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (deposit.Latitude is not null && deposit.Longitude is not null)
|
||||||
|
return ($"{deposit.Latitude}", $"{deposit.Longitude}");
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private Well GetWellByTelemetryUid(string uid)
|
private Well GetWellByTelemetryUid(string uid)
|
||||||
{
|
{
|
||||||
var tele = cacheTelemetry.FirstOrDefault(t => t.RemoteUid == uid);
|
var tele = cacheTelemetry.FirstOrDefault(t => t.RemoteUid == uid);
|
||||||
|
Loading…
Reference in New Issue
Block a user