forked from ddrilling/AsbCloudServer
Refactor. Extract TimezoneService.
This commit is contained in:
parent
6b7f589ddc
commit
1eaa1efb03
@ -5,5 +5,20 @@ namespace AsbCloudApp.Data
|
|||||||
public double Hours { get; set; }
|
public double Hours { get; set; }
|
||||||
public string TimeZoneId { get; set; }
|
public string TimeZoneId { get; set; }
|
||||||
public bool IsOverride { get; set; }
|
public bool IsOverride { get; set; }
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
if(obj is TelemetryTimeZoneDto tTimeZone
|
||||||
|
&& tTimeZone.Hours == Hours
|
||||||
|
&& tTimeZone.TimeZoneId == TimeZoneId
|
||||||
|
&& tTimeZone.IsOverride == IsOverride)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
=> Hours.GetHashCode()
|
||||||
|
| TimeZoneId.GetHashCode()
|
||||||
|
| IsOverride.GetHashCode();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,17 +1,4 @@
|
|||||||
namespace AsbCloudApp.Data
|
namespace AsbCloudApp.Data
|
||||||
{
|
{
|
||||||
public class TimeZoneInfo
|
|
||||||
{
|
|
||||||
public string Sunrise { get; set; }
|
|
||||||
public double Lng { get; set; }
|
|
||||||
public double Lat { get; set; }
|
|
||||||
public string CountryCode { get; set; }
|
|
||||||
public double GmtOffset { get; set; }
|
|
||||||
public double RawOffset { get; set; }
|
|
||||||
public string Sunset { get; set; }
|
|
||||||
public string TimezoneId { get; set; }
|
|
||||||
public double DstOffset { get; set; }
|
|
||||||
public string CountryName { get; set; }
|
|
||||||
public string Time { get; set; }
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -11,7 +11,7 @@ namespace AsbCloudApp.Services
|
|||||||
Task<IEnumerable<TDto>> GetAsync(int idWell,
|
Task<IEnumerable<TDto>> GetAsync(int idWell,
|
||||||
DateTime dateBegin = default, double intervalSec = 600d,
|
DateTime dateBegin = default, double intervalSec = 600d,
|
||||||
int approxPointsCount = 1024, bool isUtc = false, CancellationToken token = default);
|
int approxPointsCount = 1024, bool isUtc = false, CancellationToken token = default);
|
||||||
Task<DatesRangeDto> GetDataDatesRangeAsync(int idWell, bool isUtc,
|
Task<DatesRangeDto> GetDataDatesRangeAsync(int idWell, bool isUtc = false,
|
||||||
CancellationToken token = default);
|
CancellationToken token = default);
|
||||||
Task<int> UpdateDataAsync(string uid, IEnumerable<TDto> dtos, CancellationToken token = default);
|
Task<int> UpdateDataAsync(string uid, IEnumerable<TDto> dtos, CancellationToken token = default);
|
||||||
}
|
}
|
||||||
|
@ -3,22 +3,20 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using TimeZoneInfo = AsbCloudApp.Data.TimeZoneInfo;
|
|
||||||
|
|
||||||
namespace AsbCloudApp.Services
|
namespace AsbCloudApp.Services
|
||||||
{
|
{
|
||||||
public interface ITelemetryService
|
public interface ITelemetryService
|
||||||
{
|
{
|
||||||
|
ITimeZoneService TimeZoneService { get; }
|
||||||
|
|
||||||
int? GetidWellByTelemetryUid(string uid);
|
int? GetidWellByTelemetryUid(string uid);
|
||||||
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<double?> GetTelemetryTimeZoneOffsetAsync(int idTelemetry, CancellationToken token);
|
Task<double?> GetTelemetryTimeZoneOffsetAsync(int idTelemetry, CancellationToken token);
|
||||||
DateTime FixDateToTimeZone(DateTime date, double offsetHours,
|
|
||||||
CancellationToken token);
|
|
||||||
Task<DatesRangeDto> FixDatesRangeByTimeZoneAsync(int telemetryId, DatesRangeDto result,
|
Task<DatesRangeDto> FixDatesRangeByTimeZoneAsync(int telemetryId, DatesRangeDto result,
|
||||||
CancellationToken token);
|
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);
|
||||||
int Merge(IEnumerable<int> telemetryIds);
|
int Merge(IEnumerable<int> telemetryIds);
|
||||||
|
13
AsbCloudApp/Services/ITimeZoneService.cs
Normal file
13
AsbCloudApp/Services/ITimeZoneService.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AsbCloudApp.Services
|
||||||
|
{
|
||||||
|
public interface ITimeZoneService
|
||||||
|
{
|
||||||
|
DateTime DateToUtc(DateTime date, double remoteOTimezoneffsetHours);
|
||||||
|
DateTime DateToTimeZone(DateTime date, double remoteOTimezoneffsetHours);
|
||||||
|
Task<Data.TelemetryTimeZoneDto> GetByCoordinatesAsync(double latitude, double longitude, CancellationToken token);
|
||||||
|
}
|
||||||
|
}
|
@ -47,6 +47,7 @@ namespace AsbCloudInfrastructure
|
|||||||
services.AddTransient<IDrillingProgramService, DrillingProgramService>();
|
services.AddTransient<IDrillingProgramService, DrillingProgramService>();
|
||||||
services.AddTransient<IDrillParamsService, DrillParamsService>();
|
services.AddTransient<IDrillParamsService, DrillParamsService>();
|
||||||
services.AddTransient<IDrillFlowChartService, DrillFlowChartService>();
|
services.AddTransient<IDrillFlowChartService, DrillFlowChartService>();
|
||||||
|
services.AddTransient<ITimeZoneService, TimeZoneService>();
|
||||||
|
|
||||||
// admin crud services:
|
// admin crud services:
|
||||||
services.AddTransient<ICrudService<DepositDto>, CrudServiceBase<DepositDto, Deposit>>();
|
services.AddTransient<ICrudService<DepositDto>, CrudServiceBase<DepositDto, Deposit>>();
|
||||||
|
@ -37,7 +37,8 @@ namespace AsbCloudInfrastructure.Services.Analysis
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var context = new AsbCloudDbContext(options);
|
using var context = new AsbCloudDbContext(options);
|
||||||
var telemetryService = new TelemetryService(context, telemetryTracker, cacheDb);
|
var timeZoneService = new TimeZoneService();
|
||||||
|
var telemetryService = new TelemetryService(context, telemetryTracker, timeZoneService, cacheDb);
|
||||||
var analyticsService = new TelemetryAnalyticsService(context,
|
var analyticsService = new TelemetryAnalyticsService(context,
|
||||||
telemetryService, cacheDb);
|
telemetryService, cacheDb);
|
||||||
|
|
||||||
|
@ -40,16 +40,16 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
bool isUtc = true,
|
bool isUtc = true,
|
||||||
CancellationToken token = default)
|
CancellationToken token = default)
|
||||||
{
|
{
|
||||||
var telemetryId = telemetryService.GetIdTelemetryByIdWell(idWell);
|
var idTelemetry = telemetryService.GetIdTelemetryByIdWell(idWell);
|
||||||
if (telemetryId is null)
|
if (idTelemetry is null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var events = cacheEvents.Where(e => e.IdTelemetry == telemetryId);
|
var events = cacheEvents.Where(e => e.IdTelemetry == idTelemetry);
|
||||||
|
|
||||||
if (!events.Any())
|
if (!events.Any())
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var query = db.TelemetryMessages.Where(m => m.IdTelemetry == telemetryId)
|
var query = db.TelemetryMessages.Where(m => m.IdTelemetry == idTelemetry)
|
||||||
.OrderBy(m => m.Date).AsNoTracking();
|
.OrderBy(m => m.Date).AsNoTracking();
|
||||||
|
|
||||||
if ((categoryids?.Any() == true) || !string.IsNullOrEmpty(searchString))
|
if ((categoryids?.Any() == true) || !string.IsNullOrEmpty(searchString))
|
||||||
@ -70,6 +70,16 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
|
|
||||||
query = query.OrderByDescending(m => m.Date);
|
query = query.OrderByDescending(m => m.Date);
|
||||||
|
|
||||||
|
|
||||||
|
var timeOffset = await telemetryService.GetTelemetryTimeZoneOffsetAsync(idTelemetry??default, token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (timeOffset is not null)
|
||||||
|
{
|
||||||
|
begin = telemetryService.TimeZoneService.DateToUtc(begin, timeOffset ?? default);
|
||||||
|
end = telemetryService.TimeZoneService.DateToUtc(end, timeOffset ?? default);
|
||||||
|
}
|
||||||
|
|
||||||
if (begin != default)
|
if (begin != default)
|
||||||
query = query.Where(m => m.Date >= begin);
|
query = query.Where(m => m.Date >= begin);
|
||||||
|
|
||||||
@ -92,7 +102,7 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
if (messagesList.Count == 0)
|
if (messagesList.Count == 0)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
var users = cacheTUsers.Where(u => u.IdTelemetry == telemetryId);
|
var users = cacheTUsers.Where(u => u.IdTelemetry == idTelemetry);
|
||||||
|
|
||||||
foreach (var message in messagesList)
|
foreach (var message in messagesList)
|
||||||
{
|
{
|
||||||
@ -124,18 +134,12 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
result.Items.Add(messageDto);
|
result.Items.Add(messageDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isUtc)
|
if (isUtc && timeOffset is not null)
|
||||||
return result;
|
|
||||||
|
|
||||||
var telemetry = await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == telemetryId,
|
|
||||||
token).ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (telemetry?.TelemetryTimeZone is null)
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
result.Items = result.Items.Select(m =>
|
result.Items = result.Items.Select(m =>
|
||||||
{
|
{
|
||||||
m.Date = m.Date.AddHours(telemetry.TelemetryTimeZone.Hours);
|
m.Date = telemetryService.TimeZoneService.DateToTimeZone( m.Date, timeOffset ?? default);
|
||||||
return m;
|
return m;
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@ using AsbCloudDb.Model;
|
|||||||
using AsbCloudDb;
|
using AsbCloudDb;
|
||||||
using AsbCloudInfrastructure.Services.Cache;
|
using AsbCloudInfrastructure.Services.Cache;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.ChangeTracking;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
@ -20,7 +19,6 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
{
|
{
|
||||||
private readonly IAsbCloudDbContext db;
|
private readonly IAsbCloudDbContext db;
|
||||||
private readonly ITelemetryService telemetryService;
|
private readonly ITelemetryService telemetryService;
|
||||||
|
|
||||||
protected readonly CacheTable<Telemetry> cacheTelemetry;
|
protected readonly CacheTable<Telemetry> cacheTelemetry;
|
||||||
protected readonly CacheTable<TelemetryUser> cacheTelemetryUsers;
|
protected readonly CacheTable<TelemetryUser> cacheTelemetryUsers;
|
||||||
protected readonly CacheTable<Well> cacheWells;
|
protected readonly CacheTable<Well> cacheWells;
|
||||||
@ -32,7 +30,6 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
{
|
{
|
||||||
this.db = db;
|
this.db = db;
|
||||||
this.telemetryService = telemetryService;
|
this.telemetryService = telemetryService;
|
||||||
|
|
||||||
cacheTelemetry = cacheDb.GetCachedTable<Telemetry>((AsbCloudDbContext)db);
|
cacheTelemetry = cacheDb.GetCachedTable<Telemetry>((AsbCloudDbContext)db);
|
||||||
cacheTelemetryUsers = cacheDb.GetCachedTable<TelemetryUser>((AsbCloudDbContext)db);
|
cacheTelemetryUsers = cacheDb.GetCachedTable<TelemetryUser>((AsbCloudDbContext)db);
|
||||||
cacheWells = cacheDb.GetCachedTable<Well>((AsbCloudDbContext)db);
|
cacheWells = cacheDb.GetCachedTable<Well>((AsbCloudDbContext)db);
|
||||||
@ -66,7 +63,7 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
var e = Convert(d);
|
var e = Convert(d);
|
||||||
e.IdTelemetry = idTelemetry;
|
e.IdTelemetry = idTelemetry;
|
||||||
if(offsetHours is not null)
|
if(offsetHours is not null)
|
||||||
e.Date = telemetryService.FixDateToTimeZone(d.Date, (double)offsetHours, token);
|
e.Date = telemetryService.TimeZoneService.DateToUtc(d.Date, (double)offsetHours);
|
||||||
return e;
|
return e;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -84,15 +81,17 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
|
|
||||||
public virtual async Task<IEnumerable<TDto>> GetAsync(int idWell,
|
public virtual async Task<IEnumerable<TDto>> GetAsync(int idWell,
|
||||||
DateTime dateBegin = default, double intervalSec = 600d,
|
DateTime dateBegin = default, double intervalSec = 600d,
|
||||||
int approxPointsCount = 1024, bool isUtc = true, CancellationToken token = default)
|
int approxPointsCount = 1024, bool isUtc = false, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
var well = cacheWells.FirstOrDefault(w => w.Id == idWell);
|
var well = cacheWells.FirstOrDefault(w => w.Id == idWell);
|
||||||
if (well?.IdTelemetry is null)
|
if (well?.IdTelemetry is null)
|
||||||
return default;
|
return default;
|
||||||
|
|
||||||
|
var idTelemetry = well?.IdTelemetry ?? default;
|
||||||
|
|
||||||
if (dateBegin == default)
|
if (dateBegin == default)
|
||||||
{
|
{
|
||||||
dateBegin = telemetryService.GetLastTelemetryDate(well.IdTelemetry ?? 0);
|
dateBegin = telemetryService.GetLastTelemetryDate(idTelemetry);
|
||||||
if (dateBegin != default)
|
if (dateBegin != default)
|
||||||
dateBegin = dateBegin.AddSeconds(-intervalSec);
|
dateBegin = dateBegin.AddSeconds(-intervalSec);
|
||||||
}
|
}
|
||||||
@ -103,13 +102,19 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
if (dateBegin.Kind == DateTimeKind.Unspecified)
|
if (dateBegin.Kind == DateTimeKind.Unspecified)
|
||||||
dateBegin = DateTime.SpecifyKind(dateBegin, DateTimeKind.Utc);
|
dateBegin = DateTime.SpecifyKind(dateBegin, DateTimeKind.Utc);
|
||||||
|
|
||||||
var datEnd = dateBegin.AddSeconds(intervalSec);
|
var timeOffset = await telemetryService.GetTelemetryTimeZoneOffsetAsync(idTelemetry, token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if(timeOffset is not null)
|
||||||
|
dateBegin = telemetryService.TimeZoneService.DateToUtc(dateBegin, timeOffset?? default);
|
||||||
|
|
||||||
|
var dateEnd = dateBegin.AddSeconds(intervalSec);
|
||||||
var dbSet = db.Set<TModel>();
|
var dbSet = db.Set<TModel>();
|
||||||
|
|
||||||
var query = from data in dbSet
|
var query = dbSet
|
||||||
where data.IdTelemetry == well.IdTelemetry
|
.Where(d => d.IdTelemetry == idTelemetry
|
||||||
&& data.Date >= dateBegin && data.Date < datEnd
|
&& d.Date >= dateBegin
|
||||||
select data;
|
&& d.Date < dateEnd);
|
||||||
|
|
||||||
var fullDataCount = await query.CountAsync(token)
|
var fullDataCount = await query.CountAsync(token)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
@ -135,15 +140,12 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
if (isUtc)
|
if (isUtc)
|
||||||
return dtos;
|
return dtos;
|
||||||
|
|
||||||
var telemetry = await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == well.IdTelemetry,
|
if (timeOffset is null)
|
||||||
token).ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (telemetry?.TelemetryTimeZone is null)
|
|
||||||
return dtos;
|
return dtos;
|
||||||
|
|
||||||
dtos = dtos.Select(d =>
|
dtos = dtos.Select(d =>
|
||||||
{
|
{
|
||||||
d.Date = d.Date.AddHours(telemetry.TelemetryTimeZone.Hours);
|
d.Date = telemetryService.TimeZoneService.DateToTimeZone(d.Date, timeOffset ?? default);
|
||||||
return d;
|
return d;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ using Mapster;
|
|||||||
|
|
||||||
namespace AsbCloudInfrastructure.Services
|
namespace AsbCloudInfrastructure.Services
|
||||||
{
|
{
|
||||||
public class TelemetryDataSaubService: TelemetryDataBaseService<AsbCloudApp.Data.TelemetryDataSaubDto, AsbCloudDb.Model.TelemetryDataSaub>
|
public class TelemetryDataSaubService: TelemetryDataBaseService<TelemetryDataSaubDto, TelemetryDataSaub>
|
||||||
{
|
{
|
||||||
public TelemetryDataSaubService(
|
public TelemetryDataSaubService(
|
||||||
IAsbCloudDbContext db,
|
IAsbCloudDbContext db,
|
||||||
|
@ -6,7 +6,7 @@ using Mapster;
|
|||||||
|
|
||||||
namespace AsbCloudInfrastructure.Services
|
namespace AsbCloudInfrastructure.Services
|
||||||
{
|
{
|
||||||
public class TelemetryDataSpinService : TelemetryDataBaseService<AsbCloudApp.Data.TelemetryDataSpinDto, AsbCloudDb.Model.TelemetryDataSpin>
|
public class TelemetryDataSpinService : TelemetryDataBaseService<TelemetryDataSpinDto, TelemetryDataSpin>
|
||||||
{
|
{
|
||||||
public TelemetryDataSpinService(
|
public TelemetryDataSpinService(
|
||||||
IAsbCloudDbContext db,
|
IAsbCloudDbContext db,
|
||||||
|
@ -7,11 +7,8 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System;
|
using System;
|
||||||
using System.Text.Json;
|
|
||||||
using System.Net.Http;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using TimeZoneInfo = AsbCloudApp.Data.TimeZoneInfo;
|
|
||||||
|
|
||||||
namespace AsbCloudInfrastructure.Services
|
namespace AsbCloudInfrastructure.Services
|
||||||
{
|
{
|
||||||
@ -23,10 +20,14 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
private readonly CacheTable<Deposit> cacheDeposits;
|
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 ITimeZoneService timeZoneService;
|
||||||
private readonly string timezoneApiUserName = "asbautodrilling";
|
|
||||||
|
|
||||||
public TelemetryService(IAsbCloudDbContext db, ITelemetryTracker telemetryTracker,
|
public ITimeZoneService TimeZoneService => timeZoneService;
|
||||||
|
|
||||||
|
public TelemetryService(
|
||||||
|
IAsbCloudDbContext db,
|
||||||
|
ITelemetryTracker telemetryTracker,
|
||||||
|
ITimeZoneService timeZoneService,
|
||||||
CacheDb cacheDb)
|
CacheDb cacheDb)
|
||||||
{
|
{
|
||||||
cacheTelemetry = cacheDb.GetCachedTable<Telemetry>((AsbCloudDbContext)db);
|
cacheTelemetry = cacheDb.GetCachedTable<Telemetry>((AsbCloudDbContext)db);
|
||||||
@ -35,6 +36,7 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
cacheDeposits = cacheDb.GetCachedTable<Deposit>((AsbCloudDbContext)db);
|
cacheDeposits = cacheDb.GetCachedTable<Deposit>((AsbCloudDbContext)db);
|
||||||
this.db = db;
|
this.db = db;
|
||||||
this.telemetryTracker = telemetryTracker;
|
this.telemetryTracker = telemetryTracker;
|
||||||
|
this.timeZoneService = timeZoneService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<TelemetryDto> GetTransmittingTelemetriesAsync(int idCompany)
|
public IEnumerable<TelemetryDto> GetTransmittingTelemetriesAsync(int idCompany)
|
||||||
@ -86,11 +88,8 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
var telemetry = GetOrCreateTelemetryByUid(uid);
|
var telemetry = GetOrCreateTelemetryByUid(uid);
|
||||||
telemetry.Info = info.Adapt<TelemetryInfo>();
|
telemetry.Info = info.Adapt<TelemetryInfo>();
|
||||||
|
|
||||||
var isTimeZoneToUpdate = telemetry.TelemetryTimeZone is null || telemetry.TelemetryTimeZone.IsOverride ||
|
if (!string.IsNullOrEmpty(info.TimeZoneId) &&
|
||||||
(!telemetry.TelemetryTimeZone.IsOverride &&
|
telemetry.TelemetryTimeZone?.IsOverride != true)
|
||||||
telemetry.TelemetryTimeZone.Hours != info.TimeZoneOffsetTotalHours);
|
|
||||||
|
|
||||||
if (isTimeZoneToUpdate)
|
|
||||||
telemetry.TelemetryTimeZone = new TelemetryTimeZone()
|
telemetry.TelemetryTimeZone = new TelemetryTimeZone()
|
||||||
{
|
{
|
||||||
Hours = info.TimeZoneOffsetTotalHours,
|
Hours = info.TimeZoneOffsetTotalHours,
|
||||||
@ -106,94 +105,67 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
var telemetry =
|
var telemetry =
|
||||||
await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == idTelemetry, token);
|
await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == idTelemetry, token);
|
||||||
|
|
||||||
if (telemetry.TelemetryTimeZone is not null)
|
if (!string.IsNullOrEmpty(telemetry.TelemetryTimeZone?.TimeZoneId))
|
||||||
return telemetry.TelemetryTimeZone.Hours;
|
return telemetry.TelemetryTimeZone.Hours;
|
||||||
|
|
||||||
var well = await cacheWells.FirstOrDefaultAsync(w => w.IdTelemetry == telemetry.Id, token)
|
if (!string.IsNullOrEmpty(telemetry.Info?.TimeZoneId))
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (well is null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
var requestedTimeZoneInfo = await GetTimeZoneInfoAsync(well.Id, token)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (requestedTimeZoneInfo.TimezoneId is null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
telemetry.TelemetryTimeZone = new TelemetryTimeZone()
|
|
||||||
{
|
{
|
||||||
Hours = requestedTimeZoneInfo.GmtOffset,
|
telemetry.TelemetryTimeZone = new TelemetryTimeZone
|
||||||
TimeZoneId = requestedTimeZoneInfo.TimezoneId
|
{
|
||||||
};
|
Hours = telemetry.Info.TimeZoneOffsetTotalHours,
|
||||||
|
IsOverride = false,
|
||||||
|
TimeZoneId = telemetry.Info.TimeZoneId,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var well = await cacheWells.FirstOrDefaultAsync(t => t.IdTelemetry == telemetry.Id, token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (well is null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var coordinates = await GetWellCoordinatesAsync(well.Id, token);
|
||||||
|
|
||||||
|
if (coordinates is null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var requestedTimeZone = await timeZoneService.GetByCoordinatesAsync(coordinates.Value.latitude, coordinates.Value.longitude, token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (requestedTimeZone is null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
telemetry.TelemetryTimeZone = requestedTimeZone.Adapt<TelemetryTimeZone>();
|
||||||
|
}
|
||||||
|
|
||||||
await cacheTelemetry.UpsertAsync(telemetry, token).ConfigureAwait(false);
|
await cacheTelemetry.UpsertAsync(telemetry, token).ConfigureAwait(false);
|
||||||
|
|
||||||
return telemetry.TelemetryTimeZone.Hours;
|
return telemetry.TelemetryTimeZone.Hours;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DateTime FixDateToTimeZone(DateTime date, double offsetHours,
|
public async Task<DatesRangeDto> FixDatesRangeByTimeZoneAsync(int idTelemetry, DatesRangeDto range,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
return date.Kind switch
|
var offset = await GetTelemetryTimeZoneOffsetAsync(idTelemetry, token);
|
||||||
{
|
|
||||||
DateTimeKind.Utc => date,
|
|
||||||
DateTimeKind.Local => date.ToUniversalTime(),
|
|
||||||
_ => date.AddHours(-offsetHours)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<DatesRangeDto> FixDatesRangeByTimeZoneAsync(int telemetryId, DatesRangeDto result,
|
if (offset is null)
|
||||||
CancellationToken token)
|
return range;
|
||||||
{
|
|
||||||
var telemetry = await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == telemetryId,
|
|
||||||
token).ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (telemetry?.TelemetryTimeZone is null)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
return new DatesRangeDto()
|
return new DatesRangeDto()
|
||||||
{
|
{
|
||||||
From = result.From.AddHours(telemetry.TelemetryTimeZone.Hours),
|
From = timeZoneService.DateToTimeZone(range.From, offset ?? default),
|
||||||
To = result.To.AddHours(telemetry.TelemetryTimeZone.Hours)
|
To = timeZoneService.DateToTimeZone(range.To, offset ?? default),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TimeZoneInfo> GetTimeZoneInfoAsync(int idWell, CancellationToken token)
|
|
||||||
{
|
|
||||||
var coordinates = await GetWellCoordinatesAsync(idWell, token);
|
|
||||||
|
|
||||||
if (coordinates is null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
using var client = new HttpClient();
|
|
||||||
|
|
||||||
var latitude = coordinates.Value.latitude.Replace(',', '.');
|
|
||||||
var longitude = coordinates.Value.longitude.Replace(',', '.');
|
|
||||||
|
|
||||||
var url =
|
|
||||||
$"{timeZoneApiUrl}?lat={latitude}&lng={longitude}&username={timezoneApiUserName}";
|
|
||||||
|
|
||||||
var response = await client.GetAsync(url, token).ConfigureAwait(false);
|
|
||||||
|
|
||||||
var responseJson = await response.Content.ReadAsStringAsync(token)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
var options = new JsonSerializerOptions
|
|
||||||
{
|
|
||||||
PropertyNameCaseInsensitive = true
|
|
||||||
};
|
|
||||||
var timeZoneInfo = JsonSerializer.Deserialize<TimeZoneInfo>(responseJson, options);
|
|
||||||
|
|
||||||
return timeZoneInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task UpdateTimeZoneAsync(string uid, TelemetryTimeZoneDto timeZoneInfo,
|
public async Task UpdateTimeZoneAsync(string uid, TelemetryTimeZoneDto timeZoneInfo,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
var telemetry = GetOrCreateTelemetryByUid(uid);
|
var telemetry = GetOrCreateTelemetryByUid(uid);
|
||||||
telemetry.TelemetryTimeZone = timeZoneInfo.Adapt<TelemetryTimeZone>();
|
var newTelemetryTimeZone = timeZoneInfo.Adapt<TelemetryTimeZone>();
|
||||||
|
if (newTelemetryTimeZone?.Equals(telemetry.TelemetryTimeZone) == true)
|
||||||
|
return;
|
||||||
await cacheTelemetry.UpsertAsync(telemetry, token)
|
await cacheTelemetry.UpsertAsync(telemetry, token)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
@ -207,7 +179,7 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
return well.IdTelemetry;
|
return well.IdTelemetry;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<(string latitude, string longitude)?> GetWellCoordinatesAsync(int idWell,
|
private async Task<(double latitude, double longitude)?> GetWellCoordinatesAsync(int idWell,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
var well = await cacheWells.FirstOrDefaultAsync(w => w.Id == idWell, token)
|
var well = await cacheWells.FirstOrDefaultAsync(w => w.Id == idWell, token)
|
||||||
@ -217,19 +189,19 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (well.Latitude is not null && well.Longitude is not null)
|
if (well.Latitude is not null && well.Longitude is not null)
|
||||||
return ($"{well.Latitude}", $"{well.Longitude}");
|
return (well.Latitude ?? default, well.Longitude??default);
|
||||||
|
|
||||||
var cluster = await cacheClusters.FirstOrDefaultAsync(c => c.Id == well.IdCluster, token)
|
var cluster = await cacheClusters.FirstOrDefaultAsync(c => c.Id == well.IdCluster, token)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
if (cluster.Latitude is not null && cluster.Longitude is not null)
|
if (cluster.Latitude is not null && cluster.Longitude is not null)
|
||||||
return ($"{cluster.Latitude}", $"{cluster.Longitude}");
|
return (cluster.Latitude ?? default, cluster.Longitude ?? default);
|
||||||
|
|
||||||
var deposit = await cacheDeposits.FirstOrDefaultAsync(d => d.Id == cluster.IdDeposit, token)
|
var deposit = await cacheDeposits.FirstOrDefaultAsync(d => d.Id == cluster.IdDeposit, token)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
if (deposit.Latitude is not null && deposit.Longitude is not null)
|
if (deposit.Latitude is not null && deposit.Longitude is not null)
|
||||||
return ($"{deposit.Latitude}", $"{deposit.Longitude}");
|
return (deposit.Latitude ?? default, deposit.Longitude ?? default);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -396,5 +368,7 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
|
|
||||||
return rows;
|
return rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,8 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
var date = telemetry.Info?.DrillingStartDate
|
var date = telemetry.Info?.DrillingStartDate
|
||||||
?? GetDateByUidOrDefault(telemetry.RemoteUid, DateTime.MinValue);
|
?? GetDateByUidOrDefault(telemetry.RemoteUid, DateTime.MinValue);
|
||||||
|
|
||||||
keyValuePairs[telemetry.RemoteUid] = new TrackerStat {
|
keyValuePairs[telemetry.RemoteUid] = new TrackerStat
|
||||||
|
{
|
||||||
RemoteUid = telemetry.RemoteUid,
|
RemoteUid = telemetry.RemoteUid,
|
||||||
LastTimeRemote = date,
|
LastTimeRemote = date,
|
||||||
LastTimeServer = date,
|
LastTimeServer = date,
|
||||||
@ -53,14 +54,16 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
}
|
}
|
||||||
requests = new ConcurrentDictionary<string, TrackerStat>(keyValuePairs);
|
requests = new ConcurrentDictionary<string, TrackerStat>(keyValuePairs);
|
||||||
|
|
||||||
Task.Run(async() => {
|
Task.Run(async () =>
|
||||||
|
{
|
||||||
db.Database.SetCommandTimeout(2 * 60);
|
db.Database.SetCommandTimeout(2 * 60);
|
||||||
var dates = await db.TelemetryDataSaub
|
var dates = await db.TelemetryDataSaub
|
||||||
.GroupBy(d => d.IdTelemetry)
|
.GroupBy(d => d.IdTelemetry)
|
||||||
.Select(g => new
|
.Select(g => new
|
||||||
{
|
{
|
||||||
IdTelemetry = g.Key,
|
IdTelemetry = g.Key,
|
||||||
Date = g.Max(d=>d.Date)
|
DateMax = g.Max(d => d.Date),
|
||||||
|
DateMin = g.Min(d => d.Date),
|
||||||
})
|
})
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.ToListAsync()
|
.ToListAsync()
|
||||||
@ -70,18 +73,18 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
var oldReqs = dates.Select(t => new
|
var oldReqs = dates.Select(t => new
|
||||||
{
|
{
|
||||||
Uid = cacheTelemetry.FirstOrDefault(c => c.Id == t.IdTelemetry).RemoteUid,
|
Uid = cacheTelemetry.FirstOrDefault(c => c.Id == t.IdTelemetry).RemoteUid,
|
||||||
t.Date,
|
t.DateMax,
|
||||||
});
|
});
|
||||||
|
|
||||||
foreach (var oldReq in oldReqs)
|
foreach (var oldReq in oldReqs)
|
||||||
{
|
{
|
||||||
var request = requests.GetValueOrDefault(oldReq.Uid);
|
var request = requests.GetValueOrDefault(oldReq.Uid);
|
||||||
if(request is not null)
|
if (request is not null)
|
||||||
{
|
{
|
||||||
if (request.LastTimeRemote < oldReq.Date)
|
if (request.LastTimeRemote < oldReq.DateMax)
|
||||||
request.LastTimeRemote = oldReq.Date;
|
request.LastTimeRemote = oldReq.DateMax;
|
||||||
if (request.LastTimeServer < oldReq.Date)
|
if (request.LastTimeServer < oldReq.DateMax)
|
||||||
request.LastTimeServer = oldReq.Date;
|
request.LastTimeServer = oldReq.DateMax;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
86
AsbCloudInfrastructure/Services/TimeZoneService.cs
Normal file
86
AsbCloudInfrastructure/Services/TimeZoneService.cs
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
using AsbCloudApp.Services;
|
||||||
|
using System.Net.Http;
|
||||||
|
using AsbCloudApp.Data;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace AsbCloudInfrastructure.Services
|
||||||
|
{
|
||||||
|
public class TimeZoneService : ITimeZoneService
|
||||||
|
{
|
||||||
|
class TimeZoneInfo
|
||||||
|
{
|
||||||
|
public string Sunrise { get; set; }
|
||||||
|
public double Lng { get; set; }
|
||||||
|
public double Lat { get; set; }
|
||||||
|
public string CountryCode { get; set; }
|
||||||
|
public double GmtOffset { get; set; }
|
||||||
|
public double RawOffset { get; set; }
|
||||||
|
public string Sunset { get; set; }
|
||||||
|
public string TimezoneId { get; set; }
|
||||||
|
public double DstOffset { get; set; }
|
||||||
|
public string CountryName { get; set; }
|
||||||
|
public string Time { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly string timeZoneApiUrl = "http://api.geonames.org/timezoneJSON";
|
||||||
|
private readonly string timezoneApiUserName = "asbautodrilling";
|
||||||
|
|
||||||
|
public async Task<TelemetryTimeZoneDto> GetByCoordinatesAsync(double latitude, double longitude, CancellationToken token)
|
||||||
|
{
|
||||||
|
var lat = latitude.ToString(System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
var lng = longitude.ToString(System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
|
||||||
|
var url =
|
||||||
|
$"{timeZoneApiUrl}?lat={lat}&lng={lng}&username={timezoneApiUserName}";
|
||||||
|
|
||||||
|
using var client = new HttpClient();
|
||||||
|
|
||||||
|
var response = await client.GetAsync(url, token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
var responseJson = await response.Content.ReadAsStringAsync(token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (!(responseJson.Contains("timezoneId") && responseJson.Contains("dstOffset")))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var options = new JsonSerializerOptions
|
||||||
|
{
|
||||||
|
PropertyNameCaseInsensitive = true
|
||||||
|
};
|
||||||
|
var timeZoneInfo = JsonSerializer.Deserialize<TimeZoneInfo>(responseJson, options);
|
||||||
|
|
||||||
|
return new TelemetryTimeZoneDto
|
||||||
|
{
|
||||||
|
Hours = timeZoneInfo.DstOffset,
|
||||||
|
IsOverride = false,
|
||||||
|
TimeZoneId = timeZoneInfo.TimezoneId,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public DateTime DateToUtc(DateTime date, double remoteTimezoneOffsetHours)
|
||||||
|
{
|
||||||
|
var newDate = date.Kind switch
|
||||||
|
{
|
||||||
|
DateTimeKind.Local => date.ToUniversalTime(),
|
||||||
|
DateTimeKind.Unspecified => date.AddHours(-remoteTimezoneOffsetHours),
|
||||||
|
_ => date,
|
||||||
|
};
|
||||||
|
return DateTime.SpecifyKind(newDate, DateTimeKind.Utc);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DateTime DateToTimeZone(DateTime date, double remoteTimezoneOffsetHours)
|
||||||
|
{
|
||||||
|
var newDate = date.Kind switch
|
||||||
|
{
|
||||||
|
DateTimeKind.Local => date.ToUniversalTime().AddHours(remoteTimezoneOffsetHours),
|
||||||
|
DateTimeKind.Utc => date.AddHours(remoteTimezoneOffsetHours),
|
||||||
|
_ => date,
|
||||||
|
};
|
||||||
|
return DateTime.SpecifyKind(newDate, DateTimeKind.Unspecified);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -50,7 +50,7 @@ namespace AsbCloudWebApi.Controllers
|
|||||||
public async Task<IActionResult> PostInfoAsync(string uid, [FromBody] TelemetryInfoDto info,
|
public async Task<IActionResult> PostInfoAsync(string uid, [FromBody] TelemetryInfoDto info,
|
||||||
CancellationToken token = default)
|
CancellationToken token = default)
|
||||||
{
|
{
|
||||||
await telemetryService.UpdateInfoAsync(uid, info, token);
|
await telemetryService.UpdateInfoAsync(uid, info, token).ConfigureAwait(false);
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,7 +66,8 @@ namespace AsbCloudWebApi.Controllers
|
|||||||
public async Task<IActionResult> UpdateTimeZoneAsync(string uid, TelemetryTimeZoneDto timeZoneInfo,
|
public async Task<IActionResult> UpdateTimeZoneAsync(string uid, TelemetryTimeZoneDto timeZoneInfo,
|
||||||
CancellationToken token = default)
|
CancellationToken token = default)
|
||||||
{
|
{
|
||||||
await telemetryService.UpdateTimeZoneAsync(uid, timeZoneInfo, token);
|
await telemetryService.UpdateTimeZoneAsync(uid, timeZoneInfo, token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,33 +123,5 @@ namespace AsbCloudWebApi.Controllers
|
|||||||
telemetryUserService.Upsert(uid, users);
|
telemetryUserService.Upsert(uid, users);
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
///// <summary>
|
|
||||||
///// Загрузка архива (sqlite3).
|
|
||||||
///// <example>
|
|
||||||
///// var fileName = @"C:\temp\default.sqlite3";
|
|
||||||
///// var fileStream = System.IO.File.OpenRead(fileName);
|
|
||||||
///// var file = new FileParameter(fileStream, System.IO.Path.GetFileName(fileName));
|
|
||||||
///// cli.ApiTelemetryDbAsync("1", new List<FileParameter> { file }).Wait();
|
|
||||||
///// </example>
|
|
||||||
///// </summary>
|
|
||||||
///// <param name="uid"></param>
|
|
||||||
///// <param name="files"></param>
|
|
||||||
///// <returns></returns>
|
|
||||||
//[HttpPost]
|
|
||||||
//[Route("{uid}/db")]
|
|
||||||
//public IActionResult PostDb(string uid, IFormFileCollection files)
|
|
||||||
//{
|
|
||||||
// foreach (var file in files)
|
|
||||||
// {
|
|
||||||
// var fileName = string.IsNullOrEmpty(file.FileName)
|
|
||||||
// ? System.IO.Path.GetTempFileName()
|
|
||||||
// : file.FileName;
|
|
||||||
// using (var stream = System.IO.File.Create(fileName))
|
|
||||||
// file.CopyTo(stream);
|
|
||||||
// }
|
|
||||||
// return Ok();
|
|
||||||
//}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ namespace AsbCloudWebApi.Controllers
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("{idWell}")]
|
[HttpGet("{idWell}")]
|
||||||
public virtual async Task<ActionResult<TDto>> GetDataAsync(int idWell, DateTime begin = default,
|
public virtual async Task<ActionResult<TDto>> GetDataAsync(int idWell, DateTime begin = default,
|
||||||
int intervalSec = 600, int approxPointsCount = 1024, bool isUtc = true, CancellationToken token = default)
|
int intervalSec = 600, int approxPointsCount = 1024, bool isUtc = false, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
int? idCompany = User.GetCompanyId();
|
int? idCompany = User.GetCompanyId();
|
||||||
|
|
||||||
@ -102,7 +102,7 @@ namespace AsbCloudWebApi.Controllers
|
|||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("{idWell}/datesRange")]
|
[Route("{idWell}/datesRange")]
|
||||||
[ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)]
|
||||||
public virtual async Task<IActionResult> GetDataDatesRangeAsync(int idWell, bool isUtc = true,
|
public virtual async Task<IActionResult> GetDataDatesRangeAsync(int idWell, bool isUtc = false,
|
||||||
CancellationToken token = default)
|
CancellationToken token = default)
|
||||||
{
|
{
|
||||||
int? idCompany = User.GetCompanyId();
|
int? idCompany = User.GetCompanyId();
|
||||||
|
Loading…
Reference in New Issue
Block a user