diff --git a/AsbCloud.sln b/AsbCloud.sln index 7cd3f161..21e8350f 100644 --- a/AsbCloud.sln +++ b/AsbCloud.sln @@ -13,8 +13,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp1", "ConsoleApp1\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AsbCloudDb", "AsbCloudDb\AsbCloudDb.csproj", "{40FBD29B-724B-4496-B5D9-1A5D14102456}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataTable", "DataTable\DataTable.csproj", "{28AD7CD5-17A0-448C-8C16-A34AE5DE40FB}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AsbCloudWebApi.Tests", "AsbCloudWebApi.Tests\AsbCloudWebApi.Tests.csproj", "{9CF6FBB1-9AF5-45AB-A521-24F11A79B540}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AsbCloudDevOperations", "AsbCloudDbDemoData\AsbCloudDevOperations.csproj", "{1208822E-9099-4D13-B72F-8721E5758577}" @@ -45,10 +43,6 @@ Global {40FBD29B-724B-4496-B5D9-1A5D14102456}.Debug|Any CPU.Build.0 = Debug|Any CPU {40FBD29B-724B-4496-B5D9-1A5D14102456}.Release|Any CPU.ActiveCfg = Release|Any CPU {40FBD29B-724B-4496-B5D9-1A5D14102456}.Release|Any CPU.Build.0 = Release|Any CPU - {28AD7CD5-17A0-448C-8C16-A34AE5DE40FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {28AD7CD5-17A0-448C-8C16-A34AE5DE40FB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {28AD7CD5-17A0-448C-8C16-A34AE5DE40FB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {28AD7CD5-17A0-448C-8C16-A34AE5DE40FB}.Release|Any CPU.Build.0 = Release|Any CPU {9CF6FBB1-9AF5-45AB-A521-24F11A79B540}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9CF6FBB1-9AF5-45AB-A521-24F11A79B540}.Debug|Any CPU.Build.0 = Debug|Any CPU {9CF6FBB1-9AF5-45AB-A521-24F11A79B540}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/AsbCloudApp/Data/TelemetryTimeZoneDto.cs b/AsbCloudApp/Data/TelemetryTimeZoneDto.cs new file mode 100644 index 00000000..b8cd7e2b --- /dev/null +++ b/AsbCloudApp/Data/TelemetryTimeZoneDto.cs @@ -0,0 +1,24 @@ +namespace AsbCloudApp.Data +{ + public class TelemetryTimeZoneDto + { + public double Hours { get; set; } + public string TimeZoneId { 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(); + } +} \ No newline at end of file diff --git a/AsbCloudApp/Data/TimeZoneInfo.cs b/AsbCloudApp/Data/TimeZoneInfo.cs new file mode 100644 index 00000000..d8763ecb --- /dev/null +++ b/AsbCloudApp/Data/TimeZoneInfo.cs @@ -0,0 +1,4 @@ +namespace AsbCloudApp.Data +{ + +} \ No newline at end of file diff --git a/AsbCloudApp/Services/IMessageService.cs b/AsbCloudApp/Services/IMessageService.cs index e51b56df..9b4221c9 100644 --- a/AsbCloudApp/Services/IMessageService.cs +++ b/AsbCloudApp/Services/IMessageService.cs @@ -9,10 +9,11 @@ namespace AsbCloudApp.Services public interface IMessageService { Task> GetMessagesAsync(int idWell, - IEnumerable categoryids = null, DateTime begin = default, + IEnumerable categoryids = default, DateTime begin = default, DateTime end = default, string searchString = default, - int skip = 0, int take = 32, CancellationToken token = default); - Task GetMessagesDatesRangeAsync(int idWell, + int skip = 0, int take = 32, bool isUtc = true, + CancellationToken token = default); + Task GetMessagesDatesRangeAsync(int idWell, bool isUtc, CancellationToken token = default); Task InsertAsync(string uid, IEnumerable dtos, CancellationToken token); diff --git a/AsbCloudApp/Services/IReportService.cs b/AsbCloudApp/Services/IReportService.cs index 0d7d80b4..7de24ed1 100644 --- a/AsbCloudApp/Services/IReportService.cs +++ b/AsbCloudApp/Services/IReportService.cs @@ -14,12 +14,11 @@ namespace AsbCloudApp.Services Action handleReportProgress); int GetReportPagesCount(int idWell, DateTime begin, DateTime end, int stepSeconds, int format); - Task> GetSuitableReportsAsync(int idWell, DateTime begin, DateTime end, int stepSeconds, int format, CancellationToken token); - Task GetReportsDatesRangeAsync(int idWell, - CancellationToken token); + Task GetReportsDatesRangeAsync(int idWell, bool isUtc, + CancellationToken token = default); Task> GetAllReportsByWellAsync(int idWell, CancellationToken token); } } diff --git a/AsbCloudApp/Services/ITelemetryAnalyticsService.cs b/AsbCloudApp/Services/ITelemetryAnalyticsService.cs index e8753c02..18994812 100644 --- a/AsbCloudApp/Services/ITelemetryAnalyticsService.cs +++ b/AsbCloudApp/Services/ITelemetryAnalyticsService.cs @@ -24,7 +24,7 @@ namespace AsbCloudApp.Services int intervalHoursTimestamp, int workBeginTimestamp, CancellationToken token = default); Task AnalyzeAndSaveTelemetriesAsync(CancellationToken token = default); - Task GetOperationsDateRangeAsync(int idWell, + Task GetOperationsDateRangeAsync(int idWell, bool isUtc, CancellationToken token = default); } } diff --git a/AsbCloudApp/Services/ITelemetryDataService.cs b/AsbCloudApp/Services/ITelemetryDataService.cs index c9839126..6cb8228f 100644 --- a/AsbCloudApp/Services/ITelemetryDataService.cs +++ b/AsbCloudApp/Services/ITelemetryDataService.cs @@ -8,8 +8,11 @@ namespace AsbCloudApp.Services { public interface ITelemetryDataService where TDto : ITelemetryData { - Task> GetAsync(int idWell, DateTime dateBegin = default, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default); - Task GetDataDatesRangeAsync(int idWell, CancellationToken token = default); + Task> GetAsync(int idWell, + DateTime dateBegin = default, double intervalSec = 600d, + int approxPointsCount = 1024, bool isUtc = false, CancellationToken token = default); + Task GetDataDatesRangeAsync(int idWell, bool isUtc = false, + CancellationToken token = default); Task UpdateDataAsync(string uid, IEnumerable dtos, CancellationToken token = default); } } \ No newline at end of file diff --git a/AsbCloudApp/Services/ITelemetryService.cs b/AsbCloudApp/Services/ITelemetryService.cs index f94627f9..c61dedc9 100644 --- a/AsbCloudApp/Services/ITelemetryService.cs +++ b/AsbCloudApp/Services/ITelemetryService.cs @@ -8,10 +8,17 @@ namespace AsbCloudApp.Services { public interface ITelemetryService { + ITimeZoneService TimeZoneService { get; } + ITelemetryTracker TelemetryTracker { get; } + int? GetidWellByTelemetryUid(string uid); int GetOrCreateTemetryIdByUid(string uid); double GetTimezoneOffsetByTelemetryId(int idTelemetry); - void UpdateInfo(string uid, TelemetryInfoDto info); + Task UpdateInfoAsync(string uid, TelemetryInfoDto info, CancellationToken token); + Task GetTelemetryTimeZoneOffsetAsync(int idTelemetry, CancellationToken token); + Task FixDatesRangeByTimeZoneAsync(int telemetryId, DatesRangeDto result, + CancellationToken token); + Task UpdateTimeZoneAsync(string uid, TelemetryTimeZoneDto telemetryTimeZoneInfo, CancellationToken token); int? GetIdTelemetryByIdWell(int idWell); int Merge(IEnumerable telemetryIds); IEnumerable<(string Key, int[] Ids)> GetRedundentRemoteUids(); diff --git a/AsbCloudApp/Services/ITelemetryTracker.cs b/AsbCloudApp/Services/ITelemetryTracker.cs index 3f8da9f8..a7aad4f2 100644 --- a/AsbCloudApp/Services/ITelemetryTracker.cs +++ b/AsbCloudApp/Services/ITelemetryTracker.cs @@ -1,4 +1,5 @@ -using System; +using AsbCloudApp.Data; +using System; using System.Collections.Generic; namespace AsbCloudApp.Services @@ -6,6 +7,7 @@ namespace AsbCloudApp.Services public interface ITelemetryTracker { DateTime GetLastTelemetryDateByUid(string uid); + DatesRangeDto GetTelemetryDateRangeByUid(string uid); IEnumerable GetTransmittingTelemetriesUids(); void SaveRequestDate(string uid, DateTime remoteDate); } diff --git a/AsbCloudApp/Services/ITimeZoneService.cs b/AsbCloudApp/Services/ITimeZoneService.cs new file mode 100644 index 00000000..87be0d67 --- /dev/null +++ b/AsbCloudApp/Services/ITimeZoneService.cs @@ -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 GetByCoordinatesAsync(double latitude, double longitude, CancellationToken token); + } +} \ No newline at end of file diff --git a/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.Designer.cs b/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.Designer.cs new file mode 100644 index 00000000..0ff12472 --- /dev/null +++ b/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.Designer.cs @@ -0,0 +1,2768 @@ +// +using System; +using System.Collections.Generic; +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace AsbCloudDb.Migrations +{ + [DbContext(typeof(AsbCloudDbContext))] + [Migration("20211116080138_Add_Telemetry_TimeZone")] + partial class Add_Telemetry_TimeZone + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasPostgresExtension("adminpack") + .HasAnnotation("Relational:Collation", "Russian_Russia.1251") + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.10") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdDeposit") + .HasColumnType("integer") + .HasColumnName("id_deposit"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.HasKey("Id"); + + b.HasIndex("IdDeposit"); + + b.ToTable("t_cluster"); + + b + .HasComment("Кусты"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("IdCompanyType") + .HasMaxLength(255) + .HasColumnType("integer") + .HasColumnName("id_company_type") + .HasComment("вид деятельности"); + + b.HasKey("Id"); + + b.HasIndex("IdCompanyType"); + + b.ToTable("t_company"); + + b.HasData( + new + { + Id = 1, + Caption = "ООО \"АСБ\"", + IdCompanyType = 3 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.HasKey("Id"); + + b.ToTable("t_company_type"); + + b.HasData( + new + { + Id = 1, + Caption = "Недрапользователь" + }, + new + { + Id = 2, + Caption = "Буровой подрядчик" + }, + new + { + Id = 3, + Caption = "Сервис автоматизации бурения" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.HasKey("Id"); + + b.ToTable("t_deposit"); + + b + .HasComment("Месторождение"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AxialLoadMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_max") + .HasComment("Максимальная нагрузка"); + + b.Property("AxialLoadMin") + .HasColumnType("double precision") + .HasColumnName("axial_load_min") + .HasComment("Минимальная нагрузка"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина окончания интервала"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Стартовая глубина"); + + b.Property("FlowMax") + .HasColumnType("double precision") + .HasColumnName("flow_max") + .HasComment("Максимальный расход"); + + b.Property("FlowMin") + .HasColumnType("double precision") + .HasColumnName("flow_min") + .HasComment("Минимальный расход"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("well_id") + .HasComment("Id скважины"); + + b.Property("IdWellOperationCategory") + .HasColumnType("integer") + .HasColumnName("id_operation_category") + .HasComment("Id типа операции"); + + b.Property("LastUpdate") + .HasColumnType("timestamp without time zone") + .HasColumnName("last_update") + .HasComment("Дата последнего изменения"); + + b.Property("PressureMax") + .HasColumnType("double precision") + .HasColumnName("pressure_max") + .HasComment("Максимальное давление"); + + b.Property("PressureMin") + .HasColumnType("double precision") + .HasColumnName("pressure_min") + .HasComment("Минимальное давление"); + + b.Property("RotorSpeedMax") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_max") + .HasComment("Максимальные обороты на ВСП"); + + b.Property("RotorSpeedMin") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_min") + .HasComment("Минимальные обороты на ВСП"); + + b.Property("RotorTorqueMax") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_max") + .HasComment("Максимальный момент на ВСП"); + + b.Property("RotorTorqueMin") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_min") + .HasComment("Минимальный момент на ВСП"); + + b.HasKey("Id"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellOperationCategory"); + + b.ToTable("t_drill_flow_chart"); + + b + .HasComment("Параметры корридоров бурения (диапазоны параметров бурения)"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AxialLoadAvg") + .HasColumnType("double precision") + .HasColumnName("axial_load_avg") + .HasComment("Средняя нагрузка"); + + b.Property("AxialLoadMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_max") + .HasComment("Максимальная нагрузка"); + + b.Property("AxialLoadMin") + .HasColumnType("double precision") + .HasColumnName("axial_load_min") + .HasComment("Минимальная нагрузка"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина окончания интервала"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Стартовая глубина"); + + b.Property("FlowAvg") + .HasColumnType("double precision") + .HasColumnName("flow_avg") + .HasComment("Средний расход"); + + b.Property("FlowMax") + .HasColumnType("double precision") + .HasColumnName("flow_max") + .HasComment("Максимальный расход"); + + b.Property("FlowMin") + .HasColumnType("double precision") + .HasColumnName("flow_min") + .HasComment("Минимальный расход"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("well_id") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Id с типом секции скважины"); + + b.Property("PressureAvg") + .HasColumnType("double precision") + .HasColumnName("pressure_avg") + .HasComment("Среднее давление"); + + b.Property("PressureMax") + .HasColumnType("double precision") + .HasColumnName("pressure_max") + .HasComment("Максимальное давление"); + + b.Property("PressureMin") + .HasColumnType("double precision") + .HasColumnName("pressure_min") + .HasComment("Минимальное давление"); + + b.Property("RotorSpeedAvg") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_avg") + .HasComment("Средние обороты на ВСП"); + + b.Property("RotorSpeedMax") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_max") + .HasComment("Максимальные обороты на ВСП"); + + b.Property("RotorSpeedMin") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_min") + .HasComment("Минимальные обороты на ВСП"); + + b.Property("RotorTorqueAvg") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_avg") + .HasComment("Средний момент на ВСП"); + + b.Property("RotorTorqueMax") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_max") + .HasComment("Максимальный момент на ВСП"); + + b.Property("RotorTorqueMin") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_min") + .HasComment("Минимальный момент на ВСП"); + + b.HasKey("Id"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_drill_params"); + + b + .HasComment("Режим бурения в секции (диапазоны параметров бурения)"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_file_category"); + + b + .HasComment("Категории файлов"); + + b.HasData( + new + { + Id = 1, + Name = "Растворный сервис", + ShortName = "fluidService" + }, + new + { + Id = 2, + Name = "Цементирование", + ShortName = "cement" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "nnb" + }, + new + { + Id = 4, + Name = "ГТИ", + ShortName = "gti" + }, + new + { + Id = 5, + Name = "Документы по скважине", + ShortName = "wellDocuments" + }, + new + { + Id = 6, + Name = "Супервайзер", + ShortName = "supervisor" + }, + new + { + Id = 7, + Name = "Мастер", + ShortName = "master" + }, + new + { + Id = 8, + Name = "Последний замер бурового раствора ПЛАН", + ShortName = "fluidPlanLastData" + }, + new + { + Id = 9, + Name = "Последний замер бурового раствора ФАКТ", + ShortName = "fluidFactLastData" + }, + new + { + Id = 10, + Name = "Последние данные Шламограммы", + ShortName = "mudLastData" + }, + new + { + Id = 11, + Name = "Последние данные ННБ", + ShortName = "nnbLastData" + }, + new + { + Id = 12, + Name = "Рапорт", + ShortName = "report" + }, + new + { + Id = 13, + Name = "Программа бурения, части", + ShortName = "ПБч" + }, + new + { + Id = 14, + Name = "Программа бурения", + ShortName = "ПБ" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории файла"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Удален ли файл"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название файла"); + + b.Property("PublishInfo") + .HasColumnType("jsonb") + .HasColumnName("publish_info") + .HasComment("Информация о файле в облаке"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("file_size") + .HasComment("Размер файла"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_file_info"); + + b + .HasComment("Файлы всех категорий"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Comment") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateCreated") + .HasColumnType("timestamp without time zone") + .HasColumnName("date_created") + .HasComment("Дата совершенного действия"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла"); + + b.Property("IdMarkType") + .HasColumnType("integer") + .HasColumnName("id_mark_type") + .HasComment("0 - Согласован"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("id пользователя"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Помечен ли файл как удаленный"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdUser"); + + b.ToTable("t_file_mark"); + + b + .HasComment("Действия с файлами."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Measure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property>("Data") + .HasColumnType("jsonb") + .HasColumnName("data") + .HasComment("Данные таблицы последних данных"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Пометка удаленным"); + + b.Property("Timestamp") + .HasColumnType("timestamp without time zone") + .HasColumnName("timestamp") + .HasComment("время добавления"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_measure"); + + b + .HasComment("Таблица c данными для вкладки 'Последние данные'"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_measure_category"); + + b + .HasComment("Категория последних данных"); + + b.HasData( + new + { + Id = 1, + Name = "Показатели бурового раствора", + ShortName = "Раствор" + }, + new + { + Id = 2, + Name = "Шламограмма", + ShortName = "Шламограмма" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "ННБ" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("IdCompany", "IdWell"); + + b.HasIndex("IdWell"); + + b.ToTable("t_relation_company_well"); + + b + .HasComment("отношение скважин и компаний"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Begin") + .HasColumnType("timestamp with time zone") + .HasColumnName("begin"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end") + .HasComment("timestamp with time zone"); + + b.Property("Format") + .HasColumnType("integer") + .HasColumnName("format") + .HasComment("Формат отчета"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла-родителя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("Step") + .HasColumnType("integer") + .HasColumnName("step") + .HasComment("размер шага в секундах"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdWell"); + + b.ToTable("t_report_property"); + + b + .HasComment("Отчеты с данными по буровым"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); + + b.Property("RemoteUid") + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + + b.Property("TelemetryTimeZone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); + + b.ToTable("t_telemetry"); + + b + .HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("DurationSec") + .HasColumnType("integer") + .HasColumnName("duration_sec") + .HasComment("Кол-во секунд после предыдущей операции"); + + b.Property("IdOperation") + .HasColumnType("integer") + .HasColumnName("id_operation"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IsBitPositionDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_bit_position_decreasing") + .HasComment("Долото поднимается"); + + b.Property("IsBitPositionIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_bit_position_increasing") + .HasComment("Долото спускается"); + + b.Property("IsBitPositionLt20") + .HasColumnType("boolean") + .HasColumnName("is_bit_posision_lt_20") + .HasComment("Положение долота меньше 20м"); + + b.Property("IsBlockPositionDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_block_posision_decresing") + .HasComment("Талевый блок поднимается"); + + b.Property("IsBlockPositionIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_block_posision_incresing") + .HasComment("Талевый блок спускается"); + + b.Property("IsHookWeightLt3") + .HasColumnType("boolean") + .HasColumnName("is_hook_weight_lt_3") + .HasComment("Вес на крюке менее 3т"); + + b.Property("IsHookWeightNotChanges") + .HasColumnType("boolean") + .HasColumnName("is_hook_weight_not_changes") + .HasComment("Вес на крюке не меняется"); + + b.Property("IsPressureGt20") + .HasColumnType("boolean") + .HasColumnName("is_pressure_gt_20") + .HasComment("Давоение более 20"); + + b.Property("IsPressureLt20") + .HasColumnType("boolean") + .HasColumnName("is_pressure_lt_20") + .HasComment("Давление менее 20"); + + b.Property("IsRotorSpeedGt5") + .HasColumnType("boolean") + .HasColumnName("is_rotor_speed_gt_3") + .HasComment("Обороты ротора выше 3"); + + b.Property("IsRotorSpeedLt5") + .HasColumnType("boolean") + .HasColumnName("is_rotor_speed_lt_3") + .HasComment("Обороты ротора ниже 3"); + + b.Property("IsWellDepthDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_well_depth_decreasing") + .HasComment("Глубина забоя не увеличивается"); + + b.Property("IsWellDepthIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_well_depth_increasing") + .HasComment("Глубина забоя увеличивается"); + + b.Property("OperationEndDepth") + .HasColumnType("double precision") + .HasColumnName("operation_end_depth") + .HasComment("Глубина, на которой закончилась операция"); + + b.Property("OperationStartDepth") + .HasColumnType("double precision") + .HasColumnName("operation_start_depth") + .HasComment("Глубина, на которой началась операция"); + + b.Property("UnixDate") + .HasColumnType("bigint") + .HasColumnName("unix_date") + .HasComment("Unix timestamp для Linq запросов с вычислением дат"); + + b.HasKey("Id"); + + b.HasIndex("IdOperation"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_analysis"); + + b + .HasComment("События на скважине"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("AxialLoad") + .HasColumnType("real") + .HasColumnName("axial_load") + .HasComment("Осевая нагрузка"); + + b.Property("AxialLoadLimitMax") + .HasColumnType("real") + .HasColumnName("axial_load_limit_max") + .HasComment("Осевая нагрузка. Аварийная макс."); + + b.Property("AxialLoadSp") + .HasColumnType("real") + .HasColumnName("axial_load_sp") + .HasComment("Осевая нагрузка. Задание"); + + b.Property("BitDepth") + .HasColumnType("real") + .HasColumnName("bit_depth") + .HasComment("Положение инструмента"); + + b.Property("BlockPosition") + .HasColumnType("real") + .HasColumnName("block_position") + .HasComment("Высота талевого блока"); + + b.Property("BlockPositionMax") + .HasColumnType("real") + .HasColumnName("block_position_max") + .HasComment("Талевый блок. Макс положение"); + + b.Property("BlockPositionMin") + .HasColumnType("real") + .HasColumnName("block_position_min") + .HasComment("Талевый блок. Мин положение"); + + b.Property("BlockSpeed") + .HasColumnType("real") + .HasColumnName("block_speed") + .HasComment("Скорость талевого блока"); + + b.Property("BlockSpeedSp") + .HasColumnType("real") + .HasColumnName("block_speed_sp") + .HasComment("Скорости талевого блока. Задание"); + + b.Property("BlockSpeedSpDevelop") + .HasColumnType("real") + .HasColumnName("block_speed_sp_develop") + .HasComment("Талевый блок. Задание скорости для проработки"); + + b.Property("BlockSpeedSpRotor") + .HasColumnType("real") + .HasColumnName("block_speed_sp_rotor") + .HasComment("Талевый блок. Задание скорости для роторного бурения"); + + b.Property("BlockSpeedSpSlide") + .HasColumnType("real") + .HasColumnName("block_speed_sp_slide") + .HasComment("Талевый блок. Задание скорости для режима слайда"); + + b.Property("Flow") + .HasColumnType("real") + .HasColumnName("flow") + .HasComment("Расход"); + + b.Property("FlowDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("flow_delta_limit_max") + .HasComment("Расход. Аварийный макс."); + + b.Property("FlowIdle") + .HasColumnType("real") + .HasColumnName("flow_idle") + .HasComment("Расход. Холостой ход"); + + b.Property("HookWeight") + .HasColumnType("real") + .HasColumnName("hook_weight") + .HasComment("Вес на крюке"); + + b.Property("HookWeightIdle") + .HasColumnType("real") + .HasColumnName("hook_weight_idle") + .HasComment("Вес на крюке. Холостой ход"); + + b.Property("HookWeightLimitMax") + .HasColumnType("real") + .HasColumnName("hook_weight_limit_max") + .HasComment("Вес на крюке. Затяжка"); + + b.Property("HookWeightLimitMin") + .HasColumnType("real") + .HasColumnName("hook_weight_limit_min") + .HasComment("Вес на крюке. Посадка"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator") + .HasComment("Текущий критерий бурения"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Пользователь САУБ"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Режим САУБ"); + + b.Property("MseState") + .HasColumnType("smallint") + .HasColumnName("mse_state") + .HasComment("Текущее состояние работы MSE"); + + b.Property("Pressure") + .HasColumnType("real") + .HasColumnName("pressure") + .HasComment("Давление"); + + b.Property("PressureDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("pressure_delta_limit_max") + .HasComment("Давление дифф. Аварийное макс."); + + b.Property("PressureIdle") + .HasColumnType("real") + .HasColumnName("pressure_idle") + .HasComment("Давление. Холостой ход"); + + b.Property("PressureSp") + .HasColumnType("real") + .HasColumnName("pressure_sp") + .HasComment("Давление. Задание"); + + b.Property("PressureSpDevelop") + .HasColumnType("real") + .HasColumnName("pressure_sp_develop") + .HasComment("Давление. Задание для проработки"); + + b.Property("PressureSpRotor") + .HasColumnType("real") + .HasColumnName("pressure_sp_rotor") + .HasComment("Давление. Задание для роторного бурения"); + + b.Property("PressureSpSlide") + .HasColumnType("real") + .HasColumnName("pressure_sp_slide") + .HasComment("Давление. Задание для режима слайда"); + + b.Property("RotorSpeed") + .HasColumnType("real") + .HasColumnName("rotor_speed") + .HasComment("Обороты ротора"); + + b.Property("RotorTorque") + .HasColumnType("real") + .HasColumnName("rotor_torque") + .HasComment("Момент на роторе"); + + b.Property("RotorTorqueIdle") + .HasColumnType("real") + .HasColumnName("rotor_torque_idle") + .HasComment("Момент на роторе. Холостой ход"); + + b.Property("RotorTorqueLimitMax") + .HasColumnType("real") + .HasColumnName("rotor_torque_limit_max") + .HasComment("Момент на роторе. Аварийный макс."); + + b.Property("RotorTorqueSp") + .HasColumnType("real") + .HasColumnName("rotor_torque_sp") + .HasComment("Момент на роторе. Задание"); + + b.Property("WellDepth") + .HasColumnType("real") + .HasColumnName("well_depth") + .HasComment("Глубина забоя"); + + b.HasKey("IdTelemetry", "Date"); + + b.ToTable("t_telemetry_data_saub"); + + b + .HasComment("набор основных данных по SAUB"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("BreakAngleK") + .HasColumnType("real") + .HasColumnName("break_angle_k") + .HasComment("Коэффициент для расчёта за какой угол нужно тормозить"); + + b.Property("BreakAngleLeft") + .HasColumnType("real") + .HasColumnName("break_angle_left") + .HasComment("Угол торможения влево при работе по моменту"); + + b.Property("EncoderResolution") + .HasColumnType("real") + .HasColumnName("encoder_resolution") + .HasComment(" Разрешение энкодера"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Выбранный режим управления"); + + b.Property("PidMuxTorqueLeftLimit") + .HasColumnType("real") + .HasColumnName("pid_mux_torque_left_limit") + .HasComment(" Момент при котором определяется ехать назад по моменту или по скорости"); + + b.Property("PositionRight") + .HasColumnType("real") + .HasColumnName("position_right") + .HasComment("Крайний правый угол осциляции"); + + b.Property("PositionZero") + .HasColumnType("real") + .HasColumnName("position_zero") + .HasComment("Нулевая позиция осциляции"); + + b.Property("Ratio") + .HasColumnType("real") + .HasColumnName("ratio") + .HasComment(" Коэффициент редукции редектора"); + + b.Property("ReverseKTorque") + .HasColumnType("real") + .HasColumnName("reverse_k_torque") + .HasComment("Коэффициент на который умножается момент, для того чтобы система поняла что мы движемся в обратную сторону"); + + b.Property("ReverseSpeedSpZeroTime") + .HasColumnType("smallint") + .HasColumnName("reverse_speed_sp_zero_time") + .HasComment("Время выдачи сигнала нулевой скорости на при смене направления"); + + b.Property("RevolsLeftLimit") + .HasColumnType("real") + .HasColumnName("revols_left_limit") + .HasComment("Ограничение числа оборотов влево"); + + b.Property("RevolsLeftTotal") + .HasColumnType("real") + .HasColumnName("revols_left_total") + .HasComment("Суммарное количество оборотов влево"); + + b.Property("RevolsRightLimit") + .HasColumnType("real") + .HasColumnName("revols_right_limit") + .HasComment("Ограничение числа оборотов вправо"); + + b.Property("RevolsRightTotal") + .HasColumnType("real") + .HasColumnName("revols_right_total") + .HasComment("Суммарное количество оборотов вправо"); + + b.Property("RotorTorqueAvg") + .HasColumnType("real") + .HasColumnName("rotor_torque_avg") + .HasComment(" Момент в роторе средний"); + + b.Property("SpeedLeftSp") + .HasColumnType("real") + .HasColumnName("speed_left_sp") + .HasComment("Заданная скорость вращения влево"); + + b.Property("SpeedRightSp") + .HasColumnType("real") + .HasColumnName("speed_right_sp") + .HasComment("Заданная скорость вращения вправо"); + + b.Property("State") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("Переменная этапа"); + + b.Property("TopDriveSpeed") + .HasColumnType("real") + .HasColumnName("top_drive_speed") + .HasComment("Скорость СВП"); + + b.Property("TopDriveSpeedErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_speed_err"); + + b.Property("TopDriveSpeedMax") + .HasColumnType("real") + .HasColumnName("top_drive_speed_max") + .HasComment("верхний предел"); + + b.Property("TopDriveSpeedMin") + .HasColumnType("real") + .HasColumnName("top_drive_speed_min") + .HasComment("нижний предел"); + + b.Property("TopDriveSpeedOffset") + .HasColumnType("real") + .HasColumnName("top_drive_speed_offset") + .HasComment("смещение"); + + b.Property("TopDriveSpeedSpFrom") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from") + .HasComment("Заданная скорость c СВП"); + + b.Property("TopDriveSpeedSpFromErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_speed_sp_from_err"); + + b.Property("TopDriveSpeedSpFromMax") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from_max"); + + b.Property("TopDriveSpeedSpFromMin") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from_min"); + + b.Property("TopDriveSpeedSpFromOffset") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from_offset"); + + b.Property("TopDriveSpeedSpTo") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to") + .HasComment("Задание скорости на СВП"); + + b.Property("TopDriveSpeedSpToErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_speed_sp_to_err"); + + b.Property("TopDriveSpeedSpToMax") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to_max"); + + b.Property("TopDriveSpeedSpToMin") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to_min"); + + b.Property("TopDriveSpeedSpToOffset") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to_offset"); + + b.Property("TopDriveTorque") + .HasColumnType("real") + .HasColumnName("top_drive_torque") + .HasComment("Момент СВП"); + + b.Property("TopDriveTorqueErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_torque_err"); + + b.Property("TopDriveTorqueMax") + .HasColumnType("real") + .HasColumnName("top_drive_torque_max"); + + b.Property("TopDriveTorqueMin") + .HasColumnType("real") + .HasColumnName("top_drive_torque_min"); + + b.Property("TopDriveTorqueOffset") + .HasColumnType("real") + .HasColumnName("top_drive_torque_offset"); + + b.Property("TopDriveTorqueSpFrom") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from") + .HasComment("Заданный момент c СВП"); + + b.Property("TopDriveTorqueSpFromErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_torque_sp_from_err"); + + b.Property("TopDriveTorqueSpFromMax") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from_max"); + + b.Property("TopDriveTorqueSpFromMin") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from_min"); + + b.Property("TopDriveTorqueSpFromOffset") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from_offset"); + + b.Property("TopDriveTorqueSpTo") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to") + .HasComment("Задание момента на СВП"); + + b.Property("TopDriveTorqueSpToErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_torque_sp_to_err"); + + b.Property("TopDriveTorqueSpToMax") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to_max"); + + b.Property("TopDriveTorqueSpToMin") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to_min"); + + b.Property("TopDriveTorqueSpToOffset") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to_offset"); + + b.Property("TorqueLeftLimit") + .HasColumnType("real") + .HasColumnName("torque_left_limit") + .HasComment("Ограничение крутящего момента влево"); + + b.Property("TorqueRampTime") + .HasColumnType("real") + .HasColumnName("torque_ramp_time") + .HasComment("Время нарастания момента"); + + b.Property("TorqueRightLimit") + .HasColumnType("real") + .HasColumnName("torque_right_limit") + .HasComment("Ограничение крутящего момента вправо"); + + b.Property("TorqueStarting") + .HasColumnType("real") + .HasColumnName("torque_starting") + .HasComment(" Страгивающий момент"); + + b.Property("TurnLeftOnceByAngle") + .HasColumnType("real") + .HasColumnName("turn_left_once_by_angle") + .HasComment("Доворот по градусам единожды влево"); + + b.Property("TurnLeftOnceByRevols") + .HasColumnType("real") + .HasColumnName("turn_left_once_by_revols") + .HasComment("Доворот по оборотам единожды влево"); + + b.Property("TurnLeftOnceByTorque") + .HasColumnType("real") + .HasColumnName("turn_left_once_by_torque") + .HasComment("Доворот по моменту единожды влево"); + + b.Property("TurnRightOnceByAngle") + .HasColumnType("real") + .HasColumnName("turn_right_once_by_angle") + .HasComment("Доворот по градусам единожды вправо"); + + b.Property("TurnRightOnceByRevols") + .HasColumnType("real") + .HasColumnName("turn_right_once_by_revols") + .HasComment("Доворот по оборотам единожды вправо"); + + b.Property("TurnRightOnceByTorque") + .HasColumnType("real") + .HasColumnName("turn_right_once_by_torque") + .HasComment("Доворот по моменту единожды вправо"); + + b.Property("UnlockBySectorOut") + .HasColumnType("real") + .HasColumnName("unlock_by_sector_out") + .HasComment(" Градус отклонения от сектора для автоматического сброса блокировки"); + + b.Property("Ver") + .HasColumnType("real") + .HasColumnName("ver") + .HasComment("Версия ПО ПЛК"); + + b.Property("W2800") + .HasColumnType("smallint") + .HasColumnName("w2800") + .HasComment("Установка нуля энкодера"); + + b.Property("W2808") + .HasColumnType("smallint") + .HasColumnName("w2808") + .HasComment("Неисправность энкодера"); + + b.Property("W2810") + .HasColumnType("smallint") + .HasColumnName("w2810") + .HasComment(" автоматический сброс блокировки"); + + b.HasKey("IdTelemetry", "Date"); + + b.ToTable("t_telemetry_data_spin"); + + b + .HasComment("набор основных данных по SpinMaster"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.Property("MessageTemplate") + .HasColumnType("text") + .HasColumnName("message_template"); + + b.HasKey("IdTelemetry", "IdEvent"); + + b.ToTable("t_telemetry_event"); + + b + .HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Arg0") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg0") + .HasComment("Аргумент №0 для вставки в шаблон сообщения"); + + b.Property("Arg1") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg1"); + + b.Property("Arg2") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg2"); + + b.Property("Arg3") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg3"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdTelemetryUser") + .HasColumnType("integer") + .HasColumnName("id_telemetry_user") + .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака."); + + b.Property("WellDepth") + .HasColumnType("double precision") + .HasColumnName("well_depth"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_message"); + + b + .HasComment("Сообщения на буровых"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic"); + + b.Property("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname"); + + b.HasKey("IdTelemetry", "IdUser"); + + b.ToTable("t_telemetry_user"); + + b + .HasComment("Пользователи панели САУБ. Для сообщений."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdRole") + .HasColumnType("integer") + .HasColumnName("id_role"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Login") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("login"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("имя"); + + b.Property("PasswordHash") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("password_hash") + .HasComment("соленый хэш пароля.\nпервые 5 символов - соль"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("отчество"); + + b.Property("Phone") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("phone") + .HasComment("номер телефона"); + + b.Property("Position") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("position") + .HasComment("email"); + + b.Property("State") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n100 - удален"); + + b.Property("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("IdRole"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user"); + + b + .HasComment("Пользователи облака"); + + b.HasData( + new + { + Id = 1, + IdCompany = 1, + IdRole = 1, + Level = 2147483647, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b + .HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "Администратор" + }, + new + { + Id = 2, + Caption = "Пользователь" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("IdCluster") + .HasColumnType("integer") + .HasColumnName("id_cluster"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("state") + .HasComment("0 - неизвестно, 1 - в работе, 2 - завершена"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdWellType") + .HasColumnType("integer") + .HasColumnName("id_well_type"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.HasKey("Id"); + + b.HasIndex("IdCluster"); + + b.HasIndex("IdTelemetry") + .IsUnique(); + + b.HasIndex("IdWellType"); + + b.ToTable("t_well"); + + b + .HasComment("скважины"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины получателя"); + + b.Property("IdWellSrc") + .HasColumnType("integer") + .HasColumnName("id_well_src") + .HasComment("Id скважины композита"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции композита"); + + b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType"); + + b.HasIndex("IdWellSectionType"); + + b.HasIndex("IdWellSrc"); + + b.ToTable("t_well_сomposite"); + + b + .HasComment("Композитная скважина"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateStart") + .HasColumnType("timestamp without time zone") + .HasColumnName("date_start") + .HasComment("Дата начала операции"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина после завершения операции, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина на начало операции, м"); + + b.Property("DurationHours") + .HasColumnType("double precision") + .HasColumnName("duration_hours") + .HasComment("Продолжительность, часы"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0 = План или 1 = Факт"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции скважины"); + + b.HasKey("Id"); + + b.HasIndex("DateStart"); + + b.HasIndex("DepthEnd"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_well_operation"); + + b + .HasComment("Данные по операциям на скважине"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Code") + .HasColumnType("integer") + .HasColumnName("code") + .HasComment("Код операции"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории операции"); + + b.HasKey("Id"); + + b.ToTable("t_well_operation_category"); + + b + .HasComment("Справочник операций на скважине"); + + b.HasData( + new + { + Id = 1, + Code = 0, + Name = "Невозможно определить операцию" + }, + new + { + Id = 2, + Code = 0, + Name = "Роторное бурение" + }, + new + { + Id = 3, + Code = 0, + Name = "Слайдирование" + }, + new + { + Id = 4, + Code = 0, + Name = "Подъем с проработкой" + }, + new + { + Id = 5, + Code = 0, + Name = "Спуск с проработкой" + }, + new + { + Id = 6, + Code = 0, + Name = "Подъем с промывкой" + }, + new + { + Id = 7, + Code = 0, + Name = "Спуск с промывкой" + }, + new + { + Id = 8, + Code = 0, + Name = "Спуск в скважину" + }, + new + { + Id = 9, + Code = 0, + Name = "Спуск с вращением" + }, + new + { + Id = 10, + Code = 0, + Name = "Подъем из скважины" + }, + new + { + Id = 11, + Code = 0, + Name = "Подъем с вращением" + }, + new + { + Id = 12, + Code = 0, + Name = "Промывка в покое" + }, + new + { + Id = 13, + Code = 0, + Name = "Промывка с вращением" + }, + new + { + Id = 14, + Code = 0, + Name = "Удержание в клиньях" + }, + new + { + Id = 15, + Code = 0, + Name = "Неподвижное состояние" + }, + new + { + Id = 16, + Code = 0, + Name = "Вращение без циркуляции" + }, + new + { + Id = 17, + Code = 0, + Name = "На поверхности" + }, + new + { + Id = 1001, + Code = 0, + Name = "Бурение" + }, + new + { + Id = 1002, + Code = 0, + Name = "ГИС" + }, + new + { + Id = 1003, + Code = 0, + Name = "ГФР" + }, + new + { + Id = 1004, + Code = 0, + Name = "Монтаж ПВО" + }, + new + { + Id = 1005, + Code = 0, + Name = "Демонтаж ПВО" + }, + new + { + Id = 1006, + Code = 0, + Name = "Установка ФА" + }, + new + { + Id = 1007, + Code = 0, + Name = "Оборудование устья" + }, + new + { + Id = 1008, + Code = 0, + Name = "ОЗЦ" + }, + new + { + Id = 1009, + Code = 0, + Name = "Оборудование устья" + }, + new + { + Id = 1010, + Code = 0, + Name = "ОЗЦ" + }, + new + { + Id = 1011, + Code = 0, + Name = "Начало цикла строительства скважины" + }, + new + { + Id = 1012, + Code = 0, + Name = "Окончание цикла строительства скважины" + }, + new + { + Id = 1013, + Code = 0, + Name = "Опрессовка ПВО" + }, + new + { + Id = 1014, + Code = 0, + Name = "Опресовка Ц.К." + }, + new + { + Id = 1015, + Code = 0, + Name = "Опрессовка ВЗД" + }, + new + { + Id = 1016, + Code = 0, + Name = "Перевод скв на другой тип промывочной жидкости" + }, + new + { + Id = 1017, + Code = 0, + Name = "Перезапись каротажа" + }, + new + { + Id = 1018, + Code = 0, + Name = "Перетяжка талевого каната" + }, + new + { + Id = 1019, + Code = 0, + Name = "Наращивание, промывка" + }, + new + { + Id = 1020, + Code = 0, + Name = "Подъем инструмента" + }, + new + { + Id = 1021, + Code = 0, + Name = "Подъем инструмента с промывкой" + }, + new + { + Id = 1022, + Code = 0, + Name = "Обратная проработка" + }, + new + { + Id = 1023, + Code = 0, + Name = "Сборка инструмента" + }, + new + { + Id = 1024, + Code = 0, + Name = "Подготовительные работы" + }, + new + { + Id = 1025, + Code = 0, + Name = "Сборка КНБК" + }, + new + { + Id = 1026, + Code = 0, + Name = "Разборка КНБК" + }, + new + { + Id = 1027, + Code = 0, + Name = "Промывка" + }, + new + { + Id = 1028, + Code = 0, + Name = "Промежуточная промывка" + }, + new + { + Id = 1029, + Code = 0, + Name = "Прокачка пачек" + }, + new + { + Id = 1030, + Code = 0, + Name = "Разбуривание тех.оснастки" + }, + new + { + Id = 1031, + Code = 0, + Name = "Ремонт" + }, + new + { + Id = 1032, + Code = 0, + Name = "Спуск инструмента" + }, + new + { + Id = 1033, + Code = 0, + Name = "Спуск инструмента с промывкой" + }, + new + { + Id = 1034, + Code = 0, + Name = "Прямая проработка" + }, + new + { + Id = 1035, + Code = 0, + Name = "Принудительная проработка" + }, + new + { + Id = 1036, + Code = 0, + Name = "Спуск обсадной колонны" + }, + new + { + Id = 1037, + Code = 0, + Name = "Тех СПО-подъем" + }, + new + { + Id = 1038, + Code = 0, + Name = "Тех СПО-спуск" + }, + new + { + Id = 1039, + Code = 0, + Name = "Техническое обслуживание" + }, + new + { + Id = 1040, + Code = 0, + Name = "Цементаж" + }, + new + { + Id = 1041, + Code = 0, + Name = "Шаблонировка ствола" + }, + new + { + Id = 1042, + Code = 0, + Name = "Геологическое осложнение" + }, + new + { + Id = 1043, + Code = 0, + Name = "НПВ" + }, + new + { + Id = 1044, + Code = 0, + Name = "ВМР" + }, + new + { + Id = 1045, + Code = 0, + Name = "Прочее" + }, + new + { + Id = 1046, + Code = 0, + Name = "Спуск КНБК" + }, + new + { + Id = 1047, + Code = 0, + Name = "Подъем КНБК" + }, + new + { + Id = 1048, + Code = 0, + Name = "Спуск ОК" + }, + new + { + Id = 1050, + Code = 0, + Name = "Промывка при спуске ОК" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_well_section_type"); + + b + .HasComment("конструкция секции скважины"); + + b.HasData( + new + { + Id = 1, + Caption = "Пилотный ствол" + }, + new + { + Id = 2, + Caption = "Направление" + }, + new + { + Id = 3, + Caption = "Кондуктор" + }, + new + { + Id = 4, + Caption = "Эксплуатационная колонна" + }, + new + { + Id = 5, + Caption = "Транспортный ствол" + }, + new + { + Id = 6, + Caption = "Хвостовик" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_well_type"); + + b + .HasComment("конструкция скважины"); + + b.HasData( + new + { + Id = 1, + Caption = "Наклонно-направленная" + }, + new + { + Id = 2, + Caption = "Горизонтальная" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.HasOne("AsbCloudDb.Model.Deposit", "Deposit") + .WithMany("Clusters") + .HasForeignKey("IdDeposit") + .HasConstraintName("t_cluster_t_deposit_id_fk"); + + b.Navigation("Deposit"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.HasOne("AsbCloudDb.Model.CompanyType", "CompanyType") + .WithMany("Companies") + .HasForeignKey("IdCompanyType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CompanyType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("DrillParamsCollection") + .HasForeignKey("IdWellSectionType") + .HasConstraintName("t_drill_params_t_well_section_type_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany("Files") + .HasForeignKey("IdAuthor"); + + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("FileCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => + { + b.HasOne("AsbCloudDb.Model.FileInfo", "FileInfo") + .WithMany("FileMarks") + .HasForeignKey("IdFile") + .HasConstraintName("t_file_mark_t_file_info_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("FileMarks") + .HasForeignKey("IdUser") + .HasConstraintName("t_user_t_file_mark_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Measure", b => + { + b.HasOne("AsbCloudDb.Model.MeasureCategory", "Category") + .WithMany("Measures") + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdCompany") + .HasConstraintName("t_relation_company_well_t_company_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdWell") + .HasConstraintName("t_relation_company_well_t_well_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Company"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.HasOne("AsbCloudDb.Model.FileInfo", "File") + .WithMany() + .HasForeignKey("IdFile") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("File"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Operation") + .WithMany("Analysis") + .HasForeignKey("IdOperation") + .HasConstraintName("t_analysis_t_operation_id_fk") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Analysis") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_analysis_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Operation"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSaub") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSpin") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_event_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_messages_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .HasConstraintName("t_user_t_company_id_fk") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("AsbCloudDb.Model.UserRole", "Role") + .WithMany("Users") + .HasForeignKey("IdRole"); + + b.Navigation("Company"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.HasOne("AsbCloudDb.Model.Cluster", "Cluster") + .WithMany("Wells") + .HasForeignKey("IdCluster") + .HasConstraintName("t_well_t_cluster_id_fk"); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithOne("Well") + .HasForeignKey("AsbCloudDb.Model.Well", "IdTelemetry") + .HasConstraintName("t_well_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("AsbCloudDb.Model.WellType", "WellType") + .WithMany("Wells") + .HasForeignKey("IdWellType"); + + b.Navigation("Cluster"); + + b.Navigation("Telemetry"); + + b.Navigation("WellType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("WellComposites") + .HasForeignKey("IdWell") + .HasConstraintName("t_well_сomposite_t_well_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellComposites") + .HasForeignKey("IdWellSectionType") + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "WellSrc") + .WithMany("WellCompositeSrcs") + .HasForeignKey("IdWellSrc") + .HasConstraintName("t_well_сomposite_src_t_well_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + + b.Navigation("WellSrc"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("WellOperations") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellOperations") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Navigation("Wells"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => + { + b.Navigation("Companies"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Navigation("Clusters"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Navigation("FileMarks"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Navigation("Measures"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Navigation("Analysis"); + + b.Navigation("DataSaub"); + + b.Navigation("DataSpin"); + + b.Navigation("Events"); + + b.Navigation("Messages"); + + b.Navigation("Users"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.Navigation("FileMarks"); + + b.Navigation("Files"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("Users"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellComposites"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.Navigation("Analysis"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Navigation("DrillParamsCollection"); + + b.Navigation("WellComposites"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Navigation("Wells"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.cs b/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.cs new file mode 100644 index 00000000..47b31e5d --- /dev/null +++ b/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.cs @@ -0,0 +1,25 @@ +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace AsbCloudDb.Migrations +{ + public partial class Add_Telemetry_TimeZone : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "timezone", + table: "t_telemetry", + type: "jsonb", + nullable: true, + comment: "Смещение часового пояса от UTC"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "timezone", + table: "t_telemetry"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index ece92be7..22260841 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -768,6 +768,11 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + b.Property("TelemetryTimeZone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + b.HasKey("Id"); b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); diff --git a/AsbCloudDb/Model/Telemetry.cs b/AsbCloudDb/Model/Telemetry.cs index 403f0c81..2f18c729 100644 --- a/AsbCloudDb/Model/Telemetry.cs +++ b/AsbCloudDb/Model/Telemetry.cs @@ -1,5 +1,4 @@ using Microsoft.EntityFrameworkCore; -using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -27,6 +26,9 @@ namespace AsbCloudDb.Model [Column("info", TypeName = "jsonb"), Comment("Информация с панели о скважине")] public TelemetryInfo Info { get; set; } + + [Column("timezone", TypeName = "jsonb"), Comment("Смещение часового пояса от UTC")] + public TelemetryTimeZone TelemetryTimeZone { get; set; } [InverseProperty(nameof(Model.Well.Telemetry))] public virtual Well Well { get; set; } diff --git a/AsbCloudDb/Model/TelemetryTimeZone.cs b/AsbCloudDb/Model/TelemetryTimeZone.cs new file mode 100644 index 00000000..d1074840 --- /dev/null +++ b/AsbCloudDb/Model/TelemetryTimeZone.cs @@ -0,0 +1,9 @@ +namespace AsbCloudDb.Model +{ + public class TelemetryTimeZone + { + public double Hours { get; set; } + public string TimeZoneId { get; set; } + public bool IsOverride { get; set; } + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 10dc2982..fd1b36b3 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -47,6 +47,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); // admin crud services: services.AddTransient, CrudServiceBase>(); diff --git a/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsBackgroundService.cs b/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsBackgroundService.cs index a7cf2429..43bb80f0 100644 --- a/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsBackgroundService.cs @@ -40,7 +40,8 @@ namespace AsbCloudInfrastructure.Services.Analysis try { 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, telemetryService, cacheDb); diff --git a/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsService.cs b/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsService.cs index ff86b651..c2c6381a 100644 --- a/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsService.cs +++ b/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsService.cs @@ -231,13 +231,9 @@ namespace AsbCloudInfrastructure.Services.Analysis public async Task AnalyzeAndSaveTelemetriesAsync(CancellationToken token = default) { - var allTelemetryIds = await db.TelemetryDataSaub - .Select(t => t.IdTelemetry) - .Distinct() - .ToListAsync(token) - .ConfigureAwait(false); + var allTelemetryIds = await db.Telemetries.Select(t => t.Id).ToListAsync(token).ConfigureAwait(false); - foreach(var idTelemetry in allTelemetryIds) + foreach (var idTelemetry in allTelemetryIds) { var analyzeStartDate = await GetLastAnalysisDateAsync(idTelemetry, token).ConfigureAwait(false); await AnalyseAndSaveTelemetryAsync(idTelemetry, analyzeStartDate, token).ConfigureAwait(false); @@ -294,7 +290,7 @@ namespace AsbCloudInfrastructure.Services.Analysis } } - public async Task GetOperationsDateRangeAsync(int idWell, + public async Task GetOperationsDateRangeAsync(int idWell, bool isUtc, CancellationToken token = default) { var telemetryId = telemetryService.GetIdTelemetryByIdWell(idWell); @@ -315,13 +311,21 @@ namespace AsbCloudInfrastructure.Services.Analysis .FirstOrDefaultAsync(token) .ConfigureAwait(false); - return new DatesRangeDto + var result = new DatesRangeDto { From = DateTimeOffset.FromUnixTimeSeconds(datesRange.From).DateTime, To = datesRange.To == default ? DateTime.MaxValue : DateTimeOffset.FromUnixTimeSeconds(datesRange.To).DateTime }; + + if (isUtc) + return result; + + result = await telemetryService.FixDatesRangeByTimeZoneAsync((int)telemetryId, result, token) + .ConfigureAwait(false); + + return result; } private async Task GetLastAnalysisDateAsync(int idTelemetry, CancellationToken token = default) diff --git a/AsbCloudInfrastructure/Services/MessageService.cs b/AsbCloudInfrastructure/Services/MessageService.cs index 07f08283..56fd30e6 100644 --- a/AsbCloudInfrastructure/Services/MessageService.cs +++ b/AsbCloudInfrastructure/Services/MessageService.cs @@ -16,6 +16,7 @@ namespace AsbCloudInfrastructure.Services { private readonly IAsbCloudDbContext db; private readonly ITelemetryService telemetryService; + private readonly CacheTable cacheTelemetry; private readonly CacheTable cacheEvents; private readonly CacheTable cacheTUsers; @@ -23,6 +24,7 @@ namespace AsbCloudInfrastructure.Services { this.db = db; this.telemetryService = telemetryService; + cacheTelemetry = cacheDb.GetCachedTable((AsbCloudDbContext)db); cacheEvents = cacheDb.GetCachedTable((AsbCloudDbContext)db); cacheTUsers = cacheDb.GetCachedTable((AsbCloudDbContext)db); } @@ -35,18 +37,19 @@ namespace AsbCloudInfrastructure.Services string searchString = default, int skip = 0, int take = 32, + bool isUtc = true, CancellationToken token = default) { - var telemetryId = telemetryService.GetIdTelemetryByIdWell(idWell); - if (telemetryId is null) + var idTelemetry = telemetryService.GetIdTelemetryByIdWell(idWell); + if (idTelemetry is null) return null; - var events = cacheEvents.Where(e => e.IdTelemetry == telemetryId); + var events = cacheEvents.Where(e => e.IdTelemetry == idTelemetry); if (!events.Any()) 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(); if ((categoryids?.Any() == true) || !string.IsNullOrEmpty(searchString)) @@ -67,6 +70,16 @@ namespace AsbCloudInfrastructure.Services 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) query = query.Where(m => m.Date >= begin); @@ -89,7 +102,7 @@ namespace AsbCloudInfrastructure.Services if (messagesList.Count == 0) return result; - var users = cacheTUsers.Where(u => u.IdTelemetry == telemetryId); + var users = cacheTUsers.Where(u => u.IdTelemetry == idTelemetry); foreach (var message in messagesList) { @@ -121,10 +134,19 @@ namespace AsbCloudInfrastructure.Services result.Items.Add(messageDto); } + if (isUtc && timeOffset is not null) + return result; + + result.Items = result.Items.Select(m => + { + m.Date = telemetryService.TimeZoneService.DateToTimeZone( m.Date, timeOffset ?? default); + return m; + }).ToList(); + return result; } - public async Task GetMessagesDatesRangeAsync(int idWell, + public async Task GetMessagesDatesRangeAsync(int idWell, bool isUtc, CancellationToken token = default) { var telemetryId = telemetryService.GetIdTelemetryByIdWell(idWell); @@ -134,7 +156,15 @@ namespace AsbCloudInfrastructure.Services var (From, To) = await db.GetDatesRangeAsync((int)telemetryId, token) .ConfigureAwait(false); - return new DatesRangeDto { From = From, To = To }; + var result = new DatesRangeDto { From = From, To = To }; + + if (isUtc) + return result; + + result = await telemetryService.FixDatesRangeByTimeZoneAsync((int)telemetryId, result, token) + .ConfigureAwait(false); + + return result; } public Task InsertAsync(string uid, IEnumerable dtos, diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index 2c9cad6b..180d9287 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -97,7 +97,7 @@ namespace AsbCloudInfrastructure.Services return generator.GetPagesCount(); } - public async Task GetReportsDatesRangeAsync(int idWell, + public async Task GetReportsDatesRangeAsync(int idWell, bool isUtc, CancellationToken token = default) { var telemetryId = telemetryService.GetIdTelemetryByIdWell(idWell); @@ -121,11 +121,19 @@ namespace AsbCloudInfrastructure.Services .FirstOrDefaultAsync(token) .ConfigureAwait(false); - return new DatesRangeDto + var result = new DatesRangeDto { From = datesRange.From, To = datesRange.To.Year == 1 ? DateTime.MaxValue : datesRange.To }; + + if (isUtc) + return result; + + result = await telemetryService.FixDatesRangeByTimeZoneAsync((int)telemetryId, result, token) + .ConfigureAwait(false); + + return result; } public Task> GetSuitableReportsAsync(int idWell, DateTime begin, DateTime end, int stepSeconds, int format, CancellationToken token) => diff --git a/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs index e23be42b..e3272ef5 100644 --- a/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs @@ -4,7 +4,6 @@ using AsbCloudDb.Model; using AsbCloudDb; using AsbCloudInfrastructure.Services.Cache; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; using System; using System.Collections.Generic; using System.Diagnostics; @@ -20,7 +19,6 @@ namespace AsbCloudInfrastructure.Services { private readonly IAsbCloudDbContext db; private readonly ITelemetryService telemetryService; - protected readonly CacheTable cacheTelemetry; protected readonly CacheTable cacheTelemetryUsers; protected readonly CacheTable cacheWells; @@ -32,7 +30,6 @@ namespace AsbCloudInfrastructure.Services { this.db = db; this.telemetryService = telemetryService; - cacheTelemetry = cacheDb.GetCachedTable((AsbCloudDbContext)db); cacheTelemetryUsers = cacheDb.GetCachedTable((AsbCloudDbContext)db); cacheWells = cacheDb.GetCachedTable((AsbCloudDbContext)db); @@ -59,36 +56,42 @@ namespace AsbCloudInfrastructure.Services foreach (var duplicate in duplicates) dtosList.Remove(duplicate); } + + var offsetHours = await telemetryService.GetTelemetryTimeZoneOffsetAsync(idTelemetry, token); - var enitties = dtosList.Select(d => { - var e = Convert(d); - e.IdTelemetry = idTelemetry; - return e; + var entities = dtosList.Select(d => { + var e = Convert(d); + e.IdTelemetry = idTelemetry; + if(offsetHours is not null) + e.Date = telemetryService.TimeZoneService.DateToUtc(d.Date, (double)offsetHours); + return e; }); var dbset = db.Set(); try { - return await db.Database.ExecInsertOrUpdateAsync(dbset, enitties, token).ConfigureAwait(false); + return await db.Database.ExecInsertOrUpdateAsync(dbset, entities, token).ConfigureAwait(false); } 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; } } public virtual async Task> GetAsync(int idWell, DateTime dateBegin = default, double intervalSec = 600d, - int approxPointsCount = 1024, CancellationToken token = default) + int approxPointsCount = 1024, bool isUtc = false, CancellationToken token = default) { var well = cacheWells.FirstOrDefault(w => w.Id == idWell); if (well?.IdTelemetry is null) return default; + var idTelemetry = well?.IdTelemetry ?? default; + if (dateBegin == default) { - dateBegin = telemetryService.GetLastTelemetryDate(well.IdTelemetry ?? 0); + dateBegin = telemetryService.GetLastTelemetryDate(idTelemetry); if (dateBegin != default) dateBegin = dateBegin.AddSeconds(-intervalSec); } @@ -99,13 +102,19 @@ namespace AsbCloudInfrastructure.Services if (dateBegin.Kind == DateTimeKind.Unspecified) 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(); - var query = from data in dbSet - where data.IdTelemetry == well.IdTelemetry - && data.Date >= dateBegin && data.Date < datEnd - select data; + var query = dbSet + .Where(d => d.IdTelemetry == idTelemetry + && d.Date >= dateBegin + && d.Date < dateEnd); var fullDataCount = await query.CountAsync(token) .ConfigureAwait(false); @@ -128,20 +137,41 @@ namespace AsbCloudInfrastructure.Services var dtos = entities.Select(e => Convert(e)); + if (isUtc) + return dtos; + + if (timeOffset is null) + return dtos; + + dtos = dtos.Select(d => + { + d.Date = telemetryService.TimeZoneService.DateToTimeZone(d.Date, timeOffset ?? default); + return d; + }); + return dtos; } - public virtual async Task GetDataDatesRangeAsync(int idWell, + public virtual async Task GetDataDatesRangeAsync(int idWell, bool isUtc, CancellationToken token = default) { var telemetryId = telemetryService.GetIdTelemetryByIdWell(idWell); if (telemetryId is null) return null; - var (From, To) = await db.GetDatesRangeAsync((int)telemetryId, token) + var telemetry = await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == telemetryId, token) .ConfigureAwait(false); - return new DatesRangeDto { From = From, To = To }; + var dto = telemetryService.TelemetryTracker.GetTelemetryDateRangeByUid(telemetry.RemoteUid); + + if (isUtc) + return dto; + + dto = await telemetryService.FixDatesRangeByTimeZoneAsync((int)telemetryId, dto, token) + .ConfigureAwait(false); + + return dto; + } public abstract TDto Convert(TModel src); diff --git a/AsbCloudInfrastructure/Services/TelemetryDataSaubService.cs b/AsbCloudInfrastructure/Services/TelemetryDataSaubService.cs index c2b1248f..5ac438c9 100644 --- a/AsbCloudInfrastructure/Services/TelemetryDataSaubService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryDataSaubService.cs @@ -6,7 +6,7 @@ using Mapster; namespace AsbCloudInfrastructure.Services { - public class TelemetryDataSaubService: TelemetryDataBaseService + public class TelemetryDataSaubService: TelemetryDataBaseService { public TelemetryDataSaubService( IAsbCloudDbContext db, diff --git a/AsbCloudInfrastructure/Services/TelemetryDataSpinService.cs b/AsbCloudInfrastructure/Services/TelemetryDataSpinService.cs index a753da67..86ce23b5 100644 --- a/AsbCloudInfrastructure/Services/TelemetryDataSpinService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryDataSpinService.cs @@ -6,7 +6,7 @@ using Mapster; namespace AsbCloudInfrastructure.Services { - public class TelemetryDataSpinService : TelemetryDataBaseService + public class TelemetryDataSpinService : TelemetryDataBaseService { public TelemetryDataSpinService( IAsbCloudDbContext db, diff --git a/AsbCloudInfrastructure/Services/TelemetryService.cs b/AsbCloudInfrastructure/Services/TelemetryService.cs index 5bf4a11a..26ba1f27 100644 --- a/AsbCloudInfrastructure/Services/TelemetryService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryService.cs @@ -5,7 +5,9 @@ using AsbCloudInfrastructure.Services.Cache; using Mapster; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using System; +using System.Threading; using Microsoft.EntityFrameworkCore; namespace AsbCloudInfrastructure.Services @@ -14,16 +16,28 @@ namespace AsbCloudInfrastructure.Services { private readonly CacheTable cacheTelemetry; private readonly CacheTable cacheWells; + private readonly CacheTable cacheClusters; + private readonly CacheTable cacheDeposits; private readonly IAsbCloudDbContext db; private readonly ITelemetryTracker telemetryTracker; + private readonly ITimeZoneService timeZoneService; - public TelemetryService(IAsbCloudDbContext db, ITelemetryTracker telemetryTracker, + public ITimeZoneService TimeZoneService => timeZoneService; + public ITelemetryTracker TelemetryTracker => telemetryTracker; + + public TelemetryService( + IAsbCloudDbContext db, + ITelemetryTracker telemetryTracker, + ITimeZoneService timeZoneService, CacheDb cacheDb) { cacheTelemetry = cacheDb.GetCachedTable((AsbCloudDbContext)db); cacheWells = cacheDb.GetCachedTable((AsbCloudDbContext)db); + cacheClusters = cacheDb.GetCachedTable((AsbCloudDbContext)db); + cacheDeposits = cacheDb.GetCachedTable((AsbCloudDbContext)db); this.db = db; this.telemetryTracker = telemetryTracker; + this.timeZoneService = timeZoneService; } public IEnumerable GetTransmittingTelemetriesAsync(int idCompany) @@ -69,11 +83,92 @@ namespace AsbCloudInfrastructure.Services public double GetTimezoneOffsetByTelemetryId(int idTelemetry) => cacheTelemetry.FirstOrDefault(t => t.Id == idTelemetry).Info?.TimeZoneOffsetTotalHours ?? 0d; - public void UpdateInfo(string uid, TelemetryInfoDto info) + public async Task UpdateInfoAsync(string uid, TelemetryInfoDto info, + CancellationToken token) { var telemetry = GetOrCreateTelemetryByUid(uid); telemetry.Info = info.Adapt(); - cacheTelemetry.Upsert(telemetry); + + if (!string.IsNullOrEmpty(info.TimeZoneId) && + telemetry.TelemetryTimeZone?.IsOverride != true) + telemetry.TelemetryTimeZone = new TelemetryTimeZone() + { + Hours = info.TimeZoneOffsetTotalHours, + TimeZoneId = info.TimeZoneId + }; + + await cacheTelemetry.UpsertAsync(telemetry, token) + .ConfigureAwait(false); + } + + public async Task GetTelemetryTimeZoneOffsetAsync(int idTelemetry, CancellationToken token) + { + var telemetry = + await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == idTelemetry, token); + + if (!string.IsNullOrEmpty(telemetry.TelemetryTimeZone?.TimeZoneId)) + return telemetry.TelemetryTimeZone.Hours; + + if (!string.IsNullOrEmpty(telemetry.Info?.TimeZoneId)) + { + telemetry.TelemetryTimeZone = new TelemetryTimeZone + { + 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(); + } + + await cacheTelemetry.UpsertAsync(telemetry, token).ConfigureAwait(false); + + return telemetry.TelemetryTimeZone.Hours; + } + + public async Task FixDatesRangeByTimeZoneAsync(int idTelemetry, DatesRangeDto range, + CancellationToken token) + { + var offset = await GetTelemetryTimeZoneOffsetAsync(idTelemetry, token); + + if (offset is null) + return range; + + return new DatesRangeDto() + { + From = timeZoneService.DateToTimeZone(range.From, offset ?? default), + To = timeZoneService.DateToTimeZone(range.To, offset ?? default), + }; + } + + public async Task UpdateTimeZoneAsync(string uid, TelemetryTimeZoneDto timeZoneInfo, + CancellationToken token) + { + var telemetry = GetOrCreateTelemetryByUid(uid); + var newTelemetryTimeZone = timeZoneInfo.Adapt(); + if (newTelemetryTimeZone?.Equals(telemetry.TelemetryTimeZone) == true) + return; + await cacheTelemetry.UpsertAsync(telemetry, token) + .ConfigureAwait(false); } public int? GetIdTelemetryByIdWell(int idWell) @@ -85,6 +180,33 @@ namespace AsbCloudInfrastructure.Services return well.IdTelemetry; } + private async Task<(double latitude, double 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 ?? default, well.Longitude??default); + + 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 ?? default, cluster.Longitude ?? default); + + 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 ?? default, deposit.Longitude ?? default); + + return null; + } + private Well GetWellByTelemetryUid(string uid) { var tele = cacheTelemetry.FirstOrDefault(t => t.RemoteUid == uid); @@ -247,5 +369,7 @@ namespace AsbCloudInfrastructure.Services return rows; } + + } } diff --git a/AsbCloudInfrastructure/Services/TelemetryTracker.cs b/AsbCloudInfrastructure/Services/TelemetryTracker.cs index 19140309..f05b9dbc 100644 --- a/AsbCloudInfrastructure/Services/TelemetryTracker.cs +++ b/AsbCloudInfrastructure/Services/TelemetryTracker.cs @@ -8,6 +8,7 @@ using Microsoft.EntityFrameworkCore; using System.Collections.Concurrent; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; +using AsbCloudApp.Data; namespace AsbCloudInfrastructure.Services { @@ -25,70 +26,78 @@ namespace AsbCloudInfrastructure.Services public DateTime LastTimeServer { get; set; } /// - /// Время указанное в данных последнего запроса (из удаленного источника) + /// Дата первых данных в БД /// - public DateTime LastTimeRemote { get; set; } + public DateTime TelemetryDateMin { get; set; } + + /// + /// Дата последних данных в БД + /// + public DateTime TelemetryDateMax { get; set; } + } - private readonly ConcurrentDictionary requests; + private readonly ConcurrentDictionary telemetriesStats; public TelemetryTracker(CacheDb cacheDb, IConfiguration configuration) { var options = new DbContextOptionsBuilder() .UseNpgsql(configuration.GetConnectionString("DefaultConnection")) .Options; - using var db = new AsbCloudDbContext(options); + var db = new AsbCloudDbContext(options); var cacheTelemetry = cacheDb.GetCachedTable(db); var keyValuePairs = new Dictionary(cacheTelemetry.Count()); foreach (var telemetry in cacheTelemetry) { - var date = telemetry.Info?.DrillingStartDate - ?? GetDateByUidOrDefault(telemetry.RemoteUid, DateTime.MinValue); + var date = telemetry.Info?.DrillingStartDate + ?? ParseDateFromUidOrDefault(telemetry.RemoteUid, DateTime.MinValue); - keyValuePairs[telemetry.RemoteUid] = new TrackerStat { + keyValuePairs[telemetry.RemoteUid] = new TrackerStat + { RemoteUid = telemetry.RemoteUid, - LastTimeRemote = date, + TelemetryDateMin = date, + TelemetryDateMax = date, LastTimeServer = date, }; } - requests = new ConcurrentDictionary(keyValuePairs); + telemetriesStats = new ConcurrentDictionary(keyValuePairs); - Task.Run(async() => { - db.Database.SetCommandTimeout(2 * 60); + Task.Run(async () => + { + db.Database.SetCommandTimeout(2 * 60); var dates = await db.TelemetryDataSaub .GroupBy(d => d.IdTelemetry) .Select(g => new { IdTelemetry = g.Key, - Date = g.Max(d=>d.Date) + DateMax = g.Max(d => d.Date), + DateMin = g.Min(d => d.Date), }) .AsNoTracking() .ToListAsync() .ConfigureAwait(false); + db.Dispose(); - + var oldReqs = dates.Select(t => new { - Uid = cacheTelemetry.FirstOrDefault(c => c.Id == t.IdTelemetry).RemoteUid, - t.Date, - }); + Uid = cacheTelemetry.FirstOrDefault(c => c.Id == t.IdTelemetry)?.RemoteUid, + t.DateMax, + t.DateMin, + }).Where(s => !string.IsNullOrEmpty(s.Uid)); foreach (var oldReq in oldReqs) { - var request = requests.GetValueOrDefault(oldReq.Uid); - if(request is not null) - { - if (request.LastTimeRemote < oldReq.Date) - request.LastTimeRemote = oldReq.Date; - if (request.LastTimeServer < oldReq.Date) - request.LastTimeServer = oldReq.Date; - } + var telemetryStat = telemetriesStats.GetOrAdd(oldReq.Uid, (uid) => new TrackerStat { RemoteUid = uid }); + telemetryStat.TelemetryDateMin = oldReq.DateMin; + telemetryStat.TelemetryDateMax = oldReq.DateMax; + telemetryStat.LastTimeServer = oldReq.DateMax; } }); } - private static DateTime GetDateByUidOrDefault(string remoteUid, DateTime defaultValue = default) + private static DateTime ParseDateFromUidOrDefault(string remoteUid, DateTime defaultValue = default) { //eg: uid = 20211102_173407926 if (string.IsNullOrEmpty(remoteUid) || (remoteUid.Length != 18)) @@ -105,20 +114,30 @@ namespace AsbCloudInfrastructure.Services public void SaveRequestDate(string uid, DateTime remoteDate) { - var stat = requests.GetValueOrDefault(uid); - if(stat is null) - { - stat = new TrackerStat{ RemoteUid = uid }; - requests[uid] = stat; - } + var stat = telemetriesStats.GetOrAdd(uid, (uid) => new TrackerStat { + RemoteUid = uid, + TelemetryDateMin = remoteDate} + ); stat.LastTimeServer = DateTime.Now; - stat.LastTimeRemote = remoteDate; + stat.TelemetryDateMax = remoteDate; } public DateTime GetLastTelemetryDateByUid(string uid) => - requests.GetValueOrDefault(uid)?.LastTimeRemote ?? default; + telemetriesStats.GetValueOrDefault(uid)?.TelemetryDateMax ?? default; + + + public DatesRangeDto GetTelemetryDateRangeByUid(string uid) + { + var stat = telemetriesStats.GetValueOrDefault(uid); + var range = new DatesRangeDto + { + From = stat?.TelemetryDateMin ?? default, + To = stat?.TelemetryDateMax ?? default, + }; + return range; + } public IEnumerable GetTransmittingTelemetriesUids() => - requests.Keys; + telemetriesStats.Keys; } } diff --git a/AsbCloudInfrastructure/Services/TimeZoneService.cs b/AsbCloudInfrastructure/Services/TimeZoneService.cs new file mode 100644 index 00000000..ac1cea7d --- /dev/null +++ b/AsbCloudInfrastructure/Services/TimeZoneService.cs @@ -0,0 +1,92 @@ +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 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(responseJson, options); + + return new TelemetryTimeZoneDto + { + Hours = timeZoneInfo.DstOffset, + IsOverride = false, + TimeZoneId = timeZoneInfo.TimezoneId, + }; + } + + public DateTime DateToUtc(DateTime date, double remoteTimezoneOffsetHours) + { + if (date == default) + return new DateTime(0, DateTimeKind.Utc); + + 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) + { + if (date == default) + return new DateTime(0, DateTimeKind.Unspecified); + + var newDate = date.Kind switch + { + DateTimeKind.Local => date.ToUniversalTime().AddHours(remoteTimezoneOffsetHours), + DateTimeKind.Utc => date.AddHours(remoteTimezoneOffsetHours), + _ => date, + }; + return DateTime.SpecifyKind(newDate, DateTimeKind.Unspecified); + } + } +} diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 3e546705..f34d68a6 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -110,6 +110,7 @@ namespace AsbCloudInfrastructure.Services return dto; } + public async Task GetWellCaptionByIdAsync(int idWell, CancellationToken token) { var entity = await cacheWells.FirstOrDefaultAsync(w => w.Id == idWell, token).ConfigureAwait(false); @@ -138,30 +139,14 @@ namespace AsbCloudInfrastructure.Services }; } - public async Task> GetClusterWellsIdsAsync(int idWell, CancellationToken token) - { - var well = await cacheWells.FirstOrDefaultAsync(w => w.Id == idWell) - .ConfigureAwait(false); - - if (well is null) - return null; - - var clusterWells = await cacheWells.WhereAsync(w => w.IdCluster == well.IdCluster) - .ConfigureAwait(false); - - return clusterWells.Select(w => w.Id); - - } - private WellDto Convert(Well well) { return new WellDto { Id = well.Id, Caption = well.Caption, - IdCluster = well.IdCluster, - Cluster = well.Cluster.Caption, - Deposit = well.Cluster.Deposit.Caption, + Cluster = well.Cluster?.Caption, + Deposit = well.Cluster?.Deposit?.Caption, LastTelemetryDate = GetLastTelemetryDate(well.Id), IdWellType = well.IdWellType ?? default, IdState = well.IdState, diff --git a/AsbCloudWebApi/AsbCloudWebApi.csproj b/AsbCloudWebApi/AsbCloudWebApi.csproj index 738633de..95ae553b 100644 --- a/AsbCloudWebApi/AsbCloudWebApi.csproj +++ b/AsbCloudWebApi/AsbCloudWebApi.csproj @@ -42,5 +42,7 @@ + + diff --git a/AsbCloudWebApi/Controllers/MessageController.cs b/AsbCloudWebApi/Controllers/MessageController.cs index f63fcd1d..b4bbd35d 100644 --- a/AsbCloudWebApi/Controllers/MessageController.cs +++ b/AsbCloudWebApi/Controllers/MessageController.cs @@ -31,6 +31,7 @@ namespace AsbCloudWebApi.Controllers /// для пагинации кол-во записей пропустить /// для пагинации кол-во записей /// Строка поиска + /// Даты в формате UTC или часового пояса скважины /// Токен для отмены задачи /// список сообщений по скважине [HttpGet] @@ -39,6 +40,7 @@ namespace AsbCloudWebApi.Controllers [FromQuery] IEnumerable categoryids = default, DateTime begin = default, DateTime end = default, string searchString = default, + bool isUtc = true, CancellationToken token = default) { if (take > 1024) @@ -49,7 +51,7 @@ namespace AsbCloudWebApi.Controllers var result = await messageService.GetMessagesAsync(idWell, categoryids, begin, end, searchString, - skip, take, token).ConfigureAwait(false); + skip, take, isUtc, token).ConfigureAwait(false); if (result is null || result.Count == 0) return NoContent(); @@ -62,11 +64,12 @@ namespace AsbCloudWebApi.Controllers /// /// id скважины /// Токен для отмены задачи + /// Смена дат с UTC формата на часовой пояс скважины /// список сообщений по скважине [HttpGet] [Route("datesRange")] [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetMessagesDateRangeAsync(int idWell, + public async Task GetMessagesDateRangeAsync(int idWell, bool isUtc = true, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); @@ -80,8 +83,8 @@ namespace AsbCloudWebApi.Controllers if (!isCompanyOwnsWell) return Forbid(); - DatesRangeDto wellMessagesDatesRange = await messageService.GetMessagesDatesRangeAsync(idWell, - token); + var wellMessagesDatesRange = await messageService.GetMessagesDatesRangeAsync(idWell, + isUtc, token); return Ok(wellMessagesDatesRange); } diff --git a/AsbCloudWebApi/Controllers/ReportController.cs b/AsbCloudWebApi/Controllers/ReportController.cs index 121739a5..5777ce4f 100644 --- a/AsbCloudWebApi/Controllers/ReportController.cs +++ b/AsbCloudWebApi/Controllers/ReportController.cs @@ -167,11 +167,12 @@ namespace AsbCloudWebApi.Controllers /// /// id скважины /// Токен для отмены задачи + /// Смена дат с UTC формата на часовой пояс скважины /// Даты самого старого и самого свежего отчетов в БД [HttpGet] [Route("datesRange")] [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetReportsDateRangeAsync(int idWell, + public async Task GetReportsDateRangeAsync(int idWell, bool isUtc = true, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); @@ -183,7 +184,7 @@ namespace AsbCloudWebApi.Controllers idWell, token).ConfigureAwait(false)) return Forbid(); - DatesRangeDto wellReportsDatesRange = await reportService.GetReportsDatesRangeAsync(idWell, + var wellReportsDatesRange = await reportService.GetReportsDatesRangeAsync(idWell, isUtc, token).ConfigureAwait(false); return Ok(wellReportsDatesRange); diff --git a/AsbCloudWebApi/Controllers/TelemetryAnalyticsController.cs b/AsbCloudWebApi/Controllers/TelemetryAnalyticsController.cs index 7880e039..f6f86485 100644 --- a/AsbCloudWebApi/Controllers/TelemetryAnalyticsController.cs +++ b/AsbCloudWebApi/Controllers/TelemetryAnalyticsController.cs @@ -176,11 +176,12 @@ namespace AsbCloudWebApi.Controllers /// /// id скважины /// Токен для отмены задачи + /// Смена дат с UTC формата на часовой пояс скважины /// Даты самой первой и самой последней операций на скважине [HttpGet] [Route("datesRange")] [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetOperationsDateRangeAsync(int idWell, + public async Task GetOperationsDateRangeAsync(int idWell, bool isUtc = true, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); @@ -192,8 +193,8 @@ namespace AsbCloudWebApi.Controllers idWell, token).ConfigureAwait(false)) return Forbid(); - DatesRangeDto wellOperationsDatesRange = await analyticsService.GetOperationsDateRangeAsync(idWell, - token).ConfigureAwait(false); + var wellOperationsDatesRange = await analyticsService.GetOperationsDateRangeAsync(idWell, + isUtc, token).ConfigureAwait(false); return Ok(wellOperationsDatesRange); } diff --git a/AsbCloudWebApi/Controllers/TelemetryController.cs b/AsbCloudWebApi/Controllers/TelemetryController.cs index 77736f10..765c2e99 100644 --- a/AsbCloudWebApi/Controllers/TelemetryController.cs +++ b/AsbCloudWebApi/Controllers/TelemetryController.cs @@ -42,13 +42,32 @@ namespace AsbCloudWebApi.Controllers /// Принимает общую информацию по скважине /// /// Уникальный идентификатор отправителя - /// нформация об отправителе + /// Информация об отправителе + /// Токен отмены задачи /// [HttpPost] [Route("{uid}/info")] - public IActionResult PostInfo(string uid, [FromBody] TelemetryInfoDto info) + public async Task PostInfoAsync(string uid, [FromBody] TelemetryInfoDto info, + CancellationToken token = default) { - telemetryService.UpdateInfo(uid, info); + await telemetryService.UpdateInfoAsync(uid, info, token).ConfigureAwait(false); + return Ok(); + } + + /// + /// Обновляет часовой пояс скважины + /// + /// Уникальный идентификатор отправителя + /// Информация о часовом поясе + /// Токен отмены задачи + /// + [HttpPost] + [Route("{uid}/timeZone")] + public async Task UpdateTimeZoneAsync(string uid, TelemetryTimeZoneDto timeZoneInfo, + CancellationToken token = default) + { + await telemetryService.UpdateTimeZoneAsync(uid, timeZoneInfo, token) + .ConfigureAwait(false); return Ok(); } @@ -104,33 +123,5 @@ namespace AsbCloudWebApi.Controllers telemetryUserService.Upsert(uid, users); return Ok(); } - - ///// - ///// Загрузка архива (sqlite3). - ///// - ///// 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(); - ///// - ///// - ///// - ///// - ///// - //[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(); - //} - } } diff --git a/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs b/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs index 04fdc659..1e5bd396 100644 --- a/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs +++ b/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs @@ -68,11 +68,12 @@ namespace AsbCloudWebApi.Controllers /// дата начала выборки. По умолчанию: текущее время - intervalSec /// интервал времени даты начала выборки, секунды /// желаемое количество точек. Если в выборке точек будет больше, то выборка будет прорежена. + /// Даты в формате UTC или часового пояса скважины /// Токен завершения задачи /// [HttpGet("{idWell}")] public virtual async Task> GetDataAsync(int idWell, DateTime begin = default, - int intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default) + int intervalSec = 600, int approxPointsCount = 1024, bool isUtc = false, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); @@ -86,7 +87,7 @@ namespace AsbCloudWebApi.Controllers return Forbid(); var content = await telemetryDataService.GetAsync(idWell, begin, - intervalSec, approxPointsCount, token).ConfigureAwait(false); + intervalSec, approxPointsCount, isUtc, token).ConfigureAwait(false); return Ok(content); } @@ -95,12 +96,13 @@ namespace AsbCloudWebApi.Controllers /// Возвращает диапазон дат сохраненных данных. /// /// id скважины + /// Смена дат с UTC формата на часовой пояс скважины /// Токен завершения задачи /// [HttpGet] [Route("{idWell}/datesRange")] [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] - public virtual async Task GetDataDatesRangeAsync(int idWell, + public virtual async Task GetDataDatesRangeAsync(int idWell, bool isUtc = false, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); @@ -114,7 +116,7 @@ namespace AsbCloudWebApi.Controllers if (!isCompanyOwnsWell) return Forbid(); - var dataDatesRange = await telemetryDataService.GetDataDatesRangeAsync(idWell, + var dataDatesRange = await telemetryDataService.GetDataDatesRangeAsync(idWell, isUtc, token).ConfigureAwait(false); return Ok(dataDatesRange); diff --git a/AsbCloudWebApi/Docs/Timezone info api credentials.md b/AsbCloudWebApi/Docs/Timezone info api credentials.md new file mode 100644 index 00000000..43d38ee0 --- /dev/null +++ b/AsbCloudWebApi/Docs/Timezone info api credentials.md @@ -0,0 +1,12 @@ +# url +https://www.geonames.org/commercial-webservices.html + +# учетная запись для аутентификации на сайте +Имя пользователя: asbautodrilling +Пароль: asbautodrilling1! + +# имя пользователя для запросов +asbautodrilling + +# Пример запроса +http://api.geonames.org/timezoneJSON?lat=60.8705722222222&lng=70.3811888888889&username=asbautodrilling \ No newline at end of file diff --git a/AsbCloudWebApi/Program.cs b/AsbCloudWebApi/Program.cs index d4106a2e..73cd343f 100644 --- a/AsbCloudWebApi/Program.cs +++ b/AsbCloudWebApi/Program.cs @@ -7,6 +7,7 @@ namespace AsbCloudWebApi { public static void Main(string[] args) { + //new TraceListenerView(); // to trace mysterious errors CreateHostBuilder(args).Build().Run(); } diff --git a/AsbCloudWebApi/TraceListenerView.cs b/AsbCloudWebApi/TraceListenerView.cs new file mode 100644 index 00000000..3d45c690 --- /dev/null +++ b/AsbCloudWebApi/TraceListenerView.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; + +namespace AsbCloudWebApi +{ + public class TraceListenerView : TraceListener + { + public TraceListenerView() + { + Trace.Listeners.Add(this); + } + + public override void Write(object o) + { + base.Write(o); + } + + public override void Write(string message) + { + //throw new NotImplementedException(); + } + + public override void WriteLine(string message) + { + //throw new NotImplementedException(); + } + } +} diff --git a/AsbCloudWebApi/appsettings.json b/AsbCloudWebApi/appsettings.json index fd0ca1a8..55675a79 100644 --- a/AsbCloudWebApi/appsettings.json +++ b/AsbCloudWebApi/appsettings.json @@ -7,7 +7,7 @@ } }, "ConnectionStrings": { - "DefaultConnection": "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True;", + "DefaultConnection": "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True", "DebugConnection": "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True;Include Error Detail=True", "ServerConnection": "Host=192.168.1.70;Database=postgres;Username=postgres;Password=q;Persist Security Info=True", "LocalConnection": "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True" diff --git a/DataTable/DataTable.csproj b/DataTable/DataTable.csproj deleted file mode 100644 index 20827042..00000000 --- a/DataTable/DataTable.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - Exe - net5.0 - - - diff --git a/DataTable/Header.cs b/DataTable/Header.cs deleted file mode 100644 index 471ce6cc..00000000 --- a/DataTable/Header.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace DataTable -{ - [Serializable] - public class Header - { - public string Name { get; set; } - public string Desctiption { get; set; } - //public System.Type ColumnType { get; set; } = typeof(object); - public string ColumnType { get; set; } - } -} \ No newline at end of file diff --git a/DataTable/Program.cs b/DataTable/Program.cs deleted file mode 100644 index b7bdb23a..00000000 --- a/DataTable/Program.cs +++ /dev/null @@ -1,83 +0,0 @@ -namespace DataTable -{ - class Program - { - static void Main(/*string[] args*/) - { - //var listDtos = new List(100); - - /* *** Size of TestDto calc *** - * - * ** data binary size (Not implemented) ** - * Date : DateTime : 4b - * Mode : int32? : 4b - * User : string : 2-64b - * WellDepth : double? : 8b - * TOTAL data size = 18-80b - * - * ** header binary size (Not implemented) ** - * - *DateTime : len("DateTime") + 2 + len("Date") + 2 = 16b - * Mode : 14b - * User : 14b - * WellDepth : 20b - * columnsCount : 2b - * TOTAL header size = 66b - * - * ** json as tab ** - * - * header size: 137b - * json row size: 63b - * - * total for 1 record : 200b - * total for 2 records : 263b - * - * ** json as list ** - * - * Raw listItem size: 175b - * total for 2 records : 350b - * - * ** example 100 records ** - * tabJsonBytes: 6602 - * listJsonBytes: 9628 - * tabBinBytes: 7765 (by dangerous BinaryFormatter) - * listBinBytes: 4366 (by dangerous BinaryFormatter) - */ - - //for (int i = 0; i < 100; i++) - // listDtos.Add(new TestDto{ - // Date = DateTime.Now.AddSeconds(i), - // Mode = 1, - // WellDepth = i * Math.PI - // }); - - //var tMapper = new TableMapper(); - - //var tab = tMapper.MakeTable(listDtos); - - //var e = tMapper.AsEnumerable(tab); - - //var tabJson = JsonSerializer.Serialize(tab); - //var listJson = JsonSerializer.Serialize(listDtos); - - //var tabJsonBytes = JsonSerializer.SerializeToUtf8Bytes(tab); - //var listJsonBytes = JsonSerializer.SerializeToUtf8Bytes(listDtos); - - //var formatter = new BinaryFormatter(); - //var mem = new MemoryStream(); - //formatter.Serialize(mem, tab); - //var tabBinBytes = new byte[mem.Length]; - //Array.Copy(mem.GetBuffer(), tabBinBytes, mem.Length); - - //mem = new MemoryStream(); - //formatter.Serialize(mem, listDtos); - //var listBinBytes = new byte[mem.Length]; - //Array.Copy(mem.GetBuffer(), listBinBytes, mem.Length); - - //Console.WriteLine($"tabJsonBytes:{tabJsonBytes.Length}"); - //Console.WriteLine($"listJsonBytes:{listJsonBytes.Length}"); - //Console.WriteLine($"tabBinBytes:{tabBinBytes.Length}"); - //Console.WriteLine($"listBinBytes:{listBinBytes.Length}"); - } - } -} diff --git a/DataTable/PropertyHelper.cs b/DataTable/PropertyHelper.cs deleted file mode 100644 index 9b453051..00000000 --- a/DataTable/PropertyHelper.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq.Expressions; -using System.Reflection; - -namespace DataTable -{ - /// - /// Ускоренный обработчик свойства - /// - class PropertyHelper - { - delegate void SetterDelegate(object instanse, object[] values); - - delegate object GetterDelegate(object instanse); - - public string PropertyName { get; } - public string PropertyDesctiption { get; } - public Type PropertyType { get; } - public string Id { get; } - - SetterDelegate Setter { get; } - GetterDelegate Getter { get; } - public PropertyHelper(PropertyInfo property) - { - PropertyName = property.Name; - PropertyType = property.PropertyType; - Id = MakeIdentity(property.PropertyType.Name, property.Name); - PropertyDesctiption = GetDescription(property); - - var setter = property.SetMethod; - var getter = property.GetMethod; - - var instanceExpression = Expression.Parameter(typeof(object), "instance"); - var argumentsExpression = Expression.Parameter(typeof(object[]), "arguments"); - var argumentExpressions = new List { Expression.Convert(Expression.ArrayIndex(argumentsExpression, Expression.Constant(0)), PropertyType) }; - var callExpression = Expression.Call(Expression.Convert(instanceExpression, setter.ReflectedType), setter, argumentExpressions); - Setter = Expression.Lambda(callExpression, instanceExpression, argumentsExpression).Compile(); - callExpression = Expression.Call(Expression.Convert(instanceExpression, getter.ReflectedType), getter); - Getter = Expression.Lambda(Expression.Convert(callExpression, typeof(object)), instanceExpression).Compile(); - } - - private string GetDescription(PropertyInfo property) - { - var descriptionAttr = property.GetCustomAttribute(); - return descriptionAttr?.Description ?? string.Empty; - } - - void SetValues(object instance, params object[] values) - => Setter(instance, values); - - public void Set(object instance, object value) - => SetValues(instance, value); - - public object Get(object instance) - => Getter(instance); - - public static string MakeIdentity(string propertyTypeName, string propertyName) - => $"{propertyTypeName}_{propertyName}".ToLower(); - } -} diff --git a/DataTable/Table.cs b/DataTable/Table.cs deleted file mode 100644 index b5f8f5ae..00000000 --- a/DataTable/Table.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataTable -{ - [Serializable] - public class Table - { - public IEnumerable
Headers { get; set; } - - public IEnumerable> Rows { get; set; } - - } -} diff --git a/DataTable/TableMapper.cs b/DataTable/TableMapper.cs deleted file mode 100644 index 1af75273..00000000 --- a/DataTable/TableMapper.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System.Collections.Generic; -using System.Linq; - -namespace DataTable -{ - public class TableMapper - where T : new() - { - private readonly Dictionary props; - - public TableMapper() - { - var props = typeof(T).GetProperties(); - this.props = new Dictionary(props.Length); - foreach (var prop in props) - { - var helper = new PropertyHelper(prop); - this.props.Add(helper.Id, helper); - } - } - - public IEnumerable AsEnumerable(Table table) - { - if ((table?.Headers is null) || - (table?.Rows is null) || - (!table.Headers.Any()) || - (!table.Rows.Any()) || - (!props.Any())) - yield break; - - var headerIdToProp = new Dictionary(props.Count); - foreach (var (_, propHelper) in props) - for (var i = 0; i < table.Headers.Count(); i++) - { - var header = table.Headers.ElementAt(i); - var columnType = System.Type.GetType(header.ColumnType); - if (columnType.IsAssignableTo(propHelper.PropertyType) && - ((header.Name == propHelper.PropertyName) || - (header.Name.ToLower() == propHelper.PropertyName.ToLower()))) - headerIdToProp.Add(i, propHelper); - } - - if (!headerIdToProp.Any()) - yield break; - - foreach (var row in table.Rows) - { - var obj = new T(); - foreach (var (i, propHelper) in headerIdToProp) - propHelper.Set(obj, row.ElementAt(i)); - yield return obj; - } - - yield break; - } - - public Table MakeTable(IEnumerable data) - { - var table = new Table(); - table.Headers = props.Select(pair => new Header - { - Name = pair.Value.PropertyName, - ColumnType = pair.Value.PropertyType.Name, - }).ToArray(); - - var rows = new List>(data.Count()); - foreach (var dataItem in data) - rows.Add(MakeRow(dataItem)); - - table.Rows = rows; - - return table; - } - - private List MakeRow(T dataItem) - { - var colunms = new List(props.Count); - foreach (var (_, propHelper) in props) - { - var propValue = propHelper.Get(dataItem); - colunms.Add(propValue); - } - return colunms; - } - - } -} diff --git a/DataTable/TestDto.cs b/DataTable/TestDto.cs deleted file mode 100644 index 78824ba1..00000000 --- a/DataTable/TestDto.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.ComponentModel; - -namespace DataTable -{ - [Serializable] - public class TestDto - { - [Description("Дата")] - public DateTime Date { get; set; } = DateTime.Now; - - public int? Mode { get; set; } - - [Description("Пользователь")] - public string User { get; set; } - - [Description("Глубина забоя")] - public double? WellDepth { get; set; } - } -} diff --git a/SyncDicts/Connected Services/AsbCloudApi/AsbCloudApi.cs b/SyncDicts/Connected Services/AsbCloudApi/AsbCloudApi.cs deleted file mode 100644 index e6b4f571..00000000 --- a/SyncDicts/Connected Services/AsbCloudApi/AsbCloudApi.cs +++ /dev/null @@ -1,1487 +0,0 @@ -//---------------------- -// -// Generated using the NSwag toolchain v13.10.9.0 (NJsonSchema v10.4.1.0 (Newtonsoft.Json v12.0.0.2)) (http://NSwag.org) -// -//---------------------- - -#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended." -#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." -#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?' -#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ... -#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..." -#pragma warning disable 8073 // Disable "CS8073 The result of the expression is always 'false' since a value of type 'T' is never equal to 'null' of type 'T?'" - -namespace SyncDicts.AsbCloudApi -{ - using System = global::System; - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.10.9.0 (NJsonSchema v10.4.1.0 (Newtonsoft.Json v12.0.0.2))")] - public partial class Client - { - private string _baseUrl = ""; - private System.Net.Http.HttpClient _httpClient; - private System.Lazy _settings; - - public Client(string baseUrl, System.Net.Http.HttpClient httpClient) - { - BaseUrl = baseUrl; - _httpClient = httpClient; - _settings = new System.Lazy(CreateSerializerSettings); - } - - private System.Text.Json.JsonSerializerOptions CreateSerializerSettings() - { - var settings = new System.Text.Json.JsonSerializerOptions(); - UpdateJsonSerializerSettings(settings); - return settings; - } - - public string BaseUrl - { - get { return _baseUrl; } - set { _baseUrl = value; } - } - - protected System.Text.Json.JsonSerializerOptions JsonSerializerSettings { get { return _settings.Value; } } - - partial void UpdateJsonSerializerSettings(System.Text.Json.JsonSerializerOptions settings); - - - partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); - partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); - partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); - /// Аутентификация пользователя - /// новый токен - /// A server side error occurred. - public System.Threading.Tasks.Task AuthLoginAsync(AuthDto body) - { - return AuthLoginAsync(body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// Аутентификация пользователя - /// новый токен - /// A server side error occurred. - public async System.Threading.Tasks.Task AuthLoginAsync(AuthDto body, System.Threading.CancellationToken cancellationToken) - { - var urlBuilder_ = new System.Text.StringBuilder(); - urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/auth/login"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var content_ = new System.Net.Http.StringContent(System.Text.Json.JsonSerializer.Serialize(body, _settings.Value)); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/plain")); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - if (status_ == 400) - { - string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("\u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442", status_, responseText_, headers_, null); - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// Продление срока действия токена - /// Success - /// A server side error occurred. - public System.Threading.Tasks.Task AuthRefreshAsync() - { - return AuthRefreshAsync(System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// Продление срока действия токена - /// Success - /// A server side error occurred. - public async System.Threading.Tasks.Task AuthRefreshAsync(System.Threading.CancellationToken cancellationToken) - { - var urlBuilder_ = new System.Text.StringBuilder(); - urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/auth/refresh"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// Возвращает данные САУБ по скважине. - /// По умолчанию за последние 10 минут. - /// id скважины - /// дата начала выборки. По умолчанию: текущее время - intervalSec - /// интервал времени даты начала выборки, секунды - /// желаемое количество точек. Если в выборке точек будет больше, то выборка будет прорежена. - /// Success - /// A server side error occurred. - public System.Threading.Tasks.Task> ApiWellDataAsync(int wellId, System.DateTimeOffset? begin, int? intervalSec, int? approxPointsCount) - { - return ApiWellDataAsync(wellId, begin, intervalSec, approxPointsCount, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// Возвращает данные САУБ по скважине. - /// По умолчанию за последние 10 минут. - /// id скважины - /// дата начала выборки. По умолчанию: текущее время - intervalSec - /// интервал времени даты начала выборки, секунды - /// желаемое количество точек. Если в выборке точек будет больше, то выборка будет прорежена. - /// Success - /// A server side error occurred. - public async System.Threading.Tasks.Task> ApiWellDataAsync(int wellId, System.DateTimeOffset? begin, int? intervalSec, int? approxPointsCount, System.Threading.CancellationToken cancellationToken) - { - if (wellId == null) - throw new System.ArgumentNullException("wellId"); - - var urlBuilder_ = new System.Text.StringBuilder(); - urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/well/{wellId}/data?"); - urlBuilder_.Replace("{wellId}", System.Uri.EscapeDataString(ConvertToString(wellId, System.Globalization.CultureInfo.InvariantCulture))); - if (begin != null) - { - urlBuilder_.Append(System.Uri.EscapeDataString("begin") + "=").Append(System.Uri.EscapeDataString(begin.Value.ToString("s", System.Globalization.CultureInfo.InvariantCulture))).Append("&"); - } - if (intervalSec != null) - { - urlBuilder_.Append(System.Uri.EscapeDataString("intervalSec") + "=").Append(System.Uri.EscapeDataString(ConvertToString(intervalSec, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); - } - if (approxPointsCount != null) - { - urlBuilder_.Append(System.Uri.EscapeDataString("approxPointsCount") + "=").Append(System.Uri.EscapeDataString(ConvertToString(approxPointsCount, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); - } - urlBuilder_.Length--; - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/plain")); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// Выдает список сообщений по скважине - /// id скважины - /// для пагинации кол-во записей пропустить - /// для пагинации кол-во записей - /// список категорий - /// дата начала - /// окончание - /// Success - /// A server side error occurred. - public System.Threading.Tasks.Task ApiWellMessageAsync(int wellId, int? skip, int? take, System.Collections.Generic.IEnumerable categoryids, System.DateTimeOffset? begin, System.DateTimeOffset? end) - { - return ApiWellMessageAsync(wellId, skip, take, categoryids, begin, end, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// Выдает список сообщений по скважине - /// id скважины - /// для пагинации кол-во записей пропустить - /// для пагинации кол-во записей - /// список категорий - /// дата начала - /// окончание - /// Success - /// A server side error occurred. - public async System.Threading.Tasks.Task ApiWellMessageAsync(int wellId, int? skip, int? take, System.Collections.Generic.IEnumerable categoryids, System.DateTimeOffset? begin, System.DateTimeOffset? end, System.Threading.CancellationToken cancellationToken) - { - if (wellId == null) - throw new System.ArgumentNullException("wellId"); - - var urlBuilder_ = new System.Text.StringBuilder(); - urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/well/{wellId}/message?"); - urlBuilder_.Replace("{wellId}", System.Uri.EscapeDataString(ConvertToString(wellId, System.Globalization.CultureInfo.InvariantCulture))); - if (skip != null) - { - urlBuilder_.Append(System.Uri.EscapeDataString("skip") + "=").Append(System.Uri.EscapeDataString(ConvertToString(skip, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); - } - if (take != null) - { - urlBuilder_.Append(System.Uri.EscapeDataString("take") + "=").Append(System.Uri.EscapeDataString(ConvertToString(take, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); - } - if (categoryids != null) - { - foreach (var item_ in categoryids) { urlBuilder_.Append(System.Uri.EscapeDataString("categoryids") + "=").Append(System.Uri.EscapeDataString(ConvertToString(item_, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } - } - if (begin != null) - { - urlBuilder_.Append(System.Uri.EscapeDataString("begin") + "=").Append(System.Uri.EscapeDataString(begin.Value.ToString("s", System.Globalization.CultureInfo.InvariantCulture))).Append("&"); - } - if (end != null) - { - urlBuilder_.Append(System.Uri.EscapeDataString("end") + "=").Append(System.Uri.EscapeDataString(end.Value.ToString("s", System.Globalization.CultureInfo.InvariantCulture))).Append("&"); - } - urlBuilder_.Length--; - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/plain")); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// Принимает общую информацию по скважине - /// Уникальный идентификатор отправителя - /// нформация об отправителе - /// Success - /// A server side error occurred. - public System.Threading.Tasks.Task ApiTelemetryInfoAsync(string uid, TelemetryInfoDto body) - { - return ApiTelemetryInfoAsync(uid, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// Принимает общую информацию по скважине - /// Уникальный идентификатор отправителя - /// нформация об отправителе - /// Success - /// A server side error occurred. - public async System.Threading.Tasks.Task ApiTelemetryInfoAsync(string uid, TelemetryInfoDto body, System.Threading.CancellationToken cancellationToken) - { - if (uid == null) - throw new System.ArgumentNullException("uid"); - - var urlBuilder_ = new System.Text.StringBuilder(); - urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/telemetry/{uid}/info"); - urlBuilder_.Replace("{uid}", System.Uri.EscapeDataString(ConvertToString(uid, System.Globalization.CultureInfo.InvariantCulture))); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var content_ = new System.Net.Http.StringContent(System.Text.Json.JsonSerializer.Serialize(body, _settings.Value)); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// Принимает данные от разных систем по скважине - /// Уникальный идентификатор отправителя - /// Данные - /// Success - /// A server side error occurred. - public System.Threading.Tasks.Task ApiTelemetryDataAsync(string uid, System.Collections.Generic.IEnumerable body) - { - return ApiTelemetryDataAsync(uid, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// Принимает данные от разных систем по скважине - /// Уникальный идентификатор отправителя - /// Данные - /// Success - /// A server side error occurred. - public async System.Threading.Tasks.Task ApiTelemetryDataAsync(string uid, System.Collections.Generic.IEnumerable body, System.Threading.CancellationToken cancellationToken) - { - if (uid == null) - throw new System.ArgumentNullException("uid"); - - var urlBuilder_ = new System.Text.StringBuilder(); - urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/telemetry/{uid}/data"); - urlBuilder_.Replace("{uid}", System.Uri.EscapeDataString(ConvertToString(uid, System.Globalization.CultureInfo.InvariantCulture))); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var content_ = new System.Net.Http.StringContent(System.Text.Json.JsonSerializer.Serialize(body, _settings.Value)); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// Принимает список новых сообщений от телеметрии - /// Уникальный идентификатор отправителя - /// сообщения - /// Success - /// A server side error occurred. - public System.Threading.Tasks.Task ApiTelemetryMessageAsync(string uid, System.Collections.Generic.IEnumerable body) - { - return ApiTelemetryMessageAsync(uid, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// Принимает список новых сообщений от телеметрии - /// Уникальный идентификатор отправителя - /// сообщения - /// Success - /// A server side error occurred. - public async System.Threading.Tasks.Task ApiTelemetryMessageAsync(string uid, System.Collections.Generic.IEnumerable body, System.Threading.CancellationToken cancellationToken) - { - if (uid == null) - throw new System.ArgumentNullException("uid"); - - var urlBuilder_ = new System.Text.StringBuilder(); - urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/telemetry/{uid}/message"); - urlBuilder_.Replace("{uid}", System.Uri.EscapeDataString(ConvertToString(uid, System.Globalization.CultureInfo.InvariantCulture))); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var content_ = new System.Net.Http.StringContent(System.Text.Json.JsonSerializer.Serialize(body, _settings.Value)); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// Принимает справочник событий - /// Уникальный идентификатор отправителя - /// справочник событий - /// Success - /// A server side error occurred. - public System.Threading.Tasks.Task ApiTelemetryEventAsync(string uid, System.Collections.Generic.IEnumerable body) - { - return ApiTelemetryEventAsync(uid, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// Принимает справочник событий - /// Уникальный идентификатор отправителя - /// справочник событий - /// Success - /// A server side error occurred. - public async System.Threading.Tasks.Task ApiTelemetryEventAsync(string uid, System.Collections.Generic.IEnumerable body, System.Threading.CancellationToken cancellationToken) - { - if (uid == null) - throw new System.ArgumentNullException("uid"); - - var urlBuilder_ = new System.Text.StringBuilder(); - urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/telemetry/{uid}/event"); - urlBuilder_.Replace("{uid}", System.Uri.EscapeDataString(ConvertToString(uid, System.Globalization.CultureInfo.InvariantCulture))); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var content_ = new System.Net.Http.StringContent(System.Text.Json.JsonSerializer.Serialize(body, _settings.Value)); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// Принимает справочник пользователей телеметрии - /// Уникальный идентификатор отправителя - /// справочник пользователей телеметрии - /// Success - /// A server side error occurred. - public System.Threading.Tasks.Task ApiTelemetryUserAsync(string uid, System.Collections.Generic.IEnumerable body) - { - return ApiTelemetryUserAsync(uid, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// Принимает справочник пользователей телеметрии - /// Уникальный идентификатор отправителя - /// справочник пользователей телеметрии - /// Success - /// A server side error occurred. - public async System.Threading.Tasks.Task ApiTelemetryUserAsync(string uid, System.Collections.Generic.IEnumerable body, System.Threading.CancellationToken cancellationToken) - { - if (uid == null) - throw new System.ArgumentNullException("uid"); - - var urlBuilder_ = new System.Text.StringBuilder(); - urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/telemetry/{uid}/user"); - urlBuilder_.Replace("{uid}", System.Uri.EscapeDataString(ConvertToString(uid, System.Globalization.CultureInfo.InvariantCulture))); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var content_ = new System.Net.Http.StringContent(System.Text.Json.JsonSerializer.Serialize(body, _settings.Value)); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// Success - /// A server side error occurred. - public System.Threading.Tasks.Task ApiTelemetryDbAsync(string uid, System.Collections.Generic.IEnumerable files) - { - return ApiTelemetryDbAsync(uid, files, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// Success - /// A server side error occurred. - public async System.Threading.Tasks.Task ApiTelemetryDbAsync(string uid, System.Collections.Generic.IEnumerable files, System.Threading.CancellationToken cancellationToken) - { - if (uid == null) - throw new System.ArgumentNullException("uid"); - - var urlBuilder_ = new System.Text.StringBuilder(); - urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/telemetry/{uid}/db"); - urlBuilder_.Replace("{uid}", System.Uri.EscapeDataString(ConvertToString(uid, System.Globalization.CultureInfo.InvariantCulture))); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var boundary_ = System.Guid.NewGuid().ToString(); - var content_ = new System.Net.Http.MultipartFormDataContent(boundary_); - content_.Headers.Remove("Content-Type"); - content_.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary_); - if (files == null) - throw new System.ArgumentNullException("files"); - else - { - foreach (var item_ in files) - { - var content_files_ = new System.Net.Http.StreamContent(item_.Data); - if (!string.IsNullOrEmpty(item_.ContentType)) - content_files_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse(item_.ContentType); - content_.Add(content_files_, "files", item_.FileName ?? "files"); - } - } - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// Success - /// A server side error occurred. - public System.Threading.Tasks.Task> ApiWellAsync() - { - return ApiWellAsync(System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// Success - /// A server side error occurred. - public async System.Threading.Tasks.Task> ApiWellAsync(System.Threading.CancellationToken cancellationToken) - { - var urlBuilder_ = new System.Text.StringBuilder(); - urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/well"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/plain")); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - protected struct ObjectResponseResult - { - public ObjectResponseResult(T responseObject, string responseText) - { - this.Object = responseObject; - this.Text = responseText; - } - - public T Object { get; } - - public string Text { get; } - } - - public bool ReadResponseAsString { get; set; } - - protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) - { - if (response == null || response.Content == null) - { - return new ObjectResponseResult(default(T), string.Empty); - } - - if (ReadResponseAsString) - { - var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); - try - { - var typedBody = System.Text.Json.JsonSerializer.Deserialize(responseText, JsonSerializerSettings); - return new ObjectResponseResult(typedBody, responseText); - } - catch (System.Text.Json.JsonException exception) - { - var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; - throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); - } - } - else - { - try - { - using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) - { - var typedBody = await System.Text.Json.JsonSerializer.DeserializeAsync(responseStream, JsonSerializerSettings, cancellationToken).ConfigureAwait(false); - return new ObjectResponseResult(typedBody, string.Empty); - } - } - catch (System.Text.Json.JsonException exception) - { - var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; - throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); - } - } - } - - private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) - { - if (value == null) - { - return ""; - } - - if (value is System.Enum) - { - var name = System.Enum.GetName(value.GetType(), value); - if (name != null) - { - var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); - if (field != null) - { - var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) - as System.Runtime.Serialization.EnumMemberAttribute; - if (attribute != null) - { - return attribute.Value != null ? attribute.Value : name; - } - } - - var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); - return converted == null ? string.Empty : converted; - } - } - else if (value is bool) - { - return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); - } - else if (value is byte[]) - { - return System.Convert.ToBase64String((byte[]) value); - } - else if (value.GetType().IsArray) - { - var array = System.Linq.Enumerable.OfType((System.Array) value); - return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); - } - - var result = System.Convert.ToString(value, cultureInfo); - return result == null ? "" : result; - } - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.4.1.0 (Newtonsoft.Json v12.0.0.2)")] - public partial class AuthDto - { - [System.Text.Json.Serialization.JsonPropertyName("login")] - public string Login { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("password")] - public string Password { get; set; } - - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.4.1.0 (Newtonsoft.Json v12.0.0.2)")] - public partial class DataSaubBaseDto - { - [System.Text.Json.Serialization.JsonPropertyName("date")] - public System.DateTimeOffset Date { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("mode")] - public int? Mode { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("user")] - public string User { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("wellDepth")] - public double? WellDepth { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("bitDepth")] - public double? BitDepth { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("blockPosition")] - public double? BlockPosition { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("blockPositionMin")] - public double? BlockPositionMin { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("blockPositionMax")] - public double? BlockPositionMax { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("blockSpeed")] - public double? BlockSpeed { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("blockSpeedSp")] - public double? BlockSpeedSp { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("blockSpeedSpRotor")] - public double? BlockSpeedSpRotor { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("blockSpeedSpSlide")] - public double? BlockSpeedSpSlide { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("blockSpeedSpDevelop")] - public double? BlockSpeedSpDevelop { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("pressure")] - public double? Pressure { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("pressureIdle")] - public double? PressureIdle { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("pressureSp")] - public double? PressureSp { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("pressureSpRotor")] - public double? PressureSpRotor { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("pressureSpSlide")] - public double? PressureSpSlide { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("pressureSpDevelop")] - public double? PressureSpDevelop { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("pressureDeltaLimitMax")] - public double? PressureDeltaLimitMax { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("axialLoad")] - public double? AxialLoad { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("axialLoadSp")] - public double? AxialLoadSp { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("axialLoadLimitMax")] - public double? AxialLoadLimitMax { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("hookWeight")] - public double? HookWeight { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("hookWeightIdle")] - public double? HookWeightIdle { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("hookWeightLimitMin")] - public double? HookWeightLimitMin { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("hookWeightLimitMax")] - public double? HookWeightLimitMax { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("rotorTorque")] - public double? RotorTorque { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("rotorTorqueIdle")] - public double? RotorTorqueIdle { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("rotorTorqueSp")] - public double? RotorTorqueSp { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("rotorTorqueLimitMax")] - public double? RotorTorqueLimitMax { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("rotorSpeed")] - public double? RotorSpeed { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("flow")] - public double? Flow { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("flowIdle")] - public double? FlowIdle { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("flowDeltaLimitMax")] - public double? FlowDeltaLimitMax { get; set; } - - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.4.1.0 (Newtonsoft.Json v12.0.0.2)")] - public partial class EventDto - { - [System.Text.Json.Serialization.JsonPropertyName("id")] - public int Id { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("message")] - public string Message { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("idCategory")] - public int IdCategory { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("tag")] - public string Tag { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("eventType")] - public int EventType { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("idSound")] - public int IdSound { get; set; } - - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.4.1.0 (Newtonsoft.Json v12.0.0.2)")] - public partial class MessageDto - { - [System.Text.Json.Serialization.JsonPropertyName("id")] - public int Id { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("date")] - public System.DateTimeOffset Date { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("categoryId")] - public int CategoryId { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("user")] - public string User { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("message")] - public string Message { get; set; } - - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.4.1.0 (Newtonsoft.Json v12.0.0.2)")] - public partial class MessageDtoPaginationContainer - { - [System.Text.Json.Serialization.JsonPropertyName("skip")] - public int Skip { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("take")] - public int Take { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("count")] - public int Count { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("items")] - public System.Collections.Generic.ICollection Items { get; set; } - - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.4.1.0 (Newtonsoft.Json v12.0.0.2)")] - public partial class TelemetryInfoDto - { - [System.Text.Json.Serialization.JsonPropertyName("date")] - public System.DateTimeOffset Date { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("timeZoneId")] - public string TimeZoneId { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("timeZoneOffsetTotalHours")] - public double TimeZoneOffsetTotalHours { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("caption")] - public string Caption { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("cluster")] - public string Cluster { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("deposit")] - public string Deposit { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("hmiVersion")] - public string HmiVersion { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("plcVersion")] - public string PlcVersion { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("comment")] - public string Comment { get; set; } - - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.4.1.0 (Newtonsoft.Json v12.0.0.2)")] - public partial class TelemetryMessageDto - { - [System.Text.Json.Serialization.JsonPropertyName("id")] - public int Id { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("date")] - public System.DateTimeOffset Date { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("idEvent")] - public int IdEvent { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("state")] - public int? State { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("idTelemetryUser")] - public int? IdTelemetryUser { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("arg0")] - public string Arg0 { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("arg1")] - public string Arg1 { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("arg2")] - public string Arg2 { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("arg3")] - public string Arg3 { get; set; } - - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.4.1.0 (Newtonsoft.Json v12.0.0.2)")] - public partial class TelemetryUserDto - { - [System.Text.Json.Serialization.JsonPropertyName("id")] - public int Id { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string Name { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("surname")] - public string Surname { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("patronymic")] - public string Patronymic { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("level")] - public int Level { get; set; } - - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.4.1.0 (Newtonsoft.Json v12.0.0.2)")] - public partial class UserTokenDto - { - [System.Text.Json.Serialization.JsonPropertyName("login")] - public string Login { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("level")] - public int? Level { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string Name { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("surname")] - public string Surname { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("patronymic")] - public string Patronymic { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public int Id { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("customerName")] - public string CustomerName { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("roleName")] - public string RoleName { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("token")] - public string Token { get; set; } - - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.4.1.0 (Newtonsoft.Json v12.0.0.2)")] - public partial class WellDto - { - [System.Text.Json.Serialization.JsonPropertyName("caption")] - public string Caption { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("cluster")] - public string Cluster { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("deposit")] - public string Deposit { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public int Id { get; set; } - - [System.Text.Json.Serialization.JsonPropertyName("lastData")] - public object LastData { get; set; } - - - } - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.10.9.0 (NJsonSchema v10.4.1.0 (Newtonsoft.Json v12.0.0.2))")] - public partial class FileParameter - { - public FileParameter(System.IO.Stream data) - : this (data, null, null) - { - } - - public FileParameter(System.IO.Stream data, string fileName) - : this (data, fileName, null) - { - } - - public FileParameter(System.IO.Stream data, string fileName, string contentType) - { - Data = data; - FileName = fileName; - ContentType = contentType; - } - - public System.IO.Stream Data { get; private set; } - - public string FileName { get; private set; } - - public string ContentType { get; private set; } - } - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.10.9.0 (NJsonSchema v10.4.1.0 (Newtonsoft.Json v12.0.0.2))")] - public partial class ApiException : System.Exception - { - public int StatusCode { get; private set; } - - public string Response { get; private set; } - - public System.Collections.Generic.IReadOnlyDictionary> Headers { get; private set; } - - public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Exception innerException) - : base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException) - { - StatusCode = statusCode; - Response = response; - Headers = headers; - } - - public override string ToString() - { - return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString()); - } - } - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.10.9.0 (NJsonSchema v10.4.1.0 (Newtonsoft.Json v12.0.0.2))")] - public partial class ApiException : ApiException - { - public TResult Result { get; private set; } - - public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary> headers, TResult result, System.Exception innerException) - : base(message, statusCode, response, headers, innerException) - { - Result = result; - } - } - -} - -#pragma warning restore 1591 -#pragma warning restore 1573 -#pragma warning restore 472 -#pragma warning restore 114 -#pragma warning restore 108 \ No newline at end of file diff --git a/SyncDicts/Connected Services/AsbCloudApi/AsbCloudApi.nswag b/SyncDicts/Connected Services/AsbCloudApi/AsbCloudApi.nswag deleted file mode 100644 index ba266aac..00000000 --- a/SyncDicts/Connected Services/AsbCloudApi/AsbCloudApi.nswag +++ /dev/null @@ -1,99 +0,0 @@ -{ - "runtime": "NetCore21", - "defaultVariables": null, - "documentGenerator": { - "fromDocument": { - "url": "https://localhost:5001/swagger/v1/swagger.json", - "output": "AsbCloudApi.nswag.json", - "newLineBehavior": "Auto" - } - }, - "codeGenerators": { - "openApiToCSharpClient": { - "clientBaseClass": null, - "configurationClass": null, - "generateClientClasses": true, - "generateClientInterfaces": false, - "clientBaseInterface": null, - "injectHttpClient": true, - "disposeHttpClient": true, - "protectedMethods": [], - "generateExceptionClasses": true, - "exceptionClass": "ApiException", - "wrapDtoExceptions": true, - "useHttpClientCreationMethod": false, - "httpClientType": "System.Net.Http.HttpClient", - "useHttpRequestMessageCreationMethod": false, - "useBaseUrl": true, - "generateBaseUrlProperty": true, - "generateSyncMethods": false, - "generatePrepareRequestAndProcessResponseAsAsyncMethods": false, - "exposeJsonSerializerSettings": false, - "clientClassAccessModifier": "public", - "typeAccessModifier": "public", - "generateContractsOutput": false, - "contractsNamespace": null, - "contractsOutputFilePath": null, - "parameterDateTimeFormat": "s", - "parameterDateFormat": "yyyy-MM-dd", - "generateUpdateJsonSerializerSettingsMethod": true, - "useRequestAndResponseSerializationSettings": false, - "serializeTypeInformation": false, - "queryNullValue": "", - "className": "{controller}Client", - "operationGenerationMode": "SingleClientFromPathSegments", - "additionalNamespaceUsages": [], - "additionalContractNamespaceUsages": [], - "generateOptionalParameters": false, - "generateJsonMethods": false, - "enforceFlagEnums": false, - "parameterArrayType": "System.Collections.Generic.IEnumerable", - "parameterDictionaryType": "System.Collections.Generic.IDictionary", - "responseArrayType": "System.Collections.Generic.ICollection", - "responseDictionaryType": "System.Collections.Generic.IDictionary", - "wrapResponses": false, - "wrapResponseMethods": [], - "generateResponseClasses": true, - "responseClass": "SwaggerResponse", - "namespace": "SyncDicts.AsbCloudApi", - "requiredPropertiesMustBeDefined": true, - "dateType": "System.DateTimeOffset", - "jsonConverters": null, - "anyType": "object", - "dateTimeType": "System.DateTimeOffset", - "timeType": "System.TimeSpan", - "timeSpanType": "System.TimeSpan", - "arrayType": "System.Collections.Generic.ICollection", - "arrayInstanceType": "System.Collections.ObjectModel.Collection", - "dictionaryType": "System.Collections.Generic.IDictionary", - "dictionaryInstanceType": "System.Collections.Generic.Dictionary", - "arrayBaseType": "System.Collections.ObjectModel.Collection", - "dictionaryBaseType": "System.Collections.Generic.Dictionary", - "classStyle": "Poco", - "jsonLibrary": "SystemTextJson", - "generateDefaultValues": true, - "generateDataAnnotations": true, - "excludedTypeNames": [], - "excludedParameterNames": [], - "handleReferences": false, - "generateImmutableArrayProperties": false, - "generateImmutableDictionaryProperties": false, - "jsonSerializerSettingsTransformationMethod": null, - "inlineNamedArrays": false, - "inlineNamedDictionaries": false, - "inlineNamedTuples": true, - "inlineNamedAny": false, - "generateDtoTypes": true, - "generateOptionalPropertiesAsNullable": false, - "generateNullableReferenceTypes": false, - "templateDirectory": null, - "typeNameGeneratorType": null, - "propertyNameGeneratorType": null, - "enumNameGeneratorType": null, - "serviceHost": null, - "serviceSchemes": null, - "output": "AsbCloudApi.cs", - "newLineBehavior": "Auto" - } - } -} \ No newline at end of file diff --git a/SyncDicts/Connected Services/AsbCloudApi/AsbCloudApi.nswag.json b/SyncDicts/Connected Services/AsbCloudApi/AsbCloudApi.nswag.json deleted file mode 100644 index 3b40d113..00000000 --- a/SyncDicts/Connected Services/AsbCloudApi/AsbCloudApi.nswag.json +++ /dev/null @@ -1,1069 +0,0 @@ -{ - "openapi": "3.0.1", - "info": { - "title": "ASB cloud web api", - "version": "v1" - }, - "paths": { - "/auth/login": { - "post": { - "tags": [ - "Auth" - ], - "summary": "Аутентификация пользователя", - "operationId": "Login", - "requestBody": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AuthDto" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/AuthDto" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/AuthDto" - } - } - } - }, - "responses": { - "200": { - "description": "новый токен", - "content": { - "text/plain": { - "schema": { - "$ref": "#/components/schemas/UserTokenDto" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/UserTokenDto" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/UserTokenDto" - } - } - } - }, - "400": { - "description": "логин и пароль не подходят" - } - } - } - }, - "/auth/refresh": { - "get": { - "tags": [ - "Auth" - ], - "summary": "Продление срока действия токена", - "operationId": "Refresh", - "responses": { - "200": { - "description": "Success" - } - } - } - }, - "/api/well/{wellId}/data": { - "get": { - "tags": [ - "Data" - ], - "summary": "Возвращает данные САУБ по скважине.\r\nПо умолчанию за последние 10 минут.", - "operationId": "GetData", - "parameters": [ - { - "name": "wellId", - "in": "path", - "required": true, - "description": "id скважины", - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "begin", - "in": "query", - "description": "дата начала выборки. По умолчанию: текущее время - intervalSec", - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "intervalSec", - "in": "query", - "description": "интервал времени даты начала выборки, секунды", - "schema": { - "type": "integer", - "format": "int32", - "default": 600 - } - }, - { - "name": "approxPointsCount", - "in": "query", - "description": "желаемое количество точек. Если в выборке точек будет больше, то выборка будет прорежена.", - "schema": { - "type": "integer", - "format": "int32", - "default": 1024 - } - } - ], - "responses": { - "200": { - "description": "Success", - "content": { - "text/plain": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DataSaubBaseDto" - } - } - }, - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DataSaubBaseDto" - } - } - }, - "text/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DataSaubBaseDto" - } - } - } - } - } - } - } - }, - "/api/well/{wellId}/message": { - "get": { - "tags": [ - "Message" - ], - "summary": "Выдает список сообщений по скважине", - "operationId": "GetMessage", - "parameters": [ - { - "name": "wellId", - "in": "path", - "required": true, - "description": "id скважины", - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "skip", - "in": "query", - "description": "для пагинации кол-во записей пропустить", - "schema": { - "type": "integer", - "format": "int32", - "default": 0 - } - }, - { - "name": "take", - "in": "query", - "description": "для пагинации кол-во записей", - "schema": { - "type": "integer", - "format": "int32", - "default": 32 - } - }, - { - "name": "categoryids", - "in": "query", - "description": "список категорий", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - } - }, - { - "name": "begin", - "in": "query", - "description": "дата начала", - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "end", - "in": "query", - "description": "окончание", - "schema": { - "type": "string", - "format": "date-time" - } - } - ], - "responses": { - "200": { - "description": "Success", - "content": { - "text/plain": { - "schema": { - "$ref": "#/components/schemas/MessageDtoPaginationContainer" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/MessageDtoPaginationContainer" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/MessageDtoPaginationContainer" - } - } - } - } - } - } - }, - "/api/telemetry/{uid}/info": { - "post": { - "tags": [ - "Telemetry" - ], - "summary": "Принимает общую информацию по скважине", - "operationId": "PostInfo", - "parameters": [ - { - "name": "uid", - "in": "path", - "required": true, - "description": "Уникальный идентификатор отправителя", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "нформация об отправителе", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TelemetryInfoDto" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/TelemetryInfoDto" - } - }, - "application/*+json": { - "schema": { - "$ref": "#/components/schemas/TelemetryInfoDto" - } - } - } - }, - "responses": { - "200": { - "description": "Success" - } - } - } - }, - "/api/telemetry/{uid}/data": { - "post": { - "tags": [ - "Telemetry" - ], - "summary": "Принимает данные от разных систем по скважине", - "operationId": "PostData", - "parameters": [ - { - "name": "uid", - "in": "path", - "required": true, - "description": "Уникальный идентификатор отправителя", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "Данные", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DataSaubBaseDto" - } - } - }, - "text/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DataSaubBaseDto" - } - } - }, - "application/*+json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DataSaubBaseDto" - } - } - } - } - }, - "responses": { - "200": { - "description": "Success" - } - } - } - }, - "/api/telemetry/{uid}/message": { - "post": { - "tags": [ - "Telemetry" - ], - "summary": "Принимает список новых сообщений от телеметрии", - "operationId": "PostMessages", - "parameters": [ - { - "name": "uid", - "in": "path", - "required": true, - "description": "Уникальный идентификатор отправителя", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "сообщения", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TelemetryMessageDto" - } - } - }, - "text/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TelemetryMessageDto" - } - } - }, - "application/*+json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TelemetryMessageDto" - } - } - } - } - }, - "responses": { - "200": { - "description": "Success" - } - } - } - }, - "/api/telemetry/{uid}/event": { - "post": { - "tags": [ - "Telemetry" - ], - "summary": "Принимает справочник событий", - "operationId": "PostEvents", - "parameters": [ - { - "name": "uid", - "in": "path", - "required": true, - "description": "Уникальный идентификатор отправителя", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "справочник событий", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/EventDto" - } - } - }, - "text/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/EventDto" - } - } - }, - "application/*+json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/EventDto" - } - } - } - } - }, - "responses": { - "200": { - "description": "Success" - } - } - } - }, - "/api/telemetry/{uid}/user": { - "post": { - "tags": [ - "Telemetry" - ], - "summary": "Принимает справочник пользователей телеметрии", - "operationId": "PostUsers", - "parameters": [ - { - "name": "uid", - "in": "path", - "required": true, - "description": "Уникальный идентификатор отправителя", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "справочник пользователей телеметрии", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TelemetryUserDto" - } - } - }, - "text/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TelemetryUserDto" - } - } - }, - "application/*+json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TelemetryUserDto" - } - } - } - } - }, - "responses": { - "200": { - "description": "Success" - } - } - } - }, - "/api/telemetry/{uid}/db": { - "post": { - "tags": [ - "Telemetry" - ], - "summary": "", - "operationId": "PostDb", - "parameters": [ - { - "name": "uid", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "files": { - "type": "array", - "items": { - "type": "string", - "format": "binary" - } - } - } - }, - "encoding": { - "files": { - "style": "form" - } - } - } - } - }, - "responses": { - "200": { - "description": "Success" - } - } - } - }, - "/api/well": { - "get": { - "tags": [ - "Well" - ], - "operationId": "GetWells", - "responses": { - "200": { - "description": "Success", - "content": { - "text/plain": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/WellDto" - } - } - }, - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/WellDto" - } - } - }, - "text/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/WellDto" - } - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "AuthDto": { - "type": "object", - "additionalProperties": false, - "properties": { - "login": { - "type": "string", - "nullable": true - }, - "password": { - "type": "string", - "nullable": true - } - } - }, - "DataSaubBaseDto": { - "type": "object", - "additionalProperties": false, - "properties": { - "date": { - "type": "string", - "format": "date-time" - }, - "mode": { - "type": "integer", - "format": "int32", - "nullable": true - }, - "user": { - "type": "string", - "nullable": true - }, - "wellDepth": { - "type": "number", - "format": "double", - "nullable": true - }, - "bitDepth": { - "type": "number", - "format": "double", - "nullable": true - }, - "blockPosition": { - "type": "number", - "format": "double", - "nullable": true - }, - "blockPositionMin": { - "type": "number", - "format": "double", - "nullable": true - }, - "blockPositionMax": { - "type": "number", - "format": "double", - "nullable": true - }, - "blockSpeed": { - "type": "number", - "format": "double", - "nullable": true - }, - "blockSpeedSp": { - "type": "number", - "format": "double", - "nullable": true - }, - "blockSpeedSpRotor": { - "type": "number", - "format": "double", - "nullable": true - }, - "blockSpeedSpSlide": { - "type": "number", - "format": "double", - "nullable": true - }, - "blockSpeedSpDevelop": { - "type": "number", - "format": "double", - "nullable": true - }, - "pressure": { - "type": "number", - "format": "double", - "nullable": true - }, - "pressureIdle": { - "type": "number", - "format": "double", - "nullable": true - }, - "pressureSp": { - "type": "number", - "format": "double", - "nullable": true - }, - "pressureSpRotor": { - "type": "number", - "format": "double", - "nullable": true - }, - "pressureSpSlide": { - "type": "number", - "format": "double", - "nullable": true - }, - "pressureSpDevelop": { - "type": "number", - "format": "double", - "nullable": true - }, - "pressureDeltaLimitMax": { - "type": "number", - "format": "double", - "nullable": true - }, - "axialLoad": { - "type": "number", - "format": "double", - "nullable": true - }, - "axialLoadSp": { - "type": "number", - "format": "double", - "nullable": true - }, - "axialLoadLimitMax": { - "type": "number", - "format": "double", - "nullable": true - }, - "hookWeight": { - "type": "number", - "format": "double", - "nullable": true - }, - "hookWeightIdle": { - "type": "number", - "format": "double", - "nullable": true - }, - "hookWeightLimitMin": { - "type": "number", - "format": "double", - "nullable": true - }, - "hookWeightLimitMax": { - "type": "number", - "format": "double", - "nullable": true - }, - "rotorTorque": { - "type": "number", - "format": "double", - "nullable": true - }, - "rotorTorqueIdle": { - "type": "number", - "format": "double", - "nullable": true - }, - "rotorTorqueSp": { - "type": "number", - "format": "double", - "nullable": true - }, - "rotorTorqueLimitMax": { - "type": "number", - "format": "double", - "nullable": true - }, - "rotorSpeed": { - "type": "number", - "format": "double", - "nullable": true - }, - "flow": { - "type": "number", - "format": "double", - "nullable": true - }, - "flowIdle": { - "type": "number", - "format": "double", - "nullable": true - }, - "flowDeltaLimitMax": { - "type": "number", - "format": "double", - "nullable": true - } - } - }, - "EventDto": { - "type": "object", - "additionalProperties": false, - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string", - "nullable": true - }, - "idCategory": { - "type": "integer", - "format": "int32" - }, - "tag": { - "type": "string", - "nullable": true - }, - "eventType": { - "type": "integer", - "format": "int32" - }, - "idSound": { - "type": "integer", - "format": "int32" - } - } - }, - "MessageDto": { - "type": "object", - "additionalProperties": false, - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "date": { - "type": "string", - "format": "date-time" - }, - "categoryId": { - "type": "integer", - "format": "int32" - }, - "user": { - "type": "string", - "nullable": true - }, - "message": { - "type": "string", - "nullable": true - } - } - }, - "MessageDtoPaginationContainer": { - "type": "object", - "additionalProperties": false, - "properties": { - "skip": { - "type": "integer", - "format": "int32" - }, - "take": { - "type": "integer", - "format": "int32" - }, - "count": { - "type": "integer", - "format": "int32" - }, - "items": { - "type": "array", - "nullable": true, - "items": { - "$ref": "#/components/schemas/MessageDto" - } - } - } - }, - "TelemetryInfoDto": { - "type": "object", - "additionalProperties": false, - "properties": { - "date": { - "type": "string", - "format": "date-time" - }, - "timeZoneId": { - "type": "string", - "nullable": true - }, - "timeZoneOffsetTotalHours": { - "type": "number", - "format": "double" - }, - "caption": { - "type": "string", - "nullable": true - }, - "cluster": { - "type": "string", - "nullable": true - }, - "deposit": { - "type": "string", - "nullable": true - }, - "hmiVersion": { - "type": "string", - "nullable": true - }, - "plcVersion": { - "type": "string", - "nullable": true - }, - "comment": { - "type": "string", - "nullable": true - } - } - }, - "TelemetryMessageDto": { - "type": "object", - "additionalProperties": false, - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "date": { - "type": "string", - "format": "date-time" - }, - "idEvent": { - "type": "integer", - "format": "int32" - }, - "state": { - "type": "integer", - "format": "int32", - "nullable": true - }, - "idTelemetryUser": { - "type": "integer", - "format": "int32", - "nullable": true - }, - "arg0": { - "type": "string", - "nullable": true - }, - "arg1": { - "type": "string", - "nullable": true - }, - "arg2": { - "type": "string", - "nullable": true - }, - "arg3": { - "type": "string", - "nullable": true - } - } - }, - "TelemetryUserDto": { - "type": "object", - "additionalProperties": false, - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string", - "nullable": true - }, - "surname": { - "type": "string", - "nullable": true - }, - "patronymic": { - "type": "string", - "nullable": true - }, - "level": { - "type": "integer", - "format": "int32" - } - } - }, - "UserTokenDto": { - "type": "object", - "additionalProperties": false, - "properties": { - "login": { - "type": "string", - "nullable": true - }, - "level": { - "type": "integer", - "format": "int32", - "nullable": true - }, - "name": { - "type": "string", - "nullable": true - }, - "surname": { - "type": "string", - "nullable": true - }, - "patronymic": { - "type": "string", - "nullable": true - }, - "id": { - "type": "integer", - "format": "int32" - }, - "customerName": { - "type": "string", - "nullable": true - }, - "roleName": { - "type": "string", - "nullable": true - }, - "token": { - "type": "string", - "nullable": true - } - } - }, - "WellDto": { - "type": "object", - "additionalProperties": false, - "properties": { - "caption": { - "type": "string", - "nullable": true - }, - "cluster": { - "type": "string", - "nullable": true - }, - "deposit": { - "type": "string", - "nullable": true - }, - "id": { - "type": "integer", - "format": "int32" - }, - "lastData": { - "nullable": true - } - } - } - }, - "securitySchemes": { - "Bearer": { - "type": "apiKey", - "description": "JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token in the text input below. Example: 'Bearer 12345abcdef'", - "name": "Authorization", - "in": "header" - } - } - }, - "security": [ - { - "Bearer": [] - } - ] -} \ No newline at end of file diff --git a/SyncDicts/Connected Services/AsbCloudApi/ConnectedService.json b/SyncDicts/Connected Services/AsbCloudApi/ConnectedService.json deleted file mode 100644 index 97ae5be9..00000000 --- a/SyncDicts/Connected Services/AsbCloudApi/ConnectedService.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "ProviderId": "Unchase.OpenAPI.ConnectedService", - "Version": "1.5.20.0", - "GettingStartedDocument": { - "Uri": "https://github.com/unchase/Unchase.OpenAPI.Connectedservice/" - }, - "ExtendedData": { - "ServiceName": "AsbCloudApi", - "GeneratedFileName": "AsbCloudApi", - "Endpoint": "https://localhost:5001/swagger/v1/swagger.json", - "GeneratedFileNamePrefix": null, - "GenerateCSharpClient": true, - "GenerateTypeScriptClient": false, - "GenerateCSharpController": false, - "OpenApiToCSharpClientCommand": { - "ClientBaseClass": null, - "ConfigurationClass": null, - "GenerateClientClasses": true, - "GenerateClientInterfaces": false, - "ClientBaseInterface": null, - "InjectHttpClient": true, - "DisposeHttpClient": true, - "ProtectedMethods": [], - "GenerateExceptionClasses": true, - "ExceptionClass": "ApiException", - "WrapDtoExceptions": true, - "UseHttpClientCreationMethod": false, - "HttpClientType": "System.Net.Http.HttpClient", - "UseHttpRequestMessageCreationMethod": false, - "UseBaseUrl": true, - "GenerateBaseUrlProperty": true, - "GenerateSyncMethods": false, - "GeneratePrepareRequestAndProcessResponseAsAsyncMethods": false, - "ExposeJsonSerializerSettings": false, - "ClientClassAccessModifier": "public", - "TypeAccessModifier": "public", - "GenerateContractsOutput": false, - "ContractsNamespace": null, - "ContractsOutputFilePath": null, - "ParameterDateTimeFormat": "s", - "ParameterDateFormat": "yyyy-MM-dd", - "GenerateUpdateJsonSerializerSettingsMethod": true, - "UseRequestAndResponseSerializationSettings": false, - "SerializeTypeInformation": false, - "QueryNullValue": "", - "ClassName": "{controller}Client", - "OperationGenerationMode": 5, - "AdditionalNamespaceUsages": [], - "AdditionalContractNamespaceUsages": [], - "GenerateOptionalParameters": false, - "GenerateJsonMethods": false, - "EnforceFlagEnums": false, - "ParameterArrayType": "System.Collections.Generic.IEnumerable", - "ParameterDictionaryType": "System.Collections.Generic.IDictionary", - "ResponseArrayType": "System.Collections.Generic.ICollection", - "ResponseDictionaryType": "System.Collections.Generic.IDictionary", - "WrapResponses": false, - "WrapResponseMethods": [], - "GenerateResponseClasses": true, - "ResponseClass": "SwaggerResponse", - "Namespace": "SyncDicts.AsbCloudApi", - "RequiredPropertiesMustBeDefined": true, - "DateType": "System.DateTimeOffset", - "JsonConverters": null, - "AnyType": "object", - "DateTimeType": "System.DateTimeOffset", - "TimeType": "System.TimeSpan", - "TimeSpanType": "System.TimeSpan", - "ArrayType": "System.Collections.Generic.ICollection", - "ArrayInstanceType": "System.Collections.ObjectModel.Collection", - "DictionaryType": "System.Collections.Generic.IDictionary", - "DictionaryInstanceType": "System.Collections.Generic.Dictionary", - "ArrayBaseType": "System.Collections.ObjectModel.Collection", - "DictionaryBaseType": "System.Collections.Generic.Dictionary", - "ClassStyle": 0, - "JsonLibrary": 1, - "GenerateDefaultValues": true, - "GenerateDataAnnotations": true, - "ExcludedTypeNames": [], - "ExcludedParameterNames": [], - "HandleReferences": false, - "GenerateImmutableArrayProperties": false, - "GenerateImmutableDictionaryProperties": false, - "JsonSerializerSettingsTransformationMethod": null, - "InlineNamedArrays": false, - "InlineNamedDictionaries": false, - "InlineNamedTuples": true, - "InlineNamedAny": false, - "GenerateDtoTypes": true, - "GenerateOptionalPropertiesAsNullable": false, - "GenerateNullableReferenceTypes": false, - "TemplateDirectory": null, - "TypeNameGeneratorType": null, - "PropertyNameGeneratorType": null, - "EnumNameGeneratorType": null, - "ServiceHost": null, - "ServiceSchemes": null, - "output": "AsbCloudApi.cs", - "newLineBehavior": 0 - }, - "ExcludeTypeNamesLater": false, - "OpenApiToTypeScriptClientCommand": null, - "OpenApiToCSharpControllerCommand": null, - "Variables": null, - "Runtime": 0, - "CopySpecification": false, - "OpenGeneratedFilesOnComplete": false, - "UseRelativePath": false, - "ConvertFromOdata": false, - "OpenApiConvertSettings": { - "ServiceRoot": "http://localhost", - "Version": { - "Major": 1, - "Minor": 0, - "Build": 1, - "Revision": -1, - "MajorRevision": -1, - "MinorRevision": -1 - }, - "EnableKeyAsSegment": null, - "EnableUnqualifiedCall": false, - "EnableOperationPath": true, - "EnableOperationImportPath": true, - "EnableNavigationPropertyPath": true, - "TagDepth": 4, - "PrefixEntityTypeNameBeforeKey": false, - "OpenApiSpecVersion": 1, - "EnableOperationId": true, - "EnableUriEscapeFunctionCall": false, - "VerifyEdmModel": false, - "IEEE754Compatible": false, - "TopExample": 50, - "EnablePagination": false, - "PageableOperationName": "listMore", - "EnableDiscriminatorValue": false, - "EnableDerivedTypesReferencesForResponses": false, - "EnableDerivedTypesReferencesForRequestBody": false, - "PathPrefix": "OData", - "RoutePathPrefixProvider": { - "PathPrefix": "OData", - "Parameters": null - }, - "ShowLinks": false, - "ShowSchemaExamples": false, - "RequireDerivedTypesConstraintForBoundOperations": false, - "ShowRootPath": false, - "ShowMsDosGroupPath": true, - "PathProvider": null - }, - "OpenApiSpecVersion": 0, - "UseNetworkCredentials": false, - "NetworkCredentialsUserName": null, - "NetworkCredentialsPassword": null, - "NetworkCredentialsDomain": null, - "WebProxyUri": null, - "UseWebProxy": false, - "UseWebProxyCredentials": false, - "WebProxyNetworkCredentialsUserName": null, - "WebProxyNetworkCredentialsPassword": null, - "WebProxyNetworkCredentialsDomain": null - } -} \ No newline at end of file diff --git a/SyncDicts/Program.cs b/SyncDicts/Program.cs deleted file mode 100644 index 3410f1c8..00000000 --- a/SyncDicts/Program.cs +++ /dev/null @@ -1,120 +0,0 @@ -using SyncDicts.AsbCloudApi; -using System.Collections.Generic; -using System.Net; -using System.Text; -using System.Text.Json; - -namespace SyncDicts -{ - class Program - { - /// - /// Описывает процесс синхронизации словарей БД - /// - /// - static void Main(/*string[] args*/) - { - //bool res; - //var context = new ArchiveDbContext(@"c:\temp\default.sqlite3"); - - //// sync Events - //var events = context.EventsDictionary.ToList() - // .Select(e => new EventDto - // { - // EventType = e.EventType, - // Id = e.Id, - // IdCategory = e.CategoryId, - // IdSound = e.SoundId, - // Message = e.MessageTemplate, - // Tag = e.Tag, - // }); - - //var info = new TelemetryInfoDto - //{ - // Caption = "скв 111", - // Deposit = "мр 111", - // Cluster = "куст 111", - // TimeZoneId = TimeZoneInfo.Local.Id, - // TimeZoneOffsetTotalHours = TimeZoneInfo.Local.BaseUtcOffset.TotalHours, - // Date = DateTime.Now, - //}; - - //var users = context.Users.ToList() - // .Select(u => new TelemetryUserDto - // { - // Id = u.Id, - // Level = u.Level, - // Name = u.Name, - // Patronymic = u.Patronymic, - // Surname = u.Surname, - // }); - - //var messages = context.Messages.Take(1024).ToList() - // .Select(m => new TelemetryMessageDto - // { - // Id = m.Id, - // Date = DateTime.UnixEpoch.AddSeconds(m.TimeStamp), - // IdEvent = m.EventItemId, - // IdTelemetryUser = m.UserId, - // State = m.State, - // Arg0 = m.Arg0, - // Arg1 = m.Arg1, - // Arg2 = m.Arg2, - // Arg3 = m.Arg3, - // }); - - var cli = new AsbCloudApi.Client("https://localhost:5001/", new System.Net.Http.HttpClient()); - - 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 { file }).Wait(); - - //var cli = new swaggerClient("https://localhost:5001/", new System.Net.Http.HttpClient()); - //cli.InfoAsync("aaa",info).Wait(); - - //res = Send("http://127.0.0.1:5000/api/telemetry/asdasd/event", events); - //res = Send("http://127.0.0.1:5000/api/telemetry/asdasd/info", info); - //res = Send("http://127.0.0.1:5000/api/telemetry/asdasd/user", users); - //res = Send("http://127.0.0.1:5000/api/telemetry/asdasd/message", messages); - } - - //private static bool Send(string url, T obj) - //{ - // // sending data - // var requestBodyJson = JsonSerializer.Serialize(obj); - // var data = Encoding.UTF8.GetBytes(requestBodyJson); - - // var request = MakeRequest(url); - // using var streamWriter = request.GetRequestStream(); - // streamWriter.Write(data); - // streamWriter.Close(); - - // // getting response - // if (request.GetResponse() is not HttpWebResponse response) - // {//FAILED - // return false; - // } - - // if (response.StatusCode == HttpStatusCode.OK) - // {// sent succesfilly - // return true; - // } - // else - // {//failed - // return false; - // } - //} - - private static HttpWebRequest MakeRequest(string url, string contentType = "application/json") - { - var request = WebRequest.CreateHttp(url); - request.Method = "POST"; - request.Timeout = 4900; - request.ContentType = contentType; - request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; - request.ServicePoint.Expect100Continue = false; - return request; - } - } -} diff --git a/SyncDicts/SyncDicts.csproj b/SyncDicts/SyncDicts.csproj deleted file mode 100644 index a2b53ec3..00000000 --- a/SyncDicts/SyncDicts.csproj +++ /dev/null @@ -1,38 +0,0 @@ - - - - Exe - net5.0 - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - ..\..\..\SAUB\asbsaub3\AsbSaubDbModel\bin\Release\netcoreapp3.1\AsbSaubDbModel.dll - - - - - - - -