diff --git a/AsbCloud.sln b/AsbCloud.sln index ed415f6d..f2a20c79 100644 --- a/AsbCloud.sln +++ b/AsbCloud.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30907.101 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32014.148 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AsbCloudWebApi", "AsbCloudWebApi\AsbCloudWebApi.csproj", "{A2768702-47CB-4127-941C-E339D5EFCFFE}" EndProject @@ -15,6 +15,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AsbCloudDb", "AsbCloudDb\As EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AsbCloudWebApi.Tests", "AsbCloudWebApi.Tests\AsbCloudWebApi.Tests.csproj", "{9CF6FBB1-9AF5-45AB-A521-24F11A79B540}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Reports", "Reports", "{E1EFA324-A3D3-46B9-A9B2-3EB9A50BB8EF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AsbSaubReport", "..\..\SAUB\AsbSaubReport\AsbSaubReport\AsbSaubReport.csproj", "{CB5A6A64-FFB3-4043-AF8D-68EAC60888BD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AsbSaubReportPdf", "..\..\SAUB\AsbSaubReport\AsbSaubReportPdf\AsbSaubReportPdf.csproj", "{E7073282-F24B-4C90-A251-4837E88A058B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AsbSaubReportLas", "..\..\SAUB\AsbSaubReport\AsbSaubReportLas\AsbSaubReportLas.csproj", "{7DF7DF88-FF51-47C1-94F3-0A8326C971D1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AsbSaubReportGui", "..\..\SAUB\AsbSaubReport\AsbSaubReportGui\AsbSaubReportGui.csproj", "{F0B6B69F-E2B6-498E-AA7A-4E912C0F3602}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -45,10 +55,32 @@ Global {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 {9CF6FBB1-9AF5-45AB-A521-24F11A79B540}.Release|Any CPU.Build.0 = Release|Any CPU + {CB5A6A64-FFB3-4043-AF8D-68EAC60888BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CB5A6A64-FFB3-4043-AF8D-68EAC60888BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB5A6A64-FFB3-4043-AF8D-68EAC60888BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CB5A6A64-FFB3-4043-AF8D-68EAC60888BD}.Release|Any CPU.Build.0 = Release|Any CPU + {E7073282-F24B-4C90-A251-4837E88A058B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E7073282-F24B-4C90-A251-4837E88A058B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E7073282-F24B-4C90-A251-4837E88A058B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E7073282-F24B-4C90-A251-4837E88A058B}.Release|Any CPU.Build.0 = Release|Any CPU + {7DF7DF88-FF51-47C1-94F3-0A8326C971D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DF7DF88-FF51-47C1-94F3-0A8326C971D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DF7DF88-FF51-47C1-94F3-0A8326C971D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DF7DF88-FF51-47C1-94F3-0A8326C971D1}.Release|Any CPU.Build.0 = Release|Any CPU + {F0B6B69F-E2B6-498E-AA7A-4E912C0F3602}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0B6B69F-E2B6-498E-AA7A-4E912C0F3602}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0B6B69F-E2B6-498E-AA7A-4E912C0F3602}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0B6B69F-E2B6-498E-AA7A-4E912C0F3602}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {CB5A6A64-FFB3-4043-AF8D-68EAC60888BD} = {E1EFA324-A3D3-46B9-A9B2-3EB9A50BB8EF} + {E7073282-F24B-4C90-A251-4837E88A058B} = {E1EFA324-A3D3-46B9-A9B2-3EB9A50BB8EF} + {7DF7DF88-FF51-47C1-94F3-0A8326C971D1} = {E1EFA324-A3D3-46B9-A9B2-3EB9A50BB8EF} + {F0B6B69F-E2B6-498E-AA7A-4E912C0F3602} = {E1EFA324-A3D3-46B9-A9B2-3EB9A50BB8EF} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E446878D-6B1B-4279-A3F0-1974362B9921} EndGlobalSection diff --git a/AsbCloudApp/AsbCloudApp.csproj b/AsbCloudApp/AsbCloudApp.csproj index f208d303..dbc15171 100644 --- a/AsbCloudApp/AsbCloudApp.csproj +++ b/AsbCloudApp/AsbCloudApp.csproj @@ -1,7 +1,7 @@ - net5.0 + net6.0 diff --git a/AsbCloudApp/Comparators/ComparerIId.cs b/AsbCloudApp/Comparators/ComparerIId.cs new file mode 100644 index 00000000..a43ff8fd --- /dev/null +++ b/AsbCloudApp/Comparators/ComparerIId.cs @@ -0,0 +1,24 @@ +using AsbCloudApp.Data; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace AsbCloudApp.Comparators +{ + public class ComparerIId : IComparer, IEqualityComparer + { + private static readonly ComparerIId instance = new ComparerIId(); + private ComparerIId(){} + + public static ComparerIId GetInstance() => instance; + + public int Compare(IId x, IId y) => + x.Id.CompareTo(y.Id); + + public bool Equals(IId x, IId y) => + x.Id == y.Id; + + public int GetHashCode([DisallowNull] IId obj) => + obj.GetHashCode(); + + } +} diff --git a/AsbCloudApp/Data/ClusterDto.cs b/AsbCloudApp/Data/ClusterDto.cs index 895d3501..1f2eb2c7 100644 --- a/AsbCloudApp/Data/ClusterDto.cs +++ b/AsbCloudApp/Data/ClusterDto.cs @@ -8,6 +8,7 @@ namespace AsbCloudApp.Data public string Caption { get; set; } public double? Latitude { get; set; } public double? Longitude { get; set; } + public SimpleTimezoneDto Timezone { get; set; } public int? IdDeposit { get; set; } public DepositBaseDto Deposit { get; set; } public IEnumerable Wells { get; set; } diff --git a/AsbCloudApp/Data/CompanyDto.cs b/AsbCloudApp/Data/CompanyDto.cs index 572c4b24..38b6f9fc 100644 --- a/AsbCloudApp/Data/CompanyDto.cs +++ b/AsbCloudApp/Data/CompanyDto.cs @@ -1,9 +1,11 @@ namespace AsbCloudApp.Data { + public class CompanyDto : IId { public int Id { get; set; } public string Caption { get; set; } + public int IdCompanyType { get; set; } public string CompanyTypeCaption { get; set; } } } diff --git a/AsbCloudApp/Data/CompanyTypeDto.cs b/AsbCloudApp/Data/CompanyTypeDto.cs new file mode 100644 index 00000000..07366b57 --- /dev/null +++ b/AsbCloudApp/Data/CompanyTypeDto.cs @@ -0,0 +1,9 @@ +namespace AsbCloudApp.Data +{ + public class CompanyTypeDto : IId + { + public int Id { get; set; } + public string Caption { get; set; } + + } +} diff --git a/AsbCloudApp/Data/DepositDto.cs b/AsbCloudApp/Data/DepositDto.cs index 71d59f9c..be0200fd 100644 --- a/AsbCloudApp/Data/DepositDto.cs +++ b/AsbCloudApp/Data/DepositDto.cs @@ -8,6 +8,7 @@ namespace AsbCloudApp.Data public string Caption { get; set; } public double? Latitude { get; set; } public double? Longitude { get; set; } + public SimpleTimezoneDto Timezone { get; set; } } public class DepositDto : DepositBaseDto diff --git a/AsbCloudApp/Data/DrillFlowChartDto.cs b/AsbCloudApp/Data/DrillFlowChartDto.cs index 96095fe9..55e14919 100644 --- a/AsbCloudApp/Data/DrillFlowChartDto.cs +++ b/AsbCloudApp/Data/DrillFlowChartDto.cs @@ -3,7 +3,7 @@ using System; namespace AsbCloudApp.Data { /// - /// ( ) + /// ( ) /// public class DrillFlowChartDto : IId { diff --git a/AsbCloudApp/Data/IMapPoint.cs b/AsbCloudApp/Data/IMapPoint.cs index fe2798ca..4ab08239 100644 --- a/AsbCloudApp/Data/IMapPoint.cs +++ b/AsbCloudApp/Data/IMapPoint.cs @@ -4,5 +4,6 @@ { double? Latitude { get; set; } double? Longitude { get; set; } + SimpleTimezoneDto Timezone { get; set; } } } diff --git a/AsbCloudApp/Data/PaginationContainer.cs b/AsbCloudApp/Data/PaginationContainer.cs index ba33eaf3..49d49d6a 100644 --- a/AsbCloudApp/Data/PaginationContainer.cs +++ b/AsbCloudApp/Data/PaginationContainer.cs @@ -19,7 +19,7 @@ namespace AsbCloudApp.Data } /// - /// Кол-во записей пропущеных с начала таблицы в запросе от api + /// Кол-во записей пропущенных с начала таблицы в запросе от api /// public int Skip { get; set; } diff --git a/AsbCloudApp/Data/ReportPropertiesDto.cs b/AsbCloudApp/Data/ReportPropertiesDto.cs index a8acfe71..8b889a2d 100644 --- a/AsbCloudApp/Data/ReportPropertiesDto.cs +++ b/AsbCloudApp/Data/ReportPropertiesDto.cs @@ -9,8 +9,8 @@ namespace AsbCloudApp.Data public FileInfoDto File { get; set; } public int IdWell { get; set; } public DateTime Date { get; set; } - public DateTimeOffset Begin { get; set; } - public DateTimeOffset End { get; set; } + public DateTime Begin { get; set; } + public DateTime End { get; set; } public int Step { get; set; } public string Format { get; set; } } diff --git a/AsbCloudApp/Data/TelemetryTimeZoneDto.cs b/AsbCloudApp/Data/SimpleTimezoneDto.cs similarity index 66% rename from AsbCloudApp/Data/TelemetryTimeZoneDto.cs rename to AsbCloudApp/Data/SimpleTimezoneDto.cs index b8cd7e2b..32a8ff9e 100644 --- a/AsbCloudApp/Data/TelemetryTimeZoneDto.cs +++ b/AsbCloudApp/Data/SimpleTimezoneDto.cs @@ -1,16 +1,16 @@ namespace AsbCloudApp.Data { - public class TelemetryTimeZoneDto + public class SimpleTimezoneDto { public double Hours { get; set; } - public string TimeZoneId { get; set; } + public string TimezoneId { get; set; } public bool IsOverride { get; set; } public override bool Equals(object obj) { - if(obj is TelemetryTimeZoneDto tTimeZone + if(obj is SimpleTimezoneDto tTimeZone && tTimeZone.Hours == Hours - && tTimeZone.TimeZoneId == TimeZoneId + && tTimeZone.TimezoneId == TimezoneId && tTimeZone.IsOverride == IsOverride) return true; return false; @@ -18,7 +18,7 @@ namespace AsbCloudApp.Data public override int GetHashCode() => Hours.GetHashCode() - | TimeZoneId.GetHashCode() + | TimezoneId.GetHashCode() | IsOverride.GetHashCode(); } } \ No newline at end of file diff --git a/AsbCloudApp/Data/TelemetryDataSaubDto.cs b/AsbCloudApp/Data/TelemetryDataSaubDto.cs index 7099ddab..0d669253 100644 --- a/AsbCloudApp/Data/TelemetryDataSaubDto.cs +++ b/AsbCloudApp/Data/TelemetryDataSaubDto.cs @@ -38,7 +38,7 @@ namespace AsbCloudApp.Data public float? WellDepth { get; set; } /// - /// Глубина долта + /// Глубина долота /// public float? BitDepth { get; set; } @@ -83,12 +83,12 @@ namespace AsbCloudApp.Data public float? BlockSpeedSpDevelop { get; set; } /// - /// Давтение + /// Давление /// public float? Pressure { get; set; } /// - /// Давтение при холостом ходе. + /// Давление при холостом ходе. /// public float? PressureIdle { get; set; } diff --git a/AsbCloudApp/Data/TelemetryOperationInfoDto.cs b/AsbCloudApp/Data/TelemetryOperationInfoDto.cs index 39a50e86..5ce268d7 100644 --- a/AsbCloudApp/Data/TelemetryOperationInfoDto.cs +++ b/AsbCloudApp/Data/TelemetryOperationInfoDto.cs @@ -5,7 +5,7 @@ namespace AsbCloudApp.Data { public class TelemetryOperationInfoDto { - public DateTimeOffset IntervalBegin { get; set; } + public DateTime IntervalBegin { get; set; } public IList Operations { get; set; } } } diff --git a/AsbCloudApp/Data/UserRoleDto.cs b/AsbCloudApp/Data/UserRoleDto.cs index a16a4959..b7a06039 100644 --- a/AsbCloudApp/Data/UserRoleDto.cs +++ b/AsbCloudApp/Data/UserRoleDto.cs @@ -7,10 +7,12 @@ namespace AsbCloudApp.Data { public int Id { get; set; } public string Caption { get; set; } - public int? IdParent { get; set; } public int IdType { get; set; } public IEnumerable Permissions { get; set; } + public virtual ICollection Roles { get; set; } + [JsonIgnore] public virtual ICollection Users { get; set; } + } } diff --git a/AsbCloudApp/Data/WellDto.cs b/AsbCloudApp/Data/WellDto.cs index f3843eaa..f89c6956 100644 --- a/AsbCloudApp/Data/WellDto.cs +++ b/AsbCloudApp/Data/WellDto.cs @@ -8,12 +8,13 @@ namespace AsbCloudApp.Data public int Id { get; set; } public double? Latitude { get; set; } public double? Longitude { get; set; } + public SimpleTimezoneDto Timezone { get; set; } public string WellType { get; set; } - public int IdWellType { get; set; } + public int? IdWellType { get; set; } public int? IdCluster { get; set; } /// - /// 0 - незвестно, + /// 0 - неизвестно, /// 1 - в работе, /// 2 - завершена /// diff --git a/AsbCloudApp/Data/WellOperationDto.cs b/AsbCloudApp/Data/WellOperationDto.cs index 35fa5007..765c021f 100644 --- a/AsbCloudApp/Data/WellOperationDto.cs +++ b/AsbCloudApp/Data/WellOperationDto.cs @@ -33,6 +33,11 @@ namespace AsbCloudApp.Data /// public double DepthEnd { get; set; } + /// + /// Кол-во дней от даты начала первой плановой (а если её нет, то фактической) операции + /// + public double Day { get; set; } + /// /// Дата начала операции /// diff --git a/AsbCloudApp/Services/IMessageService.cs b/AsbCloudApp/Services/IMessageService.cs index 9b4221c9..1a2536f2 100644 --- a/AsbCloudApp/Services/IMessageService.cs +++ b/AsbCloudApp/Services/IMessageService.cs @@ -11,10 +11,9 @@ namespace AsbCloudApp.Services Task> GetMessagesAsync(int idWell, IEnumerable categoryids = default, DateTime begin = default, DateTime end = default, string searchString = default, - int skip = 0, int take = 32, bool isUtc = true, - CancellationToken token = default); - Task GetMessagesDatesRangeAsync(int idWell, bool isUtc, + int skip = 0, int take = 32, CancellationToken token = default); + Task InsertAsync(string uid, IEnumerable dtos, CancellationToken token); } diff --git a/AsbCloudApp/Services/IReportService.cs b/AsbCloudApp/Services/IReportService.cs index 258195d5..b900e877 100644 --- a/AsbCloudApp/Services/IReportService.cs +++ b/AsbCloudApp/Services/IReportService.cs @@ -14,8 +14,7 @@ namespace AsbCloudApp.Services Action handleReportProgress); int GetReportPagesCount(int idWell, DateTime begin, DateTime end, int stepSeconds, int format); - Task GetReportsDatesRangeAsync(int idWell, bool isUtc, - CancellationToken token = default); - Task> GetAllReportsByWellAsync(int idWell, CancellationToken token); + DatesRangeDto GetDatesRangeOrDefault(int idWell); + Task> GetAllReportsByWellAsync(int idWell, CancellationToken token); } } diff --git a/AsbCloudApp/Services/ITelemetryAnalyticsService.cs b/AsbCloudApp/Services/ITelemetryAnalyticsService.cs index 2580e3b3..d621901f 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, bool isUtc, + Task GetOperationsDateRangeAsync(int idWell, CancellationToken token = default); } } diff --git a/AsbCloudApp/Services/ITelemetryDataService.cs b/AsbCloudApp/Services/ITelemetryDataService.cs index 6cb8228f..3e34e202 100644 --- a/AsbCloudApp/Services/ITelemetryDataService.cs +++ b/AsbCloudApp/Services/ITelemetryDataService.cs @@ -10,9 +10,8 @@ namespace AsbCloudApp.Services { 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); + int approxPointsCount = 1024, 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 0cdd312f..2d42d53d 100644 --- a/AsbCloudApp/Services/ITelemetryService.cs +++ b/AsbCloudApp/Services/ITelemetryService.cs @@ -8,23 +8,17 @@ namespace AsbCloudApp.Services { public interface ITelemetryService { - ITimeZoneService TimeZoneService { get; } + ITimezoneService TimeZoneService { get; } ITelemetryTracker TelemetryTracker { get; } - int? GetIdWellByTelemetryUid(string uid); int GetOrCreateTelemetryIdByUid(string uid); - double GetTimezoneOffsetByTelemetryId(int idTelemetry); - Task GetTelemetryTimeZoneOffsetAsync(int idTelemetry, CancellationToken token); + SimpleTimezoneDto GetTimezone(int idTelemetry); IEnumerable GetTransmittingTelemetries(); - DateTime GetLastTelemetryDate(string telemetryUid); - DateTime GetLastTelemetryDate(int telemetryId); + DateTime GetLastTelemetryDate(int idTelemetry, bool useUtc = false); int? GetIdTelemetryByIdWell(int idWell); - + DatesRangeDto GetDatesRange(int idTelemetry); Task UpdateInfoAsync(string uid, TelemetryInfoDto info, CancellationToken token); - Task DatesRangeToTelemetryTimeZoneAsync(int telemetryId, DatesRangeDto result, - CancellationToken token); - - Task UpdateTimeZoneAsync(string uid, TelemetryTimeZoneDto telemetryTimeZoneInfo, CancellationToken token); + Task UpdateTimezoneAsync(string uid, SimpleTimezoneDto telemetryTimeZoneInfo, CancellationToken token); /// /// Слить данные телеметрии в одну @@ -33,8 +27,6 @@ namespace AsbCloudApp.Services /// новая /// Task MergeAsync(int from, int to, CancellationToken token); - - void SaveRequestDate(string uid, DateTime remoteDate); - Task GetDatesRangeAsync(int idWell, bool isUtc, CancellationToken token = default); + void SaveRequestDate(string uid, DateTimeOffset remoteDate); } } \ No newline at end of file diff --git a/AsbCloudApp/Services/ITelemetryTracker.cs b/AsbCloudApp/Services/ITelemetryTracker.cs index a7aad4f2..73a98d93 100644 --- a/AsbCloudApp/Services/ITelemetryTracker.cs +++ b/AsbCloudApp/Services/ITelemetryTracker.cs @@ -6,9 +6,9 @@ namespace AsbCloudApp.Services { public interface ITelemetryTracker { - DateTime GetLastTelemetryDateByUid(string uid); + DateTimeOffset GetLastTelemetryDateByUid(string uid); DatesRangeDto GetTelemetryDateRangeByUid(string uid); IEnumerable GetTransmittingTelemetriesUids(); - void SaveRequestDate(string uid, DateTime remoteDate); + void SaveRequestDate(string uid, DateTimeOffset remoteDate); } } diff --git a/AsbCloudApp/Services/ITimeZoneService.cs b/AsbCloudApp/Services/ITimeZoneService.cs index 213aed03..5836e665 100644 --- a/AsbCloudApp/Services/ITimeZoneService.cs +++ b/AsbCloudApp/Services/ITimeZoneService.cs @@ -1,13 +1,13 @@ -using System; +using AsbCloudApp.Data; +using System; using System.Threading; using System.Threading.Tasks; namespace AsbCloudApp.Services { - public interface ITimeZoneService + public interface ITimezoneService { - DateTime DateToUtc(DateTime date, double remoteTimezoneOffsetHours); - DateTime DateToTimeZone(DateTime date, double remoteTimezoneOffsetHours); - Task GetByCoordinatesAsync(double latitude, double longitude, CancellationToken token); + SimpleTimezoneDto GetByCoordinates(double latitude, double longitude); + Task GetByCoordinatesAsync(double latitude, double longitude, CancellationToken token); } } \ No newline at end of file diff --git a/AsbCloudApp/Services/IUserRoleService.cs b/AsbCloudApp/Services/IUserRoleService.cs index d651c189..3d5a7ec3 100644 --- a/AsbCloudApp/Services/IUserRoleService.cs +++ b/AsbCloudApp/Services/IUserRoleService.cs @@ -9,7 +9,7 @@ namespace AsbCloudApp.Services { Task GetByNameAsync(string name, CancellationToken token = default); Task> GetByNamesAsync(IEnumerable names, CancellationToken token = default); - List GetNestedById(int id, int counter = 10); + IEnumerable GetNestedById(int id, int counter = 10); bool HasPermission(IEnumerable rolesIds, string permissionName); } } \ No newline at end of file diff --git a/AsbCloudApp/Services/IWellService.cs b/AsbCloudApp/Services/IWellService.cs index b8206976..346b878f 100644 --- a/AsbCloudApp/Services/IWellService.cs +++ b/AsbCloudApp/Services/IWellService.cs @@ -8,6 +8,8 @@ namespace AsbCloudApp.Services { public interface IWellService: ICrudService { + ITelemetryService TelemetryService { get; } + Task> GetWellsByCompanyAsync(int idCompany, CancellationToken token); Task IsCompanyInvolvedInWellAsync(int idCompany, int idWell, CancellationToken token); Task GetWellCaptionByIdAsync(int idWell, CancellationToken token); @@ -15,7 +17,10 @@ namespace AsbCloudApp.Services Task> GetCompaniesAsync(int idWell, CancellationToken token); bool IsCompanyInvolvedInWell(int idCompany, int idWell); string GetStateText(int state); - DateTime GetLastTelemetryDate(int idWell); + DateTimeOffset GetLastTelemetryDate(int idWell); Task> GetClusterWellsIdsAsync(int idWell, CancellationToken token); + SimpleTimezoneDto GetTimezone(int idWell); + DatesRangeDto GetDatesRange(int idWell); + void EnshureTimezonesIsSet(); } } diff --git a/AsbCloudDb/AsbCloudDb.csproj b/AsbCloudDb/AsbCloudDb.csproj index 903f171c..90bdaac5 100644 --- a/AsbCloudDb/AsbCloudDb.csproj +++ b/AsbCloudDb/AsbCloudDb.csproj @@ -1,15 +1,15 @@ - net5.0 + net6.0 - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/AsbCloudDb/EFExtentions.cs b/AsbCloudDb/EFExtentions.cs index 9a0b88c3..a799fa0a 100644 --- a/AsbCloudDb/EFExtentions.cs +++ b/AsbCloudDb/EFExtentions.cs @@ -125,6 +125,7 @@ namespace AsbCloudDb { string vStr => $"'{vStr}'", DateTime vDate => $"'{FormatDateValue(vDate)}'", + DateTimeOffset vDate => $"'{FormatDateValue(vDate.UtcDateTime)}'", IFormattable vFormattable=> FormatFormattableValue(vFormattable), _ => System.Text.Json.JsonSerializer.Serialize(v), }; diff --git a/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.Designer.cs b/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.Designer.cs index 0ff12472..c2a8e3e5 100644 --- a/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.Designer.cs +++ b/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.Designer.cs @@ -770,7 +770,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.cs b/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.cs index 47b31e5d..b62c4dfa 100644 --- a/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.cs +++ b/AsbCloudDb/Migrations/20211116080138_Add_Telemetry_TimeZone.cs @@ -7,7 +7,7 @@ namespace AsbCloudDb.Migrations { protected override void Up(MigrationBuilder migrationBuilder) { - migrationBuilder.AddColumn( + migrationBuilder.AddColumn( name: "timezone", table: "t_telemetry", type: "jsonb", diff --git a/AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.Designer.cs b/AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.Designer.cs index b15370e0..c70e66e7 100644 --- a/AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.Designer.cs +++ b/AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.Designer.cs @@ -853,7 +853,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211124111523_AddSetpoints.Designer.cs b/AsbCloudDb/Migrations/20211124111523_AddSetpoints.Designer.cs index 05dfb4f1..1a388d7e 100644 --- a/AsbCloudDb/Migrations/20211124111523_AddSetpoints.Designer.cs +++ b/AsbCloudDb/Migrations/20211124111523_AddSetpoints.Designer.cs @@ -824,7 +824,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211129122956_Fixed_Role_Permissions_Value.Designer.cs b/AsbCloudDb/Migrations/20211129122956_Fixed_Role_Permissions_Value.Designer.cs index 9bef23ab..8cbcfe57 100644 --- a/AsbCloudDb/Migrations/20211129122956_Fixed_Role_Permissions_Value.Designer.cs +++ b/AsbCloudDb/Migrations/20211129122956_Fixed_Role_Permissions_Value.Designer.cs @@ -854,7 +854,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211130121716_Renamed_Permissions_Tables.Designer.cs b/AsbCloudDb/Migrations/20211130121716_Renamed_Permissions_Tables.Designer.cs index fe9b2043..9473c406 100644 --- a/AsbCloudDb/Migrations/20211130121716_Renamed_Permissions_Tables.Designer.cs +++ b/AsbCloudDb/Migrations/20211130121716_Renamed_Permissions_Tables.Designer.cs @@ -854,7 +854,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211130122321_Renamed_PermissionCollections.Designer.cs b/AsbCloudDb/Migrations/20211130122321_Renamed_PermissionCollections.Designer.cs index b2dc583b..22ee1aec 100644 --- a/AsbCloudDb/Migrations/20211130122321_Renamed_PermissionCollections.Designer.cs +++ b/AsbCloudDb/Migrations/20211130122321_Renamed_PermissionCollections.Designer.cs @@ -854,7 +854,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211201105010_Renamed_Permission_Role_Files.Designer.cs b/AsbCloudDb/Migrations/20211201105010_Renamed_Permission_Role_Files.Designer.cs index 206fe985..c6d5d8d0 100644 --- a/AsbCloudDb/Migrations/20211201105010_Renamed_Permission_Role_Files.Designer.cs +++ b/AsbCloudDb/Migrations/20211201105010_Renamed_Permission_Role_Files.Designer.cs @@ -854,7 +854,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211202064227_RenameTable_WellComposite.Designer.cs b/AsbCloudDb/Migrations/20211202064227_RenameTable_WellComposite.Designer.cs index c42881f3..5333a57f 100644 --- a/AsbCloudDb/Migrations/20211202064227_RenameTable_WellComposite.Designer.cs +++ b/AsbCloudDb/Migrations/20211202064227_RenameTable_WellComposite.Designer.cs @@ -824,7 +824,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211208103008_Update_operations_list.Designer.cs b/AsbCloudDb/Migrations/20211208103008_Update_operations_list.Designer.cs index ec57acd8..193ec0aa 100644 --- a/AsbCloudDb/Migrations/20211208103008_Update_operations_list.Designer.cs +++ b/AsbCloudDb/Migrations/20211208103008_Update_operations_list.Designer.cs @@ -908,7 +908,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211210074746_Rename_Permissions_fields.Designer.cs b/AsbCloudDb/Migrations/20211210074746_Rename_Permissions_fields.Designer.cs index 309f79e8..57af6c50 100644 --- a/AsbCloudDb/Migrations/20211210074746_Rename_Permissions_fields.Designer.cs +++ b/AsbCloudDb/Migrations/20211210074746_Rename_Permissions_fields.Designer.cs @@ -908,7 +908,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211215111416_RemovedPermissionValues.Designer.cs b/AsbCloudDb/Migrations/20211215111416_RemovedPermissionValues.Designer.cs index fc86fde4..3493499c 100644 --- a/AsbCloudDb/Migrations/20211215111416_RemovedPermissionValues.Designer.cs +++ b/AsbCloudDb/Migrations/20211215111416_RemovedPermissionValues.Designer.cs @@ -908,7 +908,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211216072650_RemovedIdFromPermissionRelations.Designer.cs b/AsbCloudDb/Migrations/20211216072650_RemovedIdFromPermissionRelations.Designer.cs index b29a445b..3a2973a3 100644 --- a/AsbCloudDb/Migrations/20211216072650_RemovedIdFromPermissionRelations.Designer.cs +++ b/AsbCloudDb/Migrations/20211216072650_RemovedIdFromPermissionRelations.Designer.cs @@ -899,7 +899,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211217104347_RenameDocsCategories.Designer.cs b/AsbCloudDb/Migrations/20211217104347_RenameDocsCategories.Designer.cs index d1262f27..f107284b 100644 --- a/AsbCloudDb/Migrations/20211217104347_RenameDocsCategories.Designer.cs +++ b/AsbCloudDb/Migrations/20211217104347_RenameDocsCategories.Designer.cs @@ -902,7 +902,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211222105725_AddedNewSectionTypes.Designer.cs b/AsbCloudDb/Migrations/20211222105725_AddedNewSectionTypes.Designer.cs index e436d718..b948f8c4 100644 --- a/AsbCloudDb/Migrations/20211222105725_AddedNewSectionTypes.Designer.cs +++ b/AsbCloudDb/Migrations/20211222105725_AddedNewSectionTypes.Designer.cs @@ -893,7 +893,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211222141707_Reorder_SectionsTypes_to_keep_existing_operations.Designer.cs b/AsbCloudDb/Migrations/20211222141707_Reorder_SectionsTypes_to_keep_existing_operations.Designer.cs index 6f7a270c..2f8da1f6 100644 --- a/AsbCloudDb/Migrations/20211222141707_Reorder_SectionsTypes_to_keep_existing_operations.Designer.cs +++ b/AsbCloudDb/Migrations/20211222141707_Reorder_SectionsTypes_to_keep_existing_operations.Designer.cs @@ -893,7 +893,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211227053852_Specify_type_for_datetime_props.Designer.cs b/AsbCloudDb/Migrations/20211227053852_Specify_type_for_datetime_props.Designer.cs index efb47370..da7fc1e0 100644 --- a/AsbCloudDb/Migrations/20211227053852_Specify_type_for_datetime_props.Designer.cs +++ b/AsbCloudDb/Migrations/20211227053852_Specify_type_for_datetime_props.Designer.cs @@ -893,7 +893,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TelemetryTimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); diff --git a/AsbCloudDb/Migrations/20211230054224_Fix_spelling_of_defaults.Designer.cs b/AsbCloudDb/Migrations/20211230054224_Fix_spelling_of_defaults.Designer.cs new file mode 100644 index 00000000..ae743ee1 --- /dev/null +++ b/AsbCloudDb/Migrations/20211230054224_Fix_spelling_of_defaults.Designer.cs @@ -0,0 +1,3080 @@ +// +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; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + [DbContext(typeof(AsbCloudDbContext))] + [Migration("20211230054224_Fix_spelling_of_defaults")] + partial class Fix_spelling_of_defaults + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = "toolService" + }, + new + { + Id = 9, + Name = "Буровой подрядчик", + ShortName = "drillService" + }, + new + { + Id = 10, + Name = "Сервис по заканчиванию скважины", + ShortName = "closingService" + }, + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateCreated") + .HasColumnType("timestamp with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_permission"); + + b.HasComment("Разрешения на доступ к данным"); + }); + + 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.RelationUserRolePermission", b => + { + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_relation_user_role_permission"); + + b.HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("IdUser", "IdUserRole"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_user_role"); + + b.HasComment("Отношение пользователей и ролей"); + + b.HasData( + new + { + IdUser = 1, + IdUserRole = 2 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.SetpointsRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("комментарий для оператора"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("0: неизвестно, 1:ожидает отправки, 2: отправлено, 3: принято оператором, 4: отклонено оператором, 5: устарело"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("ObsolescenceSec") + .HasColumnType("integer") + .HasColumnName("obsolescence") + .HasComment("сек. до устаревания"); + + b.Property>("Setpoints") + .HasColumnType("jsonb") + .HasColumnName("setpoint_set") + .HasComment("Набор уставок"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdWell"); + + b.ToTable("t_setpoints_rquest"); + + b.HasComment("Запросы на изменение уставок панели оператора"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdState") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n100 - удален"); + + 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("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user"); + + b.HasComment("Пользователи облака"); + + b.HasData( + new + { + Id = 1, + IdCompany = 1, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("От какой роли унаследована данная роль"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b.HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "Администратор", + IdType = 0 + }, + new + { + Id = 2, + Caption = "Пользователь", + IdType = 0 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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_composite"); + + b.HasComment("Композитная скважина"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateStart") + .HasColumnType("timestamp with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = 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 = 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 = "Промывка при спуске ОК" + }, + new + { + Id = 1051, + Code = 0, + Name = "Замер ТС" + }, + new + { + Id = 1052, + Code = 0, + Name = "Тех. отстой" + }, + new + { + Id = 1053, + Code = 0, + Name = "Циркуляция и Обработка БР" + }, + new + { + Id = 1054, + Code = 0, + Name = "Срезка ствола" + }, + new + { + Id = 1055, + Code = 0, + Name = "Вспомогательные работы" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = "Хвостовик" + }, + new + { + Id = 7, + Caption = "Пилотный ствол 2" + }, + new + { + Id = 8, + Caption = "Направление 2" + }, + new + { + Id = 9, + Caption = "Кондуктор 2" + }, + new + { + Id = 10, + Caption = "Эксплуатационная колонна 2" + }, + new + { + Id = 11, + Caption = "Транспортный ствол 2" + }, + new + { + Id = 12, + Caption = "Хвостовик 2" + }, + new + { + Id = 13, + Caption = "Пилотный ствол 3" + }, + new + { + Id = 14, + Caption = "Направление 3" + }, + new + { + Id = 15, + Caption = "Кондуктор 3" + }, + new + { + Id = 16, + Caption = "Эксплуатационная колонна 3" + }, + new + { + Id = 17, + Caption = "Транспортный ствол 3" + }, + new + { + Id = 18, + Caption = "Хвостовик 3" + }, + new + { + Id = 19, + Caption = "Пилотный ствол 4" + }, + new + { + Id = 20, + Caption = "Направление 4" + }, + new + { + Id = 21, + Caption = "Кондуктор 4" + }, + new + { + Id = 22, + Caption = "Эксплуатационная колонна 4" + }, + new + { + Id = 23, + Caption = "Транспортный ствол 4" + }, + new + { + Id = 24, + Caption = "Хвостовик 4" + }, + new + { + Id = 25, + Caption = "Пилотный ствол 5" + }, + new + { + Id = 26, + Caption = "Направление 5" + }, + new + { + Id = 27, + Caption = "Кондуктор 5" + }, + new + { + Id = 28, + Caption = "Эксплуатационная колонна 5" + }, + new + { + Id = 29, + Caption = "Транспортный ствол 5" + }, + new + { + Id = 30, + Caption = "Хвостовик 5" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_drill_params_t_well_section_type_id_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_file_mark_t_file_info_fk"); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("FileMarks") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_user_t_file_mark_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_company_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_well_id_fk"); + + b.Navigation("Company"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.HasOne("AsbCloudDb.Model.Permission", "Permission") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("UserRole"); + }); + + 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.SetpointsRequest", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Operation") + .WithMany("Analysis") + .HasForeignKey("IdOperation") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired() + .HasConstraintName("t_analysis_t_operation_id_fk"); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Analysis") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_analysis_t_telemetry_id_fk"); + + b.Navigation("Operation"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSaub") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSpin") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_event_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_messages_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_user_t_company_id_fk"); + + b.Navigation("Company"); + }); + + 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") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_well_t_telemetry_id_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_id_fk"); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellComposites") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "WellSrc") + .WithMany("WellCompositeSrcs") + .HasForeignKey("IdWellSrc") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_src_t_well_id_fk"); + + 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.Permission", b => + { + b.Navigation("RelationUserRolePermissions"); + }); + + 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"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("RelationUserRolePermissions"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellComposites"); + + 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/20211230054224_Fix_spelling_of_defaults.cs b/AsbCloudDb/Migrations/20211230054224_Fix_spelling_of_defaults.cs new file mode 100644 index 00000000..cf8fda5d --- /dev/null +++ b/AsbCloudDb/Migrations/20211230054224_Fix_spelling_of_defaults.cs @@ -0,0 +1,113 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + public partial class Fix_spelling_of_defaults : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 1014, + column: "name", + value: "Опрессовка Ц.К."); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 1, + column: "caption", + value: "Пилотный ствол"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 2, + column: "caption", + value: "Направление"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 3, + column: "caption", + value: "Кондуктор"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 4, + column: "caption", + value: "Эксплуатационная колонна"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 5, + column: "caption", + value: "Транспортный ствол"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 6, + column: "caption", + value: "Хвостовик"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 1014, + column: "name", + value: "Опресовка Ц.К."); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 1, + column: "caption", + value: "Пилотный ствол 1"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 2, + column: "caption", + value: "Направление 1"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 3, + column: "caption", + value: "Кондуктор 1"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 4, + column: "caption", + value: "Эксплуатационная колонна 1"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 5, + column: "caption", + value: "Транспортный ствол 1"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 6, + column: "caption", + value: "Хвостовик 1"); + } + } +} diff --git a/AsbCloudDb/Migrations/20220102073023_Add_timeZone_to_IMapPoint.Designer.cs b/AsbCloudDb/Migrations/20220102073023_Add_timeZone_to_IMapPoint.Designer.cs new file mode 100644 index 00000000..e851974a --- /dev/null +++ b/AsbCloudDb/Migrations/20220102073023_Add_timeZone_to_IMapPoint.Designer.cs @@ -0,0 +1,3095 @@ +// +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; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + [DbContext(typeof(AsbCloudDbContext))] + [Migration("20220102073023_Add_timeZone_to_IMapPoint")] + partial class Add_timeZone_to_IMapPoint + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Property("TimeZone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Property("TimeZone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.ToTable("t_deposit"); + + b.HasComment("Месторождение"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = "toolService" + }, + new + { + Id = 9, + Name = "Буровой подрядчик", + ShortName = "drillService" + }, + new + { + Id = 10, + Name = "Сервис по заканчиванию скважины", + ShortName = "closingService" + }, + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateCreated") + .HasColumnType("timestamp with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_permission"); + + b.HasComment("Разрешения на доступ к данным"); + }); + + 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.RelationUserRolePermission", b => + { + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_relation_user_role_permission"); + + b.HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("IdUser", "IdUserRole"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_user_role"); + + b.HasComment("Отношение пользователей и ролей"); + + b.HasData( + new + { + IdUser = 1, + IdUserRole = 2 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.SetpointsRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("комментарий для оператора"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("0: неизвестно, 1:ожидает отправки, 2: отправлено, 3: принято оператором, 4: отклонено оператором, 5: устарело"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("ObsolescenceSec") + .HasColumnType("integer") + .HasColumnName("obsolescence") + .HasComment("сек. до устаревания"); + + b.Property>("Setpoints") + .HasColumnType("jsonb") + .HasColumnName("setpoint_set") + .HasComment("Набор уставок"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdWell"); + + b.ToTable("t_setpoints_rquest"); + + b.HasComment("Запросы на изменение уставок панели оператора"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); + + b.Property("RemoteUid") + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + + b.Property("TimeZone") + .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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdState") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n100 - удален"); + + 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("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user"); + + b.HasComment("Пользователи облака"); + + b.HasData( + new + { + Id = 1, + IdCompany = 1, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("От какой роли унаследована данная роль"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b.HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "Администратор", + IdType = 0 + }, + new + { + Id = 2, + Caption = "Пользователь", + IdType = 0 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Property("TimeZone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + 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_composite"); + + b.HasComment("Композитная скважина"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateStart") + .HasColumnType("timestamp with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = 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 = 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 = "Промывка при спуске ОК" + }, + new + { + Id = 1051, + Code = 0, + Name = "Замер ТС" + }, + new + { + Id = 1052, + Code = 0, + Name = "Тех. отстой" + }, + new + { + Id = 1053, + Code = 0, + Name = "Циркуляция и Обработка БР" + }, + new + { + Id = 1054, + Code = 0, + Name = "Срезка ствола" + }, + new + { + Id = 1055, + Code = 0, + Name = "Вспомогательные работы" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = "Хвостовик" + }, + new + { + Id = 7, + Caption = "Пилотный ствол 2" + }, + new + { + Id = 8, + Caption = "Направление 2" + }, + new + { + Id = 9, + Caption = "Кондуктор 2" + }, + new + { + Id = 10, + Caption = "Эксплуатационная колонна 2" + }, + new + { + Id = 11, + Caption = "Транспортный ствол 2" + }, + new + { + Id = 12, + Caption = "Хвостовик 2" + }, + new + { + Id = 13, + Caption = "Пилотный ствол 3" + }, + new + { + Id = 14, + Caption = "Направление 3" + }, + new + { + Id = 15, + Caption = "Кондуктор 3" + }, + new + { + Id = 16, + Caption = "Эксплуатационная колонна 3" + }, + new + { + Id = 17, + Caption = "Транспортный ствол 3" + }, + new + { + Id = 18, + Caption = "Хвостовик 3" + }, + new + { + Id = 19, + Caption = "Пилотный ствол 4" + }, + new + { + Id = 20, + Caption = "Направление 4" + }, + new + { + Id = 21, + Caption = "Кондуктор 4" + }, + new + { + Id = 22, + Caption = "Эксплуатационная колонна 4" + }, + new + { + Id = 23, + Caption = "Транспортный ствол 4" + }, + new + { + Id = 24, + Caption = "Хвостовик 4" + }, + new + { + Id = 25, + Caption = "Пилотный ствол 5" + }, + new + { + Id = 26, + Caption = "Направление 5" + }, + new + { + Id = 27, + Caption = "Кондуктор 5" + }, + new + { + Id = 28, + Caption = "Эксплуатационная колонна 5" + }, + new + { + Id = 29, + Caption = "Транспортный ствол 5" + }, + new + { + Id = 30, + Caption = "Хвостовик 5" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_drill_params_t_well_section_type_id_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_file_mark_t_file_info_fk"); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("FileMarks") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_user_t_file_mark_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_company_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_well_id_fk"); + + b.Navigation("Company"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.HasOne("AsbCloudDb.Model.Permission", "Permission") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("UserRole"); + }); + + 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.SetpointsRequest", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Operation") + .WithMany("Analysis") + .HasForeignKey("IdOperation") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired() + .HasConstraintName("t_analysis_t_operation_id_fk"); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Analysis") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_analysis_t_telemetry_id_fk"); + + b.Navigation("Operation"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSaub") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSpin") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_event_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_messages_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_user_t_company_id_fk"); + + b.Navigation("Company"); + }); + + 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") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_well_t_telemetry_id_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_id_fk"); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellComposites") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "WellSrc") + .WithMany("WellCompositeSrcs") + .HasForeignKey("IdWellSrc") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_src_t_well_id_fk"); + + 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.Permission", b => + { + b.Navigation("RelationUserRolePermissions"); + }); + + 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"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("RelationUserRolePermissions"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellComposites"); + + 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/20220102073023_Add_timeZone_to_IMapPoint.cs b/AsbCloudDb/Migrations/20220102073023_Add_timeZone_to_IMapPoint.cs new file mode 100644 index 00000000..f4974199 --- /dev/null +++ b/AsbCloudDb/Migrations/20220102073023_Add_timeZone_to_IMapPoint.cs @@ -0,0 +1,49 @@ +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + public partial class Add_timeZone_to_IMapPoint : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "timezone", + table: "t_well", + type: "jsonb", + nullable: true, + comment: "Смещение часового пояса от UTC"); + + migrationBuilder.AddColumn( + name: "timezone", + table: "t_deposit", + type: "jsonb", + nullable: true, + comment: "Смещение часового пояса от UTC"); + + migrationBuilder.AddColumn( + name: "timezone", + table: "t_cluster", + type: "jsonb", + nullable: true, + comment: "Смещение часового пояса от UTC"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "timezone", + table: "t_well"); + + migrationBuilder.DropColumn( + name: "timezone", + table: "t_deposit"); + + migrationBuilder.DropColumn( + name: "timezone", + table: "t_cluster"); + } + } +} diff --git a/AsbCloudDb/Migrations/20220105123412_Fix_Spelling.Designer.cs b/AsbCloudDb/Migrations/20220105123412_Fix_Spelling.Designer.cs new file mode 100644 index 00000000..b389222e --- /dev/null +++ b/AsbCloudDb/Migrations/20220105123412_Fix_Spelling.Designer.cs @@ -0,0 +1,3095 @@ +// +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; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + [DbContext(typeof(AsbCloudDbContext))] + [Migration("20220105123412_Fix_Spelling")] + partial class Fix_Spelling + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.ToTable("t_deposit"); + + b.HasComment("Месторождение"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = "toolService" + }, + new + { + Id = 9, + Name = "Буровой подрядчик", + ShortName = "drillService" + }, + new + { + Id = 10, + Name = "Сервис по заканчиванию скважины", + ShortName = "closingService" + }, + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateCreated") + .HasColumnType("timestamp with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_permission"); + + b.HasComment("Разрешения на доступ к данным"); + }); + + 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.RelationUserRolePermission", b => + { + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_relation_user_role_permission"); + + b.HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("IdUser", "IdUserRole"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_user_role"); + + b.HasComment("Отношение пользователей и ролей"); + + b.HasData( + new + { + IdUser = 1, + IdUserRole = 2 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.SetpointsRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("комментарий для оператора"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("0: неизвестно, 1:ожидает отправки, 2: отправлено, 3: принято оператором, 4: отклонено оператором, 5: устарело"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("ObsolescenceSec") + .HasColumnType("integer") + .HasColumnName("obsolescence") + .HasComment("сек. до устаревания"); + + b.Property>("Setpoints") + .HasColumnType("jsonb") + .HasColumnName("setpoint_set") + .HasComment("Набор уставок"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdWell"); + + b.ToTable("t_setpoints_rquest"); + + b.HasComment("Запросы на изменение уставок панели оператора"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); + + b.Property("RemoteUid") + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + + b.Property("TimeZone") + .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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdState") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n100 - удален"); + + 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("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user"); + + b.HasComment("Пользователи облака"); + + b.HasData( + new + { + Id = 1, + IdCompany = 1, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("От какой роли унаследована данная роль"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b.HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "Администратор", + IdType = 0 + }, + new + { + Id = 2, + Caption = "Пользователь", + IdType = 0 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + 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_composite"); + + b.HasComment("Композитная скважина"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateStart") + .HasColumnType("timestamp with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = 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 = 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 = "Промывка при спуске ОК" + }, + new + { + Id = 1051, + Code = 0, + Name = "Замер ТС" + }, + new + { + Id = 1052, + Code = 0, + Name = "Тех. отстой" + }, + new + { + Id = 1053, + Code = 0, + Name = "Циркуляция и Обработка БР" + }, + new + { + Id = 1054, + Code = 0, + Name = "Срезка ствола" + }, + new + { + Id = 1055, + Code = 0, + Name = "Вспомогательные работы" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = "Хвостовик" + }, + new + { + Id = 7, + Caption = "Пилотный ствол 2" + }, + new + { + Id = 8, + Caption = "Направление 2" + }, + new + { + Id = 9, + Caption = "Кондуктор 2" + }, + new + { + Id = 10, + Caption = "Эксплуатационная колонна 2" + }, + new + { + Id = 11, + Caption = "Транспортный ствол 2" + }, + new + { + Id = 12, + Caption = "Хвостовик 2" + }, + new + { + Id = 13, + Caption = "Пилотный ствол 3" + }, + new + { + Id = 14, + Caption = "Направление 3" + }, + new + { + Id = 15, + Caption = "Кондуктор 3" + }, + new + { + Id = 16, + Caption = "Эксплуатационная колонна 3" + }, + new + { + Id = 17, + Caption = "Транспортный ствол 3" + }, + new + { + Id = 18, + Caption = "Хвостовик 3" + }, + new + { + Id = 19, + Caption = "Пилотный ствол 4" + }, + new + { + Id = 20, + Caption = "Направление 4" + }, + new + { + Id = 21, + Caption = "Кондуктор 4" + }, + new + { + Id = 22, + Caption = "Эксплуатационная колонна 4" + }, + new + { + Id = 23, + Caption = "Транспортный ствол 4" + }, + new + { + Id = 24, + Caption = "Хвостовик 4" + }, + new + { + Id = 25, + Caption = "Пилотный ствол 5" + }, + new + { + Id = 26, + Caption = "Направление 5" + }, + new + { + Id = 27, + Caption = "Кондуктор 5" + }, + new + { + Id = 28, + Caption = "Эксплуатационная колонна 5" + }, + new + { + Id = 29, + Caption = "Транспортный ствол 5" + }, + new + { + Id = 30, + Caption = "Хвостовик 5" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_drill_params_t_well_section_type_id_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_file_mark_t_file_info_fk"); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("FileMarks") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_user_t_file_mark_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_company_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_well_id_fk"); + + b.Navigation("Company"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.HasOne("AsbCloudDb.Model.Permission", "Permission") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("UserRole"); + }); + + 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.SetpointsRequest", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Operation") + .WithMany("Analysis") + .HasForeignKey("IdOperation") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired() + .HasConstraintName("t_analysis_t_operation_id_fk"); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Analysis") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_analysis_t_telemetry_id_fk"); + + b.Navigation("Operation"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSaub") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSpin") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_event_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_messages_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_user_t_company_id_fk"); + + b.Navigation("Company"); + }); + + 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") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_well_t_telemetry_id_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_id_fk"); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellComposites") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "WellSrc") + .WithMany("WellCompositeSrcs") + .HasForeignKey("IdWellSrc") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_src_t_well_id_fk"); + + 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.Permission", b => + { + b.Navigation("RelationUserRolePermissions"); + }); + + 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"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("RelationUserRolePermissions"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellComposites"); + + 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/20220105123412_Fix_Spelling.cs b/AsbCloudDb/Migrations/20220105123412_Fix_Spelling.cs new file mode 100644 index 00000000..213ac96b --- /dev/null +++ b/AsbCloudDb/Migrations/20220105123412_Fix_Spelling.cs @@ -0,0 +1,177 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + public partial class Fix_Spelling : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterTable( + name: "t_drill_flow_chart", + comment: "Параметры коридоров бурения (диапазоны параметров бурения)", + oldComment: "Параметры корридоров бурения (диапазоны параметров бурения)"); + + migrationBuilder.AlterColumn( + name: "torque_starting", + table: "t_telemetry_data_spin", + type: "real", + nullable: true, + comment: "Страгивающий момент", + oldClrType: typeof(float), + oldType: "real", + oldNullable: true, + oldComment: " Страгивающий момент"); + + migrationBuilder.AlterColumn( + name: "rotor_torque_avg", + table: "t_telemetry_data_spin", + type: "real", + nullable: true, + comment: "Момент в роторе средний", + oldClrType: typeof(float), + oldType: "real", + oldNullable: true, + oldComment: " Момент в роторе средний"); + + migrationBuilder.AlterColumn( + name: "ratio", + table: "t_telemetry_data_spin", + type: "real", + nullable: true, + comment: " Коэффициент редукции редуктора", + oldClrType: typeof(float), + oldType: "real", + oldNullable: true, + oldComment: " Коэффициент редукции редектора"); + + migrationBuilder.AlterColumn( + name: "position_zero", + table: "t_telemetry_data_spin", + type: "real", + nullable: true, + comment: "Нулевая позиция осцилляции", + oldClrType: typeof(float), + oldType: "real", + oldNullable: true, + oldComment: "Нулевая позиция осциляции"); + + migrationBuilder.AlterColumn( + name: "position_right", + table: "t_telemetry_data_spin", + type: "real", + nullable: true, + comment: "Крайний правый угол осцилляции", + oldClrType: typeof(float), + oldType: "real", + oldNullable: true, + oldComment: "Крайний правый угол осциляции"); + + migrationBuilder.AlterColumn( + name: "encoder_resolution", + table: "t_telemetry_data_spin", + type: "real", + nullable: true, + comment: "Разрешение энкодера", + oldClrType: typeof(float), + oldType: "real", + oldNullable: true, + oldComment: " Разрешение энкодера"); + + migrationBuilder.AlterColumn( + name: "is_pressure_gt_20", + table: "t_telemetry_analysis", + type: "boolean", + nullable: false, + comment: "Давление более 20", + oldClrType: typeof(bool), + oldType: "boolean", + oldComment: "Давоение более 20"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterTable( + name: "t_drill_flow_chart", + comment: "Параметры корридоров бурения (диапазоны параметров бурения)", + oldComment: "Параметры коридоров бурения (диапазоны параметров бурения)"); + + migrationBuilder.AlterColumn( + name: "torque_starting", + table: "t_telemetry_data_spin", + type: "real", + nullable: true, + comment: " Страгивающий момент", + oldClrType: typeof(float), + oldType: "real", + oldNullable: true, + oldComment: "Страгивающий момент"); + + migrationBuilder.AlterColumn( + name: "rotor_torque_avg", + table: "t_telemetry_data_spin", + type: "real", + nullable: true, + comment: " Момент в роторе средний", + oldClrType: typeof(float), + oldType: "real", + oldNullable: true, + oldComment: "Момент в роторе средний"); + + migrationBuilder.AlterColumn( + name: "ratio", + table: "t_telemetry_data_spin", + type: "real", + nullable: true, + comment: " Коэффициент редукции редектора", + oldClrType: typeof(float), + oldType: "real", + oldNullable: true, + oldComment: " Коэффициент редукции редуктора"); + + migrationBuilder.AlterColumn( + name: "position_zero", + table: "t_telemetry_data_spin", + type: "real", + nullable: true, + comment: "Нулевая позиция осциляции", + oldClrType: typeof(float), + oldType: "real", + oldNullable: true, + oldComment: "Нулевая позиция осцилляции"); + + migrationBuilder.AlterColumn( + name: "position_right", + table: "t_telemetry_data_spin", + type: "real", + nullable: true, + comment: "Крайний правый угол осциляции", + oldClrType: typeof(float), + oldType: "real", + oldNullable: true, + oldComment: "Крайний правый угол осцилляции"); + + migrationBuilder.AlterColumn( + name: "encoder_resolution", + table: "t_telemetry_data_spin", + type: "real", + nullable: true, + comment: " Разрешение энкодера", + oldClrType: typeof(float), + oldType: "real", + oldNullable: true, + oldComment: "Разрешение энкодера"); + + migrationBuilder.AlterColumn( + name: "is_pressure_gt_20", + table: "t_telemetry_analysis", + type: "boolean", + nullable: false, + comment: "Давоение более 20", + oldClrType: typeof(bool), + oldType: "boolean", + oldComment: "Давление более 20"); + } + } +} diff --git a/AsbCloudDb/Migrations/20220112104809_Refactor_UserRole.Designer.cs b/AsbCloudDb/Migrations/20220112104809_Refactor_UserRole.Designer.cs new file mode 100644 index 00000000..c9fe4322 --- /dev/null +++ b/AsbCloudDb/Migrations/20220112104809_Refactor_UserRole.Designer.cs @@ -0,0 +1,3131 @@ +// +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; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + [DbContext(typeof(AsbCloudDbContext))] + [Migration("20220112104809_Refactor_UserRole")] + partial class Refactor_UserRole + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.ToTable("t_deposit"); + + b.HasComment("Месторождение"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = "toolService" + }, + new + { + Id = 9, + Name = "Буровой подрядчик", + ShortName = "drillService" + }, + new + { + Id = 10, + Name = "Сервис по заканчиванию скважины", + ShortName = "closingService" + }, + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateCreated") + .HasColumnType("timestamp with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_permission"); + + b.HasComment("Разрешения на доступ к данным"); + }); + + 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.RelationUserRolePermission", b => + { + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_relation_user_role_permission"); + + b.HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => + { + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdInclude") + .HasColumnType("integer") + .HasColumnName("id_include_user_role"); + + b.HasKey("Id", "IdInclude") + .HasName("t_relation_user_role_user_role_pk"); + + b.HasIndex("IdInclude"); + + b.ToTable("t_relation_user_role_user_role"); + + b.HasComment("Отношение ролей к ролям"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("IdUser", "IdUserRole"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_user_role"); + + b.HasComment("Отношение пользователей и ролей"); + + b.HasData( + new + { + IdUser = 1, + IdUserRole = 2 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.SetpointsRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("комментарий для оператора"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("0: неизвестно, 1:ожидает отправки, 2: отправлено, 3: принято оператором, 4: отклонено оператором, 5: устарело"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("ObsolescenceSec") + .HasColumnType("integer") + .HasColumnName("obsolescence") + .HasComment("сек. до устаревания"); + + b.Property>("Setpoints") + .HasColumnType("jsonb") + .HasColumnName("setpoint_set") + .HasComment("Набор уставок"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdWell"); + + b.ToTable("t_setpoints_rquest"); + + b.HasComment("Запросы на изменение уставок панели оператора"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); + + b.Property("RemoteUid") + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + + b.Property("TimeZone") + .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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdState") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n100 - удален"); + + 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("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user"); + + b.HasComment("Пользователи облака"); + + b.HasData( + new + { + Id = 1, + IdCompany = 1, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b.HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "Администратор", + IdType = 0 + }, + new + { + Id = 2, + Caption = "Пользователь", + IdType = 0 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + 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_composite"); + + b.HasComment("Композитная скважина"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateStart") + .HasColumnType("timestamp with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = 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 = 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 = "Промывка при спуске ОК" + }, + new + { + Id = 1051, + Code = 0, + Name = "Замер ТС" + }, + new + { + Id = 1052, + Code = 0, + Name = "Тех. отстой" + }, + new + { + Id = 1053, + Code = 0, + Name = "Циркуляция и Обработка БР" + }, + new + { + Id = 1054, + Code = 0, + Name = "Срезка ствола" + }, + new + { + Id = 1055, + Code = 0, + Name = "Вспомогательные работы" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = "Хвостовик" + }, + new + { + Id = 7, + Caption = "Пилотный ствол 2" + }, + new + { + Id = 8, + Caption = "Направление 2" + }, + new + { + Id = 9, + Caption = "Кондуктор 2" + }, + new + { + Id = 10, + Caption = "Эксплуатационная колонна 2" + }, + new + { + Id = 11, + Caption = "Транспортный ствол 2" + }, + new + { + Id = 12, + Caption = "Хвостовик 2" + }, + new + { + Id = 13, + Caption = "Пилотный ствол 3" + }, + new + { + Id = 14, + Caption = "Направление 3" + }, + new + { + Id = 15, + Caption = "Кондуктор 3" + }, + new + { + Id = 16, + Caption = "Эксплуатационная колонна 3" + }, + new + { + Id = 17, + Caption = "Транспортный ствол 3" + }, + new + { + Id = 18, + Caption = "Хвостовик 3" + }, + new + { + Id = 19, + Caption = "Пилотный ствол 4" + }, + new + { + Id = 20, + Caption = "Направление 4" + }, + new + { + Id = 21, + Caption = "Кондуктор 4" + }, + new + { + Id = 22, + Caption = "Эксплуатационная колонна 4" + }, + new + { + Id = 23, + Caption = "Транспортный ствол 4" + }, + new + { + Id = 24, + Caption = "Хвостовик 4" + }, + new + { + Id = 25, + Caption = "Пилотный ствол 5" + }, + new + { + Id = 26, + Caption = "Направление 5" + }, + new + { + Id = 27, + Caption = "Кондуктор 5" + }, + new + { + Id = 28, + Caption = "Эксплуатационная колонна 5" + }, + new + { + Id = 29, + Caption = "Транспортный ствол 5" + }, + new + { + Id = 30, + Caption = "Хвостовик 5" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_drill_params_t_well_section_type_id_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_file_mark_t_file_info_fk"); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("FileMarks") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_user_t_file_mark_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_company_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_well_id_fk"); + + b.Navigation("Company"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.HasOne("AsbCloudDb.Model.Permission", "Permission") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => + { + b.HasOne("AsbCloudDb.Model.UserRole", "Role") + .WithMany("RelationUserRoleUserRoles") + .HasForeignKey("Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "IncludeRole") + .WithMany() + .HasForeignKey("IdInclude") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IncludeRole"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("UserRole"); + }); + + 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.SetpointsRequest", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Operation") + .WithMany("Analysis") + .HasForeignKey("IdOperation") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired() + .HasConstraintName("t_analysis_t_operation_id_fk"); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Analysis") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_analysis_t_telemetry_id_fk"); + + b.Navigation("Operation"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSaub") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSpin") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_event_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_messages_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_user_t_company_id_fk"); + + b.Navigation("Company"); + }); + + 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") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_well_t_telemetry_id_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_id_fk"); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellComposites") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "WellSrc") + .WithMany("WellCompositeSrcs") + .HasForeignKey("IdWellSrc") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_src_t_well_id_fk"); + + 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.Permission", b => + { + b.Navigation("RelationUserRolePermissions"); + }); + + 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"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("RelationUserRolePermissions"); + + b.Navigation("RelationUserRoleUserRoles"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellComposites"); + + 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/20220112104809_Refactor_UserRole.cs b/AsbCloudDb/Migrations/20220112104809_Refactor_UserRole.cs new file mode 100644 index 00000000..2cadc78d --- /dev/null +++ b/AsbCloudDb/Migrations/20220112104809_Refactor_UserRole.cs @@ -0,0 +1,59 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + public partial class Refactor_UserRole : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "id_parent", + table: "t_user_role"); + + migrationBuilder.CreateTable( + name: "t_relation_user_role_user_role", + columns: table => new + { + id_user_role = table.Column(type: "integer", nullable: false), + id_include_user_role = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("t_relation_user_role_user_role_pk", x => new { x.id_user_role, x.id_include_user_role }); + table.ForeignKey( + name: "FK_t_relation_user_role_user_role_t_user_role_id_include_user_~", + column: x => x.id_include_user_role, + principalTable: "t_user_role", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_t_relation_user_role_user_role_t_user_role_id_user_role", + column: x => x.id_user_role, + principalTable: "t_user_role", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }, + comment: "Отношение ролей к ролям"); + + migrationBuilder.CreateIndex( + name: "IX_t_relation_user_role_user_role_id_include_user_role", + table: "t_relation_user_role_user_role", + column: "id_include_user_role"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "t_relation_user_role_user_role"); + + migrationBuilder.AddColumn( + name: "id_parent", + table: "t_user_role", + type: "integer", + nullable: true, + comment: "От какой роли унаследована данная роль"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 12bd4457..dcebd312 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -7,6 +7,8 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +#nullable disable + namespace AsbCloudDb.Migrations { [DbContext(typeof(AsbCloudDbContext))] @@ -16,19 +18,21 @@ namespace AsbCloudDb.Migrations { #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); + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Caption") .HasMaxLength(255) @@ -48,14 +52,18 @@ namespace AsbCloudDb.Migrations .HasColumnType("double precision") .HasColumnName("longitude"); + b.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + b.HasKey("Id"); b.HasIndex("IdDeposit"); b.ToTable("t_cluster"); - b - .HasComment("Кусты"); + b.HasComment("Кусты"); }); modelBuilder.Entity("AsbCloudDb.Model.Company", b => @@ -63,8 +71,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Caption") .HasMaxLength(255) @@ -97,8 +106,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Caption") .HasMaxLength(255) @@ -132,8 +142,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Caption") .HasMaxLength(255) @@ -148,12 +159,16 @@ namespace AsbCloudDb.Migrations .HasColumnType("double precision") .HasColumnName("longitude"); + b.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + b.HasKey("Id"); b.ToTable("t_deposit"); - b - .HasComment("Месторождение"); + b.HasComment("Месторождение"); }); modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => @@ -161,8 +176,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("AxialLoadMax") .HasColumnType("double precision") @@ -204,7 +220,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("id_operation_category") .HasComment("Id типа операции"); - b.Property("LastUpdate") + b.Property("LastUpdate") .HasColumnType("timestamp with time zone") .HasColumnName("last_update") .HasComment("Дата последнего изменения"); @@ -247,8 +263,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_drill_flow_chart"); - b - .HasComment("Параметры корридоров бурения (диапазоны параметров бурения)"); + b.HasComment("Параметры коридоров бурения (диапазоны параметров бурения)"); }); modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b => @@ -256,8 +271,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("AxialLoadAvg") .HasColumnType("double precision") @@ -362,8 +378,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_drill_params"); - b - .HasComment("Режим бурения в секции (диапазоны параметров бурения)"); + b.HasComment("Режим бурения в секции (диапазоны параметров бурения)"); }); modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => @@ -371,8 +386,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Name") .HasColumnType("text") @@ -388,8 +404,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_file_category"); - b - .HasComment("Категории файлов"); + b.HasComment("Категории файлов"); b.HasData( new @@ -477,8 +492,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("IdAuthor") .HasColumnType("integer") @@ -515,7 +531,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("file_size") .HasComment("Размер файла"); - b.Property("UploadDate") + b.Property("UploadDate") .HasColumnType("timestamp with time zone") .HasColumnName("date"); @@ -529,8 +545,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_file_info"); - b - .HasComment("Файлы всех категорий"); + b.HasComment("Файлы всех категорий"); }); modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => @@ -538,8 +553,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Comment") .HasMaxLength(255) @@ -547,7 +563,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("comment") .HasComment("Комментарий"); - b.Property("DateCreated") + b.Property("DateCreated") .HasColumnType("timestamp with time zone") .HasColumnName("date_created") .HasComment("Дата совершенного действия"); @@ -580,8 +596,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_file_mark"); - b - .HasComment("Действия с файлами."); + b.HasComment("Действия с файлами."); }); modelBuilder.Entity("AsbCloudDb.Model.Measure", b => @@ -589,10 +604,11 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); - b.Property>("Data") + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Data") .HasColumnType("jsonb") .HasColumnName("data") .HasComment("Данные таблицы последних данных"); @@ -612,7 +628,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("is_deleted") .HasComment("Пометка удаленным"); - b.Property("Timestamp") + b.Property("Timestamp") .HasColumnType("timestamp with time zone") .HasColumnName("timestamp") .HasComment("время добавления"); @@ -625,8 +641,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_measure"); - b - .HasComment("Таблица c данными для вкладки 'Последние данные'"); + b.HasComment("Таблица c данными для вкладки 'Последние данные'"); }); modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => @@ -634,8 +649,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Name") .HasColumnType("text") @@ -651,8 +667,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_measure_category"); - b - .HasComment("Категория последних данных"); + b.HasComment("Категория последних данных"); b.HasData( new @@ -680,8 +695,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Description") .HasMaxLength(255) @@ -699,8 +715,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_permission"); - b - .HasComment("Разрешения на доступ к данным"); + b.HasComment("Разрешения на доступ к данным"); }); modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => @@ -719,8 +734,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_relation_company_well"); - b - .HasComment("отношение скважин и компаний"); + b.HasComment("отношение скважин и компаний"); }); modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => @@ -739,8 +753,27 @@ namespace AsbCloudDb.Migrations b.ToTable("t_relation_user_role_permission"); - b - .HasComment("Отношение ролей пользователей и разрешений доступа"); + b.HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => + { + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdInclude") + .HasColumnType("integer") + .HasColumnName("id_include_user_role"); + + b.HasKey("Id", "IdInclude") + .HasName("t_relation_user_role_user_role_pk"); + + b.HasIndex("IdInclude"); + + b.ToTable("t_relation_user_role_user_role"); + + b.HasComment("Отношение ролей к ролям"); }); modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => @@ -759,8 +792,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_relation_user_user_role"); - b - .HasComment("Отношение пользователей и ролей"); + b.HasComment("Отношение пользователей и ролей"); b.HasData( new @@ -775,8 +807,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Begin") .HasColumnType("timestamp with time zone") @@ -815,8 +848,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_report_property"); - b - .HasComment("Отчеты с данными по буровым"); + b.HasComment("Отчеты с данными по буровым"); }); modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => @@ -824,8 +856,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Comment") .HasColumnType("text") @@ -857,7 +890,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("setpoint_set") .HasComment("Набор уставок"); - b.Property("UploadDate") + b.Property("UploadDate") .HasColumnType("timestamp with time zone") .HasColumnName("date"); @@ -869,8 +902,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_setpoints_rquest"); - b - .HasComment("Запросы на изменение уставок панели оператора"); + b.HasComment("Запросы на изменение уставок панели оператора"); }); modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => @@ -878,8 +910,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Info") .HasColumnType("jsonb") @@ -891,7 +924,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("remote_uid") .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TelemetryTimeZone") + b.Property("TimeZone") .HasColumnType("jsonb") .HasColumnName("timezone") .HasComment("Смещение часового пояса от UTC"); @@ -902,8 +935,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_telemetry"); - b - .HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + b.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b => @@ -911,8 +943,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("DurationSec") .HasColumnType("integer") @@ -965,7 +998,7 @@ namespace AsbCloudDb.Migrations b.Property("IsPressureGt20") .HasColumnType("boolean") .HasColumnName("is_pressure_gt_20") - .HasComment("Давоение более 20"); + .HasComment("Давление более 20"); b.Property("IsPressureLt20") .HasColumnType("boolean") @@ -1015,8 +1048,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_telemetry_analysis"); - b - .HasComment("События на скважине"); + b.HasComment("События на скважине"); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => @@ -1025,7 +1057,7 @@ namespace AsbCloudDb.Migrations .HasColumnType("integer") .HasColumnName("id_telemetry"); - b.Property("Date") + b.Property("Date") .HasColumnType("timestamp with time zone") .HasColumnName("date") .HasComment("'2021-10-19 18:23:54+05'"); @@ -1214,8 +1246,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_telemetry_data_saub"); - b - .HasComment("набор основных данных по SAUB"); + b.HasComment("набор основных данных по SAUB"); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => @@ -1224,7 +1255,7 @@ namespace AsbCloudDb.Migrations .HasColumnType("integer") .HasColumnName("id_telemetry"); - b.Property("Date") + b.Property("Date") .HasColumnType("timestamp with time zone") .HasColumnName("date") .HasComment("'2021-10-19 18:23:54+05'"); @@ -1242,7 +1273,7 @@ namespace AsbCloudDb.Migrations b.Property("EncoderResolution") .HasColumnType("real") .HasColumnName("encoder_resolution") - .HasComment(" Разрешение энкодера"); + .HasComment("Разрешение энкодера"); b.Property("Mode") .HasColumnType("smallint") @@ -1257,17 +1288,17 @@ namespace AsbCloudDb.Migrations b.Property("PositionRight") .HasColumnType("real") .HasColumnName("position_right") - .HasComment("Крайний правый угол осциляции"); + .HasComment("Крайний правый угол осцилляции"); b.Property("PositionZero") .HasColumnType("real") .HasColumnName("position_zero") - .HasComment("Нулевая позиция осциляции"); + .HasComment("Нулевая позиция осцилляции"); b.Property("Ratio") .HasColumnType("real") .HasColumnName("ratio") - .HasComment(" Коэффициент редукции редектора"); + .HasComment(" Коэффициент редукции редуктора"); b.Property("ReverseKTorque") .HasColumnType("real") @@ -1302,7 +1333,7 @@ namespace AsbCloudDb.Migrations b.Property("RotorTorqueAvg") .HasColumnType("real") .HasColumnName("rotor_torque_avg") - .HasComment(" Момент в роторе средний"); + .HasComment("Момент в роторе средний"); b.Property("SpeedLeftSp") .HasColumnType("real") @@ -1466,7 +1497,7 @@ namespace AsbCloudDb.Migrations b.Property("TorqueStarting") .HasColumnType("real") .HasColumnName("torque_starting") - .HasComment(" Страгивающий момент"); + .HasComment("Страгивающий момент"); b.Property("TurnLeftOnceByAngle") .HasColumnType("real") @@ -1527,8 +1558,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_telemetry_data_spin"); - b - .HasComment("набор основных данных по SpinMaster"); + b.HasComment("набор основных данных по SpinMaster"); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => @@ -1553,8 +1583,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_telemetry_event"); - b - .HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + b.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => @@ -1562,8 +1591,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Arg0") .HasMaxLength(255) @@ -1586,7 +1616,7 @@ namespace AsbCloudDb.Migrations .HasColumnType("character varying(255)") .HasColumnName("arg3"); - b.Property("Date") + b.Property("Date") .HasColumnType("timestamp with time zone") .HasColumnName("date"); @@ -1613,8 +1643,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_telemetry_message"); - b - .HasComment("Сообщения на буровых"); + b.HasComment("Сообщения на буровых"); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => @@ -1650,8 +1679,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_telemetry_user"); - b - .HasComment("Пользователи панели САУБ. Для сообщений."); + b.HasComment("Пользователи панели САУБ. Для сообщений."); }); modelBuilder.Entity("AsbCloudDb.Model.User", b => @@ -1659,8 +1687,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Email") .HasMaxLength(255) @@ -1727,8 +1756,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_user"); - b - .HasComment("Пользователи облака"); + b.HasComment("Пользователи облака"); b.HasData( new @@ -1746,8 +1774,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Caption") .HasMaxLength(255) @@ -1755,11 +1784,6 @@ namespace AsbCloudDb.Migrations .HasColumnName("caption") .HasComment("Название"); - b.Property("IdParent") - .HasColumnType("integer") - .HasColumnName("id_parent") - .HasComment("От какой роли унаследована данная роль"); - b.Property("IdType") .HasColumnType("integer") .HasColumnName("id_type") @@ -1769,8 +1793,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_user_role"); - b - .HasComment("Роли пользователей в системе"); + b.HasComment("Роли пользователей в системе"); b.HasData( new @@ -1792,8 +1815,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Caption") .HasMaxLength(255) @@ -1825,6 +1849,11 @@ namespace AsbCloudDb.Migrations .HasColumnType("double precision") .HasColumnName("longitude"); + b.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + b.HasKey("Id"); b.HasIndex("IdCluster"); @@ -1836,8 +1865,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_well"); - b - .HasComment("скважины"); + b.HasComment("скважины"); }); modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => @@ -1865,8 +1893,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_well_composite"); - b - .HasComment("Композитная скважина"); + b.HasComment("Композитная скважина"); }); modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => @@ -1874,8 +1901,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("CategoryInfo") .HasColumnType("text") @@ -1887,7 +1915,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("comment") .HasComment("Комментарий"); - b.Property("DateStart") + b.Property("DateStart") .HasColumnType("timestamp with time zone") .HasColumnName("date_start") .HasComment("Дата начала операции"); @@ -1941,8 +1969,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_well_operation"); - b - .HasComment("Данные по операциям на скважине"); + b.HasComment("Данные по операциям на скважине"); }); modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => @@ -1950,8 +1977,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Code") .HasColumnType("integer") @@ -1967,8 +1995,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_well_operation_category"); - b - .HasComment("Справочник операций на скважине"); + b.HasComment("Справочник операций на скважине"); b.HasData( new @@ -2143,7 +2170,7 @@ namespace AsbCloudDb.Migrations { Id = 1014, Code = 0, - Name = "Опресовка Ц.К." + Name = "Опрессовка Ц.К." }, new { @@ -2386,8 +2413,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Caption") .HasMaxLength(255) @@ -2399,39 +2427,38 @@ namespace AsbCloudDb.Migrations b.ToTable("t_well_section_type"); - b - .HasComment("конструкция секции скважины"); + b.HasComment("конструкция секции скважины"); b.HasData( new { Id = 1, - Caption = "Пилотный ствол 1" + Caption = "Пилотный ствол" }, new { Id = 2, - Caption = "Направление 1" + Caption = "Направление" }, new { Id = 3, - Caption = "Кондуктор 1" + Caption = "Кондуктор" }, new { Id = 4, - Caption = "Эксплуатационная колонна 1" + Caption = "Эксплуатационная колонна" }, new { Id = 5, - Caption = "Транспортный ствол 1" + Caption = "Транспортный ствол" }, new { Id = 6, - Caption = "Хвостовик 1" + Caption = "Хвостовик" }, new { @@ -2560,8 +2587,9 @@ namespace AsbCloudDb.Migrations b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Caption") .HasMaxLength(255) @@ -2573,8 +2601,7 @@ namespace AsbCloudDb.Migrations b.ToTable("t_well_type"); - b - .HasComment("конструкция скважины"); + b.HasComment("конструкция скважины"); b.HasData( new @@ -2632,9 +2659,9 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") .WithMany("DrillParamsCollection") .HasForeignKey("IdWellSectionType") - .HasConstraintName("t_drill_params_t_well_section_type_id_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_drill_params_t_well_section_type_id_fk"); b.Navigation("Well"); @@ -2671,16 +2698,16 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.FileInfo", "FileInfo") .WithMany("FileMarks") .HasForeignKey("IdFile") - .HasConstraintName("t_file_mark_t_file_info_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_file_mark_t_file_info_fk"); b.HasOne("AsbCloudDb.Model.User", "User") .WithMany("FileMarks") .HasForeignKey("IdUser") - .HasConstraintName("t_user_t_file_mark_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_user_t_file_mark_fk"); b.Navigation("FileInfo"); @@ -2711,16 +2738,16 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.Company", "Company") .WithMany("RelationCompaniesWells") .HasForeignKey("IdCompany") - .HasConstraintName("t_relation_company_well_t_company_id_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_relation_company_well_t_company_id_fk"); b.HasOne("AsbCloudDb.Model.Well", "Well") .WithMany("RelationCompaniesWells") .HasForeignKey("IdWell") - .HasConstraintName("t_relation_company_well_t_well_id_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_relation_company_well_t_well_id_fk"); b.Navigation("Company"); @@ -2746,6 +2773,25 @@ namespace AsbCloudDb.Migrations b.Navigation("UserRole"); }); + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => + { + b.HasOne("AsbCloudDb.Model.UserRole", "Role") + .WithMany("RelationUserRoleUserRoles") + .HasForeignKey("Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "IncludeRole") + .WithMany() + .HasForeignKey("IdInclude") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IncludeRole"); + + b.Navigation("Role"); + }); + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => { b.HasOne("AsbCloudDb.Model.User", "User") @@ -2808,16 +2854,16 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Operation") .WithMany("Analysis") .HasForeignKey("IdOperation") - .HasConstraintName("t_analysis_t_operation_id_fk") .OnDelete(DeleteBehavior.SetNull) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_analysis_t_operation_id_fk"); b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") .WithMany("Analysis") .HasForeignKey("IdTelemetry") - .HasConstraintName("t_analysis_t_telemetry_id_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_analysis_t_telemetry_id_fk"); b.Navigation("Operation"); @@ -2829,9 +2875,9 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") .WithMany("DataSaub") .HasForeignKey("IdTelemetry") - .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk"); b.Navigation("Telemetry"); }); @@ -2841,9 +2887,9 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") .WithMany("DataSpin") .HasForeignKey("IdTelemetry") - .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk"); b.Navigation("Telemetry"); }); @@ -2853,9 +2899,9 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") .WithMany("Events") .HasForeignKey("IdTelemetry") - .HasConstraintName("t_event_t_telemetry_id_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_event_t_telemetry_id_fk"); b.Navigation("Telemetry"); }); @@ -2865,9 +2911,9 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") .WithMany("Messages") .HasForeignKey("IdTelemetry") - .HasConstraintName("t_messages_t_telemetry_id_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_messages_t_telemetry_id_fk"); b.Navigation("Telemetry"); }); @@ -2877,9 +2923,9 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") .WithMany("Users") .HasForeignKey("IdTelemetry") - .HasConstraintName("t_telemetry_user_t_telemetry_id_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); b.Navigation("Telemetry"); }); @@ -2889,8 +2935,8 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.Company", "Company") .WithMany("Users") .HasForeignKey("IdCompany") - .HasConstraintName("t_user_t_company_id_fk") - .OnDelete(DeleteBehavior.SetNull); + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_user_t_company_id_fk"); b.Navigation("Company"); }); @@ -2905,8 +2951,8 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") .WithOne("Well") .HasForeignKey("AsbCloudDb.Model.Well", "IdTelemetry") - .HasConstraintName("t_well_t_telemetry_id_fk") - .OnDelete(DeleteBehavior.SetNull); + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_well_t_telemetry_id_fk"); b.HasOne("AsbCloudDb.Model.WellType", "WellType") .WithMany("Wells") @@ -2924,23 +2970,23 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.Well", "Well") .WithMany("WellComposites") .HasForeignKey("IdWell") - .HasConstraintName("t_well_сomposite_t_well_id_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_id_fk"); b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") .WithMany("WellComposites") .HasForeignKey("IdWellSectionType") - .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk"); b.HasOne("AsbCloudDb.Model.Well", "WellSrc") .WithMany("WellCompositeSrcs") .HasForeignKey("IdWellSrc") - .HasConstraintName("t_well_сomposite_src_t_well_id_fk") .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .IsRequired() + .HasConstraintName("t_well_сomposite_src_t_well_id_fk"); b.Navigation("Well"); @@ -3043,6 +3089,8 @@ namespace AsbCloudDb.Migrations { b.Navigation("RelationUserRolePermissions"); + b.Navigation("RelationUserRoleUserRoles"); + b.Navigation("RelationUsersUserRoles"); }); @@ -3050,10 +3098,10 @@ namespace AsbCloudDb.Migrations { b.Navigation("RelationCompaniesWells"); - b.Navigation("WellComposites"); - b.Navigation("WellCompositeSrcs"); + b.Navigation("WellComposites"); + b.Navigation("WellOperations"); }); diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index 6bb8ba00..188e875d 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -1,9 +1,5 @@ using Microsoft.EntityFrameworkCore; -using System; using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; #nullable disable @@ -42,6 +38,7 @@ namespace AsbCloudDb.Model public virtual DbSet RelationUserUserRoles { get; set; } public virtual DbSet Permissions { get; set; } public virtual DbSet RelationUserRolePermissions { get; set; } + public virtual DbSet RelationUserRoleUserRoles { get; set; } //var options = new DbContextOptionsBuilder() // .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True") @@ -209,6 +206,11 @@ namespace AsbCloudDb.Model .HasConstraintName("t_relation_company_well_t_company_id_fk"); }); + modelBuilder.Entity(entity => { + entity.HasKey(x => new { x.Id, x.IdInclude }) + .HasName("t_relation_user_role_user_role_pk"); + }); + modelBuilder.Entity(entity => { entity.HasIndex(d => d.DepthEnd); @@ -281,7 +283,7 @@ namespace AsbCloudDb.Model Id = 1, IdCompany = 1, Login = "dev", - PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072", // dev + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072", Name = "Разработчик", }, }); @@ -304,7 +306,7 @@ namespace AsbCloudDb.Model modelBuilder.Entity(entity => { entity.HasData(new List { - // Автоматически опеределяемые операции + // Автоматически определяемые операции new WellOperationCategory {Id = 1, Name = "Невозможно определить операцию", Code = 0}, new WellOperationCategory {Id = 2, Name = "Роторное бурение", Code = 0 }, new WellOperationCategory {Id = 3, Name = "Слайдирование", Code = 0 }, @@ -334,7 +336,7 @@ namespace AsbCloudDb.Model new WellOperationCategory {Id = 1011, Name = "Начало цикла строительства скважины", Code = 0 }, new WellOperationCategory {Id = 1012, Name = "Окончание цикла строительства скважины", Code = 0 }, new WellOperationCategory {Id = 1013, Name = "Опрессовка ПВО", Code = 0 }, - new WellOperationCategory {Id = 1014, Name = "Опресовка Ц.К.", Code = 0 }, + new WellOperationCategory {Id = 1014, Name = "Опрессовка Ц.К.", Code = 0 }, new WellOperationCategory {Id = 1015, Name = "Опрессовка ВЗД", Code = 0 }, new WellOperationCategory {Id = 1016, Name = "Перевод скв на другой тип промывочной жидкости", Code = 0 }, new WellOperationCategory {Id = 1017, Name = "Перезапись каротажа", Code = 0 }, @@ -402,12 +404,12 @@ namespace AsbCloudDb.Model modelBuilder.Entity(entity => { entity.HasData(new List{ - new WellSectionType{ Id = 1, Caption = "Пилотный ствол 1"}, - new WellSectionType{ Id = 2, Caption = "Направление 1"}, - new WellSectionType{ Id = 3, Caption = "Кондуктор 1"}, - new WellSectionType{ Id = 4, Caption = "Эксплуатационная колонна 1"}, - new WellSectionType{ Id = 5, Caption = "Транспортный ствол 1"}, - new WellSectionType{ Id = 6, Caption = "Хвостовик 1"}, + new WellSectionType{ Id = 1, Caption = "Пилотный ствол"}, + new WellSectionType{ Id = 2, Caption = "Направление"}, + new WellSectionType{ Id = 3, Caption = "Кондуктор"}, + new WellSectionType{ Id = 4, Caption = "Эксплуатационная колонна"}, + new WellSectionType{ Id = 5, Caption = "Транспортный ствол"}, + new WellSectionType{ Id = 6, Caption = "Хвостовик"}, new WellSectionType{ Id = 7, Caption = "Пилотный ствол 2"}, new WellSectionType{ Id = 8, Caption = "Направление 2"}, diff --git a/AsbCloudDb/Model/Cluster.cs b/AsbCloudDb/Model/Cluster.cs index 971a1c3f..3cc7ffcc 100644 --- a/AsbCloudDb/Model/Cluster.cs +++ b/AsbCloudDb/Model/Cluster.cs @@ -38,5 +38,8 @@ namespace AsbCloudDb.Model [Column("longitude")] public double? Longitude { get; set; } + + [Column("timezone", TypeName = "jsonb"), Comment("Смещение часового пояса от UTC")] + public SimpleTimezone Timezone { get; set; } } } diff --git a/AsbCloudDb/Model/Deposit.cs b/AsbCloudDb/Model/Deposit.cs index edb72b8d..95488c16 100644 --- a/AsbCloudDb/Model/Deposit.cs +++ b/AsbCloudDb/Model/Deposit.cs @@ -31,5 +31,8 @@ namespace AsbCloudDb.Model [Column("longitude")] public double? Longitude { get; set; } + + [Column("timezone", TypeName = "jsonb"), Comment("Смещение часового пояса от UTC")] + public SimpleTimezone Timezone { get; set; } } } diff --git a/AsbCloudDb/Model/DrillFlowChart.cs b/AsbCloudDb/Model/DrillFlowChart.cs index f4a46514..72535aa2 100644 --- a/AsbCloudDb/Model/DrillFlowChart.cs +++ b/AsbCloudDb/Model/DrillFlowChart.cs @@ -6,7 +6,7 @@ using System.Text.Json.Serialization; namespace AsbCloudDb.Model { - [Table("t_drill_flow_chart"), Comment("Параметры корридоров бурения (диапазоны параметров бурения)")] + [Table("t_drill_flow_chart"), Comment("Параметры коридоров бурения (диапазоны параметров бурения)")] public class DrillFlowChart : IId { [Key] @@ -20,7 +20,7 @@ namespace AsbCloudDb.Model public int IdWellOperationCategory { get; set; } [Column("last_update", TypeName = "timestamp with time zone"), Comment("Дата последнего изменения")] - public DateTime LastUpdate { get; set; } + public DateTimeOffset LastUpdate { get; set; } [Column("depth_start"), Comment("Стартовая глубина")] public double DepthStart { get; set; } diff --git a/AsbCloudDb/Model/FileInfo.cs b/AsbCloudDb/Model/FileInfo.cs index 18bce677..b37a1363 100644 --- a/AsbCloudDb/Model/FileInfo.cs +++ b/AsbCloudDb/Model/FileInfo.cs @@ -27,7 +27,7 @@ namespace AsbCloudDb.Model public string Name { get; set; } [Column("date", TypeName = "timestamp with time zone")] - public DateTime UploadDate { get; set; } + public DateTimeOffset UploadDate { get; set; } [Column("file_size"), Comment("Размер файла")] public long Size { get; set; } diff --git a/AsbCloudDb/Model/FileMark.cs b/AsbCloudDb/Model/FileMark.cs index eb9ac7fc..fa138122 100644 --- a/AsbCloudDb/Model/FileMark.cs +++ b/AsbCloudDb/Model/FileMark.cs @@ -20,7 +20,7 @@ namespace AsbCloudDb.Model public int IdMarkType { get; set; } [Column("date_created", TypeName = "timestamp with time zone"), Comment("Дата совершенного действия")] - public DateTime DateCreated { get; set; } + public DateTimeOffset DateCreated { get; set; } [Column("id_user"), Comment("id пользователя")] public int IdUser { get; set; } diff --git a/AsbCloudDb/Model/FilePublishInfo.cs b/AsbCloudDb/Model/FilePublishInfo.cs index 23a3eee1..7b34fdc1 100644 --- a/AsbCloudDb/Model/FilePublishInfo.cs +++ b/AsbCloudDb/Model/FilePublishInfo.cs @@ -5,7 +5,7 @@ namespace AsbCloudDb.Model public class FilePublishInfo { public int IdPublisher { get; set; } - public DateTime Date { get; set; } + public DateTimeOffset Date { get; set; } public string WebStorageFileUrl { get; set; } } } \ No newline at end of file diff --git a/AsbCloudDb/Model/IMapPoint.cs b/AsbCloudDb/Model/IMapPoint.cs index 663671b2..a4083a3a 100644 --- a/AsbCloudDb/Model/IMapPoint.cs +++ b/AsbCloudDb/Model/IMapPoint.cs @@ -5,5 +5,7 @@ double? Latitude { get; set; } double? Longitude { get; set; } + + SimpleTimezone Timezone { get; set; } } } diff --git a/AsbCloudDb/Model/ITelemetryData.cs b/AsbCloudDb/Model/ITelemetryData.cs index c4942855..cc55e8b9 100644 --- a/AsbCloudDb/Model/ITelemetryData.cs +++ b/AsbCloudDb/Model/ITelemetryData.cs @@ -5,6 +5,6 @@ namespace AsbCloudDb.Model public interface ITelemetryData { int IdTelemetry { get; set; } - DateTime Date { get; set; } + DateTimeOffset Date { get; set; } } } diff --git a/AsbCloudDb/Model/Measure.cs b/AsbCloudDb/Model/Measure.cs index 394d5c03..1df754be 100644 --- a/AsbCloudDb/Model/Measure.cs +++ b/AsbCloudDb/Model/Measure.cs @@ -1,6 +1,5 @@ using Microsoft.EntityFrameworkCore; using System; -using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Text.Json.Serialization; @@ -21,10 +20,10 @@ namespace AsbCloudDb.Model public int IdCategory { get; set; } [Column("timestamp", TypeName = "timestamp with time zone"), Comment("время добавления")] - public DateTime Timestamp { get; set; } + public DateTimeOffset Timestamp { get; set; } [Column("data", TypeName = "jsonb"), Comment("Данные таблицы последних данных")] - public Dictionary Data { get; set; } + public RawData Data { get; set; } [Column("is_deleted"), Comment("Пометка удаленным")] public bool IsDeleted { get; set; } diff --git a/AsbCloudDb/Model/RawData.cs b/AsbCloudDb/Model/RawData.cs new file mode 100644 index 00000000..8200aac6 --- /dev/null +++ b/AsbCloudDb/Model/RawData.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace AsbCloudDb.Model +{ + public class RawData: Dictionary + { + + } +} diff --git a/AsbCloudDb/Model/RelationUserRolePermission.cs b/AsbCloudDb/Model/RelationUserRolePermission.cs index 5d0f360b..356da7f8 100644 --- a/AsbCloudDb/Model/RelationUserRolePermission.cs +++ b/AsbCloudDb/Model/RelationUserRolePermission.cs @@ -1,5 +1,4 @@ using Microsoft.EntityFrameworkCore; -using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace AsbCloudDb.Model diff --git a/AsbCloudDb/Model/RelationUserRoleUserRole.cs b/AsbCloudDb/Model/RelationUserRoleUserRole.cs new file mode 100644 index 00000000..573a8ba7 --- /dev/null +++ b/AsbCloudDb/Model/RelationUserRoleUserRole.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations.Schema; + +namespace AsbCloudDb.Model +{ + [Table("t_relation_user_role_user_role"), Comment("Отношение ролей к ролям")] + public class RelationUserRoleUserRole + { + [Column("id_user_role")] + public int Id { get; set; } + + [Column("id_include_user_role")] + public int IdInclude { get; set; } + + [ForeignKey(nameof(Id))] + [InverseProperty(nameof(UserRole.RelationUserRoleUserRoles))] + public virtual UserRole Role { get; set; } + + [ForeignKey(nameof(IdInclude))] + public virtual UserRole IncludeRole { get; set; } + + } +} diff --git a/AsbCloudDb/Model/SetpointsRequest.cs b/AsbCloudDb/Model/SetpointsRequest.cs index e098a708..7523d6cc 100644 --- a/AsbCloudDb/Model/SetpointsRequest.cs +++ b/AsbCloudDb/Model/SetpointsRequest.cs @@ -23,7 +23,7 @@ namespace AsbCloudDb.Model public int IdState { get; set; } [Column("date", TypeName = "timestamp with time zone")] - public DateTime UploadDate { get; set; } + public DateTimeOffset UploadDate { get; set; } [Column("obsolescence"), Comment("сек. до устаревания")] public int ObsolescenceSec { get; set; } diff --git a/AsbCloudDb/Model/TelemetryTimeZone.cs b/AsbCloudDb/Model/SimpleTimeZone.cs similarity index 83% rename from AsbCloudDb/Model/TelemetryTimeZone.cs rename to AsbCloudDb/Model/SimpleTimeZone.cs index d1074840..7d7d693e 100644 --- a/AsbCloudDb/Model/TelemetryTimeZone.cs +++ b/AsbCloudDb/Model/SimpleTimeZone.cs @@ -1,6 +1,6 @@ namespace AsbCloudDb.Model { - public class TelemetryTimeZone + public class SimpleTimezone { public double Hours { get; set; } public string TimeZoneId { get; set; } diff --git a/AsbCloudDb/Model/Telemetry.cs b/AsbCloudDb/Model/Telemetry.cs index 2f18c729..de598306 100644 --- a/AsbCloudDb/Model/Telemetry.cs +++ b/AsbCloudDb/Model/Telemetry.cs @@ -28,7 +28,7 @@ namespace AsbCloudDb.Model public TelemetryInfo Info { get; set; } [Column("timezone", TypeName = "jsonb"), Comment("Смещение часового пояса от UTC")] - public TelemetryTimeZone TelemetryTimeZone { get; set; } + public SimpleTimezone TimeZone { get; set; } [InverseProperty(nameof(Model.Well.Telemetry))] public virtual Well Well { get; set; } diff --git a/AsbCloudDb/Model/TelemetryAnalysis.cs b/AsbCloudDb/Model/TelemetryAnalysis.cs index 28d4918f..81230c30 100644 --- a/AsbCloudDb/Model/TelemetryAnalysis.cs +++ b/AsbCloudDb/Model/TelemetryAnalysis.cs @@ -71,7 +71,7 @@ namespace AsbCloudDb.Model [Column("is_pressure_lt_20"), Comment("Давление менее 20")] public bool IsPressureLt20 { get; set; } - [Column("is_pressure_gt_20"), Comment("Давоение более 20")] + [Column("is_pressure_gt_20"), Comment("Давление более 20")] public bool IsPressureGt20 { get; set; } [Column("is_hook_weight_not_changes"), Comment("Вес на крюке не меняется")] diff --git a/AsbCloudDb/Model/TelemetryDataSaub.cs b/AsbCloudDb/Model/TelemetryDataSaub.cs index be22e2e8..768952c4 100644 --- a/AsbCloudDb/Model/TelemetryDataSaub.cs +++ b/AsbCloudDb/Model/TelemetryDataSaub.cs @@ -18,7 +18,7 @@ namespace AsbCloudDb.Model public int? IdUser { get; set; } [Column("date", TypeName = "timestamp with time zone"), Comment("'2021-10-19 18:23:54+05'")] - public DateTime Date { get; set; } + public DateTimeOffset Date { get; set; } [Column("mode"), Comment("Режим САУБ")] public short? Mode { get; set; } diff --git a/AsbCloudDb/Model/TelemetryDataSpin.cs b/AsbCloudDb/Model/TelemetryDataSpin.cs index ce3c8f80..344acd2b 100644 --- a/AsbCloudDb/Model/TelemetryDataSpin.cs +++ b/AsbCloudDb/Model/TelemetryDataSpin.cs @@ -12,7 +12,7 @@ namespace AsbCloudDb.Model [Column("id_telemetry")] public int IdTelemetry { get; set; } [Column("date", TypeName = "timestamp with time zone"), Comment("'2021-10-19 18:23:54+05'")] - public DateTime Date { get; set; } + public DateTimeOffset Date { get; set; } [Column("top_drive_speed"), Comment("Скорость СВП")] public float? TopDriveSpeed { get; set; } @@ -62,13 +62,13 @@ namespace AsbCloudDb.Model public float? TopDriveTorqueSpToMax { get; set; } [Column("top_drive_torque_sp_to_offset")] public float? TopDriveTorqueSpToOffset { get; set; } - [Column("torque_starting"), Comment(" Страгивающий момент")] + [Column("torque_starting"), Comment("Страгивающий момент")] public float? TorqueStarting { get; set; } - [Column("rotor_torque_avg"), Comment(" Момент в роторе средний")] + [Column("rotor_torque_avg"), Comment("Момент в роторе средний")] public float? RotorTorqueAvg { get; set; } - [Column("encoder_resolution"), Comment(" Разрешение энкодера")] + [Column("encoder_resolution"), Comment("Разрешение энкодера")] public float? EncoderResolution { get; set; } - [Column("ratio"), Comment(" Коэффициент редукции редектора")] + [Column("ratio"), Comment(" Коэффициент редукции редуктора")] public float? Ratio { get; set; } [Column("torque_right_limit"), Comment("Ограничение крутящего момента вправо")] public float? TorqueRightLimit { get; set; } @@ -102,9 +102,9 @@ namespace AsbCloudDb.Model public float? BreakAngleK { get; set; } [Column("reverse_k_torque"), Comment("Коэффициент на который умножается момент, для того чтобы система поняла что мы движемся в обратную сторону")] public float? ReverseKTorque { get; set; } - [Column("position_zero"), Comment("Нулевая позиция осциляции")] + [Column("position_zero"), Comment("Нулевая позиция осцилляции")] public float? PositionZero { get; set; } - [Column("position_right"), Comment("Крайний правый угол осциляции")] + [Column("position_right"), Comment("Крайний правый угол осцилляции")] public float? PositionRight { get; set; } [Column("torque_ramp_time"), Comment("Время нарастания момента")] public float? TorqueRampTime { get; set; } diff --git a/AsbCloudDb/Model/TelemetryInfo.cs b/AsbCloudDb/Model/TelemetryInfo.cs index e9ef68f3..bcbabb44 100644 --- a/AsbCloudDb/Model/TelemetryInfo.cs +++ b/AsbCloudDb/Model/TelemetryInfo.cs @@ -4,7 +4,7 @@ namespace AsbCloudDb.Model { public class TelemetryInfo { - public DateTime DrillingStartDate { get; set; } + public DateTimeOffset DrillingStartDate { get; set; } public string TimeZoneId { get; set; } public double TimeZoneOffsetTotalHours { get; set; } public string Well { get; set; } diff --git a/AsbCloudDb/Model/TelemetryMessage.cs b/AsbCloudDb/Model/TelemetryMessage.cs index af1aa8b2..468d443a 100644 --- a/AsbCloudDb/Model/TelemetryMessage.cs +++ b/AsbCloudDb/Model/TelemetryMessage.cs @@ -24,7 +24,7 @@ namespace AsbCloudDb.Model public int? IdTelemetryUser { get; set; } [Column("date", TypeName = "timestamp with time zone")] - public DateTime Date { get; set; } + public DateTimeOffset Date { get; set; } [Column("well_depth")] public double WellDepth { get; set; } diff --git a/AsbCloudDb/Model/UserRole.cs b/AsbCloudDb/Model/UserRole.cs index ddefa96d..3ededd61 100644 --- a/AsbCloudDb/Model/UserRole.cs +++ b/AsbCloudDb/Model/UserRole.cs @@ -20,9 +20,8 @@ namespace AsbCloudDb.Model [Column("id_type"), Comment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя")] public int IdType { get; set; } - [Column("id_parent"), Comment("От какой роли унаследована данная роль")] - public int? IdParent { get; set; } - + [InverseProperty(nameof(RelationUserRoleUserRole.Role))] + public virtual ICollection RelationUserRoleUserRoles { get; set; } [InverseProperty(nameof(RelationUserUserRole.UserRole))] public virtual ICollection RelationUsersUserRoles { get; set; } diff --git a/AsbCloudDb/Model/Well.cs b/AsbCloudDb/Model/Well.cs index f6191ba7..45c65c17 100644 --- a/AsbCloudDb/Model/Well.cs +++ b/AsbCloudDb/Model/Well.cs @@ -37,6 +37,9 @@ namespace AsbCloudDb.Model [Column("longitude")] public double? Longitude { get; set; } + [Column("timezone", TypeName = "jsonb"), Comment("Смещение часового пояса от UTC")] + public SimpleTimezone Timezone { get; set; } + [ForeignKey(nameof(IdWellType))] [InverseProperty(nameof(Model.WellType.Wells))] public virtual WellType WellType { get; set; } diff --git a/AsbCloudDb/Model/WellOperation.cs b/AsbCloudDb/Model/WellOperation.cs index 399e06af..a01c4517 100644 --- a/AsbCloudDb/Model/WellOperation.cs +++ b/AsbCloudDb/Model/WellOperation.cs @@ -32,7 +32,7 @@ namespace AsbCloudDb.Model public double DepthEnd { get; set; } [Column("date_start", TypeName = "timestamp with time zone"), Comment("Дата начала операции")] - public DateTime DateStart { get; set; } + public DateTimeOffset DateStart { get; set; } [Column("duration_hours"), Comment("Продолжительность, часы")] public double DurationHours { get; set; } diff --git a/AsbCloudDb/Readme.md b/AsbCloudDb/Readme.md index 3523b5f2..bd7be8e3 100644 --- a/AsbCloudDb/Readme.md +++ b/AsbCloudDb/Readme.md @@ -17,10 +17,10 @@ dotnet ef migrations add --project AsbCloudDb ``` ## Откатить миграцию ``` -dotnet ef migrations remvoe --project AsbCloudDb +dotnet ef migrations remove --project AsbCloudDb ``` \ - Name of migration class. -После создания миграции обязательно прочитать сгенерированый код. +После создания миграции обязательно прочитать генерированный код. ## Применить миграции При старте проекта применяются автоматически @@ -45,7 +45,7 @@ CREATE DATABASE postgres; create schema public; ``` -### Step 2. Innit timescaledb and prepare DB to restore +### Step 2. Init timescaledb and prepare DB to restore ``` CREATE EXTENSION IF NOT EXISTS timescaledb; SELECT timescaledb_pre_restore(); @@ -54,13 +54,17 @@ SELECT timescaledb_pre_restore(); ### Step 3. Restore DB, then [Longest operation] Terminal: ``` -sudo -u postgres psql -p 5499 -U postgres postgres -W < dump_2021-11-26.bak +sudo -u postgres psql -p 5499 -U postgres postgres -W < dump_2021-11-26.bak +or +sudo -u postgres pg_restore -Fc -d postgres dump_2021-11-26.bak ``` OR psql: ``` \! pg_restore -Fc -d postgres dump_2021-11-26.bak ``` -Then 'exit resore mode' psql: +win: +pg_restore -Fc -d postgres -U postgres -W dump_2022-01-11.bak +Then 'exit restore mode' psql: ``` SELECT timescaledb_post_restore(); ``` \ No newline at end of file diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index 5a40baf6..768c3c40 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -1,11 +1,11 @@  - net5.0 + net6.0 - 1701;1702;IDE0090;IDE0063;IDE0066 + 1701;1702;IDE0090;IDE0063;IDE0066;IDE0054 @@ -23,10 +23,14 @@ - + + + + + @@ -35,16 +39,4 @@ - - - CommonLibs\AsbSaubReport.dll - - - CommonLibs\AsbSaubReportLas.dll - - - CommonLibs\AsbSaubReportPdf.dll - - - diff --git a/AsbCloudInfrastructure/CommonLibs/AsbSaubReport.deps.json b/AsbCloudInfrastructure/CommonLibs/AsbSaubReport.deps.json index 91ea443c..7242b363 100644 --- a/AsbCloudInfrastructure/CommonLibs/AsbSaubReport.deps.json +++ b/AsbCloudInfrastructure/CommonLibs/AsbSaubReport.deps.json @@ -1,11 +1,11 @@ { "runtimeTarget": { - "name": ".NETCoreApp,Version=v5.0", + "name": ".NETCoreApp,Version=v6.0", "signature": "" }, "compilationOptions": {}, "targets": { - ".NETCoreApp,Version=v5.0": { + ".NETCoreApp,Version=v6.0": { "AsbSaubReport/1.0.0": { "runtime": { "AsbSaubReport.dll": {} diff --git a/AsbCloudInfrastructure/CommonLibs/AsbSaubReport.dll b/AsbCloudInfrastructure/CommonLibs/AsbSaubReport.dll index 22e17f9a..d3910e63 100644 Binary files a/AsbCloudInfrastructure/CommonLibs/AsbSaubReport.dll and b/AsbCloudInfrastructure/CommonLibs/AsbSaubReport.dll differ diff --git a/AsbCloudInfrastructure/CommonLibs/AsbSaubReportLas.deps.json b/AsbCloudInfrastructure/CommonLibs/AsbSaubReportLas.deps.json index c0fa340e..50ba6522 100644 --- a/AsbCloudInfrastructure/CommonLibs/AsbSaubReportLas.deps.json +++ b/AsbCloudInfrastructure/CommonLibs/AsbSaubReportLas.deps.json @@ -1,11 +1,11 @@ { "runtimeTarget": { - "name": ".NETCoreApp,Version=v5.0", + "name": ".NETCoreApp,Version=v6.0", "signature": "" }, "compilationOptions": {}, "targets": { - ".NETCoreApp,Version=v5.0": { + ".NETCoreApp,Version=v6.0": { "AsbSaubReportLas/1.0.0": { "dependencies": { "AsbSaubReport": "1.0.0" diff --git a/AsbCloudInfrastructure/CommonLibs/AsbSaubReportLas.dll b/AsbCloudInfrastructure/CommonLibs/AsbSaubReportLas.dll index f5209559..c37b4902 100644 Binary files a/AsbCloudInfrastructure/CommonLibs/AsbSaubReportLas.dll and b/AsbCloudInfrastructure/CommonLibs/AsbSaubReportLas.dll differ diff --git a/AsbCloudInfrastructure/CommonLibs/AsbSaubReportPdf.deps.json b/AsbCloudInfrastructure/CommonLibs/AsbSaubReportPdf.deps.json index f1011029..cacd26cd 100644 --- a/AsbCloudInfrastructure/CommonLibs/AsbSaubReportPdf.deps.json +++ b/AsbCloudInfrastructure/CommonLibs/AsbSaubReportPdf.deps.json @@ -1,53 +1,25 @@ { "runtimeTarget": { - "name": ".NETCoreApp,Version=v5.0", + "name": ".NETCoreApp,Version=v6.0", "signature": "" }, "compilationOptions": {}, "targets": { - ".NETCoreApp,Version=v5.0": { + ".NETCoreApp,Version=v6.0": { "AsbSaubReportPdf/1.0.0": { "dependencies": { "AsbSaubReport": "1.0.0", - "itext7": "7.1.15" + "itext7": "7.2.0" }, "runtime": { "AsbSaubReportPdf.dll": {} } }, - "Common.Logging/3.4.1": { + "itext7/7.2.0": { "dependencies": { - "Common.Logging.Core": "3.4.1", - "Microsoft.CSharp": "4.0.1", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - }, - "runtime": { - "lib/netstandard1.3/Common.Logging.dll": { - "assemblyVersion": "3.4.1.0", - "fileVersion": "3.4.0.0" - } - } - }, - "Common.Logging.Core/3.4.1": { - "dependencies": { - "Microsoft.CSharp": "4.0.1" - }, - "runtime": { - "lib/netstandard1.0/Common.Logging.Core.dll": { - "assemblyVersion": "3.4.1.0", - "fileVersion": "3.4.0.0" - } - } - }, - "itext7/7.1.15": { - "dependencies": { - "Common.Logging": "3.4.1", + "Microsoft.DotNet.PlatformAbstractions": "1.1.0", "Microsoft.Extensions.DependencyModel": "1.1.0", + "Microsoft.Extensions.Logging": "5.0.0", "Portable.BouncyCastle": "1.8.9", "System.Collections.NonGeneric": "4.3.0", "System.Diagnostics.Process": "4.3.0", @@ -58,44 +30,56 @@ "System.Text.Encoding.CodePages": "4.3.0", "System.Threading.Thread": "4.3.0", "System.Threading.ThreadPool": "4.3.0", - "System.Xml.XmlDocument": "4.3.0" + "System.Xml.XmlDocument": "4.3.0", + "itext7.commons": "7.2.0" }, "runtime": { "lib/netstandard2.0/itext.barcodes.dll": { - "assemblyVersion": "7.1.15.0", - "fileVersion": "7.1.15.0" + "assemblyVersion": "7.2.0.0", + "fileVersion": "7.2.0.0" }, "lib/netstandard2.0/itext.forms.dll": { - "assemblyVersion": "7.1.15.0", - "fileVersion": "7.1.15.0" + "assemblyVersion": "7.2.0.0", + "fileVersion": "7.2.0.0" }, "lib/netstandard2.0/itext.io.dll": { - "assemblyVersion": "7.1.15.0", - "fileVersion": "7.1.15.0" + "assemblyVersion": "7.2.0.0", + "fileVersion": "7.2.0.0" }, "lib/netstandard2.0/itext.kernel.dll": { - "assemblyVersion": "7.1.15.0", - "fileVersion": "7.1.15.0" + "assemblyVersion": "7.2.0.0", + "fileVersion": "7.2.0.0" }, "lib/netstandard2.0/itext.layout.dll": { - "assemblyVersion": "7.1.15.0", - "fileVersion": "7.1.15.0" + "assemblyVersion": "7.2.0.0", + "fileVersion": "7.2.0.0" }, "lib/netstandard2.0/itext.pdfa.dll": { - "assemblyVersion": "7.1.15.0", - "fileVersion": "7.1.15.0" + "assemblyVersion": "7.2.0.0", + "fileVersion": "7.2.0.0" }, "lib/netstandard2.0/itext.sign.dll": { - "assemblyVersion": "7.1.15.0", - "fileVersion": "7.1.15.0" + "assemblyVersion": "7.2.0.0", + "fileVersion": "7.2.0.0" }, "lib/netstandard2.0/itext.styledxmlparser.dll": { - "assemblyVersion": "7.1.15.0", - "fileVersion": "7.1.15.0" + "assemblyVersion": "7.2.0.0", + "fileVersion": "7.2.0.0" }, "lib/netstandard2.0/itext.svg.dll": { - "assemblyVersion": "7.1.15.0", - "fileVersion": "7.1.15.0" + "assemblyVersion": "7.2.0.0", + "fileVersion": "7.2.0.0" + } + } + }, + "itext7.commons/7.2.0": { + "dependencies": { + "Microsoft.Extensions.Logging": "5.0.0" + }, + "runtime": { + "lib/netstandard2.0/itext.commons.dll": { + "assemblyVersion": "7.2.0.0", + "fileVersion": "7.2.0.0" } } }, @@ -137,6 +121,25 @@ } } }, + "Microsoft.Extensions.DependencyInjection/5.0.0": { + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0" + }, + "runtime": { + "lib/net5.0/Microsoft.Extensions.DependencyInjection.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": { + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, "Microsoft.Extensions.DependencyModel/1.1.0": { "dependencies": { "Microsoft.DotNet.PlatformAbstractions": "1.1.0", @@ -152,6 +155,48 @@ } } }, + "Microsoft.Extensions.Logging/5.0.0": { + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "5.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", + "Microsoft.Extensions.Logging.Abstractions": "5.0.0", + "Microsoft.Extensions.Options": "5.0.0" + }, + "runtime": { + "lib/netstandard2.1/Microsoft.Extensions.Logging.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, + "Microsoft.Extensions.Logging.Abstractions/5.0.0": { + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, + "Microsoft.Extensions.Options/5.0.0": { + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", + "Microsoft.Extensions.Primitives": "5.0.0" + }, + "runtime": { + "lib/net5.0/Microsoft.Extensions.Options.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, + "Microsoft.Extensions.Primitives/5.0.0": { + "runtime": { + "lib/netcoreapp3.0/Microsoft.Extensions.Primitives.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, "Microsoft.NETCore.Platforms/1.1.0": {}, "Microsoft.NETCore.Targets/1.1.0": {}, "Microsoft.Win32.Primitives/4.3.0": { @@ -757,26 +802,19 @@ "serviceable": false, "sha512": "" }, - "Common.Logging/3.4.1": { + "itext7/7.2.0": { "type": "package", "serviceable": true, - "sha512": "sha512-5eZ/vgEOqzLg4PypZqnJ+wMhhgHyckicbZY4iDxqQ4FtOz0CpdYZ0xQ78aszMzeAJZiLLb5VdR9tPfunVQLz6g==", - "path": "common.logging/3.4.1", - "hashPath": "common.logging.3.4.1.nupkg.sha512" + "sha512": "sha512-1MkQiUY0pCevnKWrY/le7BiW/oV/9CLwB2jGD6xfs0tepE5eU5BTSlabgYq7oWZP8OB7KXoGySMqP+Ugj6MeOA==", + "path": "itext7/7.2.0", + "hashPath": "itext7.7.2.0.nupkg.sha512" }, - "Common.Logging.Core/3.4.1": { + "itext7.commons/7.2.0": { "type": "package", "serviceable": true, - "sha512": "sha512-wLHldZHvxsSD6Ahonfj00/SkfHfKqO+YT6jsUwVm8Rch1REL9IArHAcSLXxYxYfu5/4ydGtmXvOtaH3AkVPu0A==", - "path": "common.logging.core/3.4.1", - "hashPath": "common.logging.core.3.4.1.nupkg.sha512" - }, - "itext7/7.1.15": { - "type": "package", - "serviceable": true, - "sha512": "sha512-BJKdScf6C7LlHB5pV5fr0qHGbrPLX1yl+1R1qHroRZxtyTVFMeZ9gPV6IOsmgTRLr2ee9hUXHbb8/ZqKB4pqiA==", - "path": "itext7/7.1.15", - "hashPath": "itext7.7.1.15.nupkg.sha512" + "sha512": "sha512-bfysIirFpBOTc/mSfElJMOy9D/I2LTLeL0uae7xNgV4Vv7P2HF2n2/CJRTe9iZFsL3r8JdH0hd+eusnt0BjA8w==", + "path": "itext7.commons/7.2.0", + "hashPath": "itext7.commons.7.2.0.nupkg.sha512" }, "Microsoft.CSharp/4.0.1": { "type": "package", @@ -792,6 +830,20 @@ "path": "microsoft.dotnet.platformabstractions/1.1.0", "hashPath": "microsoft.dotnet.platformabstractions.1.1.0.nupkg.sha512" }, + "Microsoft.Extensions.DependencyInjection/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Rc2kb/p3Ze6cP6rhFC3PJRdWGbLvSHZc0ev7YlyeU6FmHciDMLrhoVoTUEzKPhN5ZjFgKF1Cf5fOz8mCMIkvpA==", + "path": "microsoft.extensions.dependencyinjection/5.0.0", + "hashPath": "microsoft.extensions.dependencyinjection.5.0.0.nupkg.sha512" + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ORj7Zh81gC69TyvmcUm9tSzytcy8AVousi+IVRAI8nLieQjOFryRusSFh7+aLk16FN9pQNqJAiMd7BTKINK0kA==", + "path": "microsoft.extensions.dependencyinjection.abstractions/5.0.0", + "hashPath": "microsoft.extensions.dependencyinjection.abstractions.5.0.0.nupkg.sha512" + }, "Microsoft.Extensions.DependencyModel/1.1.0": { "type": "package", "serviceable": true, @@ -799,6 +851,34 @@ "path": "microsoft.extensions.dependencymodel/1.1.0", "hashPath": "microsoft.extensions.dependencymodel.1.1.0.nupkg.sha512" }, + "Microsoft.Extensions.Logging/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-MgOwK6tPzB6YNH21wssJcw/2MKwee8b2gI7SllYfn6rvTpIrVvVS5HAjSU2vqSku1fwqRvWP0MdIi14qjd93Aw==", + "path": "microsoft.extensions.logging/5.0.0", + "hashPath": "microsoft.extensions.logging.5.0.0.nupkg.sha512" + }, + "Microsoft.Extensions.Logging.Abstractions/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-NxP6ahFcBnnSfwNBi2KH2Oz8Xl5Sm2krjId/jRR3I7teFphwiUoUeZPwTNA21EX+5PtjqmyAvKaOeBXcJjcH/w==", + "path": "microsoft.extensions.logging.abstractions/5.0.0", + "hashPath": "microsoft.extensions.logging.abstractions.5.0.0.nupkg.sha512" + }, + "Microsoft.Extensions.Options/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-CBvR92TCJ5uBIdd9/HzDSrxYak+0W/3+yxrNg8Qm6Bmrkh5L+nu6m3WeazQehcZ5q1/6dDA7J5YdQjim0165zg==", + "path": "microsoft.extensions.options/5.0.0", + "hashPath": "microsoft.extensions.options.5.0.0.nupkg.sha512" + }, + "Microsoft.Extensions.Primitives/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-cI/VWn9G1fghXrNDagX9nYaaB/nokkZn0HYAawGaELQrl8InSezfe9OnfPZLcJq3esXxygh3hkq2c3qoV3SDyQ==", + "path": "microsoft.extensions.primitives/5.0.0", + "hashPath": "microsoft.extensions.primitives.5.0.0.nupkg.sha512" + }, "Microsoft.NETCore.Platforms/1.1.0": { "type": "package", "serviceable": true, @@ -830,7 +910,7 @@ "Newtonsoft.Json/9.0.1": { "type": "package", "serviceable": true, - "sha512": "sha512-U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "sha512": "sha512-2okXpTRwUcgQb06put5LwwCjtgoFo74zkPksjcvOpnIjx7TagGW5IoBCAA4luZx1+tfiIhoNqoiI7Y7zwWGyKA==", "path": "newtonsoft.json/9.0.1", "hashPath": "newtonsoft.json.9.0.1.nupkg.sha512" }, @@ -1145,7 +1225,7 @@ "System.Runtime.InteropServices.RuntimeInformation/4.0.0": { "type": "package", "serviceable": true, - "sha512": "sha512-hWPhJxc453RCa8Z29O91EmfGeZIHX1ZH2A8L6lYQVSaKzku2DfArSfMEb1/MYYzPQRJZeu0c9dmYeJKxW5Fgng==", + "sha512": "sha512-Ri015my90h3AB/BsbvEpq1foEPoPBBa9L8b7fu1VE4eA1NMeMe5iZ6guLjoWB+XGQr1u/rEwtXobqofjFBsAgA==", "path": "system.runtime.interopservices.runtimeinformation/4.0.0", "hashPath": "system.runtime.interopservices.runtimeinformation.4.0.0.nupkg.sha512" }, diff --git a/AsbCloudInfrastructure/CommonLibs/AsbSaubReportPdf.dll b/AsbCloudInfrastructure/CommonLibs/AsbSaubReportPdf.dll index ce32a3d4..15988963 100644 Binary files a/AsbCloudInfrastructure/CommonLibs/AsbSaubReportPdf.dll and b/AsbCloudInfrastructure/CommonLibs/AsbSaubReportPdf.dll differ diff --git a/AsbCloudInfrastructure/CommonLibs/ref/AsbSaubReportLas.dll b/AsbCloudInfrastructure/CommonLibs/ref/AsbSaubReportLas.dll index 5f40dc30..0a7a5b00 100644 Binary files a/AsbCloudInfrastructure/CommonLibs/ref/AsbSaubReportLas.dll and b/AsbCloudInfrastructure/CommonLibs/ref/AsbSaubReportLas.dll differ diff --git a/AsbCloudInfrastructure/CommonLibs/ref/AsbSaubReportPdf.dll b/AsbCloudInfrastructure/CommonLibs/ref/AsbSaubReportPdf.dll index ac44aab6..36d4e2d2 100644 Binary files a/AsbCloudInfrastructure/CommonLibs/ref/AsbSaubReportPdf.dll and b/AsbCloudInfrastructure/CommonLibs/ref/AsbSaubReportPdf.dll differ diff --git a/AsbCloudInfrastructure/DateTimeExtentions.cs b/AsbCloudInfrastructure/DateTimeExtentions.cs new file mode 100644 index 00000000..5c562399 --- /dev/null +++ b/AsbCloudInfrastructure/DateTimeExtentions.cs @@ -0,0 +1,29 @@ +using System; + +namespace AsbCloudInfrastructure +{ + public static class DateTimeExtentions + { + public static DateTimeOffset ToUtcDateTimeOffset(this DateTime date, double remoteTimezoneOffsetHours) + { + if (date == default) + return new DateTimeOffset(); + + var dateUtc = date.Kind switch + { + DateTimeKind.Local => date.ToUniversalTime(), + DateTimeKind.Unspecified => DateTime.SpecifyKind(date.AddHours(-remoteTimezoneOffsetHours), DateTimeKind.Utc), + _ => date, + }; + return new DateTimeOffset( dateUtc); + } + + public static DateTime ToRemoteDateTime(this DateTimeOffset date, double remoteTimezoneOffsetHours) + { + if (date == default) + return new DateTime(0, DateTimeKind.Unspecified); + var dateTz = date.ToOffset(TimeSpan.FromHours(remoteTimezoneOffsetHours)); + return dateTz.DateTime; + } + } +} diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index b130c78b..d32253bf 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -6,6 +6,7 @@ using AsbCloudInfrastructure.Services.Analysis; using AsbCloudInfrastructure.Services.Cache; using AsbCloudInfrastructure.Services.WellOperationService; using AsbCloudInfrastructure.Validators; +using Mapster; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -26,8 +27,21 @@ namespace AsbCloudInfrastructure return context; } + public static void MapsterSetup() + { + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .MapWith((source) => source.DateTime); + + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .MapWith((source) => source == default ? new DateTime(0, DateTimeKind.Utc) : source); + + } + public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration) { + MapsterSetup(); services.AddDbContext(options => options.UseNpgsql(configuration.GetConnectionString("DefaultConnection"))); @@ -59,7 +73,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -68,11 +82,12 @@ namespace AsbCloudInfrastructure services.AddTransient(); // admin crud services: - services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); // может быть включен в сервис TelemetryService services.AddTransient, DrillParamsService>(); - services.AddTransient, CrudServiceBase>(); - services.AddTransient, CrudServiceBase>(); - services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudCacheServiceBase>(); + services.AddTransient, CrudCacheServiceBase>(); + services.AddTransient, CrudCacheServiceBase>(); + services.AddTransient, CrudCacheServiceBase>(); // может быть включен в сервис ClusterService services.AddTransient, CrudCacheServiceBase>(); // TelemetryData services diff --git a/AsbCloudInfrastructure/ReportDataSourcePgCloud.cs b/AsbCloudInfrastructure/ReportDataSourcePgCloud.cs index 8f5bff6b..f428d4eb 100644 --- a/AsbCloudInfrastructure/ReportDataSourcePgCloud.cs +++ b/AsbCloudInfrastructure/ReportDataSourcePgCloud.cs @@ -16,6 +16,7 @@ namespace AsbCloudInfrastructure private readonly Dictionary events; private readonly Dictionary users; + private readonly double timezoneOffset; private readonly Dictionary categories = new Dictionary { {1, "Авария"}, @@ -26,6 +27,7 @@ namespace AsbCloudInfrastructure public ReportDataSourcePgCloud(AsbCloudDbContext context, int idWell) { this.context = context; + var well = context.Wells .Include(w => w.Cluster) .ThenInclude(c => c.Deposit) @@ -46,15 +48,17 @@ namespace AsbCloudInfrastructure .Where(u => u.IdTelemetry == idTelemetry) .ToDictionary(u => u.IdUser, u => u); + timezoneOffset = well?.Telemetry?.Info?.TimeZoneOffsetTotalHours ?? well.Timezone?.Hours ?? 5.0; + info = new WellInfoReport { - Deposit = well?.Cluster?.Deposit?.Caption, - Cluster = well?.Cluster?.Caption, - Well = well?.Caption, - Customer = well?.RelationCompaniesWells.FirstOrDefault(c => c.Company.IdCompanyType == 1)?.Company.Caption, - DrillingStartDate = well?.Telemetry?.Info?.DrillingStartDate ?? default, - TimeZoneId = well?.Telemetry?.Info?.TimeZoneId ?? default, - TimeZoneOffsetTotalHours = well?.Telemetry?.Info?.TimeZoneOffsetTotalHours ?? default, + Deposit = well.Cluster?.Deposit?.Caption, + Cluster = well.Cluster?.Caption, + Well = well.Caption, + Customer = well.RelationCompaniesWells.FirstOrDefault(c => c.Company.IdCompanyType == 1)?.Company.Caption, + DrillingStartDate = well.Telemetry?.Info?.DrillingStartDate.ToRemoteDateTime(timezoneOffset) ?? default, + TimeZoneId = well.Telemetry?.Info?.TimeZoneId ?? well.Timezone?.TimeZoneId ?? default, + TimeZoneOffsetTotalHours = timezoneOffset, }; } @@ -74,8 +78,8 @@ namespace AsbCloudInfrastructure var result = new AnalyzeResult { - MinDate = dataStat?.min ?? messagesStat?.min ?? default, - MaxDate = dataStat?.max ?? messagesStat?.max ?? default, + MinDate = dataStat?.min.UtcDateTime ?? messagesStat?.min.UtcDateTime ?? default, + MaxDate = dataStat?.max.UtcDateTime ?? messagesStat?.max.UtcDateTime ?? default, MessagesCount = messagesStat?.count ?? 0, }; @@ -83,57 +87,67 @@ namespace AsbCloudInfrastructure } public IQueryable GetDataSaubItems(DateTime begin, DateTime end) - => from item in context.TelemetryDataSaub - where item.IdTelemetry == idTelemetry - && item.Date >= begin - && item.Date <= end - orderby item.Date - select new DataSaubReport - { - //Id = item.Id, - Date = item.Date, - Mode = item.Mode, - WellDepth = item.WellDepth, - BitDepth = item.BitDepth, - BlockPosition = item.BlockPosition, - BlockSpeed = item.BlockSpeed, - BlockSpeedSp = item.BlockSpeedSp, - BlockSpeedSpDevelop = item.BlockSpeedSpDevelop, - Pressure = item.Pressure, - PressureSp = item.PressureSp, - AxialLoad = item.AxialLoad, - AxialLoadSp = item.AxialLoadSp, - AxialLoadLimitMax = item.AxialLoadLimitMax, - HookWeight = item.HookWeight, - RotorTorque = item.RotorTorque, - RotorTorqueSp = item.RotorTorqueSp, - RotorSpeed = item.RotorSpeed, - Flow = item.Flow, - PressureSpDevelop = item.PressureSpDevelop, - }; + { + var beginUtc = begin.ToUtcDateTimeOffset(timezoneOffset); + var endUtc = end.ToUtcDateTimeOffset(timezoneOffset); + + var query = context.TelemetryDataSaub + .Where(d => d.IdTelemetry == idTelemetry + && d.Date >= beginUtc + && d.Date <= endUtc) + .OrderBy(d => d.Date) + .Select(d => new DataSaubReport { + Date = d.Date.DateTime.AddHours(timezoneOffset), + Mode = d.Mode, + WellDepth = d.WellDepth, + BitDepth = d.BitDepth, + BlockPosition = d.BlockPosition, + BlockSpeed = d.BlockSpeed, + BlockSpeedSp = d.BlockSpeedSp, + BlockSpeedSpDevelop = d.BlockSpeedSpDevelop, + Pressure = d.Pressure, + PressureSp = d.PressureSp, + AxialLoad = d.AxialLoad, + AxialLoadSp = d.AxialLoadSp, + AxialLoadLimitMax = d.AxialLoadLimitMax, + HookWeight = d.HookWeight, + RotorTorque = d.RotorTorque, + RotorTorqueSp = d.RotorTorqueSp, + RotorSpeed = d.RotorSpeed, + Flow = d.Flow, + PressureSpDevelop = d.PressureSpDevelop, + }); + return query; + } public IQueryable GetMessages(DateTime begin, DateTime end) - => from item in context.TelemetryMessages - where item.IdTelemetry == idTelemetry - && item.Date >= begin - && item.Date <= end - orderby item.Date - select new MessageReport - { - Id = item.Id, - Date = item.Date, - Category = events.GetValueOrDefault(item.IdEvent) == null - ? $"" - : categories[events[item.IdEvent].IdCategory], - User = item.IdTelemetryUser == null - ? "" - : users.GetValueOrDefault((int)item.IdTelemetryUser) == null - ? $"User id{item.IdTelemetryUser}" - : users[(int)item.IdTelemetryUser].MakeDisplayName(), - Text = events.GetValueOrDefault(item.IdEvent) == null - ? $"Стбытие {item.IdEvent} {item.Arg0} {item.Arg1} {item.Arg2} {item.Arg3}" - : events[item.IdEvent].MakeMessageText(item) - }; + { + var beginUtc = begin.ToUtcDateTimeOffset(timezoneOffset); + var endUtc = end.ToUtcDateTimeOffset(timezoneOffset); + + var query = from item in context.TelemetryMessages + where item.IdTelemetry == idTelemetry + && item.Date >= beginUtc + && item.Date <= endUtc + orderby item.Date + select new MessageReport + { + Id = item.Id, + Date = item.Date.DateTime, + Category = events.GetValueOrDefault(item.IdEvent) == null + ? $"" + : categories[events[item.IdEvent].IdCategory], + User = item.IdTelemetryUser == null + ? "" + : users.GetValueOrDefault((int)item.IdTelemetryUser) == null + ? $"User id{item.IdTelemetryUser}" + : users[(int)item.IdTelemetryUser].MakeDisplayName(), + Text = events.GetValueOrDefault(item.IdEvent) == null + ? $"Событие {item.IdEvent} {item.Arg0} {item.Arg1} {item.Arg2} {item.Arg3}" + : events[item.IdEvent].MakeMessageText(item) + }; + return query; + } public WellInfoReport GetWellInfo() => info; diff --git a/AsbCloudInfrastructure/Services/Analysis/DataSaubAnalyse.cs b/AsbCloudInfrastructure/Services/Analysis/DataSaubAnalyse.cs index 1e45fccc..ff8d1119 100644 --- a/AsbCloudInfrastructure/Services/Analysis/DataSaubAnalyse.cs +++ b/AsbCloudInfrastructure/Services/Analysis/DataSaubAnalyse.cs @@ -5,7 +5,7 @@ namespace AsbCloudInfrastructure.Services.Analysis class DataSaubAnalyse { public int IdTelemetry { get; internal set; } - public DateTime Date { get; internal set; } + public DateTimeOffset Date { get; internal set; } public double WellDepth { get; internal set; } public double BitDepth { get; internal set; } public double BlockPosition { get; internal set; } diff --git a/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsBackgroundService.cs b/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsBackgroundService.cs index 43bb80f0..bb4452fe 100644 --- a/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsBackgroundService.cs @@ -40,8 +40,8 @@ namespace AsbCloudInfrastructure.Services.Analysis try { using var context = new AsbCloudDbContext(options); - var timeZoneService = new TimeZoneService(); - var telemetryService = new TelemetryService(context, telemetryTracker, timeZoneService, 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 16810da1..c875656a 100644 --- a/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsService.cs +++ b/AsbCloudInfrastructure/Services/Analysis/TelemetryAnalyticsService.cs @@ -33,13 +33,14 @@ namespace AsbCloudInfrastructure.Services.Analysis public async Task> GetWellDepthToDayAsync(int idWell, CancellationToken token = default) { - var telemetryId = telemetryService.GetIdTelemetryByIdWell(idWell); + var idTelemetry = telemetryService.GetIdTelemetryByIdWell(idWell); - if (telemetryId is null) + if (idTelemetry is null) return null; + var timezone = telemetryService.GetTimezone((int)idTelemetry); var depthToTimeData = (from d in db.TelemetryDataSaub - where d.IdTelemetry == telemetryId + where d.IdTelemetry == idTelemetry select new { d.WellDepth, @@ -56,7 +57,7 @@ namespace AsbCloudInfrastructure.Services.Analysis { WellDepth = d.WellDepth ?? 0.0, BitDepth = d.BitDepth ?? 0.0, - Date = d.Date + Date = d.Date.ToRemoteDateTime(timezone.Hours), }).AsNoTracking().ToListAsync(token).ConfigureAwait(false); } @@ -70,11 +71,11 @@ namespace AsbCloudInfrastructure.Services.Analysis if (telemetryId is null) return null; - var timezoneOffset = telemetryService.GetTimezoneOffsetByTelemetryId((int)telemetryId); + var timezone = telemetryService.GetTimezone((int)telemetryId); var drillingPeriodsInfo = await db.TelemetryDataSaub .Where(t => t.IdTelemetry == telemetryId) - .GroupBy(t => Math.Floor((((t.Date.DayOfYear * 24 + t.Date.Hour) * 60 + t.Date.Minute) * 60 + t.Date.Second + timezoneOffset - shiftStartSec) / intervalSeconds)) + .GroupBy(t => Math.Floor((((t.Date.DayOfYear * 24 + t.Date.Hour) * 60 + t.Date.Minute) * 60 + t.Date.Second + timezone.Hours - shiftStartSec) / intervalSeconds)) .Select(g => new { WellDepthMin = g.Min(t => t.WellDepth), WellDepthMax = g.Max(t => t.WellDepth), @@ -86,7 +87,7 @@ namespace AsbCloudInfrastructure.Services.Analysis var wellDepthToIntervalData = drillingPeriodsInfo.Select(d => new WellDepthToIntervalDto { - IntervalStartDate = d.DateMin, + IntervalStartDate = d.DateMin.ToRemoteDateTime(timezone.Hours), IntervalDepthProgress = (d.WellDepthMax - d.WellDepthMin) ?? 0.0 // / (d.DateMax - d.DateMin).TotalHours, }).OrderBy(d => d.IntervalStartDate).ToList(); @@ -201,7 +202,7 @@ namespace AsbCloudInfrastructure.Services.Analysis if (telemetryId is null) return null; - var timezoneOffset = telemetryService.GetTimezoneOffsetByTelemetryId((int)telemetryId); + var timezone = telemetryService.GetTimezone((int)telemetryId); // Get'n'Group all operations only by start date and by name (if there were several operations in interval). // Without dividing these operations duration by given interval @@ -210,7 +211,7 @@ namespace AsbCloudInfrastructure.Services.Analysis join o in db.WellOperationCategories on a.IdOperation equals o.Id group a by new { - Interval = Math.Floor((a.UnixDate - workBeginSeconds + timezoneOffset) / intervalSeconds), + Interval = Math.Floor((a.UnixDate - workBeginSeconds + timezone.Hours) / intervalSeconds), o.Name } into g select new @@ -223,17 +224,15 @@ namespace AsbCloudInfrastructure.Services.Analysis .ToListAsync(token) .ConfigureAwait(false); - var groupedOperationsList = new List(); - if (operations is not null && operations.Any()) { var operations = ops.Select(o => (o.IntervalStart, o.OperationName, o.OperationDuration)); var splittedOperationsByInterval = DivideOperationsByIntervalLength(operations, intervalSeconds); // divides good - groupedOperationsList = UniteOperationsInDto(splittedOperationsByInterval, intervalSeconds).ToList(); // unites not good + groupedOperationsList = UniteOperationsInDto(splittedOperationsByInterval, intervalSeconds, timezone.Hours).ToList(); // unites not good } return groupedOperationsList; @@ -251,7 +250,7 @@ namespace AsbCloudInfrastructure.Services.Analysis } } - private async Task AnalyseAndSaveTelemetryAsync(int idTelemetry, DateTime analyzeStartDate, CancellationToken token = default) + private async Task AnalyseAndSaveTelemetryAsync(int idTelemetry, DateTimeOffset analyzeStartDate, CancellationToken token = default) { const int step = 10; const int take = step * 2; @@ -300,16 +299,17 @@ namespace AsbCloudInfrastructure.Services.Analysis } } - public async Task GetOperationsDateRangeAsync(int idWell, bool isUtc, - CancellationToken token = default) + public async Task GetOperationsDateRangeAsync(int idWell, CancellationToken token = default) { - var telemetryId = telemetryService.GetIdTelemetryByIdWell(idWell); + var idTelemetry = telemetryService.GetIdTelemetryByIdWell(idWell); - if (telemetryId is null) + if (idTelemetry is null) return null; + var timezone = telemetryService.GetTimezone((int)idTelemetry); + var datesRange = await (from d in db.TelemetryAnalysis - where d.IdTelemetry == telemetryId + where d.IdTelemetry == idTelemetry select d.UnixDate).DefaultIfEmpty() .GroupBy(g => true) .AsNoTracking() @@ -323,18 +323,12 @@ namespace AsbCloudInfrastructure.Services.Analysis var result = new DatesRangeDto { - From = DateTimeOffset.FromUnixTimeSeconds(datesRange.From).DateTime, - To = datesRange.To == default + From = DateTimeOffset.FromUnixTimeSeconds(datesRange.From).ToRemoteDateTime(timezone.Hours), + To = (datesRange.To == default ? DateTime.MaxValue - : DateTimeOffset.FromUnixTimeSeconds(datesRange.To).DateTime + : DateTimeOffset.FromUnixTimeSeconds(datesRange.To)).ToRemoteDateTime(timezone.Hours), }; - if (isUtc) - return result; - - result = await telemetryService.DatesRangeToTelemetryTimeZoneAsync((int)telemetryId, result, token) - .ConfigureAwait(false); - return result; } @@ -347,7 +341,7 @@ namespace AsbCloudInfrastructure.Services.Analysis .LastOrDefaultAsync(token) .ConfigureAwait(false); - DateTime lastAnalysisDate = default; + DateTime lastAnalysisDate = new DateTime(0, DateTimeKind.Utc); if(lastAnalysisInDb is not null) lastAnalysisDate = DateTime.UnixEpoch.AddSeconds(lastAnalysisInDb.DurationSec + lastAnalysisInDb.UnixDate); @@ -355,7 +349,7 @@ namespace AsbCloudInfrastructure.Services.Analysis return lastAnalysisDate; } - private Task> GetDataSaubPartOrDefaultAsync(int idTelemetry, DateTime analyzeStartDate, CancellationToken token) => + private Task> GetDataSaubPartOrDefaultAsync(int idTelemetry, DateTimeOffset analyzeStartDate, CancellationToken token) => db.TelemetryDataSaub .Where(d => d.IdTelemetry == idTelemetry && @@ -396,7 +390,7 @@ namespace AsbCloudInfrastructure.Services.Analysis operationDurationTimeCounter += OperationDuration; } else - { // if operation duration overflows current interval it shoud be divided into 2 or more parts for this and next intervals + { // if operation duration overflows current interval it should be divided into 2 or more parts for this and next intervals var remainingIntervalTime = intervalSeconds - operationDurationTimeCounter; splittedOperationsByInterval.Add((IntervalStart, OperationName, remainingIntervalTime)); // first part of long operation @@ -432,13 +426,14 @@ namespace AsbCloudInfrastructure.Services.Analysis } private static IEnumerable UniteOperationsInDto( - IEnumerable<(long IntervalStart, string OperationName, int OperationDuration)> operations, int intervalSeconds) + IEnumerable<(long IntervalStart, string OperationName, int OperationDuration)> operations, int intervalSeconds, double timezoneOffset) { var groupedOperationsList = new List(); var groupedOperationsObj = new TelemetryOperationInfoDto { - IntervalBegin = DateTimeOffset.FromUnixTimeSeconds(operations.First().IntervalStart), + IntervalBegin = DateTimeOffset.FromUnixTimeSeconds(operations.First().IntervalStart) + .ToRemoteDateTime(timezoneOffset), Operations = new List() }; @@ -461,7 +456,8 @@ namespace AsbCloudInfrastructure.Services.Analysis intervalEndDate = IntervalStart + intervalSeconds; groupedOperationsObj = new TelemetryOperationInfoDto { - IntervalBegin = DateTimeOffset.FromUnixTimeSeconds(IntervalStart), + IntervalBegin = DateTimeOffset.FromUnixTimeSeconds(IntervalStart) + .ToRemoteDateTime(timezoneOffset), Operations = new List() }; diff --git a/AsbCloudInfrastructure/Services/AuthService.cs b/AsbCloudInfrastructure/Services/AuthService.cs index e39a1757..6b37716f 100644 --- a/AsbCloudInfrastructure/Services/AuthService.cs +++ b/AsbCloudInfrastructure/Services/AuthService.cs @@ -5,15 +5,14 @@ using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; -using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Security.Cryptography; using System.Text; using System.Threading; using System.Threading.Tasks; -using AsbCloudInfrastructure.Services.Cache; using Mapster; +using System.IdentityModel.Tokens.Jwt; namespace AsbCloudInfrastructure.Services { diff --git a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs index b1932283..a0170e17 100644 --- a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs +++ b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs @@ -309,7 +309,7 @@ namespace AsbCloudInfrastructure.Services.Cache { foreach (var entity in entities) { - if (dbSet.Contains(entity)) // TODO: это очень ммедленно + if (dbSet.Contains(entity)) // TODO: это очень медленно dbSet.Update(entity); else dbSet.Add(entity); diff --git a/AsbCloudInfrastructure/Services/ClusterService.cs b/AsbCloudInfrastructure/Services/ClusterService.cs index e22eed2c..7f73525d 100644 --- a/AsbCloudInfrastructure/Services/ClusterService.cs +++ b/AsbCloudInfrastructure/Services/ClusterService.cs @@ -148,7 +148,7 @@ namespace AsbCloudInfrastructure.Services Wells = gCluster.Select(well => { var dto = well.Adapt(); dto.WellType = well.WellType?.Caption; - dto.LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id); + dto.LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id).DateTime; dto.Cluster = gCluster.Key.Caption; dto.Deposit = gDeposit.Key.Caption; return dto; diff --git a/AsbCloudInfrastructure/Services/DrillFlowChartService.cs b/AsbCloudInfrastructure/Services/DrillFlowChartService.cs index 6164038d..365942f9 100644 --- a/AsbCloudInfrastructure/Services/DrillFlowChartService.cs +++ b/AsbCloudInfrastructure/Services/DrillFlowChartService.cs @@ -15,36 +15,42 @@ namespace AsbCloudInfrastructure.Services IDrillFlowChartService { private readonly IAsbCloudDbContext db; + private readonly IWellService wellService; - public DrillFlowChartService(IAsbCloudDbContext context) + public DrillFlowChartService(IAsbCloudDbContext context, IWellService wellService) : base(context) { this.db = context; + this.wellService = wellService; } public async Task> GetAllAsync(int idWell, DateTime updateFrom, CancellationToken token = default) { + var timezone = wellService.GetTimezone(idWell); + var updateFromUtc = updateFrom.ToUtcDateTimeOffset(timezone.Hours); var entities = await (from p in db.DrillFlowChart where p.IdWell == idWell && - p.LastUpdate > updateFrom + p.LastUpdate > updateFromUtc orderby p.DepthStart, p.Id select p) .ToListAsync(token) .ConfigureAwait(false); - var dto = entities.Adapt(); - return dto; + var dtos = entities.Select(entity => { + var dto = entity.Adapt(); + dto.LastUpdate = entity.LastUpdate.ToRemoteDateTime(timezone.Hours); + return dto; + }); + return dtos; } public async Task InsertAsync(int idWell, DrillFlowChartDto dto, CancellationToken token = default) { dto.IdWell = idWell; - dto.LastUpdate = DateTime.Now; - + dto.LastUpdate = DateTime.UtcNow; var result = await base.InsertAsync(dto, token).ConfigureAwait(false); - return result; } @@ -54,7 +60,7 @@ namespace AsbCloudInfrastructure.Services foreach (var dto in dtos) { dto.IdWell = idWell; - dto.LastUpdate = DateTime.Now; + dto.LastUpdate = DateTime.UtcNow; } var result = await base.InsertRangeAsync(dtos, token).ConfigureAwait(false); diff --git a/AsbCloudInfrastructure/Services/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgramService.cs index c22c9f7c..dd0bc4f1 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgramService.cs @@ -164,7 +164,7 @@ namespace AsbCloudInfrastructure.Services newSheetName = sheetSrc.Name; suffix = $"_{index++}"; if (newSheetName.Length + suffix.Length >= 31) - newSheetName = newSheetName.Substring(0, (31 - suffix.Length)); + newSheetName = newSheetName[..(31 - suffix.Length)]; newSheetName += suffix; } diff --git a/AsbCloudInfrastructure/Services/FileService.cs b/AsbCloudInfrastructure/Services/FileService.cs index 6c02152f..d82ac230 100644 --- a/AsbCloudInfrastructure/Services/FileService.cs +++ b/AsbCloudInfrastructure/Services/FileService.cs @@ -28,7 +28,8 @@ namespace AsbCloudInfrastructure.Services .ThenInclude(u => u.Company) .ThenInclude(c => c.CompanyType) .Include(f => f.FileMarks) - .ThenInclude(m => m.User); + .ThenInclude(m => m.User) + .Include(f=>f.Well); } public async Task GetSharedUrlAsync(int idFileInfo, int idUser, IFileShareService fileShareService, @@ -75,7 +76,7 @@ namespace AsbCloudInfrastructure.Services IdAuthor = idUser, IdCategory = idCategory, Name = destinationFileName, - UploadDate = DateTime.Now, + UploadDate = DateTime.UtcNow, IsDeleted = false, Size = sysFileInfo.Length, }; @@ -87,8 +88,7 @@ namespace AsbCloudInfrastructure.Services Directory.CreateDirectory(Path.GetDirectoryName(filePath)); File.Move(srcFilePath, filePath); - var dto = entry.Entity.Adapt(); - return dto; + return await GetInfoAsync(entry.Entity.Id, token); } public async Task SaveAsync(int idWell, int? idUser, int idCategory, @@ -101,7 +101,7 @@ namespace AsbCloudInfrastructure.Services IdAuthor = idUser, IdCategory = idCategory, Name = Path.GetFileName(fileFullName), - UploadDate = DateTime.Now, + UploadDate = DateTime.UtcNow, IsDeleted = false, Size = fileStream?.Length ?? 0 }; @@ -116,9 +116,8 @@ namespace AsbCloudInfrastructure.Services using var newfileStream = new FileStream(filePath, FileMode.Create); await fileStream.CopyToAsync(newfileStream, token).ConfigureAwait(false); - - var dto = entry.Entity.Adapt(); - return dto; + + return await GetInfoAsync(entry.Entity.Id, token); } private string MakeFilePath(int idWell, int idCategory, string fileFullName, int fileId) @@ -136,7 +135,7 @@ namespace AsbCloudInfrastructure.Services .ToListAsync(token) .ConfigureAwait(false); - var dtos = entities.Adapt(); + var dtos = entities.Select(e => Convert(e)); return dtos; } @@ -157,11 +156,28 @@ namespace AsbCloudInfrastructure.Services if (!string.IsNullOrEmpty(fileName)) query = query.Where(e => e.Name.ToLower().Contains(fileName.ToLower())); + var firstFile = await query.FirstOrDefaultAsync(token); + if (firstFile is null) + return new PaginationContainer() + { + Skip = skip, + Take = take, + Count = 0, + }; + + var timezoneOffset = firstFile.Well.Timezone?.Hours ?? 5; + if (begin != default) - query = query.Where(e => e.UploadDate >= begin); + { + var beginUtc = begin.ToUtcDateTimeOffset(timezoneOffset); + query = query.Where(e => e.UploadDate >= beginUtc); + } if (end != default) - query = query.Where(e => e.UploadDate <= end); + { + var endUtc = end.ToUtcDateTimeOffset(timezoneOffset); + query = query.Where(e => e.UploadDate <= endUtc); + } var count = await query.CountAsync(token).ConfigureAwait(false); @@ -185,8 +201,7 @@ namespace AsbCloudInfrastructure.Services .Take(take).AsNoTracking().ToListAsync(token) .ConfigureAwait(false); - var dtos = entities.Adapt(); - + var dtos = entities.Select(e => Convert(e, timezoneOffset)); result.Items.AddRange(dtos); return result; } @@ -202,7 +217,7 @@ namespace AsbCloudInfrastructure.Services if (entity is null) return null; - var dto = entity.Adapt(); + var dto = Convert(entity); return dto; } @@ -259,10 +274,29 @@ namespace AsbCloudInfrastructure.Services var entity = await dbSetConfigured .FirstOrDefaultAsync(f => f.FileMarks.Any(m => m.Id == idMark), token) .ConfigureAwait(false); - var dto = entity.Adapt(); + + FileInfoDto dto = Convert(entity); return dto; } + private static FileInfoDto Convert(AsbCloudDb.Model.FileInfo entity) + { + var timezoneOffset = entity.Well.Timezone?.Hours ?? 5; + return Convert(entity, timezoneOffset); + } + + private static FileInfoDto Convert(AsbCloudDb.Model.FileInfo entity, double timezoneOffset) + { + var dto = entity.Adapt(); + dto.UploadDate = entity.UploadDate.ToRemoteDateTime(timezoneOffset); + dto.FileMarks = entity.FileMarks.Select(m => + { + var mark = m.Adapt(); + mark.DateCreated = m.DateCreated.ToRemoteDateTime(timezoneOffset); + return mark; + }); + return dto; + } public async Task CreateFileMarkAsync(FileMarkDto fileMarkDto, int idUser, CancellationToken token) { var fileMark = await db.FileMarks @@ -278,7 +312,7 @@ namespace AsbCloudInfrastructure.Services var newFileMark = fileMarkDto.Adapt(); newFileMark.Id = default; - newFileMark.DateCreated = DateTime.Now; + newFileMark.DateCreated = DateTime.UtcNow; newFileMark.IdUser = idUser; db.FileMarks.Add(newFileMark); @@ -303,7 +337,7 @@ namespace AsbCloudInfrastructure.Services fileInfo.PublishInfo = new FilePublishInfo() { IdPublisher = idUser, - Date = DateTime.Now, + Date = DateTime.UtcNow, WebStorageFileUrl = weblink }; diff --git a/AsbCloudInfrastructure/Services/GoogleDriveService.cs b/AsbCloudInfrastructure/Services/GoogleDriveService.cs index 4b6193ef..8d5e50b9 100644 --- a/AsbCloudInfrastructure/Services/GoogleDriveService.cs +++ b/AsbCloudInfrastructure/Services/GoogleDriveService.cs @@ -23,8 +23,9 @@ namespace AsbCloudInfrastructure.Services const string redirectUri = "http://autodrilling.naftagaz.com/AuthCallback/IndexAsync"; const string clientId = "1020584579240-f7amqg35qg7j94ta1ntgitajq27cgh49.apps.googleusercontent.com"; const string clientSecret = "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"; - const string authorizationCode = "4/0AX4XfWgwsZ5QIGwAbuyOyA9oGfcHVIhduERn3wUBVL04TPF1unHf5zWr58nWdLlDDlYBIA"; - const string refreshToken = "1//04n0Xn0AxQbN6CgYIARAAGAQSNwF-L9Ir-Lo-3BAskEKuy-SmllhhjYrmAzmZ2h9GaUNqEQjTIpb9wOanarU2JPI3zOj_cyYVRm4"; + const string authorizationCode = "4/0AX4XfWjAV_cwaXdtBHHIseToLqI36PeMycW7wMCdZBmumADKu0Ov2AoVg3F6NDRCApmW8A"; + const string refreshToken = "1//04rHpwsBJqXWyCgYIARAAGAQSNwF-L9IrzEaVHpC_Ajim5ZF0_hlSyOOW-QFARlRx4Xanx_H9TxyuRJSCIMmdVDf6S-qejlGli54"; + //const string accessToken = "ya29.a0ARrdaM8jLcdNDylpV70X08ix-pqU-1QfLbmQy4iRb7KWUgl3keukmd2mx5AxraEO0eveR3I_p1EacrgtlbbxtNWbXxl_YPf4mQTbhhNaoltp2aSn6VndUlyydLDKzw9J9r8ouFNnVZip9fivBmc-AX_rWXsj"; static readonly IAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer { diff --git a/AsbCloudInfrastructure/Services/MeasureService.cs b/AsbCloudInfrastructure/Services/MeasureService.cs index d1beed71..8424e6c5 100644 --- a/AsbCloudInfrastructure/Services/MeasureService.cs +++ b/AsbCloudInfrastructure/Services/MeasureService.cs @@ -15,11 +15,13 @@ namespace AsbCloudInfrastructure.Services public class MeasureService : IMeasureService { private readonly IAsbCloudDbContext db; + private readonly IWellService wellService; private readonly CacheTable cacheCategories; - public MeasureService(IAsbCloudDbContext db, Cache.CacheDb cacheDb) + public MeasureService(IAsbCloudDbContext db, Cache.CacheDb cacheDb, IWellService wellService) { this.db = db; + this.wellService = wellService; cacheCategories = cacheDb.GetCachedTable((DbContext)db); } @@ -43,8 +45,12 @@ namespace AsbCloudInfrastructure.Services .FirstOrDefaultAsync(token) .ConfigureAwait(false); - var dtos = entity?.Adapt((d, s) => d.CategoryName = s.Category?.Name); - return dtos; + var timezone = wellService.GetTimezone(idWell); + var dto = entity?.Adapt((d, s) => { + d.CategoryName = s.Category?.Name; + d.Timestamp = s.Timestamp.ToRemoteDateTime(timezone.Hours); + }); + return dto; } public async Task> GetHisoryAsync(int idWell, int? idCategory = null, CancellationToken token = default) @@ -61,41 +67,50 @@ namespace AsbCloudInfrastructure.Services .ToListAsync(token) .ConfigureAwait(false); - var dtos = entities.Adapt((d, s) => d.CategoryName = s.Category?.Name); + var timezone = wellService.GetTimezone(idWell); + var dtos = entities.Adapt((d, s) => { + d.CategoryName = s.Category?.Name; + d.Timestamp = s.Timestamp.ToRemoteDateTime(timezone.Hours); + }); return dtos; } - public Task InsertAsync(int idWell, MeasureDto data, CancellationToken token) + public Task InsertAsync(int idWell, MeasureDto dto, CancellationToken token) { - if (data.IdCategory < 1) - throw new ArgumentException("wrong idCategory", nameof(data)); - if (data.Data is null) - throw new ArgumentException("data.data is not optional", nameof(data)); - var entity = data.Adapt(); + if (dto.IdCategory < 1) + throw new ArgumentException("wrong idCategory", nameof(dto)); + if (dto.Data is null) + throw new ArgumentException("data.data is not optional", nameof(dto)); + var timezone = wellService.GetTimezone(idWell); + var entity = dto.Adapt(); entity.IdWell = idWell; + entity.Timestamp = dto.Timestamp.ToUtcDateTimeOffset(timezone.Hours); db.Measures.Add(entity); return db.SaveChangesAsync(token); } - public async Task UpdateAsync(int idWell, MeasureDto data, CancellationToken token) + public async Task UpdateAsync(int idWell, MeasureDto dto, CancellationToken token) { - if (data.Id < 1) - throw new ArgumentException("wrong id", nameof(data)); - if (data.IdCategory < 1) - throw new ArgumentException("wrong idCategory", nameof(data)); - if (data.Data is null) - throw new ArgumentException("data.data is not optional", nameof(data)); + if (dto.Id < 1) + throw new ArgumentException("wrong id", nameof(dto)); + if (dto.IdCategory < 1) + throw new ArgumentException("wrong idCategory", nameof(dto)); + if (dto.Data is null) + throw new ArgumentException("data.data is not optional", nameof(dto)); var entity = await db.Measures - .Where(m => m.Id == data.Id && !m.IsDeleted) + .Where(m => m.Id == dto.Id && !m.IsDeleted) .FirstOrDefaultAsync(token) .ConfigureAwait(false); + if (entity is null) - throw new ArgumentException("id doesn't exist", nameof(data)); + throw new ArgumentException("id doesn't exist", nameof(dto)); + + var timezone = wellService.GetTimezone(idWell); entity.IdWell = idWell; - entity.Timestamp = data.Timestamp; - entity.Data = data.Data; + entity.Timestamp = dto.Timestamp.ToUtcDateTimeOffset(timezone.Hours); + entity.Data = (RawData)dto.Data; return await db.SaveChangesAsync(token).ConfigureAwait(false); } diff --git a/AsbCloudInfrastructure/Services/MessageService.cs b/AsbCloudInfrastructure/Services/MessageService.cs index 7cd3e2d9..fc130abd 100644 --- a/AsbCloudInfrastructure/Services/MessageService.cs +++ b/AsbCloudInfrastructure/Services/MessageService.cs @@ -35,7 +35,6 @@ namespace AsbCloudInfrastructure.Services string searchString = default, int skip = 0, int take = 32, - bool isUtc = true, CancellationToken token = default) { var idTelemetry = telemetryService.GetIdTelemetryByIdWell(idWell); @@ -68,21 +67,19 @@ 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); - } + var timezone = telemetryService.GetTimezone(idTelemetry??default); if (begin != default) - query = query.Where(m => m.Date >= begin); + { + var beginUtc = begin.ToUtcDateTimeOffset(timezone.Hours); + query = query.Where(m => m.Date >= beginUtc); + } if (end != default) - query = query.Where(m => m.Date <= end); + { + var endUtc = end.ToUtcDateTimeOffset(timezone.Hours); + query = query.Where(m => m.Date <= endUtc); + } var result = new PaginationContainer { @@ -106,11 +103,12 @@ namespace AsbCloudInfrastructure.Services { var messageDto = new MessageDto { - Date = message.Date, Id = message.Id, WellDepth = message.WellDepth }; + messageDto.Date = message.Date.ToRemoteDateTime(timezone.Hours); + if (message.IdTelemetryUser is not null) { if (users.Any()) @@ -131,24 +129,10 @@ 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; } - [Obsolete("Use telemetryService.GetDatesRangeAsync instead", false)] - public Task GetMessagesDatesRangeAsync(int idWell, bool isUtc, - CancellationToken token = default) - => telemetryService.GetDatesRangeAsync(idWell, isUtc, token); - public Task InsertAsync(string uid, IEnumerable dtos, CancellationToken token = default) { @@ -156,15 +140,18 @@ namespace AsbCloudInfrastructure.Services return null; var telemetryId = telemetryService.GetOrCreateTelemetryIdByUid(uid); + var timezone = telemetryService.GetTimezone(telemetryId); - var maxDateDto = dtos.Max(m => m.Date); + var maxDateDto = dtos.Max(m => m.Date); + var maxDateUtc = maxDateDto.ToUtcDateTimeOffset(timezone.Hours); telemetryService.SaveRequestDate(uid, maxDateDto); foreach (var dto in dtos) { - var entity = dto.Adapt(); + var entity = dto.Adapt(); entity.Id = 0; entity.IdTelemetry = telemetryId; + entity.Date = dto.Date.ToUtcDateTimeOffset(timezone.Hours); db.TelemetryMessages.Add(entity); } diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index b81f6acf..20986967 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -19,17 +19,17 @@ namespace AsbCloudInfrastructure.Services private readonly IAsbCloudDbContext db; private readonly string connectionString; private readonly ITelemetryService telemetryService; - //private readonly IFileService fileService; private readonly IReportsBackgroundQueue queue; + private readonly IWellService wellService; public ReportService(IAsbCloudDbContext db, IConfiguration configuration, ITelemetryService telemetryService, - IReportsBackgroundQueue queue) + IReportsBackgroundQueue queue, IWellService wellService) { this.db = db; this.connectionString = configuration.GetConnectionString("DefaultConnection"); + this.wellService = wellService; this.telemetryService = telemetryService; - //this.fileService = fileService; this.queue = queue; ReportCategoryId = db.FileCategories.AsNoTracking() .FirstOrDefault(c => @@ -41,6 +41,12 @@ namespace AsbCloudInfrastructure.Services public int CreateReport(int idWell, int idUser, int stepSeconds, int format, DateTime begin, DateTime end, Action progressHandler) { + var timezoneOffset = wellService.GetTimezone(idWell).Hours; + var beginUtc = begin.ToUtcDateTimeOffset(timezoneOffset); + var endUtc = end.ToUtcDateTimeOffset(timezoneOffset); + var beginRemote = begin.ToTimeZoneOffsetHours(timezoneOffset); + var endRemote = end.ToTimeZoneOffsetHours(timezoneOffset); + var newReportId = queue.EnqueueTask((id) => { var optionsBuilder = new DbContextOptionsBuilder(); @@ -49,7 +55,7 @@ namespace AsbCloudInfrastructure.Services using var context = new AsbCloudDbContext(optionsBuilder.Options); - var generator = GetReportGenerator(idWell, begin, end, stepSeconds, format, context); + var generator = GetReportGenerator(idWell, beginRemote, endRemote, stepSeconds, format, context); var reportFileName = Path.Combine(tempDir, generator.GetReportDefaultFileName()); var totalPages = generator.GetPagesCount(); @@ -58,7 +64,7 @@ namespace AsbCloudInfrastructure.Services progressHandler.Invoke(e.Adapt(), id); }; generator.Make(reportFileName); - + var fileService = new FileService(context); var fileInfo = fileService.MoveAsync(idWell, idUser, ReportCategoryId, reportFileName, reportFileName).Result; @@ -75,8 +81,8 @@ namespace AsbCloudInfrastructure.Services { IdWell = idWell, IdFile = fileInfo.Id, - Begin = begin, - End = end, + Begin = beginUtc, + End = endUtc, Step = stepSeconds, Format = format }; @@ -93,77 +99,56 @@ namespace AsbCloudInfrastructure.Services public int GetReportPagesCount(int idWell, DateTime begin, DateTime end, int stepSeconds, int format) { - var generator = GetReportGenerator(idWell, begin, end, stepSeconds, format, (AsbCloudDbContext)db); - return generator.GetPagesCount(); + var timezoneOffset = wellService.GetTimezone(idWell).Hours; + var beginRemote = begin.ToTimeZoneOffsetHours(timezoneOffset); + var endRemote = end.ToTimeZoneOffsetHours(timezoneOffset); + + var generator = GetReportGenerator(idWell, beginRemote, endRemote, stepSeconds, format, (AsbCloudDbContext)db); + var pagesCount = generator.GetPagesCount(); + return pagesCount; } - public async Task GetReportsDatesRangeAsync(int idWell, bool isUtc, - CancellationToken token = default) + public DatesRangeDto GetDatesRangeOrDefault(int idWell) { - var telemetryId = telemetryService.GetIdTelemetryByIdWell(idWell); - - if (telemetryId is null) + var idTelemetry = telemetryService.GetIdTelemetryByIdWell(idWell); + if(idTelemetry is null) return null; - - var datesRange = await (from d in db.TelemetryDataSaub - where d.IdTelemetry == telemetryId - select d.Date).Union( - from m in db.TelemetryMessages - where m.IdTelemetry == telemetryId - select m.Date).DefaultIfEmpty() - .GroupBy(g => true) - .AsNoTracking() - .Select(g => new - { - From = g.Min(), - To = g.Max() - }).OrderBy(gr => gr.From) - .FirstOrDefaultAsync(token) - .ConfigureAwait(false); - - var result = new DatesRangeDto - { - From = datesRange.From, - To = datesRange.To.Year == 1 ? DateTime.MaxValue : datesRange.To - }; - - if (isUtc) - return result; - - result = await telemetryService.DatesRangeToTelemetryTimeZoneAsync((int)telemetryId, result, token) - .ConfigureAwait(false); - - return result; + var range = telemetryService.GetDatesRange((int)idTelemetry); + return range; } - public Task> GetAllReportsByWellAsync(int idWell, CancellationToken token) => - (from r in db.ReportProperties.Include(r => r.File) - where r.IdWell == idWell - select new ReportPropertiesDto - { - Id = r.Id, - Name = r.File.Name, - File = new FileInfoDto - { - Id = r.File.Id, - Author = null, - IdAuthor = r.File.IdAuthor ?? 0, - IdCategory = r.File.IdCategory, - IdWell = r.File.IdWell, - Name = r.File.Name, - Size = r.File.Size, - UploadDate = r.File.UploadDate, - }, - IdWell = r.IdWell, - Date = r.File.UploadDate, - Begin = r.Begin, - End = r.End, - Step = r.Step, - Format = r.Format == 0 ? ".pdf" : ".las" - }) - .OrderBy(o => o.Date) + public async Task> GetAllReportsByWellAsync(int idWell, CancellationToken token) + { + var timezoneOffset = wellService.GetTimezone(idWell).Hours; + var propertiesQuery = db.ReportProperties.Include(r => r.File) + .Where(p => p.IdWell == idWell) + .OrderBy(o => o.File.UploadDate) .AsNoTracking() - .Take(1024).ToListAsync(token); + .Take(1024); + var properties = await propertiesQuery.ToListAsync(token); + return properties.Select(p => new ReportPropertiesDto + { + Id = p.Id, + Name = p.File.Name, + File = new FileInfoDto + { + Id = p.File.Id, + Author = null, + IdAuthor = p.File.IdAuthor ?? 0, + IdCategory = p.File.IdCategory, + IdWell = p.File.IdWell, + Name = p.File.Name, + Size = p.File.Size, + UploadDate = p.File.UploadDate.ToRemoteDateTime(timezoneOffset), + }, + IdWell = p.IdWell, + Date = p.File.UploadDate.ToRemoteDateTime(timezoneOffset), + Begin = p.Begin.ToRemoteDateTime(timezoneOffset), + End = p.End.ToRemoteDateTime(timezoneOffset), + Step = p.Step, + Format = p.Format == 0 ? ".pdf" : ".las" + }); + } private static IReportGenerator GetReportGenerator(int idWell, DateTime begin, DateTime end, int stepSeconds, int format, AsbCloudDbContext context) diff --git a/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs index 8a3024e1..6445d67c 100644 --- a/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs @@ -13,7 +13,7 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services { - public abstract class TelemetryDataBaseService : ITelemetryDataService, IConverter + public abstract class TelemetryDataBaseService : ITelemetryDataService where TDto : AsbCloudApp.Data.ITelemetryData where TModel : class, AsbCloudDb.Model.ITelemetryData { @@ -40,8 +40,6 @@ namespace AsbCloudInfrastructure.Services if (dtos == default || !dtos.Any()) return 0; - var idTelemetry = telemetryService.GetOrCreateTelemetryIdByUid(uid); - var lastTelemetryDate = telemetryService.GetLastTelemetryDate(uid); var dtosList = dtos.OrderBy(d => d.Date).ToList(); var dtoMinDate = dtosList.First().Date; @@ -56,15 +54,14 @@ namespace AsbCloudInfrastructure.Services foreach (var duplicate in duplicates) dtosList.Remove(duplicate); } - - var offsetHours = await telemetryService.GetTelemetryTimeZoneOffsetAsync(idTelemetry, token); - 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 idTelemetry = telemetryService.GetOrCreateTelemetryIdByUid(uid); + var timezone = telemetryService.GetTimezone(idTelemetry); + + var entities = dtosList.Select(dto => { + var entity = Convert(dto, timezone.Hours); + entity.IdTelemetry = idTelemetry; + return entity; }); var entityMaxDate = entities.Max(e => e.Date); @@ -79,7 +76,7 @@ namespace AsbCloudInfrastructure.Services catch(Exception ex) { stopwatch.Stop(); - Trace.WriteLine($"Fail to save data telemerty " + + Trace.WriteLine($"Fail to save data telemetry " + $"uid: {uid}, " + $"idTelemetry {idTelemetry}, " + $"count: {entities.Count()}, " + @@ -92,7 +89,7 @@ namespace AsbCloudInfrastructure.Services public virtual async Task> GetAsync(int idWell, DateTime dateBegin = default, double intervalSec = 600d, - int approxPointsCount = 1024, bool isUtc = false, CancellationToken token = default) + int approxPointsCount = 1024, CancellationToken token = default) { var well = cacheWells.FirstOrDefault(w => w.Id == idWell); if (well?.IdTelemetry is null) @@ -100,35 +97,33 @@ namespace AsbCloudInfrastructure.Services var idTelemetry = well?.IdTelemetry ?? default; + var timezone = telemetryService.GetTimezone(idTelemetry); + var filterByDateEnd = dateBegin != default; + DateTimeOffset dateBeginUtc; if (dateBegin == default) { - dateBegin = telemetryService.GetLastTelemetryDate(idTelemetry); - if (dateBegin != default) - dateBegin = dateBegin.AddSeconds(-intervalSec); - } + dateBeginUtc = telemetryService.GetLastTelemetryDate(idTelemetry, true); + if (dateBeginUtc != default) + dateBeginUtc = dateBeginUtc.AddSeconds(-intervalSec); + } + else + { + dateBeginUtc = dateBegin.ToUtcDateTimeOffset(timezone.Hours); + } - if (dateBegin == default) - dateBegin = DateTime.Now.AddSeconds(-intervalSec); + if (dateBeginUtc == default) + dateBeginUtc = DateTime.UtcNow.AddSeconds(-intervalSec); - if (dateBegin.Kind == DateTimeKind.Unspecified) - dateBegin = DateTime.SpecifyKind(dateBegin, DateTimeKind.Utc); - - 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 dateEnd = dateBeginUtc.AddSeconds(intervalSec); var dbSet = db.Set(); var query = dbSet .Where(d => d.IdTelemetry == idTelemetry - && d.Date >= dateBegin); + && d.Date >= dateBeginUtc); if (filterByDateEnd) - query = query.Where(d => d.Date < dateEnd); + query = query.Where(d => d.Date <= dateEnd); var fullDataCount = await query.CountAsync(token) .ConfigureAwait(false); @@ -168,30 +163,31 @@ namespace AsbCloudInfrastructure.Services .ToListAsync(token) .ConfigureAwait(false); - 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; - }); - + var dtos = entities.Select(e => Convert(e, timezone.Hours)); + return dtos; } - [Obsolete("Use telemetryService.GetDatesRangeAsync instead", false)] - public virtual Task GetDataDatesRangeAsync(int idWell, bool isUtc, - CancellationToken token = default) - => telemetryService.GetDatesRangeAsync(idWell, isUtc, token); + public abstract TDto Convert(TModel src, double timezoneOffset); - public abstract TDto Convert(TModel src); + public abstract TModel Convert(TDto src, double timezoneOffset); - public abstract TModel Convert(TDto src); + private static double AssumeTimezoneOffset(DateTime nearToCurrentDate) + { + var offset = 5d; + if (nearToCurrentDate.Kind == DateTimeKind.Unspecified) + { + var now = DateTime.UtcNow; + var minutes = 60 * (now.Hour - nearToCurrentDate.Hour) + now.Minute - nearToCurrentDate.Minute; + var minutesPositive = (1440_0000 + minutes) % 1440; //60*24 + var halfsHours = Math.Round(1d * minutesPositive / 30d); // quarters are ignored + var hours = halfsHours / 2; + offset = hours < 12 ? hours : 24 - hours; + } + if (nearToCurrentDate.Kind == DateTimeKind.Local) + offset = TimeZoneInfo.Local.BaseUtcOffset.TotalHours; + + return offset; + } } } diff --git a/AsbCloudInfrastructure/Services/TelemetryDataSaubService.cs b/AsbCloudInfrastructure/Services/TelemetryDataSaubService.cs index 5ac438c9..7a3dd68a 100644 --- a/AsbCloudInfrastructure/Services/TelemetryDataSaubService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryDataSaubService.cs @@ -15,21 +15,23 @@ namespace AsbCloudInfrastructure.Services :base(db, telemetryService, cacheDb) {} - public override TelemetryDataSaub Convert(TelemetryDataSaubDto src) + public override TelemetryDataSaub Convert(TelemetryDataSaubDto src, double timezoneOffset) { var entity = src.Adapt(); var telemetryUser = cacheTelemetryUsers? .FirstOrDefault(u => u.IdTelemetry == src.IdTelemetry && (u.Name == src.User || u.Surname == src.User)); entity.IdUser = telemetryUser?.IdUser; + entity.Date = src.Date.ToUtcDateTimeOffset(timezoneOffset); return entity; } - public override TelemetryDataSaubDto Convert(TelemetryDataSaub src) + public override TelemetryDataSaubDto Convert(TelemetryDataSaub src, double timezoneOffset) { var dto = src.Adapt(); var telemetryUser = cacheTelemetryUsers? .FirstOrDefault(u => u.IdTelemetry == src.IdTelemetry && u.IdUser == src.IdUser); dto.User = telemetryUser?.MakeDisplayName(); + dto.Date = src.Date.ToRemoteDateTime(timezoneOffset); return dto; } } diff --git a/AsbCloudInfrastructure/Services/TelemetryDataSpinService.cs b/AsbCloudInfrastructure/Services/TelemetryDataSpinService.cs index 86ce23b5..11f5b4f9 100644 --- a/AsbCloudInfrastructure/Services/TelemetryDataSpinService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryDataSpinService.cs @@ -15,15 +15,17 @@ namespace AsbCloudInfrastructure.Services : base(db, telemetryService, cacheDb) { } - public override TelemetryDataSpin Convert(TelemetryDataSpinDto src) + public override TelemetryDataSpin Convert(TelemetryDataSpinDto src, double timezoneOffset) { var entity = src.Adapt(); + entity.Date = src.Date.ToUtcDateTimeOffset(timezoneOffset); return entity; } - public override TelemetryDataSpinDto Convert(TelemetryDataSpin src) + public override TelemetryDataSpinDto Convert(TelemetryDataSpin src, double timezoneOffset) { var dto = src.Adapt(); + dto.Date = src.Date.ToRemoteDateTime(timezoneOffset); return dto; } } diff --git a/AsbCloudInfrastructure/Services/TelemetryService.cs b/AsbCloudInfrastructure/Services/TelemetryService.cs index 5b496a15..90144464 100644 --- a/AsbCloudInfrastructure/Services/TelemetryService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryService.cs @@ -16,18 +16,18 @@ namespace AsbCloudInfrastructure.Services public class TelemetryService : ITelemetryService { private readonly CacheTable cacheTelemetry; - private readonly CacheTable cacheWells;//TODO: use wellService insad of this + private readonly CacheTable cacheWells;//TODO: use wellService instead of this private readonly IAsbCloudDbContext db; private readonly ITelemetryTracker telemetryTracker; - private readonly ITimeZoneService timeZoneService; + private readonly ITimezoneService timezoneService; - public ITimeZoneService TimeZoneService => timeZoneService; + public ITimezoneService TimeZoneService => timezoneService; public ITelemetryTracker TelemetryTracker => telemetryTracker; public TelemetryService( IAsbCloudDbContext db, ITelemetryTracker telemetryTracker, - ITimeZoneService timeZoneService, + ITimezoneService timezoneService, CacheDb cacheDb) { cacheTelemetry = cacheDb.GetCachedTable((AsbCloudDbContext)db); @@ -39,7 +39,7 @@ namespace AsbCloudInfrastructure.Services nameof(Well.WellType)); this.db = db; this.telemetryTracker = telemetryTracker; - this.timeZoneService = timeZoneService; + this.timezoneService = timezoneService; } public IEnumerable GetTransmittingTelemetries() @@ -55,48 +55,43 @@ namespace AsbCloudInfrastructure.Services return telemetryDtos; } - public void SaveRequestDate(string uid, DateTime remoteDate) => + public void SaveRequestDate(string uid, DateTimeOffset remoteDate) => telemetryTracker.SaveRequestDate(uid, remoteDate); - public DateTime GetLastTelemetryDate(string telemetryUid) => - telemetryTracker.GetLastTelemetryDateByUid(telemetryUid); - - public DateTime GetLastTelemetryDate(int telemetryId) + public DateTime GetLastTelemetryDate(int idTelemetry, bool useUtc = false) { - var lastTelemetryDate = DateTime.MinValue; - var telemetry = cacheTelemetry.FirstOrDefault(t => t.Id == telemetryId); + var lastTelemetryDate = DateTimeOffset.MinValue; + var telemetry = cacheTelemetry.FirstOrDefault(t => t.Id == idTelemetry); if (telemetry is null) - return lastTelemetryDate; + throw new Exception($"Telemetry id:{idTelemetry} does not exist"); var uid = telemetry.RemoteUid; + var timzone = GetTimezone(idTelemetry); - lastTelemetryDate = GetLastTelemetryDate(uid); - return lastTelemetryDate; + lastTelemetryDate = telemetryTracker.GetLastTelemetryDateByUid(uid); + + if (useUtc) + return lastTelemetryDate.UtcDateTime; + + return lastTelemetryDate.ToRemoteDateTime(timzone.Hours); } - public virtual async Task GetDatesRangeAsync( - int idWell, - bool isUtc, - CancellationToken token = default) + public DatesRangeDto GetDatesRange(int idTelemetry) { - var telemetryId = GetIdTelemetryByIdWell(idWell); - if (telemetryId is null) - return null; - - var telemetry = await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == telemetryId, token) - .ConfigureAwait(false); + var telemetry = cacheTelemetry.FirstOrDefault(t => t.Id == idTelemetry); + if (telemetry is null) + throw new Exception($"Telemetry id:{idTelemetry} does not exist"); var dto = TelemetryTracker.GetTelemetryDateRangeByUid(telemetry.RemoteUid); + if (dto is null) + throw new Exception($"Telemetry id:{idTelemetry} has no data"); - if (isUtc) - return dto; - - dto = await DatesRangeToTelemetryTimeZoneAsync((int)telemetryId, dto, token) - .ConfigureAwait(false); + var timezone = GetTimezone((int)idTelemetry); + dto.From = dto.From.ToTimeZoneOffsetHours(timezone.Hours); + dto.To = dto.To.ToTimeZoneOffsetHours(timezone.Hours); return dto; - } public int GetOrCreateTelemetryIdByUid(string uid) @@ -105,9 +100,6 @@ namespace AsbCloudInfrastructure.Services public int? GetIdWellByTelemetryUid(string uid) => GetWellByTelemetryUid(uid)?.Id; - public double GetTimezoneOffsetByTelemetryId(int idTelemetry) => - cacheTelemetry.FirstOrDefault(t => t.Id == idTelemetry).Info?.TimeZoneOffsetTotalHours ?? 0d; - public async Task UpdateInfoAsync(string uid, TelemetryInfoDto info, CancellationToken token) { @@ -115,8 +107,8 @@ namespace AsbCloudInfrastructure.Services telemetry.Info = info.Adapt(); if (!string.IsNullOrEmpty(info.TimeZoneId) && - telemetry.TelemetryTimeZone?.IsOverride != true) - telemetry.TelemetryTimeZone = new TelemetryTimeZone() + telemetry.TimeZone?.IsOverride != true) + telemetry.TimeZone = new SimpleTimezone() { Hours = info.TimeZoneOffsetTotalHours, TimeZoneId = info.TimeZoneId @@ -126,71 +118,44 @@ namespace AsbCloudInfrastructure.Services .ConfigureAwait(false); } - public async Task GetTelemetryTimeZoneOffsetAsync(int idTelemetry, CancellationToken token) + public SimpleTimezoneDto GetTimezone(int idTelemetry) { - var telemetry = - await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == idTelemetry, token); + var telemetry = cacheTelemetry.FirstOrDefault(t => t.Id == idTelemetry); - if (!string.IsNullOrEmpty(telemetry.TelemetryTimeZone?.TimeZoneId)) - return telemetry.TelemetryTimeZone.Hours; + if (telemetry is null) + throw new Exception($"Telemetry id: {idTelemetry} does not exist."); - if (!string.IsNullOrEmpty(telemetry.Info?.TimeZoneId)) + if (telemetry.TimeZone is not null) + return telemetry.TimeZone.Adapt(); + + if (telemetry.Info is not null) { - telemetry.TelemetryTimeZone = new TelemetryTimeZone + telemetry.TimeZone = new SimpleTimezone { 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(); + cacheTelemetry.Upsert(telemetry); + return telemetry.TimeZone.Adapt(); } - await cacheTelemetry.UpsertAsync(telemetry, token).ConfigureAwait(false); - - return telemetry.TelemetryTimeZone.Hours; - } - - public async Task DatesRangeToTelemetryTimeZoneAsync(int idTelemetry, DatesRangeDto range, - CancellationToken token) - { - var offset = await GetTelemetryTimeZoneOffsetAsync(idTelemetry, token); - - if (offset is null) - return range; - - return new DatesRangeDto() + if (telemetry.Well?.Timezone is not null) { - From = timeZoneService.DateToTimeZone(range.From, offset ?? default), - To = timeZoneService.DateToTimeZone(range.To, offset ?? default), - }; + telemetry.TimeZone = telemetry.Well.Timezone; + cacheTelemetry.Upsert(telemetry); + return telemetry.TimeZone.Adapt(); + } + + throw new Exception($"Telemetry id: {idTelemetry} can't find timezone."); } - public async Task UpdateTimeZoneAsync(string uid, TelemetryTimeZoneDto timeZoneInfo, + public async Task UpdateTimezoneAsync(string uid, SimpleTimezoneDto timeone, CancellationToken token) { var telemetry = GetOrCreateTelemetryByUid(uid); - var newTelemetryTimeZone = timeZoneInfo.Adapt(); - if (newTelemetryTimeZone?.Equals(telemetry.TelemetryTimeZone) == true) + var newTelemetryTimeZone = timeone.Adapt(); + if (newTelemetryTimeZone?.Equals(telemetry.TimeZone) == true) return; await cacheTelemetry.UpsertAsync(telemetry, token) .ConfigureAwait(false); @@ -202,40 +167,27 @@ 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; - - var latitude = well.Latitude ?? - well.Cluster?.Latitude ?? - well.Cluster?.Deposit?.Latitude; - - var longitude = well.Longitude ?? - well.Cluster?.Longitude ?? - well.Cluster?.Deposit?.Longitude; - - if (latitude is not null && longitude is not null) - return ((double)latitude, (double)longitude); - - return null; - } - private Well GetWellByTelemetryUid(string uid) { var tele = cacheTelemetry.FirstOrDefault(t => t.RemoteUid == uid); if (tele is null) return null; - return cacheWells.FirstOrDefault(w => w?.IdTelemetry == tele.Id); + var well = cacheWells.FirstOrDefault(w => w?.IdTelemetry == tele.Id); + return well; } private Telemetry GetOrCreateTelemetryByUid(string uid) - => cacheTelemetry.GetOrCreate(t => t.RemoteUid == uid, () => new Telemetry { RemoteUid = uid }); + => cacheTelemetry.GetOrCreate(t => t.RemoteUid == uid, () => new Telemetry + { + RemoteUid = uid, + TimeZone = new SimpleTimezone + { + Hours = 5, + IsOverride = false, + TimeZoneId = "default", + } + }); public async Task MergeAsync(int from, int to, CancellationToken token) { @@ -275,7 +227,7 @@ namespace AsbCloudInfrastructure.Services await transaction.CommitAsync(token).ConfigureAwait(false); stopwath.Stop(); - Console.WriteLine($"Successfully commited in {1d * stopwath.ElapsedMilliseconds / 1000d: #0.00} sec. Affected {affected} rows."); + Console.WriteLine($"Successfully committed in {1d * stopwath.ElapsedMilliseconds / 1000d: #0.00} sec. Affected {affected} rows."); return affected; } catch(Exception ex) diff --git a/AsbCloudInfrastructure/Services/TelemetryTracker.cs b/AsbCloudInfrastructure/Services/TelemetryTracker.cs index 801d687f..c05f2995 100644 --- a/AsbCloudInfrastructure/Services/TelemetryTracker.cs +++ b/AsbCloudInfrastructure/Services/TelemetryTracker.cs @@ -23,17 +23,17 @@ namespace AsbCloudInfrastructure.Services /// /// Время последнего запроса (по времени сервера) /// - public DateTime LastTimeServer { get; set; } + public DateTimeOffset LastTimeServer { get; set; } /// /// Дата первых данных в БД /// - public DateTime TelemetryDateMin { get; set; } + public DateTimeOffset TelemetryDateUtcMin { get; set; } /// /// Дата последних данных в БД /// - public DateTime TelemetryDateMax { get; set; } + public DateTimeOffset TelemetryDateUtcMax { get; set; } } @@ -56,8 +56,8 @@ namespace AsbCloudInfrastructure.Services keyValuePairs[telemetry.RemoteUid] = new TrackerStat { RemoteUid = telemetry.RemoteUid, - TelemetryDateMin = date, - TelemetryDateMax = date, + TelemetryDateUtcMin = date, + TelemetryDateUtcMax = date, LastTimeServer = date, }; } @@ -88,15 +88,9 @@ namespace AsbCloudInfrastructure.Services foreach (var oldReq in oldRequests) { var telemetryStat = telemetriesStats.GetOrAdd(oldReq.Uid, (uid) => new TrackerStat { RemoteUid = uid }); - var dateMin = oldReq.DateMin.Kind == DateTimeKind.Local - ? oldReq.DateMin.ToUniversalTime() - : oldReq.DateMin; - var dateMax = oldReq.DateMax.Kind == DateTimeKind.Local - ? oldReq.DateMax.ToUniversalTime() - : oldReq.DateMax; - telemetryStat.TelemetryDateMin = dateMin; - telemetryStat.TelemetryDateMax = dateMax; - telemetryStat.LastTimeServer = dateMax; + telemetryStat.TelemetryDateUtcMin = oldReq.DateMin; + telemetryStat.TelemetryDateUtcMax = oldReq.DateMax; + telemetryStat.LastTimeServer = oldReq.DateMax; } }).ContinueWith((t) => { @@ -105,9 +99,9 @@ namespace AsbCloudInfrastructure.Services }); } - private static DateTime ParseDateFromUidOrDefault(string remoteUid, DateTime defaultValue = default) + private static DateTimeOffset ParseDateFromUidOrDefault(string remoteUid, DateTime defaultValue = default) { - //eg: uid = 20211102_173407926 + //example: uid = 20211102_173407926 if (string.IsNullOrEmpty(remoteUid) || (remoteUid.Length != 18)) return defaultValue; @@ -120,30 +114,29 @@ namespace AsbCloudInfrastructure.Services return defaultValue; } - public void SaveRequestDate(string uid, DateTime remoteDate) + public void SaveRequestDate(string uid, DateTimeOffset remoteDate) { var stat = telemetriesStats.GetOrAdd(uid, _ => new TrackerStat { RemoteUid = uid, - TelemetryDateMin = remoteDate} + TelemetryDateUtcMin = remoteDate} ); stat.LastTimeServer = DateTime.Now; - if(stat.TelemetryDateMax.ToUniversalTime() < remoteDate.ToUniversalTime()) - stat.TelemetryDateMax = remoteDate; + if(stat.TelemetryDateUtcMax.ToUniversalTime() < remoteDate.ToUniversalTime()) + stat.TelemetryDateUtcMax = remoteDate; } - public DateTime GetLastTelemetryDateByUid(string uid) => - telemetriesStats.GetValueOrDefault(uid)?.TelemetryDateMax ?? default; - + public DateTimeOffset GetLastTelemetryDateByUid(string uid) => + telemetriesStats.GetValueOrDefault(uid)?.TelemetryDateUtcMax ?? default; public DatesRangeDto GetTelemetryDateRangeByUid(string uid) { var stat = telemetriesStats.GetValueOrDefault(uid); var range = new DatesRangeDto { - From = stat?.TelemetryDateMin ?? default, - To = stat?.TelemetryDateMax ?? default, + From = stat?.TelemetryDateUtcMin.UtcDateTime ?? default, + To = stat?.TelemetryDateUtcMax.UtcDateTime ?? default, }; return range; } diff --git a/AsbCloudInfrastructure/Services/TimeZoneService.cs b/AsbCloudInfrastructure/Services/TimeZoneService.cs index 9bf0465e..0b52aa86 100644 --- a/AsbCloudInfrastructure/Services/TimeZoneService.cs +++ b/AsbCloudInfrastructure/Services/TimeZoneService.cs @@ -8,7 +8,7 @@ using System; namespace AsbCloudInfrastructure.Services { - public class TimeZoneService : ITimeZoneService + public class TimezoneService : ITimezoneService { private class TimeZoneInfo { @@ -25,16 +25,19 @@ namespace AsbCloudInfrastructure.Services public string Time { get; set; } } - private const string timeZoneApiUrl = "http://api.geonames.org/timezoneJSON"; + private const string timezoneApiUrl = "http://api.geonames.org/timezoneJSON"; private const string timezoneApiUserName = "asbautodrilling"; - public async Task GetByCoordinatesAsync(double latitude, double longitude, CancellationToken token) + public SimpleTimezoneDto GetByCoordinates(double latitude, double longitude) + => GetByCoordinatesAsync(latitude, longitude, default).Result; + + 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}"; + $"{timezoneApiUrl}?lat={lat}&lng={lng}&username={timezoneApiUserName}"; using var client = new HttpClient(); @@ -51,42 +54,16 @@ namespace AsbCloudInfrastructure.Services { PropertyNameCaseInsensitive = true }; - var timeZoneInfo = JsonSerializer.Deserialize(responseJson, options); + var timezoneInfo = JsonSerializer.Deserialize(responseJson, options); - return new TelemetryTimeZoneDto + return new SimpleTimezoneDto { - Hours = timeZoneInfo.DstOffset, + Hours = timezoneInfo.DstOffset, IsOverride = false, - TimeZoneId = timeZoneInfo.TimezoneId, + 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/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs index c4946ed0..775a8b07 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -8,20 +8,23 @@ using AsbCloudInfrastructure.Services.Cache; using Mapster; using AsbCloudApp.Services; using System; +using AsbCloudApp.Comparators; namespace AsbCloudInfrastructure.Services { public class UserRoleService : IUserRoleService { private readonly CacheTable cacheUserRoles; - private readonly CacheTable cacheUserRolePermissions; + private readonly CacheTable cacheRelationUserRolePermissions; + private readonly CacheTable cacheRelationUserRoleUserRole; public ISet Includes { get; } = new SortedSet(); public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb) { - cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)context, nameof(UserRole.RelationUserRolePermissions)); - cacheUserRolePermissions = cacheDb.GetCachedTable((AsbCloudDbContext)context, nameof(RelationUserRolePermission.Permission)); + cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)context, nameof(UserRole.RelationUserRolePermissions), nameof(UserRole.RelationUserRoleUserRoles)); + cacheRelationUserRolePermissions = cacheDb.GetCachedTable((AsbCloudDbContext)context, nameof(RelationUserRolePermission.Permission)); + cacheRelationUserRoleUserRole = cacheDb.GetCachedTable((AsbCloudDbContext)context, nameof(RelationUserRoleUserRole.IncludeRole), nameof(RelationUserRoleUserRole.Role)); } public async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) @@ -31,6 +34,8 @@ namespace AsbCloudInfrastructure.Services .ConfigureAwait(false); dto.Id = updatedEntity.Id; await UpdatePermissionsAsync(dto, token); + await UpdateIncludedRolesAsync(dto, token); + await cacheUserRoles.RefreshAsync(true, token) .ConfigureAwait(false); return updatedEntity?.Id ?? 0; @@ -99,6 +104,7 @@ namespace AsbCloudInfrastructure.Services var entity = Convert(dto); await UpdatePermissionsAsync(dto, token); + await UpdateIncludedRolesAsync(dto, token); await cacheUserRoles.UpsertAsync(entity, token) .ConfigureAwait(false); @@ -106,39 +112,61 @@ namespace AsbCloudInfrastructure.Services return dto.Id; } - public List GetNestedById(int id, int recursionLevel = 7) + public IEnumerable GetNestedById(int id, int recursionLevel = 7) { var role = cacheUserRoles.FirstOrDefault(r => r.Id == id); if (role is null) return null; var dto = Convert(role); - if (role.IdParent is null || recursionLevel == 0) - return new List { dto }; - var parentRoles = GetNestedById((int)role.IdParent, --recursionLevel) ?? - new List(); - parentRoles.Add(dto); - return parentRoles; + var roles = new SortedSet(ComparerIId.GetInstance()) { dto }; + + if (recursionLevel <= 0 || role.RelationUserRoleUserRoles?.Any() != true) + return roles; + + foreach (var relation in role.RelationUserRoleUserRoles) + { + var nestedRoles = GetNestedById(relation.IdInclude, --recursionLevel); + if (nestedRoles?.Any() != true) + continue; + foreach (var nestedRole in nestedRoles) + roles.Add(nestedRole); + } + return roles; } - private async Task UpdatePermissionsAsync(UserRoleDto roleDto, CancellationToken token) + private async Task UpdatePermissionsAsync(UserRoleDto dto, CancellationToken token) { - if (roleDto?.Permissions is null) + if (dto?.Permissions is null) return; - await cacheUserRolePermissions.RemoveAsync(r => r.IdUserRole == roleDto.Id, token) + await cacheRelationUserRolePermissions.RemoveAsync(r => r.IdUserRole == dto.Id, token) .ConfigureAwait(false); - if (!roleDto.Permissions.Any()) - return; - - var newRelationRoleToPermission = roleDto.Permissions.Select(p => new RelationUserRolePermission + if (dto.Permissions.Any()) { - IdPermission = p.Id, - IdUserRole = roleDto.Id, - }); + var newRelationRoleToPermission = dto.Permissions.Select(p => new RelationUserRolePermission + { + IdPermission = p.Id, + IdUserRole = dto.Id, + }); - await cacheUserRolePermissions.InsertAsync(newRelationRoleToPermission, token) - .ConfigureAwait(false); + await cacheRelationUserRolePermissions.InsertAsync(newRelationRoleToPermission, token) + .ConfigureAwait(false); + } + } + + private async Task UpdateIncludedRolesAsync(UserRoleDto dto, CancellationToken token) + { + if (dto?.Roles is null) + return ; + + await cacheRelationUserRoleUserRole.RemoveAsync(rel => rel.Id == dto.Id, token); + + if (dto.Roles.Any()) + { + var newRelations = dto.Roles.Select(r => new RelationUserRoleUserRole { Id = dto.Id, IdInclude = r.Id }); + await cacheRelationUserRoleUserRole.UpsertAsync(newRelations, token); + } } public Task DeleteAsync(int id, CancellationToken token = default) @@ -149,7 +177,7 @@ namespace AsbCloudInfrastructure.Services public bool HasPermission(IEnumerable rolesIds, string permissionName) { - var permissionInfo = cacheUserRolePermissions + var permissionInfo = cacheRelationUserRolePermissions .FirstOrDefault(p => p.Permission?.Name.ToLower() == permissionName.ToLower()) ?.Permission; @@ -168,10 +196,15 @@ namespace AsbCloudInfrastructure.Services { if (userRole.RelationUserRolePermissions.Any(p => p.IdPermission == idPermission)) return true; - if (userRole.IdParent is not null && recursionLevel > 0) + + if (recursionLevel <= 0 || userRole.RelationUserRoleUserRoles?.Any() != true) + return false; + + foreach (var relation in userRole.RelationUserRoleUserRoles) { - var parentRole = cacheUserRoles.FirstOrDefault(p => p.Id == userRole.IdParent); - return HasPermission(parentRole, idPermission, --recursionLevel); + var includedRole = cacheUserRoles.First(p => p.Id == relation.IdInclude); + if (HasPermission(includedRole, idPermission, --recursionLevel)) + return true; } return false; } @@ -187,10 +220,18 @@ namespace AsbCloudInfrastructure.Services var dto = entity.Adapt(); if(entity.RelationUserRolePermissions?.Any() == true) { - dto.Permissions = cacheUserRolePermissions + dto.Permissions = cacheRelationUserRolePermissions .Where(r => entity.Id == r.IdUserRole) .Select(r => Convert(r.Permission)); } + + if (entity.RelationUserRoleUserRoles?.Any() == true) + { + dto.Roles = entity.RelationUserRoleUserRoles.Select(rel => { + var includedRole = cacheUserRoles.First(r => r.Id == rel.IdInclude); + return Convert(includedRole); + }).ToList(); + } return dto; } diff --git a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs index 4ec0ddd9..effeeae2 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs @@ -143,7 +143,8 @@ namespace AsbCloudInfrastructure.Services.WellOperationService var statsList = clusterWellsIds.Select(clusterWellId => { var currentWellOps = operations.Where(o => o.IdWell == clusterWellId); - var stat = CalcStat(currentWellOps); + var timezoneOffsetH = wellService.GetTimezone(clusterWellId).Hours; + var stat = CalcStat(currentWellOps, timezoneOffsetH); return stat; }).Where(c => c is not null); @@ -161,8 +162,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService private async Task CalcStatWellAsync(Well well, CancellationToken token = default) { - var wellType = await cacheWellType.FirstOrDefaultAsync(t => t.Id == well.IdWellType, token); - + var wellType = await cacheWellType.FirstOrDefaultAsync(t => t.Id == well.IdWellType, token); var statWellDto = new StatWellDto() { Id = well.Id, @@ -170,7 +170,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService WellType = wellType?.Caption ?? "", IdState = well.IdState, State = wellService.GetStateText(well.IdState), - LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id), + LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id).DateTime, }; statWellDto.Companies = await wellService.GetCompaniesAsync(well.Id, token); @@ -185,13 +185,14 @@ namespace AsbCloudInfrastructure.Services.WellOperationService if (!wellOperations.Any()) return statWellDto; - statWellDto.Sections = CalcSectionsStats(wellOperations); - statWellDto.Total = GetStatTotal(wellOperations, well.IdState); + var timezoneOffsetH = wellService.GetTimezone(well.Id).Hours; + statWellDto.Sections = CalcSectionsStats(wellOperations, timezoneOffsetH); + statWellDto.Total = GetStatTotal(wellOperations, well.IdState, timezoneOffsetH); return statWellDto; } - private IEnumerable CalcSectionsStats(IEnumerable operations) + private IEnumerable CalcSectionsStats(IEnumerable operations, double timezoneOffsetH) { var sectionTypeIds = operations .Select(o => o.IdWellSectionType) @@ -211,8 +212,8 @@ namespace AsbCloudInfrastructure.Services.WellOperationService { Id = id, Caption = sectionType.Caption, - Plan = CalcSectionStat(operationsPlan, id), - Fact = CalcSectionStat(operationsFact, id), + Plan = CalcSectionStat(operationsPlan, id, timezoneOffsetH), + Fact = CalcSectionStat(operationsFact, id, timezoneOffsetH), }; sections.Add(section); } @@ -220,42 +221,42 @@ namespace AsbCloudInfrastructure.Services.WellOperationService } private static PlanFactBase GetStatTotal(IEnumerable operations, - int idWellState) + int idWellState, double timezoneOffsetH) { var operationsPlan = operations.Where(o => o.IdType == idOperationTypePlan); var operationsFact = operations.Where(o => o.IdType == idOperationTypeFact); - var factEnd = CalcStat(operationsFact); + var factEnd = CalcStat(operationsFact, timezoneOffsetH); if (idWellState != 2) factEnd.End = null; var section = new PlanFactBase { - Plan = CalcStat(operationsPlan), + Plan = CalcStat(operationsPlan, timezoneOffsetH), Fact = factEnd, }; return section; } - private static StatOperationsDto CalcSectionStat(IEnumerable operations, int idSectionType) + private static StatOperationsDto CalcSectionStat(IEnumerable operations, int idSectionType, double timezoneOffsetH) { var sectionOperations = operations .Where(o => o.IdWellSectionType == idSectionType) .OrderBy(o => o.DateStart) .ThenBy(o => o.DepthStart); - return CalcStat(sectionOperations); + return CalcStat(sectionOperations, timezoneOffsetH); } - private static StatOperationsDto CalcStat(IEnumerable operations) + private static StatOperationsDto CalcStat(IEnumerable operations, double timezoneOffsetH) { if (!operations.Any()) return null; - var races = GetCompleteRaces(operations); + var races = GetCompleteRaces(operations, timezoneOffsetH); var section = new StatOperationsDto { - Start = operations.FirstOrDefault()?.DateStart, - End = operations.Max(o => o.DateStart.AddHours(o.DurationHours)), + Start = operations.FirstOrDefault()?.DateStart.ToRemoteDateTime(timezoneOffsetH), + End = operations.Max(o => o.DateStart.ToRemoteDateTime(timezoneOffsetH).AddHours(o.DurationHours)), WellDepthStart = operations.Min(o => o.DepthStart), WellDepthEnd = operations.Max(o => o.DepthStart), Rop = CalcROP(operations), @@ -297,7 +298,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService return depth / (dHours + double.Epsilon); } - private static IEnumerable GetCompleteRaces(IEnumerable operations) + private static IEnumerable GetCompleteRaces(IEnumerable operations, double timezoneOffsetH) { var races = new List(); var iterator = operations @@ -309,7 +310,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService { var race = new Race { - StartDate = iterator.Current.DateStart.AddHours(iterator.Current.DurationHours), + StartDate = iterator.Current.DateStart.ToRemoteDateTime(timezoneOffsetH).AddHours(iterator.Current.DurationHours), StartWellDepth = iterator.Current.DepthStart, Operations = new List(10), }; @@ -321,7 +322,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService } if (iterator.Current.IdCategory == idOperationBhaDisassembly) { - race.EndDate = iterator.Current.DateStart; + race.EndDate = iterator.Current.DateStart.ToRemoteDateTime(timezoneOffsetH); race.EndWellDepth = iterator.Current.DepthStart; races.Add(race); break; @@ -412,6 +413,8 @@ namespace AsbCloudInfrastructure.Services.WellOperationService var merged = MergeArraysBySections(sectionsIds, wellOperationsPlan, wellOperationsFact); var tvd = new List>(merged.Count); + var firstPoint = merged.First(); + var dateStart = firstPoint.Item1?.DateStart ?? firstPoint.Item2.DateStart; int iLastMatch = 0; int iLastFact = 0; for (int i = 0; i < merged.Count; i++) @@ -425,6 +428,12 @@ namespace AsbCloudInfrastructure.Services.WellOperationService Predict = null, }; + if(planFactPredict.Plan is not null) + planFactPredict.Plan.Day = (planFactPredict.Plan.DateStart - dateStart).TotalDays; + + if (planFactPredict.Fact is not null) + planFactPredict.Fact.Day = (planFactPredict.Fact.DateStart - dateStart).TotalDays; + tvd.Add(planFactPredict); if ((item.Item1 is not null) && (item.Item2 is not null)) iLastMatch = i; @@ -450,7 +459,9 @@ namespace AsbCloudInfrastructure.Services.WellOperationService tvd[i].Predict = merged[i].Item1.Adapt(); tvd[i].Predict.IdType = 2; tvd[i].Predict.DateStart = tvd[i].Predict.DateStart + startOffset; + tvd[i].Predict.Day = (tvd[i].Predict.DateStart - dateStart).TotalDays; } + return tvd; } diff --git a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportService.cs b/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportService.cs index 60507aa8..5576323c 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportService.cs @@ -35,7 +35,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService private static readonly TimeSpan drillingDurationLimitMax = TimeSpan.FromDays(366); private readonly IAsbCloudDbContext db; - + private readonly IWellService wellService; private List categories = null; public List Categories { @@ -65,9 +65,10 @@ namespace AsbCloudInfrastructure.Services.WellOperationService } } - public WellOperationImportService(IAsbCloudDbContext db) + public WellOperationImportService(IAsbCloudDbContext db, IWellService wellService) { this.db = db; + this.wellService = wellService; } public void Import(int idWell, Stream stream, bool deleteWellOperationsBeforeImport = false) @@ -93,7 +94,9 @@ namespace AsbCloudInfrastructure.Services.WellOperationService if (!operations.Any()) return null; - return MakeExelFileStream(operations); + var timezone = wellService.GetTimezone(idWell); + + return MakeExelFileStream(operations, timezone.Hours); } public Stream GetExcelTemplateStream() { @@ -102,12 +105,12 @@ namespace AsbCloudInfrastructure.Services.WellOperationService return stream; } - private Stream MakeExelFileStream(IEnumerable operations) + private Stream MakeExelFileStream(IEnumerable operations, double timezoneOffset) { using Stream ecxelTemplateStream = GetExcelTemplateStream(); using var workbook = new XLWorkbook(ecxelTemplateStream, XLEventTracking.Disabled); - AddOperationsToWorkbook(workbook, operations); + AddOperationsToWorkbook(workbook, operations, timezoneOffset); MemoryStream memoryStream = new MemoryStream(); workbook.SaveAs(memoryStream, new SaveOptions { }); @@ -115,53 +118,61 @@ namespace AsbCloudInfrastructure.Services.WellOperationService return memoryStream; } - private static void AddOperationsToWorkbook(XLWorkbook workbook, IEnumerable operations) + private static void AddOperationsToWorkbook(XLWorkbook workbook, IEnumerable operations, double timezoneOffset) { var planOperations = operations.Where(o => o.IdType == 0); if (planOperations.Any()) { var sheetPlan = workbook.Worksheets.FirstOrDefault(ws => ws.Name == sheetNamePlan); - AddOperationsToSheet(sheetPlan, planOperations); + AddOperationsToSheet(sheetPlan, planOperations, timezoneOffset); } var factOperations = operations.Where(o => o.IdType == 1); if (factOperations.Any()) { var sheetFact = workbook.Worksheets.FirstOrDefault(ws => ws.Name == sheetNameFact); - AddOperationsToSheet(sheetFact, factOperations); + AddOperationsToSheet(sheetFact, factOperations, timezoneOffset); } } - private static void AddOperationsToSheet(IXLWorksheet sheet, IEnumerable operations) + private static void AddOperationsToSheet(IXLWorksheet sheet, IEnumerable operations, double timezoneOffset) { var operationsList = operations.ToList(); for (int i = 0; i < operationsList.Count; i++) { var row = sheet.Row(1 + i + headerRowsCount); - AddOperationToRow(row, operationsList[i]); + AddOperationToRow(row, operationsList[i], timezoneOffset); } } - private static void AddOperationToRow(IXLRow row, WellOperation operation) + private static void AddOperationToRow(IXLRow row, WellOperation operation, double timezoneOffset) { row.Cell(columnSection).Value = operation.WellSectionType?.Caption; row.Cell(columnCategory).Value = operation.OperationCategory?.Name; row.Cell(columnCategoryInfo).Value = operation.CategoryInfo; row.Cell(columnDepthStart).Value = operation.DepthStart; row.Cell(columnDepthEnd).Value = operation.DepthEnd; - row.Cell(columnDate).Value = operation.DateStart; + row.Cell(columnDate).Value = operation.DateStart.ToRemoteDateTime(timezoneOffset); row.Cell(columnDuration).Value = operation.DurationHours; row.Cell(columnComment).Value = operation.Comment; } private void SaveOperations(int idWell, IEnumerable operations, bool deleteWellOperationsBeforeImport = false) { + var timezone = wellService.GetTimezone(idWell); + var transaction = db.Database.BeginTransaction(); try { if (deleteWellOperationsBeforeImport) db.WellOperations.RemoveRange(db.WellOperations.Where(o => o.IdWell == idWell)); - db.WellOperations.AddRange(operations.Adapt()); + var entities = operations.Select(o => { + var entity = o.Adapt(); + entity.IdWell = idWell; + entity.DateStart = o.DateStart.ToUtcDateTimeOffset(timezone.Hours); + return entity; + }); + db.WellOperations.AddRange(entities); db.SaveChanges(); transaction.Commit(); } @@ -204,7 +215,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService { if (sheet.RangeUsed().RangeAddress.LastAddress.ColumnNumber < 7) - throw new FileFormatException($"Лист {sheet.Name} содержит меньшее количество столбцев."); + throw new FileFormatException($"Лист {sheet.Name} содержит меньшее количество столбцов."); var count = sheet.RowsUsed().Count() - headerRowsCount; diff --git a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportTemplate.xlsx index 31b8273e..394321d5 100644 Binary files a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportTemplate.xlsx and b/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportTemplate.xlsx differ diff --git a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationService.cs b/AsbCloudInfrastructure/Services/WellOperationService/WellOperationService.cs index 9ac6334e..6de4a701 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/WellOperationService.cs @@ -15,12 +15,14 @@ namespace AsbCloudInfrastructure.Services.WellOperationService public class WellOperationService : IWellOperationService { private readonly IAsbCloudDbContext db; + private readonly IWellService wellService; private readonly CacheTable cachedOperationCategories; private readonly CacheTable cachedSectionTypes; - public WellOperationService(IAsbCloudDbContext db, CacheDb cache) + public WellOperationService(IAsbCloudDbContext db, CacheDb cache, IWellService wellService) { this.db = db; + this.wellService = wellService; cachedOperationCategories = cache.GetCachedTable((DbContext)db); cachedSectionTypes = cache.GetCachedTable((DbContext)db); } @@ -31,7 +33,6 @@ namespace AsbCloudInfrastructure.Services.WellOperationService public IEnumerable GetCategories() { var operationTypes = cachedOperationCategories - //.Where(oc => oc.Code > 999) .Distinct().OrderBy(o => o.Name); var result = operationTypes.Adapt(); @@ -51,6 +52,8 @@ namespace AsbCloudInfrastructure.Services.WellOperationService int take = 32, CancellationToken token = default) { + var timezone = wellService.GetTimezone(idWell); + var query = db.WellOperations .Include(s => s.WellSectionType) .Include(s => s.OperationCategory) @@ -72,10 +75,17 @@ namespace AsbCloudInfrastructure.Services.WellOperationService query = query.Where(e => e.DepthEnd <= maxDepth); if (begin != default) - query = query.Where(e => e.DateStart >= begin); + { + var beginOffset = begin.ToUtcDateTimeOffset(timezone.Hours); + query = query.Where(e => e.DateStart >= beginOffset); + } if (end != default) - query = query.Where(e => e.DateStart <= end); + { + + var endOffset = end.ToUtcDateTimeOffset(timezone.Hours); + query = query.Where(e => e.DateStart <= endOffset); + } var result = new PaginationContainer { @@ -95,11 +105,12 @@ namespace AsbCloudInfrastructure.Services.WellOperationService var entities = await query.Take(take).AsNoTracking() .ToListAsync(token).ConfigureAwait(false); - foreach (var item in entities) + foreach (var entity in entities) { - var dto = item.Adapt(); - dto.WellSectionTypeName = item.WellSectionType.Caption; - dto.CategoryName = item.OperationCategory.Name; + var dto = entity.Adapt(); + dto.WellSectionTypeName = entity.WellSectionType.Caption; + dto.DateStart = entity.DateStart.ToRemoteDateTime(timezone.Hours); + dto.CategoryName = entity.OperationCategory.Name; result.Items.Add(dto); } @@ -109,6 +120,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService public async Task GetAsync(int id, CancellationToken token = default) { + var entity = await db.WellOperations .Include(s => s.WellSectionType) .Include(s => s.OperationCategory) @@ -118,8 +130,11 @@ namespace AsbCloudInfrastructure.Services.WellOperationService if (entity is null) return null; + var timezone = wellService.GetTimezone(entity.IdWell); + var dto = entity.Adapt(); dto.WellSectionTypeName = entity.WellSectionType.Caption; + dto.DateStart = entity.DateStart.ToRemoteDateTime(timezone.Hours); dto.CategoryName = entity.OperationCategory.Name; return dto; } @@ -128,10 +143,12 @@ namespace AsbCloudInfrastructure.Services.WellOperationService IEnumerable wellOperationDtos, CancellationToken token = default) { - foreach (var operationDto in wellOperationDtos) + var timezone = wellService.GetTimezone(idWell); + foreach (var dto in wellOperationDtos) { - var entity = operationDto.Adapt(); + var entity = dto.Adapt(); entity.Id = default; + entity.DateStart = dto.DateStart.ToUtcDateTimeOffset(timezone.Hours); entity.IdWell = idWell; db.WellOperations.Add(entity); } @@ -141,11 +158,12 @@ namespace AsbCloudInfrastructure.Services.WellOperationService } public async Task UpdateAsync(int idWell, int idOperation, - WellOperationDto item, CancellationToken token = default) + WellOperationDto dto, CancellationToken token = default) { - var entity = item.Adapt(); + var timezone = wellService.GetTimezone(idWell); + var entity = dto.Adapt(); entity.Id = idOperation; - entity.IdWell = idWell; + entity.DateStart = dto.DateStart.ToUtcDateTimeOffset(timezone.Hours); db.WellOperations.Update(entity); return await db.SaveChangesAsync(token) .ConfigureAwait(false); diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index c459a277..14d5c2b7 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -27,11 +27,15 @@ namespace AsbCloudInfrastructure.Services private readonly ITelemetryService telemetryService; private readonly CacheTable cacheRelationCompaniesWells; private readonly CacheTable cacheCompanyWellTypes; + private readonly ITimezoneService timezoneService; - public WellService(IAsbCloudDbContext db, CacheDb cacheDb, ITelemetryService telemetryService) + public ITelemetryService TelemetryService => telemetryService; + + public WellService(IAsbCloudDbContext db, CacheDb cacheDb, ITelemetryService telemetryService, ITimezoneService timezoneService) :base(db, cacheDb) { this.telemetryService = telemetryService; + this.timezoneService = timezoneService; cacheRelationCompaniesWells = cacheDb.GetCachedTable((AsbCloudDbContext)db, nameof(RelationCompanyWell.Company), nameof(RelationCompanyWell.Well)); cacheCompanyWellTypes = cacheDb.GetCachedTable((AsbCloudDbContext)db); Includes.Add($"{nameof(Well.Cluster)}.{nameof(Cluster.Deposit)}"); @@ -40,12 +44,12 @@ namespace AsbCloudInfrastructure.Services Includes.Add(nameof(Well.WellType)); } - public DateTime GetLastTelemetryDate(int idWell) + public DateTimeOffset GetLastTelemetryDate(int idWell) { var well = Cache.FirstOrDefault(w => w.Id == idWell); if (well?.IdTelemetry is null) - return DateTime.MinValue; + return DateTimeOffset.MinValue; var lastTelemetryDate = telemetryService.GetLastTelemetryDate((int)well.IdTelemetry); return lastTelemetryDate; @@ -57,7 +61,7 @@ namespace AsbCloudInfrastructure.Services .WhereAsync(r => r.IdCompany == idCompany, token); var wellsIds = relations.Select(r => r.IdWell); - var wells = await Cache.WhereAsync(w => wellsIds.Contains(w.Id)); + var wells = await Cache.WhereAsync(w => wellsIds.Contains(w.Id), token); var dtos = wells.Select(Convert); return dtos; @@ -155,7 +159,7 @@ namespace AsbCloudInfrastructure.Services { 1 => "В работе", 2 => "Завершена", - _ => "Незвестно", + _ => "Неизвестно", }; } @@ -176,21 +180,31 @@ namespace AsbCloudInfrastructure.Services protected override Well Convert(WellDto dto) { var entity = dto.Adapt(typeAdapterConfig); - //dto.WellType = entity.WellType?.Caption; - //dto.Cluster = entity.Cluster?.Caption; - //dto.Deposit = entity.Cluster?.Deposit?.Caption; - //dto.LastTelemetryDate = GetLastTelemetryDate(entity.Id); - //dto.Companies = GetCompanies(entity.Id); + + entity.IdTelemetry = entity.IdTelemetry ?? dto.IdTelemetry ?? dto.Telemetry?.Id; + + if (dto.Timezone is null) + if (TryGetTimezone(dto.Id, out var timezoneDto)) + entity.Timezone = timezoneDto.Adapt(); + return entity; } protected override WellDto Convert(Well entity) { + if (entity is null) + return null; + var dto = base.Convert(entity); + + if (entity.Timezone is null) + if(TryGetTimezone(entity, out var timezone)) + dto.Timezone = timezone; + dto.WellType = entity.WellType?.Caption; dto.Cluster = entity.Cluster?.Caption; dto.Deposit = entity.Cluster?.Deposit?.Caption; - dto.LastTelemetryDate = GetLastTelemetryDate(entity.Id); + dto.LastTelemetryDate = GetLastTelemetryDate(entity.Id).DateTime; dto.Companies = GetCompanies(entity.Id); return dto; } @@ -202,5 +216,145 @@ namespace AsbCloudInfrastructure.Services ?? cacheCompanyWellTypes.FirstOrDefault(c => c.Id == entity.IdCompanyType).Caption; return dto; } + + public void EnshureTimezonesIsSet() + { + var wells = Cache.Where(w => w.Timezone is null).ToList(); + foreach (var well in wells) + { + if (TryGetTimezone(well, out var timezone)) + well.Timezone = timezone.Adapt(); + else + well.Timezone = new SimpleTimezone + { + Hours = 5, + IsOverride = false, + TimeZoneId = "Assumed", + }; + } + + var wellsWithTz = wells.Where(w => w.Timezone is not null); + if (wellsWithTz.Any()) + { + var adaptedWells = wellsWithTz.Adapt().Select(Convert); + Cache.Upsert(adaptedWells); + } + } + + private bool TryGetTimezone(int idWell, out SimpleTimezoneDto timezone) + { + timezone = null; + try + { + timezone = GetTimezone(idWell); + return timezone is not null; + } + catch + { + return false; + } + } + + public SimpleTimezoneDto GetTimezone(int idWell) + { + var well = Cache.FirstOrDefault(c => c.Id == idWell); + if (well == null) + throw new ArgumentException($"idWell: {idWell} does not exist.", nameof(idWell)); + return GetTimezone(well); + } + + private bool TryGetTimezone(Well well, out SimpleTimezoneDto timezone) + { + timezone = null; + try + { + timezone = GetTimezone(well); + return timezone is not null; + } + catch + { + return false; + } + } + + private SimpleTimezoneDto GetTimezone(Well well) + { + if (well == null) + throw new ArgumentNullException(nameof(well)); + + if (well.Timezone is not null) + return well.Timezone.Adapt(); + + if (well.Telemetry is not null) + { + var timezone = telemetryService.GetTimezone(well.Telemetry.Id); + if (timezone is not null) + { + well.Timezone = timezone.Adapt(); + return timezone; + } + } + + var point = GetCoordinates(well); + if (point is not null) + { + if (point.Timezone is not null) + { + well.Timezone = point.Timezone; + return point.Timezone.Adapt(); + } + + if (point.Latitude is not null & point.Longitude is not null) + { + var timezone = timezoneService.GetByCoordinates((double)point.Latitude, (double)point.Longitude); + if (timezone is not null) + { + well.Timezone = timezone.Adapt(); + return timezone; + } + } + } + + throw new Exception($"Can't find timezone for well {well.Caption} id: {well.Id}"); + } + + private static AsbCloudDb.Model.IMapPoint GetCoordinates(Well well) + { + if(well is null) + throw new ArgumentNullException(nameof(well)); + + if (well.Latitude is not null & well.Longitude is not null) + return well; + + if (well.Cluster is null) + throw new Exception($"Can't find coordinates of well {well.Caption} id: {well.Id}"); + + var cluster = well.Cluster; + + if (cluster.Latitude is not null & cluster.Longitude is not null) + return cluster; + + if (cluster.Deposit is null) + throw new Exception($"Can't find coordinates of well by cluster {cluster.Caption} id: {cluster.Id}"); + + var deposit = cluster.Deposit; + + if (deposit.Latitude is not null & deposit.Longitude is not null) + return deposit; + + throw new Exception($"Can't find coordinates of well by deposit {deposit.Caption} id: {deposit.Id}"); + } + + public DatesRangeDto GetDatesRange(int idWell) + { + var well = Cache.FirstOrDefault(w => w.Id == idWell); + if (well is null) + throw new Exception($"Well id: {idWell} does not exist."); + + if (well.IdTelemetry is null) + throw new Exception($"Well id: {idWell} does not contain telemetry."); + + return telemetryService.GetDatesRange((int)well.IdTelemetry); + } } } diff --git a/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj b/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj index 2147f08c..26215a1a 100644 --- a/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj +++ b/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 false @@ -14,10 +14,6 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - diff --git a/AsbCloudWebApi.Tests/ControllersTests/AnalyticsControllerTests.cs b/AsbCloudWebApi.Tests/ControllersTests/AnalyticsControllerTests.cs index 1b82bd74..7aac3397 100644 --- a/AsbCloudWebApi.Tests/ControllersTests/AnalyticsControllerTests.cs +++ b/AsbCloudWebApi.Tests/ControllersTests/AnalyticsControllerTests.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; using System.Security.Claims; using System.Threading; +using System.Threading.Tasks; using Xunit; namespace AsbCloudWebApi.Tests.ControllersTests @@ -38,18 +39,13 @@ namespace AsbCloudWebApi.Tests.ControllersTests wellService.Setup(s => s.IsCompanyInvolvedInWell(It.IsAny(), It.IsAny())) .Returns(true); + wellService.Setup(s => s.IsCompanyInvolvedInWellAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(Task.FromResult(true)); + controller = new TelemetryAnalyticsController(analyticsService.Object, wellService.Object); - var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[] - { - new Claim("idCompany", "1"), - }, "mock")); - - controller.ControllerContext = new ControllerContext() - { - HttpContext = new DefaultHttpContext() { User = user } - }; + controller.AddUser(); } [Fact] @@ -149,8 +145,8 @@ namespace AsbCloudWebApi.Tests.ControllersTests { var emptyAnalyticsService = new Mock(); - emptyAnalyticsService.Setup(s => s.GetWellDepthToDayAsync(It.IsAny(), CancellationToken.None).Result) - .Returns(value: null); + emptyAnalyticsService.Setup(s => s.GetWellDepthToDayAsync(It.IsAny(), CancellationToken.None)) + .Returns(Task.FromResult>(null)); var newControllerInstance = new TelemetryAnalyticsController(emptyAnalyticsService.Object, wellService.Object); diff --git a/AsbCloudWebApi.Tests/ControllersTests/ControllerExtentions.cs b/AsbCloudWebApi.Tests/ControllersTests/ControllerExtentions.cs new file mode 100644 index 00000000..450c145f --- /dev/null +++ b/AsbCloudWebApi.Tests/ControllersTests/ControllerExtentions.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudWebApi.Tests.ControllersTests +{ + static class ControllerExtentions + { + public static void AddUser(this ControllerBase controller) + { + var claims = new Claim[] { new Claim("idCompany", "1") }; + controller.AddUser(claims); + } + + public static void AddUser(this ControllerBase controller, Claim[] claims) + { + var identity = new ClaimsIdentity(claims, "mock"); + var user = new ClaimsPrincipal(identity); + + controller.ControllerContext = new ControllerContext() + { + HttpContext = new DefaultHttpContext() { User = user } + }; + } + } +} diff --git a/AsbCloudWebApi.Tests/ControllersTests/TelemetryDataSaubControllerTests.cs b/AsbCloudWebApi.Tests/ControllersTests/TelemetryDataSaubControllerTests.cs new file mode 100644 index 00000000..60a6db17 --- /dev/null +++ b/AsbCloudWebApi.Tests/ControllersTests/TelemetryDataSaubControllerTests.cs @@ -0,0 +1,35 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using AsbCloudWebApi.Controllers; +using AsbCloudWebApi.SignalR; +using Microsoft.AspNetCore.SignalR; +using Microsoft.EntityFrameworkCore; +using Moq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace AsbCloudWebApi.Tests.ControllersTests +{ + public class TelemetryDataSaubControllerTests + { + private readonly Mock telemetryService; + private readonly Mock> telemetryDataService; + private readonly Mock wellService; + private readonly Mock> telemetryHubContext; + + public TelemetryDataSaubControllerTests() + { + telemetryService = new Mock(); + telemetryDataService = new Mock>(); + wellService = new Mock(); + telemetryHubContext = new Mock>(); + } + + + } +} diff --git a/AsbCloudWebApi.Tests/ServicesTests/TelemetryDataSaubServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/TelemetryDataSaubServiceTest.cs new file mode 100644 index 00000000..63638083 --- /dev/null +++ b/AsbCloudWebApi.Tests/ServicesTests/TelemetryDataSaubServiceTest.cs @@ -0,0 +1,87 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services; +using AsbCloudInfrastructure.Services.Cache; +using Moq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace AsbCloudWebApi.Tests.ServicesTests +{ + public class TelemetryDataSaubServiceTest + { + private readonly Mock telemetryTracker; + private readonly Mock timezoneService; + private readonly SimpleTimezoneDto timezone; + private readonly AsbCloudDbContext context; + private readonly CacheDb cacheDb; + private readonly TelemetryService telemetryService; + + private readonly DateTime drillingStartDate; + private readonly string uuid; + public TelemetryDataSaubServiceTest() + { + timezone = new() { Hours = 7 }; + drillingStartDate = new DateTime(2022, 1, 1, 0, 0, 0, DateTimeKind.Unspecified); + uuid = drillingStartDate.ToString("yyyyMMdd_HHmmssfff"); + + AsbCloudInfrastructure.DependencyInjection.MapsterSetup(); + + telemetryTracker = new Mock(); + timezoneService = new Mock(); + timezoneService.Setup(s => s.GetByCoordinatesAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(Task.FromResult(timezone)); + timezoneService.Setup(s => s.GetByCoordinates(It.IsAny(), It.IsAny())) + .Returns(timezone); + + context = TestHelpter.MakeTestContext(); + cacheDb = new CacheDb(); + telemetryService = new TelemetryService(context, telemetryTracker.Object, timezoneService.Object, cacheDb); + + var info = new TelemetryInfoDto + { + TimeZoneOffsetTotalHours = timezone.Hours, + DrillingStartDate = drillingStartDate, + }; + telemetryService.UpdateInfoAsync(uuid, info, CancellationToken.None).Wait(); + + } + ~TelemetryDataSaubServiceTest() + { + var ts = context.Telemetries.Where(t => t.RemoteUid == uuid); + context.Telemetries.RemoveRange(ts); + context.SaveChanges(); + context?.Dispose(); + } + + [Fact] + public async Task UpdateDataAsync() + { + // Arrange + var telemetryDataSaubService = new TelemetryDataSaubService(context, telemetryService, cacheDb); + + var now = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(timezone.Hours)).DateTime; + var tuser = "Завулон"; + var newData = new List + { + new TelemetryDataSaubDto{ + Date = now, + AxialLoad = 1, + MseState = 1, + User = tuser, + } + }; + + // act + var affected = await telemetryDataSaubService.UpdateDataAsync(uuid, newData, CancellationToken.None); + + // assert + Assert.Equal(1, affected); + } + } +} diff --git a/AsbCloudWebApi.Tests/ServicesTests/UserRoleServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/UserRoleServiceTest.cs new file mode 100644 index 00000000..ea3095fb --- /dev/null +++ b/AsbCloudWebApi.Tests/ServicesTests/UserRoleServiceTest.cs @@ -0,0 +1,187 @@ +using AsbCloudApp.Data; +using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services; +using AsbCloudInfrastructure.Services.Cache; +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace AsbCloudWebApi.Tests.ServicesTests +{ + public class UserRoleServiceTest + { + private readonly AsbCloudDbContext context; + private readonly CacheDb cacheDb; + + private readonly List roles = new() { + new UserRole { Id = 1_000_001, Caption = "role 1 level 0" }, + new UserRole { Id = 1_000_002, Caption = "role 2 level 1" }, + new UserRole { Id = 1_000_003, Caption = "role 3 level 1" }, + new UserRole { Id = 1_000_004, Caption = "role 4 level 2" }, + }; + + private readonly List relationRoleRole = new() + { + new RelationUserRoleUserRole { Id = 1_000_002, IdInclude = 1_000_001 }, + new RelationUserRoleUserRole { Id = 1_000_003, IdInclude = 1_000_001 }, + new RelationUserRoleUserRole { Id = 1_000_004, IdInclude = 1_000_002 }, + new RelationUserRoleUserRole { Id = 1_000_004, IdInclude = 1_000_003 }, + }; + + private readonly List permissions = new() + { + new Permission { Id = 2_000_001, Name = "permission 1" }, + new Permission { Id = 2_000_002, Name = "permission 2" }, + new Permission { Id = 2_000_003, Name = "permission 3" }, + new Permission { Id = 2_000_004, Name = "permission 4" }, + }; + + private readonly List relationRolePermission = new() + { + new RelationUserRolePermission { IdUserRole = 1_000_001, IdPermission = 2_000_001 }, + new RelationUserRolePermission { IdUserRole = 1_000_002, IdPermission = 2_000_002 }, + new RelationUserRolePermission { IdUserRole = 1_000_003, IdPermission = 2_000_003 }, + new RelationUserRolePermission { IdUserRole = 1_000_004, IdPermission = 2_000_004 }, + }; + + public UserRoleServiceTest() + { + cacheDb = new CacheDb(); + context = TestHelpter.MakeTestContext(); + context.UserRoles.RemoveRange(roles); + context.Permissions.RemoveRange(permissions); + context.SaveChanges(); + context.UserRoles.AddRange(roles); + context.Permissions.AddRange(permissions); + context.SaveChanges(); + context.RelationUserRoleUserRoles.AddRange(relationRoleRole); + context.RelationUserRolePermissions.AddRange(relationRolePermission); + context.SaveChanges(); + } + + ~UserRoleServiceTest(){ + context.UserRoles.RemoveRange(roles); + context.Permissions.RemoveRange(permissions); + context.RelationUserRoleUserRoles.RemoveRange(relationRoleRole); + context.RelationUserRolePermissions.RemoveRange(relationRolePermission); + context.SaveChanges(); + context.Dispose(); + } + + [Fact] + public void GetNestedById_return_4_items() + { + var service = new UserRoleService(context, cacheDb); + var nestedRoles = service.GetNestedById(1_000_004); + Assert.Equal(roles.Count, nestedRoles.Count()); + } + + [Fact] + public void HasPermission_return_true() + { + var service = new UserRoleService(context, cacheDb); + var result = service.HasPermission(new int[] { 1_000_004 }, "permission 1"); + Assert.True(result); + } + + [Fact] + public void HasPermission_return_false() + { + var service = new UserRoleService(context, cacheDb); + var result = service.HasPermission(new int[] { 1_000_003 }, "permission 2"); + Assert.False(result); + } + + [Fact] + public async Task InsertAsync_returns_id() + { + var service = new UserRoleService(context, cacheDb); + var newRole = new UserRoleDto + { + Caption = "new role", + IdType = 0, + }; + var id = await service.InsertAsync(newRole, CancellationToken.None ); + Assert.NotEqual(0, id); + } + + [Fact] + public async Task InsertAsync_updates_relation_to_permission() + { + var service = new UserRoleService(context, cacheDb); + var newRole = new UserRoleDto + { + Caption = "new role", + IdType = 0, + Permissions = new[] { new PermissionDto{ Id = 2_000_001 } }, + }; + var id = await service.InsertAsync(newRole, CancellationToken.None); + var entity = await service.GetAsync(id); + Assert.Equal(newRole.Permissions.Count(), entity.Permissions.Count()); + } + + [Fact] + public async Task InsertAsync_updates_relation_to_role() + { + var service = new UserRoleService(context, cacheDb); + var newRole = new UserRoleDto + { + Caption = "new role", + IdType = 0, + Roles = new [] { new UserRoleDto { Id = 1_000_001 } } + }; + var id = await service.InsertAsync(newRole, CancellationToken.None); + var entity = await service.GetAsync(id); + Assert.Equal(newRole.Roles.Count, entity.Roles.Count); + } + + [Fact] + public async Task UpdateAsync_returns_id() + { + var service = new UserRoleService(context, cacheDb); + const int updateId = 1_000_002; + var modRole = new UserRoleDto + { + Id = updateId, + Caption = "role 2 level 1" + }; + var id = await service.UpdateAsync(1_000_002, modRole, CancellationToken.None); + Assert.Equal(updateId, id); + } + + [Fact] + public async Task UpdateAsync_updates_relation_to_permission() + { + var service = new UserRoleService(context, cacheDb); + const int updateId = 1_000_002; + var modRole = new UserRoleDto + { + Id = updateId, + Caption = "role 2 level 1", + Permissions = new[] { new PermissionDto { Id = 2_000_001 } }, + }; + var id = await service.UpdateAsync(1_000_002, modRole, CancellationToken.None); + var entity = await service.GetAsync(id); + Assert.Equal(modRole.Permissions.Count(), entity.Permissions.Count()); + } + + [Fact] + public async Task UpdateAsync_updates_relation_to_role() + { + var service = new UserRoleService(context, cacheDb); + const int updateId = 1_000_002; + var modRole = new UserRoleDto + { + Id = updateId, + Caption = "role 2 level 1", + Roles = new[] { new UserRoleDto { Id = 1_000_001 } } + }; + var id = await service.UpdateAsync(1_000_002, modRole, CancellationToken.None); + var entity = await service.GetAsync(id); + Assert.Equal(modRole.Roles.Count(), entity.Roles.Count()); + } + } +} diff --git a/AsbCloudWebApi.Tests/TestHelpter.cs b/AsbCloudWebApi.Tests/TestHelpter.cs new file mode 100644 index 00000000..7cf359bb --- /dev/null +++ b/AsbCloudWebApi.Tests/TestHelpter.cs @@ -0,0 +1,22 @@ +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudWebApi.Tests +{ + internal static class TestHelpter + { + public static AsbCloudDbContext MakeTestContext() + { + var options = new DbContextOptionsBuilder() + .UseNpgsql("Host=localhost;Database=tests;Username=postgres;Password=q;Persist Security Info=True;Include Error Detail=True") + .Options; + var context = new AsbCloudDbContext(options); + return context; + } + } +} diff --git a/AsbCloudWebApi/AsbCloudWebApi.csproj b/AsbCloudWebApi/AsbCloudWebApi.csproj index 6b72feca..8d358003 100644 --- a/AsbCloudWebApi/AsbCloudWebApi.csproj +++ b/AsbCloudWebApi/AsbCloudWebApi.csproj @@ -1,12 +1,19 @@  - net5.0 + net6.0 true $(NoWarn);1591 80899ceb-210f-4f19-ac56-aa90a5d666d4 + + + + + + + @@ -19,8 +26,8 @@ - - + + @@ -33,13 +40,21 @@ + + PreserveNewest + + + PreserveNewest + PreserveNewest - - - - + + PreserveNewest + + + PreserveNewest + diff --git a/AsbCloudWebApi/Controllers/AdminCompanyTypeController.cs b/AsbCloudWebApi/Controllers/AdminCompanyTypeController.cs new file mode 100644 index 00000000..a2c3bb81 --- /dev/null +++ b/AsbCloudWebApi/Controllers/AdminCompanyTypeController.cs @@ -0,0 +1,17 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace AsbCloudWebApi.Controllers +{ + [Route("api/admin/companyType")] + [ApiController] + [Authorize] + public class AdminCompanyTypeController : CrudController> + { + public AdminCompanyTypeController(ICrudService service) + : base(service) + { } + } +} \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/AdminPermissionController.cs b/AsbCloudWebApi/Controllers/AdminPermissionController.cs index a7633f58..8a8d57ab 100644 --- a/AsbCloudWebApi/Controllers/AdminPermissionController.cs +++ b/AsbCloudWebApi/Controllers/AdminPermissionController.cs @@ -1,10 +1,11 @@ -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; using AsbCloudApp.Data; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Routing; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; namespace AsbCloudWebApi.Controllers { @@ -13,8 +14,33 @@ namespace AsbCloudWebApi.Controllers [Authorize] public class AdminPermissionController : CrudController> { - public AdminPermissionController(ICrudService permissionService) - :base(permissionService) + public AdminPermissionController(ICrudService service) + :base(service) {} + + [HttpGet("Autogenerated")] + public IActionResult GetAutogenerated() + { + var controllers = Assembly.GetExecutingAssembly().GetTypes(). + Where(type => typeof(ControllerBase).IsAssignableFrom(type) && !type.IsAbstract) + .ToList(); + + var permissions = new SortedSet(); + foreach (var controller in controllers) + { + var methods = controller.GetMethods().Where(m => m.IsPublic); + var controllerName = controller.Name.Replace("Controller", ""); + foreach (var method in methods) + { + var httpMethod = method.GetCustomAttribute()?.HttpMethods?.First(); + if (string.IsNullOrEmpty(httpMethod)) + continue; + permissions.Add($"{controllerName}.{httpMethod.ToLower()}"); + } + } + + return Ok(permissions); + + } } } \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/AdminWellController.cs b/AsbCloudWebApi/Controllers/AdminWellController.cs index 94a5739b..f1a211ef 100644 --- a/AsbCloudWebApi/Controllers/AdminWellController.cs +++ b/AsbCloudWebApi/Controllers/AdminWellController.cs @@ -13,8 +13,14 @@ namespace AsbCloudWebApi.Controllers public AdminWellController(IWellService service) :base(service) { - service.Includes.Add("Telemetry"); + service.Includes.Add("Telemetry"); } + [HttpPost("EnshureTimezonesIsSet")] + public IActionResult EnsureTimestamps() + { + ((IWellService)service).EnshureTimezonesIsSet(); + return Ok(); + } } } diff --git a/AsbCloudWebApi/Controllers/DrillFlowChartController.cs b/AsbCloudWebApi/Controllers/DrillFlowChartController.cs index 6b17dbcd..adaccda4 100644 --- a/AsbCloudWebApi/Controllers/DrillFlowChartController.cs +++ b/AsbCloudWebApi/Controllers/DrillFlowChartController.cs @@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Authorization; namespace AsbCloudWebApi.Controllers { /// - /// Контроллер для корридоров бурения на панели + /// Контроллер для коридоров бурения на панели /// [ApiController] [Authorize] @@ -29,12 +29,12 @@ namespace AsbCloudWebApi.Controllers } /// - /// Возвращает все значения для корридоров бурения по id скважины + /// Возвращает все значения для коридоров бурения по id скважины /// /// id скважины /// Дата, с которой следует искать новые параметры /// Токен отмены задачи - /// Список параметров для корридоров бурения + /// Список параметров для коридоров бурения [HttpGet] [Route("api/well/{idWell}/drillFlowChart")] [ProducesResponseType(typeof(IEnumerable), (int) System.Net.HttpStatusCode.OK)] @@ -54,12 +54,12 @@ namespace AsbCloudWebApi.Controllers } /// - /// Возвращает все значения для корридоров бурения по uid панели + /// Возвращает все значения для коридоров бурения по uid панели /// /// uid панели /// Дата, с которой следует искать новые параметры /// Токен отмены задачи - /// Список параметров для корридоров бурения + /// Список параметров для коридоров бурения [HttpGet] [Route("api/telemetry/{uid}/drillFlowChart")] [AllowAnonymous] @@ -77,10 +77,10 @@ namespace AsbCloudWebApi.Controllers } /// - /// Сохраняет значения для корридоров бурения + /// Сохраняет значения для коридоров бурения /// /// id скважины - /// Параметры корридоров бурения + /// Параметры коридоров бурения /// Токен отмены задачи /// [HttpPost] @@ -101,10 +101,10 @@ namespace AsbCloudWebApi.Controllers } /// - /// Добавляет массив объектов корридоров бурения + /// Добавляет массив объектов коридоров бурения /// /// id скважины - /// Массив объектов параметров корридоров бурения + /// Массив объектов параметров коридоров бурения /// Токен отмены задачи /// [HttpPost] @@ -126,10 +126,10 @@ namespace AsbCloudWebApi.Controllers } /// - /// Изменяет значения выбранного корридора бурения + /// Изменяет значения выбранного коридора бурения /// /// id скважины - /// Параметры корридоров бурения + /// Параметры коридоров бурения /// Токен отмены задачи /// [HttpPut] @@ -151,10 +151,10 @@ namespace AsbCloudWebApi.Controllers } /// - /// Удаляет значения выбранного корридора бурения + /// Удаляет значения выбранного коридора бурения /// /// id скважины - /// Id объекта корридоров бурения + /// Id объекта коридоров бурения /// Токен отмены задачи /// [HttpDelete] diff --git a/AsbCloudWebApi/Controllers/DrillParamsController.cs b/AsbCloudWebApi/Controllers/DrillParamsController.cs index 5cdc53dd..297e54c4 100644 --- a/AsbCloudWebApi/Controllers/DrillParamsController.cs +++ b/AsbCloudWebApi/Controllers/DrillParamsController.cs @@ -25,7 +25,7 @@ namespace AsbCloudWebApi.Controllers } /// - /// Возвращает автоматически расчитанные значения для режимов бурения + /// Возвращает автоматически рассчитанные значения для режимов бурения /// /// id скважины /// Стартовая глубина diff --git a/AsbCloudWebApi/Controllers/DrillingProgramController.cs b/AsbCloudWebApi/Controllers/DrillingProgramController.cs index 84d985bd..7be00083 100644 --- a/AsbCloudWebApi/Controllers/DrillingProgramController.cs +++ b/AsbCloudWebApi/Controllers/DrillingProgramController.cs @@ -84,7 +84,7 @@ namespace AsbCloudWebApi.Controllers } /// - /// Создает метку для файла входящего в проргамму бурения + /// Создает метку для файла входящего в программу бурения /// /// id скважины /// метка файла @@ -109,7 +109,7 @@ namespace AsbCloudWebApi.Controllers } /// - /// Помечает метку у файла входящего, в проргамму бурения, как удаленную + /// Помечает метку у файла входящего, в программу бурения, как удаленную /// /// id скважины /// id метки diff --git a/AsbCloudWebApi/Controllers/MessageController.cs b/AsbCloudWebApi/Controllers/MessageController.cs index b4bbd35d..8c9c06c5 100644 --- a/AsbCloudWebApi/Controllers/MessageController.cs +++ b/AsbCloudWebApi/Controllers/MessageController.cs @@ -31,7 +31,6 @@ namespace AsbCloudWebApi.Controllers /// для пагинации кол-во записей пропустить /// для пагинации кол-во записей /// Строка поиска - /// Даты в формате UTC или часового пояса скважины /// Токен для отмены задачи /// список сообщений по скважине [HttpGet] @@ -40,18 +39,14 @@ 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) return BadRequest("limit mast be less then 1024"); - if (begin > DateTime.Now) - begin = default; - var result = await messageService.GetMessagesAsync(idWell, categoryids, begin, end, searchString, - skip, take, isUtc, token).ConfigureAwait(false); + skip, take, token).ConfigureAwait(false); if (result is null || result.Count == 0) return NoContent(); @@ -64,13 +59,11 @@ namespace AsbCloudWebApi.Controllers /// /// id скважины /// Токен для отмены задачи - /// Смена дат с UTC формата на часовой пояс скважины /// список сообщений по скважине [HttpGet] [Route("datesRange")] [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetMessagesDateRangeAsync(int idWell, bool isUtc = true, - CancellationToken token = default) + public async Task GetMessagesDateRangeAsync(int idWell, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); @@ -82,9 +75,8 @@ namespace AsbCloudWebApi.Controllers if (!isCompanyOwnsWell) return Forbid(); - - var wellMessagesDatesRange = await messageService.GetMessagesDatesRangeAsync(idWell, - isUtc, token); + + var wellMessagesDatesRange = wellService.GetDatesRange(idWell); return Ok(wellMessagesDatesRange); } diff --git a/AsbCloudWebApi/Controllers/OperationStatController.cs b/AsbCloudWebApi/Controllers/OperationStatController.cs index cece035b..556ea4d5 100644 --- a/AsbCloudWebApi/Controllers/OperationStatController.cs +++ b/AsbCloudWebApi/Controllers/OperationStatController.cs @@ -29,7 +29,7 @@ namespace AsbCloudWebApi.Controllers /// /// Формирует данные по среднему и максимальному МСП на кусту по id скважины /// - /// id скважины с данного куста (через нее будут полуены данные) + /// id скважины с данного куста (через нее будут получены данные) /// /// Возвращает данные по среднему и максимальному МСП на кусту [HttpGet("well/{idWell}/ropStat")] @@ -65,13 +65,13 @@ namespace AsbCloudWebApi.Controllers } /// - /// Получает статстику по скважинам куста + /// Получает статистику по скважинам куста /// /// id куста /// /// [HttpGet] - [Route("cluster/{idCluster}/stat")] // TODO: Это статистика клатера, перенести в ClusterOperationStatController + [Route("cluster/{idCluster}/stat")] // TODO: Это статистика кластера, перенести в ClusterOperationStatController [ProducesResponseType(typeof(StatClusterDto), (int)System.Net.HttpStatusCode.OK)] public async Task GetStatClusterAsync(int idCluster, CancellationToken token = default) @@ -91,7 +91,7 @@ namespace AsbCloudWebApi.Controllers } /// - /// Получает статстику по списку скважин + /// Получает статистику по списку скважин /// /// список скважин /// @@ -128,7 +128,7 @@ namespace AsbCloudWebApi.Controllers } /// - /// Получает данные для графика глубина-днь + /// Получает данные для графика глубина-день /// /// /// diff --git a/AsbCloudWebApi/Controllers/ReportController.cs b/AsbCloudWebApi/Controllers/ReportController.cs index fcd0c9e7..1d550a27 100644 --- a/AsbCloudWebApi/Controllers/ReportController.cs +++ b/AsbCloudWebApi/Controllers/ReportController.cs @@ -134,13 +134,11 @@ namespace AsbCloudWebApi.Controllers /// /// id скважины /// Токен для отмены задачи - /// Смена дат с UTC формата на часовой пояс скважины /// Даты самого старого и самого свежего отчетов в БД [HttpGet] [Route("datesRange")] [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetReportsDateRangeAsync(int idWell, bool isUtc = true, - CancellationToken token = default) + public async Task GetReportsDateRangeAsync(int idWell, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); @@ -150,9 +148,8 @@ namespace AsbCloudWebApi.Controllers if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); - - var wellReportsDatesRange = await reportService.GetReportsDatesRangeAsync(idWell, isUtc, - token).ConfigureAwait(false); + + var wellReportsDatesRange = reportService.GetDatesRangeOrDefault(idWell); return Ok(wellReportsDatesRange); } diff --git a/AsbCloudWebApi/Controllers/SetpointsController.cs b/AsbCloudWebApi/Controllers/SetpointsController.cs index b11734cb..22a129a6 100644 --- a/AsbCloudWebApi/Controllers/SetpointsController.cs +++ b/AsbCloudWebApi/Controllers/SetpointsController.cs @@ -71,7 +71,7 @@ namespace AsbCloudWebApi.Controllers return BadRequest("Wrong ObsolescenceSec"); if (!setpoints.Setpoints.Any()) - return BadRequest("Wrong Setpoints count"); + return BadRequest("Wrong setpoints count"); var result = await setpointsService.InsertAsync(setpoints, token) .ConfigureAwait(false); @@ -107,7 +107,7 @@ namespace AsbCloudWebApi.Controllers /// /// /// - /// можно передать только новый state eg.: {state:3} - принято + /// можно передать только новый state ex.: {state:3} - принято /// /// [HttpPut("api/telemetry/{uid}/setpoints/{id}")] diff --git a/AsbCloudWebApi/Controllers/TelemetryAnalyticsController.cs b/AsbCloudWebApi/Controllers/TelemetryAnalyticsController.cs index 1cd5a764..0ccd804d 100644 --- a/AsbCloudWebApi/Controllers/TelemetryAnalyticsController.cs +++ b/AsbCloudWebApi/Controllers/TelemetryAnalyticsController.cs @@ -176,13 +176,11 @@ namespace AsbCloudWebApi.Controllers /// /// id скважины /// Токен для отмены задачи - /// Смена дат с UTC формата на часовой пояс скважины /// Даты самой первой и самой последней операций на скважине [HttpGet] [Route("datesRange")] [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetOperationsDateRangeAsync(int idWell, bool isUtc = true, - CancellationToken token = default) + public async Task GetOperationsDateRangeAsync(int idWell, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); @@ -193,8 +191,7 @@ namespace AsbCloudWebApi.Controllers idWell, token).ConfigureAwait(false)) return Forbid(); - var wellOperationsDatesRange = await analyticsService.GetOperationsDateRangeAsync(idWell, - isUtc, token).ConfigureAwait(false); + var wellOperationsDatesRange = await analyticsService.GetOperationsDateRangeAsync(idWell, token).ConfigureAwait(false); return Ok(wellOperationsDatesRange); } diff --git a/AsbCloudWebApi/Controllers/TelemetryController.cs b/AsbCloudWebApi/Controllers/TelemetryController.cs index 70fb90eb..e66734a9 100644 --- a/AsbCloudWebApi/Controllers/TelemetryController.cs +++ b/AsbCloudWebApi/Controllers/TelemetryController.cs @@ -58,15 +58,15 @@ namespace AsbCloudWebApi.Controllers /// Обновляет часовой пояс скважины /// /// Уникальный идентификатор отправителя - /// Информация о часовом поясе + /// Информация о часовом поясе /// Токен отмены задачи /// [HttpPost] - [Route("{uid}/timeZone")] - public async Task UpdateTimeZoneAsync(string uid, TelemetryTimeZoneDto timeZoneInfo, + [Route("{uid}/timezone")] + public async Task UpdateTimeZoneAsync(string uid, SimpleTimezoneDto timezone, CancellationToken token = default) { - await telemetryService.UpdateTimeZoneAsync(uid, timeZoneInfo, token) + await telemetryService.UpdateTimezoneAsync(uid, timezone, token) .ConfigureAwait(false); return Ok(); } diff --git a/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs b/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs index accf1064..869f4815 100644 --- a/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs +++ b/AsbCloudWebApi/Controllers/TelemetryDataBaseController.cs @@ -68,12 +68,11 @@ namespace AsbCloudWebApi.Controllers /// дата начала выборки. По умолчанию: текущее время - intervalSec /// интервал времени даты начала выборки, секунды /// желаемое количество точек. Если в выборке точек будет больше, то выборка будет прорежена. - /// Даты в формате UTC или часового пояса скважины /// Токен завершения задачи /// [HttpGet("{idWell}")] public virtual async Task> GetDataAsync(int idWell, DateTime begin = default, - int intervalSec = 600, int approxPointsCount = 1024, bool isUtc = false, CancellationToken token = default) + int intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); @@ -85,9 +84,9 @@ namespace AsbCloudWebApi.Controllers if (!isCompanyOwnsWell) return Forbid(); - + var content = await telemetryDataService.GetAsync(idWell, begin, - intervalSec, approxPointsCount, isUtc, token).ConfigureAwait(false); + intervalSec, approxPointsCount, token).ConfigureAwait(false); return Ok(content); } @@ -96,13 +95,12 @@ namespace AsbCloudWebApi.Controllers /// Возвращает диапазон дат сохраненных данных. /// /// id скважины - /// Смена дат с UTC формата на часовой пояс скважины /// Токен завершения задачи /// [HttpGet] [Route("{idWell}/datesRange")] [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] - public virtual async Task GetDataDatesRangeAsync(int idWell, bool isUtc = false, + public virtual async Task GetDataDatesRangeAsync(int idWell, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); @@ -116,8 +114,7 @@ namespace AsbCloudWebApi.Controllers if (!isCompanyOwnsWell) return Forbid(); - var dataDatesRange = await telemetryDataService.GetDataDatesRangeAsync(idWell, isUtc, - token).ConfigureAwait(false); + var dataDatesRange = wellService.GetDatesRange(idWell); return Ok(dataDatesRange); } diff --git a/AsbCloudWebApi/Controllers/WellController.cs b/AsbCloudWebApi/Controllers/WellController.cs index 8f2bd24b..336340e0 100644 --- a/AsbCloudWebApi/Controllers/WellController.cs +++ b/AsbCloudWebApi/Controllers/WellController.cs @@ -52,7 +52,7 @@ namespace AsbCloudWebApi.Controllers /// Id требуемой скважины /// Токен отмены задачи /// Информация о требуемой скважине - [HttpGet("getWell")] + [HttpGet("{idWell}")] [ProducesResponseType(typeof(WellDto), (int)System.Net.HttpStatusCode.OK)] public async Task GetAsync(int idWell, CancellationToken token = default) { @@ -76,7 +76,7 @@ namespace AsbCloudWebApi.Controllers /// State: 0 - Неизвестно, 1 - В работе, 2 - Завершена. /// Токен отмены задачи /// - [HttpPut] + [HttpPut("{idWell}")] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task UpdateWellAsync(int idWell, WellDto dto, CancellationToken token = default) diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index 6fef70ea..ced24d5a 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -132,7 +132,7 @@ namespace AsbCloudWebApi.Controllers /// id скважины /// Данные о добавляемых операциях /// Токен отмены задачи - /// Количество добавленых в БД строк + /// Количество добавленных в БД строк [HttpPost] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public async Task InsertRangeAsync(int idWell, [FromBody] IEnumerable values, @@ -150,8 +150,8 @@ namespace AsbCloudWebApi.Controllers /// Обновляет выбранную операцию на скважине /// /// id скважины - /// id выбраной операции - /// Новые данные для выбраной операции + /// id выбранной операции + /// Новые данные для выбранной операции /// Токен отмены задачи /// Количество обновленных в БД строк [HttpPut("{idOperation}")] @@ -168,10 +168,10 @@ namespace AsbCloudWebApi.Controllers } /// - /// Удаляет выбраную операцию на скважине + /// Удаляет выбранную операцию на скважине /// /// id скважины - /// id выбраной операции + /// id выбранной операции /// Токен отмены задачи /// Количество удаленных из БД строк [HttpDelete("{idOperation}")] @@ -264,7 +264,7 @@ namespace AsbCloudWebApi.Controllers /// /// Запрашиваемый файл [HttpGet] - [Route("tamplate")] + [Route("template")] [AllowAnonymous] [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)] public IActionResult GetTamplate() diff --git a/AsbCloudWebApi/Docs/Timezone info api credentials.md b/AsbCloudWebApi/Docs/Timezone info api credentials.md index 43d38ee0..847e13c3 100644 --- a/AsbCloudWebApi/Docs/Timezone info api credentials.md +++ b/AsbCloudWebApi/Docs/Timezone info api credentials.md @@ -2,7 +2,7 @@ https://www.geonames.org/commercial-webservices.html # учетная запись для аутентификации на сайте -Имя пользователя: asbautodrilling +Имя пользователя: asbautodrilling Пароль: asbautodrilling1! # имя пользователя для запросов diff --git a/AsbCloudWebApi/Docs/about using DateTime[Offset].md b/AsbCloudWebApi/Docs/about using DateTime[Offset].md new file mode 100644 index 00000000..954748b5 --- /dev/null +++ b/AsbCloudWebApi/Docs/about using DateTime[Offset].md @@ -0,0 +1,16 @@ +## Проблема +Скважины и пользователи ЕЦП расположены на различных часовых поясах. +В БД время хранится только в UTC. +На страницах ЕЦП время везде должно отображаться в часовом поясе скважины. +Web Api должен понимать при обращении время как в UTC `2021-12-29T07:00:00Z`, так и с указанием часового пояса `2021-12-29T12:00:00+05`. + +## Решение +В БД уже хранится часовой пояс скважины в таблице телеметрии. +На стороне backEnd публичные методы контроллеров и методы сервисов, +которые вызываются из контроллеров должны понимать параметры времени как тип DateTime, затем приводить его к UTC. +Если DateTime.Kind == unspecified, то считается что *это время указанное в часовом поясе скважины*. +При переходе на DateTimeOffset флаги isUTC не нужны +Даты в Model - используют DateTimeOffset. +Даты в Dto - используют DateTime без указания часового пояса во времени скважины. + При получении Dto от фронта с kind == unspecified дата приводится к UTC как будто она в часовом поясе скважины. + Перед отправкой клиенту в Dto все даты приводятся к часовому поясу скважины и kind устанавливается как unspecified. diff --git a/AsbCloudWebApi/Middlewares/PermissionsMiddlware.cs b/AsbCloudWebApi/Middlewares/PermissionsMiddlware.cs index 2644c2da..67694436 100644 --- a/AsbCloudWebApi/Middlewares/PermissionsMiddlware.cs +++ b/AsbCloudWebApi/Middlewares/PermissionsMiddlware.cs @@ -1,11 +1,7 @@ using AsbCloudApp.Services; using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; -using System; -using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; namespace AsbCloudWebApi.Middlewares @@ -38,11 +34,26 @@ namespace AsbCloudWebApi.Middlewares var permissionName = permission.Name; if (string.IsNullOrEmpty(permissionName)) - permissionName = endpoint.Metadata + { + var controller = endpoint.Metadata .GetMetadata() - ?.ControllerName - .ToLower(); - + ?.ControllerName; + + var httpMethod = endpoint.Metadata + .GetMetadata() + .HttpMethods[0]; + permissionName = $"{controller}.{httpMethod.ToLower()}"; + PermissionAttribute.Registered.Add(permissionName); + } + else if(permissionName.Contains("[controller]")) + { + var controller = endpoint.Metadata + .GetMetadata() + ?.ControllerName; + permissionName = permissionName.Replace("[controller]", controller); + PermissionAttribute.Registered.Add(permissionName); + } + var userService = context.RequestServices.GetRequiredService(); var isAuthorized = userService.HasPermission((int)idUser, permissionName); diff --git a/AsbCloudWebApi/PermissionAttribute.cs b/AsbCloudWebApi/PermissionAttribute.cs index 97eaddb5..7eeff776 100644 --- a/AsbCloudWebApi/PermissionAttribute.cs +++ b/AsbCloudWebApi/PermissionAttribute.cs @@ -3,46 +3,6 @@ using System.Collections.Generic; namespace AsbCloudWebApi { - public static class CommonMasks - { - public const int Get = 1; - public const int Edit = 1 << 1; - public const int Delete = 1 << 15; - public const int Any = -1; - public const int Bit_00 = 1; - public const int Bit_01 = 1 << 1; - public const int Bit_02 = 1 << 2; - public const int Bit_03 = 1 << 3; - public const int Bit_04 = 1 << 4; - public const int Bit_05 = 1 << 5; - public const int Bit_06 = 1 << 6; - public const int Bit_07 = 1 << 7; - public const int Bit_08 = 1 << 8; - public const int Bit_09 = 1 << 9; - public const int Bit_10 = 1 << 10; - public const int Bit_11 = 1 << 11; - public const int Bit_12 = 1 << 12; - public const int Bit_13 = 1 << 13; - public const int Bit_14 = 1 << 14; - public const int Bit_15 = 1 << 15; - public const int Bit_16 = 1 << 16; - public const int Bit_17 = 1 << 17; - public const int Bit_18 = 1 << 18; - public const int Bit_19 = 1 << 19; - public const int Bit_20 = 1 << 20; - public const int Bit_21 = 1 << 21; - public const int Bit_22 = 1 << 22; - public const int Bit_23 = 1 << 23; - public const int Bit_24 = 1 << 24; - public const int Bit_25 = 1 << 25; - public const int Bit_26 = 1 << 26; - public const int Bit_27 = 1 << 27; - public const int Bit_28 = 1 << 28; - public const int Bit_29 = 1 << 29; - public const int Bit_30 = 1 << 30; - public const int Bit_31 = 1 << 31; - } - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class PermissionAttribute : Attribute { @@ -51,10 +11,16 @@ namespace AsbCloudWebApi public string Name { get; set; } /// - /// Проверка наличия у пользователя разрешения. + /// Проверка наличия у пользователя разрешения с именем "{ControllerName}.{http_method}". + /// Пример автоматической генерации имени: "Message.get", где "Message" - имя контроллера MessageController. /// - /// Имя разрешения (default = controllerName) - public PermissionAttribute(string name = default) + public PermissionAttribute() { } + + /// + /// Проверка наличия у пользователя указанного разрешения. + /// + /// Имя разрешения (default = ControllerName.http_method) + public PermissionAttribute(string name) { Name = name; Registered.Add(name); diff --git a/AsbCloudWebApi/Startup.cs b/AsbCloudWebApi/Startup.cs index c825a98a..5ba8dbd2 100644 --- a/AsbCloudWebApi/Startup.cs +++ b/AsbCloudWebApi/Startup.cs @@ -1,3 +1,4 @@ +using AsbCloudApp.Services; using AsbCloudInfrastructure; using AsbCloudWebApi.Middlewares; using AsbCloudWebApi.SignalR; @@ -11,13 +12,12 @@ namespace AsbCloudWebApi { public class Startup { + public IConfiguration Configuration { get; } public Startup(IConfiguration configuration) { Configuration = configuration; } - public IConfiguration Configuration { get; } - public void ConfigureServices(IServiceCollection services) { services.AddControllers() @@ -50,17 +50,20 @@ namespace AsbCloudWebApi "http://0.0.0.0:5000", "http://*:5000", "http://localhost:5000", - + "http://*", + "https://0.0.0.0:3000", "https://*:3000", "https://localhost:3000", "https://0.0.0.0:5001", "https://*:5001", - "https://localhost:5001" + "https://localhost:5001", + "https://*:443" ) .AllowCredentials(); }); }); + } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) diff --git a/AsbCloudWebApi/TODO.md b/AsbCloudWebApi/TODO.md index 8c2f6745..701246c9 100644 --- a/AsbCloudWebApi/TODO.md +++ b/AsbCloudWebApi/TODO.md @@ -9,7 +9,7 @@ - мониторинг активно передающих скважин - доделать секционирование. - редуцирование архива телеметрии по принципу второй производной. Если вторая производная ~0, то промежуточные значения можно удалить. -- редуцирование выборки в контроллере. слишком большую выборку попробовать уменьшать оконными функиями, сохранять экстремумы и ближайшие к ним значения. +- редуцирование выборки в контроллере. слишком большую выборку попробовать уменьшать оконными функциями, сохранять экстремумы и ближайшие к ним значения. * Выполненные задачи * \ No newline at end of file diff --git a/AsbCloudWebApi/appsettings.json b/AsbCloudWebApi/appsettings.json index 90d8a207..9e02897a 100644 --- a/AsbCloudWebApi/appsettings.json +++ b/AsbCloudWebApi/appsettings.json @@ -13,7 +13,7 @@ "LocalConnection": "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True" }, "AllowedHosts": "*", - "Urls": "http://0.0.0.0:5000;https://0.0.0.0:5001" //, + "Urls": "http://0.0.0.0:5000",//;https://0.0.0.0:5001" //, // See https man: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel/endpoints?view=aspnetcore-6.0 //"Kestrel": { // "Endpoints": { diff --git a/AsbCloudWebApi/wwwroot/asset-manifest.json b/AsbCloudWebApi/wwwroot/asset-manifest.json index 52bab4e6..3adca2c8 100644 --- a/AsbCloudWebApi/wwwroot/asset-manifest.json +++ b/AsbCloudWebApi/wwwroot/asset-manifest.json @@ -1,24 +1,40 @@ { "files": { - "main.css": "/static/css/main.fb3df553.chunk.css", - "main.js": "/static/js/main.47b40915.chunk.js", - "main.js.map": "/static/js/main.47b40915.chunk.js.map", - "runtime-main.js": "/static/js/runtime-main.6870c5e2.js", - "runtime-main.js.map": "/static/js/runtime-main.6870c5e2.js.map", - "static/js/2.8306ac4d.chunk.js": "/static/js/2.8306ac4d.chunk.js", - "static/js/2.8306ac4d.chunk.js.map": "/static/js/2.8306ac4d.chunk.js.map", - "static/js/3.c22d92b4.chunk.js": "/static/js/3.c22d92b4.chunk.js", - "static/js/3.c22d92b4.chunk.js.map": "/static/js/3.c22d92b4.chunk.js.map", + "main.css": "/static/css/main.dd1fcee2.chunk.css", + "main.js": "/static/js/main.b2e71633.chunk.js", + "main.js.map": "/static/js/main.b2e71633.chunk.js.map", + "runtime-main.js": "/static/js/runtime-main.33aef657.js", + "runtime-main.js.map": "/static/js/runtime-main.33aef657.js.map", + "static/js/2.968888d9.chunk.js": "/static/js/2.968888d9.chunk.js", + "static/js/2.968888d9.chunk.js.map": "/static/js/2.968888d9.chunk.js.map", + "static/js/3.d96a3708.chunk.js": "/static/js/3.d96a3708.chunk.js", + "static/js/3.d96a3708.chunk.js.map": "/static/js/3.d96a3708.chunk.js.map", + "static/js/4.a0d32a2c.chunk.js": "/static/js/4.a0d32a2c.chunk.js", + "static/js/4.a0d32a2c.chunk.js.map": "/static/js/4.a0d32a2c.chunk.js.map", + "static/js/5.8306e86d.chunk.js": "/static/js/5.8306e86d.chunk.js", + "static/js/5.8306e86d.chunk.js.map": "/static/js/5.8306e86d.chunk.js.map", + "static/js/6.642e7ca1.chunk.js": "/static/js/6.642e7ca1.chunk.js", + "static/js/6.642e7ca1.chunk.js.map": "/static/js/6.642e7ca1.chunk.js.map", + "static/js/7.d412fe5e.chunk.js": "/static/js/7.d412fe5e.chunk.js", + "static/js/7.d412fe5e.chunk.js.map": "/static/js/7.d412fe5e.chunk.js.map", + "static/js/8.0292b3ca.chunk.js": "/static/js/8.0292b3ca.chunk.js", + "static/js/8.0292b3ca.chunk.js.map": "/static/js/8.0292b3ca.chunk.js.map", + "static/js/9.35059bd2.chunk.js": "/static/js/9.35059bd2.chunk.js", + "static/js/9.35059bd2.chunk.js.map": "/static/js/9.35059bd2.chunk.js.map", + "static/js/10.de99360f.chunk.js": "/static/js/10.de99360f.chunk.js", + "static/js/10.de99360f.chunk.js.map": "/static/js/10.de99360f.chunk.js.map", + "static/js/11.8f392911.chunk.js": "/static/js/11.8f392911.chunk.js", + "static/js/11.8f392911.chunk.js.map": "/static/js/11.8f392911.chunk.js.map", "index.html": "/index.html", - "static/css/main.fb3df553.chunk.css.map": "/static/css/main.fb3df553.chunk.css.map", - "static/js/2.8306ac4d.chunk.js.LICENSE.txt": "/static/js/2.8306ac4d.chunk.js.LICENSE.txt", + "static/css/main.dd1fcee2.chunk.css.map": "/static/css/main.dd1fcee2.chunk.css.map", + "static/js/2.968888d9.chunk.js.LICENSE.txt": "/static/js/2.968888d9.chunk.js.LICENSE.txt", "static/media/ClusterIcon.a395f860.svg": "/static/media/ClusterIcon.a395f860.svg", "static/media/DepositIcon.6de7c7ae.svg": "/static/media/DepositIcon.6de7c7ae.svg" }, "entrypoints": [ - "static/js/runtime-main.6870c5e2.js", - "static/js/2.8306ac4d.chunk.js", - "static/css/main.fb3df553.chunk.css", - "static/js/main.47b40915.chunk.js" + "static/js/runtime-main.33aef657.js", + "static/js/2.968888d9.chunk.js", + "static/css/main.dd1fcee2.chunk.css", + "static/js/main.b2e71633.chunk.js" ] } \ No newline at end of file diff --git a/AsbCloudWebApi/wwwroot/index.html b/AsbCloudWebApi/wwwroot/index.html index 3e80849f..25fbd8ab 100644 --- a/AsbCloudWebApi/wwwroot/index.html +++ b/AsbCloudWebApi/wwwroot/index.html @@ -1 +1 @@ -АСБ Vision
\ No newline at end of file +АСБ Vision
ц \ No newline at end of file diff --git a/AsbCloudWebApi/кейсы для админки.txt b/AsbCloudWebApi/кейсы для админки.txt index 52298220..a4dbed31 100644 --- a/AsbCloudWebApi/кейсы для админки.txt +++ b/AsbCloudWebApi/кейсы для админки.txt @@ -4,4 +4,4 @@ Есть t_telemetry для которой нет t_well | Кто-то начал новое бурение или исправил название старого 2 t_telemetry с не уникальными uid Провалы в непрерывной t_data. -Сопоставление сущетсвующих на диске файлов-рапортов с теми, что хранятся в БД \ No newline at end of file +Сопоставление существующих на диске файлов-рапортов с теми, что хранятся в БД \ No newline at end of file diff --git a/ConsoleApp1/ConsoleApp1.csproj b/ConsoleApp1/ConsoleApp1.csproj index 8b40740e..f69936a4 100644 --- a/ConsoleApp1/ConsoleApp1.csproj +++ b/ConsoleApp1/ConsoleApp1.csproj @@ -2,13 +2,13 @@ Exe - net5.0 + net6.0 ConsoleApp1.Program - + diff --git a/ConsoleApp1/DebugWellOperationImportService.cs b/ConsoleApp1/DebugWellOperationImportService.cs index d2fe92c8..2e0a7a8a 100644 --- a/ConsoleApp1/DebugWellOperationImportService.cs +++ b/ConsoleApp1/DebugWellOperationImportService.cs @@ -21,16 +21,6 @@ namespace ConsoleApp1 { using var db = new AsbCloudDbContext(options); - var wellOperationImportService = new WellOperationImportService(db); - - //var inStream = System.IO.File.OpenRead(@"C:\temp\Миграция.xlsx"); - //wellOperationImportService.Import(1, inStream); - var stream = wellOperationImportService.Export(1); - var fs = System.IO.File.Create(@"C:\temp\2.xlsx"); - stream.CopyTo(fs); - fs.Flush(); - fs.Close(); - fs.Dispose(); Console.WriteLine("_"); } } diff --git a/ConsoleApp1/Program.cs b/ConsoleApp1/Program.cs index 017fc129..65203455 100644 --- a/ConsoleApp1/Program.cs +++ b/ConsoleApp1/Program.cs @@ -17,9 +17,28 @@ namespace ConsoleApp1 class Program { + private static double AssumeTimezoneOffset(DateTime nearToCurrentDate) + { + var offset = 5d; + if (nearToCurrentDate.Kind == DateTimeKind.Unspecified) + { + var now = DateTime.UtcNow; + var minutes = 60 * (now.Hour - nearToCurrentDate.Hour) + now.Minute - nearToCurrentDate.Minute; + var minutesPositive = (1440_0000 + minutes) % 1440; //60*24 + var halfsHours = Math.Round(1d * minutesPositive / 30d); // quarters are ignored + var hours = halfsHours / 2; + offset = hours < 12 ? hours : 24 - hours ; + } + if (nearToCurrentDate.Kind == DateTimeKind.Local) + offset = TimeZoneInfo.Local.BaseUtcOffset.TotalHours; + + return offset; + } + static void Main(/*string[] args*/) { - DbDemoDataService.AddDemoData(); + var o = AssumeTimezoneOffset(new DateTime(2022, 01, 10, 15, 40, 00)); + //DbDemoDataService.AddDemoData(); //.GetAwaiter().GetResult(); Console.WriteLine("End of Test");